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 type found via an alias. 937 QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) { 938 return SemaRef.Context.getUsingType(Found, Underlying); 939 } 940 941 /// Build a new typedef type. 942 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 943 return SemaRef.Context.getTypeDeclType(Typedef); 944 } 945 946 /// Build a new MacroDefined type. 947 QualType RebuildMacroQualifiedType(QualType T, 948 const IdentifierInfo *MacroII) { 949 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 950 } 951 952 /// Build a new class/struct/union type. 953 QualType RebuildRecordType(RecordDecl *Record) { 954 return SemaRef.Context.getTypeDeclType(Record); 955 } 956 957 /// Build a new Enum type. 958 QualType RebuildEnumType(EnumDecl *Enum) { 959 return SemaRef.Context.getTypeDeclType(Enum); 960 } 961 962 /// Build a new typeof(expr) type. 963 /// 964 /// By default, performs semantic analysis when building the typeof type. 965 /// Subclasses may override this routine to provide different behavior. 966 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 967 968 /// Build a new typeof(type) type. 969 /// 970 /// By default, builds a new TypeOfType with the given underlying type. 971 QualType RebuildTypeOfType(QualType Underlying); 972 973 /// Build a new unary transform type. 974 QualType RebuildUnaryTransformType(QualType BaseType, 975 UnaryTransformType::UTTKind UKind, 976 SourceLocation Loc); 977 978 /// Build a new C++11 decltype type. 979 /// 980 /// By default, performs semantic analysis when building the decltype type. 981 /// Subclasses may override this routine to provide different behavior. 982 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 983 984 /// Build a new C++11 auto type. 985 /// 986 /// By default, builds a new AutoType with the given deduced type. 987 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 988 ConceptDecl *TypeConstraintConcept, 989 ArrayRef<TemplateArgument> TypeConstraintArgs) { 990 // Note, IsDependent is always false here: we implicitly convert an 'auto' 991 // which has been deduced to a dependent type into an undeduced 'auto', so 992 // that we'll retry deduction after the transformation. 993 return SemaRef.Context.getAutoType(Deduced, Keyword, 994 /*IsDependent*/ false, /*IsPack=*/false, 995 TypeConstraintConcept, 996 TypeConstraintArgs); 997 } 998 999 /// By default, builds a new DeducedTemplateSpecializationType with the given 1000 /// deduced type. 1001 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 1002 QualType Deduced) { 1003 return SemaRef.Context.getDeducedTemplateSpecializationType( 1004 Template, Deduced, /*IsDependent*/ false); 1005 } 1006 1007 /// Build a new template specialization type. 1008 /// 1009 /// By default, performs semantic analysis when building the template 1010 /// specialization type. Subclasses may override this routine to provide 1011 /// different behavior. 1012 QualType RebuildTemplateSpecializationType(TemplateName Template, 1013 SourceLocation TemplateLoc, 1014 TemplateArgumentListInfo &Args); 1015 1016 /// Build a new parenthesized type. 1017 /// 1018 /// By default, builds a new ParenType type from the inner type. 1019 /// Subclasses may override this routine to provide different behavior. 1020 QualType RebuildParenType(QualType InnerType) { 1021 return SemaRef.BuildParenType(InnerType); 1022 } 1023 1024 /// Build a new qualified name type. 1025 /// 1026 /// By default, builds a new ElaboratedType type from the keyword, 1027 /// the nested-name-specifier and the named type. 1028 /// Subclasses may override this routine to provide different behavior. 1029 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1030 ElaboratedTypeKeyword Keyword, 1031 NestedNameSpecifierLoc QualifierLoc, 1032 QualType Named) { 1033 return SemaRef.Context.getElaboratedType(Keyword, 1034 QualifierLoc.getNestedNameSpecifier(), 1035 Named); 1036 } 1037 1038 /// Build a new typename type that refers to a template-id. 1039 /// 1040 /// By default, builds a new DependentNameType type from the 1041 /// nested-name-specifier and the given type. Subclasses may override 1042 /// this routine to provide different behavior. 1043 QualType RebuildDependentTemplateSpecializationType( 1044 ElaboratedTypeKeyword Keyword, 1045 NestedNameSpecifierLoc QualifierLoc, 1046 SourceLocation TemplateKWLoc, 1047 const IdentifierInfo *Name, 1048 SourceLocation NameLoc, 1049 TemplateArgumentListInfo &Args, 1050 bool AllowInjectedClassName) { 1051 // Rebuild the template name. 1052 // TODO: avoid TemplateName abstraction 1053 CXXScopeSpec SS; 1054 SS.Adopt(QualifierLoc); 1055 TemplateName InstName = getDerived().RebuildTemplateName( 1056 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1057 AllowInjectedClassName); 1058 1059 if (InstName.isNull()) 1060 return QualType(); 1061 1062 // If it's still dependent, make a dependent specialization. 1063 if (InstName.getAsDependentTemplateName()) 1064 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1065 QualifierLoc.getNestedNameSpecifier(), 1066 Name, 1067 Args); 1068 1069 // Otherwise, make an elaborated type wrapping a non-dependent 1070 // specialization. 1071 QualType T = 1072 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1073 if (T.isNull()) return QualType(); 1074 1075 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1076 return T; 1077 1078 return SemaRef.Context.getElaboratedType(Keyword, 1079 QualifierLoc.getNestedNameSpecifier(), 1080 T); 1081 } 1082 1083 /// Build a new typename type that refers to an identifier. 1084 /// 1085 /// By default, performs semantic analysis when building the typename type 1086 /// (or elaborated type). Subclasses may override this routine to provide 1087 /// different behavior. 1088 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1089 SourceLocation KeywordLoc, 1090 NestedNameSpecifierLoc QualifierLoc, 1091 const IdentifierInfo *Id, 1092 SourceLocation IdLoc, 1093 bool DeducedTSTContext) { 1094 CXXScopeSpec SS; 1095 SS.Adopt(QualifierLoc); 1096 1097 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1098 // If the name is still dependent, just build a new dependent name type. 1099 if (!SemaRef.computeDeclContext(SS)) 1100 return SemaRef.Context.getDependentNameType(Keyword, 1101 QualifierLoc.getNestedNameSpecifier(), 1102 Id); 1103 } 1104 1105 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1106 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1107 *Id, IdLoc, DeducedTSTContext); 1108 } 1109 1110 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1111 1112 // We had a dependent elaborated-type-specifier that has been transformed 1113 // into a non-dependent elaborated-type-specifier. Find the tag we're 1114 // referring to. 1115 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1116 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1117 if (!DC) 1118 return QualType(); 1119 1120 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1121 return QualType(); 1122 1123 TagDecl *Tag = nullptr; 1124 SemaRef.LookupQualifiedName(Result, DC); 1125 switch (Result.getResultKind()) { 1126 case LookupResult::NotFound: 1127 case LookupResult::NotFoundInCurrentInstantiation: 1128 break; 1129 1130 case LookupResult::Found: 1131 Tag = Result.getAsSingle<TagDecl>(); 1132 break; 1133 1134 case LookupResult::FoundOverloaded: 1135 case LookupResult::FoundUnresolvedValue: 1136 llvm_unreachable("Tag lookup cannot find non-tags"); 1137 1138 case LookupResult::Ambiguous: 1139 // Let the LookupResult structure handle ambiguities. 1140 return QualType(); 1141 } 1142 1143 if (!Tag) { 1144 // Check where the name exists but isn't a tag type and use that to emit 1145 // better diagnostics. 1146 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1147 SemaRef.LookupQualifiedName(Result, DC); 1148 switch (Result.getResultKind()) { 1149 case LookupResult::Found: 1150 case LookupResult::FoundOverloaded: 1151 case LookupResult::FoundUnresolvedValue: { 1152 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1153 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1154 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1155 << NTK << Kind; 1156 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1157 break; 1158 } 1159 default: 1160 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1161 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1162 break; 1163 } 1164 return QualType(); 1165 } 1166 1167 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1168 IdLoc, Id)) { 1169 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1170 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1171 return QualType(); 1172 } 1173 1174 // Build the elaborated-type-specifier type. 1175 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1176 return SemaRef.Context.getElaboratedType(Keyword, 1177 QualifierLoc.getNestedNameSpecifier(), 1178 T); 1179 } 1180 1181 /// Build a new pack expansion type. 1182 /// 1183 /// By default, builds a new PackExpansionType type from the given pattern. 1184 /// Subclasses may override this routine to provide different behavior. 1185 QualType RebuildPackExpansionType(QualType Pattern, 1186 SourceRange PatternRange, 1187 SourceLocation EllipsisLoc, 1188 Optional<unsigned> NumExpansions) { 1189 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1190 NumExpansions); 1191 } 1192 1193 /// Build a new atomic type given its value type. 1194 /// 1195 /// By default, performs semantic analysis when building the atomic type. 1196 /// Subclasses may override this routine to provide different behavior. 1197 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1198 1199 /// Build a new pipe type given its value type. 1200 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1201 bool isReadPipe); 1202 1203 /// Build a bit-precise int given its value type. 1204 QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits, 1205 SourceLocation Loc); 1206 1207 /// Build a dependent bit-precise int given its value type. 1208 QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr, 1209 SourceLocation Loc); 1210 1211 /// Build a new template name given a nested name specifier, a flag 1212 /// indicating whether the "template" keyword was provided, and the template 1213 /// that the template name refers to. 1214 /// 1215 /// By default, builds the new template name directly. Subclasses may override 1216 /// this routine to provide different behavior. 1217 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1218 bool TemplateKW, 1219 TemplateDecl *Template); 1220 1221 /// Build a new template name given a nested name specifier and the 1222 /// name that is referred to as a template. 1223 /// 1224 /// By default, performs semantic analysis to determine whether the name can 1225 /// be resolved to a specific template, then builds the appropriate kind of 1226 /// template name. Subclasses may override this routine to provide different 1227 /// behavior. 1228 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1229 SourceLocation TemplateKWLoc, 1230 const IdentifierInfo &Name, 1231 SourceLocation NameLoc, QualType ObjectType, 1232 NamedDecl *FirstQualifierInScope, 1233 bool AllowInjectedClassName); 1234 1235 /// Build a new template name given a nested name specifier and the 1236 /// overloaded operator name that is referred to as a template. 1237 /// 1238 /// By default, performs semantic analysis to determine whether the name can 1239 /// be resolved to a specific template, then builds the appropriate kind of 1240 /// template name. Subclasses may override this routine to provide different 1241 /// behavior. 1242 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1243 SourceLocation TemplateKWLoc, 1244 OverloadedOperatorKind Operator, 1245 SourceLocation NameLoc, QualType ObjectType, 1246 bool AllowInjectedClassName); 1247 1248 /// Build a new template name given a template template parameter pack 1249 /// and the 1250 /// 1251 /// By default, performs semantic analysis to determine whether the name can 1252 /// be resolved to a specific template, then builds the appropriate kind of 1253 /// template name. Subclasses may override this routine to provide different 1254 /// behavior. 1255 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1256 const TemplateArgument &ArgPack) { 1257 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1258 } 1259 1260 /// Build a new compound statement. 1261 /// 1262 /// By default, performs semantic analysis to build the new statement. 1263 /// Subclasses may override this routine to provide different behavior. 1264 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1265 MultiStmtArg Statements, 1266 SourceLocation RBraceLoc, 1267 bool IsStmtExpr) { 1268 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1269 IsStmtExpr); 1270 } 1271 1272 /// Build a new case statement. 1273 /// 1274 /// By default, performs semantic analysis to build the new statement. 1275 /// Subclasses may override this routine to provide different behavior. 1276 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1277 Expr *LHS, 1278 SourceLocation EllipsisLoc, 1279 Expr *RHS, 1280 SourceLocation ColonLoc) { 1281 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1282 ColonLoc); 1283 } 1284 1285 /// Attach the body to a new case statement. 1286 /// 1287 /// By default, performs semantic analysis to build the new statement. 1288 /// Subclasses may override this routine to provide different behavior. 1289 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1290 getSema().ActOnCaseStmtBody(S, Body); 1291 return S; 1292 } 1293 1294 /// Build a new default statement. 1295 /// 1296 /// By default, performs semantic analysis to build the new statement. 1297 /// Subclasses may override this routine to provide different behavior. 1298 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1299 SourceLocation ColonLoc, 1300 Stmt *SubStmt) { 1301 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1302 /*CurScope=*/nullptr); 1303 } 1304 1305 /// Build a new label statement. 1306 /// 1307 /// By default, performs semantic analysis to build the new statement. 1308 /// Subclasses may override this routine to provide different behavior. 1309 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1310 SourceLocation ColonLoc, Stmt *SubStmt) { 1311 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1312 } 1313 1314 /// Build a new attributed statement. 1315 /// 1316 /// By default, performs semantic analysis to build the new statement. 1317 /// Subclasses may override this routine to provide different behavior. 1318 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1319 ArrayRef<const Attr *> Attrs, 1320 Stmt *SubStmt) { 1321 return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt); 1322 } 1323 1324 /// Build a new "if" statement. 1325 /// 1326 /// By default, performs semantic analysis to build the new statement. 1327 /// Subclasses may override this routine to provide different behavior. 1328 StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind, 1329 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1330 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1331 SourceLocation ElseLoc, Stmt *Else) { 1332 return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc, 1333 Then, ElseLoc, Else); 1334 } 1335 1336 /// Start building a new switch statement. 1337 /// 1338 /// By default, performs semantic analysis to build the new statement. 1339 /// Subclasses may override this routine to provide different behavior. 1340 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1341 SourceLocation LParenLoc, Stmt *Init, 1342 Sema::ConditionResult Cond, 1343 SourceLocation RParenLoc) { 1344 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1345 RParenLoc); 1346 } 1347 1348 /// Attach the body to the switch statement. 1349 /// 1350 /// By default, performs semantic analysis to build the new statement. 1351 /// Subclasses may override this routine to provide different behavior. 1352 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1353 Stmt *Switch, Stmt *Body) { 1354 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1355 } 1356 1357 /// Build a new while statement. 1358 /// 1359 /// By default, performs semantic analysis to build the new statement. 1360 /// Subclasses may override this routine to provide different behavior. 1361 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1362 Sema::ConditionResult Cond, 1363 SourceLocation RParenLoc, Stmt *Body) { 1364 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1365 } 1366 1367 /// Build a new do-while statement. 1368 /// 1369 /// By default, performs semantic analysis to build the new statement. 1370 /// Subclasses may override this routine to provide different behavior. 1371 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1372 SourceLocation WhileLoc, SourceLocation LParenLoc, 1373 Expr *Cond, SourceLocation RParenLoc) { 1374 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1375 Cond, RParenLoc); 1376 } 1377 1378 /// Build a new for statement. 1379 /// 1380 /// By default, performs semantic analysis to build the new statement. 1381 /// Subclasses may override this routine to provide different behavior. 1382 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1383 Stmt *Init, Sema::ConditionResult Cond, 1384 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1385 Stmt *Body) { 1386 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1387 Inc, RParenLoc, Body); 1388 } 1389 1390 /// Build a new goto statement. 1391 /// 1392 /// By default, performs semantic analysis to build the new statement. 1393 /// Subclasses may override this routine to provide different behavior. 1394 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1395 LabelDecl *Label) { 1396 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1397 } 1398 1399 /// Build a new indirect goto statement. 1400 /// 1401 /// By default, performs semantic analysis to build the new statement. 1402 /// Subclasses may override this routine to provide different behavior. 1403 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1404 SourceLocation StarLoc, 1405 Expr *Target) { 1406 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1407 } 1408 1409 /// Build a new return statement. 1410 /// 1411 /// By default, performs semantic analysis to build the new statement. 1412 /// Subclasses may override this routine to provide different behavior. 1413 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1414 return getSema().BuildReturnStmt(ReturnLoc, Result); 1415 } 1416 1417 /// Build a new declaration statement. 1418 /// 1419 /// By default, performs semantic analysis to build the new statement. 1420 /// Subclasses may override this routine to provide different behavior. 1421 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1422 SourceLocation StartLoc, SourceLocation EndLoc) { 1423 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1424 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1425 } 1426 1427 /// Build a new inline asm statement. 1428 /// 1429 /// By default, performs semantic analysis to build the new statement. 1430 /// Subclasses may override this routine to provide different behavior. 1431 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1432 bool IsVolatile, unsigned NumOutputs, 1433 unsigned NumInputs, IdentifierInfo **Names, 1434 MultiExprArg Constraints, MultiExprArg Exprs, 1435 Expr *AsmString, MultiExprArg Clobbers, 1436 unsigned NumLabels, 1437 SourceLocation RParenLoc) { 1438 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1439 NumInputs, Names, Constraints, Exprs, 1440 AsmString, Clobbers, NumLabels, RParenLoc); 1441 } 1442 1443 /// Build a new MS style inline asm statement. 1444 /// 1445 /// By default, performs semantic analysis to build the new statement. 1446 /// Subclasses may override this routine to provide different behavior. 1447 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1448 ArrayRef<Token> AsmToks, 1449 StringRef AsmString, 1450 unsigned NumOutputs, unsigned NumInputs, 1451 ArrayRef<StringRef> Constraints, 1452 ArrayRef<StringRef> Clobbers, 1453 ArrayRef<Expr*> Exprs, 1454 SourceLocation EndLoc) { 1455 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1456 NumOutputs, NumInputs, 1457 Constraints, Clobbers, Exprs, EndLoc); 1458 } 1459 1460 /// Build a new co_return statement. 1461 /// 1462 /// By default, performs semantic analysis to build the new statement. 1463 /// Subclasses may override this routine to provide different behavior. 1464 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1465 bool IsImplicit) { 1466 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1467 } 1468 1469 /// Build a new co_await expression. 1470 /// 1471 /// By default, performs semantic analysis to build the new expression. 1472 /// Subclasses may override this routine to provide different behavior. 1473 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1474 bool IsImplicit) { 1475 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1476 } 1477 1478 /// Build a new co_await expression. 1479 /// 1480 /// By default, performs semantic analysis to build the new expression. 1481 /// Subclasses may override this routine to provide different behavior. 1482 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1483 Expr *Result, 1484 UnresolvedLookupExpr *Lookup) { 1485 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1486 } 1487 1488 /// Build a new co_yield expression. 1489 /// 1490 /// By default, performs semantic analysis to build the new expression. 1491 /// Subclasses may override this routine to provide different behavior. 1492 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1493 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1494 } 1495 1496 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1497 return getSema().BuildCoroutineBodyStmt(Args); 1498 } 1499 1500 /// Build a new Objective-C \@try statement. 1501 /// 1502 /// By default, performs semantic analysis to build the new statement. 1503 /// Subclasses may override this routine to provide different behavior. 1504 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1505 Stmt *TryBody, 1506 MultiStmtArg CatchStmts, 1507 Stmt *Finally) { 1508 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1509 Finally); 1510 } 1511 1512 /// Rebuild an Objective-C exception declaration. 1513 /// 1514 /// By default, performs semantic analysis to build the new declaration. 1515 /// Subclasses may override this routine to provide different behavior. 1516 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1517 TypeSourceInfo *TInfo, QualType T) { 1518 return getSema().BuildObjCExceptionDecl(TInfo, T, 1519 ExceptionDecl->getInnerLocStart(), 1520 ExceptionDecl->getLocation(), 1521 ExceptionDecl->getIdentifier()); 1522 } 1523 1524 /// Build a new Objective-C \@catch statement. 1525 /// 1526 /// By default, performs semantic analysis to build the new statement. 1527 /// Subclasses may override this routine to provide different behavior. 1528 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1529 SourceLocation RParenLoc, 1530 VarDecl *Var, 1531 Stmt *Body) { 1532 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1533 Var, Body); 1534 } 1535 1536 /// Build a new Objective-C \@finally statement. 1537 /// 1538 /// By default, performs semantic analysis to build the new statement. 1539 /// Subclasses may override this routine to provide different behavior. 1540 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1541 Stmt *Body) { 1542 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1543 } 1544 1545 /// Build a new Objective-C \@throw statement. 1546 /// 1547 /// By default, performs semantic analysis to build the new statement. 1548 /// Subclasses may override this routine to provide different behavior. 1549 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1550 Expr *Operand) { 1551 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1552 } 1553 1554 /// Build a new OpenMP Canonical loop. 1555 /// 1556 /// Ensures that the outermost loop in @p LoopStmt is wrapped by a 1557 /// OMPCanonicalLoop. 1558 StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) { 1559 return getSema().ActOnOpenMPCanonicalLoop(LoopStmt); 1560 } 1561 1562 /// Build a new OpenMP executable directive. 1563 /// 1564 /// By default, performs semantic analysis to build the new statement. 1565 /// Subclasses may override this routine to provide different behavior. 1566 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1567 DeclarationNameInfo DirName, 1568 OpenMPDirectiveKind CancelRegion, 1569 ArrayRef<OMPClause *> Clauses, 1570 Stmt *AStmt, SourceLocation StartLoc, 1571 SourceLocation EndLoc) { 1572 return getSema().ActOnOpenMPExecutableDirective( 1573 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1574 } 1575 1576 /// Build a new OpenMP 'if' clause. 1577 /// 1578 /// By default, performs semantic analysis to build the new OpenMP clause. 1579 /// Subclasses may override this routine to provide different behavior. 1580 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1581 Expr *Condition, SourceLocation StartLoc, 1582 SourceLocation LParenLoc, 1583 SourceLocation NameModifierLoc, 1584 SourceLocation ColonLoc, 1585 SourceLocation EndLoc) { 1586 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1587 LParenLoc, NameModifierLoc, ColonLoc, 1588 EndLoc); 1589 } 1590 1591 /// Build a new OpenMP 'final' clause. 1592 /// 1593 /// By default, performs semantic analysis to build the new OpenMP clause. 1594 /// Subclasses may override this routine to provide different behavior. 1595 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1596 SourceLocation LParenLoc, 1597 SourceLocation EndLoc) { 1598 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1599 EndLoc); 1600 } 1601 1602 /// Build a new OpenMP 'num_threads' clause. 1603 /// 1604 /// By default, performs semantic analysis to build the new OpenMP clause. 1605 /// Subclasses may override this routine to provide different behavior. 1606 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1607 SourceLocation StartLoc, 1608 SourceLocation LParenLoc, 1609 SourceLocation EndLoc) { 1610 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1611 LParenLoc, EndLoc); 1612 } 1613 1614 /// Build a new OpenMP 'safelen' clause. 1615 /// 1616 /// By default, performs semantic analysis to build the new OpenMP clause. 1617 /// Subclasses may override this routine to provide different behavior. 1618 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1619 SourceLocation LParenLoc, 1620 SourceLocation EndLoc) { 1621 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1622 } 1623 1624 /// Build a new OpenMP 'simdlen' clause. 1625 /// 1626 /// By default, performs semantic analysis to build the new OpenMP clause. 1627 /// Subclasses may override this routine to provide different behavior. 1628 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1629 SourceLocation LParenLoc, 1630 SourceLocation EndLoc) { 1631 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1632 } 1633 1634 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1635 SourceLocation StartLoc, 1636 SourceLocation LParenLoc, 1637 SourceLocation EndLoc) { 1638 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1639 } 1640 1641 /// Build a new OpenMP 'full' clause. 1642 OMPClause *RebuildOMPFullClause(SourceLocation StartLoc, 1643 SourceLocation EndLoc) { 1644 return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc); 1645 } 1646 1647 /// Build a new OpenMP 'partial' clause. 1648 OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc, 1649 SourceLocation LParenLoc, 1650 SourceLocation EndLoc) { 1651 return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc, 1652 EndLoc); 1653 } 1654 1655 /// Build a new OpenMP 'allocator' clause. 1656 /// 1657 /// By default, performs semantic analysis to build the new OpenMP clause. 1658 /// Subclasses may override this routine to provide different behavior. 1659 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1660 SourceLocation LParenLoc, 1661 SourceLocation EndLoc) { 1662 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1663 } 1664 1665 /// Build a new OpenMP 'collapse' clause. 1666 /// 1667 /// By default, performs semantic analysis to build the new OpenMP clause. 1668 /// Subclasses may override this routine to provide different behavior. 1669 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1670 SourceLocation LParenLoc, 1671 SourceLocation EndLoc) { 1672 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1673 EndLoc); 1674 } 1675 1676 /// Build a new OpenMP 'default' clause. 1677 /// 1678 /// By default, performs semantic analysis to build the new OpenMP clause. 1679 /// Subclasses may override this routine to provide different behavior. 1680 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1681 SourceLocation StartLoc, 1682 SourceLocation LParenLoc, 1683 SourceLocation EndLoc) { 1684 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1685 StartLoc, LParenLoc, EndLoc); 1686 } 1687 1688 /// Build a new OpenMP 'proc_bind' clause. 1689 /// 1690 /// By default, performs semantic analysis to build the new OpenMP clause. 1691 /// Subclasses may override this routine to provide different behavior. 1692 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1693 SourceLocation KindKwLoc, 1694 SourceLocation StartLoc, 1695 SourceLocation LParenLoc, 1696 SourceLocation EndLoc) { 1697 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1698 StartLoc, LParenLoc, EndLoc); 1699 } 1700 1701 /// Build a new OpenMP 'schedule' clause. 1702 /// 1703 /// By default, performs semantic analysis to build the new OpenMP clause. 1704 /// Subclasses may override this routine to provide different behavior. 1705 OMPClause *RebuildOMPScheduleClause( 1706 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1707 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1708 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1709 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1710 return getSema().ActOnOpenMPScheduleClause( 1711 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1712 CommaLoc, EndLoc); 1713 } 1714 1715 /// Build a new OpenMP 'ordered' clause. 1716 /// 1717 /// By default, performs semantic analysis to build the new OpenMP clause. 1718 /// Subclasses may override this routine to provide different behavior. 1719 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1720 SourceLocation EndLoc, 1721 SourceLocation LParenLoc, Expr *Num) { 1722 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1723 } 1724 1725 /// Build a new OpenMP 'private' clause. 1726 /// 1727 /// By default, performs semantic analysis to build the new OpenMP clause. 1728 /// Subclasses may override this routine to provide different behavior. 1729 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1730 SourceLocation StartLoc, 1731 SourceLocation LParenLoc, 1732 SourceLocation EndLoc) { 1733 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1734 EndLoc); 1735 } 1736 1737 /// Build a new OpenMP 'firstprivate' clause. 1738 /// 1739 /// By default, performs semantic analysis to build the new OpenMP clause. 1740 /// Subclasses may override this routine to provide different behavior. 1741 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1742 SourceLocation StartLoc, 1743 SourceLocation LParenLoc, 1744 SourceLocation EndLoc) { 1745 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1746 EndLoc); 1747 } 1748 1749 /// Build a new OpenMP 'lastprivate' clause. 1750 /// 1751 /// By default, performs semantic analysis to build the new OpenMP clause. 1752 /// Subclasses may override this routine to provide different behavior. 1753 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1754 OpenMPLastprivateModifier LPKind, 1755 SourceLocation LPKindLoc, 1756 SourceLocation ColonLoc, 1757 SourceLocation StartLoc, 1758 SourceLocation LParenLoc, 1759 SourceLocation EndLoc) { 1760 return getSema().ActOnOpenMPLastprivateClause( 1761 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1762 } 1763 1764 /// Build a new OpenMP 'shared' clause. 1765 /// 1766 /// By default, performs semantic analysis to build the new OpenMP clause. 1767 /// Subclasses may override this routine to provide different behavior. 1768 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1769 SourceLocation StartLoc, 1770 SourceLocation LParenLoc, 1771 SourceLocation EndLoc) { 1772 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1773 EndLoc); 1774 } 1775 1776 /// Build a new OpenMP 'reduction' clause. 1777 /// 1778 /// By default, performs semantic analysis to build the new statement. 1779 /// Subclasses may override this routine to provide different behavior. 1780 OMPClause *RebuildOMPReductionClause( 1781 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1782 SourceLocation StartLoc, SourceLocation LParenLoc, 1783 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1784 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1785 const DeclarationNameInfo &ReductionId, 1786 ArrayRef<Expr *> UnresolvedReductions) { 1787 return getSema().ActOnOpenMPReductionClause( 1788 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1789 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1790 } 1791 1792 /// Build a new OpenMP 'task_reduction' clause. 1793 /// 1794 /// By default, performs semantic analysis to build the new statement. 1795 /// Subclasses may override this routine to provide different behavior. 1796 OMPClause *RebuildOMPTaskReductionClause( 1797 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1798 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1799 CXXScopeSpec &ReductionIdScopeSpec, 1800 const DeclarationNameInfo &ReductionId, 1801 ArrayRef<Expr *> UnresolvedReductions) { 1802 return getSema().ActOnOpenMPTaskReductionClause( 1803 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1804 ReductionId, UnresolvedReductions); 1805 } 1806 1807 /// Build a new OpenMP 'in_reduction' clause. 1808 /// 1809 /// By default, performs semantic analysis to build the new statement. 1810 /// Subclasses may override this routine to provide different behavior. 1811 OMPClause * 1812 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1813 SourceLocation LParenLoc, SourceLocation ColonLoc, 1814 SourceLocation EndLoc, 1815 CXXScopeSpec &ReductionIdScopeSpec, 1816 const DeclarationNameInfo &ReductionId, 1817 ArrayRef<Expr *> UnresolvedReductions) { 1818 return getSema().ActOnOpenMPInReductionClause( 1819 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1820 ReductionId, UnresolvedReductions); 1821 } 1822 1823 /// Build a new OpenMP 'linear' clause. 1824 /// 1825 /// By default, performs semantic analysis to build the new OpenMP clause. 1826 /// Subclasses may override this routine to provide different behavior. 1827 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1828 SourceLocation StartLoc, 1829 SourceLocation LParenLoc, 1830 OpenMPLinearClauseKind Modifier, 1831 SourceLocation ModifierLoc, 1832 SourceLocation ColonLoc, 1833 SourceLocation EndLoc) { 1834 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1835 Modifier, ModifierLoc, ColonLoc, 1836 EndLoc); 1837 } 1838 1839 /// Build a new OpenMP 'aligned' clause. 1840 /// 1841 /// By default, performs semantic analysis to build the new OpenMP clause. 1842 /// Subclasses may override this routine to provide different behavior. 1843 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1844 SourceLocation StartLoc, 1845 SourceLocation LParenLoc, 1846 SourceLocation ColonLoc, 1847 SourceLocation EndLoc) { 1848 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1849 LParenLoc, ColonLoc, EndLoc); 1850 } 1851 1852 /// Build a new OpenMP 'copyin' clause. 1853 /// 1854 /// By default, performs semantic analysis to build the new OpenMP clause. 1855 /// Subclasses may override this routine to provide different behavior. 1856 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1857 SourceLocation StartLoc, 1858 SourceLocation LParenLoc, 1859 SourceLocation EndLoc) { 1860 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1861 EndLoc); 1862 } 1863 1864 /// Build a new OpenMP 'copyprivate' clause. 1865 /// 1866 /// By default, performs semantic analysis to build the new OpenMP clause. 1867 /// Subclasses may override this routine to provide different behavior. 1868 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1869 SourceLocation StartLoc, 1870 SourceLocation LParenLoc, 1871 SourceLocation EndLoc) { 1872 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1873 EndLoc); 1874 } 1875 1876 /// Build a new OpenMP 'flush' pseudo clause. 1877 /// 1878 /// By default, performs semantic analysis to build the new OpenMP clause. 1879 /// Subclasses may override this routine to provide different behavior. 1880 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1881 SourceLocation StartLoc, 1882 SourceLocation LParenLoc, 1883 SourceLocation EndLoc) { 1884 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1885 EndLoc); 1886 } 1887 1888 /// Build a new OpenMP 'depobj' pseudo clause. 1889 /// 1890 /// By default, performs semantic analysis to build the new OpenMP clause. 1891 /// Subclasses may override this routine to provide different behavior. 1892 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1893 SourceLocation LParenLoc, 1894 SourceLocation EndLoc) { 1895 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1896 EndLoc); 1897 } 1898 1899 /// Build a new OpenMP 'depend' pseudo clause. 1900 /// 1901 /// By default, performs semantic analysis to build the new OpenMP clause. 1902 /// Subclasses may override this routine to provide different behavior. 1903 OMPClause * 1904 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1905 SourceLocation DepLoc, SourceLocation ColonLoc, 1906 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1907 SourceLocation LParenLoc, SourceLocation EndLoc) { 1908 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1909 ColonLoc, VarList, StartLoc, 1910 LParenLoc, EndLoc); 1911 } 1912 1913 /// Build a new OpenMP 'device' clause. 1914 /// 1915 /// By default, performs semantic analysis to build the new statement. 1916 /// Subclasses may override this routine to provide different behavior. 1917 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1918 Expr *Device, SourceLocation StartLoc, 1919 SourceLocation LParenLoc, 1920 SourceLocation ModifierLoc, 1921 SourceLocation EndLoc) { 1922 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1923 LParenLoc, ModifierLoc, EndLoc); 1924 } 1925 1926 /// Build a new OpenMP 'map' clause. 1927 /// 1928 /// By default, performs semantic analysis to build the new OpenMP clause. 1929 /// Subclasses may override this routine to provide different behavior. 1930 OMPClause *RebuildOMPMapClause( 1931 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1932 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1933 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1934 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1935 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1936 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1937 return getSema().ActOnOpenMPMapClause( 1938 MapTypeModifiers, MapTypeModifiersLoc, MapperIdScopeSpec, MapperId, 1939 MapType, IsMapTypeImplicit, MapLoc, ColonLoc, VarList, Locs, 1940 /*NoDiagnose=*/false, UnresolvedMappers); 1941 } 1942 1943 /// Build a new OpenMP 'allocate' clause. 1944 /// 1945 /// By default, performs semantic analysis to build the new OpenMP clause. 1946 /// Subclasses may override this routine to provide different behavior. 1947 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1948 SourceLocation StartLoc, 1949 SourceLocation LParenLoc, 1950 SourceLocation ColonLoc, 1951 SourceLocation EndLoc) { 1952 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1953 LParenLoc, ColonLoc, EndLoc); 1954 } 1955 1956 /// Build a new OpenMP 'num_teams' clause. 1957 /// 1958 /// By default, performs semantic analysis to build the new statement. 1959 /// Subclasses may override this routine to provide different behavior. 1960 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1961 SourceLocation LParenLoc, 1962 SourceLocation EndLoc) { 1963 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1964 EndLoc); 1965 } 1966 1967 /// Build a new OpenMP 'thread_limit' clause. 1968 /// 1969 /// By default, performs semantic analysis to build the new statement. 1970 /// Subclasses may override this routine to provide different behavior. 1971 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1972 SourceLocation StartLoc, 1973 SourceLocation LParenLoc, 1974 SourceLocation EndLoc) { 1975 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1976 LParenLoc, EndLoc); 1977 } 1978 1979 /// Build a new OpenMP 'priority' clause. 1980 /// 1981 /// By default, performs semantic analysis to build the new statement. 1982 /// Subclasses may override this routine to provide different behavior. 1983 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1984 SourceLocation LParenLoc, 1985 SourceLocation EndLoc) { 1986 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1987 EndLoc); 1988 } 1989 1990 /// Build a new OpenMP 'grainsize' clause. 1991 /// 1992 /// By default, performs semantic analysis to build the new statement. 1993 /// Subclasses may override this routine to provide different behavior. 1994 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1995 SourceLocation LParenLoc, 1996 SourceLocation EndLoc) { 1997 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1998 EndLoc); 1999 } 2000 2001 /// Build a new OpenMP 'num_tasks' clause. 2002 /// 2003 /// By default, performs semantic analysis to build the new statement. 2004 /// Subclasses may override this routine to provide different behavior. 2005 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 2006 SourceLocation LParenLoc, 2007 SourceLocation EndLoc) { 2008 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 2009 EndLoc); 2010 } 2011 2012 /// Build a new OpenMP 'hint' clause. 2013 /// 2014 /// By default, performs semantic analysis to build the new statement. 2015 /// Subclasses may override this routine to provide different behavior. 2016 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 2017 SourceLocation LParenLoc, 2018 SourceLocation EndLoc) { 2019 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2020 } 2021 2022 /// Build a new OpenMP 'detach' clause. 2023 /// 2024 /// By default, performs semantic analysis to build the new statement. 2025 /// Subclasses may override this routine to provide different behavior. 2026 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2027 SourceLocation LParenLoc, 2028 SourceLocation EndLoc) { 2029 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2030 } 2031 2032 /// Build a new OpenMP 'dist_schedule' clause. 2033 /// 2034 /// By default, performs semantic analysis to build the new OpenMP clause. 2035 /// Subclasses may override this routine to provide different behavior. 2036 OMPClause * 2037 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2038 Expr *ChunkSize, SourceLocation StartLoc, 2039 SourceLocation LParenLoc, SourceLocation KindLoc, 2040 SourceLocation CommaLoc, SourceLocation EndLoc) { 2041 return getSema().ActOnOpenMPDistScheduleClause( 2042 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2043 } 2044 2045 /// Build a new OpenMP 'to' clause. 2046 /// 2047 /// By default, performs semantic analysis to build the new statement. 2048 /// Subclasses may override this routine to provide different behavior. 2049 OMPClause * 2050 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2051 ArrayRef<SourceLocation> MotionModifiersLoc, 2052 CXXScopeSpec &MapperIdScopeSpec, 2053 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2054 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2055 ArrayRef<Expr *> UnresolvedMappers) { 2056 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2057 MapperIdScopeSpec, MapperId, ColonLoc, 2058 VarList, Locs, UnresolvedMappers); 2059 } 2060 2061 /// Build a new OpenMP 'from' clause. 2062 /// 2063 /// By default, performs semantic analysis to build the new statement. 2064 /// Subclasses may override this routine to provide different behavior. 2065 OMPClause * 2066 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2067 ArrayRef<SourceLocation> MotionModifiersLoc, 2068 CXXScopeSpec &MapperIdScopeSpec, 2069 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2070 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2071 ArrayRef<Expr *> UnresolvedMappers) { 2072 return getSema().ActOnOpenMPFromClause( 2073 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2074 ColonLoc, VarList, Locs, UnresolvedMappers); 2075 } 2076 2077 /// Build a new OpenMP 'use_device_ptr' clause. 2078 /// 2079 /// By default, performs semantic analysis to build the new OpenMP clause. 2080 /// Subclasses may override this routine to provide different behavior. 2081 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2082 const OMPVarListLocTy &Locs) { 2083 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2084 } 2085 2086 /// Build a new OpenMP 'use_device_addr' clause. 2087 /// 2088 /// By default, performs semantic analysis to build the new OpenMP clause. 2089 /// Subclasses may override this routine to provide different behavior. 2090 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2091 const OMPVarListLocTy &Locs) { 2092 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2093 } 2094 2095 /// Build a new OpenMP 'is_device_ptr' clause. 2096 /// 2097 /// By default, performs semantic analysis to build the new OpenMP clause. 2098 /// Subclasses may override this routine to provide different behavior. 2099 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2100 const OMPVarListLocTy &Locs) { 2101 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2102 } 2103 2104 /// Build a new OpenMP 'defaultmap' clause. 2105 /// 2106 /// By default, performs semantic analysis to build the new OpenMP clause. 2107 /// Subclasses may override this routine to provide different behavior. 2108 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2109 OpenMPDefaultmapClauseKind Kind, 2110 SourceLocation StartLoc, 2111 SourceLocation LParenLoc, 2112 SourceLocation MLoc, 2113 SourceLocation KindLoc, 2114 SourceLocation EndLoc) { 2115 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2116 MLoc, KindLoc, EndLoc); 2117 } 2118 2119 /// Build a new OpenMP 'nontemporal' clause. 2120 /// 2121 /// By default, performs semantic analysis to build the new OpenMP clause. 2122 /// Subclasses may override this routine to provide different behavior. 2123 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2124 SourceLocation StartLoc, 2125 SourceLocation LParenLoc, 2126 SourceLocation EndLoc) { 2127 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2128 EndLoc); 2129 } 2130 2131 /// Build a new OpenMP 'inclusive' clause. 2132 /// 2133 /// By default, performs semantic analysis to build the new OpenMP clause. 2134 /// Subclasses may override this routine to provide different behavior. 2135 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2136 SourceLocation StartLoc, 2137 SourceLocation LParenLoc, 2138 SourceLocation EndLoc) { 2139 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2140 EndLoc); 2141 } 2142 2143 /// Build a new OpenMP 'exclusive' clause. 2144 /// 2145 /// By default, performs semantic analysis to build the new OpenMP clause. 2146 /// Subclasses may override this routine to provide different behavior. 2147 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2148 SourceLocation StartLoc, 2149 SourceLocation LParenLoc, 2150 SourceLocation EndLoc) { 2151 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2152 EndLoc); 2153 } 2154 2155 /// Build a new OpenMP 'uses_allocators' clause. 2156 /// 2157 /// By default, performs semantic analysis to build the new OpenMP clause. 2158 /// Subclasses may override this routine to provide different behavior. 2159 OMPClause *RebuildOMPUsesAllocatorsClause( 2160 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2161 SourceLocation LParenLoc, SourceLocation EndLoc) { 2162 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2163 Data); 2164 } 2165 2166 /// Build a new OpenMP 'affinity' clause. 2167 /// 2168 /// By default, performs semantic analysis to build the new OpenMP clause. 2169 /// Subclasses may override this routine to provide different behavior. 2170 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2171 SourceLocation LParenLoc, 2172 SourceLocation ColonLoc, 2173 SourceLocation EndLoc, Expr *Modifier, 2174 ArrayRef<Expr *> Locators) { 2175 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2176 EndLoc, Modifier, Locators); 2177 } 2178 2179 /// Build a new OpenMP 'order' clause. 2180 /// 2181 /// By default, performs semantic analysis to build the new OpenMP clause. 2182 /// Subclasses may override this routine to provide different behavior. 2183 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2184 SourceLocation KindKwLoc, 2185 SourceLocation StartLoc, 2186 SourceLocation LParenLoc, 2187 SourceLocation EndLoc) { 2188 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2189 LParenLoc, EndLoc); 2190 } 2191 2192 /// Build a new OpenMP 'init' clause. 2193 /// 2194 /// By default, performs semantic analysis to build the new OpenMP clause. 2195 /// Subclasses may override this routine to provide different behavior. 2196 OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs, 2197 bool IsTarget, bool IsTargetSync, 2198 SourceLocation StartLoc, 2199 SourceLocation LParenLoc, 2200 SourceLocation VarLoc, 2201 SourceLocation EndLoc) { 2202 return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget, 2203 IsTargetSync, StartLoc, LParenLoc, 2204 VarLoc, EndLoc); 2205 } 2206 2207 /// Build a new OpenMP 'use' clause. 2208 /// 2209 /// By default, performs semantic analysis to build the new OpenMP clause. 2210 /// Subclasses may override this routine to provide different behavior. 2211 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2212 SourceLocation LParenLoc, 2213 SourceLocation VarLoc, SourceLocation EndLoc) { 2214 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2215 VarLoc, EndLoc); 2216 } 2217 2218 /// Build a new OpenMP 'destroy' clause. 2219 /// 2220 /// By default, performs semantic analysis to build the new OpenMP clause. 2221 /// Subclasses may override this routine to provide different behavior. 2222 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2223 SourceLocation LParenLoc, 2224 SourceLocation VarLoc, 2225 SourceLocation EndLoc) { 2226 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2227 VarLoc, EndLoc); 2228 } 2229 2230 /// Build a new OpenMP 'novariants' clause. 2231 /// 2232 /// By default, performs semantic analysis to build the new OpenMP clause. 2233 /// Subclasses may override this routine to provide different behavior. 2234 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2235 SourceLocation StartLoc, 2236 SourceLocation LParenLoc, 2237 SourceLocation EndLoc) { 2238 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2239 EndLoc); 2240 } 2241 2242 /// Build a new OpenMP 'nocontext' clause. 2243 /// 2244 /// By default, performs semantic analysis to build the new OpenMP clause. 2245 /// Subclasses may override this routine to provide different behavior. 2246 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2247 SourceLocation LParenLoc, 2248 SourceLocation EndLoc) { 2249 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2250 EndLoc); 2251 } 2252 2253 /// Build a new OpenMP 'filter' clause. 2254 /// 2255 /// By default, performs semantic analysis to build the new OpenMP clause. 2256 /// Subclasses may override this routine to provide different behavior. 2257 OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2258 SourceLocation LParenLoc, 2259 SourceLocation EndLoc) { 2260 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2261 EndLoc); 2262 } 2263 2264 /// Build a new OpenMP 'bind' clause. 2265 /// 2266 /// By default, performs semantic analysis to build the new OpenMP clause. 2267 /// Subclasses may override this routine to provide different behavior. 2268 OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind, 2269 SourceLocation KindLoc, 2270 SourceLocation StartLoc, 2271 SourceLocation LParenLoc, 2272 SourceLocation EndLoc) { 2273 return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc, 2274 EndLoc); 2275 } 2276 2277 /// Build a new OpenMP 'align' clause. 2278 /// 2279 /// By default, performs semantic analysis to build the new OpenMP clause. 2280 /// Subclasses may override this routine to provide different behavior. 2281 OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc, 2282 SourceLocation LParenLoc, 2283 SourceLocation EndLoc) { 2284 return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc); 2285 } 2286 2287 /// Rebuild the operand to an Objective-C \@synchronized statement. 2288 /// 2289 /// By default, performs semantic analysis to build the new statement. 2290 /// Subclasses may override this routine to provide different behavior. 2291 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2292 Expr *object) { 2293 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2294 } 2295 2296 /// Build a new Objective-C \@synchronized statement. 2297 /// 2298 /// By default, performs semantic analysis to build the new statement. 2299 /// Subclasses may override this routine to provide different behavior. 2300 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2301 Expr *Object, Stmt *Body) { 2302 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2303 } 2304 2305 /// Build a new Objective-C \@autoreleasepool statement. 2306 /// 2307 /// By default, performs semantic analysis to build the new statement. 2308 /// Subclasses may override this routine to provide different behavior. 2309 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2310 Stmt *Body) { 2311 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2312 } 2313 2314 /// Build a new Objective-C fast enumeration statement. 2315 /// 2316 /// By default, performs semantic analysis to build the new statement. 2317 /// Subclasses may override this routine to provide different behavior. 2318 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2319 Stmt *Element, 2320 Expr *Collection, 2321 SourceLocation RParenLoc, 2322 Stmt *Body) { 2323 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2324 Element, 2325 Collection, 2326 RParenLoc); 2327 if (ForEachStmt.isInvalid()) 2328 return StmtError(); 2329 2330 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2331 } 2332 2333 /// Build a new C++ exception declaration. 2334 /// 2335 /// By default, performs semantic analysis to build the new decaration. 2336 /// Subclasses may override this routine to provide different behavior. 2337 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2338 TypeSourceInfo *Declarator, 2339 SourceLocation StartLoc, 2340 SourceLocation IdLoc, 2341 IdentifierInfo *Id) { 2342 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2343 StartLoc, IdLoc, Id); 2344 if (Var) 2345 getSema().CurContext->addDecl(Var); 2346 return Var; 2347 } 2348 2349 /// Build a new C++ catch statement. 2350 /// 2351 /// By default, performs semantic analysis to build the new statement. 2352 /// Subclasses may override this routine to provide different behavior. 2353 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2354 VarDecl *ExceptionDecl, 2355 Stmt *Handler) { 2356 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2357 Handler)); 2358 } 2359 2360 /// Build a new C++ try statement. 2361 /// 2362 /// By default, performs semantic analysis to build the new statement. 2363 /// Subclasses may override this routine to provide different behavior. 2364 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2365 ArrayRef<Stmt *> Handlers) { 2366 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2367 } 2368 2369 /// Build a new C++0x range-based for statement. 2370 /// 2371 /// By default, performs semantic analysis to build the new statement. 2372 /// Subclasses may override this routine to provide different behavior. 2373 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2374 SourceLocation CoawaitLoc, Stmt *Init, 2375 SourceLocation ColonLoc, Stmt *Range, 2376 Stmt *Begin, Stmt *End, Expr *Cond, 2377 Expr *Inc, Stmt *LoopVar, 2378 SourceLocation RParenLoc) { 2379 // If we've just learned that the range is actually an Objective-C 2380 // collection, treat this as an Objective-C fast enumeration loop. 2381 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2382 if (RangeStmt->isSingleDecl()) { 2383 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2384 if (RangeVar->isInvalidDecl()) 2385 return StmtError(); 2386 2387 Expr *RangeExpr = RangeVar->getInit(); 2388 if (!RangeExpr->isTypeDependent() && 2389 RangeExpr->getType()->isObjCObjectPointerType()) { 2390 // FIXME: Support init-statements in Objective-C++20 ranged for 2391 // statement. 2392 if (Init) { 2393 return SemaRef.Diag(Init->getBeginLoc(), 2394 diag::err_objc_for_range_init_stmt) 2395 << Init->getSourceRange(); 2396 } 2397 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2398 RangeExpr, RParenLoc); 2399 } 2400 } 2401 } 2402 } 2403 2404 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2405 Range, Begin, End, Cond, Inc, LoopVar, 2406 RParenLoc, Sema::BFRK_Rebuild); 2407 } 2408 2409 /// Build a new C++0x range-based for statement. 2410 /// 2411 /// By default, performs semantic analysis to build the new statement. 2412 /// Subclasses may override this routine to provide different behavior. 2413 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2414 bool IsIfExists, 2415 NestedNameSpecifierLoc QualifierLoc, 2416 DeclarationNameInfo NameInfo, 2417 Stmt *Nested) { 2418 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2419 QualifierLoc, NameInfo, Nested); 2420 } 2421 2422 /// Attach body to a C++0x range-based for statement. 2423 /// 2424 /// By default, performs semantic analysis to finish the new statement. 2425 /// Subclasses may override this routine to provide different behavior. 2426 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2427 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2428 } 2429 2430 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2431 Stmt *TryBlock, Stmt *Handler) { 2432 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2433 } 2434 2435 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2436 Stmt *Block) { 2437 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2438 } 2439 2440 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2441 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2442 } 2443 2444 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2445 SourceLocation LParen, 2446 SourceLocation RParen, 2447 TypeSourceInfo *TSI) { 2448 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI); 2449 } 2450 2451 /// Build a new predefined expression. 2452 /// 2453 /// By default, performs semantic analysis to build the new expression. 2454 /// Subclasses may override this routine to provide different behavior. 2455 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2456 PredefinedExpr::IdentKind IK) { 2457 return getSema().BuildPredefinedExpr(Loc, IK); 2458 } 2459 2460 /// Build a new expression that references a declaration. 2461 /// 2462 /// By default, performs semantic analysis to build the new expression. 2463 /// Subclasses may override this routine to provide different behavior. 2464 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2465 LookupResult &R, 2466 bool RequiresADL) { 2467 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2468 } 2469 2470 2471 /// Build a new expression that references a declaration. 2472 /// 2473 /// By default, performs semantic analysis to build the new expression. 2474 /// Subclasses may override this routine to provide different behavior. 2475 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2476 ValueDecl *VD, 2477 const DeclarationNameInfo &NameInfo, 2478 NamedDecl *Found, 2479 TemplateArgumentListInfo *TemplateArgs) { 2480 CXXScopeSpec SS; 2481 SS.Adopt(QualifierLoc); 2482 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2483 TemplateArgs); 2484 } 2485 2486 /// Build a new expression in parentheses. 2487 /// 2488 /// By default, performs semantic analysis to build the new expression. 2489 /// Subclasses may override this routine to provide different behavior. 2490 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2491 SourceLocation RParen) { 2492 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2493 } 2494 2495 /// Build a new pseudo-destructor expression. 2496 /// 2497 /// By default, performs semantic analysis to build the new expression. 2498 /// Subclasses may override this routine to provide different behavior. 2499 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2500 SourceLocation OperatorLoc, 2501 bool isArrow, 2502 CXXScopeSpec &SS, 2503 TypeSourceInfo *ScopeType, 2504 SourceLocation CCLoc, 2505 SourceLocation TildeLoc, 2506 PseudoDestructorTypeStorage Destroyed); 2507 2508 /// Build a new unary operator expression. 2509 /// 2510 /// By default, performs semantic analysis to build the new expression. 2511 /// Subclasses may override this routine to provide different behavior. 2512 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2513 UnaryOperatorKind Opc, 2514 Expr *SubExpr) { 2515 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2516 } 2517 2518 /// Build a new builtin offsetof expression. 2519 /// 2520 /// By default, performs semantic analysis to build the new expression. 2521 /// Subclasses may override this routine to provide different behavior. 2522 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2523 TypeSourceInfo *Type, 2524 ArrayRef<Sema::OffsetOfComponent> Components, 2525 SourceLocation RParenLoc) { 2526 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2527 RParenLoc); 2528 } 2529 2530 /// Build a new sizeof, alignof or vec_step expression with a 2531 /// type argument. 2532 /// 2533 /// By default, performs semantic analysis to build the new expression. 2534 /// Subclasses may override this routine to provide different behavior. 2535 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2536 SourceLocation OpLoc, 2537 UnaryExprOrTypeTrait ExprKind, 2538 SourceRange R) { 2539 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2540 } 2541 2542 /// Build a new sizeof, alignof or vec step expression with an 2543 /// expression argument. 2544 /// 2545 /// By default, performs semantic analysis to build the new expression. 2546 /// Subclasses may override this routine to provide different behavior. 2547 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2548 UnaryExprOrTypeTrait ExprKind, 2549 SourceRange R) { 2550 ExprResult Result 2551 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2552 if (Result.isInvalid()) 2553 return ExprError(); 2554 2555 return Result; 2556 } 2557 2558 /// Build a new array subscript expression. 2559 /// 2560 /// By default, performs semantic analysis to build the new expression. 2561 /// Subclasses may override this routine to provide different behavior. 2562 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2563 SourceLocation LBracketLoc, 2564 Expr *RHS, 2565 SourceLocation RBracketLoc) { 2566 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2567 LBracketLoc, RHS, 2568 RBracketLoc); 2569 } 2570 2571 /// Build a new matrix subscript expression. 2572 /// 2573 /// By default, performs semantic analysis to build the new expression. 2574 /// Subclasses may override this routine to provide different behavior. 2575 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2576 Expr *ColumnIdx, 2577 SourceLocation RBracketLoc) { 2578 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2579 RBracketLoc); 2580 } 2581 2582 /// Build a new array section expression. 2583 /// 2584 /// By default, performs semantic analysis to build the new expression. 2585 /// Subclasses may override this routine to provide different behavior. 2586 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2587 Expr *LowerBound, 2588 SourceLocation ColonLocFirst, 2589 SourceLocation ColonLocSecond, 2590 Expr *Length, Expr *Stride, 2591 SourceLocation RBracketLoc) { 2592 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2593 ColonLocFirst, ColonLocSecond, 2594 Length, Stride, RBracketLoc); 2595 } 2596 2597 /// Build a new array shaping expression. 2598 /// 2599 /// By default, performs semantic analysis to build the new expression. 2600 /// Subclasses may override this routine to provide different behavior. 2601 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2602 SourceLocation RParenLoc, 2603 ArrayRef<Expr *> Dims, 2604 ArrayRef<SourceRange> BracketsRanges) { 2605 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2606 BracketsRanges); 2607 } 2608 2609 /// Build a new iterator expression. 2610 /// 2611 /// By default, performs semantic analysis to build the new expression. 2612 /// Subclasses may override this routine to provide different behavior. 2613 ExprResult RebuildOMPIteratorExpr( 2614 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2615 ArrayRef<Sema::OMPIteratorData> Data) { 2616 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2617 LLoc, RLoc, Data); 2618 } 2619 2620 /// Build a new call expression. 2621 /// 2622 /// By default, performs semantic analysis to build the new expression. 2623 /// Subclasses may override this routine to provide different behavior. 2624 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2625 MultiExprArg Args, 2626 SourceLocation RParenLoc, 2627 Expr *ExecConfig = nullptr) { 2628 return getSema().ActOnCallExpr( 2629 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2630 } 2631 2632 ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc, 2633 MultiExprArg Args, 2634 SourceLocation RParenLoc) { 2635 return getSema().ActOnArraySubscriptExpr( 2636 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc); 2637 } 2638 2639 /// Build a new member access expression. 2640 /// 2641 /// By default, performs semantic analysis to build the new expression. 2642 /// Subclasses may override this routine to provide different behavior. 2643 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2644 bool isArrow, 2645 NestedNameSpecifierLoc QualifierLoc, 2646 SourceLocation TemplateKWLoc, 2647 const DeclarationNameInfo &MemberNameInfo, 2648 ValueDecl *Member, 2649 NamedDecl *FoundDecl, 2650 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2651 NamedDecl *FirstQualifierInScope) { 2652 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2653 isArrow); 2654 if (!Member->getDeclName()) { 2655 // We have a reference to an unnamed field. This is always the 2656 // base of an anonymous struct/union member access, i.e. the 2657 // field is always of record type. 2658 assert(Member->getType()->isRecordType() && 2659 "unnamed member not of record type?"); 2660 2661 BaseResult = 2662 getSema().PerformObjectMemberConversion(BaseResult.get(), 2663 QualifierLoc.getNestedNameSpecifier(), 2664 FoundDecl, Member); 2665 if (BaseResult.isInvalid()) 2666 return ExprError(); 2667 Base = BaseResult.get(); 2668 2669 CXXScopeSpec EmptySS; 2670 return getSema().BuildFieldReferenceExpr( 2671 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2672 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2673 } 2674 2675 CXXScopeSpec SS; 2676 SS.Adopt(QualifierLoc); 2677 2678 Base = BaseResult.get(); 2679 QualType BaseType = Base->getType(); 2680 2681 if (isArrow && !BaseType->isPointerType()) 2682 return ExprError(); 2683 2684 // FIXME: this involves duplicating earlier analysis in a lot of 2685 // cases; we should avoid this when possible. 2686 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2687 R.addDecl(FoundDecl); 2688 R.resolveKind(); 2689 2690 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2691 SS, TemplateKWLoc, 2692 FirstQualifierInScope, 2693 R, ExplicitTemplateArgs, 2694 /*S*/nullptr); 2695 } 2696 2697 /// Build a new binary operator expression. 2698 /// 2699 /// By default, performs semantic analysis to build the new expression. 2700 /// Subclasses may override this routine to provide different behavior. 2701 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2702 BinaryOperatorKind Opc, 2703 Expr *LHS, Expr *RHS) { 2704 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2705 } 2706 2707 /// Build a new rewritten operator expression. 2708 /// 2709 /// By default, performs semantic analysis to build the new expression. 2710 /// Subclasses may override this routine to provide different behavior. 2711 ExprResult RebuildCXXRewrittenBinaryOperator( 2712 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2713 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2714 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2715 RHS, /*RequiresADL*/false); 2716 } 2717 2718 /// Build a new conditional operator expression. 2719 /// 2720 /// By default, performs semantic analysis to build the new expression. 2721 /// Subclasses may override this routine to provide different behavior. 2722 ExprResult RebuildConditionalOperator(Expr *Cond, 2723 SourceLocation QuestionLoc, 2724 Expr *LHS, 2725 SourceLocation ColonLoc, 2726 Expr *RHS) { 2727 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2728 LHS, RHS); 2729 } 2730 2731 /// Build a new C-style cast 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 RebuildCStyleCastExpr(SourceLocation LParenLoc, 2736 TypeSourceInfo *TInfo, 2737 SourceLocation RParenLoc, 2738 Expr *SubExpr) { 2739 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2740 SubExpr); 2741 } 2742 2743 /// Build a new compound literal 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 RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2748 TypeSourceInfo *TInfo, 2749 SourceLocation RParenLoc, 2750 Expr *Init) { 2751 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2752 Init); 2753 } 2754 2755 /// Build a new extended vector element access expression. 2756 /// 2757 /// By default, performs semantic analysis to build the new expression. 2758 /// Subclasses may override this routine to provide different behavior. 2759 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2760 SourceLocation OpLoc, 2761 SourceLocation AccessorLoc, 2762 IdentifierInfo &Accessor) { 2763 2764 CXXScopeSpec SS; 2765 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2766 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2767 OpLoc, /*IsArrow*/ false, 2768 SS, SourceLocation(), 2769 /*FirstQualifierInScope*/ nullptr, 2770 NameInfo, 2771 /* TemplateArgs */ nullptr, 2772 /*S*/ nullptr); 2773 } 2774 2775 /// Build a new initializer list expression. 2776 /// 2777 /// By default, performs semantic analysis to build the new expression. 2778 /// Subclasses may override this routine to provide different behavior. 2779 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2780 MultiExprArg Inits, 2781 SourceLocation RBraceLoc) { 2782 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2783 } 2784 2785 /// Build a new designated initializer expression. 2786 /// 2787 /// By default, performs semantic analysis to build the new expression. 2788 /// Subclasses may override this routine to provide different behavior. 2789 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2790 MultiExprArg ArrayExprs, 2791 SourceLocation EqualOrColonLoc, 2792 bool GNUSyntax, 2793 Expr *Init) { 2794 ExprResult Result 2795 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2796 Init); 2797 if (Result.isInvalid()) 2798 return ExprError(); 2799 2800 return Result; 2801 } 2802 2803 /// Build a new value-initialized expression. 2804 /// 2805 /// By default, builds the implicit value initialization without performing 2806 /// any semantic analysis. Subclasses may override this routine to provide 2807 /// different behavior. 2808 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2809 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2810 } 2811 2812 /// Build a new \c va_arg expression. 2813 /// 2814 /// By default, performs semantic analysis to build the new expression. 2815 /// Subclasses may override this routine to provide different behavior. 2816 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2817 Expr *SubExpr, TypeSourceInfo *TInfo, 2818 SourceLocation RParenLoc) { 2819 return getSema().BuildVAArgExpr(BuiltinLoc, 2820 SubExpr, TInfo, 2821 RParenLoc); 2822 } 2823 2824 /// Build a new expression list in parentheses. 2825 /// 2826 /// By default, performs semantic analysis to build the new expression. 2827 /// Subclasses may override this routine to provide different behavior. 2828 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2829 MultiExprArg SubExprs, 2830 SourceLocation RParenLoc) { 2831 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2832 } 2833 2834 /// Build a new address-of-label expression. 2835 /// 2836 /// By default, performs semantic analysis, using the name of the label 2837 /// rather than attempting to map the label statement itself. 2838 /// Subclasses may override this routine to provide different behavior. 2839 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2840 SourceLocation LabelLoc, LabelDecl *Label) { 2841 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2842 } 2843 2844 /// Build a new GNU statement expression. 2845 /// 2846 /// By default, performs semantic analysis to build the new expression. 2847 /// Subclasses may override this routine to provide different behavior. 2848 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2849 SourceLocation RParenLoc, unsigned TemplateDepth) { 2850 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2851 TemplateDepth); 2852 } 2853 2854 /// Build a new __builtin_choose_expr 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 RebuildChooseExpr(SourceLocation BuiltinLoc, 2859 Expr *Cond, Expr *LHS, Expr *RHS, 2860 SourceLocation RParenLoc) { 2861 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2862 Cond, LHS, RHS, 2863 RParenLoc); 2864 } 2865 2866 /// Build a new generic selection expression. 2867 /// 2868 /// By default, performs semantic analysis to build the new expression. 2869 /// Subclasses may override this routine to provide different behavior. 2870 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2871 SourceLocation DefaultLoc, 2872 SourceLocation RParenLoc, 2873 Expr *ControllingExpr, 2874 ArrayRef<TypeSourceInfo *> Types, 2875 ArrayRef<Expr *> Exprs) { 2876 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2877 ControllingExpr, Types, Exprs); 2878 } 2879 2880 /// Build a new overloaded operator call expression. 2881 /// 2882 /// By default, performs semantic analysis to build the new expression. 2883 /// The semantic analysis provides the behavior of template instantiation, 2884 /// copying with transformations that turn what looks like an overloaded 2885 /// operator call into a use of a builtin operator, performing 2886 /// argument-dependent lookup, etc. Subclasses may override this routine to 2887 /// provide different behavior. 2888 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2889 SourceLocation OpLoc, 2890 Expr *Callee, 2891 Expr *First, 2892 Expr *Second); 2893 2894 /// Build a new C++ "named" cast expression, such as static_cast or 2895 /// reinterpret_cast. 2896 /// 2897 /// By default, this routine dispatches to one of the more-specific routines 2898 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2899 /// Subclasses may override this routine to provide different behavior. 2900 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2901 Stmt::StmtClass Class, 2902 SourceLocation LAngleLoc, 2903 TypeSourceInfo *TInfo, 2904 SourceLocation RAngleLoc, 2905 SourceLocation LParenLoc, 2906 Expr *SubExpr, 2907 SourceLocation RParenLoc) { 2908 switch (Class) { 2909 case Stmt::CXXStaticCastExprClass: 2910 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2911 RAngleLoc, LParenLoc, 2912 SubExpr, RParenLoc); 2913 2914 case Stmt::CXXDynamicCastExprClass: 2915 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2916 RAngleLoc, LParenLoc, 2917 SubExpr, RParenLoc); 2918 2919 case Stmt::CXXReinterpretCastExprClass: 2920 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2921 RAngleLoc, LParenLoc, 2922 SubExpr, 2923 RParenLoc); 2924 2925 case Stmt::CXXConstCastExprClass: 2926 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2927 RAngleLoc, LParenLoc, 2928 SubExpr, RParenLoc); 2929 2930 case Stmt::CXXAddrspaceCastExprClass: 2931 return getDerived().RebuildCXXAddrspaceCastExpr( 2932 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2933 2934 default: 2935 llvm_unreachable("Invalid C++ named cast"); 2936 } 2937 } 2938 2939 /// Build a new C++ static_cast expression. 2940 /// 2941 /// By default, performs semantic analysis to build the new expression. 2942 /// Subclasses may override this routine to provide different behavior. 2943 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2944 SourceLocation LAngleLoc, 2945 TypeSourceInfo *TInfo, 2946 SourceLocation RAngleLoc, 2947 SourceLocation LParenLoc, 2948 Expr *SubExpr, 2949 SourceLocation RParenLoc) { 2950 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2951 TInfo, SubExpr, 2952 SourceRange(LAngleLoc, RAngleLoc), 2953 SourceRange(LParenLoc, RParenLoc)); 2954 } 2955 2956 /// Build a new C++ dynamic_cast expression. 2957 /// 2958 /// By default, performs semantic analysis to build the new expression. 2959 /// Subclasses may override this routine to provide different behavior. 2960 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2961 SourceLocation LAngleLoc, 2962 TypeSourceInfo *TInfo, 2963 SourceLocation RAngleLoc, 2964 SourceLocation LParenLoc, 2965 Expr *SubExpr, 2966 SourceLocation RParenLoc) { 2967 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2968 TInfo, SubExpr, 2969 SourceRange(LAngleLoc, RAngleLoc), 2970 SourceRange(LParenLoc, RParenLoc)); 2971 } 2972 2973 /// Build a new C++ reinterpret_cast expression. 2974 /// 2975 /// By default, performs semantic analysis to build the new expression. 2976 /// Subclasses may override this routine to provide different behavior. 2977 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2978 SourceLocation LAngleLoc, 2979 TypeSourceInfo *TInfo, 2980 SourceLocation RAngleLoc, 2981 SourceLocation LParenLoc, 2982 Expr *SubExpr, 2983 SourceLocation RParenLoc) { 2984 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2985 TInfo, SubExpr, 2986 SourceRange(LAngleLoc, RAngleLoc), 2987 SourceRange(LParenLoc, RParenLoc)); 2988 } 2989 2990 /// Build a new C++ const_cast expression. 2991 /// 2992 /// By default, performs semantic analysis to build the new expression. 2993 /// Subclasses may override this routine to provide different behavior. 2994 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2995 SourceLocation LAngleLoc, 2996 TypeSourceInfo *TInfo, 2997 SourceLocation RAngleLoc, 2998 SourceLocation LParenLoc, 2999 Expr *SubExpr, 3000 SourceLocation RParenLoc) { 3001 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 3002 TInfo, SubExpr, 3003 SourceRange(LAngleLoc, RAngleLoc), 3004 SourceRange(LParenLoc, RParenLoc)); 3005 } 3006 3007 ExprResult 3008 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 3009 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 3010 SourceLocation LParenLoc, Expr *SubExpr, 3011 SourceLocation RParenLoc) { 3012 return getSema().BuildCXXNamedCast( 3013 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 3014 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 3015 } 3016 3017 /// Build a new C++ functional-style cast expression. 3018 /// 3019 /// By default, performs semantic analysis to build the new expression. 3020 /// Subclasses may override this routine to provide different behavior. 3021 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 3022 SourceLocation LParenLoc, 3023 Expr *Sub, 3024 SourceLocation RParenLoc, 3025 bool ListInitialization) { 3026 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 3027 MultiExprArg(&Sub, 1), RParenLoc, 3028 ListInitialization); 3029 } 3030 3031 /// Build a new C++ __builtin_bit_cast expression. 3032 /// 3033 /// By default, performs semantic analysis to build the new expression. 3034 /// Subclasses may override this routine to provide different behavior. 3035 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 3036 TypeSourceInfo *TSI, Expr *Sub, 3037 SourceLocation RParenLoc) { 3038 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 3039 } 3040 3041 /// Build a new C++ typeid(type) expression. 3042 /// 3043 /// By default, performs semantic analysis to build the new expression. 3044 /// Subclasses may override this routine to provide different behavior. 3045 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3046 SourceLocation TypeidLoc, 3047 TypeSourceInfo *Operand, 3048 SourceLocation RParenLoc) { 3049 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3050 RParenLoc); 3051 } 3052 3053 3054 /// Build a new C++ typeid(expr) 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 RebuildCXXTypeidExpr(QualType TypeInfoType, 3059 SourceLocation TypeidLoc, 3060 Expr *Operand, 3061 SourceLocation RParenLoc) { 3062 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3063 RParenLoc); 3064 } 3065 3066 /// Build a new C++ __uuidof(type) expression. 3067 /// 3068 /// By default, performs semantic analysis to build the new expression. 3069 /// Subclasses may override this routine to provide different behavior. 3070 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3071 TypeSourceInfo *Operand, 3072 SourceLocation RParenLoc) { 3073 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3074 } 3075 3076 /// Build a new C++ __uuidof(expr) expression. 3077 /// 3078 /// By default, performs semantic analysis to build the new expression. 3079 /// Subclasses may override this routine to provide different behavior. 3080 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3081 Expr *Operand, SourceLocation RParenLoc) { 3082 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3083 } 3084 3085 /// Build a new C++ "this" expression. 3086 /// 3087 /// By default, builds a new "this" expression without performing any 3088 /// semantic analysis. Subclasses may override this routine to provide 3089 /// different behavior. 3090 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3091 QualType ThisType, 3092 bool isImplicit) { 3093 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3094 } 3095 3096 /// Build a new C++ throw expression. 3097 /// 3098 /// By default, performs semantic analysis to build the new expression. 3099 /// Subclasses may override this routine to provide different behavior. 3100 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3101 bool IsThrownVariableInScope) { 3102 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3103 } 3104 3105 /// Build a new C++ default-argument expression. 3106 /// 3107 /// By default, builds a new default-argument expression, which does not 3108 /// require any semantic analysis. Subclasses may override this routine to 3109 /// provide different behavior. 3110 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3111 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3112 getSema().CurContext); 3113 } 3114 3115 /// Build a new C++11 default-initialization expression. 3116 /// 3117 /// By default, builds a new default field initialization expression, which 3118 /// does not require any semantic analysis. Subclasses may override this 3119 /// routine to provide different behavior. 3120 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3121 FieldDecl *Field) { 3122 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3123 getSema().CurContext); 3124 } 3125 3126 /// Build a new C++ zero-initialization expression. 3127 /// 3128 /// By default, performs semantic analysis to build the new expression. 3129 /// Subclasses may override this routine to provide different behavior. 3130 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3131 SourceLocation LParenLoc, 3132 SourceLocation RParenLoc) { 3133 return getSema().BuildCXXTypeConstructExpr( 3134 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3135 } 3136 3137 /// Build a new C++ "new" expression. 3138 /// 3139 /// By default, performs semantic analysis to build the new expression. 3140 /// Subclasses may override this routine to provide different behavior. 3141 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3142 bool UseGlobal, 3143 SourceLocation PlacementLParen, 3144 MultiExprArg PlacementArgs, 3145 SourceLocation PlacementRParen, 3146 SourceRange TypeIdParens, 3147 QualType AllocatedType, 3148 TypeSourceInfo *AllocatedTypeInfo, 3149 Optional<Expr *> ArraySize, 3150 SourceRange DirectInitRange, 3151 Expr *Initializer) { 3152 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3153 PlacementLParen, 3154 PlacementArgs, 3155 PlacementRParen, 3156 TypeIdParens, 3157 AllocatedType, 3158 AllocatedTypeInfo, 3159 ArraySize, 3160 DirectInitRange, 3161 Initializer); 3162 } 3163 3164 /// Build a new C++ "delete" 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 RebuildCXXDeleteExpr(SourceLocation StartLoc, 3169 bool IsGlobalDelete, 3170 bool IsArrayForm, 3171 Expr *Operand) { 3172 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3173 Operand); 3174 } 3175 3176 /// Build a new type trait expression. 3177 /// 3178 /// By default, performs semantic analysis to build the new expression. 3179 /// Subclasses may override this routine to provide different behavior. 3180 ExprResult RebuildTypeTrait(TypeTrait Trait, 3181 SourceLocation StartLoc, 3182 ArrayRef<TypeSourceInfo *> Args, 3183 SourceLocation RParenLoc) { 3184 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3185 } 3186 3187 /// Build a new array type 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 RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3192 SourceLocation StartLoc, 3193 TypeSourceInfo *TSInfo, 3194 Expr *DimExpr, 3195 SourceLocation RParenLoc) { 3196 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3197 } 3198 3199 /// Build a new expression trait 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 RebuildExpressionTrait(ExpressionTrait Trait, 3204 SourceLocation StartLoc, 3205 Expr *Queried, 3206 SourceLocation RParenLoc) { 3207 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3208 } 3209 3210 /// Build a new (previously unresolved) declaration reference 3211 /// expression. 3212 /// 3213 /// By default, performs semantic analysis to build the new expression. 3214 /// Subclasses may override this routine to provide different behavior. 3215 ExprResult RebuildDependentScopeDeclRefExpr( 3216 NestedNameSpecifierLoc QualifierLoc, 3217 SourceLocation TemplateKWLoc, 3218 const DeclarationNameInfo &NameInfo, 3219 const TemplateArgumentListInfo *TemplateArgs, 3220 bool IsAddressOfOperand, 3221 TypeSourceInfo **RecoveryTSI) { 3222 CXXScopeSpec SS; 3223 SS.Adopt(QualifierLoc); 3224 3225 if (TemplateArgs || TemplateKWLoc.isValid()) 3226 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3227 TemplateArgs); 3228 3229 return getSema().BuildQualifiedDeclarationNameExpr( 3230 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3231 } 3232 3233 /// Build a new template-id expression. 3234 /// 3235 /// By default, performs semantic analysis to build the new expression. 3236 /// Subclasses may override this routine to provide different behavior. 3237 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3238 SourceLocation TemplateKWLoc, 3239 LookupResult &R, 3240 bool RequiresADL, 3241 const TemplateArgumentListInfo *TemplateArgs) { 3242 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3243 TemplateArgs); 3244 } 3245 3246 /// Build a new object-construction expression. 3247 /// 3248 /// By default, performs semantic analysis to build the new expression. 3249 /// Subclasses may override this routine to provide different behavior. 3250 ExprResult RebuildCXXConstructExpr(QualType T, 3251 SourceLocation Loc, 3252 CXXConstructorDecl *Constructor, 3253 bool IsElidable, 3254 MultiExprArg Args, 3255 bool HadMultipleCandidates, 3256 bool ListInitialization, 3257 bool StdInitListInitialization, 3258 bool RequiresZeroInit, 3259 CXXConstructExpr::ConstructionKind ConstructKind, 3260 SourceRange ParenRange) { 3261 // Reconstruct the constructor we originally found, which might be 3262 // different if this is a call to an inherited constructor. 3263 CXXConstructorDecl *FoundCtor = Constructor; 3264 if (Constructor->isInheritingConstructor()) 3265 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3266 3267 SmallVector<Expr *, 8> ConvertedArgs; 3268 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3269 ConvertedArgs)) 3270 return ExprError(); 3271 3272 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3273 IsElidable, 3274 ConvertedArgs, 3275 HadMultipleCandidates, 3276 ListInitialization, 3277 StdInitListInitialization, 3278 RequiresZeroInit, ConstructKind, 3279 ParenRange); 3280 } 3281 3282 /// Build a new implicit construction via inherited constructor 3283 /// expression. 3284 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3285 CXXConstructorDecl *Constructor, 3286 bool ConstructsVBase, 3287 bool InheritedFromVBase) { 3288 return new (getSema().Context) CXXInheritedCtorInitExpr( 3289 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3290 } 3291 3292 /// Build a new object-construction expression. 3293 /// 3294 /// By default, performs semantic analysis to build the new expression. 3295 /// Subclasses may override this routine to provide different behavior. 3296 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3297 SourceLocation LParenOrBraceLoc, 3298 MultiExprArg Args, 3299 SourceLocation RParenOrBraceLoc, 3300 bool ListInitialization) { 3301 return getSema().BuildCXXTypeConstructExpr( 3302 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3303 } 3304 3305 /// Build a new object-construction expression. 3306 /// 3307 /// By default, performs semantic analysis to build the new expression. 3308 /// Subclasses may override this routine to provide different behavior. 3309 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3310 SourceLocation LParenLoc, 3311 MultiExprArg Args, 3312 SourceLocation RParenLoc, 3313 bool ListInitialization) { 3314 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3315 RParenLoc, ListInitialization); 3316 } 3317 3318 /// Build a new member reference expression. 3319 /// 3320 /// By default, performs semantic analysis to build the new expression. 3321 /// Subclasses may override this routine to provide different behavior. 3322 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3323 QualType BaseType, 3324 bool IsArrow, 3325 SourceLocation OperatorLoc, 3326 NestedNameSpecifierLoc QualifierLoc, 3327 SourceLocation TemplateKWLoc, 3328 NamedDecl *FirstQualifierInScope, 3329 const DeclarationNameInfo &MemberNameInfo, 3330 const TemplateArgumentListInfo *TemplateArgs) { 3331 CXXScopeSpec SS; 3332 SS.Adopt(QualifierLoc); 3333 3334 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3335 OperatorLoc, IsArrow, 3336 SS, TemplateKWLoc, 3337 FirstQualifierInScope, 3338 MemberNameInfo, 3339 TemplateArgs, /*S*/nullptr); 3340 } 3341 3342 /// Build a new member reference expression. 3343 /// 3344 /// By default, performs semantic analysis to build the new expression. 3345 /// Subclasses may override this routine to provide different behavior. 3346 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3347 SourceLocation OperatorLoc, 3348 bool IsArrow, 3349 NestedNameSpecifierLoc QualifierLoc, 3350 SourceLocation TemplateKWLoc, 3351 NamedDecl *FirstQualifierInScope, 3352 LookupResult &R, 3353 const TemplateArgumentListInfo *TemplateArgs) { 3354 CXXScopeSpec SS; 3355 SS.Adopt(QualifierLoc); 3356 3357 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3358 OperatorLoc, IsArrow, 3359 SS, TemplateKWLoc, 3360 FirstQualifierInScope, 3361 R, TemplateArgs, /*S*/nullptr); 3362 } 3363 3364 /// Build a new noexcept expression. 3365 /// 3366 /// By default, performs semantic analysis to build the new expression. 3367 /// Subclasses may override this routine to provide different behavior. 3368 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3369 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3370 } 3371 3372 /// Build a new expression to compute the length of a parameter pack. 3373 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3374 NamedDecl *Pack, 3375 SourceLocation PackLoc, 3376 SourceLocation RParenLoc, 3377 Optional<unsigned> Length, 3378 ArrayRef<TemplateArgument> PartialArgs) { 3379 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3380 RParenLoc, Length, PartialArgs); 3381 } 3382 3383 /// Build a new expression representing a call to a source location 3384 /// builtin. 3385 /// 3386 /// By default, performs semantic analysis to build the new expression. 3387 /// Subclasses may override this routine to provide different behavior. 3388 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3389 SourceLocation BuiltinLoc, 3390 SourceLocation RPLoc, 3391 DeclContext *ParentContext) { 3392 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3393 } 3394 3395 /// Build a new Objective-C boxed expression. 3396 /// 3397 /// By default, performs semantic analysis to build the new expression. 3398 /// Subclasses may override this routine to provide different behavior. 3399 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3400 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3401 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3402 TemplateArgumentListInfo *TALI) { 3403 CXXScopeSpec SS; 3404 SS.Adopt(NNS); 3405 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3406 ConceptNameInfo, 3407 FoundDecl, 3408 NamedConcept, TALI); 3409 if (Result.isInvalid()) 3410 return ExprError(); 3411 return Result; 3412 } 3413 3414 /// \brief Build a new requires expression. 3415 /// 3416 /// By default, performs semantic analysis to build the new expression. 3417 /// Subclasses may override this routine to provide different behavior. 3418 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3419 RequiresExprBodyDecl *Body, 3420 ArrayRef<ParmVarDecl *> LocalParameters, 3421 ArrayRef<concepts::Requirement *> Requirements, 3422 SourceLocation ClosingBraceLoc) { 3423 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3424 LocalParameters, Requirements, ClosingBraceLoc); 3425 } 3426 3427 concepts::TypeRequirement * 3428 RebuildTypeRequirement( 3429 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3430 return SemaRef.BuildTypeRequirement(SubstDiag); 3431 } 3432 3433 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3434 return SemaRef.BuildTypeRequirement(T); 3435 } 3436 3437 concepts::ExprRequirement * 3438 RebuildExprRequirement( 3439 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3440 SourceLocation NoexceptLoc, 3441 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3442 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3443 std::move(Ret)); 3444 } 3445 3446 concepts::ExprRequirement * 3447 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3448 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3449 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3450 std::move(Ret)); 3451 } 3452 3453 concepts::NestedRequirement * 3454 RebuildNestedRequirement( 3455 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3456 return SemaRef.BuildNestedRequirement(SubstDiag); 3457 } 3458 3459 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3460 return SemaRef.BuildNestedRequirement(Constraint); 3461 } 3462 3463 /// \brief Build a new Objective-C boxed expression. 3464 /// 3465 /// By default, performs semantic analysis to build the new expression. 3466 /// Subclasses may override this routine to provide different behavior. 3467 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3468 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3469 } 3470 3471 /// Build a new Objective-C array literal. 3472 /// 3473 /// By default, performs semantic analysis to build the new expression. 3474 /// Subclasses may override this routine to provide different behavior. 3475 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3476 Expr **Elements, unsigned NumElements) { 3477 return getSema().BuildObjCArrayLiteral(Range, 3478 MultiExprArg(Elements, NumElements)); 3479 } 3480 3481 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3482 Expr *Base, Expr *Key, 3483 ObjCMethodDecl *getterMethod, 3484 ObjCMethodDecl *setterMethod) { 3485 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3486 getterMethod, setterMethod); 3487 } 3488 3489 /// Build a new Objective-C dictionary literal. 3490 /// 3491 /// By default, performs semantic analysis to build the new expression. 3492 /// Subclasses may override this routine to provide different behavior. 3493 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3494 MutableArrayRef<ObjCDictionaryElement> Elements) { 3495 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3496 } 3497 3498 /// Build a new Objective-C \@encode expression. 3499 /// 3500 /// By default, performs semantic analysis to build the new expression. 3501 /// Subclasses may override this routine to provide different behavior. 3502 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3503 TypeSourceInfo *EncodeTypeInfo, 3504 SourceLocation RParenLoc) { 3505 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3506 } 3507 3508 /// Build a new Objective-C class message. 3509 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3510 Selector Sel, 3511 ArrayRef<SourceLocation> SelectorLocs, 3512 ObjCMethodDecl *Method, 3513 SourceLocation LBracLoc, 3514 MultiExprArg Args, 3515 SourceLocation RBracLoc) { 3516 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3517 ReceiverTypeInfo->getType(), 3518 /*SuperLoc=*/SourceLocation(), 3519 Sel, Method, LBracLoc, SelectorLocs, 3520 RBracLoc, Args); 3521 } 3522 3523 /// Build a new Objective-C instance message. 3524 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3525 Selector Sel, 3526 ArrayRef<SourceLocation> SelectorLocs, 3527 ObjCMethodDecl *Method, 3528 SourceLocation LBracLoc, 3529 MultiExprArg Args, 3530 SourceLocation RBracLoc) { 3531 return SemaRef.BuildInstanceMessage(Receiver, 3532 Receiver->getType(), 3533 /*SuperLoc=*/SourceLocation(), 3534 Sel, Method, LBracLoc, SelectorLocs, 3535 RBracLoc, Args); 3536 } 3537 3538 /// Build a new Objective-C instance/class message to 'super'. 3539 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3540 Selector Sel, 3541 ArrayRef<SourceLocation> SelectorLocs, 3542 QualType SuperType, 3543 ObjCMethodDecl *Method, 3544 SourceLocation LBracLoc, 3545 MultiExprArg Args, 3546 SourceLocation RBracLoc) { 3547 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3548 SuperType, 3549 SuperLoc, 3550 Sel, Method, LBracLoc, SelectorLocs, 3551 RBracLoc, Args) 3552 : SemaRef.BuildClassMessage(nullptr, 3553 SuperType, 3554 SuperLoc, 3555 Sel, Method, LBracLoc, SelectorLocs, 3556 RBracLoc, Args); 3557 3558 3559 } 3560 3561 /// Build a new Objective-C ivar reference expression. 3562 /// 3563 /// By default, performs semantic analysis to build the new expression. 3564 /// Subclasses may override this routine to provide different behavior. 3565 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3566 SourceLocation IvarLoc, 3567 bool IsArrow, bool IsFreeIvar) { 3568 CXXScopeSpec SS; 3569 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3570 ExprResult Result = getSema().BuildMemberReferenceExpr( 3571 BaseArg, BaseArg->getType(), 3572 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3573 /*FirstQualifierInScope=*/nullptr, NameInfo, 3574 /*TemplateArgs=*/nullptr, 3575 /*S=*/nullptr); 3576 if (IsFreeIvar && Result.isUsable()) 3577 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3578 return Result; 3579 } 3580 3581 /// Build a new Objective-C property reference expression. 3582 /// 3583 /// By default, performs semantic analysis to build the new expression. 3584 /// Subclasses may override this routine to provide different behavior. 3585 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3586 ObjCPropertyDecl *Property, 3587 SourceLocation PropertyLoc) { 3588 CXXScopeSpec SS; 3589 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3590 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3591 /*FIXME:*/PropertyLoc, 3592 /*IsArrow=*/false, 3593 SS, SourceLocation(), 3594 /*FirstQualifierInScope=*/nullptr, 3595 NameInfo, 3596 /*TemplateArgs=*/nullptr, 3597 /*S=*/nullptr); 3598 } 3599 3600 /// Build a new Objective-C property reference expression. 3601 /// 3602 /// By default, performs semantic analysis to build the new expression. 3603 /// Subclasses may override this routine to provide different behavior. 3604 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3605 ObjCMethodDecl *Getter, 3606 ObjCMethodDecl *Setter, 3607 SourceLocation PropertyLoc) { 3608 // Since these expressions can only be value-dependent, we do not 3609 // need to perform semantic analysis again. 3610 return Owned( 3611 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3612 VK_LValue, OK_ObjCProperty, 3613 PropertyLoc, Base)); 3614 } 3615 3616 /// Build a new Objective-C "isa" expression. 3617 /// 3618 /// By default, performs semantic analysis to build the new expression. 3619 /// Subclasses may override this routine to provide different behavior. 3620 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3621 SourceLocation OpLoc, bool IsArrow) { 3622 CXXScopeSpec SS; 3623 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3624 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3625 OpLoc, IsArrow, 3626 SS, SourceLocation(), 3627 /*FirstQualifierInScope=*/nullptr, 3628 NameInfo, 3629 /*TemplateArgs=*/nullptr, 3630 /*S=*/nullptr); 3631 } 3632 3633 /// Build a new shuffle vector expression. 3634 /// 3635 /// By default, performs semantic analysis to build the new expression. 3636 /// Subclasses may override this routine to provide different behavior. 3637 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3638 MultiExprArg SubExprs, 3639 SourceLocation RParenLoc) { 3640 // Find the declaration for __builtin_shufflevector 3641 const IdentifierInfo &Name 3642 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3643 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3644 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3645 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3646 3647 // Build a reference to the __builtin_shufflevector builtin 3648 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3649 Expr *Callee = new (SemaRef.Context) 3650 DeclRefExpr(SemaRef.Context, Builtin, false, 3651 SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc); 3652 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3653 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3654 CK_BuiltinFnToFnPtr).get(); 3655 3656 // Build the CallExpr 3657 ExprResult TheCall = CallExpr::Create( 3658 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3659 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3660 FPOptionsOverride()); 3661 3662 // Type-check the __builtin_shufflevector expression. 3663 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3664 } 3665 3666 /// Build a new convert vector expression. 3667 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3668 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3669 SourceLocation RParenLoc) { 3670 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3671 BuiltinLoc, RParenLoc); 3672 } 3673 3674 /// Build a new template argument pack expansion. 3675 /// 3676 /// By default, performs semantic analysis to build a new pack expansion 3677 /// for a template argument. Subclasses may override this routine to provide 3678 /// different behavior. 3679 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3680 SourceLocation EllipsisLoc, 3681 Optional<unsigned> NumExpansions) { 3682 switch (Pattern.getArgument().getKind()) { 3683 case TemplateArgument::Expression: { 3684 ExprResult Result 3685 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3686 EllipsisLoc, NumExpansions); 3687 if (Result.isInvalid()) 3688 return TemplateArgumentLoc(); 3689 3690 return TemplateArgumentLoc(Result.get(), Result.get()); 3691 } 3692 3693 case TemplateArgument::Template: 3694 return TemplateArgumentLoc( 3695 SemaRef.Context, 3696 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3697 NumExpansions), 3698 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3699 EllipsisLoc); 3700 3701 case TemplateArgument::Null: 3702 case TemplateArgument::Integral: 3703 case TemplateArgument::Declaration: 3704 case TemplateArgument::Pack: 3705 case TemplateArgument::TemplateExpansion: 3706 case TemplateArgument::NullPtr: 3707 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3708 3709 case TemplateArgument::Type: 3710 if (TypeSourceInfo *Expansion 3711 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3712 EllipsisLoc, 3713 NumExpansions)) 3714 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3715 Expansion); 3716 break; 3717 } 3718 3719 return TemplateArgumentLoc(); 3720 } 3721 3722 /// Build a new expression pack expansion. 3723 /// 3724 /// By default, performs semantic analysis to build a new pack expansion 3725 /// for an expression. Subclasses may override this routine to provide 3726 /// different behavior. 3727 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3728 Optional<unsigned> NumExpansions) { 3729 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3730 } 3731 3732 /// Build a new C++1z fold-expression. 3733 /// 3734 /// By default, performs semantic analysis in order to build a new fold 3735 /// expression. 3736 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3737 SourceLocation LParenLoc, Expr *LHS, 3738 BinaryOperatorKind Operator, 3739 SourceLocation EllipsisLoc, Expr *RHS, 3740 SourceLocation RParenLoc, 3741 Optional<unsigned> NumExpansions) { 3742 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3743 EllipsisLoc, RHS, RParenLoc, 3744 NumExpansions); 3745 } 3746 3747 /// Build an empty C++1z fold-expression with the given operator. 3748 /// 3749 /// By default, produces the fallback value for the fold-expression, or 3750 /// produce an error if there is no fallback value. 3751 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3752 BinaryOperatorKind Operator) { 3753 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3754 } 3755 3756 /// Build a new atomic operation expression. 3757 /// 3758 /// By default, performs semantic analysis to build the new expression. 3759 /// Subclasses may override this routine to provide different behavior. 3760 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3761 AtomicExpr::AtomicOp Op, 3762 SourceLocation RParenLoc) { 3763 // Use this for all of the locations, since we don't know the difference 3764 // between the call and the expr at this point. 3765 SourceRange Range{BuiltinLoc, RParenLoc}; 3766 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3767 Sema::AtomicArgumentOrder::AST); 3768 } 3769 3770 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3771 ArrayRef<Expr *> SubExprs, QualType Type) { 3772 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3773 } 3774 3775 private: 3776 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3777 QualType ObjectType, 3778 NamedDecl *FirstQualifierInScope, 3779 CXXScopeSpec &SS); 3780 3781 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3782 QualType ObjectType, 3783 NamedDecl *FirstQualifierInScope, 3784 CXXScopeSpec &SS); 3785 3786 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3787 NamedDecl *FirstQualifierInScope, 3788 CXXScopeSpec &SS); 3789 3790 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3791 DependentNameTypeLoc TL, 3792 bool DeducibleTSTContext); 3793 }; 3794 3795 template <typename Derived> 3796 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3797 if (!S) 3798 return S; 3799 3800 switch (S->getStmtClass()) { 3801 case Stmt::NoStmtClass: break; 3802 3803 // Transform individual statement nodes 3804 // Pass SDK into statements that can produce a value 3805 #define STMT(Node, Parent) \ 3806 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3807 #define VALUESTMT(Node, Parent) \ 3808 case Stmt::Node##Class: \ 3809 return getDerived().Transform##Node(cast<Node>(S), SDK); 3810 #define ABSTRACT_STMT(Node) 3811 #define EXPR(Node, Parent) 3812 #include "clang/AST/StmtNodes.inc" 3813 3814 // Transform expressions by calling TransformExpr. 3815 #define STMT(Node, Parent) 3816 #define ABSTRACT_STMT(Stmt) 3817 #define EXPR(Node, Parent) case Stmt::Node##Class: 3818 #include "clang/AST/StmtNodes.inc" 3819 { 3820 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3821 3822 if (SDK == SDK_StmtExprResult) 3823 E = getSema().ActOnStmtExprResult(E); 3824 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3825 } 3826 } 3827 3828 return S; 3829 } 3830 3831 template<typename Derived> 3832 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3833 if (!S) 3834 return S; 3835 3836 switch (S->getClauseKind()) { 3837 default: break; 3838 // Transform individual clause nodes 3839 #define GEN_CLANG_CLAUSE_CLASS 3840 #define CLAUSE_CLASS(Enum, Str, Class) \ 3841 case Enum: \ 3842 return getDerived().Transform##Class(cast<Class>(S)); 3843 #include "llvm/Frontend/OpenMP/OMP.inc" 3844 } 3845 3846 return S; 3847 } 3848 3849 3850 template<typename Derived> 3851 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3852 if (!E) 3853 return E; 3854 3855 switch (E->getStmtClass()) { 3856 case Stmt::NoStmtClass: break; 3857 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3858 #define ABSTRACT_STMT(Stmt) 3859 #define EXPR(Node, Parent) \ 3860 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3861 #include "clang/AST/StmtNodes.inc" 3862 } 3863 3864 return E; 3865 } 3866 3867 template<typename Derived> 3868 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3869 bool NotCopyInit) { 3870 // Initializers are instantiated like expressions, except that various outer 3871 // layers are stripped. 3872 if (!Init) 3873 return Init; 3874 3875 if (auto *FE = dyn_cast<FullExpr>(Init)) 3876 Init = FE->getSubExpr(); 3877 3878 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) { 3879 OpaqueValueExpr *OVE = AIL->getCommonExpr(); 3880 Init = OVE->getSourceExpr(); 3881 } 3882 3883 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3884 Init = MTE->getSubExpr(); 3885 3886 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3887 Init = Binder->getSubExpr(); 3888 3889 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3890 Init = ICE->getSubExprAsWritten(); 3891 3892 if (CXXStdInitializerListExpr *ILE = 3893 dyn_cast<CXXStdInitializerListExpr>(Init)) 3894 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3895 3896 // If this is copy-initialization, we only need to reconstruct 3897 // InitListExprs. Other forms of copy-initialization will be a no-op if 3898 // the initializer is already the right type. 3899 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3900 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3901 return getDerived().TransformExpr(Init); 3902 3903 // Revert value-initialization back to empty parens. 3904 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3905 SourceRange Parens = VIE->getSourceRange(); 3906 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3907 Parens.getEnd()); 3908 } 3909 3910 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3911 if (isa<ImplicitValueInitExpr>(Init)) 3912 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3913 SourceLocation()); 3914 3915 // Revert initialization by constructor back to a parenthesized or braced list 3916 // of expressions. Any other form of initializer can just be reused directly. 3917 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3918 return getDerived().TransformExpr(Init); 3919 3920 // If the initialization implicitly converted an initializer list to a 3921 // std::initializer_list object, unwrap the std::initializer_list too. 3922 if (Construct && Construct->isStdInitListInitialization()) 3923 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3924 3925 // Enter a list-init context if this was list initialization. 3926 EnterExpressionEvaluationContext Context( 3927 getSema(), EnterExpressionEvaluationContext::InitList, 3928 Construct->isListInitialization()); 3929 3930 SmallVector<Expr*, 8> NewArgs; 3931 bool ArgChanged = false; 3932 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3933 /*IsCall*/true, NewArgs, &ArgChanged)) 3934 return ExprError(); 3935 3936 // If this was list initialization, revert to syntactic list form. 3937 if (Construct->isListInitialization()) 3938 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3939 Construct->getEndLoc()); 3940 3941 // Build a ParenListExpr to represent anything else. 3942 SourceRange Parens = Construct->getParenOrBraceRange(); 3943 if (Parens.isInvalid()) { 3944 // This was a variable declaration's initialization for which no initializer 3945 // was specified. 3946 assert(NewArgs.empty() && 3947 "no parens or braces but have direct init with arguments?"); 3948 return ExprEmpty(); 3949 } 3950 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3951 Parens.getEnd()); 3952 } 3953 3954 template<typename Derived> 3955 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3956 unsigned NumInputs, 3957 bool IsCall, 3958 SmallVectorImpl<Expr *> &Outputs, 3959 bool *ArgChanged) { 3960 for (unsigned I = 0; I != NumInputs; ++I) { 3961 // If requested, drop call arguments that need to be dropped. 3962 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3963 if (ArgChanged) 3964 *ArgChanged = true; 3965 3966 break; 3967 } 3968 3969 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3970 Expr *Pattern = Expansion->getPattern(); 3971 3972 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3973 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3974 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3975 3976 // Determine whether the set of unexpanded parameter packs can and should 3977 // be expanded. 3978 bool Expand = true; 3979 bool RetainExpansion = false; 3980 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3981 Optional<unsigned> NumExpansions = OrigNumExpansions; 3982 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3983 Pattern->getSourceRange(), 3984 Unexpanded, 3985 Expand, RetainExpansion, 3986 NumExpansions)) 3987 return true; 3988 3989 if (!Expand) { 3990 // The transform has determined that we should perform a simple 3991 // transformation on the pack expansion, producing another pack 3992 // expansion. 3993 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3994 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3995 if (OutPattern.isInvalid()) 3996 return true; 3997 3998 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3999 Expansion->getEllipsisLoc(), 4000 NumExpansions); 4001 if (Out.isInvalid()) 4002 return true; 4003 4004 if (ArgChanged) 4005 *ArgChanged = true; 4006 Outputs.push_back(Out.get()); 4007 continue; 4008 } 4009 4010 // Record right away that the argument was changed. This needs 4011 // to happen even if the array expands to nothing. 4012 if (ArgChanged) *ArgChanged = true; 4013 4014 // The transform has determined that we should perform an elementwise 4015 // expansion of the pattern. Do so. 4016 for (unsigned I = 0; I != *NumExpansions; ++I) { 4017 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4018 ExprResult Out = getDerived().TransformExpr(Pattern); 4019 if (Out.isInvalid()) 4020 return true; 4021 4022 if (Out.get()->containsUnexpandedParameterPack()) { 4023 Out = getDerived().RebuildPackExpansion( 4024 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4025 if (Out.isInvalid()) 4026 return true; 4027 } 4028 4029 Outputs.push_back(Out.get()); 4030 } 4031 4032 // If we're supposed to retain a pack expansion, do so by temporarily 4033 // forgetting the partially-substituted parameter pack. 4034 if (RetainExpansion) { 4035 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4036 4037 ExprResult Out = getDerived().TransformExpr(Pattern); 4038 if (Out.isInvalid()) 4039 return true; 4040 4041 Out = getDerived().RebuildPackExpansion( 4042 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4043 if (Out.isInvalid()) 4044 return true; 4045 4046 Outputs.push_back(Out.get()); 4047 } 4048 4049 continue; 4050 } 4051 4052 ExprResult Result = 4053 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4054 : getDerived().TransformExpr(Inputs[I]); 4055 if (Result.isInvalid()) 4056 return true; 4057 4058 if (Result.get() != Inputs[I] && ArgChanged) 4059 *ArgChanged = true; 4060 4061 Outputs.push_back(Result.get()); 4062 } 4063 4064 return false; 4065 } 4066 4067 template <typename Derived> 4068 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4069 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4070 if (Var) { 4071 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4072 getDerived().TransformDefinition(Var->getLocation(), Var)); 4073 4074 if (!ConditionVar) 4075 return Sema::ConditionError(); 4076 4077 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4078 } 4079 4080 if (Expr) { 4081 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4082 4083 if (CondExpr.isInvalid()) 4084 return Sema::ConditionError(); 4085 4086 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind, 4087 /*MissingOK=*/true); 4088 } 4089 4090 return Sema::ConditionResult(); 4091 } 4092 4093 template <typename Derived> 4094 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4095 NestedNameSpecifierLoc NNS, QualType ObjectType, 4096 NamedDecl *FirstQualifierInScope) { 4097 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4098 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4099 Qualifier = Qualifier.getPrefix()) 4100 Qualifiers.push_back(Qualifier); 4101 4102 CXXScopeSpec SS; 4103 while (!Qualifiers.empty()) { 4104 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4105 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4106 4107 switch (QNNS->getKind()) { 4108 case NestedNameSpecifier::Identifier: { 4109 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4110 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4111 ObjectType); 4112 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4113 SS, FirstQualifierInScope, false)) 4114 return NestedNameSpecifierLoc(); 4115 break; 4116 } 4117 4118 case NestedNameSpecifier::Namespace: { 4119 NamespaceDecl *NS = 4120 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4121 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4122 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4123 break; 4124 } 4125 4126 case NestedNameSpecifier::NamespaceAlias: { 4127 NamespaceAliasDecl *Alias = 4128 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4129 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4130 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4131 Q.getLocalEndLoc()); 4132 break; 4133 } 4134 4135 case NestedNameSpecifier::Global: 4136 // There is no meaningful transformation that one could perform on the 4137 // global scope. 4138 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4139 break; 4140 4141 case NestedNameSpecifier::Super: { 4142 CXXRecordDecl *RD = 4143 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4144 SourceLocation(), QNNS->getAsRecordDecl())); 4145 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4146 break; 4147 } 4148 4149 case NestedNameSpecifier::TypeSpecWithTemplate: 4150 case NestedNameSpecifier::TypeSpec: { 4151 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4152 FirstQualifierInScope, SS); 4153 4154 if (!TL) 4155 return NestedNameSpecifierLoc(); 4156 4157 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4158 (SemaRef.getLangOpts().CPlusPlus11 && 4159 TL.getType()->isEnumeralType())) { 4160 assert(!TL.getType().hasLocalQualifiers() && 4161 "Can't get cv-qualifiers here"); 4162 if (TL.getType()->isEnumeralType()) 4163 SemaRef.Diag(TL.getBeginLoc(), 4164 diag::warn_cxx98_compat_enum_nested_name_spec); 4165 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4166 Q.getLocalEndLoc()); 4167 break; 4168 } 4169 // If the nested-name-specifier is an invalid type def, don't emit an 4170 // error because a previous error should have already been emitted. 4171 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4172 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4173 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4174 << TL.getType() << SS.getRange(); 4175 } 4176 return NestedNameSpecifierLoc(); 4177 } 4178 } 4179 4180 // The qualifier-in-scope and object type only apply to the leftmost entity. 4181 FirstQualifierInScope = nullptr; 4182 ObjectType = QualType(); 4183 } 4184 4185 // Don't rebuild the nested-name-specifier if we don't have to. 4186 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4187 !getDerived().AlwaysRebuild()) 4188 return NNS; 4189 4190 // If we can re-use the source-location data from the original 4191 // nested-name-specifier, do so. 4192 if (SS.location_size() == NNS.getDataLength() && 4193 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4194 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4195 4196 // Allocate new nested-name-specifier location information. 4197 return SS.getWithLocInContext(SemaRef.Context); 4198 } 4199 4200 template<typename Derived> 4201 DeclarationNameInfo 4202 TreeTransform<Derived> 4203 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4204 DeclarationName Name = NameInfo.getName(); 4205 if (!Name) 4206 return DeclarationNameInfo(); 4207 4208 switch (Name.getNameKind()) { 4209 case DeclarationName::Identifier: 4210 case DeclarationName::ObjCZeroArgSelector: 4211 case DeclarationName::ObjCOneArgSelector: 4212 case DeclarationName::ObjCMultiArgSelector: 4213 case DeclarationName::CXXOperatorName: 4214 case DeclarationName::CXXLiteralOperatorName: 4215 case DeclarationName::CXXUsingDirective: 4216 return NameInfo; 4217 4218 case DeclarationName::CXXDeductionGuideName: { 4219 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4220 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4221 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4222 if (!NewTemplate) 4223 return DeclarationNameInfo(); 4224 4225 DeclarationNameInfo NewNameInfo(NameInfo); 4226 NewNameInfo.setName( 4227 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4228 return NewNameInfo; 4229 } 4230 4231 case DeclarationName::CXXConstructorName: 4232 case DeclarationName::CXXDestructorName: 4233 case DeclarationName::CXXConversionFunctionName: { 4234 TypeSourceInfo *NewTInfo; 4235 CanQualType NewCanTy; 4236 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4237 NewTInfo = getDerived().TransformType(OldTInfo); 4238 if (!NewTInfo) 4239 return DeclarationNameInfo(); 4240 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4241 } 4242 else { 4243 NewTInfo = nullptr; 4244 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4245 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4246 if (NewT.isNull()) 4247 return DeclarationNameInfo(); 4248 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4249 } 4250 4251 DeclarationName NewName 4252 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4253 NewCanTy); 4254 DeclarationNameInfo NewNameInfo(NameInfo); 4255 NewNameInfo.setName(NewName); 4256 NewNameInfo.setNamedTypeInfo(NewTInfo); 4257 return NewNameInfo; 4258 } 4259 } 4260 4261 llvm_unreachable("Unknown name kind."); 4262 } 4263 4264 template<typename Derived> 4265 TemplateName 4266 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4267 TemplateName Name, 4268 SourceLocation NameLoc, 4269 QualType ObjectType, 4270 NamedDecl *FirstQualifierInScope, 4271 bool AllowInjectedClassName) { 4272 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4273 TemplateDecl *Template = QTN->getTemplateDecl(); 4274 assert(Template && "qualified template name must refer to a template"); 4275 4276 TemplateDecl *TransTemplate 4277 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4278 Template)); 4279 if (!TransTemplate) 4280 return TemplateName(); 4281 4282 if (!getDerived().AlwaysRebuild() && 4283 SS.getScopeRep() == QTN->getQualifier() && 4284 TransTemplate == Template) 4285 return Name; 4286 4287 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4288 TransTemplate); 4289 } 4290 4291 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4292 if (SS.getScopeRep()) { 4293 // These apply to the scope specifier, not the template. 4294 ObjectType = QualType(); 4295 FirstQualifierInScope = nullptr; 4296 } 4297 4298 if (!getDerived().AlwaysRebuild() && 4299 SS.getScopeRep() == DTN->getQualifier() && 4300 ObjectType.isNull()) 4301 return Name; 4302 4303 // FIXME: Preserve the location of the "template" keyword. 4304 SourceLocation TemplateKWLoc = NameLoc; 4305 4306 if (DTN->isIdentifier()) { 4307 return getDerived().RebuildTemplateName(SS, 4308 TemplateKWLoc, 4309 *DTN->getIdentifier(), 4310 NameLoc, 4311 ObjectType, 4312 FirstQualifierInScope, 4313 AllowInjectedClassName); 4314 } 4315 4316 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4317 DTN->getOperator(), NameLoc, 4318 ObjectType, AllowInjectedClassName); 4319 } 4320 4321 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4322 TemplateDecl *TransTemplate 4323 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4324 Template)); 4325 if (!TransTemplate) 4326 return TemplateName(); 4327 4328 if (!getDerived().AlwaysRebuild() && 4329 TransTemplate == Template) 4330 return Name; 4331 4332 return TemplateName(TransTemplate); 4333 } 4334 4335 if (SubstTemplateTemplateParmPackStorage *SubstPack 4336 = Name.getAsSubstTemplateTemplateParmPack()) { 4337 TemplateTemplateParmDecl *TransParam 4338 = cast_or_null<TemplateTemplateParmDecl>( 4339 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4340 if (!TransParam) 4341 return TemplateName(); 4342 4343 if (!getDerived().AlwaysRebuild() && 4344 TransParam == SubstPack->getParameterPack()) 4345 return Name; 4346 4347 return getDerived().RebuildTemplateName(TransParam, 4348 SubstPack->getArgumentPack()); 4349 } 4350 4351 // These should be getting filtered out before they reach the AST. 4352 llvm_unreachable("overloaded function decl survived to here"); 4353 } 4354 4355 template<typename Derived> 4356 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4357 const TemplateArgument &Arg, 4358 TemplateArgumentLoc &Output) { 4359 Output = getSema().getTrivialTemplateArgumentLoc( 4360 Arg, QualType(), getDerived().getBaseLocation()); 4361 } 4362 4363 template <typename Derived> 4364 bool TreeTransform<Derived>::TransformTemplateArgument( 4365 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4366 bool Uneval) { 4367 const TemplateArgument &Arg = Input.getArgument(); 4368 switch (Arg.getKind()) { 4369 case TemplateArgument::Null: 4370 case TemplateArgument::Pack: 4371 llvm_unreachable("Unexpected TemplateArgument"); 4372 4373 case TemplateArgument::Integral: 4374 case TemplateArgument::NullPtr: 4375 case TemplateArgument::Declaration: { 4376 // Transform a resolved template argument straight to a resolved template 4377 // argument. We get here when substituting into an already-substituted 4378 // template type argument during concept satisfaction checking. 4379 QualType T = Arg.getNonTypeTemplateArgumentType(); 4380 QualType NewT = getDerived().TransformType(T); 4381 if (NewT.isNull()) 4382 return true; 4383 4384 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4385 ? Arg.getAsDecl() 4386 : nullptr; 4387 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4388 getDerived().getBaseLocation(), D)) 4389 : nullptr; 4390 if (D && !NewD) 4391 return true; 4392 4393 if (NewT == T && D == NewD) 4394 Output = Input; 4395 else if (Arg.getKind() == TemplateArgument::Integral) 4396 Output = TemplateArgumentLoc( 4397 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4398 TemplateArgumentLocInfo()); 4399 else if (Arg.getKind() == TemplateArgument::NullPtr) 4400 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4401 TemplateArgumentLocInfo()); 4402 else 4403 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4404 TemplateArgumentLocInfo()); 4405 4406 return false; 4407 } 4408 4409 case TemplateArgument::Type: { 4410 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4411 if (!DI) 4412 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4413 4414 DI = getDerived().TransformType(DI); 4415 if (!DI) 4416 return true; 4417 4418 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4419 return false; 4420 } 4421 4422 case TemplateArgument::Template: { 4423 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4424 if (QualifierLoc) { 4425 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4426 if (!QualifierLoc) 4427 return true; 4428 } 4429 4430 CXXScopeSpec SS; 4431 SS.Adopt(QualifierLoc); 4432 TemplateName Template = getDerived().TransformTemplateName( 4433 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4434 if (Template.isNull()) 4435 return true; 4436 4437 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4438 QualifierLoc, Input.getTemplateNameLoc()); 4439 return false; 4440 } 4441 4442 case TemplateArgument::TemplateExpansion: 4443 llvm_unreachable("Caller should expand pack expansions"); 4444 4445 case TemplateArgument::Expression: { 4446 // Template argument expressions are constant expressions. 4447 EnterExpressionEvaluationContext Unevaluated( 4448 getSema(), 4449 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4450 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4451 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4452 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4453 4454 Expr *InputExpr = Input.getSourceExpression(); 4455 if (!InputExpr) 4456 InputExpr = Input.getArgument().getAsExpr(); 4457 4458 ExprResult E = getDerived().TransformExpr(InputExpr); 4459 E = SemaRef.ActOnConstantExpression(E); 4460 if (E.isInvalid()) 4461 return true; 4462 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4463 return false; 4464 } 4465 } 4466 4467 // Work around bogus GCC warning 4468 return true; 4469 } 4470 4471 /// Iterator adaptor that invents template argument location information 4472 /// for each of the template arguments in its underlying iterator. 4473 template<typename Derived, typename InputIterator> 4474 class TemplateArgumentLocInventIterator { 4475 TreeTransform<Derived> &Self; 4476 InputIterator Iter; 4477 4478 public: 4479 typedef TemplateArgumentLoc value_type; 4480 typedef TemplateArgumentLoc reference; 4481 typedef typename std::iterator_traits<InputIterator>::difference_type 4482 difference_type; 4483 typedef std::input_iterator_tag iterator_category; 4484 4485 class pointer { 4486 TemplateArgumentLoc Arg; 4487 4488 public: 4489 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4490 4491 const TemplateArgumentLoc *operator->() const { return &Arg; } 4492 }; 4493 4494 TemplateArgumentLocInventIterator() { } 4495 4496 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4497 InputIterator Iter) 4498 : Self(Self), Iter(Iter) { } 4499 4500 TemplateArgumentLocInventIterator &operator++() { 4501 ++Iter; 4502 return *this; 4503 } 4504 4505 TemplateArgumentLocInventIterator operator++(int) { 4506 TemplateArgumentLocInventIterator Old(*this); 4507 ++(*this); 4508 return Old; 4509 } 4510 4511 reference operator*() const { 4512 TemplateArgumentLoc Result; 4513 Self.InventTemplateArgumentLoc(*Iter, Result); 4514 return Result; 4515 } 4516 4517 pointer operator->() const { return pointer(**this); } 4518 4519 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4520 const TemplateArgumentLocInventIterator &Y) { 4521 return X.Iter == Y.Iter; 4522 } 4523 4524 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4525 const TemplateArgumentLocInventIterator &Y) { 4526 return X.Iter != Y.Iter; 4527 } 4528 }; 4529 4530 template<typename Derived> 4531 template<typename InputIterator> 4532 bool TreeTransform<Derived>::TransformTemplateArguments( 4533 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4534 bool Uneval) { 4535 for (; First != Last; ++First) { 4536 TemplateArgumentLoc Out; 4537 TemplateArgumentLoc In = *First; 4538 4539 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4540 // Unpack argument packs, which we translate them into separate 4541 // arguments. 4542 // FIXME: We could do much better if we could guarantee that the 4543 // TemplateArgumentLocInfo for the pack expansion would be usable for 4544 // all of the template arguments in the argument pack. 4545 typedef TemplateArgumentLocInventIterator<Derived, 4546 TemplateArgument::pack_iterator> 4547 PackLocIterator; 4548 if (TransformTemplateArguments(PackLocIterator(*this, 4549 In.getArgument().pack_begin()), 4550 PackLocIterator(*this, 4551 In.getArgument().pack_end()), 4552 Outputs, Uneval)) 4553 return true; 4554 4555 continue; 4556 } 4557 4558 if (In.getArgument().isPackExpansion()) { 4559 // We have a pack expansion, for which we will be substituting into 4560 // the pattern. 4561 SourceLocation Ellipsis; 4562 Optional<unsigned> OrigNumExpansions; 4563 TemplateArgumentLoc Pattern 4564 = getSema().getTemplateArgumentPackExpansionPattern( 4565 In, Ellipsis, OrigNumExpansions); 4566 4567 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4568 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4569 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4570 4571 // Determine whether the set of unexpanded parameter packs can and should 4572 // be expanded. 4573 bool Expand = true; 4574 bool RetainExpansion = false; 4575 Optional<unsigned> NumExpansions = OrigNumExpansions; 4576 if (getDerived().TryExpandParameterPacks(Ellipsis, 4577 Pattern.getSourceRange(), 4578 Unexpanded, 4579 Expand, 4580 RetainExpansion, 4581 NumExpansions)) 4582 return true; 4583 4584 if (!Expand) { 4585 // The transform has determined that we should perform a simple 4586 // transformation on the pack expansion, producing another pack 4587 // expansion. 4588 TemplateArgumentLoc OutPattern; 4589 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4590 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4591 return true; 4592 4593 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4594 NumExpansions); 4595 if (Out.getArgument().isNull()) 4596 return true; 4597 4598 Outputs.addArgument(Out); 4599 continue; 4600 } 4601 4602 // The transform has determined that we should perform an elementwise 4603 // expansion of the pattern. Do so. 4604 for (unsigned I = 0; I != *NumExpansions; ++I) { 4605 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4606 4607 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4608 return true; 4609 4610 if (Out.getArgument().containsUnexpandedParameterPack()) { 4611 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4612 OrigNumExpansions); 4613 if (Out.getArgument().isNull()) 4614 return true; 4615 } 4616 4617 Outputs.addArgument(Out); 4618 } 4619 4620 // If we're supposed to retain a pack expansion, do so by temporarily 4621 // forgetting the partially-substituted parameter pack. 4622 if (RetainExpansion) { 4623 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4624 4625 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4626 return true; 4627 4628 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4629 OrigNumExpansions); 4630 if (Out.getArgument().isNull()) 4631 return true; 4632 4633 Outputs.addArgument(Out); 4634 } 4635 4636 continue; 4637 } 4638 4639 // The simple case: 4640 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4641 return true; 4642 4643 Outputs.addArgument(Out); 4644 } 4645 4646 return false; 4647 4648 } 4649 4650 //===----------------------------------------------------------------------===// 4651 // Type transformation 4652 //===----------------------------------------------------------------------===// 4653 4654 template<typename Derived> 4655 QualType TreeTransform<Derived>::TransformType(QualType T) { 4656 if (getDerived().AlreadyTransformed(T)) 4657 return T; 4658 4659 // Temporary workaround. All of these transformations should 4660 // eventually turn into transformations on TypeLocs. 4661 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4662 getDerived().getBaseLocation()); 4663 4664 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4665 4666 if (!NewDI) 4667 return QualType(); 4668 4669 return NewDI->getType(); 4670 } 4671 4672 template<typename Derived> 4673 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4674 // Refine the base location to the type's location. 4675 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4676 getDerived().getBaseEntity()); 4677 if (getDerived().AlreadyTransformed(DI->getType())) 4678 return DI; 4679 4680 TypeLocBuilder TLB; 4681 4682 TypeLoc TL = DI->getTypeLoc(); 4683 TLB.reserve(TL.getFullDataSize()); 4684 4685 QualType Result = getDerived().TransformType(TLB, TL); 4686 if (Result.isNull()) 4687 return nullptr; 4688 4689 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4690 } 4691 4692 template<typename Derived> 4693 QualType 4694 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4695 switch (T.getTypeLocClass()) { 4696 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4697 #define TYPELOC(CLASS, PARENT) \ 4698 case TypeLoc::CLASS: \ 4699 return getDerived().Transform##CLASS##Type(TLB, \ 4700 T.castAs<CLASS##TypeLoc>()); 4701 #include "clang/AST/TypeLocNodes.def" 4702 } 4703 4704 llvm_unreachable("unhandled type loc!"); 4705 } 4706 4707 template<typename Derived> 4708 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4709 if (!isa<DependentNameType>(T)) 4710 return TransformType(T); 4711 4712 if (getDerived().AlreadyTransformed(T)) 4713 return T; 4714 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4715 getDerived().getBaseLocation()); 4716 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4717 return NewDI ? NewDI->getType() : QualType(); 4718 } 4719 4720 template<typename Derived> 4721 TypeSourceInfo * 4722 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4723 if (!isa<DependentNameType>(DI->getType())) 4724 return TransformType(DI); 4725 4726 // Refine the base location to the type's location. 4727 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4728 getDerived().getBaseEntity()); 4729 if (getDerived().AlreadyTransformed(DI->getType())) 4730 return DI; 4731 4732 TypeLocBuilder TLB; 4733 4734 TypeLoc TL = DI->getTypeLoc(); 4735 TLB.reserve(TL.getFullDataSize()); 4736 4737 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4738 if (QTL) 4739 TL = QTL.getUnqualifiedLoc(); 4740 4741 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4742 4743 QualType Result = getDerived().TransformDependentNameType( 4744 TLB, DNTL, /*DeducedTSTContext*/true); 4745 if (Result.isNull()) 4746 return nullptr; 4747 4748 if (QTL) { 4749 Result = getDerived().RebuildQualifiedType(Result, QTL); 4750 if (Result.isNull()) 4751 return nullptr; 4752 TLB.TypeWasModifiedSafely(Result); 4753 } 4754 4755 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4756 } 4757 4758 template<typename Derived> 4759 QualType 4760 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4761 QualifiedTypeLoc T) { 4762 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4763 if (Result.isNull()) 4764 return QualType(); 4765 4766 Result = getDerived().RebuildQualifiedType(Result, T); 4767 4768 if (Result.isNull()) 4769 return QualType(); 4770 4771 // RebuildQualifiedType might have updated the type, but not in a way 4772 // that invalidates the TypeLoc. (There's no location information for 4773 // qualifiers.) 4774 TLB.TypeWasModifiedSafely(Result); 4775 4776 return Result; 4777 } 4778 4779 template <typename Derived> 4780 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4781 QualifiedTypeLoc TL) { 4782 4783 SourceLocation Loc = TL.getBeginLoc(); 4784 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4785 4786 if ((T.getAddressSpace() != LangAS::Default && 4787 Quals.getAddressSpace() != LangAS::Default) && 4788 T.getAddressSpace() != Quals.getAddressSpace()) { 4789 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4790 << TL.getType() << T; 4791 return QualType(); 4792 } 4793 4794 // C++ [dcl.fct]p7: 4795 // [When] adding cv-qualifications on top of the function type [...] the 4796 // cv-qualifiers are ignored. 4797 if (T->isFunctionType()) { 4798 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4799 Quals.getAddressSpace()); 4800 return T; 4801 } 4802 4803 // C++ [dcl.ref]p1: 4804 // when the cv-qualifiers are introduced through the use of a typedef-name 4805 // or decltype-specifier [...] the cv-qualifiers are ignored. 4806 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4807 // applied to a reference type. 4808 if (T->isReferenceType()) { 4809 // The only qualifier that applies to a reference type is restrict. 4810 if (!Quals.hasRestrict()) 4811 return T; 4812 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4813 } 4814 4815 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4816 // resulting type. 4817 if (Quals.hasObjCLifetime()) { 4818 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4819 Quals.removeObjCLifetime(); 4820 else if (T.getObjCLifetime()) { 4821 // Objective-C ARC: 4822 // A lifetime qualifier applied to a substituted template parameter 4823 // overrides the lifetime qualifier from the template argument. 4824 const AutoType *AutoTy; 4825 if (const SubstTemplateTypeParmType *SubstTypeParam 4826 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4827 QualType Replacement = SubstTypeParam->getReplacementType(); 4828 Qualifiers Qs = Replacement.getQualifiers(); 4829 Qs.removeObjCLifetime(); 4830 Replacement = SemaRef.Context.getQualifiedType( 4831 Replacement.getUnqualifiedType(), Qs); 4832 T = SemaRef.Context.getSubstTemplateTypeParmType( 4833 SubstTypeParam->getReplacedParameter(), Replacement); 4834 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4835 // 'auto' types behave the same way as template parameters. 4836 QualType Deduced = AutoTy->getDeducedType(); 4837 Qualifiers Qs = Deduced.getQualifiers(); 4838 Qs.removeObjCLifetime(); 4839 Deduced = 4840 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4841 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4842 AutoTy->isDependentType(), 4843 /*isPack=*/false, 4844 AutoTy->getTypeConstraintConcept(), 4845 AutoTy->getTypeConstraintArguments()); 4846 } else { 4847 // Otherwise, complain about the addition of a qualifier to an 4848 // already-qualified type. 4849 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4850 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4851 Quals.removeObjCLifetime(); 4852 } 4853 } 4854 } 4855 4856 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4857 } 4858 4859 template<typename Derived> 4860 TypeLoc 4861 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4862 QualType ObjectType, 4863 NamedDecl *UnqualLookup, 4864 CXXScopeSpec &SS) { 4865 if (getDerived().AlreadyTransformed(TL.getType())) 4866 return TL; 4867 4868 TypeSourceInfo *TSI = 4869 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4870 if (TSI) 4871 return TSI->getTypeLoc(); 4872 return TypeLoc(); 4873 } 4874 4875 template<typename Derived> 4876 TypeSourceInfo * 4877 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4878 QualType ObjectType, 4879 NamedDecl *UnqualLookup, 4880 CXXScopeSpec &SS) { 4881 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4882 return TSInfo; 4883 4884 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4885 UnqualLookup, SS); 4886 } 4887 4888 template <typename Derived> 4889 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4890 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4891 CXXScopeSpec &SS) { 4892 QualType T = TL.getType(); 4893 assert(!getDerived().AlreadyTransformed(T)); 4894 4895 TypeLocBuilder TLB; 4896 QualType Result; 4897 4898 if (isa<TemplateSpecializationType>(T)) { 4899 TemplateSpecializationTypeLoc SpecTL = 4900 TL.castAs<TemplateSpecializationTypeLoc>(); 4901 4902 TemplateName Template = getDerived().TransformTemplateName( 4903 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4904 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4905 if (Template.isNull()) 4906 return nullptr; 4907 4908 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4909 Template); 4910 } else if (isa<DependentTemplateSpecializationType>(T)) { 4911 DependentTemplateSpecializationTypeLoc SpecTL = 4912 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4913 4914 TemplateName Template 4915 = getDerived().RebuildTemplateName(SS, 4916 SpecTL.getTemplateKeywordLoc(), 4917 *SpecTL.getTypePtr()->getIdentifier(), 4918 SpecTL.getTemplateNameLoc(), 4919 ObjectType, UnqualLookup, 4920 /*AllowInjectedClassName*/true); 4921 if (Template.isNull()) 4922 return nullptr; 4923 4924 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4925 SpecTL, 4926 Template, 4927 SS); 4928 } else { 4929 // Nothing special needs to be done for these. 4930 Result = getDerived().TransformType(TLB, TL); 4931 } 4932 4933 if (Result.isNull()) 4934 return nullptr; 4935 4936 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4937 } 4938 4939 template <class TyLoc> static inline 4940 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4941 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4942 NewT.setNameLoc(T.getNameLoc()); 4943 return T.getType(); 4944 } 4945 4946 template<typename Derived> 4947 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4948 BuiltinTypeLoc T) { 4949 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4950 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4951 if (T.needsExtraLocalData()) 4952 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4953 return T.getType(); 4954 } 4955 4956 template<typename Derived> 4957 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4958 ComplexTypeLoc T) { 4959 // FIXME: recurse? 4960 return TransformTypeSpecType(TLB, T); 4961 } 4962 4963 template <typename Derived> 4964 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4965 AdjustedTypeLoc TL) { 4966 // Adjustments applied during transformation are handled elsewhere. 4967 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4968 } 4969 4970 template<typename Derived> 4971 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4972 DecayedTypeLoc TL) { 4973 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4974 if (OriginalType.isNull()) 4975 return QualType(); 4976 4977 QualType Result = TL.getType(); 4978 if (getDerived().AlwaysRebuild() || 4979 OriginalType != TL.getOriginalLoc().getType()) 4980 Result = SemaRef.Context.getDecayedType(OriginalType); 4981 TLB.push<DecayedTypeLoc>(Result); 4982 // Nothing to set for DecayedTypeLoc. 4983 return Result; 4984 } 4985 4986 template<typename Derived> 4987 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4988 PointerTypeLoc TL) { 4989 QualType PointeeType 4990 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4991 if (PointeeType.isNull()) 4992 return QualType(); 4993 4994 QualType Result = TL.getType(); 4995 if (PointeeType->getAs<ObjCObjectType>()) { 4996 // A dependent pointer type 'T *' has is being transformed such 4997 // that an Objective-C class type is being replaced for 'T'. The 4998 // resulting pointer type is an ObjCObjectPointerType, not a 4999 // PointerType. 5000 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 5001 5002 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 5003 NewT.setStarLoc(TL.getStarLoc()); 5004 return Result; 5005 } 5006 5007 if (getDerived().AlwaysRebuild() || 5008 PointeeType != TL.getPointeeLoc().getType()) { 5009 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 5010 if (Result.isNull()) 5011 return QualType(); 5012 } 5013 5014 // Objective-C ARC can add lifetime qualifiers to the type that we're 5015 // pointing to. 5016 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 5017 5018 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 5019 NewT.setSigilLoc(TL.getSigilLoc()); 5020 return Result; 5021 } 5022 5023 template<typename Derived> 5024 QualType 5025 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5026 BlockPointerTypeLoc TL) { 5027 QualType PointeeType 5028 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5029 if (PointeeType.isNull()) 5030 return QualType(); 5031 5032 QualType Result = TL.getType(); 5033 if (getDerived().AlwaysRebuild() || 5034 PointeeType != TL.getPointeeLoc().getType()) { 5035 Result = getDerived().RebuildBlockPointerType(PointeeType, 5036 TL.getSigilLoc()); 5037 if (Result.isNull()) 5038 return QualType(); 5039 } 5040 5041 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5042 NewT.setSigilLoc(TL.getSigilLoc()); 5043 return Result; 5044 } 5045 5046 /// Transforms a reference type. Note that somewhat paradoxically we 5047 /// don't care whether the type itself is an l-value type or an r-value 5048 /// type; we only care if the type was *written* as an l-value type 5049 /// or an r-value type. 5050 template<typename Derived> 5051 QualType 5052 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5053 ReferenceTypeLoc TL) { 5054 const ReferenceType *T = TL.getTypePtr(); 5055 5056 // Note that this works with the pointee-as-written. 5057 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5058 if (PointeeType.isNull()) 5059 return QualType(); 5060 5061 QualType Result = TL.getType(); 5062 if (getDerived().AlwaysRebuild() || 5063 PointeeType != T->getPointeeTypeAsWritten()) { 5064 Result = getDerived().RebuildReferenceType(PointeeType, 5065 T->isSpelledAsLValue(), 5066 TL.getSigilLoc()); 5067 if (Result.isNull()) 5068 return QualType(); 5069 } 5070 5071 // Objective-C ARC can add lifetime qualifiers to the type that we're 5072 // referring to. 5073 TLB.TypeWasModifiedSafely( 5074 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5075 5076 // r-value references can be rebuilt as l-value references. 5077 ReferenceTypeLoc NewTL; 5078 if (isa<LValueReferenceType>(Result)) 5079 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5080 else 5081 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5082 NewTL.setSigilLoc(TL.getSigilLoc()); 5083 5084 return Result; 5085 } 5086 5087 template<typename Derived> 5088 QualType 5089 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5090 LValueReferenceTypeLoc TL) { 5091 return TransformReferenceType(TLB, TL); 5092 } 5093 5094 template<typename Derived> 5095 QualType 5096 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5097 RValueReferenceTypeLoc TL) { 5098 return TransformReferenceType(TLB, TL); 5099 } 5100 5101 template<typename Derived> 5102 QualType 5103 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5104 MemberPointerTypeLoc TL) { 5105 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5106 if (PointeeType.isNull()) 5107 return QualType(); 5108 5109 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5110 TypeSourceInfo *NewClsTInfo = nullptr; 5111 if (OldClsTInfo) { 5112 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5113 if (!NewClsTInfo) 5114 return QualType(); 5115 } 5116 5117 const MemberPointerType *T = TL.getTypePtr(); 5118 QualType OldClsType = QualType(T->getClass(), 0); 5119 QualType NewClsType; 5120 if (NewClsTInfo) 5121 NewClsType = NewClsTInfo->getType(); 5122 else { 5123 NewClsType = getDerived().TransformType(OldClsType); 5124 if (NewClsType.isNull()) 5125 return QualType(); 5126 } 5127 5128 QualType Result = TL.getType(); 5129 if (getDerived().AlwaysRebuild() || 5130 PointeeType != T->getPointeeType() || 5131 NewClsType != OldClsType) { 5132 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5133 TL.getStarLoc()); 5134 if (Result.isNull()) 5135 return QualType(); 5136 } 5137 5138 // If we had to adjust the pointee type when building a member pointer, make 5139 // sure to push TypeLoc info for it. 5140 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5141 if (MPT && PointeeType != MPT->getPointeeType()) { 5142 assert(isa<AdjustedType>(MPT->getPointeeType())); 5143 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5144 } 5145 5146 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5147 NewTL.setSigilLoc(TL.getSigilLoc()); 5148 NewTL.setClassTInfo(NewClsTInfo); 5149 5150 return Result; 5151 } 5152 5153 template<typename Derived> 5154 QualType 5155 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5156 ConstantArrayTypeLoc TL) { 5157 const ConstantArrayType *T = TL.getTypePtr(); 5158 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5159 if (ElementType.isNull()) 5160 return QualType(); 5161 5162 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5163 Expr *OldSize = TL.getSizeExpr(); 5164 if (!OldSize) 5165 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5166 Expr *NewSize = nullptr; 5167 if (OldSize) { 5168 EnterExpressionEvaluationContext Unevaluated( 5169 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5170 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5171 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5172 } 5173 5174 QualType Result = TL.getType(); 5175 if (getDerived().AlwaysRebuild() || 5176 ElementType != T->getElementType() || 5177 (T->getSizeExpr() && NewSize != OldSize)) { 5178 Result = getDerived().RebuildConstantArrayType(ElementType, 5179 T->getSizeModifier(), 5180 T->getSize(), NewSize, 5181 T->getIndexTypeCVRQualifiers(), 5182 TL.getBracketsRange()); 5183 if (Result.isNull()) 5184 return QualType(); 5185 } 5186 5187 // We might have either a ConstantArrayType or a VariableArrayType now: 5188 // a ConstantArrayType is allowed to have an element type which is a 5189 // VariableArrayType if the type is dependent. Fortunately, all array 5190 // types have the same location layout. 5191 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5192 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5193 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5194 NewTL.setSizeExpr(NewSize); 5195 5196 return Result; 5197 } 5198 5199 template<typename Derived> 5200 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5201 TypeLocBuilder &TLB, 5202 IncompleteArrayTypeLoc TL) { 5203 const IncompleteArrayType *T = TL.getTypePtr(); 5204 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5205 if (ElementType.isNull()) 5206 return QualType(); 5207 5208 QualType Result = TL.getType(); 5209 if (getDerived().AlwaysRebuild() || 5210 ElementType != T->getElementType()) { 5211 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5212 T->getSizeModifier(), 5213 T->getIndexTypeCVRQualifiers(), 5214 TL.getBracketsRange()); 5215 if (Result.isNull()) 5216 return QualType(); 5217 } 5218 5219 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5220 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5221 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5222 NewTL.setSizeExpr(nullptr); 5223 5224 return Result; 5225 } 5226 5227 template<typename Derived> 5228 QualType 5229 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5230 VariableArrayTypeLoc TL) { 5231 const VariableArrayType *T = TL.getTypePtr(); 5232 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5233 if (ElementType.isNull()) 5234 return QualType(); 5235 5236 ExprResult SizeResult; 5237 { 5238 EnterExpressionEvaluationContext Context( 5239 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5240 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5241 } 5242 if (SizeResult.isInvalid()) 5243 return QualType(); 5244 SizeResult = 5245 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5246 if (SizeResult.isInvalid()) 5247 return QualType(); 5248 5249 Expr *Size = SizeResult.get(); 5250 5251 QualType Result = TL.getType(); 5252 if (getDerived().AlwaysRebuild() || 5253 ElementType != T->getElementType() || 5254 Size != T->getSizeExpr()) { 5255 Result = getDerived().RebuildVariableArrayType(ElementType, 5256 T->getSizeModifier(), 5257 Size, 5258 T->getIndexTypeCVRQualifiers(), 5259 TL.getBracketsRange()); 5260 if (Result.isNull()) 5261 return QualType(); 5262 } 5263 5264 // We might have constant size array now, but fortunately it has the same 5265 // location layout. 5266 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5267 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5268 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5269 NewTL.setSizeExpr(Size); 5270 5271 return Result; 5272 } 5273 5274 template<typename Derived> 5275 QualType 5276 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5277 DependentSizedArrayTypeLoc TL) { 5278 const DependentSizedArrayType *T = TL.getTypePtr(); 5279 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5280 if (ElementType.isNull()) 5281 return QualType(); 5282 5283 // Array bounds are constant expressions. 5284 EnterExpressionEvaluationContext Unevaluated( 5285 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5286 5287 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5288 Expr *origSize = TL.getSizeExpr(); 5289 if (!origSize) origSize = T->getSizeExpr(); 5290 5291 ExprResult sizeResult 5292 = getDerived().TransformExpr(origSize); 5293 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5294 if (sizeResult.isInvalid()) 5295 return QualType(); 5296 5297 Expr *size = sizeResult.get(); 5298 5299 QualType Result = TL.getType(); 5300 if (getDerived().AlwaysRebuild() || 5301 ElementType != T->getElementType() || 5302 size != origSize) { 5303 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5304 T->getSizeModifier(), 5305 size, 5306 T->getIndexTypeCVRQualifiers(), 5307 TL.getBracketsRange()); 5308 if (Result.isNull()) 5309 return QualType(); 5310 } 5311 5312 // We might have any sort of array type now, but fortunately they 5313 // all have the same location layout. 5314 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5315 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5316 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5317 NewTL.setSizeExpr(size); 5318 5319 return Result; 5320 } 5321 5322 template <typename Derived> 5323 QualType TreeTransform<Derived>::TransformDependentVectorType( 5324 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5325 const DependentVectorType *T = TL.getTypePtr(); 5326 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5327 if (ElementType.isNull()) 5328 return QualType(); 5329 5330 EnterExpressionEvaluationContext Unevaluated( 5331 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5332 5333 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5334 Size = SemaRef.ActOnConstantExpression(Size); 5335 if (Size.isInvalid()) 5336 return QualType(); 5337 5338 QualType Result = TL.getType(); 5339 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5340 Size.get() != T->getSizeExpr()) { 5341 Result = getDerived().RebuildDependentVectorType( 5342 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5343 if (Result.isNull()) 5344 return QualType(); 5345 } 5346 5347 // Result might be dependent or not. 5348 if (isa<DependentVectorType>(Result)) { 5349 DependentVectorTypeLoc NewTL = 5350 TLB.push<DependentVectorTypeLoc>(Result); 5351 NewTL.setNameLoc(TL.getNameLoc()); 5352 } else { 5353 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5354 NewTL.setNameLoc(TL.getNameLoc()); 5355 } 5356 5357 return Result; 5358 } 5359 5360 template<typename Derived> 5361 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5362 TypeLocBuilder &TLB, 5363 DependentSizedExtVectorTypeLoc TL) { 5364 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5365 5366 // FIXME: ext vector locs should be nested 5367 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5368 if (ElementType.isNull()) 5369 return QualType(); 5370 5371 // Vector sizes are constant expressions. 5372 EnterExpressionEvaluationContext Unevaluated( 5373 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5374 5375 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5376 Size = SemaRef.ActOnConstantExpression(Size); 5377 if (Size.isInvalid()) 5378 return QualType(); 5379 5380 QualType Result = TL.getType(); 5381 if (getDerived().AlwaysRebuild() || 5382 ElementType != T->getElementType() || 5383 Size.get() != T->getSizeExpr()) { 5384 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5385 Size.get(), 5386 T->getAttributeLoc()); 5387 if (Result.isNull()) 5388 return QualType(); 5389 } 5390 5391 // Result might be dependent or not. 5392 if (isa<DependentSizedExtVectorType>(Result)) { 5393 DependentSizedExtVectorTypeLoc NewTL 5394 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5395 NewTL.setNameLoc(TL.getNameLoc()); 5396 } else { 5397 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5398 NewTL.setNameLoc(TL.getNameLoc()); 5399 } 5400 5401 return Result; 5402 } 5403 5404 template <typename Derived> 5405 QualType 5406 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5407 ConstantMatrixTypeLoc TL) { 5408 const ConstantMatrixType *T = TL.getTypePtr(); 5409 QualType ElementType = getDerived().TransformType(T->getElementType()); 5410 if (ElementType.isNull()) 5411 return QualType(); 5412 5413 QualType Result = TL.getType(); 5414 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5415 Result = getDerived().RebuildConstantMatrixType( 5416 ElementType, T->getNumRows(), T->getNumColumns()); 5417 if (Result.isNull()) 5418 return QualType(); 5419 } 5420 5421 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5422 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5423 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5424 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5425 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5426 5427 return Result; 5428 } 5429 5430 template <typename Derived> 5431 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5432 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5433 const DependentSizedMatrixType *T = TL.getTypePtr(); 5434 5435 QualType ElementType = getDerived().TransformType(T->getElementType()); 5436 if (ElementType.isNull()) { 5437 return QualType(); 5438 } 5439 5440 // Matrix dimensions are constant expressions. 5441 EnterExpressionEvaluationContext Unevaluated( 5442 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5443 5444 Expr *origRows = TL.getAttrRowOperand(); 5445 if (!origRows) 5446 origRows = T->getRowExpr(); 5447 Expr *origColumns = TL.getAttrColumnOperand(); 5448 if (!origColumns) 5449 origColumns = T->getColumnExpr(); 5450 5451 ExprResult rowResult = getDerived().TransformExpr(origRows); 5452 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5453 if (rowResult.isInvalid()) 5454 return QualType(); 5455 5456 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5457 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5458 if (columnResult.isInvalid()) 5459 return QualType(); 5460 5461 Expr *rows = rowResult.get(); 5462 Expr *columns = columnResult.get(); 5463 5464 QualType Result = TL.getType(); 5465 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5466 rows != origRows || columns != origColumns) { 5467 Result = getDerived().RebuildDependentSizedMatrixType( 5468 ElementType, rows, columns, T->getAttributeLoc()); 5469 5470 if (Result.isNull()) 5471 return QualType(); 5472 } 5473 5474 // We might have any sort of matrix type now, but fortunately they 5475 // all have the same location layout. 5476 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5477 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5478 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5479 NewTL.setAttrRowOperand(rows); 5480 NewTL.setAttrColumnOperand(columns); 5481 return Result; 5482 } 5483 5484 template <typename Derived> 5485 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5486 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5487 const DependentAddressSpaceType *T = TL.getTypePtr(); 5488 5489 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5490 5491 if (pointeeType.isNull()) 5492 return QualType(); 5493 5494 // Address spaces are constant expressions. 5495 EnterExpressionEvaluationContext Unevaluated( 5496 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5497 5498 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5499 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5500 if (AddrSpace.isInvalid()) 5501 return QualType(); 5502 5503 QualType Result = TL.getType(); 5504 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5505 AddrSpace.get() != T->getAddrSpaceExpr()) { 5506 Result = getDerived().RebuildDependentAddressSpaceType( 5507 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5508 if (Result.isNull()) 5509 return QualType(); 5510 } 5511 5512 // Result might be dependent or not. 5513 if (isa<DependentAddressSpaceType>(Result)) { 5514 DependentAddressSpaceTypeLoc NewTL = 5515 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5516 5517 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5518 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5519 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5520 5521 } else { 5522 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5523 Result, getDerived().getBaseLocation()); 5524 TransformType(TLB, DI->getTypeLoc()); 5525 } 5526 5527 return Result; 5528 } 5529 5530 template <typename Derived> 5531 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5532 VectorTypeLoc TL) { 5533 const VectorType *T = TL.getTypePtr(); 5534 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5535 if (ElementType.isNull()) 5536 return QualType(); 5537 5538 QualType Result = TL.getType(); 5539 if (getDerived().AlwaysRebuild() || 5540 ElementType != T->getElementType()) { 5541 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5542 T->getVectorKind()); 5543 if (Result.isNull()) 5544 return QualType(); 5545 } 5546 5547 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5548 NewTL.setNameLoc(TL.getNameLoc()); 5549 5550 return Result; 5551 } 5552 5553 template<typename Derived> 5554 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5555 ExtVectorTypeLoc TL) { 5556 const VectorType *T = TL.getTypePtr(); 5557 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5558 if (ElementType.isNull()) 5559 return QualType(); 5560 5561 QualType Result = TL.getType(); 5562 if (getDerived().AlwaysRebuild() || 5563 ElementType != T->getElementType()) { 5564 Result = getDerived().RebuildExtVectorType(ElementType, 5565 T->getNumElements(), 5566 /*FIXME*/ SourceLocation()); 5567 if (Result.isNull()) 5568 return QualType(); 5569 } 5570 5571 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5572 NewTL.setNameLoc(TL.getNameLoc()); 5573 5574 return Result; 5575 } 5576 5577 template <typename Derived> 5578 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5579 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5580 bool ExpectParameterPack) { 5581 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5582 TypeSourceInfo *NewDI = nullptr; 5583 5584 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5585 // If we're substituting into a pack expansion type and we know the 5586 // length we want to expand to, just substitute for the pattern. 5587 TypeLoc OldTL = OldDI->getTypeLoc(); 5588 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5589 5590 TypeLocBuilder TLB; 5591 TypeLoc NewTL = OldDI->getTypeLoc(); 5592 TLB.reserve(NewTL.getFullDataSize()); 5593 5594 QualType Result = getDerived().TransformType(TLB, 5595 OldExpansionTL.getPatternLoc()); 5596 if (Result.isNull()) 5597 return nullptr; 5598 5599 Result = RebuildPackExpansionType(Result, 5600 OldExpansionTL.getPatternLoc().getSourceRange(), 5601 OldExpansionTL.getEllipsisLoc(), 5602 NumExpansions); 5603 if (Result.isNull()) 5604 return nullptr; 5605 5606 PackExpansionTypeLoc NewExpansionTL 5607 = TLB.push<PackExpansionTypeLoc>(Result); 5608 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5609 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5610 } else 5611 NewDI = getDerived().TransformType(OldDI); 5612 if (!NewDI) 5613 return nullptr; 5614 5615 if (NewDI == OldDI && indexAdjustment == 0) 5616 return OldParm; 5617 5618 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5619 OldParm->getDeclContext(), 5620 OldParm->getInnerLocStart(), 5621 OldParm->getLocation(), 5622 OldParm->getIdentifier(), 5623 NewDI->getType(), 5624 NewDI, 5625 OldParm->getStorageClass(), 5626 /* DefArg */ nullptr); 5627 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5628 OldParm->getFunctionScopeIndex() + indexAdjustment); 5629 transformedLocalDecl(OldParm, {newParm}); 5630 return newParm; 5631 } 5632 5633 template <typename Derived> 5634 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5635 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5636 const QualType *ParamTypes, 5637 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5638 SmallVectorImpl<QualType> &OutParamTypes, 5639 SmallVectorImpl<ParmVarDecl *> *PVars, 5640 Sema::ExtParameterInfoBuilder &PInfos) { 5641 int indexAdjustment = 0; 5642 5643 unsigned NumParams = Params.size(); 5644 for (unsigned i = 0; i != NumParams; ++i) { 5645 if (ParmVarDecl *OldParm = Params[i]) { 5646 assert(OldParm->getFunctionScopeIndex() == i); 5647 5648 Optional<unsigned> NumExpansions; 5649 ParmVarDecl *NewParm = nullptr; 5650 if (OldParm->isParameterPack()) { 5651 // We have a function parameter pack that may need to be expanded. 5652 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5653 5654 // Find the parameter packs that could be expanded. 5655 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5656 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5657 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5658 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5659 5660 // Determine whether we should expand the parameter packs. 5661 bool ShouldExpand = false; 5662 bool RetainExpansion = false; 5663 Optional<unsigned> OrigNumExpansions; 5664 if (Unexpanded.size() > 0) { 5665 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5666 NumExpansions = OrigNumExpansions; 5667 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5668 Pattern.getSourceRange(), 5669 Unexpanded, 5670 ShouldExpand, 5671 RetainExpansion, 5672 NumExpansions)) { 5673 return true; 5674 } 5675 } else { 5676 #ifndef NDEBUG 5677 const AutoType *AT = 5678 Pattern.getType().getTypePtr()->getContainedAutoType(); 5679 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5680 "Could not find parameter packs or undeduced auto type!"); 5681 #endif 5682 } 5683 5684 if (ShouldExpand) { 5685 // Expand the function parameter pack into multiple, separate 5686 // parameters. 5687 getDerived().ExpandingFunctionParameterPack(OldParm); 5688 for (unsigned I = 0; I != *NumExpansions; ++I) { 5689 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5690 ParmVarDecl *NewParm 5691 = getDerived().TransformFunctionTypeParam(OldParm, 5692 indexAdjustment++, 5693 OrigNumExpansions, 5694 /*ExpectParameterPack=*/false); 5695 if (!NewParm) 5696 return true; 5697 5698 if (ParamInfos) 5699 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5700 OutParamTypes.push_back(NewParm->getType()); 5701 if (PVars) 5702 PVars->push_back(NewParm); 5703 } 5704 5705 // If we're supposed to retain a pack expansion, do so by temporarily 5706 // forgetting the partially-substituted parameter pack. 5707 if (RetainExpansion) { 5708 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5709 ParmVarDecl *NewParm 5710 = getDerived().TransformFunctionTypeParam(OldParm, 5711 indexAdjustment++, 5712 OrigNumExpansions, 5713 /*ExpectParameterPack=*/false); 5714 if (!NewParm) 5715 return true; 5716 5717 if (ParamInfos) 5718 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5719 OutParamTypes.push_back(NewParm->getType()); 5720 if (PVars) 5721 PVars->push_back(NewParm); 5722 } 5723 5724 // The next parameter should have the same adjustment as the 5725 // last thing we pushed, but we post-incremented indexAdjustment 5726 // on every push. Also, if we push nothing, the adjustment should 5727 // go down by one. 5728 indexAdjustment--; 5729 5730 // We're done with the pack expansion. 5731 continue; 5732 } 5733 5734 // We'll substitute the parameter now without expanding the pack 5735 // expansion. 5736 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5737 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5738 indexAdjustment, 5739 NumExpansions, 5740 /*ExpectParameterPack=*/true); 5741 assert(NewParm->isParameterPack() && 5742 "Parameter pack no longer a parameter pack after " 5743 "transformation."); 5744 } else { 5745 NewParm = getDerived().TransformFunctionTypeParam( 5746 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5747 } 5748 5749 if (!NewParm) 5750 return true; 5751 5752 if (ParamInfos) 5753 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5754 OutParamTypes.push_back(NewParm->getType()); 5755 if (PVars) 5756 PVars->push_back(NewParm); 5757 continue; 5758 } 5759 5760 // Deal with the possibility that we don't have a parameter 5761 // declaration for this parameter. 5762 QualType OldType = ParamTypes[i]; 5763 bool IsPackExpansion = false; 5764 Optional<unsigned> NumExpansions; 5765 QualType NewType; 5766 if (const PackExpansionType *Expansion 5767 = dyn_cast<PackExpansionType>(OldType)) { 5768 // We have a function parameter pack that may need to be expanded. 5769 QualType Pattern = Expansion->getPattern(); 5770 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5771 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5772 5773 // Determine whether we should expand the parameter packs. 5774 bool ShouldExpand = false; 5775 bool RetainExpansion = false; 5776 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5777 Unexpanded, 5778 ShouldExpand, 5779 RetainExpansion, 5780 NumExpansions)) { 5781 return true; 5782 } 5783 5784 if (ShouldExpand) { 5785 // Expand the function parameter pack into multiple, separate 5786 // parameters. 5787 for (unsigned I = 0; I != *NumExpansions; ++I) { 5788 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5789 QualType NewType = getDerived().TransformType(Pattern); 5790 if (NewType.isNull()) 5791 return true; 5792 5793 if (NewType->containsUnexpandedParameterPack()) { 5794 NewType = 5795 getSema().getASTContext().getPackExpansionType(NewType, None); 5796 5797 if (NewType.isNull()) 5798 return true; 5799 } 5800 5801 if (ParamInfos) 5802 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5803 OutParamTypes.push_back(NewType); 5804 if (PVars) 5805 PVars->push_back(nullptr); 5806 } 5807 5808 // We're done with the pack expansion. 5809 continue; 5810 } 5811 5812 // If we're supposed to retain a pack expansion, do so by temporarily 5813 // forgetting the partially-substituted parameter pack. 5814 if (RetainExpansion) { 5815 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5816 QualType NewType = getDerived().TransformType(Pattern); 5817 if (NewType.isNull()) 5818 return true; 5819 5820 if (ParamInfos) 5821 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5822 OutParamTypes.push_back(NewType); 5823 if (PVars) 5824 PVars->push_back(nullptr); 5825 } 5826 5827 // We'll substitute the parameter now without expanding the pack 5828 // expansion. 5829 OldType = Expansion->getPattern(); 5830 IsPackExpansion = true; 5831 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5832 NewType = getDerived().TransformType(OldType); 5833 } else { 5834 NewType = getDerived().TransformType(OldType); 5835 } 5836 5837 if (NewType.isNull()) 5838 return true; 5839 5840 if (IsPackExpansion) 5841 NewType = getSema().Context.getPackExpansionType(NewType, 5842 NumExpansions); 5843 5844 if (ParamInfos) 5845 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5846 OutParamTypes.push_back(NewType); 5847 if (PVars) 5848 PVars->push_back(nullptr); 5849 } 5850 5851 #ifndef NDEBUG 5852 if (PVars) { 5853 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5854 if (ParmVarDecl *parm = (*PVars)[i]) 5855 assert(parm->getFunctionScopeIndex() == i); 5856 } 5857 #endif 5858 5859 return false; 5860 } 5861 5862 template<typename Derived> 5863 QualType 5864 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5865 FunctionProtoTypeLoc TL) { 5866 SmallVector<QualType, 4> ExceptionStorage; 5867 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5868 return getDerived().TransformFunctionProtoType( 5869 TLB, TL, nullptr, Qualifiers(), 5870 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5871 return This->getDerived().TransformExceptionSpec( 5872 TL.getBeginLoc(), ESI, ExceptionStorage, Changed); 5873 }); 5874 } 5875 5876 template<typename Derived> template<typename Fn> 5877 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5878 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5879 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5880 5881 // Transform the parameters and return type. 5882 // 5883 // We are required to instantiate the params and return type in source order. 5884 // When the function has a trailing return type, we instantiate the 5885 // parameters before the return type, since the return type can then refer 5886 // to the parameters themselves (via decltype, sizeof, etc.). 5887 // 5888 SmallVector<QualType, 4> ParamTypes; 5889 SmallVector<ParmVarDecl*, 4> ParamDecls; 5890 Sema::ExtParameterInfoBuilder ExtParamInfos; 5891 const FunctionProtoType *T = TL.getTypePtr(); 5892 5893 QualType ResultType; 5894 5895 if (T->hasTrailingReturn()) { 5896 if (getDerived().TransformFunctionTypeParams( 5897 TL.getBeginLoc(), TL.getParams(), 5898 TL.getTypePtr()->param_type_begin(), 5899 T->getExtParameterInfosOrNull(), 5900 ParamTypes, &ParamDecls, ExtParamInfos)) 5901 return QualType(); 5902 5903 { 5904 // C++11 [expr.prim.general]p3: 5905 // If a declaration declares a member function or member function 5906 // template of a class X, the expression this is a prvalue of type 5907 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5908 // and the end of the function-definition, member-declarator, or 5909 // declarator. 5910 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5911 5912 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5913 if (ResultType.isNull()) 5914 return QualType(); 5915 } 5916 } 5917 else { 5918 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5919 if (ResultType.isNull()) 5920 return QualType(); 5921 5922 if (getDerived().TransformFunctionTypeParams( 5923 TL.getBeginLoc(), TL.getParams(), 5924 TL.getTypePtr()->param_type_begin(), 5925 T->getExtParameterInfosOrNull(), 5926 ParamTypes, &ParamDecls, ExtParamInfos)) 5927 return QualType(); 5928 } 5929 5930 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5931 5932 bool EPIChanged = false; 5933 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5934 return QualType(); 5935 5936 // Handle extended parameter information. 5937 if (auto NewExtParamInfos = 5938 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5939 if (!EPI.ExtParameterInfos || 5940 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5941 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5942 EPIChanged = true; 5943 } 5944 EPI.ExtParameterInfos = NewExtParamInfos; 5945 } else if (EPI.ExtParameterInfos) { 5946 EPIChanged = true; 5947 EPI.ExtParameterInfos = nullptr; 5948 } 5949 5950 QualType Result = TL.getType(); 5951 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5952 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5953 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5954 if (Result.isNull()) 5955 return QualType(); 5956 } 5957 5958 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5959 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5960 NewTL.setLParenLoc(TL.getLParenLoc()); 5961 NewTL.setRParenLoc(TL.getRParenLoc()); 5962 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5963 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5964 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5965 NewTL.setParam(i, ParamDecls[i]); 5966 5967 return Result; 5968 } 5969 5970 template<typename Derived> 5971 bool TreeTransform<Derived>::TransformExceptionSpec( 5972 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5973 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5974 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5975 5976 // Instantiate a dynamic noexcept expression, if any. 5977 if (isComputedNoexcept(ESI.Type)) { 5978 EnterExpressionEvaluationContext Unevaluated( 5979 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5980 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5981 if (NoexceptExpr.isInvalid()) 5982 return true; 5983 5984 ExceptionSpecificationType EST = ESI.Type; 5985 NoexceptExpr = 5986 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 5987 if (NoexceptExpr.isInvalid()) 5988 return true; 5989 5990 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5991 Changed = true; 5992 ESI.NoexceptExpr = NoexceptExpr.get(); 5993 ESI.Type = EST; 5994 } 5995 5996 if (ESI.Type != EST_Dynamic) 5997 return false; 5998 5999 // Instantiate a dynamic exception specification's type. 6000 for (QualType T : ESI.Exceptions) { 6001 if (const PackExpansionType *PackExpansion = 6002 T->getAs<PackExpansionType>()) { 6003 Changed = true; 6004 6005 // We have a pack expansion. Instantiate it. 6006 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6007 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6008 Unexpanded); 6009 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6010 6011 // Determine whether the set of unexpanded parameter packs can and 6012 // should 6013 // be expanded. 6014 bool Expand = false; 6015 bool RetainExpansion = false; 6016 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6017 // FIXME: Track the location of the ellipsis (and track source location 6018 // information for the types in the exception specification in general). 6019 if (getDerived().TryExpandParameterPacks( 6020 Loc, SourceRange(), Unexpanded, Expand, 6021 RetainExpansion, NumExpansions)) 6022 return true; 6023 6024 if (!Expand) { 6025 // We can't expand this pack expansion into separate arguments yet; 6026 // just substitute into the pattern and create a new pack expansion 6027 // type. 6028 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6029 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6030 if (U.isNull()) 6031 return true; 6032 6033 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6034 Exceptions.push_back(U); 6035 continue; 6036 } 6037 6038 // Substitute into the pack expansion pattern for each slice of the 6039 // pack. 6040 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6041 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6042 6043 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6044 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6045 return true; 6046 6047 Exceptions.push_back(U); 6048 } 6049 } else { 6050 QualType U = getDerived().TransformType(T); 6051 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6052 return true; 6053 if (T != U) 6054 Changed = true; 6055 6056 Exceptions.push_back(U); 6057 } 6058 } 6059 6060 ESI.Exceptions = Exceptions; 6061 if (ESI.Exceptions.empty()) 6062 ESI.Type = EST_DynamicNone; 6063 return false; 6064 } 6065 6066 template<typename Derived> 6067 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6068 TypeLocBuilder &TLB, 6069 FunctionNoProtoTypeLoc TL) { 6070 const FunctionNoProtoType *T = TL.getTypePtr(); 6071 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6072 if (ResultType.isNull()) 6073 return QualType(); 6074 6075 QualType Result = TL.getType(); 6076 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6077 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6078 6079 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6080 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6081 NewTL.setLParenLoc(TL.getLParenLoc()); 6082 NewTL.setRParenLoc(TL.getRParenLoc()); 6083 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6084 6085 return Result; 6086 } 6087 6088 template <typename Derived> 6089 QualType TreeTransform<Derived>::TransformUnresolvedUsingType( 6090 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) { 6091 const UnresolvedUsingType *T = TL.getTypePtr(); 6092 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6093 if (!D) 6094 return QualType(); 6095 6096 QualType Result = TL.getType(); 6097 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6098 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6099 if (Result.isNull()) 6100 return QualType(); 6101 } 6102 6103 // We might get an arbitrary type spec type back. We should at 6104 // least always get a type spec type, though. 6105 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6106 NewTL.setNameLoc(TL.getNameLoc()); 6107 6108 return Result; 6109 } 6110 6111 template <typename Derived> 6112 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB, 6113 UsingTypeLoc TL) { 6114 const UsingType *T = TL.getTypePtr(); 6115 6116 auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl( 6117 TL.getLocalSourceRange().getBegin(), T->getFoundDecl())); 6118 if (!Found) 6119 return QualType(); 6120 6121 QualType Underlying = getDerived().TransformType(T->desugar()); 6122 if (Underlying.isNull()) 6123 return QualType(); 6124 6125 QualType Result = TL.getType(); 6126 if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() || 6127 Underlying != T->getUnderlyingType()) { 6128 Result = getDerived().RebuildUsingType(Found, Underlying); 6129 if (Result.isNull()) 6130 return QualType(); 6131 } 6132 6133 TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc()); 6134 return Result; 6135 } 6136 6137 template<typename Derived> 6138 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6139 TypedefTypeLoc TL) { 6140 const TypedefType *T = TL.getTypePtr(); 6141 TypedefNameDecl *Typedef 6142 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6143 T->getDecl())); 6144 if (!Typedef) 6145 return QualType(); 6146 6147 QualType Result = TL.getType(); 6148 if (getDerived().AlwaysRebuild() || 6149 Typedef != T->getDecl()) { 6150 Result = getDerived().RebuildTypedefType(Typedef); 6151 if (Result.isNull()) 6152 return QualType(); 6153 } 6154 6155 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6156 NewTL.setNameLoc(TL.getNameLoc()); 6157 6158 return Result; 6159 } 6160 6161 template<typename Derived> 6162 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6163 TypeOfExprTypeLoc TL) { 6164 // typeof expressions are not potentially evaluated contexts 6165 EnterExpressionEvaluationContext Unevaluated( 6166 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6167 Sema::ReuseLambdaContextDecl); 6168 6169 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6170 if (E.isInvalid()) 6171 return QualType(); 6172 6173 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6174 if (E.isInvalid()) 6175 return QualType(); 6176 6177 QualType Result = TL.getType(); 6178 if (getDerived().AlwaysRebuild() || 6179 E.get() != TL.getUnderlyingExpr()) { 6180 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6181 if (Result.isNull()) 6182 return QualType(); 6183 } 6184 else E.get(); 6185 6186 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6187 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6188 NewTL.setLParenLoc(TL.getLParenLoc()); 6189 NewTL.setRParenLoc(TL.getRParenLoc()); 6190 6191 return Result; 6192 } 6193 6194 template<typename Derived> 6195 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6196 TypeOfTypeLoc TL) { 6197 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6198 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6199 if (!New_Under_TI) 6200 return QualType(); 6201 6202 QualType Result = TL.getType(); 6203 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6204 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6205 if (Result.isNull()) 6206 return QualType(); 6207 } 6208 6209 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6210 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6211 NewTL.setLParenLoc(TL.getLParenLoc()); 6212 NewTL.setRParenLoc(TL.getRParenLoc()); 6213 NewTL.setUnderlyingTInfo(New_Under_TI); 6214 6215 return Result; 6216 } 6217 6218 template<typename Derived> 6219 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6220 DecltypeTypeLoc TL) { 6221 const DecltypeType *T = TL.getTypePtr(); 6222 6223 // decltype expressions are not potentially evaluated contexts 6224 EnterExpressionEvaluationContext Unevaluated( 6225 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6226 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6227 6228 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6229 if (E.isInvalid()) 6230 return QualType(); 6231 6232 E = getSema().ActOnDecltypeExpression(E.get()); 6233 if (E.isInvalid()) 6234 return QualType(); 6235 6236 QualType Result = TL.getType(); 6237 if (getDerived().AlwaysRebuild() || 6238 E.get() != T->getUnderlyingExpr()) { 6239 Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc()); 6240 if (Result.isNull()) 6241 return QualType(); 6242 } 6243 else E.get(); 6244 6245 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6246 NewTL.setDecltypeLoc(TL.getDecltypeLoc()); 6247 NewTL.setRParenLoc(TL.getRParenLoc()); 6248 return Result; 6249 } 6250 6251 template<typename Derived> 6252 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6253 TypeLocBuilder &TLB, 6254 UnaryTransformTypeLoc TL) { 6255 QualType Result = TL.getType(); 6256 if (Result->isDependentType()) { 6257 const UnaryTransformType *T = TL.getTypePtr(); 6258 QualType NewBase = 6259 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6260 Result = getDerived().RebuildUnaryTransformType(NewBase, 6261 T->getUTTKind(), 6262 TL.getKWLoc()); 6263 if (Result.isNull()) 6264 return QualType(); 6265 } 6266 6267 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6268 NewTL.setKWLoc(TL.getKWLoc()); 6269 NewTL.setParensRange(TL.getParensRange()); 6270 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6271 return Result; 6272 } 6273 6274 template<typename Derived> 6275 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6276 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6277 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6278 6279 CXXScopeSpec SS; 6280 TemplateName TemplateName = getDerived().TransformTemplateName( 6281 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6282 if (TemplateName.isNull()) 6283 return QualType(); 6284 6285 QualType OldDeduced = T->getDeducedType(); 6286 QualType NewDeduced; 6287 if (!OldDeduced.isNull()) { 6288 NewDeduced = getDerived().TransformType(OldDeduced); 6289 if (NewDeduced.isNull()) 6290 return QualType(); 6291 } 6292 6293 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6294 TemplateName, NewDeduced); 6295 if (Result.isNull()) 6296 return QualType(); 6297 6298 DeducedTemplateSpecializationTypeLoc NewTL = 6299 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6300 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6301 6302 return Result; 6303 } 6304 6305 template<typename Derived> 6306 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6307 RecordTypeLoc TL) { 6308 const RecordType *T = TL.getTypePtr(); 6309 RecordDecl *Record 6310 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6311 T->getDecl())); 6312 if (!Record) 6313 return QualType(); 6314 6315 QualType Result = TL.getType(); 6316 if (getDerived().AlwaysRebuild() || 6317 Record != T->getDecl()) { 6318 Result = getDerived().RebuildRecordType(Record); 6319 if (Result.isNull()) 6320 return QualType(); 6321 } 6322 6323 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6324 NewTL.setNameLoc(TL.getNameLoc()); 6325 6326 return Result; 6327 } 6328 6329 template<typename Derived> 6330 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6331 EnumTypeLoc TL) { 6332 const EnumType *T = TL.getTypePtr(); 6333 EnumDecl *Enum 6334 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6335 T->getDecl())); 6336 if (!Enum) 6337 return QualType(); 6338 6339 QualType Result = TL.getType(); 6340 if (getDerived().AlwaysRebuild() || 6341 Enum != T->getDecl()) { 6342 Result = getDerived().RebuildEnumType(Enum); 6343 if (Result.isNull()) 6344 return QualType(); 6345 } 6346 6347 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6348 NewTL.setNameLoc(TL.getNameLoc()); 6349 6350 return Result; 6351 } 6352 6353 template<typename Derived> 6354 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6355 TypeLocBuilder &TLB, 6356 InjectedClassNameTypeLoc TL) { 6357 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6358 TL.getTypePtr()->getDecl()); 6359 if (!D) return QualType(); 6360 6361 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6362 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6363 return T; 6364 } 6365 6366 template<typename Derived> 6367 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6368 TypeLocBuilder &TLB, 6369 TemplateTypeParmTypeLoc TL) { 6370 return TransformTypeSpecType(TLB, TL); 6371 } 6372 6373 template<typename Derived> 6374 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6375 TypeLocBuilder &TLB, 6376 SubstTemplateTypeParmTypeLoc TL) { 6377 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6378 6379 // Substitute into the replacement type, which itself might involve something 6380 // that needs to be transformed. This only tends to occur with default 6381 // template arguments of template template parameters. 6382 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6383 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6384 if (Replacement.isNull()) 6385 return QualType(); 6386 6387 // Always canonicalize the replacement type. 6388 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6389 QualType Result 6390 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6391 Replacement); 6392 6393 // Propagate type-source information. 6394 SubstTemplateTypeParmTypeLoc NewTL 6395 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6396 NewTL.setNameLoc(TL.getNameLoc()); 6397 return Result; 6398 6399 } 6400 6401 template<typename Derived> 6402 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6403 TypeLocBuilder &TLB, 6404 SubstTemplateTypeParmPackTypeLoc TL) { 6405 return TransformTypeSpecType(TLB, TL); 6406 } 6407 6408 template<typename Derived> 6409 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6410 TypeLocBuilder &TLB, 6411 TemplateSpecializationTypeLoc TL) { 6412 const TemplateSpecializationType *T = TL.getTypePtr(); 6413 6414 // The nested-name-specifier never matters in a TemplateSpecializationType, 6415 // because we can't have a dependent nested-name-specifier anyway. 6416 CXXScopeSpec SS; 6417 TemplateName Template 6418 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6419 TL.getTemplateNameLoc()); 6420 if (Template.isNull()) 6421 return QualType(); 6422 6423 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6424 } 6425 6426 template<typename Derived> 6427 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6428 AtomicTypeLoc TL) { 6429 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6430 if (ValueType.isNull()) 6431 return QualType(); 6432 6433 QualType Result = TL.getType(); 6434 if (getDerived().AlwaysRebuild() || 6435 ValueType != TL.getValueLoc().getType()) { 6436 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6437 if (Result.isNull()) 6438 return QualType(); 6439 } 6440 6441 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6442 NewTL.setKWLoc(TL.getKWLoc()); 6443 NewTL.setLParenLoc(TL.getLParenLoc()); 6444 NewTL.setRParenLoc(TL.getRParenLoc()); 6445 6446 return Result; 6447 } 6448 6449 template <typename Derived> 6450 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6451 PipeTypeLoc TL) { 6452 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6453 if (ValueType.isNull()) 6454 return QualType(); 6455 6456 QualType Result = TL.getType(); 6457 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6458 const PipeType *PT = Result->castAs<PipeType>(); 6459 bool isReadPipe = PT->isReadOnly(); 6460 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6461 if (Result.isNull()) 6462 return QualType(); 6463 } 6464 6465 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6466 NewTL.setKWLoc(TL.getKWLoc()); 6467 6468 return Result; 6469 } 6470 6471 template <typename Derived> 6472 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB, 6473 BitIntTypeLoc TL) { 6474 const BitIntType *EIT = TL.getTypePtr(); 6475 QualType Result = TL.getType(); 6476 6477 if (getDerived().AlwaysRebuild()) { 6478 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(), 6479 EIT->getNumBits(), TL.getNameLoc()); 6480 if (Result.isNull()) 6481 return QualType(); 6482 } 6483 6484 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6485 NewTL.setNameLoc(TL.getNameLoc()); 6486 return Result; 6487 } 6488 6489 template <typename Derived> 6490 QualType TreeTransform<Derived>::TransformDependentBitIntType( 6491 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) { 6492 const DependentBitIntType *EIT = TL.getTypePtr(); 6493 6494 EnterExpressionEvaluationContext Unevaluated( 6495 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6496 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6497 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6498 6499 if (BitsExpr.isInvalid()) 6500 return QualType(); 6501 6502 QualType Result = TL.getType(); 6503 6504 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6505 Result = getDerived().RebuildDependentBitIntType( 6506 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6507 6508 if (Result.isNull()) 6509 return QualType(); 6510 } 6511 6512 if (isa<DependentBitIntType>(Result)) { 6513 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result); 6514 NewTL.setNameLoc(TL.getNameLoc()); 6515 } else { 6516 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6517 NewTL.setNameLoc(TL.getNameLoc()); 6518 } 6519 return Result; 6520 } 6521 6522 /// Simple iterator that traverses the template arguments in a 6523 /// container that provides a \c getArgLoc() member function. 6524 /// 6525 /// This iterator is intended to be used with the iterator form of 6526 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6527 template<typename ArgLocContainer> 6528 class TemplateArgumentLocContainerIterator { 6529 ArgLocContainer *Container; 6530 unsigned Index; 6531 6532 public: 6533 typedef TemplateArgumentLoc value_type; 6534 typedef TemplateArgumentLoc reference; 6535 typedef int difference_type; 6536 typedef std::input_iterator_tag iterator_category; 6537 6538 class pointer { 6539 TemplateArgumentLoc Arg; 6540 6541 public: 6542 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6543 6544 const TemplateArgumentLoc *operator->() const { 6545 return &Arg; 6546 } 6547 }; 6548 6549 6550 TemplateArgumentLocContainerIterator() {} 6551 6552 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6553 unsigned Index) 6554 : Container(&Container), Index(Index) { } 6555 6556 TemplateArgumentLocContainerIterator &operator++() { 6557 ++Index; 6558 return *this; 6559 } 6560 6561 TemplateArgumentLocContainerIterator operator++(int) { 6562 TemplateArgumentLocContainerIterator Old(*this); 6563 ++(*this); 6564 return Old; 6565 } 6566 6567 TemplateArgumentLoc operator*() const { 6568 return Container->getArgLoc(Index); 6569 } 6570 6571 pointer operator->() const { 6572 return pointer(Container->getArgLoc(Index)); 6573 } 6574 6575 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6576 const TemplateArgumentLocContainerIterator &Y) { 6577 return X.Container == Y.Container && X.Index == Y.Index; 6578 } 6579 6580 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6581 const TemplateArgumentLocContainerIterator &Y) { 6582 return !(X == Y); 6583 } 6584 }; 6585 6586 template<typename Derived> 6587 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6588 AutoTypeLoc TL) { 6589 const AutoType *T = TL.getTypePtr(); 6590 QualType OldDeduced = T->getDeducedType(); 6591 QualType NewDeduced; 6592 if (!OldDeduced.isNull()) { 6593 NewDeduced = getDerived().TransformType(OldDeduced); 6594 if (NewDeduced.isNull()) 6595 return QualType(); 6596 } 6597 6598 ConceptDecl *NewCD = nullptr; 6599 TemplateArgumentListInfo NewTemplateArgs; 6600 NestedNameSpecifierLoc NewNestedNameSpec; 6601 if (T->isConstrained()) { 6602 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6603 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6604 6605 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6606 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6607 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6608 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6609 ArgIterator(TL, 6610 TL.getNumArgs()), 6611 NewTemplateArgs)) 6612 return QualType(); 6613 6614 if (TL.getNestedNameSpecifierLoc()) { 6615 NewNestedNameSpec 6616 = getDerived().TransformNestedNameSpecifierLoc( 6617 TL.getNestedNameSpecifierLoc()); 6618 if (!NewNestedNameSpec) 6619 return QualType(); 6620 } 6621 } 6622 6623 QualType Result = TL.getType(); 6624 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6625 T->isDependentType() || T->isConstrained()) { 6626 // FIXME: Maybe don't rebuild if all template arguments are the same. 6627 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6628 NewArgList.reserve(NewTemplateArgs.size()); 6629 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6630 NewArgList.push_back(ArgLoc.getArgument()); 6631 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6632 NewArgList); 6633 if (Result.isNull()) 6634 return QualType(); 6635 } 6636 6637 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6638 NewTL.setNameLoc(TL.getNameLoc()); 6639 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6640 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6641 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6642 NewTL.setFoundDecl(TL.getFoundDecl()); 6643 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6644 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6645 NewTL.setRParenLoc(TL.getRParenLoc()); 6646 for (unsigned I = 0; I < NewTL.getNumArgs(); ++I) 6647 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6648 6649 return Result; 6650 } 6651 6652 template <typename Derived> 6653 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6654 TypeLocBuilder &TLB, 6655 TemplateSpecializationTypeLoc TL, 6656 TemplateName Template) { 6657 TemplateArgumentListInfo NewTemplateArgs; 6658 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6659 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6660 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6661 ArgIterator; 6662 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6663 ArgIterator(TL, TL.getNumArgs()), 6664 NewTemplateArgs)) 6665 return QualType(); 6666 6667 // FIXME: maybe don't rebuild if all the template arguments are the same. 6668 6669 QualType Result = 6670 getDerived().RebuildTemplateSpecializationType(Template, 6671 TL.getTemplateNameLoc(), 6672 NewTemplateArgs); 6673 6674 if (!Result.isNull()) { 6675 // Specializations of template template parameters are represented as 6676 // TemplateSpecializationTypes, and substitution of type alias templates 6677 // within a dependent context can transform them into 6678 // DependentTemplateSpecializationTypes. 6679 if (isa<DependentTemplateSpecializationType>(Result)) { 6680 DependentTemplateSpecializationTypeLoc NewTL 6681 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6682 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6683 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6684 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6685 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6686 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6687 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6688 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6689 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6690 return Result; 6691 } 6692 6693 TemplateSpecializationTypeLoc NewTL 6694 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6695 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6696 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6697 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6698 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6699 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6700 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6701 } 6702 6703 return Result; 6704 } 6705 6706 template <typename Derived> 6707 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6708 TypeLocBuilder &TLB, 6709 DependentTemplateSpecializationTypeLoc TL, 6710 TemplateName Template, 6711 CXXScopeSpec &SS) { 6712 TemplateArgumentListInfo NewTemplateArgs; 6713 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6714 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6715 typedef TemplateArgumentLocContainerIterator< 6716 DependentTemplateSpecializationTypeLoc> ArgIterator; 6717 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6718 ArgIterator(TL, TL.getNumArgs()), 6719 NewTemplateArgs)) 6720 return QualType(); 6721 6722 // FIXME: maybe don't rebuild if all the template arguments are the same. 6723 6724 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6725 QualType Result 6726 = getSema().Context.getDependentTemplateSpecializationType( 6727 TL.getTypePtr()->getKeyword(), 6728 DTN->getQualifier(), 6729 DTN->getIdentifier(), 6730 NewTemplateArgs); 6731 6732 DependentTemplateSpecializationTypeLoc NewTL 6733 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6734 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6735 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6736 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6737 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6738 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6739 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6740 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6741 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6742 return Result; 6743 } 6744 6745 QualType Result 6746 = getDerived().RebuildTemplateSpecializationType(Template, 6747 TL.getTemplateNameLoc(), 6748 NewTemplateArgs); 6749 6750 if (!Result.isNull()) { 6751 /// FIXME: Wrap this in an elaborated-type-specifier? 6752 TemplateSpecializationTypeLoc NewTL 6753 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6754 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6755 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6756 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6757 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6758 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6759 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6760 } 6761 6762 return Result; 6763 } 6764 6765 template<typename Derived> 6766 QualType 6767 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6768 ElaboratedTypeLoc TL) { 6769 const ElaboratedType *T = TL.getTypePtr(); 6770 6771 NestedNameSpecifierLoc QualifierLoc; 6772 // NOTE: the qualifier in an ElaboratedType is optional. 6773 if (TL.getQualifierLoc()) { 6774 QualifierLoc 6775 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6776 if (!QualifierLoc) 6777 return QualType(); 6778 } 6779 6780 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6781 if (NamedT.isNull()) 6782 return QualType(); 6783 6784 // C++0x [dcl.type.elab]p2: 6785 // If the identifier resolves to a typedef-name or the simple-template-id 6786 // resolves to an alias template specialization, the 6787 // elaborated-type-specifier is ill-formed. 6788 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6789 if (const TemplateSpecializationType *TST = 6790 NamedT->getAs<TemplateSpecializationType>()) { 6791 TemplateName Template = TST->getTemplateName(); 6792 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6793 Template.getAsTemplateDecl())) { 6794 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6795 diag::err_tag_reference_non_tag) 6796 << TAT << Sema::NTK_TypeAliasTemplate 6797 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6798 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6799 } 6800 } 6801 } 6802 6803 QualType Result = TL.getType(); 6804 if (getDerived().AlwaysRebuild() || 6805 QualifierLoc != TL.getQualifierLoc() || 6806 NamedT != T->getNamedType()) { 6807 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6808 T->getKeyword(), 6809 QualifierLoc, NamedT); 6810 if (Result.isNull()) 6811 return QualType(); 6812 } 6813 6814 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6815 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6816 NewTL.setQualifierLoc(QualifierLoc); 6817 return Result; 6818 } 6819 6820 template<typename Derived> 6821 QualType TreeTransform<Derived>::TransformAttributedType( 6822 TypeLocBuilder &TLB, 6823 AttributedTypeLoc TL) { 6824 const AttributedType *oldType = TL.getTypePtr(); 6825 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6826 if (modifiedType.isNull()) 6827 return QualType(); 6828 6829 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6830 const Attr *oldAttr = TL.getAttr(); 6831 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6832 if (oldAttr && !newAttr) 6833 return QualType(); 6834 6835 QualType result = TL.getType(); 6836 6837 // FIXME: dependent operand expressions? 6838 if (getDerived().AlwaysRebuild() || 6839 modifiedType != oldType->getModifiedType()) { 6840 // TODO: this is really lame; we should really be rebuilding the 6841 // equivalent type from first principles. 6842 QualType equivalentType 6843 = getDerived().TransformType(oldType->getEquivalentType()); 6844 if (equivalentType.isNull()) 6845 return QualType(); 6846 6847 // Check whether we can add nullability; it is only represented as 6848 // type sugar, and therefore cannot be diagnosed in any other way. 6849 if (auto nullability = oldType->getImmediateNullability()) { 6850 if (!modifiedType->canHaveNullability()) { 6851 SemaRef.Diag(TL.getAttr()->getLocation(), 6852 diag::err_nullability_nonpointer) 6853 << DiagNullabilityKind(*nullability, false) << modifiedType; 6854 return QualType(); 6855 } 6856 } 6857 6858 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6859 modifiedType, 6860 equivalentType); 6861 } 6862 6863 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6864 newTL.setAttr(newAttr); 6865 return result; 6866 } 6867 6868 template<typename Derived> 6869 QualType 6870 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6871 ParenTypeLoc TL) { 6872 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6873 if (Inner.isNull()) 6874 return QualType(); 6875 6876 QualType Result = TL.getType(); 6877 if (getDerived().AlwaysRebuild() || 6878 Inner != TL.getInnerLoc().getType()) { 6879 Result = getDerived().RebuildParenType(Inner); 6880 if (Result.isNull()) 6881 return QualType(); 6882 } 6883 6884 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6885 NewTL.setLParenLoc(TL.getLParenLoc()); 6886 NewTL.setRParenLoc(TL.getRParenLoc()); 6887 return Result; 6888 } 6889 6890 template <typename Derived> 6891 QualType 6892 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6893 MacroQualifiedTypeLoc TL) { 6894 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6895 if (Inner.isNull()) 6896 return QualType(); 6897 6898 QualType Result = TL.getType(); 6899 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6900 Result = 6901 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6902 if (Result.isNull()) 6903 return QualType(); 6904 } 6905 6906 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6907 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6908 return Result; 6909 } 6910 6911 template<typename Derived> 6912 QualType TreeTransform<Derived>::TransformDependentNameType( 6913 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6914 return TransformDependentNameType(TLB, TL, false); 6915 } 6916 6917 template<typename Derived> 6918 QualType TreeTransform<Derived>::TransformDependentNameType( 6919 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6920 const DependentNameType *T = TL.getTypePtr(); 6921 6922 NestedNameSpecifierLoc QualifierLoc 6923 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6924 if (!QualifierLoc) 6925 return QualType(); 6926 6927 QualType Result 6928 = getDerived().RebuildDependentNameType(T->getKeyword(), 6929 TL.getElaboratedKeywordLoc(), 6930 QualifierLoc, 6931 T->getIdentifier(), 6932 TL.getNameLoc(), 6933 DeducedTSTContext); 6934 if (Result.isNull()) 6935 return QualType(); 6936 6937 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6938 QualType NamedT = ElabT->getNamedType(); 6939 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6940 6941 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6942 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6943 NewTL.setQualifierLoc(QualifierLoc); 6944 } else { 6945 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6946 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6947 NewTL.setQualifierLoc(QualifierLoc); 6948 NewTL.setNameLoc(TL.getNameLoc()); 6949 } 6950 return Result; 6951 } 6952 6953 template<typename Derived> 6954 QualType TreeTransform<Derived>:: 6955 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6956 DependentTemplateSpecializationTypeLoc TL) { 6957 NestedNameSpecifierLoc QualifierLoc; 6958 if (TL.getQualifierLoc()) { 6959 QualifierLoc 6960 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6961 if (!QualifierLoc) 6962 return QualType(); 6963 } 6964 6965 return getDerived() 6966 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6967 } 6968 6969 template<typename Derived> 6970 QualType TreeTransform<Derived>:: 6971 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6972 DependentTemplateSpecializationTypeLoc TL, 6973 NestedNameSpecifierLoc QualifierLoc) { 6974 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6975 6976 TemplateArgumentListInfo NewTemplateArgs; 6977 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6978 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6979 6980 typedef TemplateArgumentLocContainerIterator< 6981 DependentTemplateSpecializationTypeLoc> ArgIterator; 6982 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6983 ArgIterator(TL, TL.getNumArgs()), 6984 NewTemplateArgs)) 6985 return QualType(); 6986 6987 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6988 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6989 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6990 /*AllowInjectedClassName*/ false); 6991 if (Result.isNull()) 6992 return QualType(); 6993 6994 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6995 QualType NamedT = ElabT->getNamedType(); 6996 6997 // Copy information relevant to the template specialization. 6998 TemplateSpecializationTypeLoc NamedTL 6999 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 7000 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7001 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7002 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 7003 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 7004 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7005 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7006 7007 // Copy information relevant to the elaborated type. 7008 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7009 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7010 NewTL.setQualifierLoc(QualifierLoc); 7011 } else if (isa<DependentTemplateSpecializationType>(Result)) { 7012 DependentTemplateSpecializationTypeLoc SpecTL 7013 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 7014 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7015 SpecTL.setQualifierLoc(QualifierLoc); 7016 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7017 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7018 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7019 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7020 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7021 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7022 } else { 7023 TemplateSpecializationTypeLoc SpecTL 7024 = TLB.push<TemplateSpecializationTypeLoc>(Result); 7025 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7026 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7027 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7028 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7029 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7030 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7031 } 7032 return Result; 7033 } 7034 7035 template<typename Derived> 7036 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 7037 PackExpansionTypeLoc TL) { 7038 QualType Pattern 7039 = getDerived().TransformType(TLB, TL.getPatternLoc()); 7040 if (Pattern.isNull()) 7041 return QualType(); 7042 7043 QualType Result = TL.getType(); 7044 if (getDerived().AlwaysRebuild() || 7045 Pattern != TL.getPatternLoc().getType()) { 7046 Result = getDerived().RebuildPackExpansionType(Pattern, 7047 TL.getPatternLoc().getSourceRange(), 7048 TL.getEllipsisLoc(), 7049 TL.getTypePtr()->getNumExpansions()); 7050 if (Result.isNull()) 7051 return QualType(); 7052 } 7053 7054 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7055 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7056 return Result; 7057 } 7058 7059 template<typename Derived> 7060 QualType 7061 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7062 ObjCInterfaceTypeLoc TL) { 7063 // ObjCInterfaceType is never dependent. 7064 TLB.pushFullCopy(TL); 7065 return TL.getType(); 7066 } 7067 7068 template<typename Derived> 7069 QualType 7070 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7071 ObjCTypeParamTypeLoc TL) { 7072 const ObjCTypeParamType *T = TL.getTypePtr(); 7073 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7074 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7075 if (!OTP) 7076 return QualType(); 7077 7078 QualType Result = TL.getType(); 7079 if (getDerived().AlwaysRebuild() || 7080 OTP != T->getDecl()) { 7081 Result = getDerived().RebuildObjCTypeParamType(OTP, 7082 TL.getProtocolLAngleLoc(), 7083 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 7084 TL.getNumProtocols()), 7085 TL.getProtocolLocs(), 7086 TL.getProtocolRAngleLoc()); 7087 if (Result.isNull()) 7088 return QualType(); 7089 } 7090 7091 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7092 if (TL.getNumProtocols()) { 7093 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7094 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7095 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7096 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7097 } 7098 return Result; 7099 } 7100 7101 template<typename Derived> 7102 QualType 7103 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7104 ObjCObjectTypeLoc TL) { 7105 // Transform base type. 7106 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7107 if (BaseType.isNull()) 7108 return QualType(); 7109 7110 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7111 7112 // Transform type arguments. 7113 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7114 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7115 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7116 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7117 QualType TypeArg = TypeArgInfo->getType(); 7118 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7119 AnyChanged = true; 7120 7121 // We have a pack expansion. Instantiate it. 7122 const auto *PackExpansion = PackExpansionLoc.getType() 7123 ->castAs<PackExpansionType>(); 7124 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7125 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7126 Unexpanded); 7127 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7128 7129 // Determine whether the set of unexpanded parameter packs can 7130 // and should be expanded. 7131 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7132 bool Expand = false; 7133 bool RetainExpansion = false; 7134 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7135 if (getDerived().TryExpandParameterPacks( 7136 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7137 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7138 return QualType(); 7139 7140 if (!Expand) { 7141 // We can't expand this pack expansion into separate arguments yet; 7142 // just substitute into the pattern and create a new pack expansion 7143 // type. 7144 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7145 7146 TypeLocBuilder TypeArgBuilder; 7147 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7148 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7149 PatternLoc); 7150 if (NewPatternType.isNull()) 7151 return QualType(); 7152 7153 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7154 NewPatternType, NumExpansions); 7155 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7156 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7157 NewTypeArgInfos.push_back( 7158 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7159 continue; 7160 } 7161 7162 // Substitute into the pack expansion pattern for each slice of the 7163 // pack. 7164 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7165 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7166 7167 TypeLocBuilder TypeArgBuilder; 7168 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7169 7170 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7171 PatternLoc); 7172 if (NewTypeArg.isNull()) 7173 return QualType(); 7174 7175 NewTypeArgInfos.push_back( 7176 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7177 } 7178 7179 continue; 7180 } 7181 7182 TypeLocBuilder TypeArgBuilder; 7183 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7184 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7185 if (NewTypeArg.isNull()) 7186 return QualType(); 7187 7188 // If nothing changed, just keep the old TypeSourceInfo. 7189 if (NewTypeArg == TypeArg) { 7190 NewTypeArgInfos.push_back(TypeArgInfo); 7191 continue; 7192 } 7193 7194 NewTypeArgInfos.push_back( 7195 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7196 AnyChanged = true; 7197 } 7198 7199 QualType Result = TL.getType(); 7200 if (getDerived().AlwaysRebuild() || AnyChanged) { 7201 // Rebuild the type. 7202 Result = getDerived().RebuildObjCObjectType( 7203 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7204 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7205 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7206 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7207 7208 if (Result.isNull()) 7209 return QualType(); 7210 } 7211 7212 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7213 NewT.setHasBaseTypeAsWritten(true); 7214 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7215 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7216 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7217 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7218 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7219 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7220 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7221 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7222 return Result; 7223 } 7224 7225 template<typename Derived> 7226 QualType 7227 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7228 ObjCObjectPointerTypeLoc TL) { 7229 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7230 if (PointeeType.isNull()) 7231 return QualType(); 7232 7233 QualType Result = TL.getType(); 7234 if (getDerived().AlwaysRebuild() || 7235 PointeeType != TL.getPointeeLoc().getType()) { 7236 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7237 TL.getStarLoc()); 7238 if (Result.isNull()) 7239 return QualType(); 7240 } 7241 7242 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7243 NewT.setStarLoc(TL.getStarLoc()); 7244 return Result; 7245 } 7246 7247 //===----------------------------------------------------------------------===// 7248 // Statement transformation 7249 //===----------------------------------------------------------------------===// 7250 template<typename Derived> 7251 StmtResult 7252 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7253 return S; 7254 } 7255 7256 template<typename Derived> 7257 StmtResult 7258 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7259 return getDerived().TransformCompoundStmt(S, false); 7260 } 7261 7262 template<typename Derived> 7263 StmtResult 7264 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7265 bool IsStmtExpr) { 7266 Sema::CompoundScopeRAII CompoundScope(getSema()); 7267 7268 const Stmt *ExprResult = S->getStmtExprResult(); 7269 bool SubStmtInvalid = false; 7270 bool SubStmtChanged = false; 7271 SmallVector<Stmt*, 8> Statements; 7272 for (auto *B : S->body()) { 7273 StmtResult Result = getDerived().TransformStmt( 7274 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7275 7276 if (Result.isInvalid()) { 7277 // Immediately fail if this was a DeclStmt, since it's very 7278 // likely that this will cause problems for future statements. 7279 if (isa<DeclStmt>(B)) 7280 return StmtError(); 7281 7282 // Otherwise, just keep processing substatements and fail later. 7283 SubStmtInvalid = true; 7284 continue; 7285 } 7286 7287 SubStmtChanged = SubStmtChanged || Result.get() != B; 7288 Statements.push_back(Result.getAs<Stmt>()); 7289 } 7290 7291 if (SubStmtInvalid) 7292 return StmtError(); 7293 7294 if (!getDerived().AlwaysRebuild() && 7295 !SubStmtChanged) 7296 return S; 7297 7298 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7299 Statements, 7300 S->getRBracLoc(), 7301 IsStmtExpr); 7302 } 7303 7304 template<typename Derived> 7305 StmtResult 7306 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7307 ExprResult LHS, RHS; 7308 { 7309 EnterExpressionEvaluationContext Unevaluated( 7310 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7311 7312 // Transform the left-hand case value. 7313 LHS = getDerived().TransformExpr(S->getLHS()); 7314 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7315 if (LHS.isInvalid()) 7316 return StmtError(); 7317 7318 // Transform the right-hand case value (for the GNU case-range extension). 7319 RHS = getDerived().TransformExpr(S->getRHS()); 7320 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7321 if (RHS.isInvalid()) 7322 return StmtError(); 7323 } 7324 7325 // Build the case statement. 7326 // Case statements are always rebuilt so that they will attached to their 7327 // transformed switch statement. 7328 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7329 LHS.get(), 7330 S->getEllipsisLoc(), 7331 RHS.get(), 7332 S->getColonLoc()); 7333 if (Case.isInvalid()) 7334 return StmtError(); 7335 7336 // Transform the statement following the case 7337 StmtResult SubStmt = 7338 getDerived().TransformStmt(S->getSubStmt()); 7339 if (SubStmt.isInvalid()) 7340 return StmtError(); 7341 7342 // Attach the body to the case statement 7343 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7344 } 7345 7346 template <typename Derived> 7347 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7348 // Transform the statement following the default case 7349 StmtResult SubStmt = 7350 getDerived().TransformStmt(S->getSubStmt()); 7351 if (SubStmt.isInvalid()) 7352 return StmtError(); 7353 7354 // Default statements are always rebuilt 7355 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7356 SubStmt.get()); 7357 } 7358 7359 template<typename Derived> 7360 StmtResult 7361 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7362 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7363 if (SubStmt.isInvalid()) 7364 return StmtError(); 7365 7366 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7367 S->getDecl()); 7368 if (!LD) 7369 return StmtError(); 7370 7371 // If we're transforming "in-place" (we're not creating new local 7372 // declarations), assume we're replacing the old label statement 7373 // and clear out the reference to it. 7374 if (LD == S->getDecl()) 7375 S->getDecl()->setStmt(nullptr); 7376 7377 // FIXME: Pass the real colon location in. 7378 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7379 cast<LabelDecl>(LD), SourceLocation(), 7380 SubStmt.get()); 7381 } 7382 7383 template <typename Derived> 7384 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7385 if (!R) 7386 return R; 7387 7388 switch (R->getKind()) { 7389 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7390 #define ATTR(X) 7391 #define PRAGMA_SPELLING_ATTR(X) \ 7392 case attr::X: \ 7393 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7394 #include "clang/Basic/AttrList.inc" 7395 default: 7396 return R; 7397 } 7398 } 7399 7400 template <typename Derived> 7401 StmtResult 7402 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7403 StmtDiscardKind SDK) { 7404 bool AttrsChanged = false; 7405 SmallVector<const Attr *, 1> Attrs; 7406 7407 // Visit attributes and keep track if any are transformed. 7408 for (const auto *I : S->getAttrs()) { 7409 const Attr *R = getDerived().TransformAttr(I); 7410 AttrsChanged |= (I != R); 7411 if (R) 7412 Attrs.push_back(R); 7413 } 7414 7415 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7416 if (SubStmt.isInvalid()) 7417 return StmtError(); 7418 7419 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7420 return S; 7421 7422 // If transforming the attributes failed for all of the attributes in the 7423 // statement, don't make an AttributedStmt without attributes. 7424 if (Attrs.empty()) 7425 return SubStmt; 7426 7427 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7428 SubStmt.get()); 7429 } 7430 7431 template<typename Derived> 7432 StmtResult 7433 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7434 // Transform the initialization statement 7435 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7436 if (Init.isInvalid()) 7437 return StmtError(); 7438 7439 Sema::ConditionResult Cond; 7440 if (!S->isConsteval()) { 7441 // Transform the condition 7442 Cond = getDerived().TransformCondition( 7443 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7444 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7445 : Sema::ConditionKind::Boolean); 7446 if (Cond.isInvalid()) 7447 return StmtError(); 7448 } 7449 7450 // If this is a constexpr if, determine which arm we should instantiate. 7451 llvm::Optional<bool> ConstexprConditionValue; 7452 if (S->isConstexpr()) 7453 ConstexprConditionValue = Cond.getKnownValue(); 7454 7455 // Transform the "then" branch. 7456 StmtResult Then; 7457 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7458 Then = getDerived().TransformStmt(S->getThen()); 7459 if (Then.isInvalid()) 7460 return StmtError(); 7461 } else { 7462 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7463 } 7464 7465 // Transform the "else" branch. 7466 StmtResult Else; 7467 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7468 Else = getDerived().TransformStmt(S->getElse()); 7469 if (Else.isInvalid()) 7470 return StmtError(); 7471 } 7472 7473 if (!getDerived().AlwaysRebuild() && 7474 Init.get() == S->getInit() && 7475 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7476 Then.get() == S->getThen() && 7477 Else.get() == S->getElse()) 7478 return S; 7479 7480 return getDerived().RebuildIfStmt( 7481 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7482 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7483 } 7484 7485 template<typename Derived> 7486 StmtResult 7487 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7488 // Transform the initialization statement 7489 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7490 if (Init.isInvalid()) 7491 return StmtError(); 7492 7493 // Transform the condition. 7494 Sema::ConditionResult Cond = getDerived().TransformCondition( 7495 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7496 Sema::ConditionKind::Switch); 7497 if (Cond.isInvalid()) 7498 return StmtError(); 7499 7500 // Rebuild the switch statement. 7501 StmtResult Switch = 7502 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7503 Init.get(), Cond, S->getRParenLoc()); 7504 if (Switch.isInvalid()) 7505 return StmtError(); 7506 7507 // Transform the body of the switch statement. 7508 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7509 if (Body.isInvalid()) 7510 return StmtError(); 7511 7512 // Complete the switch statement. 7513 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7514 Body.get()); 7515 } 7516 7517 template<typename Derived> 7518 StmtResult 7519 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7520 // Transform the condition 7521 Sema::ConditionResult Cond = getDerived().TransformCondition( 7522 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7523 Sema::ConditionKind::Boolean); 7524 if (Cond.isInvalid()) 7525 return StmtError(); 7526 7527 // Transform the body 7528 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7529 if (Body.isInvalid()) 7530 return StmtError(); 7531 7532 if (!getDerived().AlwaysRebuild() && 7533 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7534 Body.get() == S->getBody()) 7535 return Owned(S); 7536 7537 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7538 Cond, S->getRParenLoc(), Body.get()); 7539 } 7540 7541 template<typename Derived> 7542 StmtResult 7543 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7544 // Transform the body 7545 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7546 if (Body.isInvalid()) 7547 return StmtError(); 7548 7549 // Transform the condition 7550 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7551 if (Cond.isInvalid()) 7552 return StmtError(); 7553 7554 if (!getDerived().AlwaysRebuild() && 7555 Cond.get() == S->getCond() && 7556 Body.get() == S->getBody()) 7557 return S; 7558 7559 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7560 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7561 S->getRParenLoc()); 7562 } 7563 7564 template<typename Derived> 7565 StmtResult 7566 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7567 if (getSema().getLangOpts().OpenMP) 7568 getSema().startOpenMPLoop(); 7569 7570 // Transform the initialization statement 7571 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7572 if (Init.isInvalid()) 7573 return StmtError(); 7574 7575 // In OpenMP loop region loop control variable must be captured and be 7576 // private. Perform analysis of first part (if any). 7577 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7578 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7579 7580 // Transform the condition 7581 Sema::ConditionResult Cond = getDerived().TransformCondition( 7582 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7583 Sema::ConditionKind::Boolean); 7584 if (Cond.isInvalid()) 7585 return StmtError(); 7586 7587 // Transform the increment 7588 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7589 if (Inc.isInvalid()) 7590 return StmtError(); 7591 7592 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7593 if (S->getInc() && !FullInc.get()) 7594 return StmtError(); 7595 7596 // Transform the body 7597 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7598 if (Body.isInvalid()) 7599 return StmtError(); 7600 7601 if (!getDerived().AlwaysRebuild() && 7602 Init.get() == S->getInit() && 7603 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7604 Inc.get() == S->getInc() && 7605 Body.get() == S->getBody()) 7606 return S; 7607 7608 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7609 Init.get(), Cond, FullInc, 7610 S->getRParenLoc(), Body.get()); 7611 } 7612 7613 template<typename Derived> 7614 StmtResult 7615 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7616 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7617 S->getLabel()); 7618 if (!LD) 7619 return StmtError(); 7620 7621 // Goto statements must always be rebuilt, to resolve the label. 7622 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7623 cast<LabelDecl>(LD)); 7624 } 7625 7626 template<typename Derived> 7627 StmtResult 7628 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7629 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7630 if (Target.isInvalid()) 7631 return StmtError(); 7632 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7633 7634 if (!getDerived().AlwaysRebuild() && 7635 Target.get() == S->getTarget()) 7636 return S; 7637 7638 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7639 Target.get()); 7640 } 7641 7642 template<typename Derived> 7643 StmtResult 7644 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7645 return S; 7646 } 7647 7648 template<typename Derived> 7649 StmtResult 7650 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7651 return S; 7652 } 7653 7654 template<typename Derived> 7655 StmtResult 7656 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7657 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7658 /*NotCopyInit*/false); 7659 if (Result.isInvalid()) 7660 return StmtError(); 7661 7662 // FIXME: We always rebuild the return statement because there is no way 7663 // to tell whether the return type of the function has changed. 7664 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7665 } 7666 7667 template<typename Derived> 7668 StmtResult 7669 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7670 bool DeclChanged = false; 7671 SmallVector<Decl *, 4> Decls; 7672 for (auto *D : S->decls()) { 7673 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7674 if (!Transformed) 7675 return StmtError(); 7676 7677 if (Transformed != D) 7678 DeclChanged = true; 7679 7680 Decls.push_back(Transformed); 7681 } 7682 7683 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7684 return S; 7685 7686 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7687 } 7688 7689 template<typename Derived> 7690 StmtResult 7691 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7692 7693 SmallVector<Expr*, 8> Constraints; 7694 SmallVector<Expr*, 8> Exprs; 7695 SmallVector<IdentifierInfo *, 4> Names; 7696 7697 ExprResult AsmString; 7698 SmallVector<Expr*, 8> Clobbers; 7699 7700 bool ExprsChanged = false; 7701 7702 // Go through the outputs. 7703 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7704 Names.push_back(S->getOutputIdentifier(I)); 7705 7706 // No need to transform the constraint literal. 7707 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7708 7709 // Transform the output expr. 7710 Expr *OutputExpr = S->getOutputExpr(I); 7711 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7712 if (Result.isInvalid()) 7713 return StmtError(); 7714 7715 ExprsChanged |= Result.get() != OutputExpr; 7716 7717 Exprs.push_back(Result.get()); 7718 } 7719 7720 // Go through the inputs. 7721 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7722 Names.push_back(S->getInputIdentifier(I)); 7723 7724 // No need to transform the constraint literal. 7725 Constraints.push_back(S->getInputConstraintLiteral(I)); 7726 7727 // Transform the input expr. 7728 Expr *InputExpr = S->getInputExpr(I); 7729 ExprResult Result = getDerived().TransformExpr(InputExpr); 7730 if (Result.isInvalid()) 7731 return StmtError(); 7732 7733 ExprsChanged |= Result.get() != InputExpr; 7734 7735 Exprs.push_back(Result.get()); 7736 } 7737 7738 // Go through the Labels. 7739 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7740 Names.push_back(S->getLabelIdentifier(I)); 7741 7742 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7743 if (Result.isInvalid()) 7744 return StmtError(); 7745 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7746 Exprs.push_back(Result.get()); 7747 } 7748 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7749 return S; 7750 7751 // Go through the clobbers. 7752 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7753 Clobbers.push_back(S->getClobberStringLiteral(I)); 7754 7755 // No need to transform the asm string literal. 7756 AsmString = S->getAsmString(); 7757 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7758 S->isVolatile(), S->getNumOutputs(), 7759 S->getNumInputs(), Names.data(), 7760 Constraints, Exprs, AsmString.get(), 7761 Clobbers, S->getNumLabels(), 7762 S->getRParenLoc()); 7763 } 7764 7765 template<typename Derived> 7766 StmtResult 7767 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7768 ArrayRef<Token> AsmToks = 7769 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7770 7771 bool HadError = false, HadChange = false; 7772 7773 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7774 SmallVector<Expr*, 8> TransformedExprs; 7775 TransformedExprs.reserve(SrcExprs.size()); 7776 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7777 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7778 if (!Result.isUsable()) { 7779 HadError = true; 7780 } else { 7781 HadChange |= (Result.get() != SrcExprs[i]); 7782 TransformedExprs.push_back(Result.get()); 7783 } 7784 } 7785 7786 if (HadError) return StmtError(); 7787 if (!HadChange && !getDerived().AlwaysRebuild()) 7788 return Owned(S); 7789 7790 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7791 AsmToks, S->getAsmString(), 7792 S->getNumOutputs(), S->getNumInputs(), 7793 S->getAllConstraints(), S->getClobbers(), 7794 TransformedExprs, S->getEndLoc()); 7795 } 7796 7797 // C++ Coroutines TS 7798 7799 template<typename Derived> 7800 StmtResult 7801 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7802 auto *ScopeInfo = SemaRef.getCurFunction(); 7803 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7804 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7805 ScopeInfo->NeedsCoroutineSuspends && 7806 ScopeInfo->CoroutineSuspends.first == nullptr && 7807 ScopeInfo->CoroutineSuspends.second == nullptr && 7808 "expected clean scope info"); 7809 7810 // Set that we have (possibly-invalid) suspend points before we do anything 7811 // that may fail. 7812 ScopeInfo->setNeedsCoroutineSuspends(false); 7813 7814 // We re-build the coroutine promise object (and the coroutine parameters its 7815 // type and constructor depend on) based on the types used in our current 7816 // function. We must do so, and set it on the current FunctionScopeInfo, 7817 // before attempting to transform the other parts of the coroutine body 7818 // statement, such as the implicit suspend statements (because those 7819 // statements reference the FunctionScopeInfo::CoroutinePromise). 7820 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7821 return StmtError(); 7822 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7823 if (!Promise) 7824 return StmtError(); 7825 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7826 ScopeInfo->CoroutinePromise = Promise; 7827 7828 // Transform the implicit coroutine statements constructed using dependent 7829 // types during the previous parse: initial and final suspensions, the return 7830 // object, and others. We also transform the coroutine function's body. 7831 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7832 if (InitSuspend.isInvalid()) 7833 return StmtError(); 7834 StmtResult FinalSuspend = 7835 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7836 if (FinalSuspend.isInvalid() || 7837 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7838 return StmtError(); 7839 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7840 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7841 7842 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7843 if (BodyRes.isInvalid()) 7844 return StmtError(); 7845 7846 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7847 if (Builder.isInvalid()) 7848 return StmtError(); 7849 7850 Expr *ReturnObject = S->getReturnValueInit(); 7851 assert(ReturnObject && "the return object is expected to be valid"); 7852 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7853 /*NoCopyInit*/ false); 7854 if (Res.isInvalid()) 7855 return StmtError(); 7856 Builder.ReturnValue = Res.get(); 7857 7858 // If during the previous parse the coroutine still had a dependent promise 7859 // statement, we may need to build some implicit coroutine statements 7860 // (such as exception and fallthrough handlers) for the first time. 7861 if (S->hasDependentPromiseType()) { 7862 // We can only build these statements, however, if the current promise type 7863 // is not dependent. 7864 if (!Promise->getType()->isDependentType()) { 7865 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7866 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7867 "these nodes should not have been built yet"); 7868 if (!Builder.buildDependentStatements()) 7869 return StmtError(); 7870 } 7871 } else { 7872 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7873 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7874 if (Res.isInvalid()) 7875 return StmtError(); 7876 Builder.OnFallthrough = Res.get(); 7877 } 7878 7879 if (auto *OnException = S->getExceptionHandler()) { 7880 StmtResult Res = getDerived().TransformStmt(OnException); 7881 if (Res.isInvalid()) 7882 return StmtError(); 7883 Builder.OnException = Res.get(); 7884 } 7885 7886 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7887 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7888 if (Res.isInvalid()) 7889 return StmtError(); 7890 Builder.ReturnStmtOnAllocFailure = Res.get(); 7891 } 7892 7893 // Transform any additional statements we may have already built 7894 assert(S->getAllocate() && S->getDeallocate() && 7895 "allocation and deallocation calls must already be built"); 7896 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7897 if (AllocRes.isInvalid()) 7898 return StmtError(); 7899 Builder.Allocate = AllocRes.get(); 7900 7901 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7902 if (DeallocRes.isInvalid()) 7903 return StmtError(); 7904 Builder.Deallocate = DeallocRes.get(); 7905 7906 if (auto *ReturnStmt = S->getReturnStmt()) { 7907 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7908 if (Res.isInvalid()) 7909 return StmtError(); 7910 Builder.ReturnStmt = Res.get(); 7911 } 7912 } 7913 7914 return getDerived().RebuildCoroutineBodyStmt(Builder); 7915 } 7916 7917 template<typename Derived> 7918 StmtResult 7919 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7920 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7921 /*NotCopyInit*/false); 7922 if (Result.isInvalid()) 7923 return StmtError(); 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().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7928 S->isImplicit()); 7929 } 7930 7931 template<typename Derived> 7932 ExprResult 7933 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7934 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7935 /*NotCopyInit*/false); 7936 if (Result.isInvalid()) 7937 return ExprError(); 7938 7939 // Always rebuild; we don't know if this needs to be injected into a new 7940 // context or if the promise type has changed. 7941 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7942 E->isImplicit()); 7943 } 7944 7945 template <typename Derived> 7946 ExprResult 7947 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7948 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7949 /*NotCopyInit*/ false); 7950 if (OperandResult.isInvalid()) 7951 return ExprError(); 7952 7953 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7954 E->getOperatorCoawaitLookup()); 7955 7956 if (LookupResult.isInvalid()) 7957 return ExprError(); 7958 7959 // Always rebuild; we don't know if this needs to be injected into a new 7960 // context or if the promise type has changed. 7961 return getDerived().RebuildDependentCoawaitExpr( 7962 E->getKeywordLoc(), OperandResult.get(), 7963 cast<UnresolvedLookupExpr>(LookupResult.get())); 7964 } 7965 7966 template<typename Derived> 7967 ExprResult 7968 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7969 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7970 /*NotCopyInit*/false); 7971 if (Result.isInvalid()) 7972 return ExprError(); 7973 7974 // Always rebuild; we don't know if this needs to be injected into a new 7975 // context or if the promise type has changed. 7976 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7977 } 7978 7979 // Objective-C Statements. 7980 7981 template<typename Derived> 7982 StmtResult 7983 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7984 // Transform the body of the @try. 7985 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7986 if (TryBody.isInvalid()) 7987 return StmtError(); 7988 7989 // Transform the @catch statements (if present). 7990 bool AnyCatchChanged = false; 7991 SmallVector<Stmt*, 8> CatchStmts; 7992 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7993 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7994 if (Catch.isInvalid()) 7995 return StmtError(); 7996 if (Catch.get() != S->getCatchStmt(I)) 7997 AnyCatchChanged = true; 7998 CatchStmts.push_back(Catch.get()); 7999 } 8000 8001 // Transform the @finally statement (if present). 8002 StmtResult Finally; 8003 if (S->getFinallyStmt()) { 8004 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 8005 if (Finally.isInvalid()) 8006 return StmtError(); 8007 } 8008 8009 // If nothing changed, just retain this statement. 8010 if (!getDerived().AlwaysRebuild() && 8011 TryBody.get() == S->getTryBody() && 8012 !AnyCatchChanged && 8013 Finally.get() == S->getFinallyStmt()) 8014 return S; 8015 8016 // Build a new statement. 8017 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 8018 CatchStmts, Finally.get()); 8019 } 8020 8021 template<typename Derived> 8022 StmtResult 8023 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 8024 // Transform the @catch parameter, if there is one. 8025 VarDecl *Var = nullptr; 8026 if (VarDecl *FromVar = S->getCatchParamDecl()) { 8027 TypeSourceInfo *TSInfo = nullptr; 8028 if (FromVar->getTypeSourceInfo()) { 8029 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 8030 if (!TSInfo) 8031 return StmtError(); 8032 } 8033 8034 QualType T; 8035 if (TSInfo) 8036 T = TSInfo->getType(); 8037 else { 8038 T = getDerived().TransformType(FromVar->getType()); 8039 if (T.isNull()) 8040 return StmtError(); 8041 } 8042 8043 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 8044 if (!Var) 8045 return StmtError(); 8046 } 8047 8048 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8049 if (Body.isInvalid()) 8050 return StmtError(); 8051 8052 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8053 S->getRParenLoc(), 8054 Var, Body.get()); 8055 } 8056 8057 template<typename Derived> 8058 StmtResult 8059 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8060 // Transform the body. 8061 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8062 if (Body.isInvalid()) 8063 return StmtError(); 8064 8065 // If nothing changed, just retain this statement. 8066 if (!getDerived().AlwaysRebuild() && 8067 Body.get() == S->getFinallyBody()) 8068 return S; 8069 8070 // Build a new statement. 8071 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8072 Body.get()); 8073 } 8074 8075 template<typename Derived> 8076 StmtResult 8077 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8078 ExprResult Operand; 8079 if (S->getThrowExpr()) { 8080 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8081 if (Operand.isInvalid()) 8082 return StmtError(); 8083 } 8084 8085 if (!getDerived().AlwaysRebuild() && 8086 Operand.get() == S->getThrowExpr()) 8087 return S; 8088 8089 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8090 } 8091 8092 template<typename Derived> 8093 StmtResult 8094 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8095 ObjCAtSynchronizedStmt *S) { 8096 // Transform the object we are locking. 8097 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8098 if (Object.isInvalid()) 8099 return StmtError(); 8100 Object = 8101 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8102 Object.get()); 8103 if (Object.isInvalid()) 8104 return StmtError(); 8105 8106 // Transform the body. 8107 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8108 if (Body.isInvalid()) 8109 return StmtError(); 8110 8111 // If nothing change, just retain the current statement. 8112 if (!getDerived().AlwaysRebuild() && 8113 Object.get() == S->getSynchExpr() && 8114 Body.get() == S->getSynchBody()) 8115 return S; 8116 8117 // Build a new statement. 8118 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8119 Object.get(), Body.get()); 8120 } 8121 8122 template<typename Derived> 8123 StmtResult 8124 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8125 ObjCAutoreleasePoolStmt *S) { 8126 // Transform the body. 8127 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8128 if (Body.isInvalid()) 8129 return StmtError(); 8130 8131 // If nothing changed, just retain this statement. 8132 if (!getDerived().AlwaysRebuild() && 8133 Body.get() == S->getSubStmt()) 8134 return S; 8135 8136 // Build a new statement. 8137 return getDerived().RebuildObjCAutoreleasePoolStmt( 8138 S->getAtLoc(), Body.get()); 8139 } 8140 8141 template<typename Derived> 8142 StmtResult 8143 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8144 ObjCForCollectionStmt *S) { 8145 // Transform the element statement. 8146 StmtResult Element = 8147 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8148 if (Element.isInvalid()) 8149 return StmtError(); 8150 8151 // Transform the collection expression. 8152 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8153 if (Collection.isInvalid()) 8154 return StmtError(); 8155 8156 // Transform the body. 8157 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8158 if (Body.isInvalid()) 8159 return StmtError(); 8160 8161 // If nothing changed, just retain this statement. 8162 if (!getDerived().AlwaysRebuild() && 8163 Element.get() == S->getElement() && 8164 Collection.get() == S->getCollection() && 8165 Body.get() == S->getBody()) 8166 return S; 8167 8168 // Build a new statement. 8169 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8170 Element.get(), 8171 Collection.get(), 8172 S->getRParenLoc(), 8173 Body.get()); 8174 } 8175 8176 template <typename Derived> 8177 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8178 // Transform the exception declaration, if any. 8179 VarDecl *Var = nullptr; 8180 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8181 TypeSourceInfo *T = 8182 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8183 if (!T) 8184 return StmtError(); 8185 8186 Var = getDerived().RebuildExceptionDecl( 8187 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8188 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8189 if (!Var || Var->isInvalidDecl()) 8190 return StmtError(); 8191 } 8192 8193 // Transform the actual exception handler. 8194 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8195 if (Handler.isInvalid()) 8196 return StmtError(); 8197 8198 if (!getDerived().AlwaysRebuild() && !Var && 8199 Handler.get() == S->getHandlerBlock()) 8200 return S; 8201 8202 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8203 } 8204 8205 template <typename Derived> 8206 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8207 // Transform the try block itself. 8208 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8209 if (TryBlock.isInvalid()) 8210 return StmtError(); 8211 8212 // Transform the handlers. 8213 bool HandlerChanged = false; 8214 SmallVector<Stmt *, 8> Handlers; 8215 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8216 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8217 if (Handler.isInvalid()) 8218 return StmtError(); 8219 8220 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8221 Handlers.push_back(Handler.getAs<Stmt>()); 8222 } 8223 8224 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8225 !HandlerChanged) 8226 return S; 8227 8228 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8229 Handlers); 8230 } 8231 8232 template<typename Derived> 8233 StmtResult 8234 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8235 StmtResult Init = 8236 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8237 if (Init.isInvalid()) 8238 return StmtError(); 8239 8240 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8241 if (Range.isInvalid()) 8242 return StmtError(); 8243 8244 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8245 if (Begin.isInvalid()) 8246 return StmtError(); 8247 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8248 if (End.isInvalid()) 8249 return StmtError(); 8250 8251 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8252 if (Cond.isInvalid()) 8253 return StmtError(); 8254 if (Cond.get()) 8255 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8256 if (Cond.isInvalid()) 8257 return StmtError(); 8258 if (Cond.get()) 8259 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8260 8261 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8262 if (Inc.isInvalid()) 8263 return StmtError(); 8264 if (Inc.get()) 8265 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8266 8267 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8268 if (LoopVar.isInvalid()) 8269 return StmtError(); 8270 8271 StmtResult NewStmt = S; 8272 if (getDerived().AlwaysRebuild() || 8273 Init.get() != S->getInit() || 8274 Range.get() != S->getRangeStmt() || 8275 Begin.get() != S->getBeginStmt() || 8276 End.get() != S->getEndStmt() || 8277 Cond.get() != S->getCond() || 8278 Inc.get() != S->getInc() || 8279 LoopVar.get() != S->getLoopVarStmt()) { 8280 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8281 S->getCoawaitLoc(), Init.get(), 8282 S->getColonLoc(), Range.get(), 8283 Begin.get(), End.get(), 8284 Cond.get(), 8285 Inc.get(), LoopVar.get(), 8286 S->getRParenLoc()); 8287 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8288 // Might not have attached any initializer to the loop variable. 8289 getSema().ActOnInitializerError( 8290 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8291 return StmtError(); 8292 } 8293 } 8294 8295 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8296 if (Body.isInvalid()) 8297 return StmtError(); 8298 8299 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8300 // it now so we have a new statement to attach the body to. 8301 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8302 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8303 S->getCoawaitLoc(), Init.get(), 8304 S->getColonLoc(), Range.get(), 8305 Begin.get(), End.get(), 8306 Cond.get(), 8307 Inc.get(), LoopVar.get(), 8308 S->getRParenLoc()); 8309 if (NewStmt.isInvalid()) 8310 return StmtError(); 8311 } 8312 8313 if (NewStmt.get() == S) 8314 return S; 8315 8316 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8317 } 8318 8319 template<typename Derived> 8320 StmtResult 8321 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8322 MSDependentExistsStmt *S) { 8323 // Transform the nested-name-specifier, if any. 8324 NestedNameSpecifierLoc QualifierLoc; 8325 if (S->getQualifierLoc()) { 8326 QualifierLoc 8327 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8328 if (!QualifierLoc) 8329 return StmtError(); 8330 } 8331 8332 // Transform the declaration name. 8333 DeclarationNameInfo NameInfo = S->getNameInfo(); 8334 if (NameInfo.getName()) { 8335 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8336 if (!NameInfo.getName()) 8337 return StmtError(); 8338 } 8339 8340 // Check whether anything changed. 8341 if (!getDerived().AlwaysRebuild() && 8342 QualifierLoc == S->getQualifierLoc() && 8343 NameInfo.getName() == S->getNameInfo().getName()) 8344 return S; 8345 8346 // Determine whether this name exists, if we can. 8347 CXXScopeSpec SS; 8348 SS.Adopt(QualifierLoc); 8349 bool Dependent = false; 8350 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8351 case Sema::IER_Exists: 8352 if (S->isIfExists()) 8353 break; 8354 8355 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8356 8357 case Sema::IER_DoesNotExist: 8358 if (S->isIfNotExists()) 8359 break; 8360 8361 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8362 8363 case Sema::IER_Dependent: 8364 Dependent = true; 8365 break; 8366 8367 case Sema::IER_Error: 8368 return StmtError(); 8369 } 8370 8371 // We need to continue with the instantiation, so do so now. 8372 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8373 if (SubStmt.isInvalid()) 8374 return StmtError(); 8375 8376 // If we have resolved the name, just transform to the substatement. 8377 if (!Dependent) 8378 return SubStmt; 8379 8380 // The name is still dependent, so build a dependent expression again. 8381 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8382 S->isIfExists(), 8383 QualifierLoc, 8384 NameInfo, 8385 SubStmt.get()); 8386 } 8387 8388 template<typename Derived> 8389 ExprResult 8390 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8391 NestedNameSpecifierLoc QualifierLoc; 8392 if (E->getQualifierLoc()) { 8393 QualifierLoc 8394 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8395 if (!QualifierLoc) 8396 return ExprError(); 8397 } 8398 8399 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8400 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8401 if (!PD) 8402 return ExprError(); 8403 8404 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8405 if (Base.isInvalid()) 8406 return ExprError(); 8407 8408 return new (SemaRef.getASTContext()) 8409 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8410 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8411 QualifierLoc, E->getMemberLoc()); 8412 } 8413 8414 template <typename Derived> 8415 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8416 MSPropertySubscriptExpr *E) { 8417 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8418 if (BaseRes.isInvalid()) 8419 return ExprError(); 8420 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8421 if (IdxRes.isInvalid()) 8422 return ExprError(); 8423 8424 if (!getDerived().AlwaysRebuild() && 8425 BaseRes.get() == E->getBase() && 8426 IdxRes.get() == E->getIdx()) 8427 return E; 8428 8429 return getDerived().RebuildArraySubscriptExpr( 8430 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8431 } 8432 8433 template <typename Derived> 8434 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8435 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8436 if (TryBlock.isInvalid()) 8437 return StmtError(); 8438 8439 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8440 if (Handler.isInvalid()) 8441 return StmtError(); 8442 8443 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8444 Handler.get() == S->getHandler()) 8445 return S; 8446 8447 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8448 TryBlock.get(), Handler.get()); 8449 } 8450 8451 template <typename Derived> 8452 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8453 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8454 if (Block.isInvalid()) 8455 return StmtError(); 8456 8457 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8458 } 8459 8460 template <typename Derived> 8461 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8462 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8463 if (FilterExpr.isInvalid()) 8464 return StmtError(); 8465 8466 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8467 if (Block.isInvalid()) 8468 return StmtError(); 8469 8470 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8471 Block.get()); 8472 } 8473 8474 template <typename Derived> 8475 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8476 if (isa<SEHFinallyStmt>(Handler)) 8477 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8478 else 8479 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8480 } 8481 8482 template<typename Derived> 8483 StmtResult 8484 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8485 return S; 8486 } 8487 8488 //===----------------------------------------------------------------------===// 8489 // OpenMP directive transformation 8490 //===----------------------------------------------------------------------===// 8491 8492 template <typename Derived> 8493 StmtResult 8494 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8495 // OMPCanonicalLoops are eliminated during transformation, since they will be 8496 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8497 // after transformation. 8498 return getDerived().TransformStmt(L->getLoopStmt()); 8499 } 8500 8501 template <typename Derived> 8502 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8503 OMPExecutableDirective *D) { 8504 8505 // Transform the clauses 8506 llvm::SmallVector<OMPClause *, 16> TClauses; 8507 ArrayRef<OMPClause *> Clauses = D->clauses(); 8508 TClauses.reserve(Clauses.size()); 8509 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8510 I != E; ++I) { 8511 if (*I) { 8512 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8513 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8514 getDerived().getSema().EndOpenMPClause(); 8515 if (Clause) 8516 TClauses.push_back(Clause); 8517 } else { 8518 TClauses.push_back(nullptr); 8519 } 8520 } 8521 StmtResult AssociatedStmt; 8522 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8523 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8524 /*CurScope=*/nullptr); 8525 StmtResult Body; 8526 { 8527 Sema::CompoundScopeRAII CompoundScope(getSema()); 8528 Stmt *CS; 8529 if (D->getDirectiveKind() == OMPD_atomic || 8530 D->getDirectiveKind() == OMPD_critical || 8531 D->getDirectiveKind() == OMPD_section || 8532 D->getDirectiveKind() == OMPD_master) 8533 CS = D->getAssociatedStmt(); 8534 else 8535 CS = D->getRawStmt(); 8536 Body = getDerived().TransformStmt(CS); 8537 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8538 getSema().getLangOpts().OpenMPIRBuilder) 8539 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8540 } 8541 AssociatedStmt = 8542 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8543 if (AssociatedStmt.isInvalid()) { 8544 return StmtError(); 8545 } 8546 } 8547 if (TClauses.size() != Clauses.size()) { 8548 return StmtError(); 8549 } 8550 8551 // Transform directive name for 'omp critical' directive. 8552 DeclarationNameInfo DirName; 8553 if (D->getDirectiveKind() == OMPD_critical) { 8554 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8555 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8556 } 8557 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8558 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8559 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8560 } else if (D->getDirectiveKind() == OMPD_cancel) { 8561 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8562 } 8563 8564 return getDerived().RebuildOMPExecutableDirective( 8565 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8566 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8567 } 8568 8569 template <typename Derived> 8570 StmtResult 8571 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8572 // TODO: Fix This 8573 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8574 << getOpenMPDirectiveName(D->getDirectiveKind()); 8575 return StmtError(); 8576 } 8577 8578 template <typename Derived> 8579 StmtResult 8580 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8581 DeclarationNameInfo DirName; 8582 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8583 D->getBeginLoc()); 8584 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8585 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8586 return Res; 8587 } 8588 8589 template <typename Derived> 8590 StmtResult 8591 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8592 DeclarationNameInfo DirName; 8593 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8594 D->getBeginLoc()); 8595 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8596 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8597 return Res; 8598 } 8599 8600 template <typename Derived> 8601 StmtResult 8602 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8603 DeclarationNameInfo DirName; 8604 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8605 nullptr, D->getBeginLoc()); 8606 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8607 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8608 return Res; 8609 } 8610 8611 template <typename Derived> 8612 StmtResult 8613 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8614 DeclarationNameInfo DirName; 8615 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8616 nullptr, D->getBeginLoc()); 8617 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8618 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8619 return Res; 8620 } 8621 8622 template <typename Derived> 8623 StmtResult 8624 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8625 DeclarationNameInfo DirName; 8626 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8627 D->getBeginLoc()); 8628 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8629 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8630 return Res; 8631 } 8632 8633 template <typename Derived> 8634 StmtResult 8635 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8636 DeclarationNameInfo DirName; 8637 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8638 D->getBeginLoc()); 8639 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8640 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8641 return Res; 8642 } 8643 8644 template <typename Derived> 8645 StmtResult 8646 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8647 DeclarationNameInfo DirName; 8648 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8649 D->getBeginLoc()); 8650 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8651 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8652 return Res; 8653 } 8654 8655 template <typename Derived> 8656 StmtResult 8657 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8658 DeclarationNameInfo DirName; 8659 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8660 D->getBeginLoc()); 8661 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8662 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8663 return Res; 8664 } 8665 8666 template <typename Derived> 8667 StmtResult 8668 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8669 DeclarationNameInfo DirName; 8670 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8671 D->getBeginLoc()); 8672 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8673 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8674 return Res; 8675 } 8676 8677 template <typename Derived> 8678 StmtResult 8679 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8680 DeclarationNameInfo DirName; 8681 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8682 D->getBeginLoc()); 8683 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8684 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8685 return Res; 8686 } 8687 8688 template <typename Derived> 8689 StmtResult 8690 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8691 getDerived().getSema().StartOpenMPDSABlock( 8692 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8693 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8694 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8695 return Res; 8696 } 8697 8698 template <typename Derived> 8699 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8700 OMPParallelForDirective *D) { 8701 DeclarationNameInfo DirName; 8702 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8703 nullptr, D->getBeginLoc()); 8704 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8705 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8706 return Res; 8707 } 8708 8709 template <typename Derived> 8710 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8711 OMPParallelForSimdDirective *D) { 8712 DeclarationNameInfo DirName; 8713 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8714 nullptr, D->getBeginLoc()); 8715 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8716 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8717 return Res; 8718 } 8719 8720 template <typename Derived> 8721 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8722 OMPParallelMasterDirective *D) { 8723 DeclarationNameInfo DirName; 8724 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8725 nullptr, D->getBeginLoc()); 8726 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8727 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8728 return Res; 8729 } 8730 8731 template <typename Derived> 8732 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8733 OMPParallelSectionsDirective *D) { 8734 DeclarationNameInfo DirName; 8735 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8736 nullptr, D->getBeginLoc()); 8737 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8738 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8739 return Res; 8740 } 8741 8742 template <typename Derived> 8743 StmtResult 8744 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8745 DeclarationNameInfo DirName; 8746 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8747 D->getBeginLoc()); 8748 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8749 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8750 return Res; 8751 } 8752 8753 template <typename Derived> 8754 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8755 OMPTaskyieldDirective *D) { 8756 DeclarationNameInfo DirName; 8757 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8758 D->getBeginLoc()); 8759 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8760 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8761 return Res; 8762 } 8763 8764 template <typename Derived> 8765 StmtResult 8766 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8767 DeclarationNameInfo DirName; 8768 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8769 D->getBeginLoc()); 8770 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8771 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8772 return Res; 8773 } 8774 8775 template <typename Derived> 8776 StmtResult 8777 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8778 DeclarationNameInfo DirName; 8779 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8780 D->getBeginLoc()); 8781 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8782 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8783 return Res; 8784 } 8785 8786 template <typename Derived> 8787 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8788 OMPTaskgroupDirective *D) { 8789 DeclarationNameInfo DirName; 8790 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8791 D->getBeginLoc()); 8792 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8793 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8794 return Res; 8795 } 8796 8797 template <typename Derived> 8798 StmtResult 8799 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8800 DeclarationNameInfo DirName; 8801 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8802 D->getBeginLoc()); 8803 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8804 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8805 return Res; 8806 } 8807 8808 template <typename Derived> 8809 StmtResult 8810 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8811 DeclarationNameInfo DirName; 8812 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8813 D->getBeginLoc()); 8814 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8815 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8816 return Res; 8817 } 8818 8819 template <typename Derived> 8820 StmtResult 8821 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8822 DeclarationNameInfo DirName; 8823 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8824 D->getBeginLoc()); 8825 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8826 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8827 return Res; 8828 } 8829 8830 template <typename Derived> 8831 StmtResult 8832 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8833 DeclarationNameInfo DirName; 8834 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8835 D->getBeginLoc()); 8836 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8837 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8838 return Res; 8839 } 8840 8841 template <typename Derived> 8842 StmtResult 8843 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8844 DeclarationNameInfo DirName; 8845 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8846 D->getBeginLoc()); 8847 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8848 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8849 return Res; 8850 } 8851 8852 template <typename Derived> 8853 StmtResult 8854 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8855 DeclarationNameInfo DirName; 8856 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8857 D->getBeginLoc()); 8858 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8859 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8860 return Res; 8861 } 8862 8863 template <typename Derived> 8864 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8865 OMPTargetDataDirective *D) { 8866 DeclarationNameInfo DirName; 8867 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8868 D->getBeginLoc()); 8869 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8870 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8871 return Res; 8872 } 8873 8874 template <typename Derived> 8875 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8876 OMPTargetEnterDataDirective *D) { 8877 DeclarationNameInfo DirName; 8878 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8879 nullptr, D->getBeginLoc()); 8880 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8881 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8882 return Res; 8883 } 8884 8885 template <typename Derived> 8886 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8887 OMPTargetExitDataDirective *D) { 8888 DeclarationNameInfo DirName; 8889 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8890 nullptr, D->getBeginLoc()); 8891 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8892 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8893 return Res; 8894 } 8895 8896 template <typename Derived> 8897 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8898 OMPTargetParallelDirective *D) { 8899 DeclarationNameInfo DirName; 8900 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8901 nullptr, D->getBeginLoc()); 8902 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8903 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8904 return Res; 8905 } 8906 8907 template <typename Derived> 8908 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8909 OMPTargetParallelForDirective *D) { 8910 DeclarationNameInfo DirName; 8911 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8912 nullptr, D->getBeginLoc()); 8913 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8914 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8915 return Res; 8916 } 8917 8918 template <typename Derived> 8919 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8920 OMPTargetUpdateDirective *D) { 8921 DeclarationNameInfo DirName; 8922 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8923 nullptr, D->getBeginLoc()); 8924 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8925 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8926 return Res; 8927 } 8928 8929 template <typename Derived> 8930 StmtResult 8931 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8932 DeclarationNameInfo DirName; 8933 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8934 D->getBeginLoc()); 8935 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8936 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8937 return Res; 8938 } 8939 8940 template <typename Derived> 8941 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8942 OMPCancellationPointDirective *D) { 8943 DeclarationNameInfo DirName; 8944 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8945 nullptr, D->getBeginLoc()); 8946 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8947 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8948 return Res; 8949 } 8950 8951 template <typename Derived> 8952 StmtResult 8953 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8954 DeclarationNameInfo DirName; 8955 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8956 D->getBeginLoc()); 8957 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8958 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8959 return Res; 8960 } 8961 8962 template <typename Derived> 8963 StmtResult 8964 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8965 DeclarationNameInfo DirName; 8966 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8967 D->getBeginLoc()); 8968 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8969 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8970 return Res; 8971 } 8972 8973 template <typename Derived> 8974 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8975 OMPTaskLoopSimdDirective *D) { 8976 DeclarationNameInfo DirName; 8977 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8978 nullptr, D->getBeginLoc()); 8979 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8980 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8981 return Res; 8982 } 8983 8984 template <typename Derived> 8985 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8986 OMPMasterTaskLoopDirective *D) { 8987 DeclarationNameInfo DirName; 8988 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8989 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>::TransformOMPMasterTaskLoopSimdDirective( 8997 OMPMasterTaskLoopSimdDirective *D) { 8998 DeclarationNameInfo DirName; 8999 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 9000 nullptr, 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>::TransformOMPParallelMasterTaskLoopDirective( 9008 OMPParallelMasterTaskLoopDirective *D) { 9009 DeclarationNameInfo DirName; 9010 getDerived().getSema().StartOpenMPDSABlock( 9011 OMPD_parallel_master_taskloop, 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>::TransformOMPParallelMasterTaskLoopSimdDirective( 9020 OMPParallelMasterTaskLoopSimdDirective *D) { 9021 DeclarationNameInfo DirName; 9022 getDerived().getSema().StartOpenMPDSABlock( 9023 OMPD_parallel_master_taskloop_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>::TransformOMPDistributeDirective( 9031 OMPDistributeDirective *D) { 9032 DeclarationNameInfo DirName; 9033 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 9034 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>::TransformOMPDistributeParallelForDirective( 9042 OMPDistributeParallelForDirective *D) { 9043 DeclarationNameInfo DirName; 9044 getDerived().getSema().StartOpenMPDSABlock( 9045 OMPD_distribute_parallel_for, 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 9053 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9054 OMPDistributeParallelForSimdDirective *D) { 9055 DeclarationNameInfo DirName; 9056 getDerived().getSema().StartOpenMPDSABlock( 9057 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9058 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9059 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9060 return Res; 9061 } 9062 9063 template <typename Derived> 9064 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9065 OMPDistributeSimdDirective *D) { 9066 DeclarationNameInfo DirName; 9067 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9068 nullptr, D->getBeginLoc()); 9069 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9070 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9071 return Res; 9072 } 9073 9074 template <typename Derived> 9075 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 9076 OMPTargetParallelForSimdDirective *D) { 9077 DeclarationNameInfo DirName; 9078 getDerived().getSema().StartOpenMPDSABlock( 9079 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9080 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9081 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9082 return Res; 9083 } 9084 9085 template <typename Derived> 9086 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 9087 OMPTargetSimdDirective *D) { 9088 DeclarationNameInfo DirName; 9089 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_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>::TransformOMPTeamsDistributeDirective( 9098 OMPTeamsDistributeDirective *D) { 9099 DeclarationNameInfo DirName; 9100 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9101 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>::TransformOMPTeamsDistributeSimdDirective( 9109 OMPTeamsDistributeSimdDirective *D) { 9110 DeclarationNameInfo DirName; 9111 getDerived().getSema().StartOpenMPDSABlock( 9112 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9113 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9114 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9115 return Res; 9116 } 9117 9118 template <typename Derived> 9119 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9120 OMPTeamsDistributeParallelForSimdDirective *D) { 9121 DeclarationNameInfo DirName; 9122 getDerived().getSema().StartOpenMPDSABlock( 9123 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9124 D->getBeginLoc()); 9125 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9126 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9127 return Res; 9128 } 9129 9130 template <typename Derived> 9131 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9132 OMPTeamsDistributeParallelForDirective *D) { 9133 DeclarationNameInfo DirName; 9134 getDerived().getSema().StartOpenMPDSABlock( 9135 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9136 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9137 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9138 return Res; 9139 } 9140 9141 template <typename Derived> 9142 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9143 OMPTargetTeamsDirective *D) { 9144 DeclarationNameInfo DirName; 9145 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9146 nullptr, D->getBeginLoc()); 9147 auto Res = getDerived().TransformOMPExecutableDirective(D); 9148 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9149 return Res; 9150 } 9151 9152 template <typename Derived> 9153 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9154 OMPTargetTeamsDistributeDirective *D) { 9155 DeclarationNameInfo DirName; 9156 getDerived().getSema().StartOpenMPDSABlock( 9157 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9158 auto Res = getDerived().TransformOMPExecutableDirective(D); 9159 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9160 return Res; 9161 } 9162 9163 template <typename Derived> 9164 StmtResult 9165 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9166 OMPTargetTeamsDistributeParallelForDirective *D) { 9167 DeclarationNameInfo DirName; 9168 getDerived().getSema().StartOpenMPDSABlock( 9169 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9170 D->getBeginLoc()); 9171 auto Res = getDerived().TransformOMPExecutableDirective(D); 9172 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9173 return Res; 9174 } 9175 9176 template <typename Derived> 9177 StmtResult TreeTransform<Derived>:: 9178 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9179 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9180 DeclarationNameInfo DirName; 9181 getDerived().getSema().StartOpenMPDSABlock( 9182 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9183 D->getBeginLoc()); 9184 auto Res = getDerived().TransformOMPExecutableDirective(D); 9185 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9186 return Res; 9187 } 9188 9189 template <typename Derived> 9190 StmtResult 9191 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9192 OMPTargetTeamsDistributeSimdDirective *D) { 9193 DeclarationNameInfo DirName; 9194 getDerived().getSema().StartOpenMPDSABlock( 9195 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9196 auto Res = getDerived().TransformOMPExecutableDirective(D); 9197 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9198 return Res; 9199 } 9200 9201 template <typename Derived> 9202 StmtResult 9203 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9204 DeclarationNameInfo DirName; 9205 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9206 D->getBeginLoc()); 9207 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9208 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9209 return Res; 9210 } 9211 9212 template <typename Derived> 9213 StmtResult 9214 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9215 DeclarationNameInfo DirName; 9216 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9217 D->getBeginLoc()); 9218 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9219 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9220 return Res; 9221 } 9222 9223 template <typename Derived> 9224 StmtResult 9225 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9226 DeclarationNameInfo DirName; 9227 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9228 D->getBeginLoc()); 9229 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9230 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9231 return Res; 9232 } 9233 9234 template <typename Derived> 9235 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9236 OMPGenericLoopDirective *D) { 9237 DeclarationNameInfo DirName; 9238 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9239 D->getBeginLoc()); 9240 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9241 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9242 return Res; 9243 } 9244 9245 //===----------------------------------------------------------------------===// 9246 // OpenMP clause transformation 9247 //===----------------------------------------------------------------------===// 9248 template <typename Derived> 9249 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9250 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9251 if (Cond.isInvalid()) 9252 return nullptr; 9253 return getDerived().RebuildOMPIfClause( 9254 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9255 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9256 } 9257 9258 template <typename Derived> 9259 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9260 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9261 if (Cond.isInvalid()) 9262 return nullptr; 9263 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9264 C->getLParenLoc(), C->getEndLoc()); 9265 } 9266 9267 template <typename Derived> 9268 OMPClause * 9269 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9270 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9271 if (NumThreads.isInvalid()) 9272 return nullptr; 9273 return getDerived().RebuildOMPNumThreadsClause( 9274 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9275 } 9276 9277 template <typename Derived> 9278 OMPClause * 9279 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9280 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9281 if (E.isInvalid()) 9282 return nullptr; 9283 return getDerived().RebuildOMPSafelenClause( 9284 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9285 } 9286 9287 template <typename Derived> 9288 OMPClause * 9289 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9290 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9291 if (E.isInvalid()) 9292 return nullptr; 9293 return getDerived().RebuildOMPAllocatorClause( 9294 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9295 } 9296 9297 template <typename Derived> 9298 OMPClause * 9299 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9300 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9301 if (E.isInvalid()) 9302 return nullptr; 9303 return getDerived().RebuildOMPSimdlenClause( 9304 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9305 } 9306 9307 template <typename Derived> 9308 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9309 SmallVector<Expr *, 4> TransformedSizes; 9310 TransformedSizes.reserve(C->getNumSizes()); 9311 bool Changed = false; 9312 for (Expr *E : C->getSizesRefs()) { 9313 if (!E) { 9314 TransformedSizes.push_back(nullptr); 9315 continue; 9316 } 9317 9318 ExprResult T = getDerived().TransformExpr(E); 9319 if (T.isInvalid()) 9320 return nullptr; 9321 if (E != T.get()) 9322 Changed = true; 9323 TransformedSizes.push_back(T.get()); 9324 } 9325 9326 if (!Changed && !getDerived().AlwaysRebuild()) 9327 return C; 9328 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9329 C->getLParenLoc(), C->getEndLoc()); 9330 } 9331 9332 template <typename Derived> 9333 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9334 if (!getDerived().AlwaysRebuild()) 9335 return C; 9336 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9337 } 9338 9339 template <typename Derived> 9340 OMPClause * 9341 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9342 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9343 if (T.isInvalid()) 9344 return nullptr; 9345 Expr *Factor = T.get(); 9346 bool Changed = Factor != C->getFactor(); 9347 9348 if (!Changed && !getDerived().AlwaysRebuild()) 9349 return C; 9350 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9351 C->getEndLoc()); 9352 } 9353 9354 template <typename Derived> 9355 OMPClause * 9356 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9357 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9358 if (E.isInvalid()) 9359 return nullptr; 9360 return getDerived().RebuildOMPCollapseClause( 9361 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9362 } 9363 9364 template <typename Derived> 9365 OMPClause * 9366 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9367 return getDerived().RebuildOMPDefaultClause( 9368 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9369 C->getLParenLoc(), C->getEndLoc()); 9370 } 9371 9372 template <typename Derived> 9373 OMPClause * 9374 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9375 return getDerived().RebuildOMPProcBindClause( 9376 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9377 C->getLParenLoc(), C->getEndLoc()); 9378 } 9379 9380 template <typename Derived> 9381 OMPClause * 9382 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9383 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9384 if (E.isInvalid()) 9385 return nullptr; 9386 return getDerived().RebuildOMPScheduleClause( 9387 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9388 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9389 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9390 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9391 } 9392 9393 template <typename Derived> 9394 OMPClause * 9395 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9396 ExprResult E; 9397 if (auto *Num = C->getNumForLoops()) { 9398 E = getDerived().TransformExpr(Num); 9399 if (E.isInvalid()) 9400 return nullptr; 9401 } 9402 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9403 C->getLParenLoc(), E.get()); 9404 } 9405 9406 template <typename Derived> 9407 OMPClause * 9408 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9409 ExprResult E; 9410 if (Expr *Evt = C->getEventHandler()) { 9411 E = getDerived().TransformExpr(Evt); 9412 if (E.isInvalid()) 9413 return nullptr; 9414 } 9415 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9416 C->getLParenLoc(), C->getEndLoc()); 9417 } 9418 9419 template <typename Derived> 9420 OMPClause * 9421 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9422 // No need to rebuild this clause, no template-dependent parameters. 9423 return C; 9424 } 9425 9426 template <typename Derived> 9427 OMPClause * 9428 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9429 // No need to rebuild this clause, no template-dependent parameters. 9430 return C; 9431 } 9432 9433 template <typename Derived> 9434 OMPClause * 9435 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9436 // No need to rebuild this clause, no template-dependent parameters. 9437 return C; 9438 } 9439 9440 template <typename Derived> 9441 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9442 // No need to rebuild this clause, no template-dependent parameters. 9443 return C; 9444 } 9445 9446 template <typename Derived> 9447 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9448 // No need to rebuild this clause, no template-dependent parameters. 9449 return C; 9450 } 9451 9452 template <typename Derived> 9453 OMPClause * 9454 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9455 // No need to rebuild this clause, no template-dependent parameters. 9456 return C; 9457 } 9458 9459 template <typename Derived> 9460 OMPClause * 9461 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9462 // No need to rebuild this clause, no template-dependent parameters. 9463 return C; 9464 } 9465 9466 template <typename Derived> 9467 OMPClause * 9468 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) { 9469 // No need to rebuild this clause, no template-dependent parameters. 9470 return C; 9471 } 9472 9473 template <typename Derived> 9474 OMPClause * 9475 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *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>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9483 // No need to rebuild this clause, no template-dependent parameters. 9484 return C; 9485 } 9486 9487 template <typename Derived> 9488 OMPClause * 9489 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9490 // No need to rebuild this clause, no template-dependent parameters. 9491 return C; 9492 } 9493 9494 template <typename Derived> 9495 OMPClause * 9496 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9497 // No need to rebuild this clause, no template-dependent parameters. 9498 return C; 9499 } 9500 9501 template <typename Derived> 9502 OMPClause * 9503 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9504 // No need to rebuild this clause, no template-dependent parameters. 9505 return C; 9506 } 9507 9508 template <typename Derived> 9509 OMPClause * 9510 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9511 // No need to rebuild this clause, no template-dependent parameters. 9512 return C; 9513 } 9514 9515 template <typename Derived> 9516 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9517 // No need to rebuild this clause, no template-dependent parameters. 9518 return C; 9519 } 9520 9521 template <typename Derived> 9522 OMPClause * 9523 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9524 // No need to rebuild this clause, no template-dependent parameters. 9525 return C; 9526 } 9527 9528 template <typename Derived> 9529 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9530 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9531 if (IVR.isInvalid()) 9532 return nullptr; 9533 9534 llvm::SmallVector<Expr *, 8> PrefExprs; 9535 PrefExprs.reserve(C->varlist_size() - 1); 9536 for (Expr *E : llvm::drop_begin(C->varlists())) { 9537 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9538 if (ER.isInvalid()) 9539 return nullptr; 9540 PrefExprs.push_back(ER.get()); 9541 } 9542 return getDerived().RebuildOMPInitClause( 9543 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9544 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9545 } 9546 9547 template <typename Derived> 9548 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9549 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9550 if (ER.isInvalid()) 9551 return nullptr; 9552 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9553 C->getLParenLoc(), C->getVarLoc(), 9554 C->getEndLoc()); 9555 } 9556 9557 template <typename Derived> 9558 OMPClause * 9559 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9560 ExprResult ER; 9561 if (Expr *IV = C->getInteropVar()) { 9562 ER = getDerived().TransformExpr(IV); 9563 if (ER.isInvalid()) 9564 return nullptr; 9565 } 9566 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9567 C->getLParenLoc(), C->getVarLoc(), 9568 C->getEndLoc()); 9569 } 9570 9571 template <typename Derived> 9572 OMPClause * 9573 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9574 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9575 if (Cond.isInvalid()) 9576 return nullptr; 9577 return getDerived().RebuildOMPNovariantsClause( 9578 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9579 } 9580 9581 template <typename Derived> 9582 OMPClause * 9583 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9584 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9585 if (Cond.isInvalid()) 9586 return nullptr; 9587 return getDerived().RebuildOMPNocontextClause( 9588 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9589 } 9590 9591 template <typename Derived> 9592 OMPClause * 9593 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9594 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9595 if (ThreadID.isInvalid()) 9596 return nullptr; 9597 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9598 C->getLParenLoc(), C->getEndLoc()); 9599 } 9600 9601 template <typename Derived> 9602 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) { 9603 ExprResult E = getDerived().TransformExpr(C->getAlignment()); 9604 if (E.isInvalid()) 9605 return nullptr; 9606 return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(), 9607 C->getLParenLoc(), C->getEndLoc()); 9608 } 9609 9610 template <typename Derived> 9611 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9612 OMPUnifiedAddressClause *C) { 9613 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9614 } 9615 9616 template <typename Derived> 9617 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9618 OMPUnifiedSharedMemoryClause *C) { 9619 llvm_unreachable( 9620 "unified_shared_memory clause cannot appear in dependent context"); 9621 } 9622 9623 template <typename Derived> 9624 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9625 OMPReverseOffloadClause *C) { 9626 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9627 } 9628 9629 template <typename Derived> 9630 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9631 OMPDynamicAllocatorsClause *C) { 9632 llvm_unreachable( 9633 "dynamic_allocators clause cannot appear in dependent context"); 9634 } 9635 9636 template <typename Derived> 9637 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9638 OMPAtomicDefaultMemOrderClause *C) { 9639 llvm_unreachable( 9640 "atomic_default_mem_order clause cannot appear in dependent context"); 9641 } 9642 9643 template <typename Derived> 9644 OMPClause * 9645 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9646 llvm::SmallVector<Expr *, 16> Vars; 9647 Vars.reserve(C->varlist_size()); 9648 for (auto *VE : C->varlists()) { 9649 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9650 if (EVar.isInvalid()) 9651 return nullptr; 9652 Vars.push_back(EVar.get()); 9653 } 9654 return getDerived().RebuildOMPPrivateClause( 9655 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9656 } 9657 9658 template <typename Derived> 9659 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9660 OMPFirstprivateClause *C) { 9661 llvm::SmallVector<Expr *, 16> Vars; 9662 Vars.reserve(C->varlist_size()); 9663 for (auto *VE : C->varlists()) { 9664 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9665 if (EVar.isInvalid()) 9666 return nullptr; 9667 Vars.push_back(EVar.get()); 9668 } 9669 return getDerived().RebuildOMPFirstprivateClause( 9670 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9671 } 9672 9673 template <typename Derived> 9674 OMPClause * 9675 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9676 llvm::SmallVector<Expr *, 16> Vars; 9677 Vars.reserve(C->varlist_size()); 9678 for (auto *VE : C->varlists()) { 9679 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9680 if (EVar.isInvalid()) 9681 return nullptr; 9682 Vars.push_back(EVar.get()); 9683 } 9684 return getDerived().RebuildOMPLastprivateClause( 9685 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9686 C->getLParenLoc(), C->getEndLoc()); 9687 } 9688 9689 template <typename Derived> 9690 OMPClause * 9691 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9692 llvm::SmallVector<Expr *, 16> Vars; 9693 Vars.reserve(C->varlist_size()); 9694 for (auto *VE : C->varlists()) { 9695 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9696 if (EVar.isInvalid()) 9697 return nullptr; 9698 Vars.push_back(EVar.get()); 9699 } 9700 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9701 C->getLParenLoc(), C->getEndLoc()); 9702 } 9703 9704 template <typename Derived> 9705 OMPClause * 9706 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9707 llvm::SmallVector<Expr *, 16> Vars; 9708 Vars.reserve(C->varlist_size()); 9709 for (auto *VE : C->varlists()) { 9710 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9711 if (EVar.isInvalid()) 9712 return nullptr; 9713 Vars.push_back(EVar.get()); 9714 } 9715 CXXScopeSpec ReductionIdScopeSpec; 9716 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9717 9718 DeclarationNameInfo NameInfo = C->getNameInfo(); 9719 if (NameInfo.getName()) { 9720 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9721 if (!NameInfo.getName()) 9722 return nullptr; 9723 } 9724 // Build a list of all UDR decls with the same names ranged by the Scopes. 9725 // The Scope boundary is a duplication of the previous decl. 9726 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9727 for (auto *E : C->reduction_ops()) { 9728 // Transform all the decls. 9729 if (E) { 9730 auto *ULE = cast<UnresolvedLookupExpr>(E); 9731 UnresolvedSet<8> Decls; 9732 for (auto *D : ULE->decls()) { 9733 NamedDecl *InstD = 9734 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9735 Decls.addDecl(InstD, InstD->getAccess()); 9736 } 9737 UnresolvedReductions.push_back( 9738 UnresolvedLookupExpr::Create( 9739 SemaRef.Context, /*NamingClass=*/nullptr, 9740 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9741 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9742 Decls.begin(), Decls.end())); 9743 } else 9744 UnresolvedReductions.push_back(nullptr); 9745 } 9746 return getDerived().RebuildOMPReductionClause( 9747 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9748 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9749 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9750 } 9751 9752 template <typename Derived> 9753 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9754 OMPTaskReductionClause *C) { 9755 llvm::SmallVector<Expr *, 16> Vars; 9756 Vars.reserve(C->varlist_size()); 9757 for (auto *VE : C->varlists()) { 9758 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9759 if (EVar.isInvalid()) 9760 return nullptr; 9761 Vars.push_back(EVar.get()); 9762 } 9763 CXXScopeSpec ReductionIdScopeSpec; 9764 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9765 9766 DeclarationNameInfo NameInfo = C->getNameInfo(); 9767 if (NameInfo.getName()) { 9768 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9769 if (!NameInfo.getName()) 9770 return nullptr; 9771 } 9772 // Build a list of all UDR decls with the same names ranged by the Scopes. 9773 // The Scope boundary is a duplication of the previous decl. 9774 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9775 for (auto *E : C->reduction_ops()) { 9776 // Transform all the decls. 9777 if (E) { 9778 auto *ULE = cast<UnresolvedLookupExpr>(E); 9779 UnresolvedSet<8> Decls; 9780 for (auto *D : ULE->decls()) { 9781 NamedDecl *InstD = 9782 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9783 Decls.addDecl(InstD, InstD->getAccess()); 9784 } 9785 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9786 SemaRef.Context, /*NamingClass=*/nullptr, 9787 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9788 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9789 } else 9790 UnresolvedReductions.push_back(nullptr); 9791 } 9792 return getDerived().RebuildOMPTaskReductionClause( 9793 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9794 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9795 } 9796 9797 template <typename Derived> 9798 OMPClause * 9799 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9800 llvm::SmallVector<Expr *, 16> Vars; 9801 Vars.reserve(C->varlist_size()); 9802 for (auto *VE : C->varlists()) { 9803 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9804 if (EVar.isInvalid()) 9805 return nullptr; 9806 Vars.push_back(EVar.get()); 9807 } 9808 CXXScopeSpec ReductionIdScopeSpec; 9809 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9810 9811 DeclarationNameInfo NameInfo = C->getNameInfo(); 9812 if (NameInfo.getName()) { 9813 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9814 if (!NameInfo.getName()) 9815 return nullptr; 9816 } 9817 // Build a list of all UDR decls with the same names ranged by the Scopes. 9818 // The Scope boundary is a duplication of the previous decl. 9819 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9820 for (auto *E : C->reduction_ops()) { 9821 // Transform all the decls. 9822 if (E) { 9823 auto *ULE = cast<UnresolvedLookupExpr>(E); 9824 UnresolvedSet<8> Decls; 9825 for (auto *D : ULE->decls()) { 9826 NamedDecl *InstD = 9827 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9828 Decls.addDecl(InstD, InstD->getAccess()); 9829 } 9830 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9831 SemaRef.Context, /*NamingClass=*/nullptr, 9832 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9833 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9834 } else 9835 UnresolvedReductions.push_back(nullptr); 9836 } 9837 return getDerived().RebuildOMPInReductionClause( 9838 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9839 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9840 } 9841 9842 template <typename Derived> 9843 OMPClause * 9844 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9845 llvm::SmallVector<Expr *, 16> Vars; 9846 Vars.reserve(C->varlist_size()); 9847 for (auto *VE : C->varlists()) { 9848 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9849 if (EVar.isInvalid()) 9850 return nullptr; 9851 Vars.push_back(EVar.get()); 9852 } 9853 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9854 if (Step.isInvalid()) 9855 return nullptr; 9856 return getDerived().RebuildOMPLinearClause( 9857 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9858 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9859 } 9860 9861 template <typename Derived> 9862 OMPClause * 9863 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9864 llvm::SmallVector<Expr *, 16> Vars; 9865 Vars.reserve(C->varlist_size()); 9866 for (auto *VE : C->varlists()) { 9867 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9868 if (EVar.isInvalid()) 9869 return nullptr; 9870 Vars.push_back(EVar.get()); 9871 } 9872 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9873 if (Alignment.isInvalid()) 9874 return nullptr; 9875 return getDerived().RebuildOMPAlignedClause( 9876 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9877 C->getColonLoc(), C->getEndLoc()); 9878 } 9879 9880 template <typename Derived> 9881 OMPClause * 9882 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9883 llvm::SmallVector<Expr *, 16> Vars; 9884 Vars.reserve(C->varlist_size()); 9885 for (auto *VE : C->varlists()) { 9886 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9887 if (EVar.isInvalid()) 9888 return nullptr; 9889 Vars.push_back(EVar.get()); 9890 } 9891 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9892 C->getLParenLoc(), C->getEndLoc()); 9893 } 9894 9895 template <typename Derived> 9896 OMPClause * 9897 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9898 llvm::SmallVector<Expr *, 16> Vars; 9899 Vars.reserve(C->varlist_size()); 9900 for (auto *VE : C->varlists()) { 9901 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9902 if (EVar.isInvalid()) 9903 return nullptr; 9904 Vars.push_back(EVar.get()); 9905 } 9906 return getDerived().RebuildOMPCopyprivateClause( 9907 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9908 } 9909 9910 template <typename Derived> 9911 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9912 llvm::SmallVector<Expr *, 16> Vars; 9913 Vars.reserve(C->varlist_size()); 9914 for (auto *VE : C->varlists()) { 9915 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9916 if (EVar.isInvalid()) 9917 return nullptr; 9918 Vars.push_back(EVar.get()); 9919 } 9920 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9921 C->getLParenLoc(), C->getEndLoc()); 9922 } 9923 9924 template <typename Derived> 9925 OMPClause * 9926 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9927 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9928 if (E.isInvalid()) 9929 return nullptr; 9930 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9931 C->getLParenLoc(), C->getEndLoc()); 9932 } 9933 9934 template <typename Derived> 9935 OMPClause * 9936 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9937 llvm::SmallVector<Expr *, 16> Vars; 9938 Expr *DepModifier = C->getModifier(); 9939 if (DepModifier) { 9940 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9941 if (DepModRes.isInvalid()) 9942 return nullptr; 9943 DepModifier = DepModRes.get(); 9944 } 9945 Vars.reserve(C->varlist_size()); 9946 for (auto *VE : C->varlists()) { 9947 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9948 if (EVar.isInvalid()) 9949 return nullptr; 9950 Vars.push_back(EVar.get()); 9951 } 9952 return getDerived().RebuildOMPDependClause( 9953 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9954 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9955 C->getEndLoc()); 9956 } 9957 9958 template <typename Derived> 9959 OMPClause * 9960 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9961 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9962 if (E.isInvalid()) 9963 return nullptr; 9964 return getDerived().RebuildOMPDeviceClause( 9965 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9966 C->getModifierLoc(), C->getEndLoc()); 9967 } 9968 9969 template <typename Derived, class T> 9970 bool transformOMPMappableExprListClause( 9971 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9972 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9973 DeclarationNameInfo &MapperIdInfo, 9974 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9975 // Transform expressions in the list. 9976 Vars.reserve(C->varlist_size()); 9977 for (auto *VE : C->varlists()) { 9978 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9979 if (EVar.isInvalid()) 9980 return true; 9981 Vars.push_back(EVar.get()); 9982 } 9983 // Transform mapper scope specifier and identifier. 9984 NestedNameSpecifierLoc QualifierLoc; 9985 if (C->getMapperQualifierLoc()) { 9986 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9987 C->getMapperQualifierLoc()); 9988 if (!QualifierLoc) 9989 return true; 9990 } 9991 MapperIdScopeSpec.Adopt(QualifierLoc); 9992 MapperIdInfo = C->getMapperIdInfo(); 9993 if (MapperIdInfo.getName()) { 9994 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9995 if (!MapperIdInfo.getName()) 9996 return true; 9997 } 9998 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9999 // the previous user-defined mapper lookup in dependent environment. 10000 for (auto *E : C->mapperlists()) { 10001 // Transform all the decls. 10002 if (E) { 10003 auto *ULE = cast<UnresolvedLookupExpr>(E); 10004 UnresolvedSet<8> Decls; 10005 for (auto *D : ULE->decls()) { 10006 NamedDecl *InstD = 10007 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 10008 Decls.addDecl(InstD, InstD->getAccess()); 10009 } 10010 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 10011 TT.getSema().Context, /*NamingClass=*/nullptr, 10012 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 10013 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 10014 Decls.end())); 10015 } else { 10016 UnresolvedMappers.push_back(nullptr); 10017 } 10018 } 10019 return false; 10020 } 10021 10022 template <typename Derived> 10023 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 10024 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10025 llvm::SmallVector<Expr *, 16> Vars; 10026 CXXScopeSpec MapperIdScopeSpec; 10027 DeclarationNameInfo MapperIdInfo; 10028 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10029 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 10030 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10031 return nullptr; 10032 return getDerived().RebuildOMPMapClause( 10033 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 10034 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 10035 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10036 } 10037 10038 template <typename Derived> 10039 OMPClause * 10040 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 10041 Expr *Allocator = C->getAllocator(); 10042 if (Allocator) { 10043 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 10044 if (AllocatorRes.isInvalid()) 10045 return nullptr; 10046 Allocator = AllocatorRes.get(); 10047 } 10048 llvm::SmallVector<Expr *, 16> Vars; 10049 Vars.reserve(C->varlist_size()); 10050 for (auto *VE : C->varlists()) { 10051 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10052 if (EVar.isInvalid()) 10053 return nullptr; 10054 Vars.push_back(EVar.get()); 10055 } 10056 return getDerived().RebuildOMPAllocateClause( 10057 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10058 C->getEndLoc()); 10059 } 10060 10061 template <typename Derived> 10062 OMPClause * 10063 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10064 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10065 if (E.isInvalid()) 10066 return nullptr; 10067 return getDerived().RebuildOMPNumTeamsClause( 10068 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10069 } 10070 10071 template <typename Derived> 10072 OMPClause * 10073 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10074 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10075 if (E.isInvalid()) 10076 return nullptr; 10077 return getDerived().RebuildOMPThreadLimitClause( 10078 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10079 } 10080 10081 template <typename Derived> 10082 OMPClause * 10083 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10084 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10085 if (E.isInvalid()) 10086 return nullptr; 10087 return getDerived().RebuildOMPPriorityClause( 10088 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10089 } 10090 10091 template <typename Derived> 10092 OMPClause * 10093 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10094 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10095 if (E.isInvalid()) 10096 return nullptr; 10097 return getDerived().RebuildOMPGrainsizeClause( 10098 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10099 } 10100 10101 template <typename Derived> 10102 OMPClause * 10103 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10104 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10105 if (E.isInvalid()) 10106 return nullptr; 10107 return getDerived().RebuildOMPNumTasksClause( 10108 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10109 } 10110 10111 template <typename Derived> 10112 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10113 ExprResult E = getDerived().TransformExpr(C->getHint()); 10114 if (E.isInvalid()) 10115 return nullptr; 10116 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10117 C->getLParenLoc(), C->getEndLoc()); 10118 } 10119 10120 template <typename Derived> 10121 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10122 OMPDistScheduleClause *C) { 10123 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10124 if (E.isInvalid()) 10125 return nullptr; 10126 return getDerived().RebuildOMPDistScheduleClause( 10127 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10128 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10129 } 10130 10131 template <typename Derived> 10132 OMPClause * 10133 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10134 // Rebuild Defaultmap Clause since we need to invoke the checking of 10135 // defaultmap(none:variable-category) after template initialization. 10136 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10137 C->getDefaultmapKind(), 10138 C->getBeginLoc(), 10139 C->getLParenLoc(), 10140 C->getDefaultmapModifierLoc(), 10141 C->getDefaultmapKindLoc(), 10142 C->getEndLoc()); 10143 } 10144 10145 template <typename Derived> 10146 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10147 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10148 llvm::SmallVector<Expr *, 16> Vars; 10149 CXXScopeSpec MapperIdScopeSpec; 10150 DeclarationNameInfo MapperIdInfo; 10151 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10152 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10153 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10154 return nullptr; 10155 return getDerived().RebuildOMPToClause( 10156 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10157 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10158 } 10159 10160 template <typename Derived> 10161 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10162 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10163 llvm::SmallVector<Expr *, 16> Vars; 10164 CXXScopeSpec MapperIdScopeSpec; 10165 DeclarationNameInfo MapperIdInfo; 10166 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10167 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10168 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10169 return nullptr; 10170 return getDerived().RebuildOMPFromClause( 10171 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10172 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10173 } 10174 10175 template <typename Derived> 10176 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10177 OMPUseDevicePtrClause *C) { 10178 llvm::SmallVector<Expr *, 16> Vars; 10179 Vars.reserve(C->varlist_size()); 10180 for (auto *VE : C->varlists()) { 10181 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10182 if (EVar.isInvalid()) 10183 return nullptr; 10184 Vars.push_back(EVar.get()); 10185 } 10186 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10187 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10188 } 10189 10190 template <typename Derived> 10191 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10192 OMPUseDeviceAddrClause *C) { 10193 llvm::SmallVector<Expr *, 16> Vars; 10194 Vars.reserve(C->varlist_size()); 10195 for (auto *VE : C->varlists()) { 10196 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10197 if (EVar.isInvalid()) 10198 return nullptr; 10199 Vars.push_back(EVar.get()); 10200 } 10201 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10202 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10203 } 10204 10205 template <typename Derived> 10206 OMPClause * 10207 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10208 llvm::SmallVector<Expr *, 16> Vars; 10209 Vars.reserve(C->varlist_size()); 10210 for (auto *VE : C->varlists()) { 10211 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10212 if (EVar.isInvalid()) 10213 return nullptr; 10214 Vars.push_back(EVar.get()); 10215 } 10216 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10217 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10218 } 10219 10220 template <typename Derived> 10221 OMPClause * 10222 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10223 llvm::SmallVector<Expr *, 16> Vars; 10224 Vars.reserve(C->varlist_size()); 10225 for (auto *VE : C->varlists()) { 10226 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10227 if (EVar.isInvalid()) 10228 return nullptr; 10229 Vars.push_back(EVar.get()); 10230 } 10231 return getDerived().RebuildOMPNontemporalClause( 10232 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10233 } 10234 10235 template <typename Derived> 10236 OMPClause * 10237 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10238 llvm::SmallVector<Expr *, 16> Vars; 10239 Vars.reserve(C->varlist_size()); 10240 for (auto *VE : C->varlists()) { 10241 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10242 if (EVar.isInvalid()) 10243 return nullptr; 10244 Vars.push_back(EVar.get()); 10245 } 10246 return getDerived().RebuildOMPInclusiveClause( 10247 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10248 } 10249 10250 template <typename Derived> 10251 OMPClause * 10252 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10253 llvm::SmallVector<Expr *, 16> Vars; 10254 Vars.reserve(C->varlist_size()); 10255 for (auto *VE : C->varlists()) { 10256 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10257 if (EVar.isInvalid()) 10258 return nullptr; 10259 Vars.push_back(EVar.get()); 10260 } 10261 return getDerived().RebuildOMPExclusiveClause( 10262 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10263 } 10264 10265 template <typename Derived> 10266 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10267 OMPUsesAllocatorsClause *C) { 10268 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10269 Data.reserve(C->getNumberOfAllocators()); 10270 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10271 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10272 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10273 if (Allocator.isInvalid()) 10274 continue; 10275 ExprResult AllocatorTraits; 10276 if (Expr *AT = D.AllocatorTraits) { 10277 AllocatorTraits = getDerived().TransformExpr(AT); 10278 if (AllocatorTraits.isInvalid()) 10279 continue; 10280 } 10281 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10282 NewD.Allocator = Allocator.get(); 10283 NewD.AllocatorTraits = AllocatorTraits.get(); 10284 NewD.LParenLoc = D.LParenLoc; 10285 NewD.RParenLoc = D.RParenLoc; 10286 } 10287 return getDerived().RebuildOMPUsesAllocatorsClause( 10288 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10289 } 10290 10291 template <typename Derived> 10292 OMPClause * 10293 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10294 SmallVector<Expr *, 4> Locators; 10295 Locators.reserve(C->varlist_size()); 10296 ExprResult ModifierRes; 10297 if (Expr *Modifier = C->getModifier()) { 10298 ModifierRes = getDerived().TransformExpr(Modifier); 10299 if (ModifierRes.isInvalid()) 10300 return nullptr; 10301 } 10302 for (Expr *E : C->varlists()) { 10303 ExprResult Locator = getDerived().TransformExpr(E); 10304 if (Locator.isInvalid()) 10305 continue; 10306 Locators.push_back(Locator.get()); 10307 } 10308 return getDerived().RebuildOMPAffinityClause( 10309 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10310 ModifierRes.get(), Locators); 10311 } 10312 10313 template <typename Derived> 10314 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10315 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10316 C->getBeginLoc(), C->getLParenLoc(), 10317 C->getEndLoc()); 10318 } 10319 10320 template <typename Derived> 10321 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10322 return getDerived().RebuildOMPBindClause( 10323 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10324 C->getLParenLoc(), C->getEndLoc()); 10325 } 10326 10327 //===----------------------------------------------------------------------===// 10328 // Expression transformation 10329 //===----------------------------------------------------------------------===// 10330 template<typename Derived> 10331 ExprResult 10332 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10333 return TransformExpr(E->getSubExpr()); 10334 } 10335 10336 template <typename Derived> 10337 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10338 SYCLUniqueStableNameExpr *E) { 10339 if (!E->isTypeDependent()) 10340 return E; 10341 10342 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10343 10344 if (!NewT) 10345 return ExprError(); 10346 10347 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10348 return E; 10349 10350 return getDerived().RebuildSYCLUniqueStableNameExpr( 10351 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10352 } 10353 10354 template<typename Derived> 10355 ExprResult 10356 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10357 if (!E->isTypeDependent()) 10358 return E; 10359 10360 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10361 E->getIdentKind()); 10362 } 10363 10364 template<typename Derived> 10365 ExprResult 10366 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10367 NestedNameSpecifierLoc QualifierLoc; 10368 if (E->getQualifierLoc()) { 10369 QualifierLoc 10370 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10371 if (!QualifierLoc) 10372 return ExprError(); 10373 } 10374 10375 ValueDecl *ND 10376 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10377 E->getDecl())); 10378 if (!ND) 10379 return ExprError(); 10380 10381 NamedDecl *Found = ND; 10382 if (E->getFoundDecl() != E->getDecl()) { 10383 Found = cast_or_null<NamedDecl>( 10384 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10385 if (!Found) 10386 return ExprError(); 10387 } 10388 10389 DeclarationNameInfo NameInfo = E->getNameInfo(); 10390 if (NameInfo.getName()) { 10391 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10392 if (!NameInfo.getName()) 10393 return ExprError(); 10394 } 10395 10396 if (!getDerived().AlwaysRebuild() && 10397 QualifierLoc == E->getQualifierLoc() && 10398 ND == E->getDecl() && 10399 Found == E->getFoundDecl() && 10400 NameInfo.getName() == E->getDecl()->getDeclName() && 10401 !E->hasExplicitTemplateArgs()) { 10402 10403 // Mark it referenced in the new context regardless. 10404 // FIXME: this is a bit instantiation-specific. 10405 SemaRef.MarkDeclRefReferenced(E); 10406 10407 return E; 10408 } 10409 10410 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10411 if (E->hasExplicitTemplateArgs()) { 10412 TemplateArgs = &TransArgs; 10413 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10414 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10415 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10416 E->getNumTemplateArgs(), 10417 TransArgs)) 10418 return ExprError(); 10419 } 10420 10421 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10422 Found, TemplateArgs); 10423 } 10424 10425 template<typename Derived> 10426 ExprResult 10427 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10428 return E; 10429 } 10430 10431 template <typename Derived> 10432 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10433 FixedPointLiteral *E) { 10434 return E; 10435 } 10436 10437 template<typename Derived> 10438 ExprResult 10439 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10440 return E; 10441 } 10442 10443 template<typename Derived> 10444 ExprResult 10445 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10446 return E; 10447 } 10448 10449 template<typename Derived> 10450 ExprResult 10451 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10452 return E; 10453 } 10454 10455 template<typename Derived> 10456 ExprResult 10457 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10458 return E; 10459 } 10460 10461 template<typename Derived> 10462 ExprResult 10463 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10464 if (FunctionDecl *FD = E->getDirectCallee()) 10465 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10466 return SemaRef.MaybeBindToTemporary(E); 10467 } 10468 10469 template<typename Derived> 10470 ExprResult 10471 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10472 ExprResult ControllingExpr = 10473 getDerived().TransformExpr(E->getControllingExpr()); 10474 if (ControllingExpr.isInvalid()) 10475 return ExprError(); 10476 10477 SmallVector<Expr *, 4> AssocExprs; 10478 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10479 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10480 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10481 if (TSI) { 10482 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10483 if (!AssocType) 10484 return ExprError(); 10485 AssocTypes.push_back(AssocType); 10486 } else { 10487 AssocTypes.push_back(nullptr); 10488 } 10489 10490 ExprResult AssocExpr = 10491 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10492 if (AssocExpr.isInvalid()) 10493 return ExprError(); 10494 AssocExprs.push_back(AssocExpr.get()); 10495 } 10496 10497 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10498 E->getDefaultLoc(), 10499 E->getRParenLoc(), 10500 ControllingExpr.get(), 10501 AssocTypes, 10502 AssocExprs); 10503 } 10504 10505 template<typename Derived> 10506 ExprResult 10507 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10508 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10509 if (SubExpr.isInvalid()) 10510 return ExprError(); 10511 10512 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10513 return E; 10514 10515 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10516 E->getRParen()); 10517 } 10518 10519 /// The operand of a unary address-of operator has special rules: it's 10520 /// allowed to refer to a non-static member of a class even if there's no 'this' 10521 /// object available. 10522 template<typename Derived> 10523 ExprResult 10524 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10525 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10526 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10527 else 10528 return getDerived().TransformExpr(E); 10529 } 10530 10531 template<typename Derived> 10532 ExprResult 10533 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10534 ExprResult SubExpr; 10535 if (E->getOpcode() == UO_AddrOf) 10536 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10537 else 10538 SubExpr = TransformExpr(E->getSubExpr()); 10539 if (SubExpr.isInvalid()) 10540 return ExprError(); 10541 10542 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10543 return E; 10544 10545 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10546 E->getOpcode(), 10547 SubExpr.get()); 10548 } 10549 10550 template<typename Derived> 10551 ExprResult 10552 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10553 // Transform the type. 10554 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10555 if (!Type) 10556 return ExprError(); 10557 10558 // Transform all of the components into components similar to what the 10559 // parser uses. 10560 // FIXME: It would be slightly more efficient in the non-dependent case to 10561 // just map FieldDecls, rather than requiring the rebuilder to look for 10562 // the fields again. However, __builtin_offsetof is rare enough in 10563 // template code that we don't care. 10564 bool ExprChanged = false; 10565 typedef Sema::OffsetOfComponent Component; 10566 SmallVector<Component, 4> Components; 10567 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10568 const OffsetOfNode &ON = E->getComponent(I); 10569 Component Comp; 10570 Comp.isBrackets = true; 10571 Comp.LocStart = ON.getSourceRange().getBegin(); 10572 Comp.LocEnd = ON.getSourceRange().getEnd(); 10573 switch (ON.getKind()) { 10574 case OffsetOfNode::Array: { 10575 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10576 ExprResult Index = getDerived().TransformExpr(FromIndex); 10577 if (Index.isInvalid()) 10578 return ExprError(); 10579 10580 ExprChanged = ExprChanged || Index.get() != FromIndex; 10581 Comp.isBrackets = true; 10582 Comp.U.E = Index.get(); 10583 break; 10584 } 10585 10586 case OffsetOfNode::Field: 10587 case OffsetOfNode::Identifier: 10588 Comp.isBrackets = false; 10589 Comp.U.IdentInfo = ON.getFieldName(); 10590 if (!Comp.U.IdentInfo) 10591 continue; 10592 10593 break; 10594 10595 case OffsetOfNode::Base: 10596 // Will be recomputed during the rebuild. 10597 continue; 10598 } 10599 10600 Components.push_back(Comp); 10601 } 10602 10603 // If nothing changed, retain the existing expression. 10604 if (!getDerived().AlwaysRebuild() && 10605 Type == E->getTypeSourceInfo() && 10606 !ExprChanged) 10607 return E; 10608 10609 // Build a new offsetof expression. 10610 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10611 Components, E->getRParenLoc()); 10612 } 10613 10614 template<typename Derived> 10615 ExprResult 10616 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10617 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10618 "opaque value expression requires transformation"); 10619 return E; 10620 } 10621 10622 template<typename Derived> 10623 ExprResult 10624 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10625 return E; 10626 } 10627 10628 template <typename Derived> 10629 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10630 llvm::SmallVector<Expr *, 8> Children; 10631 bool Changed = false; 10632 for (Expr *C : E->subExpressions()) { 10633 ExprResult NewC = getDerived().TransformExpr(C); 10634 if (NewC.isInvalid()) 10635 return ExprError(); 10636 Children.push_back(NewC.get()); 10637 10638 Changed |= NewC.get() != C; 10639 } 10640 if (!getDerived().AlwaysRebuild() && !Changed) 10641 return E; 10642 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10643 Children, E->getType()); 10644 } 10645 10646 template<typename Derived> 10647 ExprResult 10648 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10649 // Rebuild the syntactic form. The original syntactic form has 10650 // opaque-value expressions in it, so strip those away and rebuild 10651 // the result. This is a really awful way of doing this, but the 10652 // better solution (rebuilding the semantic expressions and 10653 // rebinding OVEs as necessary) doesn't work; we'd need 10654 // TreeTransform to not strip away implicit conversions. 10655 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10656 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10657 if (result.isInvalid()) return ExprError(); 10658 10659 // If that gives us a pseudo-object result back, the pseudo-object 10660 // expression must have been an lvalue-to-rvalue conversion which we 10661 // should reapply. 10662 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10663 result = SemaRef.checkPseudoObjectRValue(result.get()); 10664 10665 return result; 10666 } 10667 10668 template<typename Derived> 10669 ExprResult 10670 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10671 UnaryExprOrTypeTraitExpr *E) { 10672 if (E->isArgumentType()) { 10673 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10674 10675 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10676 if (!NewT) 10677 return ExprError(); 10678 10679 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10680 return E; 10681 10682 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10683 E->getKind(), 10684 E->getSourceRange()); 10685 } 10686 10687 // C++0x [expr.sizeof]p1: 10688 // The operand is either an expression, which is an unevaluated operand 10689 // [...] 10690 EnterExpressionEvaluationContext Unevaluated( 10691 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10692 Sema::ReuseLambdaContextDecl); 10693 10694 // Try to recover if we have something like sizeof(T::X) where X is a type. 10695 // Notably, there must be *exactly* one set of parens if X is a type. 10696 TypeSourceInfo *RecoveryTSI = nullptr; 10697 ExprResult SubExpr; 10698 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10699 if (auto *DRE = 10700 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10701 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10702 PE, DRE, false, &RecoveryTSI); 10703 else 10704 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10705 10706 if (RecoveryTSI) { 10707 return getDerived().RebuildUnaryExprOrTypeTrait( 10708 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10709 } else if (SubExpr.isInvalid()) 10710 return ExprError(); 10711 10712 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10713 return E; 10714 10715 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10716 E->getOperatorLoc(), 10717 E->getKind(), 10718 E->getSourceRange()); 10719 } 10720 10721 template<typename Derived> 10722 ExprResult 10723 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10724 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10725 if (LHS.isInvalid()) 10726 return ExprError(); 10727 10728 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10729 if (RHS.isInvalid()) 10730 return ExprError(); 10731 10732 10733 if (!getDerived().AlwaysRebuild() && 10734 LHS.get() == E->getLHS() && 10735 RHS.get() == E->getRHS()) 10736 return E; 10737 10738 return getDerived().RebuildArraySubscriptExpr( 10739 LHS.get(), 10740 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10741 } 10742 10743 template <typename Derived> 10744 ExprResult 10745 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10746 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10747 if (Base.isInvalid()) 10748 return ExprError(); 10749 10750 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10751 if (RowIdx.isInvalid()) 10752 return ExprError(); 10753 10754 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10755 if (ColumnIdx.isInvalid()) 10756 return ExprError(); 10757 10758 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10759 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10760 return E; 10761 10762 return getDerived().RebuildMatrixSubscriptExpr( 10763 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10764 } 10765 10766 template <typename Derived> 10767 ExprResult 10768 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10769 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10770 if (Base.isInvalid()) 10771 return ExprError(); 10772 10773 ExprResult LowerBound; 10774 if (E->getLowerBound()) { 10775 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10776 if (LowerBound.isInvalid()) 10777 return ExprError(); 10778 } 10779 10780 ExprResult Length; 10781 if (E->getLength()) { 10782 Length = getDerived().TransformExpr(E->getLength()); 10783 if (Length.isInvalid()) 10784 return ExprError(); 10785 } 10786 10787 ExprResult Stride; 10788 if (Expr *Str = E->getStride()) { 10789 Stride = getDerived().TransformExpr(Str); 10790 if (Stride.isInvalid()) 10791 return ExprError(); 10792 } 10793 10794 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10795 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10796 return E; 10797 10798 return getDerived().RebuildOMPArraySectionExpr( 10799 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10800 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10801 E->getRBracketLoc()); 10802 } 10803 10804 template <typename Derived> 10805 ExprResult 10806 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10807 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10808 if (Base.isInvalid()) 10809 return ExprError(); 10810 10811 SmallVector<Expr *, 4> Dims; 10812 bool ErrorFound = false; 10813 for (Expr *Dim : E->getDimensions()) { 10814 ExprResult DimRes = getDerived().TransformExpr(Dim); 10815 if (DimRes.isInvalid()) { 10816 ErrorFound = true; 10817 continue; 10818 } 10819 Dims.push_back(DimRes.get()); 10820 } 10821 10822 if (ErrorFound) 10823 return ExprError(); 10824 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10825 E->getRParenLoc(), Dims, 10826 E->getBracketsRanges()); 10827 } 10828 10829 template <typename Derived> 10830 ExprResult 10831 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10832 unsigned NumIterators = E->numOfIterators(); 10833 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10834 10835 bool ErrorFound = false; 10836 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10837 for (unsigned I = 0; I < NumIterators; ++I) { 10838 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10839 Data[I].DeclIdent = D->getIdentifier(); 10840 Data[I].DeclIdentLoc = D->getLocation(); 10841 if (D->getLocation() == D->getBeginLoc()) { 10842 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10843 "Implicit type must be int."); 10844 } else { 10845 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10846 QualType DeclTy = getDerived().TransformType(D->getType()); 10847 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10848 } 10849 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10850 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10851 ExprResult End = getDerived().TransformExpr(Range.End); 10852 ExprResult Step = getDerived().TransformExpr(Range.Step); 10853 ErrorFound = ErrorFound || 10854 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10855 !Data[I].Type.get().isNull())) || 10856 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10857 if (ErrorFound) 10858 continue; 10859 Data[I].Range.Begin = Begin.get(); 10860 Data[I].Range.End = End.get(); 10861 Data[I].Range.Step = Step.get(); 10862 Data[I].AssignLoc = E->getAssignLoc(I); 10863 Data[I].ColonLoc = E->getColonLoc(I); 10864 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10865 NeedToRebuild = 10866 NeedToRebuild || 10867 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10868 D->getType().getTypePtrOrNull()) || 10869 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10870 Range.Step != Data[I].Range.Step; 10871 } 10872 if (ErrorFound) 10873 return ExprError(); 10874 if (!NeedToRebuild) 10875 return E; 10876 10877 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10878 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10879 if (!Res.isUsable()) 10880 return Res; 10881 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10882 for (unsigned I = 0; I < NumIterators; ++I) 10883 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10884 IE->getIteratorDecl(I)); 10885 return Res; 10886 } 10887 10888 template<typename Derived> 10889 ExprResult 10890 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10891 // Transform the callee. 10892 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10893 if (Callee.isInvalid()) 10894 return ExprError(); 10895 10896 // Transform arguments. 10897 bool ArgChanged = false; 10898 SmallVector<Expr*, 8> Args; 10899 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10900 &ArgChanged)) 10901 return ExprError(); 10902 10903 if (!getDerived().AlwaysRebuild() && 10904 Callee.get() == E->getCallee() && 10905 !ArgChanged) 10906 return SemaRef.MaybeBindToTemporary(E); 10907 10908 // FIXME: Wrong source location information for the '('. 10909 SourceLocation FakeLParenLoc 10910 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10911 10912 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10913 if (E->hasStoredFPFeatures()) { 10914 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10915 getSema().CurFPFeatures = 10916 NewOverrides.applyOverrides(getSema().getLangOpts()); 10917 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10918 } 10919 10920 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10921 Args, 10922 E->getRParenLoc()); 10923 } 10924 10925 template<typename Derived> 10926 ExprResult 10927 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10928 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10929 if (Base.isInvalid()) 10930 return ExprError(); 10931 10932 NestedNameSpecifierLoc QualifierLoc; 10933 if (E->hasQualifier()) { 10934 QualifierLoc 10935 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10936 10937 if (!QualifierLoc) 10938 return ExprError(); 10939 } 10940 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10941 10942 ValueDecl *Member 10943 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10944 E->getMemberDecl())); 10945 if (!Member) 10946 return ExprError(); 10947 10948 NamedDecl *FoundDecl = E->getFoundDecl(); 10949 if (FoundDecl == E->getMemberDecl()) { 10950 FoundDecl = Member; 10951 } else { 10952 FoundDecl = cast_or_null<NamedDecl>( 10953 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10954 if (!FoundDecl) 10955 return ExprError(); 10956 } 10957 10958 if (!getDerived().AlwaysRebuild() && 10959 Base.get() == E->getBase() && 10960 QualifierLoc == E->getQualifierLoc() && 10961 Member == E->getMemberDecl() && 10962 FoundDecl == E->getFoundDecl() && 10963 !E->hasExplicitTemplateArgs()) { 10964 10965 // Mark it referenced in the new context regardless. 10966 // FIXME: this is a bit instantiation-specific. 10967 SemaRef.MarkMemberReferenced(E); 10968 10969 return E; 10970 } 10971 10972 TemplateArgumentListInfo TransArgs; 10973 if (E->hasExplicitTemplateArgs()) { 10974 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10975 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10976 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10977 E->getNumTemplateArgs(), 10978 TransArgs)) 10979 return ExprError(); 10980 } 10981 10982 // FIXME: Bogus source location for the operator 10983 SourceLocation FakeOperatorLoc = 10984 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10985 10986 // FIXME: to do this check properly, we will need to preserve the 10987 // first-qualifier-in-scope here, just in case we had a dependent 10988 // base (and therefore couldn't do the check) and a 10989 // nested-name-qualifier (and therefore could do the lookup). 10990 NamedDecl *FirstQualifierInScope = nullptr; 10991 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10992 if (MemberNameInfo.getName()) { 10993 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10994 if (!MemberNameInfo.getName()) 10995 return ExprError(); 10996 } 10997 10998 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10999 E->isArrow(), 11000 QualifierLoc, 11001 TemplateKWLoc, 11002 MemberNameInfo, 11003 Member, 11004 FoundDecl, 11005 (E->hasExplicitTemplateArgs() 11006 ? &TransArgs : nullptr), 11007 FirstQualifierInScope); 11008 } 11009 11010 template<typename Derived> 11011 ExprResult 11012 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 11013 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11014 if (LHS.isInvalid()) 11015 return ExprError(); 11016 11017 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11018 if (RHS.isInvalid()) 11019 return ExprError(); 11020 11021 if (!getDerived().AlwaysRebuild() && 11022 LHS.get() == E->getLHS() && 11023 RHS.get() == E->getRHS()) 11024 return E; 11025 11026 if (E->isCompoundAssignmentOp()) 11027 // FPFeatures has already been established from trailing storage 11028 return getDerived().RebuildBinaryOperator( 11029 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 11030 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11031 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11032 getSema().CurFPFeatures = 11033 NewOverrides.applyOverrides(getSema().getLangOpts()); 11034 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11035 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 11036 LHS.get(), RHS.get()); 11037 } 11038 11039 template <typename Derived> 11040 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 11041 CXXRewrittenBinaryOperator *E) { 11042 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 11043 11044 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 11045 if (LHS.isInvalid()) 11046 return ExprError(); 11047 11048 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 11049 if (RHS.isInvalid()) 11050 return ExprError(); 11051 11052 // Extract the already-resolved callee declarations so that we can restrict 11053 // ourselves to using them as the unqualified lookup results when rebuilding. 11054 UnresolvedSet<2> UnqualLookups; 11055 bool ChangedAnyLookups = false; 11056 Expr *PossibleBinOps[] = {E->getSemanticForm(), 11057 const_cast<Expr *>(Decomp.InnerBinOp)}; 11058 for (Expr *PossibleBinOp : PossibleBinOps) { 11059 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11060 if (!Op) 11061 continue; 11062 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11063 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11064 continue; 11065 11066 // Transform the callee in case we built a call to a local extern 11067 // declaration. 11068 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11069 E->getOperatorLoc(), Callee->getFoundDecl())); 11070 if (!Found) 11071 return ExprError(); 11072 if (Found != Callee->getFoundDecl()) 11073 ChangedAnyLookups = true; 11074 UnqualLookups.addDecl(Found); 11075 } 11076 11077 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups && 11078 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) { 11079 // Mark all functions used in the rewrite as referenced. Note that when 11080 // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be 11081 // function calls, and/or there might be a user-defined conversion sequence 11082 // applied to the operands of the <. 11083 // FIXME: this is a bit instantiation-specific. 11084 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS}; 11085 SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt); 11086 return E; 11087 } 11088 11089 return getDerived().RebuildCXXRewrittenBinaryOperator( 11090 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11091 } 11092 11093 template<typename Derived> 11094 ExprResult 11095 TreeTransform<Derived>::TransformCompoundAssignOperator( 11096 CompoundAssignOperator *E) { 11097 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11098 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11099 getSema().CurFPFeatures = 11100 NewOverrides.applyOverrides(getSema().getLangOpts()); 11101 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11102 return getDerived().TransformBinaryOperator(E); 11103 } 11104 11105 template<typename Derived> 11106 ExprResult TreeTransform<Derived>:: 11107 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11108 // Just rebuild the common and RHS expressions and see whether we 11109 // get any changes. 11110 11111 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11112 if (commonExpr.isInvalid()) 11113 return ExprError(); 11114 11115 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11116 if (rhs.isInvalid()) 11117 return ExprError(); 11118 11119 if (!getDerived().AlwaysRebuild() && 11120 commonExpr.get() == e->getCommon() && 11121 rhs.get() == e->getFalseExpr()) 11122 return e; 11123 11124 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11125 e->getQuestionLoc(), 11126 nullptr, 11127 e->getColonLoc(), 11128 rhs.get()); 11129 } 11130 11131 template<typename Derived> 11132 ExprResult 11133 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11134 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11135 if (Cond.isInvalid()) 11136 return ExprError(); 11137 11138 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11139 if (LHS.isInvalid()) 11140 return ExprError(); 11141 11142 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11143 if (RHS.isInvalid()) 11144 return ExprError(); 11145 11146 if (!getDerived().AlwaysRebuild() && 11147 Cond.get() == E->getCond() && 11148 LHS.get() == E->getLHS() && 11149 RHS.get() == E->getRHS()) 11150 return E; 11151 11152 return getDerived().RebuildConditionalOperator(Cond.get(), 11153 E->getQuestionLoc(), 11154 LHS.get(), 11155 E->getColonLoc(), 11156 RHS.get()); 11157 } 11158 11159 template<typename Derived> 11160 ExprResult 11161 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11162 // Implicit casts are eliminated during transformation, since they 11163 // will be recomputed by semantic analysis after transformation. 11164 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11165 } 11166 11167 template<typename Derived> 11168 ExprResult 11169 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11170 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11171 if (!Type) 11172 return ExprError(); 11173 11174 ExprResult SubExpr 11175 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11176 if (SubExpr.isInvalid()) 11177 return ExprError(); 11178 11179 if (!getDerived().AlwaysRebuild() && 11180 Type == E->getTypeInfoAsWritten() && 11181 SubExpr.get() == E->getSubExpr()) 11182 return E; 11183 11184 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11185 Type, 11186 E->getRParenLoc(), 11187 SubExpr.get()); 11188 } 11189 11190 template<typename Derived> 11191 ExprResult 11192 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11193 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11194 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11195 if (!NewT) 11196 return ExprError(); 11197 11198 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11199 if (Init.isInvalid()) 11200 return ExprError(); 11201 11202 if (!getDerived().AlwaysRebuild() && 11203 OldT == NewT && 11204 Init.get() == E->getInitializer()) 11205 return SemaRef.MaybeBindToTemporary(E); 11206 11207 // Note: the expression type doesn't necessarily match the 11208 // type-as-written, but that's okay, because it should always be 11209 // derivable from the initializer. 11210 11211 return getDerived().RebuildCompoundLiteralExpr( 11212 E->getLParenLoc(), NewT, 11213 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11214 } 11215 11216 template<typename Derived> 11217 ExprResult 11218 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11219 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11220 if (Base.isInvalid()) 11221 return ExprError(); 11222 11223 if (!getDerived().AlwaysRebuild() && 11224 Base.get() == E->getBase()) 11225 return E; 11226 11227 // FIXME: Bad source location 11228 SourceLocation FakeOperatorLoc = 11229 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11230 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11231 E->getAccessorLoc(), 11232 E->getAccessor()); 11233 } 11234 11235 template<typename Derived> 11236 ExprResult 11237 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11238 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11239 E = Syntactic; 11240 11241 bool InitChanged = false; 11242 11243 EnterExpressionEvaluationContext Context( 11244 getSema(), EnterExpressionEvaluationContext::InitList); 11245 11246 SmallVector<Expr*, 4> Inits; 11247 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11248 Inits, &InitChanged)) 11249 return ExprError(); 11250 11251 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11252 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11253 // in some cases. We can't reuse it in general, because the syntactic and 11254 // semantic forms are linked, and we can't know that semantic form will 11255 // match even if the syntactic form does. 11256 } 11257 11258 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11259 E->getRBraceLoc()); 11260 } 11261 11262 template<typename Derived> 11263 ExprResult 11264 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11265 Designation Desig; 11266 11267 // transform the initializer value 11268 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11269 if (Init.isInvalid()) 11270 return ExprError(); 11271 11272 // transform the designators. 11273 SmallVector<Expr*, 4> ArrayExprs; 11274 bool ExprChanged = false; 11275 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11276 if (D.isFieldDesignator()) { 11277 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11278 D.getDotLoc(), 11279 D.getFieldLoc())); 11280 if (D.getField()) { 11281 FieldDecl *Field = cast_or_null<FieldDecl>( 11282 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11283 if (Field != D.getField()) 11284 // Rebuild the expression when the transformed FieldDecl is 11285 // different to the already assigned FieldDecl. 11286 ExprChanged = true; 11287 } else { 11288 // Ensure that the designator expression is rebuilt when there isn't 11289 // a resolved FieldDecl in the designator as we don't want to assign 11290 // a FieldDecl to a pattern designator that will be instantiated again. 11291 ExprChanged = true; 11292 } 11293 continue; 11294 } 11295 11296 if (D.isArrayDesignator()) { 11297 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11298 if (Index.isInvalid()) 11299 return ExprError(); 11300 11301 Desig.AddDesignator( 11302 Designator::getArray(Index.get(), D.getLBracketLoc())); 11303 11304 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11305 ArrayExprs.push_back(Index.get()); 11306 continue; 11307 } 11308 11309 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11310 ExprResult Start 11311 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11312 if (Start.isInvalid()) 11313 return ExprError(); 11314 11315 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11316 if (End.isInvalid()) 11317 return ExprError(); 11318 11319 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11320 End.get(), 11321 D.getLBracketLoc(), 11322 D.getEllipsisLoc())); 11323 11324 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11325 End.get() != E->getArrayRangeEnd(D); 11326 11327 ArrayExprs.push_back(Start.get()); 11328 ArrayExprs.push_back(End.get()); 11329 } 11330 11331 if (!getDerived().AlwaysRebuild() && 11332 Init.get() == E->getInit() && 11333 !ExprChanged) 11334 return E; 11335 11336 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11337 E->getEqualOrColonLoc(), 11338 E->usesGNUSyntax(), Init.get()); 11339 } 11340 11341 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11342 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11343 template<typename Derived> 11344 ExprResult 11345 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11346 DesignatedInitUpdateExpr *E) { 11347 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11348 "initializer"); 11349 return ExprError(); 11350 } 11351 11352 template<typename Derived> 11353 ExprResult 11354 TreeTransform<Derived>::TransformNoInitExpr( 11355 NoInitExpr *E) { 11356 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11357 return ExprError(); 11358 } 11359 11360 template<typename Derived> 11361 ExprResult 11362 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11363 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11364 return ExprError(); 11365 } 11366 11367 template<typename Derived> 11368 ExprResult 11369 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11370 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11371 return ExprError(); 11372 } 11373 11374 template<typename Derived> 11375 ExprResult 11376 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11377 ImplicitValueInitExpr *E) { 11378 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11379 11380 // FIXME: Will we ever have proper type location here? Will we actually 11381 // need to transform the type? 11382 QualType T = getDerived().TransformType(E->getType()); 11383 if (T.isNull()) 11384 return ExprError(); 11385 11386 if (!getDerived().AlwaysRebuild() && 11387 T == E->getType()) 11388 return E; 11389 11390 return getDerived().RebuildImplicitValueInitExpr(T); 11391 } 11392 11393 template<typename Derived> 11394 ExprResult 11395 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11396 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11397 if (!TInfo) 11398 return ExprError(); 11399 11400 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11401 if (SubExpr.isInvalid()) 11402 return ExprError(); 11403 11404 if (!getDerived().AlwaysRebuild() && 11405 TInfo == E->getWrittenTypeInfo() && 11406 SubExpr.get() == E->getSubExpr()) 11407 return E; 11408 11409 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11410 TInfo, E->getRParenLoc()); 11411 } 11412 11413 template<typename Derived> 11414 ExprResult 11415 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11416 bool ArgumentChanged = false; 11417 SmallVector<Expr*, 4> Inits; 11418 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11419 &ArgumentChanged)) 11420 return ExprError(); 11421 11422 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11423 Inits, 11424 E->getRParenLoc()); 11425 } 11426 11427 /// Transform an address-of-label expression. 11428 /// 11429 /// By default, the transformation of an address-of-label expression always 11430 /// rebuilds the expression, so that the label identifier can be resolved to 11431 /// the corresponding label statement by semantic analysis. 11432 template<typename Derived> 11433 ExprResult 11434 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11435 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11436 E->getLabel()); 11437 if (!LD) 11438 return ExprError(); 11439 11440 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11441 cast<LabelDecl>(LD)); 11442 } 11443 11444 template<typename Derived> 11445 ExprResult 11446 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11447 SemaRef.ActOnStartStmtExpr(); 11448 StmtResult SubStmt 11449 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11450 if (SubStmt.isInvalid()) { 11451 SemaRef.ActOnStmtExprError(); 11452 return ExprError(); 11453 } 11454 11455 unsigned OldDepth = E->getTemplateDepth(); 11456 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11457 11458 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11459 SubStmt.get() == E->getSubStmt()) { 11460 // Calling this an 'error' is unintuitive, but it does the right thing. 11461 SemaRef.ActOnStmtExprError(); 11462 return SemaRef.MaybeBindToTemporary(E); 11463 } 11464 11465 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11466 E->getRParenLoc(), NewDepth); 11467 } 11468 11469 template<typename Derived> 11470 ExprResult 11471 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11472 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11473 if (Cond.isInvalid()) 11474 return ExprError(); 11475 11476 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11477 if (LHS.isInvalid()) 11478 return ExprError(); 11479 11480 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11481 if (RHS.isInvalid()) 11482 return ExprError(); 11483 11484 if (!getDerived().AlwaysRebuild() && 11485 Cond.get() == E->getCond() && 11486 LHS.get() == E->getLHS() && 11487 RHS.get() == E->getRHS()) 11488 return E; 11489 11490 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11491 Cond.get(), LHS.get(), RHS.get(), 11492 E->getRParenLoc()); 11493 } 11494 11495 template<typename Derived> 11496 ExprResult 11497 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11498 return E; 11499 } 11500 11501 template<typename Derived> 11502 ExprResult 11503 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11504 switch (E->getOperator()) { 11505 case OO_New: 11506 case OO_Delete: 11507 case OO_Array_New: 11508 case OO_Array_Delete: 11509 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11510 11511 case OO_Subscript: 11512 case OO_Call: { 11513 // This is a call to an object's operator(). 11514 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11515 11516 // Transform the object itself. 11517 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11518 if (Object.isInvalid()) 11519 return ExprError(); 11520 11521 // FIXME: Poor location information 11522 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11523 static_cast<Expr *>(Object.get())->getEndLoc()); 11524 11525 // Transform the call arguments. 11526 SmallVector<Expr*, 8> Args; 11527 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11528 Args)) 11529 return ExprError(); 11530 11531 if (E->getOperator() == OO_Subscript) 11532 return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc, 11533 Args, E->getEndLoc()); 11534 11535 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11536 E->getEndLoc()); 11537 } 11538 11539 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 11540 case OO_##Name: \ 11541 break; 11542 11543 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11544 #include "clang/Basic/OperatorKinds.def" 11545 11546 case OO_Conditional: 11547 llvm_unreachable("conditional operator is not actually overloadable"); 11548 11549 case OO_None: 11550 case NUM_OVERLOADED_OPERATORS: 11551 llvm_unreachable("not an overloaded operator?"); 11552 } 11553 11554 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11555 if (Callee.isInvalid()) 11556 return ExprError(); 11557 11558 ExprResult First; 11559 if (E->getOperator() == OO_Amp) 11560 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11561 else 11562 First = getDerived().TransformExpr(E->getArg(0)); 11563 if (First.isInvalid()) 11564 return ExprError(); 11565 11566 ExprResult Second; 11567 if (E->getNumArgs() == 2) { 11568 Second = getDerived().TransformExpr(E->getArg(1)); 11569 if (Second.isInvalid()) 11570 return ExprError(); 11571 } 11572 11573 if (!getDerived().AlwaysRebuild() && 11574 Callee.get() == E->getCallee() && 11575 First.get() == E->getArg(0) && 11576 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11577 return SemaRef.MaybeBindToTemporary(E); 11578 11579 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11580 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11581 getSema().CurFPFeatures = 11582 NewOverrides.applyOverrides(getSema().getLangOpts()); 11583 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11584 11585 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11586 E->getOperatorLoc(), 11587 Callee.get(), 11588 First.get(), 11589 Second.get()); 11590 } 11591 11592 template<typename Derived> 11593 ExprResult 11594 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11595 return getDerived().TransformCallExpr(E); 11596 } 11597 11598 template <typename Derived> 11599 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11600 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11601 getSema().CurContext != E->getParentContext(); 11602 11603 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11604 return E; 11605 11606 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11607 E->getEndLoc(), 11608 getSema().CurContext); 11609 } 11610 11611 template<typename Derived> 11612 ExprResult 11613 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11614 // Transform the callee. 11615 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11616 if (Callee.isInvalid()) 11617 return ExprError(); 11618 11619 // Transform exec config. 11620 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11621 if (EC.isInvalid()) 11622 return ExprError(); 11623 11624 // Transform arguments. 11625 bool ArgChanged = false; 11626 SmallVector<Expr*, 8> Args; 11627 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11628 &ArgChanged)) 11629 return ExprError(); 11630 11631 if (!getDerived().AlwaysRebuild() && 11632 Callee.get() == E->getCallee() && 11633 !ArgChanged) 11634 return SemaRef.MaybeBindToTemporary(E); 11635 11636 // FIXME: Wrong source location information for the '('. 11637 SourceLocation FakeLParenLoc 11638 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11639 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11640 Args, 11641 E->getRParenLoc(), EC.get()); 11642 } 11643 11644 template<typename Derived> 11645 ExprResult 11646 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11647 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11648 if (!Type) 11649 return ExprError(); 11650 11651 ExprResult SubExpr 11652 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11653 if (SubExpr.isInvalid()) 11654 return ExprError(); 11655 11656 if (!getDerived().AlwaysRebuild() && 11657 Type == E->getTypeInfoAsWritten() && 11658 SubExpr.get() == E->getSubExpr()) 11659 return E; 11660 return getDerived().RebuildCXXNamedCastExpr( 11661 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11662 Type, E->getAngleBrackets().getEnd(), 11663 // FIXME. this should be '(' location 11664 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11665 } 11666 11667 template<typename Derived> 11668 ExprResult 11669 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11670 TypeSourceInfo *TSI = 11671 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11672 if (!TSI) 11673 return ExprError(); 11674 11675 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11676 if (Sub.isInvalid()) 11677 return ExprError(); 11678 11679 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11680 Sub.get(), BCE->getEndLoc()); 11681 } 11682 11683 template<typename Derived> 11684 ExprResult 11685 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11686 return getDerived().TransformCXXNamedCastExpr(E); 11687 } 11688 11689 template<typename Derived> 11690 ExprResult 11691 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11692 return getDerived().TransformCXXNamedCastExpr(E); 11693 } 11694 11695 template<typename Derived> 11696 ExprResult 11697 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11698 CXXReinterpretCastExpr *E) { 11699 return getDerived().TransformCXXNamedCastExpr(E); 11700 } 11701 11702 template<typename Derived> 11703 ExprResult 11704 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11705 return getDerived().TransformCXXNamedCastExpr(E); 11706 } 11707 11708 template<typename Derived> 11709 ExprResult 11710 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11711 return getDerived().TransformCXXNamedCastExpr(E); 11712 } 11713 11714 template<typename Derived> 11715 ExprResult 11716 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11717 CXXFunctionalCastExpr *E) { 11718 TypeSourceInfo *Type = 11719 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11720 if (!Type) 11721 return ExprError(); 11722 11723 ExprResult SubExpr 11724 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11725 if (SubExpr.isInvalid()) 11726 return ExprError(); 11727 11728 if (!getDerived().AlwaysRebuild() && 11729 Type == E->getTypeInfoAsWritten() && 11730 SubExpr.get() == E->getSubExpr()) 11731 return E; 11732 11733 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11734 E->getLParenLoc(), 11735 SubExpr.get(), 11736 E->getRParenLoc(), 11737 E->isListInitialization()); 11738 } 11739 11740 template<typename Derived> 11741 ExprResult 11742 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11743 if (E->isTypeOperand()) { 11744 TypeSourceInfo *TInfo 11745 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11746 if (!TInfo) 11747 return ExprError(); 11748 11749 if (!getDerived().AlwaysRebuild() && 11750 TInfo == E->getTypeOperandSourceInfo()) 11751 return E; 11752 11753 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11754 TInfo, E->getEndLoc()); 11755 } 11756 11757 // Typeid's operand is an unevaluated context, unless it's a polymorphic 11758 // type. We must not unilaterally enter unevaluated context here, as then 11759 // semantic processing can re-transform an already transformed operand. 11760 Expr *Op = E->getExprOperand(); 11761 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 11762 if (E->isGLValue()) 11763 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 11764 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 11765 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 11766 11767 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 11768 Sema::ReuseLambdaContextDecl); 11769 11770 ExprResult SubExpr = getDerived().TransformExpr(Op); 11771 if (SubExpr.isInvalid()) 11772 return ExprError(); 11773 11774 if (!getDerived().AlwaysRebuild() && 11775 SubExpr.get() == E->getExprOperand()) 11776 return E; 11777 11778 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11779 SubExpr.get(), E->getEndLoc()); 11780 } 11781 11782 template<typename Derived> 11783 ExprResult 11784 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11785 if (E->isTypeOperand()) { 11786 TypeSourceInfo *TInfo 11787 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11788 if (!TInfo) 11789 return ExprError(); 11790 11791 if (!getDerived().AlwaysRebuild() && 11792 TInfo == E->getTypeOperandSourceInfo()) 11793 return E; 11794 11795 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11796 TInfo, E->getEndLoc()); 11797 } 11798 11799 EnterExpressionEvaluationContext Unevaluated( 11800 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11801 11802 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11803 if (SubExpr.isInvalid()) 11804 return ExprError(); 11805 11806 if (!getDerived().AlwaysRebuild() && 11807 SubExpr.get() == E->getExprOperand()) 11808 return E; 11809 11810 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11811 SubExpr.get(), E->getEndLoc()); 11812 } 11813 11814 template<typename Derived> 11815 ExprResult 11816 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11817 return E; 11818 } 11819 11820 template<typename Derived> 11821 ExprResult 11822 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11823 CXXNullPtrLiteralExpr *E) { 11824 return E; 11825 } 11826 11827 template<typename Derived> 11828 ExprResult 11829 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11830 QualType T = getSema().getCurrentThisType(); 11831 11832 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11833 // Mark it referenced in the new context regardless. 11834 // FIXME: this is a bit instantiation-specific. 11835 getSema().MarkThisReferenced(E); 11836 return E; 11837 } 11838 11839 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11840 } 11841 11842 template<typename Derived> 11843 ExprResult 11844 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11845 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11846 if (SubExpr.isInvalid()) 11847 return ExprError(); 11848 11849 if (!getDerived().AlwaysRebuild() && 11850 SubExpr.get() == E->getSubExpr()) 11851 return E; 11852 11853 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11854 E->isThrownVariableInScope()); 11855 } 11856 11857 template<typename Derived> 11858 ExprResult 11859 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11860 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11861 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11862 if (!Param) 11863 return ExprError(); 11864 11865 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11866 E->getUsedContext() == SemaRef.CurContext) 11867 return E; 11868 11869 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11870 } 11871 11872 template<typename Derived> 11873 ExprResult 11874 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11875 FieldDecl *Field = cast_or_null<FieldDecl>( 11876 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11877 if (!Field) 11878 return ExprError(); 11879 11880 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11881 E->getUsedContext() == SemaRef.CurContext) 11882 return E; 11883 11884 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11885 } 11886 11887 template<typename Derived> 11888 ExprResult 11889 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11890 CXXScalarValueInitExpr *E) { 11891 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11892 if (!T) 11893 return ExprError(); 11894 11895 if (!getDerived().AlwaysRebuild() && 11896 T == E->getTypeSourceInfo()) 11897 return E; 11898 11899 return getDerived().RebuildCXXScalarValueInitExpr(T, 11900 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11901 E->getRParenLoc()); 11902 } 11903 11904 template<typename Derived> 11905 ExprResult 11906 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11907 // Transform the type that we're allocating 11908 TypeSourceInfo *AllocTypeInfo = 11909 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11910 if (!AllocTypeInfo) 11911 return ExprError(); 11912 11913 // Transform the size of the array we're allocating (if any). 11914 Optional<Expr *> ArraySize; 11915 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11916 ExprResult NewArraySize; 11917 if (*OldArraySize) { 11918 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11919 if (NewArraySize.isInvalid()) 11920 return ExprError(); 11921 } 11922 ArraySize = NewArraySize.get(); 11923 } 11924 11925 // Transform the placement arguments (if any). 11926 bool ArgumentChanged = false; 11927 SmallVector<Expr*, 8> PlacementArgs; 11928 if (getDerived().TransformExprs(E->getPlacementArgs(), 11929 E->getNumPlacementArgs(), true, 11930 PlacementArgs, &ArgumentChanged)) 11931 return ExprError(); 11932 11933 // Transform the initializer (if any). 11934 Expr *OldInit = E->getInitializer(); 11935 ExprResult NewInit; 11936 if (OldInit) 11937 NewInit = getDerived().TransformInitializer(OldInit, true); 11938 if (NewInit.isInvalid()) 11939 return ExprError(); 11940 11941 // Transform new operator and delete operator. 11942 FunctionDecl *OperatorNew = nullptr; 11943 if (E->getOperatorNew()) { 11944 OperatorNew = cast_or_null<FunctionDecl>( 11945 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11946 if (!OperatorNew) 11947 return ExprError(); 11948 } 11949 11950 FunctionDecl *OperatorDelete = nullptr; 11951 if (E->getOperatorDelete()) { 11952 OperatorDelete = cast_or_null<FunctionDecl>( 11953 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11954 if (!OperatorDelete) 11955 return ExprError(); 11956 } 11957 11958 if (!getDerived().AlwaysRebuild() && 11959 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11960 ArraySize == E->getArraySize() && 11961 NewInit.get() == OldInit && 11962 OperatorNew == E->getOperatorNew() && 11963 OperatorDelete == E->getOperatorDelete() && 11964 !ArgumentChanged) { 11965 // Mark any declarations we need as referenced. 11966 // FIXME: instantiation-specific. 11967 if (OperatorNew) 11968 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11969 if (OperatorDelete) 11970 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11971 11972 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11973 QualType ElementType 11974 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11975 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11976 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11977 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11978 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11979 } 11980 } 11981 } 11982 11983 return E; 11984 } 11985 11986 QualType AllocType = AllocTypeInfo->getType(); 11987 if (!ArraySize) { 11988 // If no array size was specified, but the new expression was 11989 // instantiated with an array type (e.g., "new T" where T is 11990 // instantiated with "int[4]"), extract the outer bound from the 11991 // array type as our array size. We do this with constant and 11992 // dependently-sized array types. 11993 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11994 if (!ArrayT) { 11995 // Do nothing 11996 } else if (const ConstantArrayType *ConsArrayT 11997 = dyn_cast<ConstantArrayType>(ArrayT)) { 11998 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11999 SemaRef.Context.getSizeType(), 12000 /*FIXME:*/ E->getBeginLoc()); 12001 AllocType = ConsArrayT->getElementType(); 12002 } else if (const DependentSizedArrayType *DepArrayT 12003 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 12004 if (DepArrayT->getSizeExpr()) { 12005 ArraySize = DepArrayT->getSizeExpr(); 12006 AllocType = DepArrayT->getElementType(); 12007 } 12008 } 12009 } 12010 12011 return getDerived().RebuildCXXNewExpr( 12012 E->getBeginLoc(), E->isGlobalNew(), 12013 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 12014 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 12015 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 12016 } 12017 12018 template<typename Derived> 12019 ExprResult 12020 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 12021 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 12022 if (Operand.isInvalid()) 12023 return ExprError(); 12024 12025 // Transform the delete operator, if known. 12026 FunctionDecl *OperatorDelete = nullptr; 12027 if (E->getOperatorDelete()) { 12028 OperatorDelete = cast_or_null<FunctionDecl>( 12029 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12030 if (!OperatorDelete) 12031 return ExprError(); 12032 } 12033 12034 if (!getDerived().AlwaysRebuild() && 12035 Operand.get() == E->getArgument() && 12036 OperatorDelete == E->getOperatorDelete()) { 12037 // Mark any declarations we need as referenced. 12038 // FIXME: instantiation-specific. 12039 if (OperatorDelete) 12040 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12041 12042 if (!E->getArgument()->isTypeDependent()) { 12043 QualType Destroyed = SemaRef.Context.getBaseElementType( 12044 E->getDestroyedType()); 12045 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 12046 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 12047 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12048 SemaRef.LookupDestructor(Record)); 12049 } 12050 } 12051 12052 return E; 12053 } 12054 12055 return getDerived().RebuildCXXDeleteExpr( 12056 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 12057 } 12058 12059 template<typename Derived> 12060 ExprResult 12061 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 12062 CXXPseudoDestructorExpr *E) { 12063 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12064 if (Base.isInvalid()) 12065 return ExprError(); 12066 12067 ParsedType ObjectTypePtr; 12068 bool MayBePseudoDestructor = false; 12069 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12070 E->getOperatorLoc(), 12071 E->isArrow()? tok::arrow : tok::period, 12072 ObjectTypePtr, 12073 MayBePseudoDestructor); 12074 if (Base.isInvalid()) 12075 return ExprError(); 12076 12077 QualType ObjectType = ObjectTypePtr.get(); 12078 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12079 if (QualifierLoc) { 12080 QualifierLoc 12081 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12082 if (!QualifierLoc) 12083 return ExprError(); 12084 } 12085 CXXScopeSpec SS; 12086 SS.Adopt(QualifierLoc); 12087 12088 PseudoDestructorTypeStorage Destroyed; 12089 if (E->getDestroyedTypeInfo()) { 12090 TypeSourceInfo *DestroyedTypeInfo 12091 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12092 ObjectType, nullptr, SS); 12093 if (!DestroyedTypeInfo) 12094 return ExprError(); 12095 Destroyed = DestroyedTypeInfo; 12096 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12097 // We aren't likely to be able to resolve the identifier down to a type 12098 // now anyway, so just retain the identifier. 12099 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12100 E->getDestroyedTypeLoc()); 12101 } else { 12102 // Look for a destructor known with the given name. 12103 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 12104 *E->getDestroyedTypeIdentifier(), 12105 E->getDestroyedTypeLoc(), 12106 /*Scope=*/nullptr, 12107 SS, ObjectTypePtr, 12108 false); 12109 if (!T) 12110 return ExprError(); 12111 12112 Destroyed 12113 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12114 E->getDestroyedTypeLoc()); 12115 } 12116 12117 TypeSourceInfo *ScopeTypeInfo = nullptr; 12118 if (E->getScopeTypeInfo()) { 12119 CXXScopeSpec EmptySS; 12120 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12121 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12122 if (!ScopeTypeInfo) 12123 return ExprError(); 12124 } 12125 12126 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12127 E->getOperatorLoc(), 12128 E->isArrow(), 12129 SS, 12130 ScopeTypeInfo, 12131 E->getColonColonLoc(), 12132 E->getTildeLoc(), 12133 Destroyed); 12134 } 12135 12136 template <typename Derived> 12137 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12138 bool RequiresADL, 12139 LookupResult &R) { 12140 // Transform all the decls. 12141 bool AllEmptyPacks = true; 12142 for (auto *OldD : Old->decls()) { 12143 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12144 if (!InstD) { 12145 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12146 // This can happen because of dependent hiding. 12147 if (isa<UsingShadowDecl>(OldD)) 12148 continue; 12149 else { 12150 R.clear(); 12151 return true; 12152 } 12153 } 12154 12155 // Expand using pack declarations. 12156 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12157 ArrayRef<NamedDecl*> Decls = SingleDecl; 12158 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12159 Decls = UPD->expansions(); 12160 12161 // Expand using declarations. 12162 for (auto *D : Decls) { 12163 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12164 for (auto *SD : UD->shadows()) 12165 R.addDecl(SD); 12166 } else { 12167 R.addDecl(D); 12168 } 12169 } 12170 12171 AllEmptyPacks &= Decls.empty(); 12172 }; 12173 12174 // C++ [temp.res]/8.4.2: 12175 // The program is ill-formed, no diagnostic required, if [...] lookup for 12176 // a name in the template definition found a using-declaration, but the 12177 // lookup in the corresponding scope in the instantiation odoes not find 12178 // any declarations because the using-declaration was a pack expansion and 12179 // the corresponding pack is empty 12180 if (AllEmptyPacks && !RequiresADL) { 12181 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12182 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12183 return true; 12184 } 12185 12186 // Resolve a kind, but don't do any further analysis. If it's 12187 // ambiguous, the callee needs to deal with it. 12188 R.resolveKind(); 12189 return false; 12190 } 12191 12192 template<typename Derived> 12193 ExprResult 12194 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12195 UnresolvedLookupExpr *Old) { 12196 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12197 Sema::LookupOrdinaryName); 12198 12199 // Transform the declaration set. 12200 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12201 return ExprError(); 12202 12203 // Rebuild the nested-name qualifier, if present. 12204 CXXScopeSpec SS; 12205 if (Old->getQualifierLoc()) { 12206 NestedNameSpecifierLoc QualifierLoc 12207 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12208 if (!QualifierLoc) 12209 return ExprError(); 12210 12211 SS.Adopt(QualifierLoc); 12212 } 12213 12214 if (Old->getNamingClass()) { 12215 CXXRecordDecl *NamingClass 12216 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12217 Old->getNameLoc(), 12218 Old->getNamingClass())); 12219 if (!NamingClass) { 12220 R.clear(); 12221 return ExprError(); 12222 } 12223 12224 R.setNamingClass(NamingClass); 12225 } 12226 12227 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12228 12229 // If we have neither explicit template arguments, nor the template keyword, 12230 // it's a normal declaration name or member reference. 12231 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12232 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12233 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12234 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12235 // give a good diagnostic. 12236 if (D && D->isCXXInstanceMember()) { 12237 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12238 /*TemplateArgs=*/nullptr, 12239 /*Scope=*/nullptr); 12240 } 12241 12242 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12243 } 12244 12245 // If we have template arguments, rebuild them, then rebuild the 12246 // templateid expression. 12247 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12248 if (Old->hasExplicitTemplateArgs() && 12249 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12250 Old->getNumTemplateArgs(), 12251 TransArgs)) { 12252 R.clear(); 12253 return ExprError(); 12254 } 12255 12256 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12257 Old->requiresADL(), &TransArgs); 12258 } 12259 12260 template<typename Derived> 12261 ExprResult 12262 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12263 bool ArgChanged = false; 12264 SmallVector<TypeSourceInfo *, 4> Args; 12265 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12266 TypeSourceInfo *From = E->getArg(I); 12267 TypeLoc FromTL = From->getTypeLoc(); 12268 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12269 TypeLocBuilder TLB; 12270 TLB.reserve(FromTL.getFullDataSize()); 12271 QualType To = getDerived().TransformType(TLB, FromTL); 12272 if (To.isNull()) 12273 return ExprError(); 12274 12275 if (To == From->getType()) 12276 Args.push_back(From); 12277 else { 12278 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12279 ArgChanged = true; 12280 } 12281 continue; 12282 } 12283 12284 ArgChanged = true; 12285 12286 // We have a pack expansion. Instantiate it. 12287 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12288 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12289 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12290 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12291 12292 // Determine whether the set of unexpanded parameter packs can and should 12293 // be expanded. 12294 bool Expand = true; 12295 bool RetainExpansion = false; 12296 Optional<unsigned> OrigNumExpansions = 12297 ExpansionTL.getTypePtr()->getNumExpansions(); 12298 Optional<unsigned> NumExpansions = OrigNumExpansions; 12299 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12300 PatternTL.getSourceRange(), 12301 Unexpanded, 12302 Expand, RetainExpansion, 12303 NumExpansions)) 12304 return ExprError(); 12305 12306 if (!Expand) { 12307 // The transform has determined that we should perform a simple 12308 // transformation on the pack expansion, producing another pack 12309 // expansion. 12310 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12311 12312 TypeLocBuilder TLB; 12313 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12314 12315 QualType To = getDerived().TransformType(TLB, PatternTL); 12316 if (To.isNull()) 12317 return ExprError(); 12318 12319 To = getDerived().RebuildPackExpansionType(To, 12320 PatternTL.getSourceRange(), 12321 ExpansionTL.getEllipsisLoc(), 12322 NumExpansions); 12323 if (To.isNull()) 12324 return ExprError(); 12325 12326 PackExpansionTypeLoc ToExpansionTL 12327 = TLB.push<PackExpansionTypeLoc>(To); 12328 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12329 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12330 continue; 12331 } 12332 12333 // Expand the pack expansion by substituting for each argument in the 12334 // pack(s). 12335 for (unsigned I = 0; I != *NumExpansions; ++I) { 12336 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12337 TypeLocBuilder TLB; 12338 TLB.reserve(PatternTL.getFullDataSize()); 12339 QualType To = getDerived().TransformType(TLB, PatternTL); 12340 if (To.isNull()) 12341 return ExprError(); 12342 12343 if (To->containsUnexpandedParameterPack()) { 12344 To = getDerived().RebuildPackExpansionType(To, 12345 PatternTL.getSourceRange(), 12346 ExpansionTL.getEllipsisLoc(), 12347 NumExpansions); 12348 if (To.isNull()) 12349 return ExprError(); 12350 12351 PackExpansionTypeLoc ToExpansionTL 12352 = TLB.push<PackExpansionTypeLoc>(To); 12353 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12354 } 12355 12356 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12357 } 12358 12359 if (!RetainExpansion) 12360 continue; 12361 12362 // If we're supposed to retain a pack expansion, do so by temporarily 12363 // forgetting the partially-substituted parameter pack. 12364 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12365 12366 TypeLocBuilder TLB; 12367 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12368 12369 QualType To = getDerived().TransformType(TLB, PatternTL); 12370 if (To.isNull()) 12371 return ExprError(); 12372 12373 To = getDerived().RebuildPackExpansionType(To, 12374 PatternTL.getSourceRange(), 12375 ExpansionTL.getEllipsisLoc(), 12376 NumExpansions); 12377 if (To.isNull()) 12378 return ExprError(); 12379 12380 PackExpansionTypeLoc ToExpansionTL 12381 = TLB.push<PackExpansionTypeLoc>(To); 12382 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12383 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12384 } 12385 12386 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12387 return E; 12388 12389 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12390 E->getEndLoc()); 12391 } 12392 12393 template<typename Derived> 12394 ExprResult 12395 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12396 ConceptSpecializationExpr *E) { 12397 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12398 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12399 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12400 Old->NumTemplateArgs, TransArgs)) 12401 return ExprError(); 12402 12403 return getDerived().RebuildConceptSpecializationExpr( 12404 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12405 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12406 &TransArgs); 12407 } 12408 12409 template<typename Derived> 12410 ExprResult 12411 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12412 SmallVector<ParmVarDecl*, 4> TransParams; 12413 SmallVector<QualType, 4> TransParamTypes; 12414 Sema::ExtParameterInfoBuilder ExtParamInfos; 12415 12416 // C++2a [expr.prim.req]p2 12417 // Expressions appearing within a requirement-body are unevaluated operands. 12418 EnterExpressionEvaluationContext Ctx( 12419 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12420 12421 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12422 getSema().Context, getSema().CurContext, 12423 E->getBody()->getBeginLoc()); 12424 12425 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12426 12427 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12428 E->getLocalParameters(), 12429 /*ParamTypes=*/nullptr, 12430 /*ParamInfos=*/nullptr, 12431 TransParamTypes, &TransParams, 12432 ExtParamInfos)) 12433 return ExprError(); 12434 12435 for (ParmVarDecl *Param : TransParams) 12436 Param->setDeclContext(Body); 12437 12438 SmallVector<concepts::Requirement *, 4> TransReqs; 12439 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12440 TransReqs)) 12441 return ExprError(); 12442 12443 for (concepts::Requirement *Req : TransReqs) { 12444 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12445 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12446 ER->getReturnTypeRequirement() 12447 .getTypeConstraintTemplateParameterList()->getParam(0) 12448 ->setDeclContext(Body); 12449 } 12450 } 12451 } 12452 12453 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12454 TransParams, TransReqs, 12455 E->getRBraceLoc()); 12456 } 12457 12458 template<typename Derived> 12459 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12460 ArrayRef<concepts::Requirement *> Reqs, 12461 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12462 for (concepts::Requirement *Req : Reqs) { 12463 concepts::Requirement *TransReq = nullptr; 12464 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12465 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12466 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12467 TransReq = getDerived().TransformExprRequirement(ExprReq); 12468 else 12469 TransReq = getDerived().TransformNestedRequirement( 12470 cast<concepts::NestedRequirement>(Req)); 12471 if (!TransReq) 12472 return true; 12473 Transformed.push_back(TransReq); 12474 } 12475 return false; 12476 } 12477 12478 template<typename Derived> 12479 concepts::TypeRequirement * 12480 TreeTransform<Derived>::TransformTypeRequirement( 12481 concepts::TypeRequirement *Req) { 12482 if (Req->isSubstitutionFailure()) { 12483 if (getDerived().AlwaysRebuild()) 12484 return getDerived().RebuildTypeRequirement( 12485 Req->getSubstitutionDiagnostic()); 12486 return Req; 12487 } 12488 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12489 if (!TransType) 12490 return nullptr; 12491 return getDerived().RebuildTypeRequirement(TransType); 12492 } 12493 12494 template<typename Derived> 12495 concepts::ExprRequirement * 12496 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12497 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12498 if (Req->isExprSubstitutionFailure()) 12499 TransExpr = Req->getExprSubstitutionDiagnostic(); 12500 else { 12501 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12502 if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType()) 12503 TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get()); 12504 if (TransExprRes.isInvalid()) 12505 return nullptr; 12506 TransExpr = TransExprRes.get(); 12507 } 12508 12509 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12510 const auto &RetReq = Req->getReturnTypeRequirement(); 12511 if (RetReq.isEmpty()) 12512 TransRetReq.emplace(); 12513 else if (RetReq.isSubstitutionFailure()) 12514 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12515 else if (RetReq.isTypeConstraint()) { 12516 TemplateParameterList *OrigTPL = 12517 RetReq.getTypeConstraintTemplateParameterList(); 12518 TemplateParameterList *TPL = 12519 getDerived().TransformTemplateParameterList(OrigTPL); 12520 if (!TPL) 12521 return nullptr; 12522 TransRetReq.emplace(TPL); 12523 } 12524 assert(TransRetReq.hasValue() && 12525 "All code paths leading here must set TransRetReq"); 12526 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12527 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12528 Req->getNoexceptLoc(), 12529 std::move(*TransRetReq)); 12530 return getDerived().RebuildExprRequirement( 12531 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12532 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12533 } 12534 12535 template<typename Derived> 12536 concepts::NestedRequirement * 12537 TreeTransform<Derived>::TransformNestedRequirement( 12538 concepts::NestedRequirement *Req) { 12539 if (Req->isSubstitutionFailure()) { 12540 if (getDerived().AlwaysRebuild()) 12541 return getDerived().RebuildNestedRequirement( 12542 Req->getSubstitutionDiagnostic()); 12543 return Req; 12544 } 12545 ExprResult TransConstraint = 12546 getDerived().TransformExpr(Req->getConstraintExpr()); 12547 if (TransConstraint.isInvalid()) 12548 return nullptr; 12549 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12550 } 12551 12552 template<typename Derived> 12553 ExprResult 12554 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12555 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12556 if (!T) 12557 return ExprError(); 12558 12559 if (!getDerived().AlwaysRebuild() && 12560 T == E->getQueriedTypeSourceInfo()) 12561 return E; 12562 12563 ExprResult SubExpr; 12564 { 12565 EnterExpressionEvaluationContext Unevaluated( 12566 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12567 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12568 if (SubExpr.isInvalid()) 12569 return ExprError(); 12570 12571 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12572 return E; 12573 } 12574 12575 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12576 SubExpr.get(), E->getEndLoc()); 12577 } 12578 12579 template<typename Derived> 12580 ExprResult 12581 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12582 ExprResult SubExpr; 12583 { 12584 EnterExpressionEvaluationContext Unevaluated( 12585 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12586 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12587 if (SubExpr.isInvalid()) 12588 return ExprError(); 12589 12590 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12591 return E; 12592 } 12593 12594 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12595 SubExpr.get(), E->getEndLoc()); 12596 } 12597 12598 template <typename Derived> 12599 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12600 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12601 TypeSourceInfo **RecoveryTSI) { 12602 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12603 DRE, AddrTaken, RecoveryTSI); 12604 12605 // Propagate both errors and recovered types, which return ExprEmpty. 12606 if (!NewDRE.isUsable()) 12607 return NewDRE; 12608 12609 // We got an expr, wrap it up in parens. 12610 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12611 return PE; 12612 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12613 PE->getRParen()); 12614 } 12615 12616 template <typename Derived> 12617 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12618 DependentScopeDeclRefExpr *E) { 12619 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12620 nullptr); 12621 } 12622 12623 template <typename Derived> 12624 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12625 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 12626 TypeSourceInfo **RecoveryTSI) { 12627 assert(E->getQualifierLoc()); 12628 NestedNameSpecifierLoc QualifierLoc = 12629 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12630 if (!QualifierLoc) 12631 return ExprError(); 12632 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12633 12634 // TODO: If this is a conversion-function-id, verify that the 12635 // destination type name (if present) resolves the same way after 12636 // instantiation as it did in the local scope. 12637 12638 DeclarationNameInfo NameInfo = 12639 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12640 if (!NameInfo.getName()) 12641 return ExprError(); 12642 12643 if (!E->hasExplicitTemplateArgs()) { 12644 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 12645 // Note: it is sufficient to compare the Name component of NameInfo: 12646 // if name has not changed, DNLoc has not changed either. 12647 NameInfo.getName() == E->getDeclName()) 12648 return E; 12649 12650 return getDerived().RebuildDependentScopeDeclRefExpr( 12651 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12652 IsAddressOfOperand, RecoveryTSI); 12653 } 12654 12655 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12656 if (getDerived().TransformTemplateArguments( 12657 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 12658 return ExprError(); 12659 12660 return getDerived().RebuildDependentScopeDeclRefExpr( 12661 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12662 RecoveryTSI); 12663 } 12664 12665 template<typename Derived> 12666 ExprResult 12667 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12668 // CXXConstructExprs other than for list-initialization and 12669 // CXXTemporaryObjectExpr are always implicit, so when we have 12670 // a 1-argument construction we just transform that argument. 12671 if (getDerived().AllowSkippingCXXConstructExpr() && 12672 ((E->getNumArgs() == 1 || 12673 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12674 (!getDerived().DropCallArgument(E->getArg(0))) && 12675 !E->isListInitialization())) 12676 return getDerived().TransformInitializer(E->getArg(0), 12677 /*DirectInit*/ false); 12678 12679 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12680 12681 QualType T = getDerived().TransformType(E->getType()); 12682 if (T.isNull()) 12683 return ExprError(); 12684 12685 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12686 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12687 if (!Constructor) 12688 return ExprError(); 12689 12690 bool ArgumentChanged = false; 12691 SmallVector<Expr*, 8> Args; 12692 { 12693 EnterExpressionEvaluationContext Context( 12694 getSema(), EnterExpressionEvaluationContext::InitList, 12695 E->isListInitialization()); 12696 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12697 &ArgumentChanged)) 12698 return ExprError(); 12699 } 12700 12701 if (!getDerived().AlwaysRebuild() && 12702 T == E->getType() && 12703 Constructor == E->getConstructor() && 12704 !ArgumentChanged) { 12705 // Mark the constructor as referenced. 12706 // FIXME: Instantiation-specific 12707 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12708 return E; 12709 } 12710 12711 return getDerived().RebuildCXXConstructExpr( 12712 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12713 E->hadMultipleCandidates(), E->isListInitialization(), 12714 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12715 E->getConstructionKind(), E->getParenOrBraceRange()); 12716 } 12717 12718 template<typename Derived> 12719 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12720 CXXInheritedCtorInitExpr *E) { 12721 QualType T = getDerived().TransformType(E->getType()); 12722 if (T.isNull()) 12723 return ExprError(); 12724 12725 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12726 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12727 if (!Constructor) 12728 return ExprError(); 12729 12730 if (!getDerived().AlwaysRebuild() && 12731 T == E->getType() && 12732 Constructor == E->getConstructor()) { 12733 // Mark the constructor as referenced. 12734 // FIXME: Instantiation-specific 12735 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12736 return E; 12737 } 12738 12739 return getDerived().RebuildCXXInheritedCtorInitExpr( 12740 T, E->getLocation(), Constructor, 12741 E->constructsVBase(), E->inheritedFromVBase()); 12742 } 12743 12744 /// Transform a C++ temporary-binding expression. 12745 /// 12746 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12747 /// transform the subexpression and return that. 12748 template<typename Derived> 12749 ExprResult 12750 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12751 return getDerived().TransformExpr(E->getSubExpr()); 12752 } 12753 12754 /// Transform a C++ expression that contains cleanups that should 12755 /// be run after the expression is evaluated. 12756 /// 12757 /// Since ExprWithCleanups nodes are implicitly generated, we 12758 /// just transform the subexpression and return that. 12759 template<typename Derived> 12760 ExprResult 12761 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12762 return getDerived().TransformExpr(E->getSubExpr()); 12763 } 12764 12765 template<typename Derived> 12766 ExprResult 12767 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12768 CXXTemporaryObjectExpr *E) { 12769 TypeSourceInfo *T = 12770 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12771 if (!T) 12772 return ExprError(); 12773 12774 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12775 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12776 if (!Constructor) 12777 return ExprError(); 12778 12779 bool ArgumentChanged = false; 12780 SmallVector<Expr*, 8> Args; 12781 Args.reserve(E->getNumArgs()); 12782 { 12783 EnterExpressionEvaluationContext Context( 12784 getSema(), EnterExpressionEvaluationContext::InitList, 12785 E->isListInitialization()); 12786 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12787 &ArgumentChanged)) 12788 return ExprError(); 12789 } 12790 12791 if (!getDerived().AlwaysRebuild() && 12792 T == E->getTypeSourceInfo() && 12793 Constructor == E->getConstructor() && 12794 !ArgumentChanged) { 12795 // FIXME: Instantiation-specific 12796 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12797 return SemaRef.MaybeBindToTemporary(E); 12798 } 12799 12800 // FIXME: We should just pass E->isListInitialization(), but we're not 12801 // prepared to handle list-initialization without a child InitListExpr. 12802 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12803 return getDerived().RebuildCXXTemporaryObjectExpr( 12804 T, LParenLoc, Args, E->getEndLoc(), 12805 /*ListInitialization=*/LParenLoc.isInvalid()); 12806 } 12807 12808 template<typename Derived> 12809 ExprResult 12810 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12811 // Transform any init-capture expressions before entering the scope of the 12812 // lambda body, because they are not semantically within that scope. 12813 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12814 struct TransformedInitCapture { 12815 // The location of the ... if the result is retaining a pack expansion. 12816 SourceLocation EllipsisLoc; 12817 // Zero or more expansions of the init-capture. 12818 SmallVector<InitCaptureInfoTy, 4> Expansions; 12819 }; 12820 SmallVector<TransformedInitCapture, 4> InitCaptures; 12821 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12822 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12823 CEnd = E->capture_end(); 12824 C != CEnd; ++C) { 12825 if (!E->isInitCapture(C)) 12826 continue; 12827 12828 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12829 VarDecl *OldVD = C->getCapturedVar(); 12830 12831 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12832 Optional<unsigned> NumExpansions) { 12833 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12834 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12835 12836 if (NewExprInitResult.isInvalid()) { 12837 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12838 return; 12839 } 12840 Expr *NewExprInit = NewExprInitResult.get(); 12841 12842 QualType NewInitCaptureType = 12843 getSema().buildLambdaInitCaptureInitialization( 12844 C->getLocation(), OldVD->getType()->isReferenceType(), 12845 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12846 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12847 NewExprInit); 12848 Result.Expansions.push_back( 12849 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12850 }; 12851 12852 // If this is an init-capture pack, consider expanding the pack now. 12853 if (OldVD->isParameterPack()) { 12854 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12855 ->getTypeLoc() 12856 .castAs<PackExpansionTypeLoc>(); 12857 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12858 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12859 12860 // Determine whether the set of unexpanded parameter packs can and should 12861 // be expanded. 12862 bool Expand = true; 12863 bool RetainExpansion = false; 12864 Optional<unsigned> OrigNumExpansions = 12865 ExpansionTL.getTypePtr()->getNumExpansions(); 12866 Optional<unsigned> NumExpansions = OrigNumExpansions; 12867 if (getDerived().TryExpandParameterPacks( 12868 ExpansionTL.getEllipsisLoc(), 12869 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12870 RetainExpansion, NumExpansions)) 12871 return ExprError(); 12872 if (Expand) { 12873 for (unsigned I = 0; I != *NumExpansions; ++I) { 12874 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12875 SubstInitCapture(SourceLocation(), None); 12876 } 12877 } 12878 if (!Expand || RetainExpansion) { 12879 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12880 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12881 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12882 } 12883 } else { 12884 SubstInitCapture(SourceLocation(), None); 12885 } 12886 } 12887 12888 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12889 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12890 12891 // Transform the template parameters, and add them to the current 12892 // instantiation scope. The null case is handled correctly. 12893 auto TPL = getDerived().TransformTemplateParameterList( 12894 E->getTemplateParameterList()); 12895 LSI->GLTemplateParameterList = TPL; 12896 12897 // Transform the type of the original lambda's call operator. 12898 // The transformation MUST be done in the CurrentInstantiationScope since 12899 // it introduces a mapping of the original to the newly created 12900 // transformed parameters. 12901 TypeSourceInfo *NewCallOpTSI = nullptr; 12902 { 12903 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12904 FunctionProtoTypeLoc OldCallOpFPTL = 12905 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12906 12907 TypeLocBuilder NewCallOpTLBuilder; 12908 SmallVector<QualType, 4> ExceptionStorage; 12909 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12910 QualType NewCallOpType = TransformFunctionProtoType( 12911 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12912 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12913 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12914 ExceptionStorage, Changed); 12915 }); 12916 if (NewCallOpType.isNull()) 12917 return ExprError(); 12918 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12919 NewCallOpType); 12920 } 12921 12922 // Transform the trailing requires clause 12923 ExprResult NewTrailingRequiresClause; 12924 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12925 // FIXME: Concepts: Substitution into requires clause should only happen 12926 // when checking satisfaction. 12927 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12928 12929 // Create the local class that will describe the lambda. 12930 // FIXME: KnownDependent below is wrong when substituting inside a templated 12931 // context that isn't a DeclContext (such as a variable template). 12932 CXXRecordDecl *OldClass = E->getLambdaClass(); 12933 CXXRecordDecl *Class 12934 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12935 NewCallOpTSI, 12936 /*KnownDependent=*/false, 12937 E->getCaptureDefault()); 12938 getDerived().transformedLocalDecl(OldClass, {Class}); 12939 12940 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12941 if (getDerived().ReplacingOriginal()) 12942 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12943 OldClass->getLambdaManglingNumber(), 12944 OldClass->getDeviceLambdaManglingNumber(), 12945 OldClass->getLambdaContextDecl()); 12946 12947 // Build the call operator. 12948 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12949 Class, E->getIntroducerRange(), NewCallOpTSI, 12950 E->getCallOperator()->getEndLoc(), 12951 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12952 E->getCallOperator()->getConstexprKind(), 12953 NewTrailingRequiresClause.get()); 12954 12955 LSI->CallOperator = NewCallOperator; 12956 12957 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12958 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12959 12960 // Number the lambda for linkage purposes if necessary. 12961 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12962 12963 // Introduce the context of the call operator. 12964 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12965 /*NewThisContext*/false); 12966 12967 // Enter the scope of the lambda. 12968 getSema().buildLambdaScope(LSI, NewCallOperator, 12969 E->getIntroducerRange(), 12970 E->getCaptureDefault(), 12971 E->getCaptureDefaultLoc(), 12972 E->hasExplicitParameters(), 12973 E->hasExplicitResultType(), 12974 E->isMutable()); 12975 12976 bool Invalid = false; 12977 12978 // Transform captures. 12979 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12980 CEnd = E->capture_end(); 12981 C != CEnd; ++C) { 12982 // When we hit the first implicit capture, tell Sema that we've finished 12983 // the list of explicit captures. 12984 if (C->isImplicit()) 12985 break; 12986 12987 // Capturing 'this' is trivial. 12988 if (C->capturesThis()) { 12989 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12990 /*BuildAndDiagnose*/ true, nullptr, 12991 C->getCaptureKind() == LCK_StarThis); 12992 continue; 12993 } 12994 // Captured expression will be recaptured during captured variables 12995 // rebuilding. 12996 if (C->capturesVLAType()) 12997 continue; 12998 12999 // Rebuild init-captures, including the implied field declaration. 13000 if (E->isInitCapture(C)) { 13001 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 13002 13003 VarDecl *OldVD = C->getCapturedVar(); 13004 llvm::SmallVector<Decl*, 4> NewVDs; 13005 13006 for (InitCaptureInfoTy &Info : NewC.Expansions) { 13007 ExprResult Init = Info.first; 13008 QualType InitQualType = Info.second; 13009 if (Init.isInvalid() || InitQualType.isNull()) { 13010 Invalid = true; 13011 break; 13012 } 13013 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 13014 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 13015 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 13016 if (!NewVD) { 13017 Invalid = true; 13018 break; 13019 } 13020 NewVDs.push_back(NewVD); 13021 getSema().addInitCapture(LSI, NewVD); 13022 } 13023 13024 if (Invalid) 13025 break; 13026 13027 getDerived().transformedLocalDecl(OldVD, NewVDs); 13028 continue; 13029 } 13030 13031 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13032 13033 // Determine the capture kind for Sema. 13034 Sema::TryCaptureKind Kind 13035 = C->isImplicit()? Sema::TryCapture_Implicit 13036 : C->getCaptureKind() == LCK_ByCopy 13037 ? Sema::TryCapture_ExplicitByVal 13038 : Sema::TryCapture_ExplicitByRef; 13039 SourceLocation EllipsisLoc; 13040 if (C->isPackExpansion()) { 13041 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 13042 bool ShouldExpand = false; 13043 bool RetainExpansion = false; 13044 Optional<unsigned> NumExpansions; 13045 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 13046 C->getLocation(), 13047 Unexpanded, 13048 ShouldExpand, RetainExpansion, 13049 NumExpansions)) { 13050 Invalid = true; 13051 continue; 13052 } 13053 13054 if (ShouldExpand) { 13055 // The transform has determined that we should perform an expansion; 13056 // transform and capture each of the arguments. 13057 // expansion of the pattern. Do so. 13058 VarDecl *Pack = C->getCapturedVar(); 13059 for (unsigned I = 0; I != *NumExpansions; ++I) { 13060 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13061 VarDecl *CapturedVar 13062 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13063 Pack)); 13064 if (!CapturedVar) { 13065 Invalid = true; 13066 continue; 13067 } 13068 13069 // Capture the transformed variable. 13070 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 13071 } 13072 13073 // FIXME: Retain a pack expansion if RetainExpansion is true. 13074 13075 continue; 13076 } 13077 13078 EllipsisLoc = C->getEllipsisLoc(); 13079 } 13080 13081 // Transform the captured variable. 13082 VarDecl *CapturedVar 13083 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13084 C->getCapturedVar())); 13085 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13086 Invalid = true; 13087 continue; 13088 } 13089 13090 // Capture the transformed variable. 13091 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13092 EllipsisLoc); 13093 } 13094 getSema().finishLambdaExplicitCaptures(LSI); 13095 13096 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13097 // evaluation context even if we're not transforming the function body. 13098 getSema().PushExpressionEvaluationContext( 13099 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13100 13101 // Instantiate the body of the lambda expression. 13102 StmtResult Body = 13103 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13104 13105 // ActOnLambda* will pop the function scope for us. 13106 FuncScopeCleanup.disable(); 13107 13108 if (Body.isInvalid()) { 13109 SavedContext.pop(); 13110 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13111 /*IsInstantiation=*/true); 13112 return ExprError(); 13113 } 13114 13115 // Copy the LSI before ActOnFinishFunctionBody removes it. 13116 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13117 // the call operator. 13118 auto LSICopy = *LSI; 13119 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13120 /*IsInstantiation*/ true); 13121 SavedContext.pop(); 13122 13123 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13124 &LSICopy); 13125 } 13126 13127 template<typename Derived> 13128 StmtResult 13129 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13130 return TransformStmt(S); 13131 } 13132 13133 template<typename Derived> 13134 StmtResult 13135 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13136 // Transform captures. 13137 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13138 CEnd = E->capture_end(); 13139 C != CEnd; ++C) { 13140 // When we hit the first implicit capture, tell Sema that we've finished 13141 // the list of explicit captures. 13142 if (!C->isImplicit()) 13143 continue; 13144 13145 // Capturing 'this' is trivial. 13146 if (C->capturesThis()) { 13147 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13148 /*BuildAndDiagnose*/ true, nullptr, 13149 C->getCaptureKind() == LCK_StarThis); 13150 continue; 13151 } 13152 // Captured expression will be recaptured during captured variables 13153 // rebuilding. 13154 if (C->capturesVLAType()) 13155 continue; 13156 13157 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13158 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13159 13160 // Transform the captured variable. 13161 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13162 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13163 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13164 return StmtError(); 13165 13166 // Capture the transformed variable. 13167 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13168 } 13169 13170 return S; 13171 } 13172 13173 template<typename Derived> 13174 ExprResult 13175 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13176 CXXUnresolvedConstructExpr *E) { 13177 TypeSourceInfo *T = 13178 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13179 if (!T) 13180 return ExprError(); 13181 13182 bool ArgumentChanged = false; 13183 SmallVector<Expr*, 8> Args; 13184 Args.reserve(E->getNumArgs()); 13185 { 13186 EnterExpressionEvaluationContext Context( 13187 getSema(), EnterExpressionEvaluationContext::InitList, 13188 E->isListInitialization()); 13189 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13190 &ArgumentChanged)) 13191 return ExprError(); 13192 } 13193 13194 if (!getDerived().AlwaysRebuild() && 13195 T == E->getTypeSourceInfo() && 13196 !ArgumentChanged) 13197 return E; 13198 13199 // FIXME: we're faking the locations of the commas 13200 return getDerived().RebuildCXXUnresolvedConstructExpr( 13201 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13202 } 13203 13204 template<typename Derived> 13205 ExprResult 13206 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13207 CXXDependentScopeMemberExpr *E) { 13208 // Transform the base of the expression. 13209 ExprResult Base((Expr*) nullptr); 13210 Expr *OldBase; 13211 QualType BaseType; 13212 QualType ObjectType; 13213 if (!E->isImplicitAccess()) { 13214 OldBase = E->getBase(); 13215 Base = getDerived().TransformExpr(OldBase); 13216 if (Base.isInvalid()) 13217 return ExprError(); 13218 13219 // Start the member reference and compute the object's type. 13220 ParsedType ObjectTy; 13221 bool MayBePseudoDestructor = false; 13222 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13223 E->getOperatorLoc(), 13224 E->isArrow()? tok::arrow : tok::period, 13225 ObjectTy, 13226 MayBePseudoDestructor); 13227 if (Base.isInvalid()) 13228 return ExprError(); 13229 13230 ObjectType = ObjectTy.get(); 13231 BaseType = ((Expr*) Base.get())->getType(); 13232 } else { 13233 OldBase = nullptr; 13234 BaseType = getDerived().TransformType(E->getBaseType()); 13235 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13236 } 13237 13238 // Transform the first part of the nested-name-specifier that qualifies 13239 // the member name. 13240 NamedDecl *FirstQualifierInScope 13241 = getDerived().TransformFirstQualifierInScope( 13242 E->getFirstQualifierFoundInScope(), 13243 E->getQualifierLoc().getBeginLoc()); 13244 13245 NestedNameSpecifierLoc QualifierLoc; 13246 if (E->getQualifier()) { 13247 QualifierLoc 13248 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13249 ObjectType, 13250 FirstQualifierInScope); 13251 if (!QualifierLoc) 13252 return ExprError(); 13253 } 13254 13255 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13256 13257 // TODO: If this is a conversion-function-id, verify that the 13258 // destination type name (if present) resolves the same way after 13259 // instantiation as it did in the local scope. 13260 13261 DeclarationNameInfo NameInfo 13262 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13263 if (!NameInfo.getName()) 13264 return ExprError(); 13265 13266 if (!E->hasExplicitTemplateArgs()) { 13267 // This is a reference to a member without an explicitly-specified 13268 // template argument list. Optimize for this common case. 13269 if (!getDerived().AlwaysRebuild() && 13270 Base.get() == OldBase && 13271 BaseType == E->getBaseType() && 13272 QualifierLoc == E->getQualifierLoc() && 13273 NameInfo.getName() == E->getMember() && 13274 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13275 return E; 13276 13277 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13278 BaseType, 13279 E->isArrow(), 13280 E->getOperatorLoc(), 13281 QualifierLoc, 13282 TemplateKWLoc, 13283 FirstQualifierInScope, 13284 NameInfo, 13285 /*TemplateArgs*/nullptr); 13286 } 13287 13288 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13289 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13290 E->getNumTemplateArgs(), 13291 TransArgs)) 13292 return ExprError(); 13293 13294 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13295 BaseType, 13296 E->isArrow(), 13297 E->getOperatorLoc(), 13298 QualifierLoc, 13299 TemplateKWLoc, 13300 FirstQualifierInScope, 13301 NameInfo, 13302 &TransArgs); 13303 } 13304 13305 template <typename Derived> 13306 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13307 UnresolvedMemberExpr *Old) { 13308 // Transform the base of the expression. 13309 ExprResult Base((Expr *)nullptr); 13310 QualType BaseType; 13311 if (!Old->isImplicitAccess()) { 13312 Base = getDerived().TransformExpr(Old->getBase()); 13313 if (Base.isInvalid()) 13314 return ExprError(); 13315 Base = 13316 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13317 if (Base.isInvalid()) 13318 return ExprError(); 13319 BaseType = Base.get()->getType(); 13320 } else { 13321 BaseType = getDerived().TransformType(Old->getBaseType()); 13322 } 13323 13324 NestedNameSpecifierLoc QualifierLoc; 13325 if (Old->getQualifierLoc()) { 13326 QualifierLoc = 13327 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13328 if (!QualifierLoc) 13329 return ExprError(); 13330 } 13331 13332 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13333 13334 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13335 13336 // Transform the declaration set. 13337 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13338 return ExprError(); 13339 13340 // Determine the naming class. 13341 if (Old->getNamingClass()) { 13342 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13343 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13344 if (!NamingClass) 13345 return ExprError(); 13346 13347 R.setNamingClass(NamingClass); 13348 } 13349 13350 TemplateArgumentListInfo TransArgs; 13351 if (Old->hasExplicitTemplateArgs()) { 13352 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13353 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13354 if (getDerived().TransformTemplateArguments( 13355 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13356 return ExprError(); 13357 } 13358 13359 // FIXME: to do this check properly, we will need to preserve the 13360 // first-qualifier-in-scope here, just in case we had a dependent 13361 // base (and therefore couldn't do the check) and a 13362 // nested-name-qualifier (and therefore could do the lookup). 13363 NamedDecl *FirstQualifierInScope = nullptr; 13364 13365 return getDerived().RebuildUnresolvedMemberExpr( 13366 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13367 TemplateKWLoc, FirstQualifierInScope, R, 13368 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13369 } 13370 13371 template<typename Derived> 13372 ExprResult 13373 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13374 EnterExpressionEvaluationContext Unevaluated( 13375 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13376 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13377 if (SubExpr.isInvalid()) 13378 return ExprError(); 13379 13380 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13381 return E; 13382 13383 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13384 } 13385 13386 template<typename Derived> 13387 ExprResult 13388 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13389 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13390 if (Pattern.isInvalid()) 13391 return ExprError(); 13392 13393 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13394 return E; 13395 13396 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13397 E->getNumExpansions()); 13398 } 13399 13400 template<typename Derived> 13401 ExprResult 13402 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13403 // If E is not value-dependent, then nothing will change when we transform it. 13404 // Note: This is an instantiation-centric view. 13405 if (!E->isValueDependent()) 13406 return E; 13407 13408 EnterExpressionEvaluationContext Unevaluated( 13409 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13410 13411 ArrayRef<TemplateArgument> PackArgs; 13412 TemplateArgument ArgStorage; 13413 13414 // Find the argument list to transform. 13415 if (E->isPartiallySubstituted()) { 13416 PackArgs = E->getPartialArguments(); 13417 } else if (E->isValueDependent()) { 13418 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13419 bool ShouldExpand = false; 13420 bool RetainExpansion = false; 13421 Optional<unsigned> NumExpansions; 13422 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13423 Unexpanded, 13424 ShouldExpand, RetainExpansion, 13425 NumExpansions)) 13426 return ExprError(); 13427 13428 // If we need to expand the pack, build a template argument from it and 13429 // expand that. 13430 if (ShouldExpand) { 13431 auto *Pack = E->getPack(); 13432 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13433 ArgStorage = getSema().Context.getPackExpansionType( 13434 getSema().Context.getTypeDeclType(TTPD), None); 13435 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13436 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13437 } else { 13438 auto *VD = cast<ValueDecl>(Pack); 13439 ExprResult DRE = getSema().BuildDeclRefExpr( 13440 VD, VD->getType().getNonLValueExprType(getSema().Context), 13441 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 13442 E->getPackLoc()); 13443 if (DRE.isInvalid()) 13444 return ExprError(); 13445 ArgStorage = new (getSema().Context) PackExpansionExpr( 13446 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13447 } 13448 PackArgs = ArgStorage; 13449 } 13450 } 13451 13452 // If we're not expanding the pack, just transform the decl. 13453 if (!PackArgs.size()) { 13454 auto *Pack = cast_or_null<NamedDecl>( 13455 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13456 if (!Pack) 13457 return ExprError(); 13458 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13459 E->getPackLoc(), 13460 E->getRParenLoc(), None, None); 13461 } 13462 13463 // Try to compute the result without performing a partial substitution. 13464 Optional<unsigned> Result = 0; 13465 for (const TemplateArgument &Arg : PackArgs) { 13466 if (!Arg.isPackExpansion()) { 13467 Result = *Result + 1; 13468 continue; 13469 } 13470 13471 TemplateArgumentLoc ArgLoc; 13472 InventTemplateArgumentLoc(Arg, ArgLoc); 13473 13474 // Find the pattern of the pack expansion. 13475 SourceLocation Ellipsis; 13476 Optional<unsigned> OrigNumExpansions; 13477 TemplateArgumentLoc Pattern = 13478 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13479 OrigNumExpansions); 13480 13481 // Substitute under the pack expansion. Do not expand the pack (yet). 13482 TemplateArgumentLoc OutPattern; 13483 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13484 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13485 /*Uneval*/ true)) 13486 return true; 13487 13488 // See if we can determine the number of arguments from the result. 13489 Optional<unsigned> NumExpansions = 13490 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13491 if (!NumExpansions) { 13492 // No: we must be in an alias template expansion, and we're going to need 13493 // to actually expand the packs. 13494 Result = None; 13495 break; 13496 } 13497 13498 Result = *Result + *NumExpansions; 13499 } 13500 13501 // Common case: we could determine the number of expansions without 13502 // substituting. 13503 if (Result) 13504 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13505 E->getPackLoc(), 13506 E->getRParenLoc(), *Result, None); 13507 13508 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13509 E->getPackLoc()); 13510 { 13511 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13512 typedef TemplateArgumentLocInventIterator< 13513 Derived, const TemplateArgument*> PackLocIterator; 13514 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13515 PackLocIterator(*this, PackArgs.end()), 13516 TransformedPackArgs, /*Uneval*/true)) 13517 return ExprError(); 13518 } 13519 13520 // Check whether we managed to fully-expand the pack. 13521 // FIXME: Is it possible for us to do so and not hit the early exit path? 13522 SmallVector<TemplateArgument, 8> Args; 13523 bool PartialSubstitution = false; 13524 for (auto &Loc : TransformedPackArgs.arguments()) { 13525 Args.push_back(Loc.getArgument()); 13526 if (Loc.getArgument().isPackExpansion()) 13527 PartialSubstitution = true; 13528 } 13529 13530 if (PartialSubstitution) 13531 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13532 E->getPackLoc(), 13533 E->getRParenLoc(), None, Args); 13534 13535 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13536 E->getPackLoc(), E->getRParenLoc(), 13537 Args.size(), None); 13538 } 13539 13540 template<typename Derived> 13541 ExprResult 13542 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13543 SubstNonTypeTemplateParmPackExpr *E) { 13544 // Default behavior is to do nothing with this transformation. 13545 return E; 13546 } 13547 13548 template<typename Derived> 13549 ExprResult 13550 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13551 SubstNonTypeTemplateParmExpr *E) { 13552 // Default behavior is to do nothing with this transformation. 13553 return E; 13554 } 13555 13556 template<typename Derived> 13557 ExprResult 13558 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13559 // Default behavior is to do nothing with this transformation. 13560 return E; 13561 } 13562 13563 template<typename Derived> 13564 ExprResult 13565 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13566 MaterializeTemporaryExpr *E) { 13567 return getDerived().TransformExpr(E->getSubExpr()); 13568 } 13569 13570 template<typename Derived> 13571 ExprResult 13572 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13573 UnresolvedLookupExpr *Callee = nullptr; 13574 if (Expr *OldCallee = E->getCallee()) { 13575 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13576 if (CalleeResult.isInvalid()) 13577 return ExprError(); 13578 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13579 } 13580 13581 Expr *Pattern = E->getPattern(); 13582 13583 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13584 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13585 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13586 13587 // Determine whether the set of unexpanded parameter packs can and should 13588 // be expanded. 13589 bool Expand = true; 13590 bool RetainExpansion = false; 13591 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13592 NumExpansions = OrigNumExpansions; 13593 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13594 Pattern->getSourceRange(), 13595 Unexpanded, 13596 Expand, RetainExpansion, 13597 NumExpansions)) 13598 return true; 13599 13600 if (!Expand) { 13601 // Do not expand any packs here, just transform and rebuild a fold 13602 // expression. 13603 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13604 13605 ExprResult LHS = 13606 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13607 if (LHS.isInvalid()) 13608 return true; 13609 13610 ExprResult RHS = 13611 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13612 if (RHS.isInvalid()) 13613 return true; 13614 13615 if (!getDerived().AlwaysRebuild() && 13616 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13617 return E; 13618 13619 return getDerived().RebuildCXXFoldExpr( 13620 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13621 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13622 } 13623 13624 // Formally a fold expression expands to nested parenthesized expressions. 13625 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13626 // them. 13627 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13628 SemaRef.Diag(E->getEllipsisLoc(), 13629 clang::diag::err_fold_expression_limit_exceeded) 13630 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13631 << E->getSourceRange(); 13632 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13633 return ExprError(); 13634 } 13635 13636 // The transform has determined that we should perform an elementwise 13637 // expansion of the pattern. Do so. 13638 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13639 if (Result.isInvalid()) 13640 return true; 13641 bool LeftFold = E->isLeftFold(); 13642 13643 // If we're retaining an expansion for a right fold, it is the innermost 13644 // component and takes the init (if any). 13645 if (!LeftFold && RetainExpansion) { 13646 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13647 13648 ExprResult Out = getDerived().TransformExpr(Pattern); 13649 if (Out.isInvalid()) 13650 return true; 13651 13652 Result = getDerived().RebuildCXXFoldExpr( 13653 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13654 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13655 if (Result.isInvalid()) 13656 return true; 13657 } 13658 13659 for (unsigned I = 0; I != *NumExpansions; ++I) { 13660 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13661 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13662 ExprResult Out = getDerived().TransformExpr(Pattern); 13663 if (Out.isInvalid()) 13664 return true; 13665 13666 if (Out.get()->containsUnexpandedParameterPack()) { 13667 // We still have a pack; retain a pack expansion for this slice. 13668 Result = getDerived().RebuildCXXFoldExpr( 13669 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13670 E->getOperator(), E->getEllipsisLoc(), 13671 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13672 OrigNumExpansions); 13673 } else if (Result.isUsable()) { 13674 // We've got down to a single element; build a binary operator. 13675 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13676 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13677 if (Callee) 13678 Result = getDerived().RebuildCXXOperatorCallExpr( 13679 BinaryOperator::getOverloadedOperator(E->getOperator()), 13680 E->getEllipsisLoc(), Callee, LHS, RHS); 13681 else 13682 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13683 E->getOperator(), LHS, RHS); 13684 } else 13685 Result = Out; 13686 13687 if (Result.isInvalid()) 13688 return true; 13689 } 13690 13691 // If we're retaining an expansion for a left fold, it is the outermost 13692 // component and takes the complete expansion so far as its init (if any). 13693 if (LeftFold && RetainExpansion) { 13694 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13695 13696 ExprResult Out = getDerived().TransformExpr(Pattern); 13697 if (Out.isInvalid()) 13698 return true; 13699 13700 Result = getDerived().RebuildCXXFoldExpr( 13701 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13702 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13703 if (Result.isInvalid()) 13704 return true; 13705 } 13706 13707 // If we had no init and an empty pack, and we're not retaining an expansion, 13708 // then produce a fallback value or error. 13709 if (Result.isUnset()) 13710 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13711 E->getOperator()); 13712 13713 return Result; 13714 } 13715 13716 template<typename Derived> 13717 ExprResult 13718 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13719 CXXStdInitializerListExpr *E) { 13720 return getDerived().TransformExpr(E->getSubExpr()); 13721 } 13722 13723 template<typename Derived> 13724 ExprResult 13725 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13726 return SemaRef.MaybeBindToTemporary(E); 13727 } 13728 13729 template<typename Derived> 13730 ExprResult 13731 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13732 return E; 13733 } 13734 13735 template<typename Derived> 13736 ExprResult 13737 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13738 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13739 if (SubExpr.isInvalid()) 13740 return ExprError(); 13741 13742 if (!getDerived().AlwaysRebuild() && 13743 SubExpr.get() == E->getSubExpr()) 13744 return E; 13745 13746 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13747 } 13748 13749 template<typename Derived> 13750 ExprResult 13751 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13752 // Transform each of the elements. 13753 SmallVector<Expr *, 8> Elements; 13754 bool ArgChanged = false; 13755 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13756 /*IsCall=*/false, Elements, &ArgChanged)) 13757 return ExprError(); 13758 13759 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13760 return SemaRef.MaybeBindToTemporary(E); 13761 13762 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13763 Elements.data(), 13764 Elements.size()); 13765 } 13766 13767 template<typename Derived> 13768 ExprResult 13769 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13770 ObjCDictionaryLiteral *E) { 13771 // Transform each of the elements. 13772 SmallVector<ObjCDictionaryElement, 8> Elements; 13773 bool ArgChanged = false; 13774 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13775 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13776 13777 if (OrigElement.isPackExpansion()) { 13778 // This key/value element is a pack expansion. 13779 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13780 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13781 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13782 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13783 13784 // Determine whether the set of unexpanded parameter packs can 13785 // and should be expanded. 13786 bool Expand = true; 13787 bool RetainExpansion = false; 13788 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13789 Optional<unsigned> NumExpansions = OrigNumExpansions; 13790 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13791 OrigElement.Value->getEndLoc()); 13792 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13793 PatternRange, Unexpanded, Expand, 13794 RetainExpansion, NumExpansions)) 13795 return ExprError(); 13796 13797 if (!Expand) { 13798 // The transform has determined that we should perform a simple 13799 // transformation on the pack expansion, producing another pack 13800 // expansion. 13801 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13802 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13803 if (Key.isInvalid()) 13804 return ExprError(); 13805 13806 if (Key.get() != OrigElement.Key) 13807 ArgChanged = true; 13808 13809 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13810 if (Value.isInvalid()) 13811 return ExprError(); 13812 13813 if (Value.get() != OrigElement.Value) 13814 ArgChanged = true; 13815 13816 ObjCDictionaryElement Expansion = { 13817 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13818 }; 13819 Elements.push_back(Expansion); 13820 continue; 13821 } 13822 13823 // Record right away that the argument was changed. This needs 13824 // to happen even if the array expands to nothing. 13825 ArgChanged = true; 13826 13827 // The transform has determined that we should perform an elementwise 13828 // expansion of the pattern. Do so. 13829 for (unsigned I = 0; I != *NumExpansions; ++I) { 13830 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13831 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13832 if (Key.isInvalid()) 13833 return ExprError(); 13834 13835 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13836 if (Value.isInvalid()) 13837 return ExprError(); 13838 13839 ObjCDictionaryElement Element = { 13840 Key.get(), Value.get(), SourceLocation(), NumExpansions 13841 }; 13842 13843 // If any unexpanded parameter packs remain, we still have a 13844 // pack expansion. 13845 // FIXME: Can this really happen? 13846 if (Key.get()->containsUnexpandedParameterPack() || 13847 Value.get()->containsUnexpandedParameterPack()) 13848 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13849 13850 Elements.push_back(Element); 13851 } 13852 13853 // FIXME: Retain a pack expansion if RetainExpansion is true. 13854 13855 // We've finished with this pack expansion. 13856 continue; 13857 } 13858 13859 // Transform and check key. 13860 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13861 if (Key.isInvalid()) 13862 return ExprError(); 13863 13864 if (Key.get() != OrigElement.Key) 13865 ArgChanged = true; 13866 13867 // Transform and check value. 13868 ExprResult Value 13869 = getDerived().TransformExpr(OrigElement.Value); 13870 if (Value.isInvalid()) 13871 return ExprError(); 13872 13873 if (Value.get() != OrigElement.Value) 13874 ArgChanged = true; 13875 13876 ObjCDictionaryElement Element = { 13877 Key.get(), Value.get(), SourceLocation(), None 13878 }; 13879 Elements.push_back(Element); 13880 } 13881 13882 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13883 return SemaRef.MaybeBindToTemporary(E); 13884 13885 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13886 Elements); 13887 } 13888 13889 template<typename Derived> 13890 ExprResult 13891 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13892 TypeSourceInfo *EncodedTypeInfo 13893 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13894 if (!EncodedTypeInfo) 13895 return ExprError(); 13896 13897 if (!getDerived().AlwaysRebuild() && 13898 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13899 return E; 13900 13901 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13902 EncodedTypeInfo, 13903 E->getRParenLoc()); 13904 } 13905 13906 template<typename Derived> 13907 ExprResult TreeTransform<Derived>:: 13908 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13909 // This is a kind of implicit conversion, and it needs to get dropped 13910 // and recomputed for the same general reasons that ImplicitCastExprs 13911 // do, as well a more specific one: this expression is only valid when 13912 // it appears *immediately* as an argument expression. 13913 return getDerived().TransformExpr(E->getSubExpr()); 13914 } 13915 13916 template<typename Derived> 13917 ExprResult TreeTransform<Derived>:: 13918 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13919 TypeSourceInfo *TSInfo 13920 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13921 if (!TSInfo) 13922 return ExprError(); 13923 13924 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13925 if (Result.isInvalid()) 13926 return ExprError(); 13927 13928 if (!getDerived().AlwaysRebuild() && 13929 TSInfo == E->getTypeInfoAsWritten() && 13930 Result.get() == E->getSubExpr()) 13931 return E; 13932 13933 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13934 E->getBridgeKeywordLoc(), TSInfo, 13935 Result.get()); 13936 } 13937 13938 template <typename Derived> 13939 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13940 ObjCAvailabilityCheckExpr *E) { 13941 return E; 13942 } 13943 13944 template<typename Derived> 13945 ExprResult 13946 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13947 // Transform arguments. 13948 bool ArgChanged = false; 13949 SmallVector<Expr*, 8> Args; 13950 Args.reserve(E->getNumArgs()); 13951 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13952 &ArgChanged)) 13953 return ExprError(); 13954 13955 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13956 // Class message: transform the receiver type. 13957 TypeSourceInfo *ReceiverTypeInfo 13958 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13959 if (!ReceiverTypeInfo) 13960 return ExprError(); 13961 13962 // If nothing changed, just retain the existing message send. 13963 if (!getDerived().AlwaysRebuild() && 13964 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13965 return SemaRef.MaybeBindToTemporary(E); 13966 13967 // Build a new class message send. 13968 SmallVector<SourceLocation, 16> SelLocs; 13969 E->getSelectorLocs(SelLocs); 13970 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13971 E->getSelector(), 13972 SelLocs, 13973 E->getMethodDecl(), 13974 E->getLeftLoc(), 13975 Args, 13976 E->getRightLoc()); 13977 } 13978 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13979 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13980 if (!E->getMethodDecl()) 13981 return ExprError(); 13982 13983 // Build a new class message send to 'super'. 13984 SmallVector<SourceLocation, 16> SelLocs; 13985 E->getSelectorLocs(SelLocs); 13986 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13987 E->getSelector(), 13988 SelLocs, 13989 E->getReceiverType(), 13990 E->getMethodDecl(), 13991 E->getLeftLoc(), 13992 Args, 13993 E->getRightLoc()); 13994 } 13995 13996 // Instance message: transform the receiver 13997 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13998 "Only class and instance messages may be instantiated"); 13999 ExprResult Receiver 14000 = getDerived().TransformExpr(E->getInstanceReceiver()); 14001 if (Receiver.isInvalid()) 14002 return ExprError(); 14003 14004 // If nothing changed, just retain the existing message send. 14005 if (!getDerived().AlwaysRebuild() && 14006 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 14007 return SemaRef.MaybeBindToTemporary(E); 14008 14009 // Build a new instance message send. 14010 SmallVector<SourceLocation, 16> SelLocs; 14011 E->getSelectorLocs(SelLocs); 14012 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 14013 E->getSelector(), 14014 SelLocs, 14015 E->getMethodDecl(), 14016 E->getLeftLoc(), 14017 Args, 14018 E->getRightLoc()); 14019 } 14020 14021 template<typename Derived> 14022 ExprResult 14023 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 14024 return E; 14025 } 14026 14027 template<typename Derived> 14028 ExprResult 14029 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 14030 return E; 14031 } 14032 14033 template<typename Derived> 14034 ExprResult 14035 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 14036 // Transform the base expression. 14037 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14038 if (Base.isInvalid()) 14039 return ExprError(); 14040 14041 // We don't need to transform the ivar; it will never change. 14042 14043 // If nothing changed, just retain the existing expression. 14044 if (!getDerived().AlwaysRebuild() && 14045 Base.get() == E->getBase()) 14046 return E; 14047 14048 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 14049 E->getLocation(), 14050 E->isArrow(), E->isFreeIvar()); 14051 } 14052 14053 template<typename Derived> 14054 ExprResult 14055 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 14056 // 'super' and types never change. Property never changes. Just 14057 // retain the existing expression. 14058 if (!E->isObjectReceiver()) 14059 return E; 14060 14061 // Transform the base expression. 14062 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14063 if (Base.isInvalid()) 14064 return ExprError(); 14065 14066 // We don't need to transform the property; it will never change. 14067 14068 // If nothing changed, just retain the existing expression. 14069 if (!getDerived().AlwaysRebuild() && 14070 Base.get() == E->getBase()) 14071 return E; 14072 14073 if (E->isExplicitProperty()) 14074 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14075 E->getExplicitProperty(), 14076 E->getLocation()); 14077 14078 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14079 SemaRef.Context.PseudoObjectTy, 14080 E->getImplicitPropertyGetter(), 14081 E->getImplicitPropertySetter(), 14082 E->getLocation()); 14083 } 14084 14085 template<typename Derived> 14086 ExprResult 14087 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14088 // Transform the base expression. 14089 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14090 if (Base.isInvalid()) 14091 return ExprError(); 14092 14093 // Transform the key expression. 14094 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14095 if (Key.isInvalid()) 14096 return ExprError(); 14097 14098 // If nothing changed, just retain the existing expression. 14099 if (!getDerived().AlwaysRebuild() && 14100 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14101 return E; 14102 14103 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14104 Base.get(), Key.get(), 14105 E->getAtIndexMethodDecl(), 14106 E->setAtIndexMethodDecl()); 14107 } 14108 14109 template<typename Derived> 14110 ExprResult 14111 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14112 // Transform the base expression. 14113 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14114 if (Base.isInvalid()) 14115 return ExprError(); 14116 14117 // If nothing changed, just retain the existing expression. 14118 if (!getDerived().AlwaysRebuild() && 14119 Base.get() == E->getBase()) 14120 return E; 14121 14122 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14123 E->getOpLoc(), 14124 E->isArrow()); 14125 } 14126 14127 template<typename Derived> 14128 ExprResult 14129 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14130 bool ArgumentChanged = false; 14131 SmallVector<Expr*, 8> SubExprs; 14132 SubExprs.reserve(E->getNumSubExprs()); 14133 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14134 SubExprs, &ArgumentChanged)) 14135 return ExprError(); 14136 14137 if (!getDerived().AlwaysRebuild() && 14138 !ArgumentChanged) 14139 return E; 14140 14141 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14142 SubExprs, 14143 E->getRParenLoc()); 14144 } 14145 14146 template<typename Derived> 14147 ExprResult 14148 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14149 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14150 if (SrcExpr.isInvalid()) 14151 return ExprError(); 14152 14153 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14154 if (!Type) 14155 return ExprError(); 14156 14157 if (!getDerived().AlwaysRebuild() && 14158 Type == E->getTypeSourceInfo() && 14159 SrcExpr.get() == E->getSrcExpr()) 14160 return E; 14161 14162 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14163 SrcExpr.get(), Type, 14164 E->getRParenLoc()); 14165 } 14166 14167 template<typename Derived> 14168 ExprResult 14169 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14170 BlockDecl *oldBlock = E->getBlockDecl(); 14171 14172 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14173 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14174 14175 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14176 blockScope->TheDecl->setBlockMissingReturnType( 14177 oldBlock->blockMissingReturnType()); 14178 14179 SmallVector<ParmVarDecl*, 4> params; 14180 SmallVector<QualType, 4> paramTypes; 14181 14182 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14183 14184 // Parameter substitution. 14185 Sema::ExtParameterInfoBuilder extParamInfos; 14186 if (getDerived().TransformFunctionTypeParams( 14187 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14188 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14189 extParamInfos)) { 14190 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14191 return ExprError(); 14192 } 14193 14194 QualType exprResultType = 14195 getDerived().TransformType(exprFunctionType->getReturnType()); 14196 14197 auto epi = exprFunctionType->getExtProtoInfo(); 14198 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14199 14200 QualType functionType = 14201 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14202 blockScope->FunctionType = functionType; 14203 14204 // Set the parameters on the block decl. 14205 if (!params.empty()) 14206 blockScope->TheDecl->setParams(params); 14207 14208 if (!oldBlock->blockMissingReturnType()) { 14209 blockScope->HasImplicitReturnType = false; 14210 blockScope->ReturnType = exprResultType; 14211 } 14212 14213 // Transform the body 14214 StmtResult body = getDerived().TransformStmt(E->getBody()); 14215 if (body.isInvalid()) { 14216 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14217 return ExprError(); 14218 } 14219 14220 #ifndef NDEBUG 14221 // In builds with assertions, make sure that we captured everything we 14222 // captured before. 14223 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14224 for (const auto &I : oldBlock->captures()) { 14225 VarDecl *oldCapture = I.getVariable(); 14226 14227 // Ignore parameter packs. 14228 if (oldCapture->isParameterPack()) 14229 continue; 14230 14231 VarDecl *newCapture = 14232 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14233 oldCapture)); 14234 assert(blockScope->CaptureMap.count(newCapture)); 14235 } 14236 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14237 } 14238 #endif 14239 14240 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14241 /*Scope=*/nullptr); 14242 } 14243 14244 template<typename Derived> 14245 ExprResult 14246 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14247 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14248 if (SrcExpr.isInvalid()) 14249 return ExprError(); 14250 14251 QualType Type = getDerived().TransformType(E->getType()); 14252 14253 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14254 E->getRParenLoc()); 14255 } 14256 14257 template<typename Derived> 14258 ExprResult 14259 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14260 bool ArgumentChanged = false; 14261 SmallVector<Expr*, 8> SubExprs; 14262 SubExprs.reserve(E->getNumSubExprs()); 14263 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14264 SubExprs, &ArgumentChanged)) 14265 return ExprError(); 14266 14267 if (!getDerived().AlwaysRebuild() && 14268 !ArgumentChanged) 14269 return E; 14270 14271 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14272 E->getOp(), E->getRParenLoc()); 14273 } 14274 14275 //===----------------------------------------------------------------------===// 14276 // Type reconstruction 14277 //===----------------------------------------------------------------------===// 14278 14279 template<typename Derived> 14280 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14281 SourceLocation Star) { 14282 return SemaRef.BuildPointerType(PointeeType, Star, 14283 getDerived().getBaseEntity()); 14284 } 14285 14286 template<typename Derived> 14287 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14288 SourceLocation Star) { 14289 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14290 getDerived().getBaseEntity()); 14291 } 14292 14293 template<typename Derived> 14294 QualType 14295 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14296 bool WrittenAsLValue, 14297 SourceLocation Sigil) { 14298 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14299 Sigil, getDerived().getBaseEntity()); 14300 } 14301 14302 template<typename Derived> 14303 QualType 14304 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14305 QualType ClassType, 14306 SourceLocation Sigil) { 14307 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14308 getDerived().getBaseEntity()); 14309 } 14310 14311 template<typename Derived> 14312 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14313 const ObjCTypeParamDecl *Decl, 14314 SourceLocation ProtocolLAngleLoc, 14315 ArrayRef<ObjCProtocolDecl *> Protocols, 14316 ArrayRef<SourceLocation> ProtocolLocs, 14317 SourceLocation ProtocolRAngleLoc) { 14318 return SemaRef.BuildObjCTypeParamType(Decl, 14319 ProtocolLAngleLoc, Protocols, 14320 ProtocolLocs, ProtocolRAngleLoc, 14321 /*FailOnError=*/true); 14322 } 14323 14324 template<typename Derived> 14325 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14326 QualType BaseType, 14327 SourceLocation Loc, 14328 SourceLocation TypeArgsLAngleLoc, 14329 ArrayRef<TypeSourceInfo *> TypeArgs, 14330 SourceLocation TypeArgsRAngleLoc, 14331 SourceLocation ProtocolLAngleLoc, 14332 ArrayRef<ObjCProtocolDecl *> Protocols, 14333 ArrayRef<SourceLocation> ProtocolLocs, 14334 SourceLocation ProtocolRAngleLoc) { 14335 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14336 TypeArgs, TypeArgsRAngleLoc, 14337 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14338 ProtocolRAngleLoc, 14339 /*FailOnError=*/true); 14340 } 14341 14342 template<typename Derived> 14343 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14344 QualType PointeeType, 14345 SourceLocation Star) { 14346 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14347 } 14348 14349 template<typename Derived> 14350 QualType 14351 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14352 ArrayType::ArraySizeModifier SizeMod, 14353 const llvm::APInt *Size, 14354 Expr *SizeExpr, 14355 unsigned IndexTypeQuals, 14356 SourceRange BracketsRange) { 14357 if (SizeExpr || !Size) 14358 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14359 IndexTypeQuals, BracketsRange, 14360 getDerived().getBaseEntity()); 14361 14362 QualType Types[] = { 14363 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14364 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14365 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14366 }; 14367 const unsigned NumTypes = llvm::array_lengthof(Types); 14368 QualType SizeType; 14369 for (unsigned I = 0; I != NumTypes; ++I) 14370 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14371 SizeType = Types[I]; 14372 break; 14373 } 14374 14375 // Note that we can return a VariableArrayType here in the case where 14376 // the element type was a dependent VariableArrayType. 14377 IntegerLiteral *ArraySize 14378 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14379 /*FIXME*/BracketsRange.getBegin()); 14380 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14381 IndexTypeQuals, BracketsRange, 14382 getDerived().getBaseEntity()); 14383 } 14384 14385 template<typename Derived> 14386 QualType 14387 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14388 ArrayType::ArraySizeModifier SizeMod, 14389 const llvm::APInt &Size, 14390 Expr *SizeExpr, 14391 unsigned IndexTypeQuals, 14392 SourceRange BracketsRange) { 14393 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14394 IndexTypeQuals, BracketsRange); 14395 } 14396 14397 template<typename Derived> 14398 QualType 14399 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14400 ArrayType::ArraySizeModifier SizeMod, 14401 unsigned IndexTypeQuals, 14402 SourceRange BracketsRange) { 14403 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14404 IndexTypeQuals, BracketsRange); 14405 } 14406 14407 template<typename Derived> 14408 QualType 14409 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14410 ArrayType::ArraySizeModifier SizeMod, 14411 Expr *SizeExpr, 14412 unsigned IndexTypeQuals, 14413 SourceRange BracketsRange) { 14414 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14415 SizeExpr, 14416 IndexTypeQuals, BracketsRange); 14417 } 14418 14419 template<typename Derived> 14420 QualType 14421 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14422 ArrayType::ArraySizeModifier SizeMod, 14423 Expr *SizeExpr, 14424 unsigned IndexTypeQuals, 14425 SourceRange BracketsRange) { 14426 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14427 SizeExpr, 14428 IndexTypeQuals, BracketsRange); 14429 } 14430 14431 template <typename Derived> 14432 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14433 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14434 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14435 AttributeLoc); 14436 } 14437 14438 template <typename Derived> 14439 QualType 14440 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14441 unsigned NumElements, 14442 VectorType::VectorKind VecKind) { 14443 // FIXME: semantic checking! 14444 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14445 } 14446 14447 template <typename Derived> 14448 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14449 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14450 VectorType::VectorKind VecKind) { 14451 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14452 } 14453 14454 template<typename Derived> 14455 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14456 unsigned NumElements, 14457 SourceLocation AttributeLoc) { 14458 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14459 NumElements, true); 14460 IntegerLiteral *VectorSize 14461 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14462 AttributeLoc); 14463 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14464 } 14465 14466 template<typename Derived> 14467 QualType 14468 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14469 Expr *SizeExpr, 14470 SourceLocation AttributeLoc) { 14471 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14472 } 14473 14474 template <typename Derived> 14475 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14476 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14477 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14478 NumColumns); 14479 } 14480 14481 template <typename Derived> 14482 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14483 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14484 SourceLocation AttributeLoc) { 14485 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14486 AttributeLoc); 14487 } 14488 14489 template<typename Derived> 14490 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14491 QualType T, 14492 MutableArrayRef<QualType> ParamTypes, 14493 const FunctionProtoType::ExtProtoInfo &EPI) { 14494 return SemaRef.BuildFunctionType(T, ParamTypes, 14495 getDerived().getBaseLocation(), 14496 getDerived().getBaseEntity(), 14497 EPI); 14498 } 14499 14500 template<typename Derived> 14501 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14502 return SemaRef.Context.getFunctionNoProtoType(T); 14503 } 14504 14505 template<typename Derived> 14506 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14507 Decl *D) { 14508 assert(D && "no decl found"); 14509 if (D->isInvalidDecl()) return QualType(); 14510 14511 // FIXME: Doesn't account for ObjCInterfaceDecl! 14512 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14513 // A valid resolved using typename pack expansion decl can have multiple 14514 // UsingDecls, but they must each have exactly one type, and it must be 14515 // the same type in every case. But we must have at least one expansion! 14516 if (UPD->expansions().empty()) { 14517 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14518 << UPD->isCXXClassMember() << UPD; 14519 return QualType(); 14520 } 14521 14522 // We might still have some unresolved types. Try to pick a resolved type 14523 // if we can. The final instantiation will check that the remaining 14524 // unresolved types instantiate to the type we pick. 14525 QualType FallbackT; 14526 QualType T; 14527 for (auto *E : UPD->expansions()) { 14528 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14529 if (ThisT.isNull()) 14530 continue; 14531 else if (ThisT->getAs<UnresolvedUsingType>()) 14532 FallbackT = ThisT; 14533 else if (T.isNull()) 14534 T = ThisT; 14535 else 14536 assert(getSema().Context.hasSameType(ThisT, T) && 14537 "mismatched resolved types in using pack expansion"); 14538 } 14539 return T.isNull() ? FallbackT : T; 14540 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14541 assert(Using->hasTypename() && 14542 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14543 14544 // A valid resolved using typename decl points to exactly one type decl. 14545 assert(++Using->shadow_begin() == Using->shadow_end()); 14546 14547 UsingShadowDecl *Shadow = *Using->shadow_begin(); 14548 if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc)) 14549 return QualType(); 14550 return SemaRef.Context.getUsingType( 14551 Shadow, SemaRef.Context.getTypeDeclType( 14552 cast<TypeDecl>(Shadow->getTargetDecl()))); 14553 } else { 14554 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14555 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14556 return SemaRef.Context.getTypeDeclType( 14557 cast<UnresolvedUsingTypenameDecl>(D)); 14558 } 14559 } 14560 14561 template <typename Derived> 14562 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14563 SourceLocation) { 14564 return SemaRef.BuildTypeofExprType(E); 14565 } 14566 14567 template<typename Derived> 14568 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14569 return SemaRef.Context.getTypeOfType(Underlying); 14570 } 14571 14572 template <typename Derived> 14573 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) { 14574 return SemaRef.BuildDecltypeType(E); 14575 } 14576 14577 template<typename Derived> 14578 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14579 UnaryTransformType::UTTKind UKind, 14580 SourceLocation Loc) { 14581 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14582 } 14583 14584 template<typename Derived> 14585 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14586 TemplateName Template, 14587 SourceLocation TemplateNameLoc, 14588 TemplateArgumentListInfo &TemplateArgs) { 14589 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14590 } 14591 14592 template<typename Derived> 14593 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14594 SourceLocation KWLoc) { 14595 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14596 } 14597 14598 template<typename Derived> 14599 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14600 SourceLocation KWLoc, 14601 bool isReadPipe) { 14602 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14603 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14604 } 14605 14606 template <typename Derived> 14607 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned, 14608 unsigned NumBits, 14609 SourceLocation Loc) { 14610 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14611 NumBits, true); 14612 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14613 SemaRef.Context.IntTy, Loc); 14614 return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc); 14615 } 14616 14617 template <typename Derived> 14618 QualType TreeTransform<Derived>::RebuildDependentBitIntType( 14619 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14620 return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc); 14621 } 14622 14623 template<typename Derived> 14624 TemplateName 14625 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14626 bool TemplateKW, 14627 TemplateDecl *Template) { 14628 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14629 Template); 14630 } 14631 14632 template<typename Derived> 14633 TemplateName 14634 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14635 SourceLocation TemplateKWLoc, 14636 const IdentifierInfo &Name, 14637 SourceLocation NameLoc, 14638 QualType ObjectType, 14639 NamedDecl *FirstQualifierInScope, 14640 bool AllowInjectedClassName) { 14641 UnqualifiedId TemplateName; 14642 TemplateName.setIdentifier(&Name, NameLoc); 14643 Sema::TemplateTy Template; 14644 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14645 TemplateName, ParsedType::make(ObjectType), 14646 /*EnteringContext=*/false, Template, 14647 AllowInjectedClassName); 14648 return Template.get(); 14649 } 14650 14651 template<typename Derived> 14652 TemplateName 14653 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14654 SourceLocation TemplateKWLoc, 14655 OverloadedOperatorKind Operator, 14656 SourceLocation NameLoc, 14657 QualType ObjectType, 14658 bool AllowInjectedClassName) { 14659 UnqualifiedId Name; 14660 // FIXME: Bogus location information. 14661 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14662 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14663 Sema::TemplateTy Template; 14664 getSema().ActOnTemplateName( 14665 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14666 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14667 return Template.get(); 14668 } 14669 14670 template<typename Derived> 14671 ExprResult 14672 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14673 SourceLocation OpLoc, 14674 Expr *OrigCallee, 14675 Expr *First, 14676 Expr *Second) { 14677 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14678 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14679 14680 if (First->getObjectKind() == OK_ObjCProperty) { 14681 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14682 if (BinaryOperator::isAssignmentOp(Opc)) 14683 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14684 First, Second); 14685 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14686 if (Result.isInvalid()) 14687 return ExprError(); 14688 First = Result.get(); 14689 } 14690 14691 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14692 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14693 if (Result.isInvalid()) 14694 return ExprError(); 14695 Second = Result.get(); 14696 } 14697 14698 // Determine whether this should be a builtin operation. 14699 if (Op == OO_Subscript) { 14700 if (!First->getType()->isOverloadableType() && 14701 !Second->getType()->isOverloadableType()) 14702 return getSema().CreateBuiltinArraySubscriptExpr( 14703 First, Callee->getBeginLoc(), Second, OpLoc); 14704 } else if (Op == OO_Arrow) { 14705 // -> is never a builtin operation. 14706 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14707 } else if (Second == nullptr || isPostIncDec) { 14708 if (!First->getType()->isOverloadableType() || 14709 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14710 // The argument is not of overloadable type, or this is an expression 14711 // of the form &Class::member, so try to create a built-in unary 14712 // operation. 14713 UnaryOperatorKind Opc 14714 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14715 14716 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14717 } 14718 } else { 14719 if (!First->getType()->isOverloadableType() && 14720 !Second->getType()->isOverloadableType()) { 14721 // Neither of the arguments is an overloadable type, so try to 14722 // create a built-in binary operation. 14723 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14724 ExprResult Result 14725 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14726 if (Result.isInvalid()) 14727 return ExprError(); 14728 14729 return Result; 14730 } 14731 } 14732 14733 // Compute the transformed set of functions (and function templates) to be 14734 // used during overload resolution. 14735 UnresolvedSet<16> Functions; 14736 bool RequiresADL; 14737 14738 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14739 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14740 // If the overload could not be resolved in the template definition 14741 // (because we had a dependent argument), ADL is performed as part of 14742 // template instantiation. 14743 RequiresADL = ULE->requiresADL(); 14744 } else { 14745 // If we've resolved this to a particular non-member function, just call 14746 // that function. If we resolved it to a member function, 14747 // CreateOverloaded* will find that function for us. 14748 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14749 if (!isa<CXXMethodDecl>(ND)) 14750 Functions.addDecl(ND); 14751 RequiresADL = false; 14752 } 14753 14754 // Add any functions found via argument-dependent lookup. 14755 Expr *Args[2] = { First, Second }; 14756 unsigned NumArgs = 1 + (Second != nullptr); 14757 14758 // Create the overloaded operator invocation for unary operators. 14759 if (NumArgs == 1 || isPostIncDec) { 14760 UnaryOperatorKind Opc 14761 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14762 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14763 RequiresADL); 14764 } 14765 14766 if (Op == OO_Subscript) { 14767 SourceLocation LBrace; 14768 SourceLocation RBrace; 14769 14770 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14771 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14772 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14773 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14774 } else { 14775 LBrace = Callee->getBeginLoc(); 14776 RBrace = OpLoc; 14777 } 14778 14779 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14780 First, Second); 14781 } 14782 14783 // Create the overloaded operator invocation for binary operators. 14784 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14785 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14786 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14787 if (Result.isInvalid()) 14788 return ExprError(); 14789 14790 return Result; 14791 } 14792 14793 template<typename Derived> 14794 ExprResult 14795 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14796 SourceLocation OperatorLoc, 14797 bool isArrow, 14798 CXXScopeSpec &SS, 14799 TypeSourceInfo *ScopeType, 14800 SourceLocation CCLoc, 14801 SourceLocation TildeLoc, 14802 PseudoDestructorTypeStorage Destroyed) { 14803 QualType BaseType = Base->getType(); 14804 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14805 (!isArrow && !BaseType->getAs<RecordType>()) || 14806 (isArrow && BaseType->getAs<PointerType>() && 14807 !BaseType->castAs<PointerType>()->getPointeeType() 14808 ->template getAs<RecordType>())){ 14809 // This pseudo-destructor expression is still a pseudo-destructor. 14810 return SemaRef.BuildPseudoDestructorExpr( 14811 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14812 CCLoc, TildeLoc, Destroyed); 14813 } 14814 14815 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14816 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14817 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14818 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14819 NameInfo.setNamedTypeInfo(DestroyedType); 14820 14821 // The scope type is now known to be a valid nested name specifier 14822 // component. Tack it on to the end of the nested name specifier. 14823 if (ScopeType) { 14824 if (!ScopeType->getType()->getAs<TagType>()) { 14825 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14826 diag::err_expected_class_or_namespace) 14827 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14828 return ExprError(); 14829 } 14830 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14831 CCLoc); 14832 } 14833 14834 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14835 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14836 OperatorLoc, isArrow, 14837 SS, TemplateKWLoc, 14838 /*FIXME: FirstQualifier*/ nullptr, 14839 NameInfo, 14840 /*TemplateArgs*/ nullptr, 14841 /*S*/nullptr); 14842 } 14843 14844 template<typename Derived> 14845 StmtResult 14846 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14847 SourceLocation Loc = S->getBeginLoc(); 14848 CapturedDecl *CD = S->getCapturedDecl(); 14849 unsigned NumParams = CD->getNumParams(); 14850 unsigned ContextParamPos = CD->getContextParamPosition(); 14851 SmallVector<Sema::CapturedParamNameType, 4> Params; 14852 for (unsigned I = 0; I < NumParams; ++I) { 14853 if (I != ContextParamPos) { 14854 Params.push_back( 14855 std::make_pair( 14856 CD->getParam(I)->getName(), 14857 getDerived().TransformType(CD->getParam(I)->getType()))); 14858 } else { 14859 Params.push_back(std::make_pair(StringRef(), QualType())); 14860 } 14861 } 14862 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14863 S->getCapturedRegionKind(), Params); 14864 StmtResult Body; 14865 { 14866 Sema::CompoundScopeRAII CompoundScope(getSema()); 14867 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14868 } 14869 14870 if (Body.isInvalid()) { 14871 getSema().ActOnCapturedRegionError(); 14872 return StmtError(); 14873 } 14874 14875 return getSema().ActOnCapturedRegionEnd(Body.get()); 14876 } 14877 14878 } // end namespace clang 14879 14880 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14881