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 /// Build a new member access expression. 2633 /// 2634 /// By default, performs semantic analysis to build the new expression. 2635 /// Subclasses may override this routine to provide different behavior. 2636 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2637 bool isArrow, 2638 NestedNameSpecifierLoc QualifierLoc, 2639 SourceLocation TemplateKWLoc, 2640 const DeclarationNameInfo &MemberNameInfo, 2641 ValueDecl *Member, 2642 NamedDecl *FoundDecl, 2643 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2644 NamedDecl *FirstQualifierInScope) { 2645 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2646 isArrow); 2647 if (!Member->getDeclName()) { 2648 // We have a reference to an unnamed field. This is always the 2649 // base of an anonymous struct/union member access, i.e. the 2650 // field is always of record type. 2651 assert(Member->getType()->isRecordType() && 2652 "unnamed member not of record type?"); 2653 2654 BaseResult = 2655 getSema().PerformObjectMemberConversion(BaseResult.get(), 2656 QualifierLoc.getNestedNameSpecifier(), 2657 FoundDecl, Member); 2658 if (BaseResult.isInvalid()) 2659 return ExprError(); 2660 Base = BaseResult.get(); 2661 2662 CXXScopeSpec EmptySS; 2663 return getSema().BuildFieldReferenceExpr( 2664 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2665 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2666 } 2667 2668 CXXScopeSpec SS; 2669 SS.Adopt(QualifierLoc); 2670 2671 Base = BaseResult.get(); 2672 QualType BaseType = Base->getType(); 2673 2674 if (isArrow && !BaseType->isPointerType()) 2675 return ExprError(); 2676 2677 // FIXME: this involves duplicating earlier analysis in a lot of 2678 // cases; we should avoid this when possible. 2679 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2680 R.addDecl(FoundDecl); 2681 R.resolveKind(); 2682 2683 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2684 SS, TemplateKWLoc, 2685 FirstQualifierInScope, 2686 R, ExplicitTemplateArgs, 2687 /*S*/nullptr); 2688 } 2689 2690 /// Build a new binary operator expression. 2691 /// 2692 /// By default, performs semantic analysis to build the new expression. 2693 /// Subclasses may override this routine to provide different behavior. 2694 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2695 BinaryOperatorKind Opc, 2696 Expr *LHS, Expr *RHS) { 2697 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2698 } 2699 2700 /// Build a new rewritten operator expression. 2701 /// 2702 /// By default, performs semantic analysis to build the new expression. 2703 /// Subclasses may override this routine to provide different behavior. 2704 ExprResult RebuildCXXRewrittenBinaryOperator( 2705 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2706 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2707 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2708 RHS, /*RequiresADL*/false); 2709 } 2710 2711 /// Build a new conditional operator expression. 2712 /// 2713 /// By default, performs semantic analysis to build the new expression. 2714 /// Subclasses may override this routine to provide different behavior. 2715 ExprResult RebuildConditionalOperator(Expr *Cond, 2716 SourceLocation QuestionLoc, 2717 Expr *LHS, 2718 SourceLocation ColonLoc, 2719 Expr *RHS) { 2720 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2721 LHS, RHS); 2722 } 2723 2724 /// Build a new C-style cast expression. 2725 /// 2726 /// By default, performs semantic analysis to build the new expression. 2727 /// Subclasses may override this routine to provide different behavior. 2728 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2729 TypeSourceInfo *TInfo, 2730 SourceLocation RParenLoc, 2731 Expr *SubExpr) { 2732 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2733 SubExpr); 2734 } 2735 2736 /// Build a new compound literal expression. 2737 /// 2738 /// By default, performs semantic analysis to build the new expression. 2739 /// Subclasses may override this routine to provide different behavior. 2740 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2741 TypeSourceInfo *TInfo, 2742 SourceLocation RParenLoc, 2743 Expr *Init) { 2744 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2745 Init); 2746 } 2747 2748 /// Build a new extended vector element access expression. 2749 /// 2750 /// By default, performs semantic analysis to build the new expression. 2751 /// Subclasses may override this routine to provide different behavior. 2752 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2753 SourceLocation OpLoc, 2754 SourceLocation AccessorLoc, 2755 IdentifierInfo &Accessor) { 2756 2757 CXXScopeSpec SS; 2758 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2759 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2760 OpLoc, /*IsArrow*/ false, 2761 SS, SourceLocation(), 2762 /*FirstQualifierInScope*/ nullptr, 2763 NameInfo, 2764 /* TemplateArgs */ nullptr, 2765 /*S*/ nullptr); 2766 } 2767 2768 /// Build a new initializer list expression. 2769 /// 2770 /// By default, performs semantic analysis to build the new expression. 2771 /// Subclasses may override this routine to provide different behavior. 2772 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2773 MultiExprArg Inits, 2774 SourceLocation RBraceLoc) { 2775 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2776 } 2777 2778 /// Build a new designated initializer expression. 2779 /// 2780 /// By default, performs semantic analysis to build the new expression. 2781 /// Subclasses may override this routine to provide different behavior. 2782 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2783 MultiExprArg ArrayExprs, 2784 SourceLocation EqualOrColonLoc, 2785 bool GNUSyntax, 2786 Expr *Init) { 2787 ExprResult Result 2788 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2789 Init); 2790 if (Result.isInvalid()) 2791 return ExprError(); 2792 2793 return Result; 2794 } 2795 2796 /// Build a new value-initialized expression. 2797 /// 2798 /// By default, builds the implicit value initialization without performing 2799 /// any semantic analysis. Subclasses may override this routine to provide 2800 /// different behavior. 2801 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2802 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2803 } 2804 2805 /// Build a new \c va_arg expression. 2806 /// 2807 /// By default, performs semantic analysis to build the new expression. 2808 /// Subclasses may override this routine to provide different behavior. 2809 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2810 Expr *SubExpr, TypeSourceInfo *TInfo, 2811 SourceLocation RParenLoc) { 2812 return getSema().BuildVAArgExpr(BuiltinLoc, 2813 SubExpr, TInfo, 2814 RParenLoc); 2815 } 2816 2817 /// Build a new expression list in parentheses. 2818 /// 2819 /// By default, performs semantic analysis to build the new expression. 2820 /// Subclasses may override this routine to provide different behavior. 2821 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2822 MultiExprArg SubExprs, 2823 SourceLocation RParenLoc) { 2824 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2825 } 2826 2827 /// Build a new address-of-label expression. 2828 /// 2829 /// By default, performs semantic analysis, using the name of the label 2830 /// rather than attempting to map the label statement itself. 2831 /// Subclasses may override this routine to provide different behavior. 2832 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2833 SourceLocation LabelLoc, LabelDecl *Label) { 2834 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2835 } 2836 2837 /// Build a new GNU statement expression. 2838 /// 2839 /// By default, performs semantic analysis to build the new expression. 2840 /// Subclasses may override this routine to provide different behavior. 2841 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2842 SourceLocation RParenLoc, unsigned TemplateDepth) { 2843 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2844 TemplateDepth); 2845 } 2846 2847 /// Build a new __builtin_choose_expr expression. 2848 /// 2849 /// By default, performs semantic analysis to build the new expression. 2850 /// Subclasses may override this routine to provide different behavior. 2851 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2852 Expr *Cond, Expr *LHS, Expr *RHS, 2853 SourceLocation RParenLoc) { 2854 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2855 Cond, LHS, RHS, 2856 RParenLoc); 2857 } 2858 2859 /// Build a new generic selection expression. 2860 /// 2861 /// By default, performs semantic analysis to build the new expression. 2862 /// Subclasses may override this routine to provide different behavior. 2863 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2864 SourceLocation DefaultLoc, 2865 SourceLocation RParenLoc, 2866 Expr *ControllingExpr, 2867 ArrayRef<TypeSourceInfo *> Types, 2868 ArrayRef<Expr *> Exprs) { 2869 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2870 ControllingExpr, Types, Exprs); 2871 } 2872 2873 /// Build a new overloaded operator call expression. 2874 /// 2875 /// By default, performs semantic analysis to build the new expression. 2876 /// The semantic analysis provides the behavior of template instantiation, 2877 /// copying with transformations that turn what looks like an overloaded 2878 /// operator call into a use of a builtin operator, performing 2879 /// argument-dependent lookup, etc. Subclasses may override this routine to 2880 /// provide different behavior. 2881 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2882 SourceLocation OpLoc, 2883 Expr *Callee, 2884 Expr *First, 2885 Expr *Second); 2886 2887 /// Build a new C++ "named" cast expression, such as static_cast or 2888 /// reinterpret_cast. 2889 /// 2890 /// By default, this routine dispatches to one of the more-specific routines 2891 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2892 /// Subclasses may override this routine to provide different behavior. 2893 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2894 Stmt::StmtClass Class, 2895 SourceLocation LAngleLoc, 2896 TypeSourceInfo *TInfo, 2897 SourceLocation RAngleLoc, 2898 SourceLocation LParenLoc, 2899 Expr *SubExpr, 2900 SourceLocation RParenLoc) { 2901 switch (Class) { 2902 case Stmt::CXXStaticCastExprClass: 2903 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2904 RAngleLoc, LParenLoc, 2905 SubExpr, RParenLoc); 2906 2907 case Stmt::CXXDynamicCastExprClass: 2908 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2909 RAngleLoc, LParenLoc, 2910 SubExpr, RParenLoc); 2911 2912 case Stmt::CXXReinterpretCastExprClass: 2913 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2914 RAngleLoc, LParenLoc, 2915 SubExpr, 2916 RParenLoc); 2917 2918 case Stmt::CXXConstCastExprClass: 2919 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2920 RAngleLoc, LParenLoc, 2921 SubExpr, RParenLoc); 2922 2923 case Stmt::CXXAddrspaceCastExprClass: 2924 return getDerived().RebuildCXXAddrspaceCastExpr( 2925 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2926 2927 default: 2928 llvm_unreachable("Invalid C++ named cast"); 2929 } 2930 } 2931 2932 /// Build a new C++ static_cast expression. 2933 /// 2934 /// By default, performs semantic analysis to build the new expression. 2935 /// Subclasses may override this routine to provide different behavior. 2936 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2937 SourceLocation LAngleLoc, 2938 TypeSourceInfo *TInfo, 2939 SourceLocation RAngleLoc, 2940 SourceLocation LParenLoc, 2941 Expr *SubExpr, 2942 SourceLocation RParenLoc) { 2943 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2944 TInfo, SubExpr, 2945 SourceRange(LAngleLoc, RAngleLoc), 2946 SourceRange(LParenLoc, RParenLoc)); 2947 } 2948 2949 /// Build a new C++ dynamic_cast expression. 2950 /// 2951 /// By default, performs semantic analysis to build the new expression. 2952 /// Subclasses may override this routine to provide different behavior. 2953 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2954 SourceLocation LAngleLoc, 2955 TypeSourceInfo *TInfo, 2956 SourceLocation RAngleLoc, 2957 SourceLocation LParenLoc, 2958 Expr *SubExpr, 2959 SourceLocation RParenLoc) { 2960 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2961 TInfo, SubExpr, 2962 SourceRange(LAngleLoc, RAngleLoc), 2963 SourceRange(LParenLoc, RParenLoc)); 2964 } 2965 2966 /// Build a new C++ reinterpret_cast expression. 2967 /// 2968 /// By default, performs semantic analysis to build the new expression. 2969 /// Subclasses may override this routine to provide different behavior. 2970 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2971 SourceLocation LAngleLoc, 2972 TypeSourceInfo *TInfo, 2973 SourceLocation RAngleLoc, 2974 SourceLocation LParenLoc, 2975 Expr *SubExpr, 2976 SourceLocation RParenLoc) { 2977 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2978 TInfo, SubExpr, 2979 SourceRange(LAngleLoc, RAngleLoc), 2980 SourceRange(LParenLoc, RParenLoc)); 2981 } 2982 2983 /// Build a new C++ const_cast expression. 2984 /// 2985 /// By default, performs semantic analysis to build the new expression. 2986 /// Subclasses may override this routine to provide different behavior. 2987 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2988 SourceLocation LAngleLoc, 2989 TypeSourceInfo *TInfo, 2990 SourceLocation RAngleLoc, 2991 SourceLocation LParenLoc, 2992 Expr *SubExpr, 2993 SourceLocation RParenLoc) { 2994 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2995 TInfo, SubExpr, 2996 SourceRange(LAngleLoc, RAngleLoc), 2997 SourceRange(LParenLoc, RParenLoc)); 2998 } 2999 3000 ExprResult 3001 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 3002 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 3003 SourceLocation LParenLoc, Expr *SubExpr, 3004 SourceLocation RParenLoc) { 3005 return getSema().BuildCXXNamedCast( 3006 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 3007 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 3008 } 3009 3010 /// Build a new C++ functional-style cast expression. 3011 /// 3012 /// By default, performs semantic analysis to build the new expression. 3013 /// Subclasses may override this routine to provide different behavior. 3014 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 3015 SourceLocation LParenLoc, 3016 Expr *Sub, 3017 SourceLocation RParenLoc, 3018 bool ListInitialization) { 3019 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 3020 MultiExprArg(&Sub, 1), RParenLoc, 3021 ListInitialization); 3022 } 3023 3024 /// Build a new C++ __builtin_bit_cast expression. 3025 /// 3026 /// By default, performs semantic analysis to build the new expression. 3027 /// Subclasses may override this routine to provide different behavior. 3028 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 3029 TypeSourceInfo *TSI, Expr *Sub, 3030 SourceLocation RParenLoc) { 3031 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 3032 } 3033 3034 /// Build a new C++ typeid(type) expression. 3035 /// 3036 /// By default, performs semantic analysis to build the new expression. 3037 /// Subclasses may override this routine to provide different behavior. 3038 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3039 SourceLocation TypeidLoc, 3040 TypeSourceInfo *Operand, 3041 SourceLocation RParenLoc) { 3042 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3043 RParenLoc); 3044 } 3045 3046 3047 /// Build a new C++ typeid(expr) expression. 3048 /// 3049 /// By default, performs semantic analysis to build the new expression. 3050 /// Subclasses may override this routine to provide different behavior. 3051 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3052 SourceLocation TypeidLoc, 3053 Expr *Operand, 3054 SourceLocation RParenLoc) { 3055 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3056 RParenLoc); 3057 } 3058 3059 /// Build a new C++ __uuidof(type) expression. 3060 /// 3061 /// By default, performs semantic analysis to build the new expression. 3062 /// Subclasses may override this routine to provide different behavior. 3063 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3064 TypeSourceInfo *Operand, 3065 SourceLocation RParenLoc) { 3066 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3067 } 3068 3069 /// Build a new C++ __uuidof(expr) expression. 3070 /// 3071 /// By default, performs semantic analysis to build the new expression. 3072 /// Subclasses may override this routine to provide different behavior. 3073 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3074 Expr *Operand, SourceLocation RParenLoc) { 3075 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3076 } 3077 3078 /// Build a new C++ "this" expression. 3079 /// 3080 /// By default, builds a new "this" expression without performing any 3081 /// semantic analysis. Subclasses may override this routine to provide 3082 /// different behavior. 3083 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3084 QualType ThisType, 3085 bool isImplicit) { 3086 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3087 } 3088 3089 /// Build a new C++ throw expression. 3090 /// 3091 /// By default, performs semantic analysis to build the new expression. 3092 /// Subclasses may override this routine to provide different behavior. 3093 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3094 bool IsThrownVariableInScope) { 3095 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3096 } 3097 3098 /// Build a new C++ default-argument expression. 3099 /// 3100 /// By default, builds a new default-argument expression, which does not 3101 /// require any semantic analysis. Subclasses may override this routine to 3102 /// provide different behavior. 3103 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3104 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3105 getSema().CurContext); 3106 } 3107 3108 /// Build a new C++11 default-initialization expression. 3109 /// 3110 /// By default, builds a new default field initialization expression, which 3111 /// does not require any semantic analysis. Subclasses may override this 3112 /// routine to provide different behavior. 3113 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3114 FieldDecl *Field) { 3115 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3116 getSema().CurContext); 3117 } 3118 3119 /// Build a new C++ zero-initialization expression. 3120 /// 3121 /// By default, performs semantic analysis to build the new expression. 3122 /// Subclasses may override this routine to provide different behavior. 3123 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3124 SourceLocation LParenLoc, 3125 SourceLocation RParenLoc) { 3126 return getSema().BuildCXXTypeConstructExpr( 3127 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3128 } 3129 3130 /// Build a new C++ "new" expression. 3131 /// 3132 /// By default, performs semantic analysis to build the new expression. 3133 /// Subclasses may override this routine to provide different behavior. 3134 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3135 bool UseGlobal, 3136 SourceLocation PlacementLParen, 3137 MultiExprArg PlacementArgs, 3138 SourceLocation PlacementRParen, 3139 SourceRange TypeIdParens, 3140 QualType AllocatedType, 3141 TypeSourceInfo *AllocatedTypeInfo, 3142 Optional<Expr *> ArraySize, 3143 SourceRange DirectInitRange, 3144 Expr *Initializer) { 3145 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3146 PlacementLParen, 3147 PlacementArgs, 3148 PlacementRParen, 3149 TypeIdParens, 3150 AllocatedType, 3151 AllocatedTypeInfo, 3152 ArraySize, 3153 DirectInitRange, 3154 Initializer); 3155 } 3156 3157 /// Build a new C++ "delete" expression. 3158 /// 3159 /// By default, performs semantic analysis to build the new expression. 3160 /// Subclasses may override this routine to provide different behavior. 3161 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3162 bool IsGlobalDelete, 3163 bool IsArrayForm, 3164 Expr *Operand) { 3165 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3166 Operand); 3167 } 3168 3169 /// Build a new type trait expression. 3170 /// 3171 /// By default, performs semantic analysis to build the new expression. 3172 /// Subclasses may override this routine to provide different behavior. 3173 ExprResult RebuildTypeTrait(TypeTrait Trait, 3174 SourceLocation StartLoc, 3175 ArrayRef<TypeSourceInfo *> Args, 3176 SourceLocation RParenLoc) { 3177 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3178 } 3179 3180 /// Build a new array type trait expression. 3181 /// 3182 /// By default, performs semantic analysis to build the new expression. 3183 /// Subclasses may override this routine to provide different behavior. 3184 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3185 SourceLocation StartLoc, 3186 TypeSourceInfo *TSInfo, 3187 Expr *DimExpr, 3188 SourceLocation RParenLoc) { 3189 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3190 } 3191 3192 /// Build a new expression trait expression. 3193 /// 3194 /// By default, performs semantic analysis to build the new expression. 3195 /// Subclasses may override this routine to provide different behavior. 3196 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3197 SourceLocation StartLoc, 3198 Expr *Queried, 3199 SourceLocation RParenLoc) { 3200 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3201 } 3202 3203 /// Build a new (previously unresolved) declaration reference 3204 /// expression. 3205 /// 3206 /// By default, performs semantic analysis to build the new expression. 3207 /// Subclasses may override this routine to provide different behavior. 3208 ExprResult RebuildDependentScopeDeclRefExpr( 3209 NestedNameSpecifierLoc QualifierLoc, 3210 SourceLocation TemplateKWLoc, 3211 const DeclarationNameInfo &NameInfo, 3212 const TemplateArgumentListInfo *TemplateArgs, 3213 bool IsAddressOfOperand, 3214 TypeSourceInfo **RecoveryTSI) { 3215 CXXScopeSpec SS; 3216 SS.Adopt(QualifierLoc); 3217 3218 if (TemplateArgs || TemplateKWLoc.isValid()) 3219 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3220 TemplateArgs); 3221 3222 return getSema().BuildQualifiedDeclarationNameExpr( 3223 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3224 } 3225 3226 /// Build a new template-id expression. 3227 /// 3228 /// By default, performs semantic analysis to build the new expression. 3229 /// Subclasses may override this routine to provide different behavior. 3230 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3231 SourceLocation TemplateKWLoc, 3232 LookupResult &R, 3233 bool RequiresADL, 3234 const TemplateArgumentListInfo *TemplateArgs) { 3235 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3236 TemplateArgs); 3237 } 3238 3239 /// Build a new object-construction expression. 3240 /// 3241 /// By default, performs semantic analysis to build the new expression. 3242 /// Subclasses may override this routine to provide different behavior. 3243 ExprResult RebuildCXXConstructExpr(QualType T, 3244 SourceLocation Loc, 3245 CXXConstructorDecl *Constructor, 3246 bool IsElidable, 3247 MultiExprArg Args, 3248 bool HadMultipleCandidates, 3249 bool ListInitialization, 3250 bool StdInitListInitialization, 3251 bool RequiresZeroInit, 3252 CXXConstructExpr::ConstructionKind ConstructKind, 3253 SourceRange ParenRange) { 3254 // Reconstruct the constructor we originally found, which might be 3255 // different if this is a call to an inherited constructor. 3256 CXXConstructorDecl *FoundCtor = Constructor; 3257 if (Constructor->isInheritingConstructor()) 3258 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3259 3260 SmallVector<Expr *, 8> ConvertedArgs; 3261 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3262 ConvertedArgs)) 3263 return ExprError(); 3264 3265 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3266 IsElidable, 3267 ConvertedArgs, 3268 HadMultipleCandidates, 3269 ListInitialization, 3270 StdInitListInitialization, 3271 RequiresZeroInit, ConstructKind, 3272 ParenRange); 3273 } 3274 3275 /// Build a new implicit construction via inherited constructor 3276 /// expression. 3277 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3278 CXXConstructorDecl *Constructor, 3279 bool ConstructsVBase, 3280 bool InheritedFromVBase) { 3281 return new (getSema().Context) CXXInheritedCtorInitExpr( 3282 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3283 } 3284 3285 /// Build a new object-construction expression. 3286 /// 3287 /// By default, performs semantic analysis to build the new expression. 3288 /// Subclasses may override this routine to provide different behavior. 3289 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3290 SourceLocation LParenOrBraceLoc, 3291 MultiExprArg Args, 3292 SourceLocation RParenOrBraceLoc, 3293 bool ListInitialization) { 3294 return getSema().BuildCXXTypeConstructExpr( 3295 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3296 } 3297 3298 /// Build a new object-construction expression. 3299 /// 3300 /// By default, performs semantic analysis to build the new expression. 3301 /// Subclasses may override this routine to provide different behavior. 3302 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3303 SourceLocation LParenLoc, 3304 MultiExprArg Args, 3305 SourceLocation RParenLoc, 3306 bool ListInitialization) { 3307 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3308 RParenLoc, ListInitialization); 3309 } 3310 3311 /// Build a new member reference expression. 3312 /// 3313 /// By default, performs semantic analysis to build the new expression. 3314 /// Subclasses may override this routine to provide different behavior. 3315 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3316 QualType BaseType, 3317 bool IsArrow, 3318 SourceLocation OperatorLoc, 3319 NestedNameSpecifierLoc QualifierLoc, 3320 SourceLocation TemplateKWLoc, 3321 NamedDecl *FirstQualifierInScope, 3322 const DeclarationNameInfo &MemberNameInfo, 3323 const TemplateArgumentListInfo *TemplateArgs) { 3324 CXXScopeSpec SS; 3325 SS.Adopt(QualifierLoc); 3326 3327 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3328 OperatorLoc, IsArrow, 3329 SS, TemplateKWLoc, 3330 FirstQualifierInScope, 3331 MemberNameInfo, 3332 TemplateArgs, /*S*/nullptr); 3333 } 3334 3335 /// Build a new member reference expression. 3336 /// 3337 /// By default, performs semantic analysis to build the new expression. 3338 /// Subclasses may override this routine to provide different behavior. 3339 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3340 SourceLocation OperatorLoc, 3341 bool IsArrow, 3342 NestedNameSpecifierLoc QualifierLoc, 3343 SourceLocation TemplateKWLoc, 3344 NamedDecl *FirstQualifierInScope, 3345 LookupResult &R, 3346 const TemplateArgumentListInfo *TemplateArgs) { 3347 CXXScopeSpec SS; 3348 SS.Adopt(QualifierLoc); 3349 3350 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3351 OperatorLoc, IsArrow, 3352 SS, TemplateKWLoc, 3353 FirstQualifierInScope, 3354 R, TemplateArgs, /*S*/nullptr); 3355 } 3356 3357 /// Build a new noexcept expression. 3358 /// 3359 /// By default, performs semantic analysis to build the new expression. 3360 /// Subclasses may override this routine to provide different behavior. 3361 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3362 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3363 } 3364 3365 /// Build a new expression to compute the length of a parameter pack. 3366 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3367 NamedDecl *Pack, 3368 SourceLocation PackLoc, 3369 SourceLocation RParenLoc, 3370 Optional<unsigned> Length, 3371 ArrayRef<TemplateArgument> PartialArgs) { 3372 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3373 RParenLoc, Length, PartialArgs); 3374 } 3375 3376 /// Build a new expression representing a call to a source location 3377 /// builtin. 3378 /// 3379 /// By default, performs semantic analysis to build the new expression. 3380 /// Subclasses may override this routine to provide different behavior. 3381 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3382 SourceLocation BuiltinLoc, 3383 SourceLocation RPLoc, 3384 DeclContext *ParentContext) { 3385 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3386 } 3387 3388 /// Build a new Objective-C boxed expression. 3389 /// 3390 /// By default, performs semantic analysis to build the new expression. 3391 /// Subclasses may override this routine to provide different behavior. 3392 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3393 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3394 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3395 TemplateArgumentListInfo *TALI) { 3396 CXXScopeSpec SS; 3397 SS.Adopt(NNS); 3398 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3399 ConceptNameInfo, 3400 FoundDecl, 3401 NamedConcept, TALI); 3402 if (Result.isInvalid()) 3403 return ExprError(); 3404 return Result; 3405 } 3406 3407 /// \brief Build a new requires expression. 3408 /// 3409 /// By default, performs semantic analysis to build the new expression. 3410 /// Subclasses may override this routine to provide different behavior. 3411 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3412 RequiresExprBodyDecl *Body, 3413 ArrayRef<ParmVarDecl *> LocalParameters, 3414 ArrayRef<concepts::Requirement *> Requirements, 3415 SourceLocation ClosingBraceLoc) { 3416 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3417 LocalParameters, Requirements, ClosingBraceLoc); 3418 } 3419 3420 concepts::TypeRequirement * 3421 RebuildTypeRequirement( 3422 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3423 return SemaRef.BuildTypeRequirement(SubstDiag); 3424 } 3425 3426 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3427 return SemaRef.BuildTypeRequirement(T); 3428 } 3429 3430 concepts::ExprRequirement * 3431 RebuildExprRequirement( 3432 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3433 SourceLocation NoexceptLoc, 3434 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3435 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3436 std::move(Ret)); 3437 } 3438 3439 concepts::ExprRequirement * 3440 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3441 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3442 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3443 std::move(Ret)); 3444 } 3445 3446 concepts::NestedRequirement * 3447 RebuildNestedRequirement( 3448 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3449 return SemaRef.BuildNestedRequirement(SubstDiag); 3450 } 3451 3452 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3453 return SemaRef.BuildNestedRequirement(Constraint); 3454 } 3455 3456 /// \brief Build a new Objective-C boxed expression. 3457 /// 3458 /// By default, performs semantic analysis to build the new expression. 3459 /// Subclasses may override this routine to provide different behavior. 3460 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3461 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3462 } 3463 3464 /// Build a new Objective-C array literal. 3465 /// 3466 /// By default, performs semantic analysis to build the new expression. 3467 /// Subclasses may override this routine to provide different behavior. 3468 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3469 Expr **Elements, unsigned NumElements) { 3470 return getSema().BuildObjCArrayLiteral(Range, 3471 MultiExprArg(Elements, NumElements)); 3472 } 3473 3474 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3475 Expr *Base, Expr *Key, 3476 ObjCMethodDecl *getterMethod, 3477 ObjCMethodDecl *setterMethod) { 3478 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3479 getterMethod, setterMethod); 3480 } 3481 3482 /// Build a new Objective-C dictionary literal. 3483 /// 3484 /// By default, performs semantic analysis to build the new expression. 3485 /// Subclasses may override this routine to provide different behavior. 3486 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3487 MutableArrayRef<ObjCDictionaryElement> Elements) { 3488 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3489 } 3490 3491 /// Build a new Objective-C \@encode expression. 3492 /// 3493 /// By default, performs semantic analysis to build the new expression. 3494 /// Subclasses may override this routine to provide different behavior. 3495 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3496 TypeSourceInfo *EncodeTypeInfo, 3497 SourceLocation RParenLoc) { 3498 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3499 } 3500 3501 /// Build a new Objective-C class message. 3502 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3503 Selector Sel, 3504 ArrayRef<SourceLocation> SelectorLocs, 3505 ObjCMethodDecl *Method, 3506 SourceLocation LBracLoc, 3507 MultiExprArg Args, 3508 SourceLocation RBracLoc) { 3509 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3510 ReceiverTypeInfo->getType(), 3511 /*SuperLoc=*/SourceLocation(), 3512 Sel, Method, LBracLoc, SelectorLocs, 3513 RBracLoc, Args); 3514 } 3515 3516 /// Build a new Objective-C instance message. 3517 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3518 Selector Sel, 3519 ArrayRef<SourceLocation> SelectorLocs, 3520 ObjCMethodDecl *Method, 3521 SourceLocation LBracLoc, 3522 MultiExprArg Args, 3523 SourceLocation RBracLoc) { 3524 return SemaRef.BuildInstanceMessage(Receiver, 3525 Receiver->getType(), 3526 /*SuperLoc=*/SourceLocation(), 3527 Sel, Method, LBracLoc, SelectorLocs, 3528 RBracLoc, Args); 3529 } 3530 3531 /// Build a new Objective-C instance/class message to 'super'. 3532 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3533 Selector Sel, 3534 ArrayRef<SourceLocation> SelectorLocs, 3535 QualType SuperType, 3536 ObjCMethodDecl *Method, 3537 SourceLocation LBracLoc, 3538 MultiExprArg Args, 3539 SourceLocation RBracLoc) { 3540 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3541 SuperType, 3542 SuperLoc, 3543 Sel, Method, LBracLoc, SelectorLocs, 3544 RBracLoc, Args) 3545 : SemaRef.BuildClassMessage(nullptr, 3546 SuperType, 3547 SuperLoc, 3548 Sel, Method, LBracLoc, SelectorLocs, 3549 RBracLoc, Args); 3550 3551 3552 } 3553 3554 /// Build a new Objective-C ivar reference expression. 3555 /// 3556 /// By default, performs semantic analysis to build the new expression. 3557 /// Subclasses may override this routine to provide different behavior. 3558 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3559 SourceLocation IvarLoc, 3560 bool IsArrow, bool IsFreeIvar) { 3561 CXXScopeSpec SS; 3562 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3563 ExprResult Result = getSema().BuildMemberReferenceExpr( 3564 BaseArg, BaseArg->getType(), 3565 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3566 /*FirstQualifierInScope=*/nullptr, NameInfo, 3567 /*TemplateArgs=*/nullptr, 3568 /*S=*/nullptr); 3569 if (IsFreeIvar && Result.isUsable()) 3570 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3571 return Result; 3572 } 3573 3574 /// Build a new Objective-C property reference expression. 3575 /// 3576 /// By default, performs semantic analysis to build the new expression. 3577 /// Subclasses may override this routine to provide different behavior. 3578 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3579 ObjCPropertyDecl *Property, 3580 SourceLocation PropertyLoc) { 3581 CXXScopeSpec SS; 3582 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3583 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3584 /*FIXME:*/PropertyLoc, 3585 /*IsArrow=*/false, 3586 SS, SourceLocation(), 3587 /*FirstQualifierInScope=*/nullptr, 3588 NameInfo, 3589 /*TemplateArgs=*/nullptr, 3590 /*S=*/nullptr); 3591 } 3592 3593 /// Build a new Objective-C property reference expression. 3594 /// 3595 /// By default, performs semantic analysis to build the new expression. 3596 /// Subclasses may override this routine to provide different behavior. 3597 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3598 ObjCMethodDecl *Getter, 3599 ObjCMethodDecl *Setter, 3600 SourceLocation PropertyLoc) { 3601 // Since these expressions can only be value-dependent, we do not 3602 // need to perform semantic analysis again. 3603 return Owned( 3604 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3605 VK_LValue, OK_ObjCProperty, 3606 PropertyLoc, Base)); 3607 } 3608 3609 /// Build a new Objective-C "isa" expression. 3610 /// 3611 /// By default, performs semantic analysis to build the new expression. 3612 /// Subclasses may override this routine to provide different behavior. 3613 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3614 SourceLocation OpLoc, bool IsArrow) { 3615 CXXScopeSpec SS; 3616 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3617 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3618 OpLoc, IsArrow, 3619 SS, SourceLocation(), 3620 /*FirstQualifierInScope=*/nullptr, 3621 NameInfo, 3622 /*TemplateArgs=*/nullptr, 3623 /*S=*/nullptr); 3624 } 3625 3626 /// Build a new shuffle vector expression. 3627 /// 3628 /// By default, performs semantic analysis to build the new expression. 3629 /// Subclasses may override this routine to provide different behavior. 3630 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3631 MultiExprArg SubExprs, 3632 SourceLocation RParenLoc) { 3633 // Find the declaration for __builtin_shufflevector 3634 const IdentifierInfo &Name 3635 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3636 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3637 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3638 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3639 3640 // Build a reference to the __builtin_shufflevector builtin 3641 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3642 Expr *Callee = new (SemaRef.Context) 3643 DeclRefExpr(SemaRef.Context, Builtin, false, 3644 SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc); 3645 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3646 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3647 CK_BuiltinFnToFnPtr).get(); 3648 3649 // Build the CallExpr 3650 ExprResult TheCall = CallExpr::Create( 3651 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3652 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3653 FPOptionsOverride()); 3654 3655 // Type-check the __builtin_shufflevector expression. 3656 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3657 } 3658 3659 /// Build a new convert vector expression. 3660 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3661 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3662 SourceLocation RParenLoc) { 3663 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3664 BuiltinLoc, RParenLoc); 3665 } 3666 3667 /// Build a new template argument pack expansion. 3668 /// 3669 /// By default, performs semantic analysis to build a new pack expansion 3670 /// for a template argument. Subclasses may override this routine to provide 3671 /// different behavior. 3672 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3673 SourceLocation EllipsisLoc, 3674 Optional<unsigned> NumExpansions) { 3675 switch (Pattern.getArgument().getKind()) { 3676 case TemplateArgument::Expression: { 3677 ExprResult Result 3678 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3679 EllipsisLoc, NumExpansions); 3680 if (Result.isInvalid()) 3681 return TemplateArgumentLoc(); 3682 3683 return TemplateArgumentLoc(Result.get(), Result.get()); 3684 } 3685 3686 case TemplateArgument::Template: 3687 return TemplateArgumentLoc( 3688 SemaRef.Context, 3689 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3690 NumExpansions), 3691 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3692 EllipsisLoc); 3693 3694 case TemplateArgument::Null: 3695 case TemplateArgument::Integral: 3696 case TemplateArgument::Declaration: 3697 case TemplateArgument::Pack: 3698 case TemplateArgument::TemplateExpansion: 3699 case TemplateArgument::NullPtr: 3700 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3701 3702 case TemplateArgument::Type: 3703 if (TypeSourceInfo *Expansion 3704 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3705 EllipsisLoc, 3706 NumExpansions)) 3707 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3708 Expansion); 3709 break; 3710 } 3711 3712 return TemplateArgumentLoc(); 3713 } 3714 3715 /// Build a new expression pack expansion. 3716 /// 3717 /// By default, performs semantic analysis to build a new pack expansion 3718 /// for an expression. Subclasses may override this routine to provide 3719 /// different behavior. 3720 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3721 Optional<unsigned> NumExpansions) { 3722 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3723 } 3724 3725 /// Build a new C++1z fold-expression. 3726 /// 3727 /// By default, performs semantic analysis in order to build a new fold 3728 /// expression. 3729 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3730 SourceLocation LParenLoc, Expr *LHS, 3731 BinaryOperatorKind Operator, 3732 SourceLocation EllipsisLoc, Expr *RHS, 3733 SourceLocation RParenLoc, 3734 Optional<unsigned> NumExpansions) { 3735 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3736 EllipsisLoc, RHS, RParenLoc, 3737 NumExpansions); 3738 } 3739 3740 /// Build an empty C++1z fold-expression with the given operator. 3741 /// 3742 /// By default, produces the fallback value for the fold-expression, or 3743 /// produce an error if there is no fallback value. 3744 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3745 BinaryOperatorKind Operator) { 3746 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3747 } 3748 3749 /// Build a new atomic operation expression. 3750 /// 3751 /// By default, performs semantic analysis to build the new expression. 3752 /// Subclasses may override this routine to provide different behavior. 3753 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3754 AtomicExpr::AtomicOp Op, 3755 SourceLocation RParenLoc) { 3756 // Use this for all of the locations, since we don't know the difference 3757 // between the call and the expr at this point. 3758 SourceRange Range{BuiltinLoc, RParenLoc}; 3759 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3760 Sema::AtomicArgumentOrder::AST); 3761 } 3762 3763 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3764 ArrayRef<Expr *> SubExprs, QualType Type) { 3765 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3766 } 3767 3768 private: 3769 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3770 QualType ObjectType, 3771 NamedDecl *FirstQualifierInScope, 3772 CXXScopeSpec &SS); 3773 3774 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3775 QualType ObjectType, 3776 NamedDecl *FirstQualifierInScope, 3777 CXXScopeSpec &SS); 3778 3779 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3780 NamedDecl *FirstQualifierInScope, 3781 CXXScopeSpec &SS); 3782 3783 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3784 DependentNameTypeLoc TL, 3785 bool DeducibleTSTContext); 3786 }; 3787 3788 template <typename Derived> 3789 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3790 if (!S) 3791 return S; 3792 3793 switch (S->getStmtClass()) { 3794 case Stmt::NoStmtClass: break; 3795 3796 // Transform individual statement nodes 3797 // Pass SDK into statements that can produce a value 3798 #define STMT(Node, Parent) \ 3799 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3800 #define VALUESTMT(Node, Parent) \ 3801 case Stmt::Node##Class: \ 3802 return getDerived().Transform##Node(cast<Node>(S), SDK); 3803 #define ABSTRACT_STMT(Node) 3804 #define EXPR(Node, Parent) 3805 #include "clang/AST/StmtNodes.inc" 3806 3807 // Transform expressions by calling TransformExpr. 3808 #define STMT(Node, Parent) 3809 #define ABSTRACT_STMT(Stmt) 3810 #define EXPR(Node, Parent) case Stmt::Node##Class: 3811 #include "clang/AST/StmtNodes.inc" 3812 { 3813 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3814 3815 if (SDK == SDK_StmtExprResult) 3816 E = getSema().ActOnStmtExprResult(E); 3817 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3818 } 3819 } 3820 3821 return S; 3822 } 3823 3824 template<typename Derived> 3825 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3826 if (!S) 3827 return S; 3828 3829 switch (S->getClauseKind()) { 3830 default: break; 3831 // Transform individual clause nodes 3832 #define GEN_CLANG_CLAUSE_CLASS 3833 #define CLAUSE_CLASS(Enum, Str, Class) \ 3834 case Enum: \ 3835 return getDerived().Transform##Class(cast<Class>(S)); 3836 #include "llvm/Frontend/OpenMP/OMP.inc" 3837 } 3838 3839 return S; 3840 } 3841 3842 3843 template<typename Derived> 3844 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3845 if (!E) 3846 return E; 3847 3848 switch (E->getStmtClass()) { 3849 case Stmt::NoStmtClass: break; 3850 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3851 #define ABSTRACT_STMT(Stmt) 3852 #define EXPR(Node, Parent) \ 3853 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3854 #include "clang/AST/StmtNodes.inc" 3855 } 3856 3857 return E; 3858 } 3859 3860 template<typename Derived> 3861 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3862 bool NotCopyInit) { 3863 // Initializers are instantiated like expressions, except that various outer 3864 // layers are stripped. 3865 if (!Init) 3866 return Init; 3867 3868 if (auto *FE = dyn_cast<FullExpr>(Init)) 3869 Init = FE->getSubExpr(); 3870 3871 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) { 3872 OpaqueValueExpr *OVE = AIL->getCommonExpr(); 3873 Init = OVE->getSourceExpr(); 3874 } 3875 3876 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3877 Init = MTE->getSubExpr(); 3878 3879 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3880 Init = Binder->getSubExpr(); 3881 3882 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3883 Init = ICE->getSubExprAsWritten(); 3884 3885 if (CXXStdInitializerListExpr *ILE = 3886 dyn_cast<CXXStdInitializerListExpr>(Init)) 3887 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3888 3889 // If this is copy-initialization, we only need to reconstruct 3890 // InitListExprs. Other forms of copy-initialization will be a no-op if 3891 // the initializer is already the right type. 3892 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3893 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3894 return getDerived().TransformExpr(Init); 3895 3896 // Revert value-initialization back to empty parens. 3897 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3898 SourceRange Parens = VIE->getSourceRange(); 3899 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3900 Parens.getEnd()); 3901 } 3902 3903 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3904 if (isa<ImplicitValueInitExpr>(Init)) 3905 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3906 SourceLocation()); 3907 3908 // Revert initialization by constructor back to a parenthesized or braced list 3909 // of expressions. Any other form of initializer can just be reused directly. 3910 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3911 return getDerived().TransformExpr(Init); 3912 3913 // If the initialization implicitly converted an initializer list to a 3914 // std::initializer_list object, unwrap the std::initializer_list too. 3915 if (Construct && Construct->isStdInitListInitialization()) 3916 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3917 3918 // Enter a list-init context if this was list initialization. 3919 EnterExpressionEvaluationContext Context( 3920 getSema(), EnterExpressionEvaluationContext::InitList, 3921 Construct->isListInitialization()); 3922 3923 SmallVector<Expr*, 8> NewArgs; 3924 bool ArgChanged = false; 3925 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3926 /*IsCall*/true, NewArgs, &ArgChanged)) 3927 return ExprError(); 3928 3929 // If this was list initialization, revert to syntactic list form. 3930 if (Construct->isListInitialization()) 3931 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3932 Construct->getEndLoc()); 3933 3934 // Build a ParenListExpr to represent anything else. 3935 SourceRange Parens = Construct->getParenOrBraceRange(); 3936 if (Parens.isInvalid()) { 3937 // This was a variable declaration's initialization for which no initializer 3938 // was specified. 3939 assert(NewArgs.empty() && 3940 "no parens or braces but have direct init with arguments?"); 3941 return ExprEmpty(); 3942 } 3943 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3944 Parens.getEnd()); 3945 } 3946 3947 template<typename Derived> 3948 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3949 unsigned NumInputs, 3950 bool IsCall, 3951 SmallVectorImpl<Expr *> &Outputs, 3952 bool *ArgChanged) { 3953 for (unsigned I = 0; I != NumInputs; ++I) { 3954 // If requested, drop call arguments that need to be dropped. 3955 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3956 if (ArgChanged) 3957 *ArgChanged = true; 3958 3959 break; 3960 } 3961 3962 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3963 Expr *Pattern = Expansion->getPattern(); 3964 3965 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3966 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3967 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3968 3969 // Determine whether the set of unexpanded parameter packs can and should 3970 // be expanded. 3971 bool Expand = true; 3972 bool RetainExpansion = false; 3973 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3974 Optional<unsigned> NumExpansions = OrigNumExpansions; 3975 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3976 Pattern->getSourceRange(), 3977 Unexpanded, 3978 Expand, RetainExpansion, 3979 NumExpansions)) 3980 return true; 3981 3982 if (!Expand) { 3983 // The transform has determined that we should perform a simple 3984 // transformation on the pack expansion, producing another pack 3985 // expansion. 3986 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3987 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3988 if (OutPattern.isInvalid()) 3989 return true; 3990 3991 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3992 Expansion->getEllipsisLoc(), 3993 NumExpansions); 3994 if (Out.isInvalid()) 3995 return true; 3996 3997 if (ArgChanged) 3998 *ArgChanged = true; 3999 Outputs.push_back(Out.get()); 4000 continue; 4001 } 4002 4003 // Record right away that the argument was changed. This needs 4004 // to happen even if the array expands to nothing. 4005 if (ArgChanged) *ArgChanged = true; 4006 4007 // The transform has determined that we should perform an elementwise 4008 // expansion of the pattern. Do so. 4009 for (unsigned I = 0; I != *NumExpansions; ++I) { 4010 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4011 ExprResult Out = getDerived().TransformExpr(Pattern); 4012 if (Out.isInvalid()) 4013 return true; 4014 4015 if (Out.get()->containsUnexpandedParameterPack()) { 4016 Out = getDerived().RebuildPackExpansion( 4017 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4018 if (Out.isInvalid()) 4019 return true; 4020 } 4021 4022 Outputs.push_back(Out.get()); 4023 } 4024 4025 // If we're supposed to retain a pack expansion, do so by temporarily 4026 // forgetting the partially-substituted parameter pack. 4027 if (RetainExpansion) { 4028 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4029 4030 ExprResult Out = getDerived().TransformExpr(Pattern); 4031 if (Out.isInvalid()) 4032 return true; 4033 4034 Out = getDerived().RebuildPackExpansion( 4035 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4036 if (Out.isInvalid()) 4037 return true; 4038 4039 Outputs.push_back(Out.get()); 4040 } 4041 4042 continue; 4043 } 4044 4045 ExprResult Result = 4046 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4047 : getDerived().TransformExpr(Inputs[I]); 4048 if (Result.isInvalid()) 4049 return true; 4050 4051 if (Result.get() != Inputs[I] && ArgChanged) 4052 *ArgChanged = true; 4053 4054 Outputs.push_back(Result.get()); 4055 } 4056 4057 return false; 4058 } 4059 4060 template <typename Derived> 4061 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4062 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4063 if (Var) { 4064 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4065 getDerived().TransformDefinition(Var->getLocation(), Var)); 4066 4067 if (!ConditionVar) 4068 return Sema::ConditionError(); 4069 4070 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4071 } 4072 4073 if (Expr) { 4074 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4075 4076 if (CondExpr.isInvalid()) 4077 return Sema::ConditionError(); 4078 4079 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 4080 } 4081 4082 return Sema::ConditionResult(); 4083 } 4084 4085 template <typename Derived> 4086 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4087 NestedNameSpecifierLoc NNS, QualType ObjectType, 4088 NamedDecl *FirstQualifierInScope) { 4089 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4090 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4091 Qualifier = Qualifier.getPrefix()) 4092 Qualifiers.push_back(Qualifier); 4093 4094 CXXScopeSpec SS; 4095 while (!Qualifiers.empty()) { 4096 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4097 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4098 4099 switch (QNNS->getKind()) { 4100 case NestedNameSpecifier::Identifier: { 4101 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4102 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4103 ObjectType); 4104 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4105 SS, FirstQualifierInScope, false)) 4106 return NestedNameSpecifierLoc(); 4107 break; 4108 } 4109 4110 case NestedNameSpecifier::Namespace: { 4111 NamespaceDecl *NS = 4112 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4113 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4114 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4115 break; 4116 } 4117 4118 case NestedNameSpecifier::NamespaceAlias: { 4119 NamespaceAliasDecl *Alias = 4120 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4121 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4122 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4123 Q.getLocalEndLoc()); 4124 break; 4125 } 4126 4127 case NestedNameSpecifier::Global: 4128 // There is no meaningful transformation that one could perform on the 4129 // global scope. 4130 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4131 break; 4132 4133 case NestedNameSpecifier::Super: { 4134 CXXRecordDecl *RD = 4135 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4136 SourceLocation(), QNNS->getAsRecordDecl())); 4137 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4138 break; 4139 } 4140 4141 case NestedNameSpecifier::TypeSpecWithTemplate: 4142 case NestedNameSpecifier::TypeSpec: { 4143 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4144 FirstQualifierInScope, SS); 4145 4146 if (!TL) 4147 return NestedNameSpecifierLoc(); 4148 4149 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4150 (SemaRef.getLangOpts().CPlusPlus11 && 4151 TL.getType()->isEnumeralType())) { 4152 assert(!TL.getType().hasLocalQualifiers() && 4153 "Can't get cv-qualifiers here"); 4154 if (TL.getType()->isEnumeralType()) 4155 SemaRef.Diag(TL.getBeginLoc(), 4156 diag::warn_cxx98_compat_enum_nested_name_spec); 4157 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4158 Q.getLocalEndLoc()); 4159 break; 4160 } 4161 // If the nested-name-specifier is an invalid type def, don't emit an 4162 // error because a previous error should have already been emitted. 4163 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4164 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4165 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4166 << TL.getType() << SS.getRange(); 4167 } 4168 return NestedNameSpecifierLoc(); 4169 } 4170 } 4171 4172 // The qualifier-in-scope and object type only apply to the leftmost entity. 4173 FirstQualifierInScope = nullptr; 4174 ObjectType = QualType(); 4175 } 4176 4177 // Don't rebuild the nested-name-specifier if we don't have to. 4178 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4179 !getDerived().AlwaysRebuild()) 4180 return NNS; 4181 4182 // If we can re-use the source-location data from the original 4183 // nested-name-specifier, do so. 4184 if (SS.location_size() == NNS.getDataLength() && 4185 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4186 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4187 4188 // Allocate new nested-name-specifier location information. 4189 return SS.getWithLocInContext(SemaRef.Context); 4190 } 4191 4192 template<typename Derived> 4193 DeclarationNameInfo 4194 TreeTransform<Derived> 4195 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4196 DeclarationName Name = NameInfo.getName(); 4197 if (!Name) 4198 return DeclarationNameInfo(); 4199 4200 switch (Name.getNameKind()) { 4201 case DeclarationName::Identifier: 4202 case DeclarationName::ObjCZeroArgSelector: 4203 case DeclarationName::ObjCOneArgSelector: 4204 case DeclarationName::ObjCMultiArgSelector: 4205 case DeclarationName::CXXOperatorName: 4206 case DeclarationName::CXXLiteralOperatorName: 4207 case DeclarationName::CXXUsingDirective: 4208 return NameInfo; 4209 4210 case DeclarationName::CXXDeductionGuideName: { 4211 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4212 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4213 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4214 if (!NewTemplate) 4215 return DeclarationNameInfo(); 4216 4217 DeclarationNameInfo NewNameInfo(NameInfo); 4218 NewNameInfo.setName( 4219 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4220 return NewNameInfo; 4221 } 4222 4223 case DeclarationName::CXXConstructorName: 4224 case DeclarationName::CXXDestructorName: 4225 case DeclarationName::CXXConversionFunctionName: { 4226 TypeSourceInfo *NewTInfo; 4227 CanQualType NewCanTy; 4228 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4229 NewTInfo = getDerived().TransformType(OldTInfo); 4230 if (!NewTInfo) 4231 return DeclarationNameInfo(); 4232 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4233 } 4234 else { 4235 NewTInfo = nullptr; 4236 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4237 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4238 if (NewT.isNull()) 4239 return DeclarationNameInfo(); 4240 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4241 } 4242 4243 DeclarationName NewName 4244 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4245 NewCanTy); 4246 DeclarationNameInfo NewNameInfo(NameInfo); 4247 NewNameInfo.setName(NewName); 4248 NewNameInfo.setNamedTypeInfo(NewTInfo); 4249 return NewNameInfo; 4250 } 4251 } 4252 4253 llvm_unreachable("Unknown name kind."); 4254 } 4255 4256 template<typename Derived> 4257 TemplateName 4258 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4259 TemplateName Name, 4260 SourceLocation NameLoc, 4261 QualType ObjectType, 4262 NamedDecl *FirstQualifierInScope, 4263 bool AllowInjectedClassName) { 4264 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4265 TemplateDecl *Template = QTN->getTemplateDecl(); 4266 assert(Template && "qualified template name must refer to a template"); 4267 4268 TemplateDecl *TransTemplate 4269 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4270 Template)); 4271 if (!TransTemplate) 4272 return TemplateName(); 4273 4274 if (!getDerived().AlwaysRebuild() && 4275 SS.getScopeRep() == QTN->getQualifier() && 4276 TransTemplate == Template) 4277 return Name; 4278 4279 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4280 TransTemplate); 4281 } 4282 4283 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4284 if (SS.getScopeRep()) { 4285 // These apply to the scope specifier, not the template. 4286 ObjectType = QualType(); 4287 FirstQualifierInScope = nullptr; 4288 } 4289 4290 if (!getDerived().AlwaysRebuild() && 4291 SS.getScopeRep() == DTN->getQualifier() && 4292 ObjectType.isNull()) 4293 return Name; 4294 4295 // FIXME: Preserve the location of the "template" keyword. 4296 SourceLocation TemplateKWLoc = NameLoc; 4297 4298 if (DTN->isIdentifier()) { 4299 return getDerived().RebuildTemplateName(SS, 4300 TemplateKWLoc, 4301 *DTN->getIdentifier(), 4302 NameLoc, 4303 ObjectType, 4304 FirstQualifierInScope, 4305 AllowInjectedClassName); 4306 } 4307 4308 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4309 DTN->getOperator(), NameLoc, 4310 ObjectType, AllowInjectedClassName); 4311 } 4312 4313 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4314 TemplateDecl *TransTemplate 4315 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4316 Template)); 4317 if (!TransTemplate) 4318 return TemplateName(); 4319 4320 if (!getDerived().AlwaysRebuild() && 4321 TransTemplate == Template) 4322 return Name; 4323 4324 return TemplateName(TransTemplate); 4325 } 4326 4327 if (SubstTemplateTemplateParmPackStorage *SubstPack 4328 = Name.getAsSubstTemplateTemplateParmPack()) { 4329 TemplateTemplateParmDecl *TransParam 4330 = cast_or_null<TemplateTemplateParmDecl>( 4331 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4332 if (!TransParam) 4333 return TemplateName(); 4334 4335 if (!getDerived().AlwaysRebuild() && 4336 TransParam == SubstPack->getParameterPack()) 4337 return Name; 4338 4339 return getDerived().RebuildTemplateName(TransParam, 4340 SubstPack->getArgumentPack()); 4341 } 4342 4343 // These should be getting filtered out before they reach the AST. 4344 llvm_unreachable("overloaded function decl survived to here"); 4345 } 4346 4347 template<typename Derived> 4348 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4349 const TemplateArgument &Arg, 4350 TemplateArgumentLoc &Output) { 4351 Output = getSema().getTrivialTemplateArgumentLoc( 4352 Arg, QualType(), getDerived().getBaseLocation()); 4353 } 4354 4355 template <typename Derived> 4356 bool TreeTransform<Derived>::TransformTemplateArgument( 4357 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4358 bool Uneval) { 4359 const TemplateArgument &Arg = Input.getArgument(); 4360 switch (Arg.getKind()) { 4361 case TemplateArgument::Null: 4362 case TemplateArgument::Pack: 4363 llvm_unreachable("Unexpected TemplateArgument"); 4364 4365 case TemplateArgument::Integral: 4366 case TemplateArgument::NullPtr: 4367 case TemplateArgument::Declaration: { 4368 // Transform a resolved template argument straight to a resolved template 4369 // argument. We get here when substituting into an already-substituted 4370 // template type argument during concept satisfaction checking. 4371 QualType T = Arg.getNonTypeTemplateArgumentType(); 4372 QualType NewT = getDerived().TransformType(T); 4373 if (NewT.isNull()) 4374 return true; 4375 4376 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4377 ? Arg.getAsDecl() 4378 : nullptr; 4379 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4380 getDerived().getBaseLocation(), D)) 4381 : nullptr; 4382 if (D && !NewD) 4383 return true; 4384 4385 if (NewT == T && D == NewD) 4386 Output = Input; 4387 else if (Arg.getKind() == TemplateArgument::Integral) 4388 Output = TemplateArgumentLoc( 4389 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4390 TemplateArgumentLocInfo()); 4391 else if (Arg.getKind() == TemplateArgument::NullPtr) 4392 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4393 TemplateArgumentLocInfo()); 4394 else 4395 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4396 TemplateArgumentLocInfo()); 4397 4398 return false; 4399 } 4400 4401 case TemplateArgument::Type: { 4402 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4403 if (!DI) 4404 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4405 4406 DI = getDerived().TransformType(DI); 4407 if (!DI) 4408 return true; 4409 4410 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4411 return false; 4412 } 4413 4414 case TemplateArgument::Template: { 4415 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4416 if (QualifierLoc) { 4417 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4418 if (!QualifierLoc) 4419 return true; 4420 } 4421 4422 CXXScopeSpec SS; 4423 SS.Adopt(QualifierLoc); 4424 TemplateName Template = getDerived().TransformTemplateName( 4425 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4426 if (Template.isNull()) 4427 return true; 4428 4429 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4430 QualifierLoc, Input.getTemplateNameLoc()); 4431 return false; 4432 } 4433 4434 case TemplateArgument::TemplateExpansion: 4435 llvm_unreachable("Caller should expand pack expansions"); 4436 4437 case TemplateArgument::Expression: { 4438 // Template argument expressions are constant expressions. 4439 EnterExpressionEvaluationContext Unevaluated( 4440 getSema(), 4441 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4442 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4443 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4444 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4445 4446 Expr *InputExpr = Input.getSourceExpression(); 4447 if (!InputExpr) 4448 InputExpr = Input.getArgument().getAsExpr(); 4449 4450 ExprResult E = getDerived().TransformExpr(InputExpr); 4451 E = SemaRef.ActOnConstantExpression(E); 4452 if (E.isInvalid()) 4453 return true; 4454 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4455 return false; 4456 } 4457 } 4458 4459 // Work around bogus GCC warning 4460 return true; 4461 } 4462 4463 /// Iterator adaptor that invents template argument location information 4464 /// for each of the template arguments in its underlying iterator. 4465 template<typename Derived, typename InputIterator> 4466 class TemplateArgumentLocInventIterator { 4467 TreeTransform<Derived> &Self; 4468 InputIterator Iter; 4469 4470 public: 4471 typedef TemplateArgumentLoc value_type; 4472 typedef TemplateArgumentLoc reference; 4473 typedef typename std::iterator_traits<InputIterator>::difference_type 4474 difference_type; 4475 typedef std::input_iterator_tag iterator_category; 4476 4477 class pointer { 4478 TemplateArgumentLoc Arg; 4479 4480 public: 4481 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4482 4483 const TemplateArgumentLoc *operator->() const { return &Arg; } 4484 }; 4485 4486 TemplateArgumentLocInventIterator() { } 4487 4488 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4489 InputIterator Iter) 4490 : Self(Self), Iter(Iter) { } 4491 4492 TemplateArgumentLocInventIterator &operator++() { 4493 ++Iter; 4494 return *this; 4495 } 4496 4497 TemplateArgumentLocInventIterator operator++(int) { 4498 TemplateArgumentLocInventIterator Old(*this); 4499 ++(*this); 4500 return Old; 4501 } 4502 4503 reference operator*() const { 4504 TemplateArgumentLoc Result; 4505 Self.InventTemplateArgumentLoc(*Iter, Result); 4506 return Result; 4507 } 4508 4509 pointer operator->() const { return pointer(**this); } 4510 4511 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4512 const TemplateArgumentLocInventIterator &Y) { 4513 return X.Iter == Y.Iter; 4514 } 4515 4516 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4517 const TemplateArgumentLocInventIterator &Y) { 4518 return X.Iter != Y.Iter; 4519 } 4520 }; 4521 4522 template<typename Derived> 4523 template<typename InputIterator> 4524 bool TreeTransform<Derived>::TransformTemplateArguments( 4525 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4526 bool Uneval) { 4527 for (; First != Last; ++First) { 4528 TemplateArgumentLoc Out; 4529 TemplateArgumentLoc In = *First; 4530 4531 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4532 // Unpack argument packs, which we translate them into separate 4533 // arguments. 4534 // FIXME: We could do much better if we could guarantee that the 4535 // TemplateArgumentLocInfo for the pack expansion would be usable for 4536 // all of the template arguments in the argument pack. 4537 typedef TemplateArgumentLocInventIterator<Derived, 4538 TemplateArgument::pack_iterator> 4539 PackLocIterator; 4540 if (TransformTemplateArguments(PackLocIterator(*this, 4541 In.getArgument().pack_begin()), 4542 PackLocIterator(*this, 4543 In.getArgument().pack_end()), 4544 Outputs, Uneval)) 4545 return true; 4546 4547 continue; 4548 } 4549 4550 if (In.getArgument().isPackExpansion()) { 4551 // We have a pack expansion, for which we will be substituting into 4552 // the pattern. 4553 SourceLocation Ellipsis; 4554 Optional<unsigned> OrigNumExpansions; 4555 TemplateArgumentLoc Pattern 4556 = getSema().getTemplateArgumentPackExpansionPattern( 4557 In, Ellipsis, OrigNumExpansions); 4558 4559 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4560 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4561 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4562 4563 // Determine whether the set of unexpanded parameter packs can and should 4564 // be expanded. 4565 bool Expand = true; 4566 bool RetainExpansion = false; 4567 Optional<unsigned> NumExpansions = OrigNumExpansions; 4568 if (getDerived().TryExpandParameterPacks(Ellipsis, 4569 Pattern.getSourceRange(), 4570 Unexpanded, 4571 Expand, 4572 RetainExpansion, 4573 NumExpansions)) 4574 return true; 4575 4576 if (!Expand) { 4577 // The transform has determined that we should perform a simple 4578 // transformation on the pack expansion, producing another pack 4579 // expansion. 4580 TemplateArgumentLoc OutPattern; 4581 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4582 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4583 return true; 4584 4585 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4586 NumExpansions); 4587 if (Out.getArgument().isNull()) 4588 return true; 4589 4590 Outputs.addArgument(Out); 4591 continue; 4592 } 4593 4594 // The transform has determined that we should perform an elementwise 4595 // expansion of the pattern. Do so. 4596 for (unsigned I = 0; I != *NumExpansions; ++I) { 4597 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4598 4599 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4600 return true; 4601 4602 if (Out.getArgument().containsUnexpandedParameterPack()) { 4603 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4604 OrigNumExpansions); 4605 if (Out.getArgument().isNull()) 4606 return true; 4607 } 4608 4609 Outputs.addArgument(Out); 4610 } 4611 4612 // If we're supposed to retain a pack expansion, do so by temporarily 4613 // forgetting the partially-substituted parameter pack. 4614 if (RetainExpansion) { 4615 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4616 4617 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4618 return true; 4619 4620 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4621 OrigNumExpansions); 4622 if (Out.getArgument().isNull()) 4623 return true; 4624 4625 Outputs.addArgument(Out); 4626 } 4627 4628 continue; 4629 } 4630 4631 // The simple case: 4632 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4633 return true; 4634 4635 Outputs.addArgument(Out); 4636 } 4637 4638 return false; 4639 4640 } 4641 4642 //===----------------------------------------------------------------------===// 4643 // Type transformation 4644 //===----------------------------------------------------------------------===// 4645 4646 template<typename Derived> 4647 QualType TreeTransform<Derived>::TransformType(QualType T) { 4648 if (getDerived().AlreadyTransformed(T)) 4649 return T; 4650 4651 // Temporary workaround. All of these transformations should 4652 // eventually turn into transformations on TypeLocs. 4653 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4654 getDerived().getBaseLocation()); 4655 4656 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4657 4658 if (!NewDI) 4659 return QualType(); 4660 4661 return NewDI->getType(); 4662 } 4663 4664 template<typename Derived> 4665 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4666 // Refine the base location to the type's location. 4667 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4668 getDerived().getBaseEntity()); 4669 if (getDerived().AlreadyTransformed(DI->getType())) 4670 return DI; 4671 4672 TypeLocBuilder TLB; 4673 4674 TypeLoc TL = DI->getTypeLoc(); 4675 TLB.reserve(TL.getFullDataSize()); 4676 4677 QualType Result = getDerived().TransformType(TLB, TL); 4678 if (Result.isNull()) 4679 return nullptr; 4680 4681 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4682 } 4683 4684 template<typename Derived> 4685 QualType 4686 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4687 switch (T.getTypeLocClass()) { 4688 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4689 #define TYPELOC(CLASS, PARENT) \ 4690 case TypeLoc::CLASS: \ 4691 return getDerived().Transform##CLASS##Type(TLB, \ 4692 T.castAs<CLASS##TypeLoc>()); 4693 #include "clang/AST/TypeLocNodes.def" 4694 } 4695 4696 llvm_unreachable("unhandled type loc!"); 4697 } 4698 4699 template<typename Derived> 4700 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4701 if (!isa<DependentNameType>(T)) 4702 return TransformType(T); 4703 4704 if (getDerived().AlreadyTransformed(T)) 4705 return T; 4706 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4707 getDerived().getBaseLocation()); 4708 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4709 return NewDI ? NewDI->getType() : QualType(); 4710 } 4711 4712 template<typename Derived> 4713 TypeSourceInfo * 4714 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4715 if (!isa<DependentNameType>(DI->getType())) 4716 return TransformType(DI); 4717 4718 // Refine the base location to the type's location. 4719 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4720 getDerived().getBaseEntity()); 4721 if (getDerived().AlreadyTransformed(DI->getType())) 4722 return DI; 4723 4724 TypeLocBuilder TLB; 4725 4726 TypeLoc TL = DI->getTypeLoc(); 4727 TLB.reserve(TL.getFullDataSize()); 4728 4729 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4730 if (QTL) 4731 TL = QTL.getUnqualifiedLoc(); 4732 4733 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4734 4735 QualType Result = getDerived().TransformDependentNameType( 4736 TLB, DNTL, /*DeducedTSTContext*/true); 4737 if (Result.isNull()) 4738 return nullptr; 4739 4740 if (QTL) { 4741 Result = getDerived().RebuildQualifiedType(Result, QTL); 4742 if (Result.isNull()) 4743 return nullptr; 4744 TLB.TypeWasModifiedSafely(Result); 4745 } 4746 4747 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4748 } 4749 4750 template<typename Derived> 4751 QualType 4752 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4753 QualifiedTypeLoc T) { 4754 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4755 if (Result.isNull()) 4756 return QualType(); 4757 4758 Result = getDerived().RebuildQualifiedType(Result, T); 4759 4760 if (Result.isNull()) 4761 return QualType(); 4762 4763 // RebuildQualifiedType might have updated the type, but not in a way 4764 // that invalidates the TypeLoc. (There's no location information for 4765 // qualifiers.) 4766 TLB.TypeWasModifiedSafely(Result); 4767 4768 return Result; 4769 } 4770 4771 template <typename Derived> 4772 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4773 QualifiedTypeLoc TL) { 4774 4775 SourceLocation Loc = TL.getBeginLoc(); 4776 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4777 4778 if ((T.getAddressSpace() != LangAS::Default && 4779 Quals.getAddressSpace() != LangAS::Default) && 4780 T.getAddressSpace() != Quals.getAddressSpace()) { 4781 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4782 << TL.getType() << T; 4783 return QualType(); 4784 } 4785 4786 // C++ [dcl.fct]p7: 4787 // [When] adding cv-qualifications on top of the function type [...] the 4788 // cv-qualifiers are ignored. 4789 if (T->isFunctionType()) { 4790 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4791 Quals.getAddressSpace()); 4792 return T; 4793 } 4794 4795 // C++ [dcl.ref]p1: 4796 // when the cv-qualifiers are introduced through the use of a typedef-name 4797 // or decltype-specifier [...] the cv-qualifiers are ignored. 4798 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4799 // applied to a reference type. 4800 if (T->isReferenceType()) { 4801 // The only qualifier that applies to a reference type is restrict. 4802 if (!Quals.hasRestrict()) 4803 return T; 4804 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4805 } 4806 4807 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4808 // resulting type. 4809 if (Quals.hasObjCLifetime()) { 4810 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4811 Quals.removeObjCLifetime(); 4812 else if (T.getObjCLifetime()) { 4813 // Objective-C ARC: 4814 // A lifetime qualifier applied to a substituted template parameter 4815 // overrides the lifetime qualifier from the template argument. 4816 const AutoType *AutoTy; 4817 if (const SubstTemplateTypeParmType *SubstTypeParam 4818 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4819 QualType Replacement = SubstTypeParam->getReplacementType(); 4820 Qualifiers Qs = Replacement.getQualifiers(); 4821 Qs.removeObjCLifetime(); 4822 Replacement = SemaRef.Context.getQualifiedType( 4823 Replacement.getUnqualifiedType(), Qs); 4824 T = SemaRef.Context.getSubstTemplateTypeParmType( 4825 SubstTypeParam->getReplacedParameter(), Replacement); 4826 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4827 // 'auto' types behave the same way as template parameters. 4828 QualType Deduced = AutoTy->getDeducedType(); 4829 Qualifiers Qs = Deduced.getQualifiers(); 4830 Qs.removeObjCLifetime(); 4831 Deduced = 4832 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4833 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4834 AutoTy->isDependentType(), 4835 /*isPack=*/false, 4836 AutoTy->getTypeConstraintConcept(), 4837 AutoTy->getTypeConstraintArguments()); 4838 } else { 4839 // Otherwise, complain about the addition of a qualifier to an 4840 // already-qualified type. 4841 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4842 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4843 Quals.removeObjCLifetime(); 4844 } 4845 } 4846 } 4847 4848 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4849 } 4850 4851 template<typename Derived> 4852 TypeLoc 4853 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4854 QualType ObjectType, 4855 NamedDecl *UnqualLookup, 4856 CXXScopeSpec &SS) { 4857 if (getDerived().AlreadyTransformed(TL.getType())) 4858 return TL; 4859 4860 TypeSourceInfo *TSI = 4861 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4862 if (TSI) 4863 return TSI->getTypeLoc(); 4864 return TypeLoc(); 4865 } 4866 4867 template<typename Derived> 4868 TypeSourceInfo * 4869 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4870 QualType ObjectType, 4871 NamedDecl *UnqualLookup, 4872 CXXScopeSpec &SS) { 4873 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4874 return TSInfo; 4875 4876 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4877 UnqualLookup, SS); 4878 } 4879 4880 template <typename Derived> 4881 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4882 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4883 CXXScopeSpec &SS) { 4884 QualType T = TL.getType(); 4885 assert(!getDerived().AlreadyTransformed(T)); 4886 4887 TypeLocBuilder TLB; 4888 QualType Result; 4889 4890 if (isa<TemplateSpecializationType>(T)) { 4891 TemplateSpecializationTypeLoc SpecTL = 4892 TL.castAs<TemplateSpecializationTypeLoc>(); 4893 4894 TemplateName Template = getDerived().TransformTemplateName( 4895 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4896 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4897 if (Template.isNull()) 4898 return nullptr; 4899 4900 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4901 Template); 4902 } else if (isa<DependentTemplateSpecializationType>(T)) { 4903 DependentTemplateSpecializationTypeLoc SpecTL = 4904 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4905 4906 TemplateName Template 4907 = getDerived().RebuildTemplateName(SS, 4908 SpecTL.getTemplateKeywordLoc(), 4909 *SpecTL.getTypePtr()->getIdentifier(), 4910 SpecTL.getTemplateNameLoc(), 4911 ObjectType, UnqualLookup, 4912 /*AllowInjectedClassName*/true); 4913 if (Template.isNull()) 4914 return nullptr; 4915 4916 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4917 SpecTL, 4918 Template, 4919 SS); 4920 } else { 4921 // Nothing special needs to be done for these. 4922 Result = getDerived().TransformType(TLB, TL); 4923 } 4924 4925 if (Result.isNull()) 4926 return nullptr; 4927 4928 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4929 } 4930 4931 template <class TyLoc> static inline 4932 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4933 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4934 NewT.setNameLoc(T.getNameLoc()); 4935 return T.getType(); 4936 } 4937 4938 template<typename Derived> 4939 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4940 BuiltinTypeLoc T) { 4941 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4942 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4943 if (T.needsExtraLocalData()) 4944 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4945 return T.getType(); 4946 } 4947 4948 template<typename Derived> 4949 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4950 ComplexTypeLoc T) { 4951 // FIXME: recurse? 4952 return TransformTypeSpecType(TLB, T); 4953 } 4954 4955 template <typename Derived> 4956 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4957 AdjustedTypeLoc TL) { 4958 // Adjustments applied during transformation are handled elsewhere. 4959 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4960 } 4961 4962 template<typename Derived> 4963 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4964 DecayedTypeLoc TL) { 4965 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4966 if (OriginalType.isNull()) 4967 return QualType(); 4968 4969 QualType Result = TL.getType(); 4970 if (getDerived().AlwaysRebuild() || 4971 OriginalType != TL.getOriginalLoc().getType()) 4972 Result = SemaRef.Context.getDecayedType(OriginalType); 4973 TLB.push<DecayedTypeLoc>(Result); 4974 // Nothing to set for DecayedTypeLoc. 4975 return Result; 4976 } 4977 4978 template<typename Derived> 4979 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4980 PointerTypeLoc TL) { 4981 QualType PointeeType 4982 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4983 if (PointeeType.isNull()) 4984 return QualType(); 4985 4986 QualType Result = TL.getType(); 4987 if (PointeeType->getAs<ObjCObjectType>()) { 4988 // A dependent pointer type 'T *' has is being transformed such 4989 // that an Objective-C class type is being replaced for 'T'. The 4990 // resulting pointer type is an ObjCObjectPointerType, not a 4991 // PointerType. 4992 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4993 4994 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4995 NewT.setStarLoc(TL.getStarLoc()); 4996 return Result; 4997 } 4998 4999 if (getDerived().AlwaysRebuild() || 5000 PointeeType != TL.getPointeeLoc().getType()) { 5001 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 5002 if (Result.isNull()) 5003 return QualType(); 5004 } 5005 5006 // Objective-C ARC can add lifetime qualifiers to the type that we're 5007 // pointing to. 5008 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 5009 5010 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 5011 NewT.setSigilLoc(TL.getSigilLoc()); 5012 return Result; 5013 } 5014 5015 template<typename Derived> 5016 QualType 5017 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5018 BlockPointerTypeLoc TL) { 5019 QualType PointeeType 5020 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5021 if (PointeeType.isNull()) 5022 return QualType(); 5023 5024 QualType Result = TL.getType(); 5025 if (getDerived().AlwaysRebuild() || 5026 PointeeType != TL.getPointeeLoc().getType()) { 5027 Result = getDerived().RebuildBlockPointerType(PointeeType, 5028 TL.getSigilLoc()); 5029 if (Result.isNull()) 5030 return QualType(); 5031 } 5032 5033 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5034 NewT.setSigilLoc(TL.getSigilLoc()); 5035 return Result; 5036 } 5037 5038 /// Transforms a reference type. Note that somewhat paradoxically we 5039 /// don't care whether the type itself is an l-value type or an r-value 5040 /// type; we only care if the type was *written* as an l-value type 5041 /// or an r-value type. 5042 template<typename Derived> 5043 QualType 5044 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5045 ReferenceTypeLoc TL) { 5046 const ReferenceType *T = TL.getTypePtr(); 5047 5048 // Note that this works with the pointee-as-written. 5049 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5050 if (PointeeType.isNull()) 5051 return QualType(); 5052 5053 QualType Result = TL.getType(); 5054 if (getDerived().AlwaysRebuild() || 5055 PointeeType != T->getPointeeTypeAsWritten()) { 5056 Result = getDerived().RebuildReferenceType(PointeeType, 5057 T->isSpelledAsLValue(), 5058 TL.getSigilLoc()); 5059 if (Result.isNull()) 5060 return QualType(); 5061 } 5062 5063 // Objective-C ARC can add lifetime qualifiers to the type that we're 5064 // referring to. 5065 TLB.TypeWasModifiedSafely( 5066 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5067 5068 // r-value references can be rebuilt as l-value references. 5069 ReferenceTypeLoc NewTL; 5070 if (isa<LValueReferenceType>(Result)) 5071 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5072 else 5073 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5074 NewTL.setSigilLoc(TL.getSigilLoc()); 5075 5076 return Result; 5077 } 5078 5079 template<typename Derived> 5080 QualType 5081 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5082 LValueReferenceTypeLoc TL) { 5083 return TransformReferenceType(TLB, TL); 5084 } 5085 5086 template<typename Derived> 5087 QualType 5088 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5089 RValueReferenceTypeLoc TL) { 5090 return TransformReferenceType(TLB, TL); 5091 } 5092 5093 template<typename Derived> 5094 QualType 5095 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5096 MemberPointerTypeLoc TL) { 5097 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5098 if (PointeeType.isNull()) 5099 return QualType(); 5100 5101 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5102 TypeSourceInfo *NewClsTInfo = nullptr; 5103 if (OldClsTInfo) { 5104 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5105 if (!NewClsTInfo) 5106 return QualType(); 5107 } 5108 5109 const MemberPointerType *T = TL.getTypePtr(); 5110 QualType OldClsType = QualType(T->getClass(), 0); 5111 QualType NewClsType; 5112 if (NewClsTInfo) 5113 NewClsType = NewClsTInfo->getType(); 5114 else { 5115 NewClsType = getDerived().TransformType(OldClsType); 5116 if (NewClsType.isNull()) 5117 return QualType(); 5118 } 5119 5120 QualType Result = TL.getType(); 5121 if (getDerived().AlwaysRebuild() || 5122 PointeeType != T->getPointeeType() || 5123 NewClsType != OldClsType) { 5124 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5125 TL.getStarLoc()); 5126 if (Result.isNull()) 5127 return QualType(); 5128 } 5129 5130 // If we had to adjust the pointee type when building a member pointer, make 5131 // sure to push TypeLoc info for it. 5132 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5133 if (MPT && PointeeType != MPT->getPointeeType()) { 5134 assert(isa<AdjustedType>(MPT->getPointeeType())); 5135 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5136 } 5137 5138 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5139 NewTL.setSigilLoc(TL.getSigilLoc()); 5140 NewTL.setClassTInfo(NewClsTInfo); 5141 5142 return Result; 5143 } 5144 5145 template<typename Derived> 5146 QualType 5147 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5148 ConstantArrayTypeLoc TL) { 5149 const ConstantArrayType *T = TL.getTypePtr(); 5150 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5151 if (ElementType.isNull()) 5152 return QualType(); 5153 5154 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5155 Expr *OldSize = TL.getSizeExpr(); 5156 if (!OldSize) 5157 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5158 Expr *NewSize = nullptr; 5159 if (OldSize) { 5160 EnterExpressionEvaluationContext Unevaluated( 5161 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5162 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5163 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5164 } 5165 5166 QualType Result = TL.getType(); 5167 if (getDerived().AlwaysRebuild() || 5168 ElementType != T->getElementType() || 5169 (T->getSizeExpr() && NewSize != OldSize)) { 5170 Result = getDerived().RebuildConstantArrayType(ElementType, 5171 T->getSizeModifier(), 5172 T->getSize(), NewSize, 5173 T->getIndexTypeCVRQualifiers(), 5174 TL.getBracketsRange()); 5175 if (Result.isNull()) 5176 return QualType(); 5177 } 5178 5179 // We might have either a ConstantArrayType or a VariableArrayType now: 5180 // a ConstantArrayType is allowed to have an element type which is a 5181 // VariableArrayType if the type is dependent. Fortunately, all array 5182 // types have the same location layout. 5183 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5184 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5185 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5186 NewTL.setSizeExpr(NewSize); 5187 5188 return Result; 5189 } 5190 5191 template<typename Derived> 5192 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5193 TypeLocBuilder &TLB, 5194 IncompleteArrayTypeLoc TL) { 5195 const IncompleteArrayType *T = TL.getTypePtr(); 5196 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5197 if (ElementType.isNull()) 5198 return QualType(); 5199 5200 QualType Result = TL.getType(); 5201 if (getDerived().AlwaysRebuild() || 5202 ElementType != T->getElementType()) { 5203 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5204 T->getSizeModifier(), 5205 T->getIndexTypeCVRQualifiers(), 5206 TL.getBracketsRange()); 5207 if (Result.isNull()) 5208 return QualType(); 5209 } 5210 5211 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5212 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5213 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5214 NewTL.setSizeExpr(nullptr); 5215 5216 return Result; 5217 } 5218 5219 template<typename Derived> 5220 QualType 5221 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5222 VariableArrayTypeLoc TL) { 5223 const VariableArrayType *T = TL.getTypePtr(); 5224 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5225 if (ElementType.isNull()) 5226 return QualType(); 5227 5228 ExprResult SizeResult; 5229 { 5230 EnterExpressionEvaluationContext Context( 5231 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5232 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5233 } 5234 if (SizeResult.isInvalid()) 5235 return QualType(); 5236 SizeResult = 5237 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5238 if (SizeResult.isInvalid()) 5239 return QualType(); 5240 5241 Expr *Size = SizeResult.get(); 5242 5243 QualType Result = TL.getType(); 5244 if (getDerived().AlwaysRebuild() || 5245 ElementType != T->getElementType() || 5246 Size != T->getSizeExpr()) { 5247 Result = getDerived().RebuildVariableArrayType(ElementType, 5248 T->getSizeModifier(), 5249 Size, 5250 T->getIndexTypeCVRQualifiers(), 5251 TL.getBracketsRange()); 5252 if (Result.isNull()) 5253 return QualType(); 5254 } 5255 5256 // We might have constant size array now, but fortunately it has the same 5257 // location layout. 5258 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5259 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5260 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5261 NewTL.setSizeExpr(Size); 5262 5263 return Result; 5264 } 5265 5266 template<typename Derived> 5267 QualType 5268 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5269 DependentSizedArrayTypeLoc TL) { 5270 const DependentSizedArrayType *T = TL.getTypePtr(); 5271 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5272 if (ElementType.isNull()) 5273 return QualType(); 5274 5275 // Array bounds are constant expressions. 5276 EnterExpressionEvaluationContext Unevaluated( 5277 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5278 5279 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5280 Expr *origSize = TL.getSizeExpr(); 5281 if (!origSize) origSize = T->getSizeExpr(); 5282 5283 ExprResult sizeResult 5284 = getDerived().TransformExpr(origSize); 5285 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5286 if (sizeResult.isInvalid()) 5287 return QualType(); 5288 5289 Expr *size = sizeResult.get(); 5290 5291 QualType Result = TL.getType(); 5292 if (getDerived().AlwaysRebuild() || 5293 ElementType != T->getElementType() || 5294 size != origSize) { 5295 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5296 T->getSizeModifier(), 5297 size, 5298 T->getIndexTypeCVRQualifiers(), 5299 TL.getBracketsRange()); 5300 if (Result.isNull()) 5301 return QualType(); 5302 } 5303 5304 // We might have any sort of array type now, but fortunately they 5305 // all have the same location layout. 5306 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5307 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5308 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5309 NewTL.setSizeExpr(size); 5310 5311 return Result; 5312 } 5313 5314 template <typename Derived> 5315 QualType TreeTransform<Derived>::TransformDependentVectorType( 5316 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5317 const DependentVectorType *T = TL.getTypePtr(); 5318 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5319 if (ElementType.isNull()) 5320 return QualType(); 5321 5322 EnterExpressionEvaluationContext Unevaluated( 5323 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5324 5325 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5326 Size = SemaRef.ActOnConstantExpression(Size); 5327 if (Size.isInvalid()) 5328 return QualType(); 5329 5330 QualType Result = TL.getType(); 5331 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5332 Size.get() != T->getSizeExpr()) { 5333 Result = getDerived().RebuildDependentVectorType( 5334 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5335 if (Result.isNull()) 5336 return QualType(); 5337 } 5338 5339 // Result might be dependent or not. 5340 if (isa<DependentVectorType>(Result)) { 5341 DependentVectorTypeLoc NewTL = 5342 TLB.push<DependentVectorTypeLoc>(Result); 5343 NewTL.setNameLoc(TL.getNameLoc()); 5344 } else { 5345 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5346 NewTL.setNameLoc(TL.getNameLoc()); 5347 } 5348 5349 return Result; 5350 } 5351 5352 template<typename Derived> 5353 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5354 TypeLocBuilder &TLB, 5355 DependentSizedExtVectorTypeLoc TL) { 5356 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5357 5358 // FIXME: ext vector locs should be nested 5359 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5360 if (ElementType.isNull()) 5361 return QualType(); 5362 5363 // Vector sizes are constant expressions. 5364 EnterExpressionEvaluationContext Unevaluated( 5365 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5366 5367 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5368 Size = SemaRef.ActOnConstantExpression(Size); 5369 if (Size.isInvalid()) 5370 return QualType(); 5371 5372 QualType Result = TL.getType(); 5373 if (getDerived().AlwaysRebuild() || 5374 ElementType != T->getElementType() || 5375 Size.get() != T->getSizeExpr()) { 5376 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5377 Size.get(), 5378 T->getAttributeLoc()); 5379 if (Result.isNull()) 5380 return QualType(); 5381 } 5382 5383 // Result might be dependent or not. 5384 if (isa<DependentSizedExtVectorType>(Result)) { 5385 DependentSizedExtVectorTypeLoc NewTL 5386 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5387 NewTL.setNameLoc(TL.getNameLoc()); 5388 } else { 5389 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5390 NewTL.setNameLoc(TL.getNameLoc()); 5391 } 5392 5393 return Result; 5394 } 5395 5396 template <typename Derived> 5397 QualType 5398 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5399 ConstantMatrixTypeLoc TL) { 5400 const ConstantMatrixType *T = TL.getTypePtr(); 5401 QualType ElementType = getDerived().TransformType(T->getElementType()); 5402 if (ElementType.isNull()) 5403 return QualType(); 5404 5405 QualType Result = TL.getType(); 5406 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5407 Result = getDerived().RebuildConstantMatrixType( 5408 ElementType, T->getNumRows(), T->getNumColumns()); 5409 if (Result.isNull()) 5410 return QualType(); 5411 } 5412 5413 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5414 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5415 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5416 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5417 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5418 5419 return Result; 5420 } 5421 5422 template <typename Derived> 5423 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5424 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5425 const DependentSizedMatrixType *T = TL.getTypePtr(); 5426 5427 QualType ElementType = getDerived().TransformType(T->getElementType()); 5428 if (ElementType.isNull()) { 5429 return QualType(); 5430 } 5431 5432 // Matrix dimensions are constant expressions. 5433 EnterExpressionEvaluationContext Unevaluated( 5434 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5435 5436 Expr *origRows = TL.getAttrRowOperand(); 5437 if (!origRows) 5438 origRows = T->getRowExpr(); 5439 Expr *origColumns = TL.getAttrColumnOperand(); 5440 if (!origColumns) 5441 origColumns = T->getColumnExpr(); 5442 5443 ExprResult rowResult = getDerived().TransformExpr(origRows); 5444 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5445 if (rowResult.isInvalid()) 5446 return QualType(); 5447 5448 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5449 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5450 if (columnResult.isInvalid()) 5451 return QualType(); 5452 5453 Expr *rows = rowResult.get(); 5454 Expr *columns = columnResult.get(); 5455 5456 QualType Result = TL.getType(); 5457 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5458 rows != origRows || columns != origColumns) { 5459 Result = getDerived().RebuildDependentSizedMatrixType( 5460 ElementType, rows, columns, T->getAttributeLoc()); 5461 5462 if (Result.isNull()) 5463 return QualType(); 5464 } 5465 5466 // We might have any sort of matrix type now, but fortunately they 5467 // all have the same location layout. 5468 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5469 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5470 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5471 NewTL.setAttrRowOperand(rows); 5472 NewTL.setAttrColumnOperand(columns); 5473 return Result; 5474 } 5475 5476 template <typename Derived> 5477 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5478 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5479 const DependentAddressSpaceType *T = TL.getTypePtr(); 5480 5481 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5482 5483 if (pointeeType.isNull()) 5484 return QualType(); 5485 5486 // Address spaces are constant expressions. 5487 EnterExpressionEvaluationContext Unevaluated( 5488 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5489 5490 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5491 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5492 if (AddrSpace.isInvalid()) 5493 return QualType(); 5494 5495 QualType Result = TL.getType(); 5496 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5497 AddrSpace.get() != T->getAddrSpaceExpr()) { 5498 Result = getDerived().RebuildDependentAddressSpaceType( 5499 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5500 if (Result.isNull()) 5501 return QualType(); 5502 } 5503 5504 // Result might be dependent or not. 5505 if (isa<DependentAddressSpaceType>(Result)) { 5506 DependentAddressSpaceTypeLoc NewTL = 5507 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5508 5509 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5510 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5511 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5512 5513 } else { 5514 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5515 Result, getDerived().getBaseLocation()); 5516 TransformType(TLB, DI->getTypeLoc()); 5517 } 5518 5519 return Result; 5520 } 5521 5522 template <typename Derived> 5523 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5524 VectorTypeLoc TL) { 5525 const VectorType *T = TL.getTypePtr(); 5526 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5527 if (ElementType.isNull()) 5528 return QualType(); 5529 5530 QualType Result = TL.getType(); 5531 if (getDerived().AlwaysRebuild() || 5532 ElementType != T->getElementType()) { 5533 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5534 T->getVectorKind()); 5535 if (Result.isNull()) 5536 return QualType(); 5537 } 5538 5539 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5540 NewTL.setNameLoc(TL.getNameLoc()); 5541 5542 return Result; 5543 } 5544 5545 template<typename Derived> 5546 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5547 ExtVectorTypeLoc TL) { 5548 const VectorType *T = TL.getTypePtr(); 5549 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5550 if (ElementType.isNull()) 5551 return QualType(); 5552 5553 QualType Result = TL.getType(); 5554 if (getDerived().AlwaysRebuild() || 5555 ElementType != T->getElementType()) { 5556 Result = getDerived().RebuildExtVectorType(ElementType, 5557 T->getNumElements(), 5558 /*FIXME*/ SourceLocation()); 5559 if (Result.isNull()) 5560 return QualType(); 5561 } 5562 5563 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5564 NewTL.setNameLoc(TL.getNameLoc()); 5565 5566 return Result; 5567 } 5568 5569 template <typename Derived> 5570 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5571 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5572 bool ExpectParameterPack) { 5573 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5574 TypeSourceInfo *NewDI = nullptr; 5575 5576 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5577 // If we're substituting into a pack expansion type and we know the 5578 // length we want to expand to, just substitute for the pattern. 5579 TypeLoc OldTL = OldDI->getTypeLoc(); 5580 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5581 5582 TypeLocBuilder TLB; 5583 TypeLoc NewTL = OldDI->getTypeLoc(); 5584 TLB.reserve(NewTL.getFullDataSize()); 5585 5586 QualType Result = getDerived().TransformType(TLB, 5587 OldExpansionTL.getPatternLoc()); 5588 if (Result.isNull()) 5589 return nullptr; 5590 5591 Result = RebuildPackExpansionType(Result, 5592 OldExpansionTL.getPatternLoc().getSourceRange(), 5593 OldExpansionTL.getEllipsisLoc(), 5594 NumExpansions); 5595 if (Result.isNull()) 5596 return nullptr; 5597 5598 PackExpansionTypeLoc NewExpansionTL 5599 = TLB.push<PackExpansionTypeLoc>(Result); 5600 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5601 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5602 } else 5603 NewDI = getDerived().TransformType(OldDI); 5604 if (!NewDI) 5605 return nullptr; 5606 5607 if (NewDI == OldDI && indexAdjustment == 0) 5608 return OldParm; 5609 5610 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5611 OldParm->getDeclContext(), 5612 OldParm->getInnerLocStart(), 5613 OldParm->getLocation(), 5614 OldParm->getIdentifier(), 5615 NewDI->getType(), 5616 NewDI, 5617 OldParm->getStorageClass(), 5618 /* DefArg */ nullptr); 5619 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5620 OldParm->getFunctionScopeIndex() + indexAdjustment); 5621 transformedLocalDecl(OldParm, {newParm}); 5622 return newParm; 5623 } 5624 5625 template <typename Derived> 5626 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5627 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5628 const QualType *ParamTypes, 5629 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5630 SmallVectorImpl<QualType> &OutParamTypes, 5631 SmallVectorImpl<ParmVarDecl *> *PVars, 5632 Sema::ExtParameterInfoBuilder &PInfos) { 5633 int indexAdjustment = 0; 5634 5635 unsigned NumParams = Params.size(); 5636 for (unsigned i = 0; i != NumParams; ++i) { 5637 if (ParmVarDecl *OldParm = Params[i]) { 5638 assert(OldParm->getFunctionScopeIndex() == i); 5639 5640 Optional<unsigned> NumExpansions; 5641 ParmVarDecl *NewParm = nullptr; 5642 if (OldParm->isParameterPack()) { 5643 // We have a function parameter pack that may need to be expanded. 5644 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5645 5646 // Find the parameter packs that could be expanded. 5647 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5648 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5649 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5650 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5651 5652 // Determine whether we should expand the parameter packs. 5653 bool ShouldExpand = false; 5654 bool RetainExpansion = false; 5655 Optional<unsigned> OrigNumExpansions; 5656 if (Unexpanded.size() > 0) { 5657 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5658 NumExpansions = OrigNumExpansions; 5659 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5660 Pattern.getSourceRange(), 5661 Unexpanded, 5662 ShouldExpand, 5663 RetainExpansion, 5664 NumExpansions)) { 5665 return true; 5666 } 5667 } else { 5668 #ifndef NDEBUG 5669 const AutoType *AT = 5670 Pattern.getType().getTypePtr()->getContainedAutoType(); 5671 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5672 "Could not find parameter packs or undeduced auto type!"); 5673 #endif 5674 } 5675 5676 if (ShouldExpand) { 5677 // Expand the function parameter pack into multiple, separate 5678 // parameters. 5679 getDerived().ExpandingFunctionParameterPack(OldParm); 5680 for (unsigned I = 0; I != *NumExpansions; ++I) { 5681 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5682 ParmVarDecl *NewParm 5683 = getDerived().TransformFunctionTypeParam(OldParm, 5684 indexAdjustment++, 5685 OrigNumExpansions, 5686 /*ExpectParameterPack=*/false); 5687 if (!NewParm) 5688 return true; 5689 5690 if (ParamInfos) 5691 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5692 OutParamTypes.push_back(NewParm->getType()); 5693 if (PVars) 5694 PVars->push_back(NewParm); 5695 } 5696 5697 // If we're supposed to retain a pack expansion, do so by temporarily 5698 // forgetting the partially-substituted parameter pack. 5699 if (RetainExpansion) { 5700 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5701 ParmVarDecl *NewParm 5702 = getDerived().TransformFunctionTypeParam(OldParm, 5703 indexAdjustment++, 5704 OrigNumExpansions, 5705 /*ExpectParameterPack=*/false); 5706 if (!NewParm) 5707 return true; 5708 5709 if (ParamInfos) 5710 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5711 OutParamTypes.push_back(NewParm->getType()); 5712 if (PVars) 5713 PVars->push_back(NewParm); 5714 } 5715 5716 // The next parameter should have the same adjustment as the 5717 // last thing we pushed, but we post-incremented indexAdjustment 5718 // on every push. Also, if we push nothing, the adjustment should 5719 // go down by one. 5720 indexAdjustment--; 5721 5722 // We're done with the pack expansion. 5723 continue; 5724 } 5725 5726 // We'll substitute the parameter now without expanding the pack 5727 // expansion. 5728 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5729 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5730 indexAdjustment, 5731 NumExpansions, 5732 /*ExpectParameterPack=*/true); 5733 assert(NewParm->isParameterPack() && 5734 "Parameter pack no longer a parameter pack after " 5735 "transformation."); 5736 } else { 5737 NewParm = getDerived().TransformFunctionTypeParam( 5738 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5739 } 5740 5741 if (!NewParm) 5742 return true; 5743 5744 if (ParamInfos) 5745 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5746 OutParamTypes.push_back(NewParm->getType()); 5747 if (PVars) 5748 PVars->push_back(NewParm); 5749 continue; 5750 } 5751 5752 // Deal with the possibility that we don't have a parameter 5753 // declaration for this parameter. 5754 QualType OldType = ParamTypes[i]; 5755 bool IsPackExpansion = false; 5756 Optional<unsigned> NumExpansions; 5757 QualType NewType; 5758 if (const PackExpansionType *Expansion 5759 = dyn_cast<PackExpansionType>(OldType)) { 5760 // We have a function parameter pack that may need to be expanded. 5761 QualType Pattern = Expansion->getPattern(); 5762 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5763 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5764 5765 // Determine whether we should expand the parameter packs. 5766 bool ShouldExpand = false; 5767 bool RetainExpansion = false; 5768 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5769 Unexpanded, 5770 ShouldExpand, 5771 RetainExpansion, 5772 NumExpansions)) { 5773 return true; 5774 } 5775 5776 if (ShouldExpand) { 5777 // Expand the function parameter pack into multiple, separate 5778 // parameters. 5779 for (unsigned I = 0; I != *NumExpansions; ++I) { 5780 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5781 QualType NewType = getDerived().TransformType(Pattern); 5782 if (NewType.isNull()) 5783 return true; 5784 5785 if (NewType->containsUnexpandedParameterPack()) { 5786 NewType = 5787 getSema().getASTContext().getPackExpansionType(NewType, None); 5788 5789 if (NewType.isNull()) 5790 return true; 5791 } 5792 5793 if (ParamInfos) 5794 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5795 OutParamTypes.push_back(NewType); 5796 if (PVars) 5797 PVars->push_back(nullptr); 5798 } 5799 5800 // We're done with the pack expansion. 5801 continue; 5802 } 5803 5804 // If we're supposed to retain a pack expansion, do so by temporarily 5805 // forgetting the partially-substituted parameter pack. 5806 if (RetainExpansion) { 5807 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5808 QualType NewType = getDerived().TransformType(Pattern); 5809 if (NewType.isNull()) 5810 return true; 5811 5812 if (ParamInfos) 5813 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5814 OutParamTypes.push_back(NewType); 5815 if (PVars) 5816 PVars->push_back(nullptr); 5817 } 5818 5819 // We'll substitute the parameter now without expanding the pack 5820 // expansion. 5821 OldType = Expansion->getPattern(); 5822 IsPackExpansion = true; 5823 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5824 NewType = getDerived().TransformType(OldType); 5825 } else { 5826 NewType = getDerived().TransformType(OldType); 5827 } 5828 5829 if (NewType.isNull()) 5830 return true; 5831 5832 if (IsPackExpansion) 5833 NewType = getSema().Context.getPackExpansionType(NewType, 5834 NumExpansions); 5835 5836 if (ParamInfos) 5837 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5838 OutParamTypes.push_back(NewType); 5839 if (PVars) 5840 PVars->push_back(nullptr); 5841 } 5842 5843 #ifndef NDEBUG 5844 if (PVars) { 5845 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5846 if (ParmVarDecl *parm = (*PVars)[i]) 5847 assert(parm->getFunctionScopeIndex() == i); 5848 } 5849 #endif 5850 5851 return false; 5852 } 5853 5854 template<typename Derived> 5855 QualType 5856 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5857 FunctionProtoTypeLoc TL) { 5858 SmallVector<QualType, 4> ExceptionStorage; 5859 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5860 return getDerived().TransformFunctionProtoType( 5861 TLB, TL, nullptr, Qualifiers(), 5862 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5863 return This->getDerived().TransformExceptionSpec( 5864 TL.getBeginLoc(), ESI, ExceptionStorage, Changed); 5865 }); 5866 } 5867 5868 template<typename Derived> template<typename Fn> 5869 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5870 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5871 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5872 5873 // Transform the parameters and return type. 5874 // 5875 // We are required to instantiate the params and return type in source order. 5876 // When the function has a trailing return type, we instantiate the 5877 // parameters before the return type, since the return type can then refer 5878 // to the parameters themselves (via decltype, sizeof, etc.). 5879 // 5880 SmallVector<QualType, 4> ParamTypes; 5881 SmallVector<ParmVarDecl*, 4> ParamDecls; 5882 Sema::ExtParameterInfoBuilder ExtParamInfos; 5883 const FunctionProtoType *T = TL.getTypePtr(); 5884 5885 QualType ResultType; 5886 5887 if (T->hasTrailingReturn()) { 5888 if (getDerived().TransformFunctionTypeParams( 5889 TL.getBeginLoc(), TL.getParams(), 5890 TL.getTypePtr()->param_type_begin(), 5891 T->getExtParameterInfosOrNull(), 5892 ParamTypes, &ParamDecls, ExtParamInfos)) 5893 return QualType(); 5894 5895 { 5896 // C++11 [expr.prim.general]p3: 5897 // If a declaration declares a member function or member function 5898 // template of a class X, the expression this is a prvalue of type 5899 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5900 // and the end of the function-definition, member-declarator, or 5901 // declarator. 5902 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5903 5904 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5905 if (ResultType.isNull()) 5906 return QualType(); 5907 } 5908 } 5909 else { 5910 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5911 if (ResultType.isNull()) 5912 return QualType(); 5913 5914 if (getDerived().TransformFunctionTypeParams( 5915 TL.getBeginLoc(), TL.getParams(), 5916 TL.getTypePtr()->param_type_begin(), 5917 T->getExtParameterInfosOrNull(), 5918 ParamTypes, &ParamDecls, ExtParamInfos)) 5919 return QualType(); 5920 } 5921 5922 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5923 5924 bool EPIChanged = false; 5925 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5926 return QualType(); 5927 5928 // Handle extended parameter information. 5929 if (auto NewExtParamInfos = 5930 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5931 if (!EPI.ExtParameterInfos || 5932 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5933 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5934 EPIChanged = true; 5935 } 5936 EPI.ExtParameterInfos = NewExtParamInfos; 5937 } else if (EPI.ExtParameterInfos) { 5938 EPIChanged = true; 5939 EPI.ExtParameterInfos = nullptr; 5940 } 5941 5942 QualType Result = TL.getType(); 5943 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5944 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5945 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5946 if (Result.isNull()) 5947 return QualType(); 5948 } 5949 5950 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5951 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5952 NewTL.setLParenLoc(TL.getLParenLoc()); 5953 NewTL.setRParenLoc(TL.getRParenLoc()); 5954 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5955 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5956 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5957 NewTL.setParam(i, ParamDecls[i]); 5958 5959 return Result; 5960 } 5961 5962 template<typename Derived> 5963 bool TreeTransform<Derived>::TransformExceptionSpec( 5964 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5965 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5966 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5967 5968 // Instantiate a dynamic noexcept expression, if any. 5969 if (isComputedNoexcept(ESI.Type)) { 5970 EnterExpressionEvaluationContext Unevaluated( 5971 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5972 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5973 if (NoexceptExpr.isInvalid()) 5974 return true; 5975 5976 ExceptionSpecificationType EST = ESI.Type; 5977 NoexceptExpr = 5978 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 5979 if (NoexceptExpr.isInvalid()) 5980 return true; 5981 5982 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5983 Changed = true; 5984 ESI.NoexceptExpr = NoexceptExpr.get(); 5985 ESI.Type = EST; 5986 } 5987 5988 if (ESI.Type != EST_Dynamic) 5989 return false; 5990 5991 // Instantiate a dynamic exception specification's type. 5992 for (QualType T : ESI.Exceptions) { 5993 if (const PackExpansionType *PackExpansion = 5994 T->getAs<PackExpansionType>()) { 5995 Changed = true; 5996 5997 // We have a pack expansion. Instantiate it. 5998 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5999 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6000 Unexpanded); 6001 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6002 6003 // Determine whether the set of unexpanded parameter packs can and 6004 // should 6005 // be expanded. 6006 bool Expand = false; 6007 bool RetainExpansion = false; 6008 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6009 // FIXME: Track the location of the ellipsis (and track source location 6010 // information for the types in the exception specification in general). 6011 if (getDerived().TryExpandParameterPacks( 6012 Loc, SourceRange(), Unexpanded, Expand, 6013 RetainExpansion, NumExpansions)) 6014 return true; 6015 6016 if (!Expand) { 6017 // We can't expand this pack expansion into separate arguments yet; 6018 // just substitute into the pattern and create a new pack expansion 6019 // type. 6020 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6021 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6022 if (U.isNull()) 6023 return true; 6024 6025 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6026 Exceptions.push_back(U); 6027 continue; 6028 } 6029 6030 // Substitute into the pack expansion pattern for each slice of the 6031 // pack. 6032 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6033 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6034 6035 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6036 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6037 return true; 6038 6039 Exceptions.push_back(U); 6040 } 6041 } else { 6042 QualType U = getDerived().TransformType(T); 6043 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6044 return true; 6045 if (T != U) 6046 Changed = true; 6047 6048 Exceptions.push_back(U); 6049 } 6050 } 6051 6052 ESI.Exceptions = Exceptions; 6053 if (ESI.Exceptions.empty()) 6054 ESI.Type = EST_DynamicNone; 6055 return false; 6056 } 6057 6058 template<typename Derived> 6059 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6060 TypeLocBuilder &TLB, 6061 FunctionNoProtoTypeLoc TL) { 6062 const FunctionNoProtoType *T = TL.getTypePtr(); 6063 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6064 if (ResultType.isNull()) 6065 return QualType(); 6066 6067 QualType Result = TL.getType(); 6068 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6069 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6070 6071 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6072 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6073 NewTL.setLParenLoc(TL.getLParenLoc()); 6074 NewTL.setRParenLoc(TL.getRParenLoc()); 6075 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6076 6077 return Result; 6078 } 6079 6080 template <typename Derived> 6081 QualType TreeTransform<Derived>::TransformUnresolvedUsingType( 6082 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) { 6083 const UnresolvedUsingType *T = TL.getTypePtr(); 6084 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6085 if (!D) 6086 return QualType(); 6087 6088 QualType Result = TL.getType(); 6089 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6090 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6091 if (Result.isNull()) 6092 return QualType(); 6093 } 6094 6095 // We might get an arbitrary type spec type back. We should at 6096 // least always get a type spec type, though. 6097 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6098 NewTL.setNameLoc(TL.getNameLoc()); 6099 6100 return Result; 6101 } 6102 6103 template <typename Derived> 6104 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB, 6105 UsingTypeLoc TL) { 6106 const UsingType *T = TL.getTypePtr(); 6107 6108 auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl( 6109 TL.getLocalSourceRange().getBegin(), T->getFoundDecl())); 6110 if (!Found) 6111 return QualType(); 6112 6113 QualType Underlying = getDerived().TransformType(T->desugar()); 6114 if (Underlying.isNull()) 6115 return QualType(); 6116 6117 QualType Result = TL.getType(); 6118 if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() || 6119 Underlying != T->getUnderlyingType()) { 6120 Result = getDerived().RebuildUsingType(Found, Underlying); 6121 if (Result.isNull()) 6122 return QualType(); 6123 } 6124 6125 TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc()); 6126 return Result; 6127 } 6128 6129 template<typename Derived> 6130 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6131 TypedefTypeLoc TL) { 6132 const TypedefType *T = TL.getTypePtr(); 6133 TypedefNameDecl *Typedef 6134 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6135 T->getDecl())); 6136 if (!Typedef) 6137 return QualType(); 6138 6139 QualType Result = TL.getType(); 6140 if (getDerived().AlwaysRebuild() || 6141 Typedef != T->getDecl()) { 6142 Result = getDerived().RebuildTypedefType(Typedef); 6143 if (Result.isNull()) 6144 return QualType(); 6145 } 6146 6147 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6148 NewTL.setNameLoc(TL.getNameLoc()); 6149 6150 return Result; 6151 } 6152 6153 template<typename Derived> 6154 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6155 TypeOfExprTypeLoc TL) { 6156 // typeof expressions are not potentially evaluated contexts 6157 EnterExpressionEvaluationContext Unevaluated( 6158 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6159 Sema::ReuseLambdaContextDecl); 6160 6161 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6162 if (E.isInvalid()) 6163 return QualType(); 6164 6165 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6166 if (E.isInvalid()) 6167 return QualType(); 6168 6169 QualType Result = TL.getType(); 6170 if (getDerived().AlwaysRebuild() || 6171 E.get() != TL.getUnderlyingExpr()) { 6172 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6173 if (Result.isNull()) 6174 return QualType(); 6175 } 6176 else E.get(); 6177 6178 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6179 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6180 NewTL.setLParenLoc(TL.getLParenLoc()); 6181 NewTL.setRParenLoc(TL.getRParenLoc()); 6182 6183 return Result; 6184 } 6185 6186 template<typename Derived> 6187 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6188 TypeOfTypeLoc TL) { 6189 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6190 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6191 if (!New_Under_TI) 6192 return QualType(); 6193 6194 QualType Result = TL.getType(); 6195 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6196 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6197 if (Result.isNull()) 6198 return QualType(); 6199 } 6200 6201 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6202 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6203 NewTL.setLParenLoc(TL.getLParenLoc()); 6204 NewTL.setRParenLoc(TL.getRParenLoc()); 6205 NewTL.setUnderlyingTInfo(New_Under_TI); 6206 6207 return Result; 6208 } 6209 6210 template<typename Derived> 6211 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6212 DecltypeTypeLoc TL) { 6213 const DecltypeType *T = TL.getTypePtr(); 6214 6215 // decltype expressions are not potentially evaluated contexts 6216 EnterExpressionEvaluationContext Unevaluated( 6217 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6218 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6219 6220 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6221 if (E.isInvalid()) 6222 return QualType(); 6223 6224 E = getSema().ActOnDecltypeExpression(E.get()); 6225 if (E.isInvalid()) 6226 return QualType(); 6227 6228 QualType Result = TL.getType(); 6229 if (getDerived().AlwaysRebuild() || 6230 E.get() != T->getUnderlyingExpr()) { 6231 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6232 if (Result.isNull()) 6233 return QualType(); 6234 } 6235 else E.get(); 6236 6237 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6238 NewTL.setNameLoc(TL.getNameLoc()); 6239 6240 return Result; 6241 } 6242 6243 template<typename Derived> 6244 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6245 TypeLocBuilder &TLB, 6246 UnaryTransformTypeLoc TL) { 6247 QualType Result = TL.getType(); 6248 if (Result->isDependentType()) { 6249 const UnaryTransformType *T = TL.getTypePtr(); 6250 QualType NewBase = 6251 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6252 Result = getDerived().RebuildUnaryTransformType(NewBase, 6253 T->getUTTKind(), 6254 TL.getKWLoc()); 6255 if (Result.isNull()) 6256 return QualType(); 6257 } 6258 6259 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6260 NewTL.setKWLoc(TL.getKWLoc()); 6261 NewTL.setParensRange(TL.getParensRange()); 6262 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6263 return Result; 6264 } 6265 6266 template<typename Derived> 6267 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6268 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6269 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6270 6271 CXXScopeSpec SS; 6272 TemplateName TemplateName = getDerived().TransformTemplateName( 6273 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6274 if (TemplateName.isNull()) 6275 return QualType(); 6276 6277 QualType OldDeduced = T->getDeducedType(); 6278 QualType NewDeduced; 6279 if (!OldDeduced.isNull()) { 6280 NewDeduced = getDerived().TransformType(OldDeduced); 6281 if (NewDeduced.isNull()) 6282 return QualType(); 6283 } 6284 6285 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6286 TemplateName, NewDeduced); 6287 if (Result.isNull()) 6288 return QualType(); 6289 6290 DeducedTemplateSpecializationTypeLoc NewTL = 6291 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6292 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6293 6294 return Result; 6295 } 6296 6297 template<typename Derived> 6298 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6299 RecordTypeLoc TL) { 6300 const RecordType *T = TL.getTypePtr(); 6301 RecordDecl *Record 6302 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6303 T->getDecl())); 6304 if (!Record) 6305 return QualType(); 6306 6307 QualType Result = TL.getType(); 6308 if (getDerived().AlwaysRebuild() || 6309 Record != T->getDecl()) { 6310 Result = getDerived().RebuildRecordType(Record); 6311 if (Result.isNull()) 6312 return QualType(); 6313 } 6314 6315 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6316 NewTL.setNameLoc(TL.getNameLoc()); 6317 6318 return Result; 6319 } 6320 6321 template<typename Derived> 6322 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6323 EnumTypeLoc TL) { 6324 const EnumType *T = TL.getTypePtr(); 6325 EnumDecl *Enum 6326 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6327 T->getDecl())); 6328 if (!Enum) 6329 return QualType(); 6330 6331 QualType Result = TL.getType(); 6332 if (getDerived().AlwaysRebuild() || 6333 Enum != T->getDecl()) { 6334 Result = getDerived().RebuildEnumType(Enum); 6335 if (Result.isNull()) 6336 return QualType(); 6337 } 6338 6339 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6340 NewTL.setNameLoc(TL.getNameLoc()); 6341 6342 return Result; 6343 } 6344 6345 template<typename Derived> 6346 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6347 TypeLocBuilder &TLB, 6348 InjectedClassNameTypeLoc TL) { 6349 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6350 TL.getTypePtr()->getDecl()); 6351 if (!D) return QualType(); 6352 6353 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6354 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6355 return T; 6356 } 6357 6358 template<typename Derived> 6359 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6360 TypeLocBuilder &TLB, 6361 TemplateTypeParmTypeLoc TL) { 6362 return TransformTypeSpecType(TLB, TL); 6363 } 6364 6365 template<typename Derived> 6366 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6367 TypeLocBuilder &TLB, 6368 SubstTemplateTypeParmTypeLoc TL) { 6369 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6370 6371 // Substitute into the replacement type, which itself might involve something 6372 // that needs to be transformed. This only tends to occur with default 6373 // template arguments of template template parameters. 6374 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6375 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6376 if (Replacement.isNull()) 6377 return QualType(); 6378 6379 // Always canonicalize the replacement type. 6380 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6381 QualType Result 6382 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6383 Replacement); 6384 6385 // Propagate type-source information. 6386 SubstTemplateTypeParmTypeLoc NewTL 6387 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6388 NewTL.setNameLoc(TL.getNameLoc()); 6389 return Result; 6390 6391 } 6392 6393 template<typename Derived> 6394 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6395 TypeLocBuilder &TLB, 6396 SubstTemplateTypeParmPackTypeLoc TL) { 6397 return TransformTypeSpecType(TLB, TL); 6398 } 6399 6400 template<typename Derived> 6401 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6402 TypeLocBuilder &TLB, 6403 TemplateSpecializationTypeLoc TL) { 6404 const TemplateSpecializationType *T = TL.getTypePtr(); 6405 6406 // The nested-name-specifier never matters in a TemplateSpecializationType, 6407 // because we can't have a dependent nested-name-specifier anyway. 6408 CXXScopeSpec SS; 6409 TemplateName Template 6410 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6411 TL.getTemplateNameLoc()); 6412 if (Template.isNull()) 6413 return QualType(); 6414 6415 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6416 } 6417 6418 template<typename Derived> 6419 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6420 AtomicTypeLoc TL) { 6421 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6422 if (ValueType.isNull()) 6423 return QualType(); 6424 6425 QualType Result = TL.getType(); 6426 if (getDerived().AlwaysRebuild() || 6427 ValueType != TL.getValueLoc().getType()) { 6428 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6429 if (Result.isNull()) 6430 return QualType(); 6431 } 6432 6433 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6434 NewTL.setKWLoc(TL.getKWLoc()); 6435 NewTL.setLParenLoc(TL.getLParenLoc()); 6436 NewTL.setRParenLoc(TL.getRParenLoc()); 6437 6438 return Result; 6439 } 6440 6441 template <typename Derived> 6442 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6443 PipeTypeLoc TL) { 6444 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6445 if (ValueType.isNull()) 6446 return QualType(); 6447 6448 QualType Result = TL.getType(); 6449 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6450 const PipeType *PT = Result->castAs<PipeType>(); 6451 bool isReadPipe = PT->isReadOnly(); 6452 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6453 if (Result.isNull()) 6454 return QualType(); 6455 } 6456 6457 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6458 NewTL.setKWLoc(TL.getKWLoc()); 6459 6460 return Result; 6461 } 6462 6463 template <typename Derived> 6464 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB, 6465 BitIntTypeLoc TL) { 6466 const BitIntType *EIT = TL.getTypePtr(); 6467 QualType Result = TL.getType(); 6468 6469 if (getDerived().AlwaysRebuild()) { 6470 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(), 6471 EIT->getNumBits(), TL.getNameLoc()); 6472 if (Result.isNull()) 6473 return QualType(); 6474 } 6475 6476 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6477 NewTL.setNameLoc(TL.getNameLoc()); 6478 return Result; 6479 } 6480 6481 template <typename Derived> 6482 QualType TreeTransform<Derived>::TransformDependentBitIntType( 6483 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) { 6484 const DependentBitIntType *EIT = TL.getTypePtr(); 6485 6486 EnterExpressionEvaluationContext Unevaluated( 6487 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6488 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6489 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6490 6491 if (BitsExpr.isInvalid()) 6492 return QualType(); 6493 6494 QualType Result = TL.getType(); 6495 6496 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6497 Result = getDerived().RebuildDependentBitIntType( 6498 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6499 6500 if (Result.isNull()) 6501 return QualType(); 6502 } 6503 6504 if (isa<DependentBitIntType>(Result)) { 6505 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result); 6506 NewTL.setNameLoc(TL.getNameLoc()); 6507 } else { 6508 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6509 NewTL.setNameLoc(TL.getNameLoc()); 6510 } 6511 return Result; 6512 } 6513 6514 /// Simple iterator that traverses the template arguments in a 6515 /// container that provides a \c getArgLoc() member function. 6516 /// 6517 /// This iterator is intended to be used with the iterator form of 6518 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6519 template<typename ArgLocContainer> 6520 class TemplateArgumentLocContainerIterator { 6521 ArgLocContainer *Container; 6522 unsigned Index; 6523 6524 public: 6525 typedef TemplateArgumentLoc value_type; 6526 typedef TemplateArgumentLoc reference; 6527 typedef int difference_type; 6528 typedef std::input_iterator_tag iterator_category; 6529 6530 class pointer { 6531 TemplateArgumentLoc Arg; 6532 6533 public: 6534 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6535 6536 const TemplateArgumentLoc *operator->() const { 6537 return &Arg; 6538 } 6539 }; 6540 6541 6542 TemplateArgumentLocContainerIterator() {} 6543 6544 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6545 unsigned Index) 6546 : Container(&Container), Index(Index) { } 6547 6548 TemplateArgumentLocContainerIterator &operator++() { 6549 ++Index; 6550 return *this; 6551 } 6552 6553 TemplateArgumentLocContainerIterator operator++(int) { 6554 TemplateArgumentLocContainerIterator Old(*this); 6555 ++(*this); 6556 return Old; 6557 } 6558 6559 TemplateArgumentLoc operator*() const { 6560 return Container->getArgLoc(Index); 6561 } 6562 6563 pointer operator->() const { 6564 return pointer(Container->getArgLoc(Index)); 6565 } 6566 6567 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6568 const TemplateArgumentLocContainerIterator &Y) { 6569 return X.Container == Y.Container && X.Index == Y.Index; 6570 } 6571 6572 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6573 const TemplateArgumentLocContainerIterator &Y) { 6574 return !(X == Y); 6575 } 6576 }; 6577 6578 template<typename Derived> 6579 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6580 AutoTypeLoc TL) { 6581 const AutoType *T = TL.getTypePtr(); 6582 QualType OldDeduced = T->getDeducedType(); 6583 QualType NewDeduced; 6584 if (!OldDeduced.isNull()) { 6585 NewDeduced = getDerived().TransformType(OldDeduced); 6586 if (NewDeduced.isNull()) 6587 return QualType(); 6588 } 6589 6590 ConceptDecl *NewCD = nullptr; 6591 TemplateArgumentListInfo NewTemplateArgs; 6592 NestedNameSpecifierLoc NewNestedNameSpec; 6593 if (T->isConstrained()) { 6594 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6595 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6596 6597 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6598 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6599 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6600 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6601 ArgIterator(TL, 6602 TL.getNumArgs()), 6603 NewTemplateArgs)) 6604 return QualType(); 6605 6606 if (TL.getNestedNameSpecifierLoc()) { 6607 NewNestedNameSpec 6608 = getDerived().TransformNestedNameSpecifierLoc( 6609 TL.getNestedNameSpecifierLoc()); 6610 if (!NewNestedNameSpec) 6611 return QualType(); 6612 } 6613 } 6614 6615 QualType Result = TL.getType(); 6616 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6617 T->isDependentType() || T->isConstrained()) { 6618 // FIXME: Maybe don't rebuild if all template arguments are the same. 6619 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6620 NewArgList.reserve(NewTemplateArgs.size()); 6621 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6622 NewArgList.push_back(ArgLoc.getArgument()); 6623 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6624 NewArgList); 6625 if (Result.isNull()) 6626 return QualType(); 6627 } 6628 6629 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6630 NewTL.setNameLoc(TL.getNameLoc()); 6631 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6632 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6633 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6634 NewTL.setFoundDecl(TL.getFoundDecl()); 6635 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6636 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6637 for (unsigned I = 0; I < NewTL.getNumArgs(); ++I) 6638 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6639 6640 return Result; 6641 } 6642 6643 template <typename Derived> 6644 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6645 TypeLocBuilder &TLB, 6646 TemplateSpecializationTypeLoc TL, 6647 TemplateName Template) { 6648 TemplateArgumentListInfo NewTemplateArgs; 6649 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6650 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6651 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6652 ArgIterator; 6653 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6654 ArgIterator(TL, TL.getNumArgs()), 6655 NewTemplateArgs)) 6656 return QualType(); 6657 6658 // FIXME: maybe don't rebuild if all the template arguments are the same. 6659 6660 QualType Result = 6661 getDerived().RebuildTemplateSpecializationType(Template, 6662 TL.getTemplateNameLoc(), 6663 NewTemplateArgs); 6664 6665 if (!Result.isNull()) { 6666 // Specializations of template template parameters are represented as 6667 // TemplateSpecializationTypes, and substitution of type alias templates 6668 // within a dependent context can transform them into 6669 // DependentTemplateSpecializationTypes. 6670 if (isa<DependentTemplateSpecializationType>(Result)) { 6671 DependentTemplateSpecializationTypeLoc NewTL 6672 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6673 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6674 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6675 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6676 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6677 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6678 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6679 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6680 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6681 return Result; 6682 } 6683 6684 TemplateSpecializationTypeLoc NewTL 6685 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6686 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6687 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6688 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6689 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6690 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6691 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6692 } 6693 6694 return Result; 6695 } 6696 6697 template <typename Derived> 6698 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6699 TypeLocBuilder &TLB, 6700 DependentTemplateSpecializationTypeLoc TL, 6701 TemplateName Template, 6702 CXXScopeSpec &SS) { 6703 TemplateArgumentListInfo NewTemplateArgs; 6704 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6705 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6706 typedef TemplateArgumentLocContainerIterator< 6707 DependentTemplateSpecializationTypeLoc> ArgIterator; 6708 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6709 ArgIterator(TL, TL.getNumArgs()), 6710 NewTemplateArgs)) 6711 return QualType(); 6712 6713 // FIXME: maybe don't rebuild if all the template arguments are the same. 6714 6715 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6716 QualType Result 6717 = getSema().Context.getDependentTemplateSpecializationType( 6718 TL.getTypePtr()->getKeyword(), 6719 DTN->getQualifier(), 6720 DTN->getIdentifier(), 6721 NewTemplateArgs); 6722 6723 DependentTemplateSpecializationTypeLoc NewTL 6724 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6725 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6726 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6727 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6728 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6729 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6730 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6731 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6732 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6733 return Result; 6734 } 6735 6736 QualType Result 6737 = getDerived().RebuildTemplateSpecializationType(Template, 6738 TL.getTemplateNameLoc(), 6739 NewTemplateArgs); 6740 6741 if (!Result.isNull()) { 6742 /// FIXME: Wrap this in an elaborated-type-specifier? 6743 TemplateSpecializationTypeLoc NewTL 6744 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6745 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6746 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6747 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6748 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6749 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6750 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6751 } 6752 6753 return Result; 6754 } 6755 6756 template<typename Derived> 6757 QualType 6758 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6759 ElaboratedTypeLoc TL) { 6760 const ElaboratedType *T = TL.getTypePtr(); 6761 6762 NestedNameSpecifierLoc QualifierLoc; 6763 // NOTE: the qualifier in an ElaboratedType is optional. 6764 if (TL.getQualifierLoc()) { 6765 QualifierLoc 6766 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6767 if (!QualifierLoc) 6768 return QualType(); 6769 } 6770 6771 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6772 if (NamedT.isNull()) 6773 return QualType(); 6774 6775 // C++0x [dcl.type.elab]p2: 6776 // If the identifier resolves to a typedef-name or the simple-template-id 6777 // resolves to an alias template specialization, the 6778 // elaborated-type-specifier is ill-formed. 6779 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6780 if (const TemplateSpecializationType *TST = 6781 NamedT->getAs<TemplateSpecializationType>()) { 6782 TemplateName Template = TST->getTemplateName(); 6783 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6784 Template.getAsTemplateDecl())) { 6785 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6786 diag::err_tag_reference_non_tag) 6787 << TAT << Sema::NTK_TypeAliasTemplate 6788 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6789 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6790 } 6791 } 6792 } 6793 6794 QualType Result = TL.getType(); 6795 if (getDerived().AlwaysRebuild() || 6796 QualifierLoc != TL.getQualifierLoc() || 6797 NamedT != T->getNamedType()) { 6798 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6799 T->getKeyword(), 6800 QualifierLoc, NamedT); 6801 if (Result.isNull()) 6802 return QualType(); 6803 } 6804 6805 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6806 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6807 NewTL.setQualifierLoc(QualifierLoc); 6808 return Result; 6809 } 6810 6811 template<typename Derived> 6812 QualType TreeTransform<Derived>::TransformAttributedType( 6813 TypeLocBuilder &TLB, 6814 AttributedTypeLoc TL) { 6815 const AttributedType *oldType = TL.getTypePtr(); 6816 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6817 if (modifiedType.isNull()) 6818 return QualType(); 6819 6820 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6821 const Attr *oldAttr = TL.getAttr(); 6822 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6823 if (oldAttr && !newAttr) 6824 return QualType(); 6825 6826 QualType result = TL.getType(); 6827 6828 // FIXME: dependent operand expressions? 6829 if (getDerived().AlwaysRebuild() || 6830 modifiedType != oldType->getModifiedType()) { 6831 // TODO: this is really lame; we should really be rebuilding the 6832 // equivalent type from first principles. 6833 QualType equivalentType 6834 = getDerived().TransformType(oldType->getEquivalentType()); 6835 if (equivalentType.isNull()) 6836 return QualType(); 6837 6838 // Check whether we can add nullability; it is only represented as 6839 // type sugar, and therefore cannot be diagnosed in any other way. 6840 if (auto nullability = oldType->getImmediateNullability()) { 6841 if (!modifiedType->canHaveNullability()) { 6842 SemaRef.Diag(TL.getAttr()->getLocation(), 6843 diag::err_nullability_nonpointer) 6844 << DiagNullabilityKind(*nullability, false) << modifiedType; 6845 return QualType(); 6846 } 6847 } 6848 6849 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6850 modifiedType, 6851 equivalentType); 6852 } 6853 6854 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6855 newTL.setAttr(newAttr); 6856 return result; 6857 } 6858 6859 template<typename Derived> 6860 QualType 6861 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6862 ParenTypeLoc TL) { 6863 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6864 if (Inner.isNull()) 6865 return QualType(); 6866 6867 QualType Result = TL.getType(); 6868 if (getDerived().AlwaysRebuild() || 6869 Inner != TL.getInnerLoc().getType()) { 6870 Result = getDerived().RebuildParenType(Inner); 6871 if (Result.isNull()) 6872 return QualType(); 6873 } 6874 6875 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6876 NewTL.setLParenLoc(TL.getLParenLoc()); 6877 NewTL.setRParenLoc(TL.getRParenLoc()); 6878 return Result; 6879 } 6880 6881 template <typename Derived> 6882 QualType 6883 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6884 MacroQualifiedTypeLoc TL) { 6885 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6886 if (Inner.isNull()) 6887 return QualType(); 6888 6889 QualType Result = TL.getType(); 6890 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6891 Result = 6892 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6893 if (Result.isNull()) 6894 return QualType(); 6895 } 6896 6897 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6898 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6899 return Result; 6900 } 6901 6902 template<typename Derived> 6903 QualType TreeTransform<Derived>::TransformDependentNameType( 6904 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6905 return TransformDependentNameType(TLB, TL, false); 6906 } 6907 6908 template<typename Derived> 6909 QualType TreeTransform<Derived>::TransformDependentNameType( 6910 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6911 const DependentNameType *T = TL.getTypePtr(); 6912 6913 NestedNameSpecifierLoc QualifierLoc 6914 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6915 if (!QualifierLoc) 6916 return QualType(); 6917 6918 QualType Result 6919 = getDerived().RebuildDependentNameType(T->getKeyword(), 6920 TL.getElaboratedKeywordLoc(), 6921 QualifierLoc, 6922 T->getIdentifier(), 6923 TL.getNameLoc(), 6924 DeducedTSTContext); 6925 if (Result.isNull()) 6926 return QualType(); 6927 6928 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6929 QualType NamedT = ElabT->getNamedType(); 6930 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6931 6932 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6933 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6934 NewTL.setQualifierLoc(QualifierLoc); 6935 } else { 6936 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6937 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6938 NewTL.setQualifierLoc(QualifierLoc); 6939 NewTL.setNameLoc(TL.getNameLoc()); 6940 } 6941 return Result; 6942 } 6943 6944 template<typename Derived> 6945 QualType TreeTransform<Derived>:: 6946 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6947 DependentTemplateSpecializationTypeLoc TL) { 6948 NestedNameSpecifierLoc QualifierLoc; 6949 if (TL.getQualifierLoc()) { 6950 QualifierLoc 6951 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6952 if (!QualifierLoc) 6953 return QualType(); 6954 } 6955 6956 return getDerived() 6957 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6958 } 6959 6960 template<typename Derived> 6961 QualType TreeTransform<Derived>:: 6962 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6963 DependentTemplateSpecializationTypeLoc TL, 6964 NestedNameSpecifierLoc QualifierLoc) { 6965 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6966 6967 TemplateArgumentListInfo NewTemplateArgs; 6968 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6969 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6970 6971 typedef TemplateArgumentLocContainerIterator< 6972 DependentTemplateSpecializationTypeLoc> ArgIterator; 6973 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6974 ArgIterator(TL, TL.getNumArgs()), 6975 NewTemplateArgs)) 6976 return QualType(); 6977 6978 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6979 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6980 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6981 /*AllowInjectedClassName*/ false); 6982 if (Result.isNull()) 6983 return QualType(); 6984 6985 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6986 QualType NamedT = ElabT->getNamedType(); 6987 6988 // Copy information relevant to the template specialization. 6989 TemplateSpecializationTypeLoc NamedTL 6990 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6991 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6992 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6993 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6994 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6995 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6996 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6997 6998 // Copy information relevant to the elaborated type. 6999 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7000 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7001 NewTL.setQualifierLoc(QualifierLoc); 7002 } else if (isa<DependentTemplateSpecializationType>(Result)) { 7003 DependentTemplateSpecializationTypeLoc SpecTL 7004 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 7005 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7006 SpecTL.setQualifierLoc(QualifierLoc); 7007 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7008 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7009 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7010 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7011 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7012 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7013 } else { 7014 TemplateSpecializationTypeLoc SpecTL 7015 = TLB.push<TemplateSpecializationTypeLoc>(Result); 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 } 7023 return Result; 7024 } 7025 7026 template<typename Derived> 7027 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 7028 PackExpansionTypeLoc TL) { 7029 QualType Pattern 7030 = getDerived().TransformType(TLB, TL.getPatternLoc()); 7031 if (Pattern.isNull()) 7032 return QualType(); 7033 7034 QualType Result = TL.getType(); 7035 if (getDerived().AlwaysRebuild() || 7036 Pattern != TL.getPatternLoc().getType()) { 7037 Result = getDerived().RebuildPackExpansionType(Pattern, 7038 TL.getPatternLoc().getSourceRange(), 7039 TL.getEllipsisLoc(), 7040 TL.getTypePtr()->getNumExpansions()); 7041 if (Result.isNull()) 7042 return QualType(); 7043 } 7044 7045 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7046 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7047 return Result; 7048 } 7049 7050 template<typename Derived> 7051 QualType 7052 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7053 ObjCInterfaceTypeLoc TL) { 7054 // ObjCInterfaceType is never dependent. 7055 TLB.pushFullCopy(TL); 7056 return TL.getType(); 7057 } 7058 7059 template<typename Derived> 7060 QualType 7061 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7062 ObjCTypeParamTypeLoc TL) { 7063 const ObjCTypeParamType *T = TL.getTypePtr(); 7064 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7065 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7066 if (!OTP) 7067 return QualType(); 7068 7069 QualType Result = TL.getType(); 7070 if (getDerived().AlwaysRebuild() || 7071 OTP != T->getDecl()) { 7072 Result = getDerived().RebuildObjCTypeParamType(OTP, 7073 TL.getProtocolLAngleLoc(), 7074 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 7075 TL.getNumProtocols()), 7076 TL.getProtocolLocs(), 7077 TL.getProtocolRAngleLoc()); 7078 if (Result.isNull()) 7079 return QualType(); 7080 } 7081 7082 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7083 if (TL.getNumProtocols()) { 7084 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7085 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7086 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7087 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7088 } 7089 return Result; 7090 } 7091 7092 template<typename Derived> 7093 QualType 7094 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7095 ObjCObjectTypeLoc TL) { 7096 // Transform base type. 7097 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7098 if (BaseType.isNull()) 7099 return QualType(); 7100 7101 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7102 7103 // Transform type arguments. 7104 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7105 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7106 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7107 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7108 QualType TypeArg = TypeArgInfo->getType(); 7109 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7110 AnyChanged = true; 7111 7112 // We have a pack expansion. Instantiate it. 7113 const auto *PackExpansion = PackExpansionLoc.getType() 7114 ->castAs<PackExpansionType>(); 7115 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7116 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7117 Unexpanded); 7118 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7119 7120 // Determine whether the set of unexpanded parameter packs can 7121 // and should be expanded. 7122 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7123 bool Expand = false; 7124 bool RetainExpansion = false; 7125 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7126 if (getDerived().TryExpandParameterPacks( 7127 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7128 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7129 return QualType(); 7130 7131 if (!Expand) { 7132 // We can't expand this pack expansion into separate arguments yet; 7133 // just substitute into the pattern and create a new pack expansion 7134 // type. 7135 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7136 7137 TypeLocBuilder TypeArgBuilder; 7138 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7139 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7140 PatternLoc); 7141 if (NewPatternType.isNull()) 7142 return QualType(); 7143 7144 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7145 NewPatternType, NumExpansions); 7146 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7147 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7148 NewTypeArgInfos.push_back( 7149 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7150 continue; 7151 } 7152 7153 // Substitute into the pack expansion pattern for each slice of the 7154 // pack. 7155 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7156 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7157 7158 TypeLocBuilder TypeArgBuilder; 7159 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7160 7161 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7162 PatternLoc); 7163 if (NewTypeArg.isNull()) 7164 return QualType(); 7165 7166 NewTypeArgInfos.push_back( 7167 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7168 } 7169 7170 continue; 7171 } 7172 7173 TypeLocBuilder TypeArgBuilder; 7174 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7175 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7176 if (NewTypeArg.isNull()) 7177 return QualType(); 7178 7179 // If nothing changed, just keep the old TypeSourceInfo. 7180 if (NewTypeArg == TypeArg) { 7181 NewTypeArgInfos.push_back(TypeArgInfo); 7182 continue; 7183 } 7184 7185 NewTypeArgInfos.push_back( 7186 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7187 AnyChanged = true; 7188 } 7189 7190 QualType Result = TL.getType(); 7191 if (getDerived().AlwaysRebuild() || AnyChanged) { 7192 // Rebuild the type. 7193 Result = getDerived().RebuildObjCObjectType( 7194 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7195 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7196 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7197 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7198 7199 if (Result.isNull()) 7200 return QualType(); 7201 } 7202 7203 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7204 NewT.setHasBaseTypeAsWritten(true); 7205 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7206 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7207 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7208 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7209 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7210 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7211 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7212 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7213 return Result; 7214 } 7215 7216 template<typename Derived> 7217 QualType 7218 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7219 ObjCObjectPointerTypeLoc TL) { 7220 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7221 if (PointeeType.isNull()) 7222 return QualType(); 7223 7224 QualType Result = TL.getType(); 7225 if (getDerived().AlwaysRebuild() || 7226 PointeeType != TL.getPointeeLoc().getType()) { 7227 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7228 TL.getStarLoc()); 7229 if (Result.isNull()) 7230 return QualType(); 7231 } 7232 7233 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7234 NewT.setStarLoc(TL.getStarLoc()); 7235 return Result; 7236 } 7237 7238 //===----------------------------------------------------------------------===// 7239 // Statement transformation 7240 //===----------------------------------------------------------------------===// 7241 template<typename Derived> 7242 StmtResult 7243 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7244 return S; 7245 } 7246 7247 template<typename Derived> 7248 StmtResult 7249 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7250 return getDerived().TransformCompoundStmt(S, false); 7251 } 7252 7253 template<typename Derived> 7254 StmtResult 7255 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7256 bool IsStmtExpr) { 7257 Sema::CompoundScopeRAII CompoundScope(getSema()); 7258 7259 const Stmt *ExprResult = S->getStmtExprResult(); 7260 bool SubStmtInvalid = false; 7261 bool SubStmtChanged = false; 7262 SmallVector<Stmt*, 8> Statements; 7263 for (auto *B : S->body()) { 7264 StmtResult Result = getDerived().TransformStmt( 7265 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7266 7267 if (Result.isInvalid()) { 7268 // Immediately fail if this was a DeclStmt, since it's very 7269 // likely that this will cause problems for future statements. 7270 if (isa<DeclStmt>(B)) 7271 return StmtError(); 7272 7273 // Otherwise, just keep processing substatements and fail later. 7274 SubStmtInvalid = true; 7275 continue; 7276 } 7277 7278 SubStmtChanged = SubStmtChanged || Result.get() != B; 7279 Statements.push_back(Result.getAs<Stmt>()); 7280 } 7281 7282 if (SubStmtInvalid) 7283 return StmtError(); 7284 7285 if (!getDerived().AlwaysRebuild() && 7286 !SubStmtChanged) 7287 return S; 7288 7289 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7290 Statements, 7291 S->getRBracLoc(), 7292 IsStmtExpr); 7293 } 7294 7295 template<typename Derived> 7296 StmtResult 7297 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7298 ExprResult LHS, RHS; 7299 { 7300 EnterExpressionEvaluationContext Unevaluated( 7301 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7302 7303 // Transform the left-hand case value. 7304 LHS = getDerived().TransformExpr(S->getLHS()); 7305 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7306 if (LHS.isInvalid()) 7307 return StmtError(); 7308 7309 // Transform the right-hand case value (for the GNU case-range extension). 7310 RHS = getDerived().TransformExpr(S->getRHS()); 7311 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7312 if (RHS.isInvalid()) 7313 return StmtError(); 7314 } 7315 7316 // Build the case statement. 7317 // Case statements are always rebuilt so that they will attached to their 7318 // transformed switch statement. 7319 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7320 LHS.get(), 7321 S->getEllipsisLoc(), 7322 RHS.get(), 7323 S->getColonLoc()); 7324 if (Case.isInvalid()) 7325 return StmtError(); 7326 7327 // Transform the statement following the case 7328 StmtResult SubStmt = 7329 getDerived().TransformStmt(S->getSubStmt()); 7330 if (SubStmt.isInvalid()) 7331 return StmtError(); 7332 7333 // Attach the body to the case statement 7334 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7335 } 7336 7337 template <typename Derived> 7338 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7339 // Transform the statement following the default case 7340 StmtResult SubStmt = 7341 getDerived().TransformStmt(S->getSubStmt()); 7342 if (SubStmt.isInvalid()) 7343 return StmtError(); 7344 7345 // Default statements are always rebuilt 7346 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7347 SubStmt.get()); 7348 } 7349 7350 template<typename Derived> 7351 StmtResult 7352 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7353 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7354 if (SubStmt.isInvalid()) 7355 return StmtError(); 7356 7357 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7358 S->getDecl()); 7359 if (!LD) 7360 return StmtError(); 7361 7362 // If we're transforming "in-place" (we're not creating new local 7363 // declarations), assume we're replacing the old label statement 7364 // and clear out the reference to it. 7365 if (LD == S->getDecl()) 7366 S->getDecl()->setStmt(nullptr); 7367 7368 // FIXME: Pass the real colon location in. 7369 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7370 cast<LabelDecl>(LD), SourceLocation(), 7371 SubStmt.get()); 7372 } 7373 7374 template <typename Derived> 7375 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7376 if (!R) 7377 return R; 7378 7379 switch (R->getKind()) { 7380 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7381 #define ATTR(X) 7382 #define PRAGMA_SPELLING_ATTR(X) \ 7383 case attr::X: \ 7384 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7385 #include "clang/Basic/AttrList.inc" 7386 default: 7387 return R; 7388 } 7389 } 7390 7391 template <typename Derived> 7392 StmtResult 7393 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7394 StmtDiscardKind SDK) { 7395 bool AttrsChanged = false; 7396 SmallVector<const Attr *, 1> Attrs; 7397 7398 // Visit attributes and keep track if any are transformed. 7399 for (const auto *I : S->getAttrs()) { 7400 const Attr *R = getDerived().TransformAttr(I); 7401 AttrsChanged |= (I != R); 7402 if (R) 7403 Attrs.push_back(R); 7404 } 7405 7406 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7407 if (SubStmt.isInvalid()) 7408 return StmtError(); 7409 7410 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7411 return S; 7412 7413 // If transforming the attributes failed for all of the attributes in the 7414 // statement, don't make an AttributedStmt without attributes. 7415 if (Attrs.empty()) 7416 return SubStmt; 7417 7418 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7419 SubStmt.get()); 7420 } 7421 7422 template<typename Derived> 7423 StmtResult 7424 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7425 // Transform the initialization statement 7426 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7427 if (Init.isInvalid()) 7428 return StmtError(); 7429 7430 Sema::ConditionResult Cond; 7431 if (!S->isConsteval()) { 7432 // Transform the condition 7433 Cond = getDerived().TransformCondition( 7434 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7435 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7436 : Sema::ConditionKind::Boolean); 7437 if (Cond.isInvalid()) 7438 return StmtError(); 7439 } 7440 7441 // If this is a constexpr if, determine which arm we should instantiate. 7442 llvm::Optional<bool> ConstexprConditionValue; 7443 if (S->isConstexpr()) 7444 ConstexprConditionValue = Cond.getKnownValue(); 7445 7446 // Transform the "then" branch. 7447 StmtResult Then; 7448 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7449 Then = getDerived().TransformStmt(S->getThen()); 7450 if (Then.isInvalid()) 7451 return StmtError(); 7452 } else { 7453 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7454 } 7455 7456 // Transform the "else" branch. 7457 StmtResult Else; 7458 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7459 Else = getDerived().TransformStmt(S->getElse()); 7460 if (Else.isInvalid()) 7461 return StmtError(); 7462 } 7463 7464 if (!getDerived().AlwaysRebuild() && 7465 Init.get() == S->getInit() && 7466 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7467 Then.get() == S->getThen() && 7468 Else.get() == S->getElse()) 7469 return S; 7470 7471 return getDerived().RebuildIfStmt( 7472 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7473 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7474 } 7475 7476 template<typename Derived> 7477 StmtResult 7478 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7479 // Transform the initialization statement 7480 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7481 if (Init.isInvalid()) 7482 return StmtError(); 7483 7484 // Transform the condition. 7485 Sema::ConditionResult Cond = getDerived().TransformCondition( 7486 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7487 Sema::ConditionKind::Switch); 7488 if (Cond.isInvalid()) 7489 return StmtError(); 7490 7491 // Rebuild the switch statement. 7492 StmtResult Switch = 7493 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7494 Init.get(), Cond, S->getRParenLoc()); 7495 if (Switch.isInvalid()) 7496 return StmtError(); 7497 7498 // Transform the body of the switch statement. 7499 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7500 if (Body.isInvalid()) 7501 return StmtError(); 7502 7503 // Complete the switch statement. 7504 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7505 Body.get()); 7506 } 7507 7508 template<typename Derived> 7509 StmtResult 7510 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7511 // Transform the condition 7512 Sema::ConditionResult Cond = getDerived().TransformCondition( 7513 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7514 Sema::ConditionKind::Boolean); 7515 if (Cond.isInvalid()) 7516 return StmtError(); 7517 7518 // Transform the body 7519 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7520 if (Body.isInvalid()) 7521 return StmtError(); 7522 7523 if (!getDerived().AlwaysRebuild() && 7524 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7525 Body.get() == S->getBody()) 7526 return Owned(S); 7527 7528 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7529 Cond, S->getRParenLoc(), Body.get()); 7530 } 7531 7532 template<typename Derived> 7533 StmtResult 7534 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7535 // Transform the body 7536 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7537 if (Body.isInvalid()) 7538 return StmtError(); 7539 7540 // Transform the condition 7541 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7542 if (Cond.isInvalid()) 7543 return StmtError(); 7544 7545 if (!getDerived().AlwaysRebuild() && 7546 Cond.get() == S->getCond() && 7547 Body.get() == S->getBody()) 7548 return S; 7549 7550 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7551 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7552 S->getRParenLoc()); 7553 } 7554 7555 template<typename Derived> 7556 StmtResult 7557 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7558 if (getSema().getLangOpts().OpenMP) 7559 getSema().startOpenMPLoop(); 7560 7561 // Transform the initialization statement 7562 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7563 if (Init.isInvalid()) 7564 return StmtError(); 7565 7566 // In OpenMP loop region loop control variable must be captured and be 7567 // private. Perform analysis of first part (if any). 7568 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7569 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7570 7571 // Transform the condition 7572 Sema::ConditionResult Cond = getDerived().TransformCondition( 7573 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7574 Sema::ConditionKind::Boolean); 7575 if (Cond.isInvalid()) 7576 return StmtError(); 7577 7578 // Transform the increment 7579 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7580 if (Inc.isInvalid()) 7581 return StmtError(); 7582 7583 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7584 if (S->getInc() && !FullInc.get()) 7585 return StmtError(); 7586 7587 // Transform the body 7588 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7589 if (Body.isInvalid()) 7590 return StmtError(); 7591 7592 if (!getDerived().AlwaysRebuild() && 7593 Init.get() == S->getInit() && 7594 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7595 Inc.get() == S->getInc() && 7596 Body.get() == S->getBody()) 7597 return S; 7598 7599 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7600 Init.get(), Cond, FullInc, 7601 S->getRParenLoc(), Body.get()); 7602 } 7603 7604 template<typename Derived> 7605 StmtResult 7606 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7607 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7608 S->getLabel()); 7609 if (!LD) 7610 return StmtError(); 7611 7612 // Goto statements must always be rebuilt, to resolve the label. 7613 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7614 cast<LabelDecl>(LD)); 7615 } 7616 7617 template<typename Derived> 7618 StmtResult 7619 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7620 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7621 if (Target.isInvalid()) 7622 return StmtError(); 7623 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7624 7625 if (!getDerived().AlwaysRebuild() && 7626 Target.get() == S->getTarget()) 7627 return S; 7628 7629 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7630 Target.get()); 7631 } 7632 7633 template<typename Derived> 7634 StmtResult 7635 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7636 return S; 7637 } 7638 7639 template<typename Derived> 7640 StmtResult 7641 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7642 return S; 7643 } 7644 7645 template<typename Derived> 7646 StmtResult 7647 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7648 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7649 /*NotCopyInit*/false); 7650 if (Result.isInvalid()) 7651 return StmtError(); 7652 7653 // FIXME: We always rebuild the return statement because there is no way 7654 // to tell whether the return type of the function has changed. 7655 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7656 } 7657 7658 template<typename Derived> 7659 StmtResult 7660 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7661 bool DeclChanged = false; 7662 SmallVector<Decl *, 4> Decls; 7663 for (auto *D : S->decls()) { 7664 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7665 if (!Transformed) 7666 return StmtError(); 7667 7668 if (Transformed != D) 7669 DeclChanged = true; 7670 7671 Decls.push_back(Transformed); 7672 } 7673 7674 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7675 return S; 7676 7677 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7678 } 7679 7680 template<typename Derived> 7681 StmtResult 7682 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7683 7684 SmallVector<Expr*, 8> Constraints; 7685 SmallVector<Expr*, 8> Exprs; 7686 SmallVector<IdentifierInfo *, 4> Names; 7687 7688 ExprResult AsmString; 7689 SmallVector<Expr*, 8> Clobbers; 7690 7691 bool ExprsChanged = false; 7692 7693 // Go through the outputs. 7694 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7695 Names.push_back(S->getOutputIdentifier(I)); 7696 7697 // No need to transform the constraint literal. 7698 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7699 7700 // Transform the output expr. 7701 Expr *OutputExpr = S->getOutputExpr(I); 7702 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7703 if (Result.isInvalid()) 7704 return StmtError(); 7705 7706 ExprsChanged |= Result.get() != OutputExpr; 7707 7708 Exprs.push_back(Result.get()); 7709 } 7710 7711 // Go through the inputs. 7712 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7713 Names.push_back(S->getInputIdentifier(I)); 7714 7715 // No need to transform the constraint literal. 7716 Constraints.push_back(S->getInputConstraintLiteral(I)); 7717 7718 // Transform the input expr. 7719 Expr *InputExpr = S->getInputExpr(I); 7720 ExprResult Result = getDerived().TransformExpr(InputExpr); 7721 if (Result.isInvalid()) 7722 return StmtError(); 7723 7724 ExprsChanged |= Result.get() != InputExpr; 7725 7726 Exprs.push_back(Result.get()); 7727 } 7728 7729 // Go through the Labels. 7730 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7731 Names.push_back(S->getLabelIdentifier(I)); 7732 7733 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7734 if (Result.isInvalid()) 7735 return StmtError(); 7736 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7737 Exprs.push_back(Result.get()); 7738 } 7739 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7740 return S; 7741 7742 // Go through the clobbers. 7743 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7744 Clobbers.push_back(S->getClobberStringLiteral(I)); 7745 7746 // No need to transform the asm string literal. 7747 AsmString = S->getAsmString(); 7748 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7749 S->isVolatile(), S->getNumOutputs(), 7750 S->getNumInputs(), Names.data(), 7751 Constraints, Exprs, AsmString.get(), 7752 Clobbers, S->getNumLabels(), 7753 S->getRParenLoc()); 7754 } 7755 7756 template<typename Derived> 7757 StmtResult 7758 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7759 ArrayRef<Token> AsmToks = 7760 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7761 7762 bool HadError = false, HadChange = false; 7763 7764 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7765 SmallVector<Expr*, 8> TransformedExprs; 7766 TransformedExprs.reserve(SrcExprs.size()); 7767 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7768 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7769 if (!Result.isUsable()) { 7770 HadError = true; 7771 } else { 7772 HadChange |= (Result.get() != SrcExprs[i]); 7773 TransformedExprs.push_back(Result.get()); 7774 } 7775 } 7776 7777 if (HadError) return StmtError(); 7778 if (!HadChange && !getDerived().AlwaysRebuild()) 7779 return Owned(S); 7780 7781 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7782 AsmToks, S->getAsmString(), 7783 S->getNumOutputs(), S->getNumInputs(), 7784 S->getAllConstraints(), S->getClobbers(), 7785 TransformedExprs, S->getEndLoc()); 7786 } 7787 7788 // C++ Coroutines TS 7789 7790 template<typename Derived> 7791 StmtResult 7792 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7793 auto *ScopeInfo = SemaRef.getCurFunction(); 7794 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7795 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7796 ScopeInfo->NeedsCoroutineSuspends && 7797 ScopeInfo->CoroutineSuspends.first == nullptr && 7798 ScopeInfo->CoroutineSuspends.second == nullptr && 7799 "expected clean scope info"); 7800 7801 // Set that we have (possibly-invalid) suspend points before we do anything 7802 // that may fail. 7803 ScopeInfo->setNeedsCoroutineSuspends(false); 7804 7805 // We re-build the coroutine promise object (and the coroutine parameters its 7806 // type and constructor depend on) based on the types used in our current 7807 // function. We must do so, and set it on the current FunctionScopeInfo, 7808 // before attempting to transform the other parts of the coroutine body 7809 // statement, such as the implicit suspend statements (because those 7810 // statements reference the FunctionScopeInfo::CoroutinePromise). 7811 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7812 return StmtError(); 7813 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7814 if (!Promise) 7815 return StmtError(); 7816 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7817 ScopeInfo->CoroutinePromise = Promise; 7818 7819 // Transform the implicit coroutine statements constructed using dependent 7820 // types during the previous parse: initial and final suspensions, the return 7821 // object, and others. We also transform the coroutine function's body. 7822 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7823 if (InitSuspend.isInvalid()) 7824 return StmtError(); 7825 StmtResult FinalSuspend = 7826 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7827 if (FinalSuspend.isInvalid() || 7828 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7829 return StmtError(); 7830 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7831 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7832 7833 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7834 if (BodyRes.isInvalid()) 7835 return StmtError(); 7836 7837 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7838 if (Builder.isInvalid()) 7839 return StmtError(); 7840 7841 Expr *ReturnObject = S->getReturnValueInit(); 7842 assert(ReturnObject && "the return object is expected to be valid"); 7843 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7844 /*NoCopyInit*/ false); 7845 if (Res.isInvalid()) 7846 return StmtError(); 7847 Builder.ReturnValue = Res.get(); 7848 7849 // If during the previous parse the coroutine still had a dependent promise 7850 // statement, we may need to build some implicit coroutine statements 7851 // (such as exception and fallthrough handlers) for the first time. 7852 if (S->hasDependentPromiseType()) { 7853 // We can only build these statements, however, if the current promise type 7854 // is not dependent. 7855 if (!Promise->getType()->isDependentType()) { 7856 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7857 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7858 "these nodes should not have been built yet"); 7859 if (!Builder.buildDependentStatements()) 7860 return StmtError(); 7861 } 7862 } else { 7863 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7864 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7865 if (Res.isInvalid()) 7866 return StmtError(); 7867 Builder.OnFallthrough = Res.get(); 7868 } 7869 7870 if (auto *OnException = S->getExceptionHandler()) { 7871 StmtResult Res = getDerived().TransformStmt(OnException); 7872 if (Res.isInvalid()) 7873 return StmtError(); 7874 Builder.OnException = Res.get(); 7875 } 7876 7877 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7878 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7879 if (Res.isInvalid()) 7880 return StmtError(); 7881 Builder.ReturnStmtOnAllocFailure = Res.get(); 7882 } 7883 7884 // Transform any additional statements we may have already built 7885 assert(S->getAllocate() && S->getDeallocate() && 7886 "allocation and deallocation calls must already be built"); 7887 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7888 if (AllocRes.isInvalid()) 7889 return StmtError(); 7890 Builder.Allocate = AllocRes.get(); 7891 7892 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7893 if (DeallocRes.isInvalid()) 7894 return StmtError(); 7895 Builder.Deallocate = DeallocRes.get(); 7896 7897 assert(S->getResultDecl() && "ResultDecl must already be built"); 7898 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7899 if (ResultDecl.isInvalid()) 7900 return StmtError(); 7901 Builder.ResultDecl = ResultDecl.get(); 7902 7903 if (auto *ReturnStmt = S->getReturnStmt()) { 7904 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7905 if (Res.isInvalid()) 7906 return StmtError(); 7907 Builder.ReturnStmt = Res.get(); 7908 } 7909 } 7910 7911 return getDerived().RebuildCoroutineBodyStmt(Builder); 7912 } 7913 7914 template<typename Derived> 7915 StmtResult 7916 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7917 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7918 /*NotCopyInit*/false); 7919 if (Result.isInvalid()) 7920 return StmtError(); 7921 7922 // Always rebuild; we don't know if this needs to be injected into a new 7923 // context or if the promise type has changed. 7924 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7925 S->isImplicit()); 7926 } 7927 7928 template<typename Derived> 7929 ExprResult 7930 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7931 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7932 /*NotCopyInit*/false); 7933 if (Result.isInvalid()) 7934 return ExprError(); 7935 7936 // Always rebuild; we don't know if this needs to be injected into a new 7937 // context or if the promise type has changed. 7938 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7939 E->isImplicit()); 7940 } 7941 7942 template <typename Derived> 7943 ExprResult 7944 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7945 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7946 /*NotCopyInit*/ false); 7947 if (OperandResult.isInvalid()) 7948 return ExprError(); 7949 7950 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7951 E->getOperatorCoawaitLookup()); 7952 7953 if (LookupResult.isInvalid()) 7954 return ExprError(); 7955 7956 // Always rebuild; we don't know if this needs to be injected into a new 7957 // context or if the promise type has changed. 7958 return getDerived().RebuildDependentCoawaitExpr( 7959 E->getKeywordLoc(), OperandResult.get(), 7960 cast<UnresolvedLookupExpr>(LookupResult.get())); 7961 } 7962 7963 template<typename Derived> 7964 ExprResult 7965 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7966 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7967 /*NotCopyInit*/false); 7968 if (Result.isInvalid()) 7969 return ExprError(); 7970 7971 // Always rebuild; we don't know if this needs to be injected into a new 7972 // context or if the promise type has changed. 7973 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7974 } 7975 7976 // Objective-C Statements. 7977 7978 template<typename Derived> 7979 StmtResult 7980 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7981 // Transform the body of the @try. 7982 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7983 if (TryBody.isInvalid()) 7984 return StmtError(); 7985 7986 // Transform the @catch statements (if present). 7987 bool AnyCatchChanged = false; 7988 SmallVector<Stmt*, 8> CatchStmts; 7989 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7990 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7991 if (Catch.isInvalid()) 7992 return StmtError(); 7993 if (Catch.get() != S->getCatchStmt(I)) 7994 AnyCatchChanged = true; 7995 CatchStmts.push_back(Catch.get()); 7996 } 7997 7998 // Transform the @finally statement (if present). 7999 StmtResult Finally; 8000 if (S->getFinallyStmt()) { 8001 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 8002 if (Finally.isInvalid()) 8003 return StmtError(); 8004 } 8005 8006 // If nothing changed, just retain this statement. 8007 if (!getDerived().AlwaysRebuild() && 8008 TryBody.get() == S->getTryBody() && 8009 !AnyCatchChanged && 8010 Finally.get() == S->getFinallyStmt()) 8011 return S; 8012 8013 // Build a new statement. 8014 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 8015 CatchStmts, Finally.get()); 8016 } 8017 8018 template<typename Derived> 8019 StmtResult 8020 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 8021 // Transform the @catch parameter, if there is one. 8022 VarDecl *Var = nullptr; 8023 if (VarDecl *FromVar = S->getCatchParamDecl()) { 8024 TypeSourceInfo *TSInfo = nullptr; 8025 if (FromVar->getTypeSourceInfo()) { 8026 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 8027 if (!TSInfo) 8028 return StmtError(); 8029 } 8030 8031 QualType T; 8032 if (TSInfo) 8033 T = TSInfo->getType(); 8034 else { 8035 T = getDerived().TransformType(FromVar->getType()); 8036 if (T.isNull()) 8037 return StmtError(); 8038 } 8039 8040 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 8041 if (!Var) 8042 return StmtError(); 8043 } 8044 8045 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8046 if (Body.isInvalid()) 8047 return StmtError(); 8048 8049 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8050 S->getRParenLoc(), 8051 Var, Body.get()); 8052 } 8053 8054 template<typename Derived> 8055 StmtResult 8056 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8057 // Transform the body. 8058 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8059 if (Body.isInvalid()) 8060 return StmtError(); 8061 8062 // If nothing changed, just retain this statement. 8063 if (!getDerived().AlwaysRebuild() && 8064 Body.get() == S->getFinallyBody()) 8065 return S; 8066 8067 // Build a new statement. 8068 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8069 Body.get()); 8070 } 8071 8072 template<typename Derived> 8073 StmtResult 8074 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8075 ExprResult Operand; 8076 if (S->getThrowExpr()) { 8077 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8078 if (Operand.isInvalid()) 8079 return StmtError(); 8080 } 8081 8082 if (!getDerived().AlwaysRebuild() && 8083 Operand.get() == S->getThrowExpr()) 8084 return S; 8085 8086 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8087 } 8088 8089 template<typename Derived> 8090 StmtResult 8091 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8092 ObjCAtSynchronizedStmt *S) { 8093 // Transform the object we are locking. 8094 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8095 if (Object.isInvalid()) 8096 return StmtError(); 8097 Object = 8098 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8099 Object.get()); 8100 if (Object.isInvalid()) 8101 return StmtError(); 8102 8103 // Transform the body. 8104 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8105 if (Body.isInvalid()) 8106 return StmtError(); 8107 8108 // If nothing change, just retain the current statement. 8109 if (!getDerived().AlwaysRebuild() && 8110 Object.get() == S->getSynchExpr() && 8111 Body.get() == S->getSynchBody()) 8112 return S; 8113 8114 // Build a new statement. 8115 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8116 Object.get(), Body.get()); 8117 } 8118 8119 template<typename Derived> 8120 StmtResult 8121 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8122 ObjCAutoreleasePoolStmt *S) { 8123 // Transform the body. 8124 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8125 if (Body.isInvalid()) 8126 return StmtError(); 8127 8128 // If nothing changed, just retain this statement. 8129 if (!getDerived().AlwaysRebuild() && 8130 Body.get() == S->getSubStmt()) 8131 return S; 8132 8133 // Build a new statement. 8134 return getDerived().RebuildObjCAutoreleasePoolStmt( 8135 S->getAtLoc(), Body.get()); 8136 } 8137 8138 template<typename Derived> 8139 StmtResult 8140 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8141 ObjCForCollectionStmt *S) { 8142 // Transform the element statement. 8143 StmtResult Element = 8144 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8145 if (Element.isInvalid()) 8146 return StmtError(); 8147 8148 // Transform the collection expression. 8149 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8150 if (Collection.isInvalid()) 8151 return StmtError(); 8152 8153 // Transform the body. 8154 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8155 if (Body.isInvalid()) 8156 return StmtError(); 8157 8158 // If nothing changed, just retain this statement. 8159 if (!getDerived().AlwaysRebuild() && 8160 Element.get() == S->getElement() && 8161 Collection.get() == S->getCollection() && 8162 Body.get() == S->getBody()) 8163 return S; 8164 8165 // Build a new statement. 8166 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8167 Element.get(), 8168 Collection.get(), 8169 S->getRParenLoc(), 8170 Body.get()); 8171 } 8172 8173 template <typename Derived> 8174 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8175 // Transform the exception declaration, if any. 8176 VarDecl *Var = nullptr; 8177 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8178 TypeSourceInfo *T = 8179 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8180 if (!T) 8181 return StmtError(); 8182 8183 Var = getDerived().RebuildExceptionDecl( 8184 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8185 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8186 if (!Var || Var->isInvalidDecl()) 8187 return StmtError(); 8188 } 8189 8190 // Transform the actual exception handler. 8191 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8192 if (Handler.isInvalid()) 8193 return StmtError(); 8194 8195 if (!getDerived().AlwaysRebuild() && !Var && 8196 Handler.get() == S->getHandlerBlock()) 8197 return S; 8198 8199 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8200 } 8201 8202 template <typename Derived> 8203 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8204 // Transform the try block itself. 8205 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8206 if (TryBlock.isInvalid()) 8207 return StmtError(); 8208 8209 // Transform the handlers. 8210 bool HandlerChanged = false; 8211 SmallVector<Stmt *, 8> Handlers; 8212 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8213 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8214 if (Handler.isInvalid()) 8215 return StmtError(); 8216 8217 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8218 Handlers.push_back(Handler.getAs<Stmt>()); 8219 } 8220 8221 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8222 !HandlerChanged) 8223 return S; 8224 8225 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8226 Handlers); 8227 } 8228 8229 template<typename Derived> 8230 StmtResult 8231 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8232 StmtResult Init = 8233 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8234 if (Init.isInvalid()) 8235 return StmtError(); 8236 8237 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8238 if (Range.isInvalid()) 8239 return StmtError(); 8240 8241 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8242 if (Begin.isInvalid()) 8243 return StmtError(); 8244 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8245 if (End.isInvalid()) 8246 return StmtError(); 8247 8248 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8249 if (Cond.isInvalid()) 8250 return StmtError(); 8251 if (Cond.get()) 8252 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8253 if (Cond.isInvalid()) 8254 return StmtError(); 8255 if (Cond.get()) 8256 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8257 8258 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8259 if (Inc.isInvalid()) 8260 return StmtError(); 8261 if (Inc.get()) 8262 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8263 8264 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8265 if (LoopVar.isInvalid()) 8266 return StmtError(); 8267 8268 StmtResult NewStmt = S; 8269 if (getDerived().AlwaysRebuild() || 8270 Init.get() != S->getInit() || 8271 Range.get() != S->getRangeStmt() || 8272 Begin.get() != S->getBeginStmt() || 8273 End.get() != S->getEndStmt() || 8274 Cond.get() != S->getCond() || 8275 Inc.get() != S->getInc() || 8276 LoopVar.get() != S->getLoopVarStmt()) { 8277 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8278 S->getCoawaitLoc(), Init.get(), 8279 S->getColonLoc(), Range.get(), 8280 Begin.get(), End.get(), 8281 Cond.get(), 8282 Inc.get(), LoopVar.get(), 8283 S->getRParenLoc()); 8284 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8285 // Might not have attached any initializer to the loop variable. 8286 getSema().ActOnInitializerError( 8287 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8288 return StmtError(); 8289 } 8290 } 8291 8292 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8293 if (Body.isInvalid()) 8294 return StmtError(); 8295 8296 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8297 // it now so we have a new statement to attach the body to. 8298 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8299 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8300 S->getCoawaitLoc(), Init.get(), 8301 S->getColonLoc(), Range.get(), 8302 Begin.get(), End.get(), 8303 Cond.get(), 8304 Inc.get(), LoopVar.get(), 8305 S->getRParenLoc()); 8306 if (NewStmt.isInvalid()) 8307 return StmtError(); 8308 } 8309 8310 if (NewStmt.get() == S) 8311 return S; 8312 8313 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8314 } 8315 8316 template<typename Derived> 8317 StmtResult 8318 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8319 MSDependentExistsStmt *S) { 8320 // Transform the nested-name-specifier, if any. 8321 NestedNameSpecifierLoc QualifierLoc; 8322 if (S->getQualifierLoc()) { 8323 QualifierLoc 8324 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8325 if (!QualifierLoc) 8326 return StmtError(); 8327 } 8328 8329 // Transform the declaration name. 8330 DeclarationNameInfo NameInfo = S->getNameInfo(); 8331 if (NameInfo.getName()) { 8332 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8333 if (!NameInfo.getName()) 8334 return StmtError(); 8335 } 8336 8337 // Check whether anything changed. 8338 if (!getDerived().AlwaysRebuild() && 8339 QualifierLoc == S->getQualifierLoc() && 8340 NameInfo.getName() == S->getNameInfo().getName()) 8341 return S; 8342 8343 // Determine whether this name exists, if we can. 8344 CXXScopeSpec SS; 8345 SS.Adopt(QualifierLoc); 8346 bool Dependent = false; 8347 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8348 case Sema::IER_Exists: 8349 if (S->isIfExists()) 8350 break; 8351 8352 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8353 8354 case Sema::IER_DoesNotExist: 8355 if (S->isIfNotExists()) 8356 break; 8357 8358 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8359 8360 case Sema::IER_Dependent: 8361 Dependent = true; 8362 break; 8363 8364 case Sema::IER_Error: 8365 return StmtError(); 8366 } 8367 8368 // We need to continue with the instantiation, so do so now. 8369 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8370 if (SubStmt.isInvalid()) 8371 return StmtError(); 8372 8373 // If we have resolved the name, just transform to the substatement. 8374 if (!Dependent) 8375 return SubStmt; 8376 8377 // The name is still dependent, so build a dependent expression again. 8378 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8379 S->isIfExists(), 8380 QualifierLoc, 8381 NameInfo, 8382 SubStmt.get()); 8383 } 8384 8385 template<typename Derived> 8386 ExprResult 8387 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8388 NestedNameSpecifierLoc QualifierLoc; 8389 if (E->getQualifierLoc()) { 8390 QualifierLoc 8391 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8392 if (!QualifierLoc) 8393 return ExprError(); 8394 } 8395 8396 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8397 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8398 if (!PD) 8399 return ExprError(); 8400 8401 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8402 if (Base.isInvalid()) 8403 return ExprError(); 8404 8405 return new (SemaRef.getASTContext()) 8406 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8407 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8408 QualifierLoc, E->getMemberLoc()); 8409 } 8410 8411 template <typename Derived> 8412 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8413 MSPropertySubscriptExpr *E) { 8414 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8415 if (BaseRes.isInvalid()) 8416 return ExprError(); 8417 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8418 if (IdxRes.isInvalid()) 8419 return ExprError(); 8420 8421 if (!getDerived().AlwaysRebuild() && 8422 BaseRes.get() == E->getBase() && 8423 IdxRes.get() == E->getIdx()) 8424 return E; 8425 8426 return getDerived().RebuildArraySubscriptExpr( 8427 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8428 } 8429 8430 template <typename Derived> 8431 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8432 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8433 if (TryBlock.isInvalid()) 8434 return StmtError(); 8435 8436 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8437 if (Handler.isInvalid()) 8438 return StmtError(); 8439 8440 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8441 Handler.get() == S->getHandler()) 8442 return S; 8443 8444 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8445 TryBlock.get(), Handler.get()); 8446 } 8447 8448 template <typename Derived> 8449 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8450 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8451 if (Block.isInvalid()) 8452 return StmtError(); 8453 8454 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8455 } 8456 8457 template <typename Derived> 8458 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8459 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8460 if (FilterExpr.isInvalid()) 8461 return StmtError(); 8462 8463 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8464 if (Block.isInvalid()) 8465 return StmtError(); 8466 8467 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8468 Block.get()); 8469 } 8470 8471 template <typename Derived> 8472 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8473 if (isa<SEHFinallyStmt>(Handler)) 8474 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8475 else 8476 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8477 } 8478 8479 template<typename Derived> 8480 StmtResult 8481 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8482 return S; 8483 } 8484 8485 //===----------------------------------------------------------------------===// 8486 // OpenMP directive transformation 8487 //===----------------------------------------------------------------------===// 8488 8489 template <typename Derived> 8490 StmtResult 8491 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8492 // OMPCanonicalLoops are eliminated during transformation, since they will be 8493 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8494 // after transformation. 8495 return getDerived().TransformStmt(L->getLoopStmt()); 8496 } 8497 8498 template <typename Derived> 8499 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8500 OMPExecutableDirective *D) { 8501 8502 // Transform the clauses 8503 llvm::SmallVector<OMPClause *, 16> TClauses; 8504 ArrayRef<OMPClause *> Clauses = D->clauses(); 8505 TClauses.reserve(Clauses.size()); 8506 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8507 I != E; ++I) { 8508 if (*I) { 8509 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8510 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8511 getDerived().getSema().EndOpenMPClause(); 8512 if (Clause) 8513 TClauses.push_back(Clause); 8514 } else { 8515 TClauses.push_back(nullptr); 8516 } 8517 } 8518 StmtResult AssociatedStmt; 8519 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8520 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8521 /*CurScope=*/nullptr); 8522 StmtResult Body; 8523 { 8524 Sema::CompoundScopeRAII CompoundScope(getSema()); 8525 Stmt *CS; 8526 if (D->getDirectiveKind() == OMPD_atomic || 8527 D->getDirectiveKind() == OMPD_critical || 8528 D->getDirectiveKind() == OMPD_section || 8529 D->getDirectiveKind() == OMPD_master) 8530 CS = D->getAssociatedStmt(); 8531 else 8532 CS = D->getRawStmt(); 8533 Body = getDerived().TransformStmt(CS); 8534 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8535 getSema().getLangOpts().OpenMPIRBuilder) 8536 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8537 } 8538 AssociatedStmt = 8539 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8540 if (AssociatedStmt.isInvalid()) { 8541 return StmtError(); 8542 } 8543 } 8544 if (TClauses.size() != Clauses.size()) { 8545 return StmtError(); 8546 } 8547 8548 // Transform directive name for 'omp critical' directive. 8549 DeclarationNameInfo DirName; 8550 if (D->getDirectiveKind() == OMPD_critical) { 8551 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8552 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8553 } 8554 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8555 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8556 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8557 } else if (D->getDirectiveKind() == OMPD_cancel) { 8558 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8559 } 8560 8561 return getDerived().RebuildOMPExecutableDirective( 8562 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8563 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8564 } 8565 8566 template <typename Derived> 8567 StmtResult 8568 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8569 // TODO: Fix This 8570 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8571 << getOpenMPDirectiveName(D->getDirectiveKind()); 8572 return StmtError(); 8573 } 8574 8575 template <typename Derived> 8576 StmtResult 8577 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8578 DeclarationNameInfo DirName; 8579 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8580 D->getBeginLoc()); 8581 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8582 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8583 return Res; 8584 } 8585 8586 template <typename Derived> 8587 StmtResult 8588 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8589 DeclarationNameInfo DirName; 8590 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8591 D->getBeginLoc()); 8592 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8593 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8594 return Res; 8595 } 8596 8597 template <typename Derived> 8598 StmtResult 8599 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8600 DeclarationNameInfo DirName; 8601 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8602 nullptr, D->getBeginLoc()); 8603 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8604 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8605 return Res; 8606 } 8607 8608 template <typename Derived> 8609 StmtResult 8610 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8611 DeclarationNameInfo DirName; 8612 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8613 nullptr, D->getBeginLoc()); 8614 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8615 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8616 return Res; 8617 } 8618 8619 template <typename Derived> 8620 StmtResult 8621 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8622 DeclarationNameInfo DirName; 8623 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8624 D->getBeginLoc()); 8625 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8626 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8627 return Res; 8628 } 8629 8630 template <typename Derived> 8631 StmtResult 8632 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8633 DeclarationNameInfo DirName; 8634 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8635 D->getBeginLoc()); 8636 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8637 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8638 return Res; 8639 } 8640 8641 template <typename Derived> 8642 StmtResult 8643 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8644 DeclarationNameInfo DirName; 8645 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8646 D->getBeginLoc()); 8647 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8648 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8649 return Res; 8650 } 8651 8652 template <typename Derived> 8653 StmtResult 8654 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8655 DeclarationNameInfo DirName; 8656 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8657 D->getBeginLoc()); 8658 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8659 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8660 return Res; 8661 } 8662 8663 template <typename Derived> 8664 StmtResult 8665 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8666 DeclarationNameInfo DirName; 8667 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8668 D->getBeginLoc()); 8669 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8670 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8671 return Res; 8672 } 8673 8674 template <typename Derived> 8675 StmtResult 8676 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8677 DeclarationNameInfo DirName; 8678 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8679 D->getBeginLoc()); 8680 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8681 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8682 return Res; 8683 } 8684 8685 template <typename Derived> 8686 StmtResult 8687 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8688 getDerived().getSema().StartOpenMPDSABlock( 8689 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8690 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8691 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8692 return Res; 8693 } 8694 8695 template <typename Derived> 8696 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8697 OMPParallelForDirective *D) { 8698 DeclarationNameInfo DirName; 8699 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8700 nullptr, D->getBeginLoc()); 8701 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8702 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8703 return Res; 8704 } 8705 8706 template <typename Derived> 8707 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8708 OMPParallelForSimdDirective *D) { 8709 DeclarationNameInfo DirName; 8710 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8711 nullptr, D->getBeginLoc()); 8712 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8713 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8714 return Res; 8715 } 8716 8717 template <typename Derived> 8718 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8719 OMPParallelMasterDirective *D) { 8720 DeclarationNameInfo DirName; 8721 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8722 nullptr, D->getBeginLoc()); 8723 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8724 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8725 return Res; 8726 } 8727 8728 template <typename Derived> 8729 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8730 OMPParallelSectionsDirective *D) { 8731 DeclarationNameInfo DirName; 8732 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8733 nullptr, D->getBeginLoc()); 8734 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8735 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8736 return Res; 8737 } 8738 8739 template <typename Derived> 8740 StmtResult 8741 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8742 DeclarationNameInfo DirName; 8743 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8744 D->getBeginLoc()); 8745 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8746 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8747 return Res; 8748 } 8749 8750 template <typename Derived> 8751 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8752 OMPTaskyieldDirective *D) { 8753 DeclarationNameInfo DirName; 8754 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8755 D->getBeginLoc()); 8756 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8757 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8758 return Res; 8759 } 8760 8761 template <typename Derived> 8762 StmtResult 8763 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8764 DeclarationNameInfo DirName; 8765 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8766 D->getBeginLoc()); 8767 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8768 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8769 return Res; 8770 } 8771 8772 template <typename Derived> 8773 StmtResult 8774 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8775 DeclarationNameInfo DirName; 8776 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8777 D->getBeginLoc()); 8778 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8779 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8780 return Res; 8781 } 8782 8783 template <typename Derived> 8784 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8785 OMPTaskgroupDirective *D) { 8786 DeclarationNameInfo DirName; 8787 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8788 D->getBeginLoc()); 8789 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8790 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8791 return Res; 8792 } 8793 8794 template <typename Derived> 8795 StmtResult 8796 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8797 DeclarationNameInfo DirName; 8798 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8799 D->getBeginLoc()); 8800 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8801 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8802 return Res; 8803 } 8804 8805 template <typename Derived> 8806 StmtResult 8807 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8808 DeclarationNameInfo DirName; 8809 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8810 D->getBeginLoc()); 8811 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8812 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8813 return Res; 8814 } 8815 8816 template <typename Derived> 8817 StmtResult 8818 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8819 DeclarationNameInfo DirName; 8820 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8821 D->getBeginLoc()); 8822 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8823 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8824 return Res; 8825 } 8826 8827 template <typename Derived> 8828 StmtResult 8829 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8830 DeclarationNameInfo DirName; 8831 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8832 D->getBeginLoc()); 8833 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8834 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8835 return Res; 8836 } 8837 8838 template <typename Derived> 8839 StmtResult 8840 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8841 DeclarationNameInfo DirName; 8842 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8843 D->getBeginLoc()); 8844 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8845 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8846 return Res; 8847 } 8848 8849 template <typename Derived> 8850 StmtResult 8851 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8852 DeclarationNameInfo DirName; 8853 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8854 D->getBeginLoc()); 8855 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8856 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8857 return Res; 8858 } 8859 8860 template <typename Derived> 8861 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8862 OMPTargetDataDirective *D) { 8863 DeclarationNameInfo DirName; 8864 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8865 D->getBeginLoc()); 8866 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8867 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8868 return Res; 8869 } 8870 8871 template <typename Derived> 8872 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8873 OMPTargetEnterDataDirective *D) { 8874 DeclarationNameInfo DirName; 8875 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8876 nullptr, D->getBeginLoc()); 8877 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8878 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8879 return Res; 8880 } 8881 8882 template <typename Derived> 8883 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8884 OMPTargetExitDataDirective *D) { 8885 DeclarationNameInfo DirName; 8886 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8887 nullptr, D->getBeginLoc()); 8888 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8889 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8890 return Res; 8891 } 8892 8893 template <typename Derived> 8894 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8895 OMPTargetParallelDirective *D) { 8896 DeclarationNameInfo DirName; 8897 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8898 nullptr, D->getBeginLoc()); 8899 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8900 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8901 return Res; 8902 } 8903 8904 template <typename Derived> 8905 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8906 OMPTargetParallelForDirective *D) { 8907 DeclarationNameInfo DirName; 8908 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8909 nullptr, D->getBeginLoc()); 8910 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8911 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8912 return Res; 8913 } 8914 8915 template <typename Derived> 8916 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8917 OMPTargetUpdateDirective *D) { 8918 DeclarationNameInfo DirName; 8919 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8920 nullptr, D->getBeginLoc()); 8921 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8922 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8923 return Res; 8924 } 8925 8926 template <typename Derived> 8927 StmtResult 8928 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8929 DeclarationNameInfo DirName; 8930 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8931 D->getBeginLoc()); 8932 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8933 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8934 return Res; 8935 } 8936 8937 template <typename Derived> 8938 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8939 OMPCancellationPointDirective *D) { 8940 DeclarationNameInfo DirName; 8941 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8942 nullptr, D->getBeginLoc()); 8943 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8944 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8945 return Res; 8946 } 8947 8948 template <typename Derived> 8949 StmtResult 8950 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8951 DeclarationNameInfo DirName; 8952 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8953 D->getBeginLoc()); 8954 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8955 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8956 return Res; 8957 } 8958 8959 template <typename Derived> 8960 StmtResult 8961 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8962 DeclarationNameInfo DirName; 8963 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8964 D->getBeginLoc()); 8965 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8966 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8967 return Res; 8968 } 8969 8970 template <typename Derived> 8971 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8972 OMPTaskLoopSimdDirective *D) { 8973 DeclarationNameInfo DirName; 8974 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8975 nullptr, D->getBeginLoc()); 8976 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8977 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8978 return Res; 8979 } 8980 8981 template <typename Derived> 8982 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8983 OMPMasterTaskLoopDirective *D) { 8984 DeclarationNameInfo DirName; 8985 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8986 nullptr, D->getBeginLoc()); 8987 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8988 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8989 return Res; 8990 } 8991 8992 template <typename Derived> 8993 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8994 OMPMasterTaskLoopSimdDirective *D) { 8995 DeclarationNameInfo DirName; 8996 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8997 nullptr, D->getBeginLoc()); 8998 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8999 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9000 return Res; 9001 } 9002 9003 template <typename Derived> 9004 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 9005 OMPParallelMasterTaskLoopDirective *D) { 9006 DeclarationNameInfo DirName; 9007 getDerived().getSema().StartOpenMPDSABlock( 9008 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 9009 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9010 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9011 return Res; 9012 } 9013 9014 template <typename Derived> 9015 StmtResult 9016 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 9017 OMPParallelMasterTaskLoopSimdDirective *D) { 9018 DeclarationNameInfo DirName; 9019 getDerived().getSema().StartOpenMPDSABlock( 9020 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9021 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9022 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9023 return Res; 9024 } 9025 9026 template <typename Derived> 9027 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 9028 OMPDistributeDirective *D) { 9029 DeclarationNameInfo DirName; 9030 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 9031 D->getBeginLoc()); 9032 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9033 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9034 return Res; 9035 } 9036 9037 template <typename Derived> 9038 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 9039 OMPDistributeParallelForDirective *D) { 9040 DeclarationNameInfo DirName; 9041 getDerived().getSema().StartOpenMPDSABlock( 9042 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9043 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9044 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9045 return Res; 9046 } 9047 9048 template <typename Derived> 9049 StmtResult 9050 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9051 OMPDistributeParallelForSimdDirective *D) { 9052 DeclarationNameInfo DirName; 9053 getDerived().getSema().StartOpenMPDSABlock( 9054 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9055 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9056 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9057 return Res; 9058 } 9059 9060 template <typename Derived> 9061 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9062 OMPDistributeSimdDirective *D) { 9063 DeclarationNameInfo DirName; 9064 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9065 nullptr, D->getBeginLoc()); 9066 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9067 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9068 return Res; 9069 } 9070 9071 template <typename Derived> 9072 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 9073 OMPTargetParallelForSimdDirective *D) { 9074 DeclarationNameInfo DirName; 9075 getDerived().getSema().StartOpenMPDSABlock( 9076 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9077 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9078 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9079 return Res; 9080 } 9081 9082 template <typename Derived> 9083 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 9084 OMPTargetSimdDirective *D) { 9085 DeclarationNameInfo DirName; 9086 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 9087 D->getBeginLoc()); 9088 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9089 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9090 return Res; 9091 } 9092 9093 template <typename Derived> 9094 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9095 OMPTeamsDistributeDirective *D) { 9096 DeclarationNameInfo DirName; 9097 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9098 nullptr, D->getBeginLoc()); 9099 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9100 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9101 return Res; 9102 } 9103 9104 template <typename Derived> 9105 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9106 OMPTeamsDistributeSimdDirective *D) { 9107 DeclarationNameInfo DirName; 9108 getDerived().getSema().StartOpenMPDSABlock( 9109 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9110 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9111 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9112 return Res; 9113 } 9114 9115 template <typename Derived> 9116 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9117 OMPTeamsDistributeParallelForSimdDirective *D) { 9118 DeclarationNameInfo DirName; 9119 getDerived().getSema().StartOpenMPDSABlock( 9120 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9121 D->getBeginLoc()); 9122 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9123 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9124 return Res; 9125 } 9126 9127 template <typename Derived> 9128 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9129 OMPTeamsDistributeParallelForDirective *D) { 9130 DeclarationNameInfo DirName; 9131 getDerived().getSema().StartOpenMPDSABlock( 9132 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9133 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9134 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9135 return Res; 9136 } 9137 9138 template <typename Derived> 9139 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9140 OMPTargetTeamsDirective *D) { 9141 DeclarationNameInfo DirName; 9142 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9143 nullptr, D->getBeginLoc()); 9144 auto Res = getDerived().TransformOMPExecutableDirective(D); 9145 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9146 return Res; 9147 } 9148 9149 template <typename Derived> 9150 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9151 OMPTargetTeamsDistributeDirective *D) { 9152 DeclarationNameInfo DirName; 9153 getDerived().getSema().StartOpenMPDSABlock( 9154 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9155 auto Res = getDerived().TransformOMPExecutableDirective(D); 9156 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9157 return Res; 9158 } 9159 9160 template <typename Derived> 9161 StmtResult 9162 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9163 OMPTargetTeamsDistributeParallelForDirective *D) { 9164 DeclarationNameInfo DirName; 9165 getDerived().getSema().StartOpenMPDSABlock( 9166 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9167 D->getBeginLoc()); 9168 auto Res = getDerived().TransformOMPExecutableDirective(D); 9169 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9170 return Res; 9171 } 9172 9173 template <typename Derived> 9174 StmtResult TreeTransform<Derived>:: 9175 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9176 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9177 DeclarationNameInfo DirName; 9178 getDerived().getSema().StartOpenMPDSABlock( 9179 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9180 D->getBeginLoc()); 9181 auto Res = getDerived().TransformOMPExecutableDirective(D); 9182 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9183 return Res; 9184 } 9185 9186 template <typename Derived> 9187 StmtResult 9188 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9189 OMPTargetTeamsDistributeSimdDirective *D) { 9190 DeclarationNameInfo DirName; 9191 getDerived().getSema().StartOpenMPDSABlock( 9192 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9193 auto Res = getDerived().TransformOMPExecutableDirective(D); 9194 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9195 return Res; 9196 } 9197 9198 template <typename Derived> 9199 StmtResult 9200 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9201 DeclarationNameInfo DirName; 9202 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9203 D->getBeginLoc()); 9204 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9205 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9206 return Res; 9207 } 9208 9209 template <typename Derived> 9210 StmtResult 9211 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9212 DeclarationNameInfo DirName; 9213 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9214 D->getBeginLoc()); 9215 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9216 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9217 return Res; 9218 } 9219 9220 template <typename Derived> 9221 StmtResult 9222 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9223 DeclarationNameInfo DirName; 9224 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9225 D->getBeginLoc()); 9226 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9227 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9228 return Res; 9229 } 9230 9231 template <typename Derived> 9232 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9233 OMPGenericLoopDirective *D) { 9234 DeclarationNameInfo DirName; 9235 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9236 D->getBeginLoc()); 9237 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9238 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9239 return Res; 9240 } 9241 9242 //===----------------------------------------------------------------------===// 9243 // OpenMP clause transformation 9244 //===----------------------------------------------------------------------===// 9245 template <typename Derived> 9246 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9247 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9248 if (Cond.isInvalid()) 9249 return nullptr; 9250 return getDerived().RebuildOMPIfClause( 9251 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9252 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9253 } 9254 9255 template <typename Derived> 9256 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9257 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9258 if (Cond.isInvalid()) 9259 return nullptr; 9260 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9261 C->getLParenLoc(), C->getEndLoc()); 9262 } 9263 9264 template <typename Derived> 9265 OMPClause * 9266 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9267 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9268 if (NumThreads.isInvalid()) 9269 return nullptr; 9270 return getDerived().RebuildOMPNumThreadsClause( 9271 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9272 } 9273 9274 template <typename Derived> 9275 OMPClause * 9276 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9277 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9278 if (E.isInvalid()) 9279 return nullptr; 9280 return getDerived().RebuildOMPSafelenClause( 9281 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9282 } 9283 9284 template <typename Derived> 9285 OMPClause * 9286 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9287 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9288 if (E.isInvalid()) 9289 return nullptr; 9290 return getDerived().RebuildOMPAllocatorClause( 9291 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9292 } 9293 9294 template <typename Derived> 9295 OMPClause * 9296 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9297 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9298 if (E.isInvalid()) 9299 return nullptr; 9300 return getDerived().RebuildOMPSimdlenClause( 9301 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9302 } 9303 9304 template <typename Derived> 9305 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9306 SmallVector<Expr *, 4> TransformedSizes; 9307 TransformedSizes.reserve(C->getNumSizes()); 9308 bool Changed = false; 9309 for (Expr *E : C->getSizesRefs()) { 9310 if (!E) { 9311 TransformedSizes.push_back(nullptr); 9312 continue; 9313 } 9314 9315 ExprResult T = getDerived().TransformExpr(E); 9316 if (T.isInvalid()) 9317 return nullptr; 9318 if (E != T.get()) 9319 Changed = true; 9320 TransformedSizes.push_back(T.get()); 9321 } 9322 9323 if (!Changed && !getDerived().AlwaysRebuild()) 9324 return C; 9325 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9326 C->getLParenLoc(), C->getEndLoc()); 9327 } 9328 9329 template <typename Derived> 9330 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9331 if (!getDerived().AlwaysRebuild()) 9332 return C; 9333 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9334 } 9335 9336 template <typename Derived> 9337 OMPClause * 9338 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9339 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9340 if (T.isInvalid()) 9341 return nullptr; 9342 Expr *Factor = T.get(); 9343 bool Changed = Factor != C->getFactor(); 9344 9345 if (!Changed && !getDerived().AlwaysRebuild()) 9346 return C; 9347 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9348 C->getEndLoc()); 9349 } 9350 9351 template <typename Derived> 9352 OMPClause * 9353 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9354 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9355 if (E.isInvalid()) 9356 return nullptr; 9357 return getDerived().RebuildOMPCollapseClause( 9358 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9359 } 9360 9361 template <typename Derived> 9362 OMPClause * 9363 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9364 return getDerived().RebuildOMPDefaultClause( 9365 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9366 C->getLParenLoc(), C->getEndLoc()); 9367 } 9368 9369 template <typename Derived> 9370 OMPClause * 9371 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9372 return getDerived().RebuildOMPProcBindClause( 9373 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9374 C->getLParenLoc(), C->getEndLoc()); 9375 } 9376 9377 template <typename Derived> 9378 OMPClause * 9379 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9380 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9381 if (E.isInvalid()) 9382 return nullptr; 9383 return getDerived().RebuildOMPScheduleClause( 9384 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9385 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9386 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9387 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9388 } 9389 9390 template <typename Derived> 9391 OMPClause * 9392 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9393 ExprResult E; 9394 if (auto *Num = C->getNumForLoops()) { 9395 E = getDerived().TransformExpr(Num); 9396 if (E.isInvalid()) 9397 return nullptr; 9398 } 9399 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9400 C->getLParenLoc(), E.get()); 9401 } 9402 9403 template <typename Derived> 9404 OMPClause * 9405 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9406 ExprResult E; 9407 if (Expr *Evt = C->getEventHandler()) { 9408 E = getDerived().TransformExpr(Evt); 9409 if (E.isInvalid()) 9410 return nullptr; 9411 } 9412 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9413 C->getLParenLoc(), C->getEndLoc()); 9414 } 9415 9416 template <typename Derived> 9417 OMPClause * 9418 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9419 // No need to rebuild this clause, no template-dependent parameters. 9420 return C; 9421 } 9422 9423 template <typename Derived> 9424 OMPClause * 9425 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9426 // No need to rebuild this clause, no template-dependent parameters. 9427 return C; 9428 } 9429 9430 template <typename Derived> 9431 OMPClause * 9432 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9433 // No need to rebuild this clause, no template-dependent parameters. 9434 return C; 9435 } 9436 9437 template <typename Derived> 9438 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9439 // No need to rebuild this clause, no template-dependent parameters. 9440 return C; 9441 } 9442 9443 template <typename Derived> 9444 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9445 // No need to rebuild this clause, no template-dependent parameters. 9446 return C; 9447 } 9448 9449 template <typename Derived> 9450 OMPClause * 9451 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9452 // No need to rebuild this clause, no template-dependent parameters. 9453 return C; 9454 } 9455 9456 template <typename Derived> 9457 OMPClause * 9458 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9459 // No need to rebuild this clause, no template-dependent parameters. 9460 return C; 9461 } 9462 9463 template <typename Derived> 9464 OMPClause * 9465 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) { 9466 // No need to rebuild this clause, no template-dependent parameters. 9467 return C; 9468 } 9469 9470 template <typename Derived> 9471 OMPClause * 9472 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9473 // No need to rebuild this clause, no template-dependent parameters. 9474 return C; 9475 } 9476 9477 template <typename Derived> 9478 OMPClause * 9479 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9480 // No need to rebuild this clause, no template-dependent parameters. 9481 return C; 9482 } 9483 9484 template <typename Derived> 9485 OMPClause * 9486 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9487 // No need to rebuild this clause, no template-dependent parameters. 9488 return C; 9489 } 9490 9491 template <typename Derived> 9492 OMPClause * 9493 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9494 // No need to rebuild this clause, no template-dependent parameters. 9495 return C; 9496 } 9497 9498 template <typename Derived> 9499 OMPClause * 9500 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9501 // No need to rebuild this clause, no template-dependent parameters. 9502 return C; 9503 } 9504 9505 template <typename Derived> 9506 OMPClause * 9507 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9508 // No need to rebuild this clause, no template-dependent parameters. 9509 return C; 9510 } 9511 9512 template <typename Derived> 9513 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9514 // No need to rebuild this clause, no template-dependent parameters. 9515 return C; 9516 } 9517 9518 template <typename Derived> 9519 OMPClause * 9520 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9521 // No need to rebuild this clause, no template-dependent parameters. 9522 return C; 9523 } 9524 9525 template <typename Derived> 9526 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9527 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9528 if (IVR.isInvalid()) 9529 return nullptr; 9530 9531 llvm::SmallVector<Expr *, 8> PrefExprs; 9532 PrefExprs.reserve(C->varlist_size() - 1); 9533 for (Expr *E : llvm::drop_begin(C->varlists())) { 9534 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9535 if (ER.isInvalid()) 9536 return nullptr; 9537 PrefExprs.push_back(ER.get()); 9538 } 9539 return getDerived().RebuildOMPInitClause( 9540 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9541 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9542 } 9543 9544 template <typename Derived> 9545 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9546 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9547 if (ER.isInvalid()) 9548 return nullptr; 9549 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9550 C->getLParenLoc(), C->getVarLoc(), 9551 C->getEndLoc()); 9552 } 9553 9554 template <typename Derived> 9555 OMPClause * 9556 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9557 ExprResult ER; 9558 if (Expr *IV = C->getInteropVar()) { 9559 ER = getDerived().TransformExpr(IV); 9560 if (ER.isInvalid()) 9561 return nullptr; 9562 } 9563 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9564 C->getLParenLoc(), C->getVarLoc(), 9565 C->getEndLoc()); 9566 } 9567 9568 template <typename Derived> 9569 OMPClause * 9570 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9571 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9572 if (Cond.isInvalid()) 9573 return nullptr; 9574 return getDerived().RebuildOMPNovariantsClause( 9575 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9576 } 9577 9578 template <typename Derived> 9579 OMPClause * 9580 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9581 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9582 if (Cond.isInvalid()) 9583 return nullptr; 9584 return getDerived().RebuildOMPNocontextClause( 9585 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9586 } 9587 9588 template <typename Derived> 9589 OMPClause * 9590 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9591 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9592 if (ThreadID.isInvalid()) 9593 return nullptr; 9594 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9595 C->getLParenLoc(), C->getEndLoc()); 9596 } 9597 9598 template <typename Derived> 9599 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) { 9600 ExprResult E = getDerived().TransformExpr(C->getAlignment()); 9601 if (E.isInvalid()) 9602 return nullptr; 9603 return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(), 9604 C->getLParenLoc(), C->getEndLoc()); 9605 } 9606 9607 template <typename Derived> 9608 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9609 OMPUnifiedAddressClause *C) { 9610 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9611 } 9612 9613 template <typename Derived> 9614 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9615 OMPUnifiedSharedMemoryClause *C) { 9616 llvm_unreachable( 9617 "unified_shared_memory clause cannot appear in dependent context"); 9618 } 9619 9620 template <typename Derived> 9621 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9622 OMPReverseOffloadClause *C) { 9623 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9624 } 9625 9626 template <typename Derived> 9627 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9628 OMPDynamicAllocatorsClause *C) { 9629 llvm_unreachable( 9630 "dynamic_allocators clause cannot appear in dependent context"); 9631 } 9632 9633 template <typename Derived> 9634 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9635 OMPAtomicDefaultMemOrderClause *C) { 9636 llvm_unreachable( 9637 "atomic_default_mem_order clause cannot appear in dependent context"); 9638 } 9639 9640 template <typename Derived> 9641 OMPClause * 9642 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9643 llvm::SmallVector<Expr *, 16> Vars; 9644 Vars.reserve(C->varlist_size()); 9645 for (auto *VE : C->varlists()) { 9646 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9647 if (EVar.isInvalid()) 9648 return nullptr; 9649 Vars.push_back(EVar.get()); 9650 } 9651 return getDerived().RebuildOMPPrivateClause( 9652 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9653 } 9654 9655 template <typename Derived> 9656 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9657 OMPFirstprivateClause *C) { 9658 llvm::SmallVector<Expr *, 16> Vars; 9659 Vars.reserve(C->varlist_size()); 9660 for (auto *VE : C->varlists()) { 9661 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9662 if (EVar.isInvalid()) 9663 return nullptr; 9664 Vars.push_back(EVar.get()); 9665 } 9666 return getDerived().RebuildOMPFirstprivateClause( 9667 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9668 } 9669 9670 template <typename Derived> 9671 OMPClause * 9672 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9673 llvm::SmallVector<Expr *, 16> Vars; 9674 Vars.reserve(C->varlist_size()); 9675 for (auto *VE : C->varlists()) { 9676 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9677 if (EVar.isInvalid()) 9678 return nullptr; 9679 Vars.push_back(EVar.get()); 9680 } 9681 return getDerived().RebuildOMPLastprivateClause( 9682 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9683 C->getLParenLoc(), C->getEndLoc()); 9684 } 9685 9686 template <typename Derived> 9687 OMPClause * 9688 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9689 llvm::SmallVector<Expr *, 16> Vars; 9690 Vars.reserve(C->varlist_size()); 9691 for (auto *VE : C->varlists()) { 9692 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9693 if (EVar.isInvalid()) 9694 return nullptr; 9695 Vars.push_back(EVar.get()); 9696 } 9697 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9698 C->getLParenLoc(), C->getEndLoc()); 9699 } 9700 9701 template <typename Derived> 9702 OMPClause * 9703 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9704 llvm::SmallVector<Expr *, 16> Vars; 9705 Vars.reserve(C->varlist_size()); 9706 for (auto *VE : C->varlists()) { 9707 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9708 if (EVar.isInvalid()) 9709 return nullptr; 9710 Vars.push_back(EVar.get()); 9711 } 9712 CXXScopeSpec ReductionIdScopeSpec; 9713 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9714 9715 DeclarationNameInfo NameInfo = C->getNameInfo(); 9716 if (NameInfo.getName()) { 9717 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9718 if (!NameInfo.getName()) 9719 return nullptr; 9720 } 9721 // Build a list of all UDR decls with the same names ranged by the Scopes. 9722 // The Scope boundary is a duplication of the previous decl. 9723 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9724 for (auto *E : C->reduction_ops()) { 9725 // Transform all the decls. 9726 if (E) { 9727 auto *ULE = cast<UnresolvedLookupExpr>(E); 9728 UnresolvedSet<8> Decls; 9729 for (auto *D : ULE->decls()) { 9730 NamedDecl *InstD = 9731 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9732 Decls.addDecl(InstD, InstD->getAccess()); 9733 } 9734 UnresolvedReductions.push_back( 9735 UnresolvedLookupExpr::Create( 9736 SemaRef.Context, /*NamingClass=*/nullptr, 9737 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9738 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9739 Decls.begin(), Decls.end())); 9740 } else 9741 UnresolvedReductions.push_back(nullptr); 9742 } 9743 return getDerived().RebuildOMPReductionClause( 9744 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9745 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9746 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9747 } 9748 9749 template <typename Derived> 9750 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9751 OMPTaskReductionClause *C) { 9752 llvm::SmallVector<Expr *, 16> Vars; 9753 Vars.reserve(C->varlist_size()); 9754 for (auto *VE : C->varlists()) { 9755 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9756 if (EVar.isInvalid()) 9757 return nullptr; 9758 Vars.push_back(EVar.get()); 9759 } 9760 CXXScopeSpec ReductionIdScopeSpec; 9761 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9762 9763 DeclarationNameInfo NameInfo = C->getNameInfo(); 9764 if (NameInfo.getName()) { 9765 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9766 if (!NameInfo.getName()) 9767 return nullptr; 9768 } 9769 // Build a list of all UDR decls with the same names ranged by the Scopes. 9770 // The Scope boundary is a duplication of the previous decl. 9771 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9772 for (auto *E : C->reduction_ops()) { 9773 // Transform all the decls. 9774 if (E) { 9775 auto *ULE = cast<UnresolvedLookupExpr>(E); 9776 UnresolvedSet<8> Decls; 9777 for (auto *D : ULE->decls()) { 9778 NamedDecl *InstD = 9779 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9780 Decls.addDecl(InstD, InstD->getAccess()); 9781 } 9782 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9783 SemaRef.Context, /*NamingClass=*/nullptr, 9784 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9785 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9786 } else 9787 UnresolvedReductions.push_back(nullptr); 9788 } 9789 return getDerived().RebuildOMPTaskReductionClause( 9790 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9791 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9792 } 9793 9794 template <typename Derived> 9795 OMPClause * 9796 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9797 llvm::SmallVector<Expr *, 16> Vars; 9798 Vars.reserve(C->varlist_size()); 9799 for (auto *VE : C->varlists()) { 9800 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9801 if (EVar.isInvalid()) 9802 return nullptr; 9803 Vars.push_back(EVar.get()); 9804 } 9805 CXXScopeSpec ReductionIdScopeSpec; 9806 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9807 9808 DeclarationNameInfo NameInfo = C->getNameInfo(); 9809 if (NameInfo.getName()) { 9810 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9811 if (!NameInfo.getName()) 9812 return nullptr; 9813 } 9814 // Build a list of all UDR decls with the same names ranged by the Scopes. 9815 // The Scope boundary is a duplication of the previous decl. 9816 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9817 for (auto *E : C->reduction_ops()) { 9818 // Transform all the decls. 9819 if (E) { 9820 auto *ULE = cast<UnresolvedLookupExpr>(E); 9821 UnresolvedSet<8> Decls; 9822 for (auto *D : ULE->decls()) { 9823 NamedDecl *InstD = 9824 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9825 Decls.addDecl(InstD, InstD->getAccess()); 9826 } 9827 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9828 SemaRef.Context, /*NamingClass=*/nullptr, 9829 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9830 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9831 } else 9832 UnresolvedReductions.push_back(nullptr); 9833 } 9834 return getDerived().RebuildOMPInReductionClause( 9835 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9836 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9837 } 9838 9839 template <typename Derived> 9840 OMPClause * 9841 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9842 llvm::SmallVector<Expr *, 16> Vars; 9843 Vars.reserve(C->varlist_size()); 9844 for (auto *VE : C->varlists()) { 9845 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9846 if (EVar.isInvalid()) 9847 return nullptr; 9848 Vars.push_back(EVar.get()); 9849 } 9850 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9851 if (Step.isInvalid()) 9852 return nullptr; 9853 return getDerived().RebuildOMPLinearClause( 9854 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9855 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9856 } 9857 9858 template <typename Derived> 9859 OMPClause * 9860 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9861 llvm::SmallVector<Expr *, 16> Vars; 9862 Vars.reserve(C->varlist_size()); 9863 for (auto *VE : C->varlists()) { 9864 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9865 if (EVar.isInvalid()) 9866 return nullptr; 9867 Vars.push_back(EVar.get()); 9868 } 9869 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9870 if (Alignment.isInvalid()) 9871 return nullptr; 9872 return getDerived().RebuildOMPAlignedClause( 9873 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9874 C->getColonLoc(), C->getEndLoc()); 9875 } 9876 9877 template <typename Derived> 9878 OMPClause * 9879 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9880 llvm::SmallVector<Expr *, 16> Vars; 9881 Vars.reserve(C->varlist_size()); 9882 for (auto *VE : C->varlists()) { 9883 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9884 if (EVar.isInvalid()) 9885 return nullptr; 9886 Vars.push_back(EVar.get()); 9887 } 9888 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9889 C->getLParenLoc(), C->getEndLoc()); 9890 } 9891 9892 template <typename Derived> 9893 OMPClause * 9894 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9895 llvm::SmallVector<Expr *, 16> Vars; 9896 Vars.reserve(C->varlist_size()); 9897 for (auto *VE : C->varlists()) { 9898 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9899 if (EVar.isInvalid()) 9900 return nullptr; 9901 Vars.push_back(EVar.get()); 9902 } 9903 return getDerived().RebuildOMPCopyprivateClause( 9904 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9905 } 9906 9907 template <typename Derived> 9908 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9909 llvm::SmallVector<Expr *, 16> Vars; 9910 Vars.reserve(C->varlist_size()); 9911 for (auto *VE : C->varlists()) { 9912 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9913 if (EVar.isInvalid()) 9914 return nullptr; 9915 Vars.push_back(EVar.get()); 9916 } 9917 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9918 C->getLParenLoc(), C->getEndLoc()); 9919 } 9920 9921 template <typename Derived> 9922 OMPClause * 9923 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9924 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9925 if (E.isInvalid()) 9926 return nullptr; 9927 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9928 C->getLParenLoc(), C->getEndLoc()); 9929 } 9930 9931 template <typename Derived> 9932 OMPClause * 9933 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9934 llvm::SmallVector<Expr *, 16> Vars; 9935 Expr *DepModifier = C->getModifier(); 9936 if (DepModifier) { 9937 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9938 if (DepModRes.isInvalid()) 9939 return nullptr; 9940 DepModifier = DepModRes.get(); 9941 } 9942 Vars.reserve(C->varlist_size()); 9943 for (auto *VE : C->varlists()) { 9944 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9945 if (EVar.isInvalid()) 9946 return nullptr; 9947 Vars.push_back(EVar.get()); 9948 } 9949 return getDerived().RebuildOMPDependClause( 9950 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9951 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9952 C->getEndLoc()); 9953 } 9954 9955 template <typename Derived> 9956 OMPClause * 9957 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9958 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9959 if (E.isInvalid()) 9960 return nullptr; 9961 return getDerived().RebuildOMPDeviceClause( 9962 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9963 C->getModifierLoc(), C->getEndLoc()); 9964 } 9965 9966 template <typename Derived, class T> 9967 bool transformOMPMappableExprListClause( 9968 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9969 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9970 DeclarationNameInfo &MapperIdInfo, 9971 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9972 // Transform expressions in the list. 9973 Vars.reserve(C->varlist_size()); 9974 for (auto *VE : C->varlists()) { 9975 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9976 if (EVar.isInvalid()) 9977 return true; 9978 Vars.push_back(EVar.get()); 9979 } 9980 // Transform mapper scope specifier and identifier. 9981 NestedNameSpecifierLoc QualifierLoc; 9982 if (C->getMapperQualifierLoc()) { 9983 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9984 C->getMapperQualifierLoc()); 9985 if (!QualifierLoc) 9986 return true; 9987 } 9988 MapperIdScopeSpec.Adopt(QualifierLoc); 9989 MapperIdInfo = C->getMapperIdInfo(); 9990 if (MapperIdInfo.getName()) { 9991 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9992 if (!MapperIdInfo.getName()) 9993 return true; 9994 } 9995 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9996 // the previous user-defined mapper lookup in dependent environment. 9997 for (auto *E : C->mapperlists()) { 9998 // Transform all the decls. 9999 if (E) { 10000 auto *ULE = cast<UnresolvedLookupExpr>(E); 10001 UnresolvedSet<8> Decls; 10002 for (auto *D : ULE->decls()) { 10003 NamedDecl *InstD = 10004 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 10005 Decls.addDecl(InstD, InstD->getAccess()); 10006 } 10007 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 10008 TT.getSema().Context, /*NamingClass=*/nullptr, 10009 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 10010 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 10011 Decls.end())); 10012 } else { 10013 UnresolvedMappers.push_back(nullptr); 10014 } 10015 } 10016 return false; 10017 } 10018 10019 template <typename Derived> 10020 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 10021 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10022 llvm::SmallVector<Expr *, 16> Vars; 10023 CXXScopeSpec MapperIdScopeSpec; 10024 DeclarationNameInfo MapperIdInfo; 10025 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10026 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 10027 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10028 return nullptr; 10029 return getDerived().RebuildOMPMapClause( 10030 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 10031 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 10032 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10033 } 10034 10035 template <typename Derived> 10036 OMPClause * 10037 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 10038 Expr *Allocator = C->getAllocator(); 10039 if (Allocator) { 10040 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 10041 if (AllocatorRes.isInvalid()) 10042 return nullptr; 10043 Allocator = AllocatorRes.get(); 10044 } 10045 llvm::SmallVector<Expr *, 16> Vars; 10046 Vars.reserve(C->varlist_size()); 10047 for (auto *VE : C->varlists()) { 10048 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10049 if (EVar.isInvalid()) 10050 return nullptr; 10051 Vars.push_back(EVar.get()); 10052 } 10053 return getDerived().RebuildOMPAllocateClause( 10054 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10055 C->getEndLoc()); 10056 } 10057 10058 template <typename Derived> 10059 OMPClause * 10060 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10061 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10062 if (E.isInvalid()) 10063 return nullptr; 10064 return getDerived().RebuildOMPNumTeamsClause( 10065 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10066 } 10067 10068 template <typename Derived> 10069 OMPClause * 10070 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10071 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10072 if (E.isInvalid()) 10073 return nullptr; 10074 return getDerived().RebuildOMPThreadLimitClause( 10075 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10076 } 10077 10078 template <typename Derived> 10079 OMPClause * 10080 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10081 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10082 if (E.isInvalid()) 10083 return nullptr; 10084 return getDerived().RebuildOMPPriorityClause( 10085 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10086 } 10087 10088 template <typename Derived> 10089 OMPClause * 10090 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10091 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10092 if (E.isInvalid()) 10093 return nullptr; 10094 return getDerived().RebuildOMPGrainsizeClause( 10095 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10096 } 10097 10098 template <typename Derived> 10099 OMPClause * 10100 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10101 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10102 if (E.isInvalid()) 10103 return nullptr; 10104 return getDerived().RebuildOMPNumTasksClause( 10105 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10106 } 10107 10108 template <typename Derived> 10109 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10110 ExprResult E = getDerived().TransformExpr(C->getHint()); 10111 if (E.isInvalid()) 10112 return nullptr; 10113 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10114 C->getLParenLoc(), C->getEndLoc()); 10115 } 10116 10117 template <typename Derived> 10118 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10119 OMPDistScheduleClause *C) { 10120 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10121 if (E.isInvalid()) 10122 return nullptr; 10123 return getDerived().RebuildOMPDistScheduleClause( 10124 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10125 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10126 } 10127 10128 template <typename Derived> 10129 OMPClause * 10130 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10131 // Rebuild Defaultmap Clause since we need to invoke the checking of 10132 // defaultmap(none:variable-category) after template initialization. 10133 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10134 C->getDefaultmapKind(), 10135 C->getBeginLoc(), 10136 C->getLParenLoc(), 10137 C->getDefaultmapModifierLoc(), 10138 C->getDefaultmapKindLoc(), 10139 C->getEndLoc()); 10140 } 10141 10142 template <typename Derived> 10143 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10144 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10145 llvm::SmallVector<Expr *, 16> Vars; 10146 CXXScopeSpec MapperIdScopeSpec; 10147 DeclarationNameInfo MapperIdInfo; 10148 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10149 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10150 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10151 return nullptr; 10152 return getDerived().RebuildOMPToClause( 10153 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10154 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10155 } 10156 10157 template <typename Derived> 10158 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10159 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10160 llvm::SmallVector<Expr *, 16> Vars; 10161 CXXScopeSpec MapperIdScopeSpec; 10162 DeclarationNameInfo MapperIdInfo; 10163 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10164 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10165 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10166 return nullptr; 10167 return getDerived().RebuildOMPFromClause( 10168 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10169 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10170 } 10171 10172 template <typename Derived> 10173 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10174 OMPUseDevicePtrClause *C) { 10175 llvm::SmallVector<Expr *, 16> Vars; 10176 Vars.reserve(C->varlist_size()); 10177 for (auto *VE : C->varlists()) { 10178 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10179 if (EVar.isInvalid()) 10180 return nullptr; 10181 Vars.push_back(EVar.get()); 10182 } 10183 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10184 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10185 } 10186 10187 template <typename Derived> 10188 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10189 OMPUseDeviceAddrClause *C) { 10190 llvm::SmallVector<Expr *, 16> Vars; 10191 Vars.reserve(C->varlist_size()); 10192 for (auto *VE : C->varlists()) { 10193 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10194 if (EVar.isInvalid()) 10195 return nullptr; 10196 Vars.push_back(EVar.get()); 10197 } 10198 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10199 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10200 } 10201 10202 template <typename Derived> 10203 OMPClause * 10204 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10205 llvm::SmallVector<Expr *, 16> Vars; 10206 Vars.reserve(C->varlist_size()); 10207 for (auto *VE : C->varlists()) { 10208 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10209 if (EVar.isInvalid()) 10210 return nullptr; 10211 Vars.push_back(EVar.get()); 10212 } 10213 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10214 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10215 } 10216 10217 template <typename Derived> 10218 OMPClause * 10219 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10220 llvm::SmallVector<Expr *, 16> Vars; 10221 Vars.reserve(C->varlist_size()); 10222 for (auto *VE : C->varlists()) { 10223 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10224 if (EVar.isInvalid()) 10225 return nullptr; 10226 Vars.push_back(EVar.get()); 10227 } 10228 return getDerived().RebuildOMPNontemporalClause( 10229 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10230 } 10231 10232 template <typename Derived> 10233 OMPClause * 10234 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10235 llvm::SmallVector<Expr *, 16> Vars; 10236 Vars.reserve(C->varlist_size()); 10237 for (auto *VE : C->varlists()) { 10238 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10239 if (EVar.isInvalid()) 10240 return nullptr; 10241 Vars.push_back(EVar.get()); 10242 } 10243 return getDerived().RebuildOMPInclusiveClause( 10244 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10245 } 10246 10247 template <typename Derived> 10248 OMPClause * 10249 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10250 llvm::SmallVector<Expr *, 16> Vars; 10251 Vars.reserve(C->varlist_size()); 10252 for (auto *VE : C->varlists()) { 10253 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10254 if (EVar.isInvalid()) 10255 return nullptr; 10256 Vars.push_back(EVar.get()); 10257 } 10258 return getDerived().RebuildOMPExclusiveClause( 10259 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10260 } 10261 10262 template <typename Derived> 10263 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10264 OMPUsesAllocatorsClause *C) { 10265 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10266 Data.reserve(C->getNumberOfAllocators()); 10267 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10268 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10269 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10270 if (Allocator.isInvalid()) 10271 continue; 10272 ExprResult AllocatorTraits; 10273 if (Expr *AT = D.AllocatorTraits) { 10274 AllocatorTraits = getDerived().TransformExpr(AT); 10275 if (AllocatorTraits.isInvalid()) 10276 continue; 10277 } 10278 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10279 NewD.Allocator = Allocator.get(); 10280 NewD.AllocatorTraits = AllocatorTraits.get(); 10281 NewD.LParenLoc = D.LParenLoc; 10282 NewD.RParenLoc = D.RParenLoc; 10283 } 10284 return getDerived().RebuildOMPUsesAllocatorsClause( 10285 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10286 } 10287 10288 template <typename Derived> 10289 OMPClause * 10290 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10291 SmallVector<Expr *, 4> Locators; 10292 Locators.reserve(C->varlist_size()); 10293 ExprResult ModifierRes; 10294 if (Expr *Modifier = C->getModifier()) { 10295 ModifierRes = getDerived().TransformExpr(Modifier); 10296 if (ModifierRes.isInvalid()) 10297 return nullptr; 10298 } 10299 for (Expr *E : C->varlists()) { 10300 ExprResult Locator = getDerived().TransformExpr(E); 10301 if (Locator.isInvalid()) 10302 continue; 10303 Locators.push_back(Locator.get()); 10304 } 10305 return getDerived().RebuildOMPAffinityClause( 10306 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10307 ModifierRes.get(), Locators); 10308 } 10309 10310 template <typename Derived> 10311 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10312 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10313 C->getBeginLoc(), C->getLParenLoc(), 10314 C->getEndLoc()); 10315 } 10316 10317 template <typename Derived> 10318 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10319 return getDerived().RebuildOMPBindClause( 10320 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10321 C->getLParenLoc(), C->getEndLoc()); 10322 } 10323 10324 //===----------------------------------------------------------------------===// 10325 // Expression transformation 10326 //===----------------------------------------------------------------------===// 10327 template<typename Derived> 10328 ExprResult 10329 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10330 return TransformExpr(E->getSubExpr()); 10331 } 10332 10333 template <typename Derived> 10334 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10335 SYCLUniqueStableNameExpr *E) { 10336 if (!E->isTypeDependent()) 10337 return E; 10338 10339 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10340 10341 if (!NewT) 10342 return ExprError(); 10343 10344 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10345 return E; 10346 10347 return getDerived().RebuildSYCLUniqueStableNameExpr( 10348 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10349 } 10350 10351 template<typename Derived> 10352 ExprResult 10353 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10354 if (!E->isTypeDependent()) 10355 return E; 10356 10357 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10358 E->getIdentKind()); 10359 } 10360 10361 template<typename Derived> 10362 ExprResult 10363 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10364 NestedNameSpecifierLoc QualifierLoc; 10365 if (E->getQualifierLoc()) { 10366 QualifierLoc 10367 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10368 if (!QualifierLoc) 10369 return ExprError(); 10370 } 10371 10372 ValueDecl *ND 10373 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10374 E->getDecl())); 10375 if (!ND) 10376 return ExprError(); 10377 10378 NamedDecl *Found = ND; 10379 if (E->getFoundDecl() != E->getDecl()) { 10380 Found = cast_or_null<NamedDecl>( 10381 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10382 if (!Found) 10383 return ExprError(); 10384 } 10385 10386 DeclarationNameInfo NameInfo = E->getNameInfo(); 10387 if (NameInfo.getName()) { 10388 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10389 if (!NameInfo.getName()) 10390 return ExprError(); 10391 } 10392 10393 if (!getDerived().AlwaysRebuild() && 10394 QualifierLoc == E->getQualifierLoc() && 10395 ND == E->getDecl() && 10396 Found == E->getFoundDecl() && 10397 NameInfo.getName() == E->getDecl()->getDeclName() && 10398 !E->hasExplicitTemplateArgs()) { 10399 10400 // Mark it referenced in the new context regardless. 10401 // FIXME: this is a bit instantiation-specific. 10402 SemaRef.MarkDeclRefReferenced(E); 10403 10404 return E; 10405 } 10406 10407 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10408 if (E->hasExplicitTemplateArgs()) { 10409 TemplateArgs = &TransArgs; 10410 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10411 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10412 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10413 E->getNumTemplateArgs(), 10414 TransArgs)) 10415 return ExprError(); 10416 } 10417 10418 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10419 Found, TemplateArgs); 10420 } 10421 10422 template<typename Derived> 10423 ExprResult 10424 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10425 return E; 10426 } 10427 10428 template <typename Derived> 10429 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10430 FixedPointLiteral *E) { 10431 return E; 10432 } 10433 10434 template<typename Derived> 10435 ExprResult 10436 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10437 return E; 10438 } 10439 10440 template<typename Derived> 10441 ExprResult 10442 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10443 return E; 10444 } 10445 10446 template<typename Derived> 10447 ExprResult 10448 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10449 return E; 10450 } 10451 10452 template<typename Derived> 10453 ExprResult 10454 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10455 return E; 10456 } 10457 10458 template<typename Derived> 10459 ExprResult 10460 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10461 if (FunctionDecl *FD = E->getDirectCallee()) 10462 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10463 return SemaRef.MaybeBindToTemporary(E); 10464 } 10465 10466 template<typename Derived> 10467 ExprResult 10468 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10469 ExprResult ControllingExpr = 10470 getDerived().TransformExpr(E->getControllingExpr()); 10471 if (ControllingExpr.isInvalid()) 10472 return ExprError(); 10473 10474 SmallVector<Expr *, 4> AssocExprs; 10475 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10476 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10477 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10478 if (TSI) { 10479 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10480 if (!AssocType) 10481 return ExprError(); 10482 AssocTypes.push_back(AssocType); 10483 } else { 10484 AssocTypes.push_back(nullptr); 10485 } 10486 10487 ExprResult AssocExpr = 10488 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10489 if (AssocExpr.isInvalid()) 10490 return ExprError(); 10491 AssocExprs.push_back(AssocExpr.get()); 10492 } 10493 10494 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10495 E->getDefaultLoc(), 10496 E->getRParenLoc(), 10497 ControllingExpr.get(), 10498 AssocTypes, 10499 AssocExprs); 10500 } 10501 10502 template<typename Derived> 10503 ExprResult 10504 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10505 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10506 if (SubExpr.isInvalid()) 10507 return ExprError(); 10508 10509 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10510 return E; 10511 10512 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10513 E->getRParen()); 10514 } 10515 10516 /// The operand of a unary address-of operator has special rules: it's 10517 /// allowed to refer to a non-static member of a class even if there's no 'this' 10518 /// object available. 10519 template<typename Derived> 10520 ExprResult 10521 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10522 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10523 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10524 else 10525 return getDerived().TransformExpr(E); 10526 } 10527 10528 template<typename Derived> 10529 ExprResult 10530 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10531 ExprResult SubExpr; 10532 if (E->getOpcode() == UO_AddrOf) 10533 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10534 else 10535 SubExpr = TransformExpr(E->getSubExpr()); 10536 if (SubExpr.isInvalid()) 10537 return ExprError(); 10538 10539 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10540 return E; 10541 10542 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10543 E->getOpcode(), 10544 SubExpr.get()); 10545 } 10546 10547 template<typename Derived> 10548 ExprResult 10549 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10550 // Transform the type. 10551 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10552 if (!Type) 10553 return ExprError(); 10554 10555 // Transform all of the components into components similar to what the 10556 // parser uses. 10557 // FIXME: It would be slightly more efficient in the non-dependent case to 10558 // just map FieldDecls, rather than requiring the rebuilder to look for 10559 // the fields again. However, __builtin_offsetof is rare enough in 10560 // template code that we don't care. 10561 bool ExprChanged = false; 10562 typedef Sema::OffsetOfComponent Component; 10563 SmallVector<Component, 4> Components; 10564 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10565 const OffsetOfNode &ON = E->getComponent(I); 10566 Component Comp; 10567 Comp.isBrackets = true; 10568 Comp.LocStart = ON.getSourceRange().getBegin(); 10569 Comp.LocEnd = ON.getSourceRange().getEnd(); 10570 switch (ON.getKind()) { 10571 case OffsetOfNode::Array: { 10572 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10573 ExprResult Index = getDerived().TransformExpr(FromIndex); 10574 if (Index.isInvalid()) 10575 return ExprError(); 10576 10577 ExprChanged = ExprChanged || Index.get() != FromIndex; 10578 Comp.isBrackets = true; 10579 Comp.U.E = Index.get(); 10580 break; 10581 } 10582 10583 case OffsetOfNode::Field: 10584 case OffsetOfNode::Identifier: 10585 Comp.isBrackets = false; 10586 Comp.U.IdentInfo = ON.getFieldName(); 10587 if (!Comp.U.IdentInfo) 10588 continue; 10589 10590 break; 10591 10592 case OffsetOfNode::Base: 10593 // Will be recomputed during the rebuild. 10594 continue; 10595 } 10596 10597 Components.push_back(Comp); 10598 } 10599 10600 // If nothing changed, retain the existing expression. 10601 if (!getDerived().AlwaysRebuild() && 10602 Type == E->getTypeSourceInfo() && 10603 !ExprChanged) 10604 return E; 10605 10606 // Build a new offsetof expression. 10607 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10608 Components, E->getRParenLoc()); 10609 } 10610 10611 template<typename Derived> 10612 ExprResult 10613 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10614 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10615 "opaque value expression requires transformation"); 10616 return E; 10617 } 10618 10619 template<typename Derived> 10620 ExprResult 10621 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10622 return E; 10623 } 10624 10625 template <typename Derived> 10626 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10627 llvm::SmallVector<Expr *, 8> Children; 10628 bool Changed = false; 10629 for (Expr *C : E->subExpressions()) { 10630 ExprResult NewC = getDerived().TransformExpr(C); 10631 if (NewC.isInvalid()) 10632 return ExprError(); 10633 Children.push_back(NewC.get()); 10634 10635 Changed |= NewC.get() != C; 10636 } 10637 if (!getDerived().AlwaysRebuild() && !Changed) 10638 return E; 10639 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10640 Children, E->getType()); 10641 } 10642 10643 template<typename Derived> 10644 ExprResult 10645 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10646 // Rebuild the syntactic form. The original syntactic form has 10647 // opaque-value expressions in it, so strip those away and rebuild 10648 // the result. This is a really awful way of doing this, but the 10649 // better solution (rebuilding the semantic expressions and 10650 // rebinding OVEs as necessary) doesn't work; we'd need 10651 // TreeTransform to not strip away implicit conversions. 10652 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10653 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10654 if (result.isInvalid()) return ExprError(); 10655 10656 // If that gives us a pseudo-object result back, the pseudo-object 10657 // expression must have been an lvalue-to-rvalue conversion which we 10658 // should reapply. 10659 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10660 result = SemaRef.checkPseudoObjectRValue(result.get()); 10661 10662 return result; 10663 } 10664 10665 template<typename Derived> 10666 ExprResult 10667 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10668 UnaryExprOrTypeTraitExpr *E) { 10669 if (E->isArgumentType()) { 10670 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10671 10672 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10673 if (!NewT) 10674 return ExprError(); 10675 10676 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10677 return E; 10678 10679 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10680 E->getKind(), 10681 E->getSourceRange()); 10682 } 10683 10684 // C++0x [expr.sizeof]p1: 10685 // The operand is either an expression, which is an unevaluated operand 10686 // [...] 10687 EnterExpressionEvaluationContext Unevaluated( 10688 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10689 Sema::ReuseLambdaContextDecl); 10690 10691 // Try to recover if we have something like sizeof(T::X) where X is a type. 10692 // Notably, there must be *exactly* one set of parens if X is a type. 10693 TypeSourceInfo *RecoveryTSI = nullptr; 10694 ExprResult SubExpr; 10695 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10696 if (auto *DRE = 10697 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10698 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10699 PE, DRE, false, &RecoveryTSI); 10700 else 10701 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10702 10703 if (RecoveryTSI) { 10704 return getDerived().RebuildUnaryExprOrTypeTrait( 10705 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10706 } else if (SubExpr.isInvalid()) 10707 return ExprError(); 10708 10709 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10710 return E; 10711 10712 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10713 E->getOperatorLoc(), 10714 E->getKind(), 10715 E->getSourceRange()); 10716 } 10717 10718 template<typename Derived> 10719 ExprResult 10720 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10721 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10722 if (LHS.isInvalid()) 10723 return ExprError(); 10724 10725 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10726 if (RHS.isInvalid()) 10727 return ExprError(); 10728 10729 10730 if (!getDerived().AlwaysRebuild() && 10731 LHS.get() == E->getLHS() && 10732 RHS.get() == E->getRHS()) 10733 return E; 10734 10735 return getDerived().RebuildArraySubscriptExpr( 10736 LHS.get(), 10737 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10738 } 10739 10740 template <typename Derived> 10741 ExprResult 10742 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10743 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10744 if (Base.isInvalid()) 10745 return ExprError(); 10746 10747 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10748 if (RowIdx.isInvalid()) 10749 return ExprError(); 10750 10751 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10752 if (ColumnIdx.isInvalid()) 10753 return ExprError(); 10754 10755 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10756 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10757 return E; 10758 10759 return getDerived().RebuildMatrixSubscriptExpr( 10760 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10761 } 10762 10763 template <typename Derived> 10764 ExprResult 10765 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10766 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10767 if (Base.isInvalid()) 10768 return ExprError(); 10769 10770 ExprResult LowerBound; 10771 if (E->getLowerBound()) { 10772 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10773 if (LowerBound.isInvalid()) 10774 return ExprError(); 10775 } 10776 10777 ExprResult Length; 10778 if (E->getLength()) { 10779 Length = getDerived().TransformExpr(E->getLength()); 10780 if (Length.isInvalid()) 10781 return ExprError(); 10782 } 10783 10784 ExprResult Stride; 10785 if (Expr *Str = E->getStride()) { 10786 Stride = getDerived().TransformExpr(Str); 10787 if (Stride.isInvalid()) 10788 return ExprError(); 10789 } 10790 10791 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10792 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10793 return E; 10794 10795 return getDerived().RebuildOMPArraySectionExpr( 10796 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10797 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10798 E->getRBracketLoc()); 10799 } 10800 10801 template <typename Derived> 10802 ExprResult 10803 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10804 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10805 if (Base.isInvalid()) 10806 return ExprError(); 10807 10808 SmallVector<Expr *, 4> Dims; 10809 bool ErrorFound = false; 10810 for (Expr *Dim : E->getDimensions()) { 10811 ExprResult DimRes = getDerived().TransformExpr(Dim); 10812 if (DimRes.isInvalid()) { 10813 ErrorFound = true; 10814 continue; 10815 } 10816 Dims.push_back(DimRes.get()); 10817 } 10818 10819 if (ErrorFound) 10820 return ExprError(); 10821 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10822 E->getRParenLoc(), Dims, 10823 E->getBracketsRanges()); 10824 } 10825 10826 template <typename Derived> 10827 ExprResult 10828 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10829 unsigned NumIterators = E->numOfIterators(); 10830 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10831 10832 bool ErrorFound = false; 10833 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10834 for (unsigned I = 0; I < NumIterators; ++I) { 10835 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10836 Data[I].DeclIdent = D->getIdentifier(); 10837 Data[I].DeclIdentLoc = D->getLocation(); 10838 if (D->getLocation() == D->getBeginLoc()) { 10839 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10840 "Implicit type must be int."); 10841 } else { 10842 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10843 QualType DeclTy = getDerived().TransformType(D->getType()); 10844 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10845 } 10846 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10847 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10848 ExprResult End = getDerived().TransformExpr(Range.End); 10849 ExprResult Step = getDerived().TransformExpr(Range.Step); 10850 ErrorFound = ErrorFound || 10851 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10852 !Data[I].Type.get().isNull())) || 10853 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10854 if (ErrorFound) 10855 continue; 10856 Data[I].Range.Begin = Begin.get(); 10857 Data[I].Range.End = End.get(); 10858 Data[I].Range.Step = Step.get(); 10859 Data[I].AssignLoc = E->getAssignLoc(I); 10860 Data[I].ColonLoc = E->getColonLoc(I); 10861 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10862 NeedToRebuild = 10863 NeedToRebuild || 10864 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10865 D->getType().getTypePtrOrNull()) || 10866 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10867 Range.Step != Data[I].Range.Step; 10868 } 10869 if (ErrorFound) 10870 return ExprError(); 10871 if (!NeedToRebuild) 10872 return E; 10873 10874 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10875 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10876 if (!Res.isUsable()) 10877 return Res; 10878 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10879 for (unsigned I = 0; I < NumIterators; ++I) 10880 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10881 IE->getIteratorDecl(I)); 10882 return Res; 10883 } 10884 10885 template<typename Derived> 10886 ExprResult 10887 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10888 // Transform the callee. 10889 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10890 if (Callee.isInvalid()) 10891 return ExprError(); 10892 10893 // Transform arguments. 10894 bool ArgChanged = false; 10895 SmallVector<Expr*, 8> Args; 10896 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10897 &ArgChanged)) 10898 return ExprError(); 10899 10900 if (!getDerived().AlwaysRebuild() && 10901 Callee.get() == E->getCallee() && 10902 !ArgChanged) 10903 return SemaRef.MaybeBindToTemporary(E); 10904 10905 // FIXME: Wrong source location information for the '('. 10906 SourceLocation FakeLParenLoc 10907 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10908 10909 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10910 if (E->hasStoredFPFeatures()) { 10911 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10912 getSema().CurFPFeatures = 10913 NewOverrides.applyOverrides(getSema().getLangOpts()); 10914 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10915 } 10916 10917 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10918 Args, 10919 E->getRParenLoc()); 10920 } 10921 10922 template<typename Derived> 10923 ExprResult 10924 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10925 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10926 if (Base.isInvalid()) 10927 return ExprError(); 10928 10929 NestedNameSpecifierLoc QualifierLoc; 10930 if (E->hasQualifier()) { 10931 QualifierLoc 10932 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10933 10934 if (!QualifierLoc) 10935 return ExprError(); 10936 } 10937 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10938 10939 ValueDecl *Member 10940 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10941 E->getMemberDecl())); 10942 if (!Member) 10943 return ExprError(); 10944 10945 NamedDecl *FoundDecl = E->getFoundDecl(); 10946 if (FoundDecl == E->getMemberDecl()) { 10947 FoundDecl = Member; 10948 } else { 10949 FoundDecl = cast_or_null<NamedDecl>( 10950 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10951 if (!FoundDecl) 10952 return ExprError(); 10953 } 10954 10955 if (!getDerived().AlwaysRebuild() && 10956 Base.get() == E->getBase() && 10957 QualifierLoc == E->getQualifierLoc() && 10958 Member == E->getMemberDecl() && 10959 FoundDecl == E->getFoundDecl() && 10960 !E->hasExplicitTemplateArgs()) { 10961 10962 // Mark it referenced in the new context regardless. 10963 // FIXME: this is a bit instantiation-specific. 10964 SemaRef.MarkMemberReferenced(E); 10965 10966 return E; 10967 } 10968 10969 TemplateArgumentListInfo TransArgs; 10970 if (E->hasExplicitTemplateArgs()) { 10971 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10972 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10973 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10974 E->getNumTemplateArgs(), 10975 TransArgs)) 10976 return ExprError(); 10977 } 10978 10979 // FIXME: Bogus source location for the operator 10980 SourceLocation FakeOperatorLoc = 10981 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10982 10983 // FIXME: to do this check properly, we will need to preserve the 10984 // first-qualifier-in-scope here, just in case we had a dependent 10985 // base (and therefore couldn't do the check) and a 10986 // nested-name-qualifier (and therefore could do the lookup). 10987 NamedDecl *FirstQualifierInScope = nullptr; 10988 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10989 if (MemberNameInfo.getName()) { 10990 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10991 if (!MemberNameInfo.getName()) 10992 return ExprError(); 10993 } 10994 10995 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10996 E->isArrow(), 10997 QualifierLoc, 10998 TemplateKWLoc, 10999 MemberNameInfo, 11000 Member, 11001 FoundDecl, 11002 (E->hasExplicitTemplateArgs() 11003 ? &TransArgs : nullptr), 11004 FirstQualifierInScope); 11005 } 11006 11007 template<typename Derived> 11008 ExprResult 11009 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 11010 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11011 if (LHS.isInvalid()) 11012 return ExprError(); 11013 11014 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11015 if (RHS.isInvalid()) 11016 return ExprError(); 11017 11018 if (!getDerived().AlwaysRebuild() && 11019 LHS.get() == E->getLHS() && 11020 RHS.get() == E->getRHS()) 11021 return E; 11022 11023 if (E->isCompoundAssignmentOp()) 11024 // FPFeatures has already been established from trailing storage 11025 return getDerived().RebuildBinaryOperator( 11026 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 11027 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11028 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11029 getSema().CurFPFeatures = 11030 NewOverrides.applyOverrides(getSema().getLangOpts()); 11031 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11032 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 11033 LHS.get(), RHS.get()); 11034 } 11035 11036 template <typename Derived> 11037 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 11038 CXXRewrittenBinaryOperator *E) { 11039 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 11040 11041 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 11042 if (LHS.isInvalid()) 11043 return ExprError(); 11044 11045 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 11046 if (RHS.isInvalid()) 11047 return ExprError(); 11048 11049 // Extract the already-resolved callee declarations so that we can restrict 11050 // ourselves to using them as the unqualified lookup results when rebuilding. 11051 UnresolvedSet<2> UnqualLookups; 11052 bool ChangedAnyLookups = false; 11053 Expr *PossibleBinOps[] = {E->getSemanticForm(), 11054 const_cast<Expr *>(Decomp.InnerBinOp)}; 11055 for (Expr *PossibleBinOp : PossibleBinOps) { 11056 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11057 if (!Op) 11058 continue; 11059 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11060 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11061 continue; 11062 11063 // Transform the callee in case we built a call to a local extern 11064 // declaration. 11065 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11066 E->getOperatorLoc(), Callee->getFoundDecl())); 11067 if (!Found) 11068 return ExprError(); 11069 if (Found != Callee->getFoundDecl()) 11070 ChangedAnyLookups = true; 11071 UnqualLookups.addDecl(Found); 11072 } 11073 11074 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups && 11075 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) { 11076 // Mark all functions used in the rewrite as referenced. Note that when 11077 // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be 11078 // function calls, and/or there might be a user-defined conversion sequence 11079 // applied to the operands of the <. 11080 // FIXME: this is a bit instantiation-specific. 11081 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS}; 11082 SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt); 11083 return E; 11084 } 11085 11086 return getDerived().RebuildCXXRewrittenBinaryOperator( 11087 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11088 } 11089 11090 template<typename Derived> 11091 ExprResult 11092 TreeTransform<Derived>::TransformCompoundAssignOperator( 11093 CompoundAssignOperator *E) { 11094 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11095 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11096 getSema().CurFPFeatures = 11097 NewOverrides.applyOverrides(getSema().getLangOpts()); 11098 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11099 return getDerived().TransformBinaryOperator(E); 11100 } 11101 11102 template<typename Derived> 11103 ExprResult TreeTransform<Derived>:: 11104 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11105 // Just rebuild the common and RHS expressions and see whether we 11106 // get any changes. 11107 11108 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11109 if (commonExpr.isInvalid()) 11110 return ExprError(); 11111 11112 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11113 if (rhs.isInvalid()) 11114 return ExprError(); 11115 11116 if (!getDerived().AlwaysRebuild() && 11117 commonExpr.get() == e->getCommon() && 11118 rhs.get() == e->getFalseExpr()) 11119 return e; 11120 11121 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11122 e->getQuestionLoc(), 11123 nullptr, 11124 e->getColonLoc(), 11125 rhs.get()); 11126 } 11127 11128 template<typename Derived> 11129 ExprResult 11130 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11131 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11132 if (Cond.isInvalid()) 11133 return ExprError(); 11134 11135 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11136 if (LHS.isInvalid()) 11137 return ExprError(); 11138 11139 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11140 if (RHS.isInvalid()) 11141 return ExprError(); 11142 11143 if (!getDerived().AlwaysRebuild() && 11144 Cond.get() == E->getCond() && 11145 LHS.get() == E->getLHS() && 11146 RHS.get() == E->getRHS()) 11147 return E; 11148 11149 return getDerived().RebuildConditionalOperator(Cond.get(), 11150 E->getQuestionLoc(), 11151 LHS.get(), 11152 E->getColonLoc(), 11153 RHS.get()); 11154 } 11155 11156 template<typename Derived> 11157 ExprResult 11158 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11159 // Implicit casts are eliminated during transformation, since they 11160 // will be recomputed by semantic analysis after transformation. 11161 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11162 } 11163 11164 template<typename Derived> 11165 ExprResult 11166 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11167 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11168 if (!Type) 11169 return ExprError(); 11170 11171 ExprResult SubExpr 11172 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11173 if (SubExpr.isInvalid()) 11174 return ExprError(); 11175 11176 if (!getDerived().AlwaysRebuild() && 11177 Type == E->getTypeInfoAsWritten() && 11178 SubExpr.get() == E->getSubExpr()) 11179 return E; 11180 11181 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11182 Type, 11183 E->getRParenLoc(), 11184 SubExpr.get()); 11185 } 11186 11187 template<typename Derived> 11188 ExprResult 11189 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11190 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11191 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11192 if (!NewT) 11193 return ExprError(); 11194 11195 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11196 if (Init.isInvalid()) 11197 return ExprError(); 11198 11199 if (!getDerived().AlwaysRebuild() && 11200 OldT == NewT && 11201 Init.get() == E->getInitializer()) 11202 return SemaRef.MaybeBindToTemporary(E); 11203 11204 // Note: the expression type doesn't necessarily match the 11205 // type-as-written, but that's okay, because it should always be 11206 // derivable from the initializer. 11207 11208 return getDerived().RebuildCompoundLiteralExpr( 11209 E->getLParenLoc(), NewT, 11210 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11211 } 11212 11213 template<typename Derived> 11214 ExprResult 11215 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11216 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11217 if (Base.isInvalid()) 11218 return ExprError(); 11219 11220 if (!getDerived().AlwaysRebuild() && 11221 Base.get() == E->getBase()) 11222 return E; 11223 11224 // FIXME: Bad source location 11225 SourceLocation FakeOperatorLoc = 11226 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11227 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11228 E->getAccessorLoc(), 11229 E->getAccessor()); 11230 } 11231 11232 template<typename Derived> 11233 ExprResult 11234 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11235 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11236 E = Syntactic; 11237 11238 bool InitChanged = false; 11239 11240 EnterExpressionEvaluationContext Context( 11241 getSema(), EnterExpressionEvaluationContext::InitList); 11242 11243 SmallVector<Expr*, 4> Inits; 11244 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11245 Inits, &InitChanged)) 11246 return ExprError(); 11247 11248 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11249 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11250 // in some cases. We can't reuse it in general, because the syntactic and 11251 // semantic forms are linked, and we can't know that semantic form will 11252 // match even if the syntactic form does. 11253 } 11254 11255 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11256 E->getRBraceLoc()); 11257 } 11258 11259 template<typename Derived> 11260 ExprResult 11261 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11262 Designation Desig; 11263 11264 // transform the initializer value 11265 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11266 if (Init.isInvalid()) 11267 return ExprError(); 11268 11269 // transform the designators. 11270 SmallVector<Expr*, 4> ArrayExprs; 11271 bool ExprChanged = false; 11272 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11273 if (D.isFieldDesignator()) { 11274 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11275 D.getDotLoc(), 11276 D.getFieldLoc())); 11277 if (D.getField()) { 11278 FieldDecl *Field = cast_or_null<FieldDecl>( 11279 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11280 if (Field != D.getField()) 11281 // Rebuild the expression when the transformed FieldDecl is 11282 // different to the already assigned FieldDecl. 11283 ExprChanged = true; 11284 } else { 11285 // Ensure that the designator expression is rebuilt when there isn't 11286 // a resolved FieldDecl in the designator as we don't want to assign 11287 // a FieldDecl to a pattern designator that will be instantiated again. 11288 ExprChanged = true; 11289 } 11290 continue; 11291 } 11292 11293 if (D.isArrayDesignator()) { 11294 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11295 if (Index.isInvalid()) 11296 return ExprError(); 11297 11298 Desig.AddDesignator( 11299 Designator::getArray(Index.get(), D.getLBracketLoc())); 11300 11301 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11302 ArrayExprs.push_back(Index.get()); 11303 continue; 11304 } 11305 11306 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11307 ExprResult Start 11308 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11309 if (Start.isInvalid()) 11310 return ExprError(); 11311 11312 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11313 if (End.isInvalid()) 11314 return ExprError(); 11315 11316 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11317 End.get(), 11318 D.getLBracketLoc(), 11319 D.getEllipsisLoc())); 11320 11321 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11322 End.get() != E->getArrayRangeEnd(D); 11323 11324 ArrayExprs.push_back(Start.get()); 11325 ArrayExprs.push_back(End.get()); 11326 } 11327 11328 if (!getDerived().AlwaysRebuild() && 11329 Init.get() == E->getInit() && 11330 !ExprChanged) 11331 return E; 11332 11333 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11334 E->getEqualOrColonLoc(), 11335 E->usesGNUSyntax(), Init.get()); 11336 } 11337 11338 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11339 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11340 template<typename Derived> 11341 ExprResult 11342 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11343 DesignatedInitUpdateExpr *E) { 11344 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11345 "initializer"); 11346 return ExprError(); 11347 } 11348 11349 template<typename Derived> 11350 ExprResult 11351 TreeTransform<Derived>::TransformNoInitExpr( 11352 NoInitExpr *E) { 11353 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11354 return ExprError(); 11355 } 11356 11357 template<typename Derived> 11358 ExprResult 11359 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11360 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11361 return ExprError(); 11362 } 11363 11364 template<typename Derived> 11365 ExprResult 11366 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11367 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11368 return ExprError(); 11369 } 11370 11371 template<typename Derived> 11372 ExprResult 11373 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11374 ImplicitValueInitExpr *E) { 11375 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11376 11377 // FIXME: Will we ever have proper type location here? Will we actually 11378 // need to transform the type? 11379 QualType T = getDerived().TransformType(E->getType()); 11380 if (T.isNull()) 11381 return ExprError(); 11382 11383 if (!getDerived().AlwaysRebuild() && 11384 T == E->getType()) 11385 return E; 11386 11387 return getDerived().RebuildImplicitValueInitExpr(T); 11388 } 11389 11390 template<typename Derived> 11391 ExprResult 11392 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11393 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11394 if (!TInfo) 11395 return ExprError(); 11396 11397 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11398 if (SubExpr.isInvalid()) 11399 return ExprError(); 11400 11401 if (!getDerived().AlwaysRebuild() && 11402 TInfo == E->getWrittenTypeInfo() && 11403 SubExpr.get() == E->getSubExpr()) 11404 return E; 11405 11406 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11407 TInfo, E->getRParenLoc()); 11408 } 11409 11410 template<typename Derived> 11411 ExprResult 11412 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11413 bool ArgumentChanged = false; 11414 SmallVector<Expr*, 4> Inits; 11415 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11416 &ArgumentChanged)) 11417 return ExprError(); 11418 11419 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11420 Inits, 11421 E->getRParenLoc()); 11422 } 11423 11424 /// Transform an address-of-label expression. 11425 /// 11426 /// By default, the transformation of an address-of-label expression always 11427 /// rebuilds the expression, so that the label identifier can be resolved to 11428 /// the corresponding label statement by semantic analysis. 11429 template<typename Derived> 11430 ExprResult 11431 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11432 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11433 E->getLabel()); 11434 if (!LD) 11435 return ExprError(); 11436 11437 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11438 cast<LabelDecl>(LD)); 11439 } 11440 11441 template<typename Derived> 11442 ExprResult 11443 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11444 SemaRef.ActOnStartStmtExpr(); 11445 StmtResult SubStmt 11446 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11447 if (SubStmt.isInvalid()) { 11448 SemaRef.ActOnStmtExprError(); 11449 return ExprError(); 11450 } 11451 11452 unsigned OldDepth = E->getTemplateDepth(); 11453 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11454 11455 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11456 SubStmt.get() == E->getSubStmt()) { 11457 // Calling this an 'error' is unintuitive, but it does the right thing. 11458 SemaRef.ActOnStmtExprError(); 11459 return SemaRef.MaybeBindToTemporary(E); 11460 } 11461 11462 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11463 E->getRParenLoc(), NewDepth); 11464 } 11465 11466 template<typename Derived> 11467 ExprResult 11468 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11469 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11470 if (Cond.isInvalid()) 11471 return ExprError(); 11472 11473 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11474 if (LHS.isInvalid()) 11475 return ExprError(); 11476 11477 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11478 if (RHS.isInvalid()) 11479 return ExprError(); 11480 11481 if (!getDerived().AlwaysRebuild() && 11482 Cond.get() == E->getCond() && 11483 LHS.get() == E->getLHS() && 11484 RHS.get() == E->getRHS()) 11485 return E; 11486 11487 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11488 Cond.get(), LHS.get(), RHS.get(), 11489 E->getRParenLoc()); 11490 } 11491 11492 template<typename Derived> 11493 ExprResult 11494 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11495 return E; 11496 } 11497 11498 template<typename Derived> 11499 ExprResult 11500 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11501 switch (E->getOperator()) { 11502 case OO_New: 11503 case OO_Delete: 11504 case OO_Array_New: 11505 case OO_Array_Delete: 11506 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11507 11508 case OO_Call: { 11509 // This is a call to an object's operator(). 11510 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11511 11512 // Transform the object itself. 11513 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11514 if (Object.isInvalid()) 11515 return ExprError(); 11516 11517 // FIXME: Poor location information 11518 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11519 static_cast<Expr *>(Object.get())->getEndLoc()); 11520 11521 // Transform the call arguments. 11522 SmallVector<Expr*, 8> Args; 11523 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11524 Args)) 11525 return ExprError(); 11526 11527 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11528 E->getEndLoc()); 11529 } 11530 11531 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11532 case OO_##Name: 11533 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11534 #include "clang/Basic/OperatorKinds.def" 11535 case OO_Subscript: 11536 // Handled below. 11537 break; 11538 11539 case OO_Conditional: 11540 llvm_unreachable("conditional operator is not actually overloadable"); 11541 11542 case OO_None: 11543 case NUM_OVERLOADED_OPERATORS: 11544 llvm_unreachable("not an overloaded operator?"); 11545 } 11546 11547 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11548 if (Callee.isInvalid()) 11549 return ExprError(); 11550 11551 ExprResult First; 11552 if (E->getOperator() == OO_Amp) 11553 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11554 else 11555 First = getDerived().TransformExpr(E->getArg(0)); 11556 if (First.isInvalid()) 11557 return ExprError(); 11558 11559 ExprResult Second; 11560 if (E->getNumArgs() == 2) { 11561 Second = getDerived().TransformExpr(E->getArg(1)); 11562 if (Second.isInvalid()) 11563 return ExprError(); 11564 } 11565 11566 if (!getDerived().AlwaysRebuild() && 11567 Callee.get() == E->getCallee() && 11568 First.get() == E->getArg(0) && 11569 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11570 return SemaRef.MaybeBindToTemporary(E); 11571 11572 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11573 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11574 getSema().CurFPFeatures = 11575 NewOverrides.applyOverrides(getSema().getLangOpts()); 11576 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11577 11578 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11579 E->getOperatorLoc(), 11580 Callee.get(), 11581 First.get(), 11582 Second.get()); 11583 } 11584 11585 template<typename Derived> 11586 ExprResult 11587 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11588 return getDerived().TransformCallExpr(E); 11589 } 11590 11591 template <typename Derived> 11592 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11593 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11594 getSema().CurContext != E->getParentContext(); 11595 11596 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11597 return E; 11598 11599 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11600 E->getEndLoc(), 11601 getSema().CurContext); 11602 } 11603 11604 template<typename Derived> 11605 ExprResult 11606 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11607 // Transform the callee. 11608 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11609 if (Callee.isInvalid()) 11610 return ExprError(); 11611 11612 // Transform exec config. 11613 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11614 if (EC.isInvalid()) 11615 return ExprError(); 11616 11617 // Transform arguments. 11618 bool ArgChanged = false; 11619 SmallVector<Expr*, 8> Args; 11620 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11621 &ArgChanged)) 11622 return ExprError(); 11623 11624 if (!getDerived().AlwaysRebuild() && 11625 Callee.get() == E->getCallee() && 11626 !ArgChanged) 11627 return SemaRef.MaybeBindToTemporary(E); 11628 11629 // FIXME: Wrong source location information for the '('. 11630 SourceLocation FakeLParenLoc 11631 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11632 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11633 Args, 11634 E->getRParenLoc(), EC.get()); 11635 } 11636 11637 template<typename Derived> 11638 ExprResult 11639 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11640 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11641 if (!Type) 11642 return ExprError(); 11643 11644 ExprResult SubExpr 11645 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11646 if (SubExpr.isInvalid()) 11647 return ExprError(); 11648 11649 if (!getDerived().AlwaysRebuild() && 11650 Type == E->getTypeInfoAsWritten() && 11651 SubExpr.get() == E->getSubExpr()) 11652 return E; 11653 return getDerived().RebuildCXXNamedCastExpr( 11654 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11655 Type, E->getAngleBrackets().getEnd(), 11656 // FIXME. this should be '(' location 11657 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11658 } 11659 11660 template<typename Derived> 11661 ExprResult 11662 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11663 TypeSourceInfo *TSI = 11664 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11665 if (!TSI) 11666 return ExprError(); 11667 11668 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11669 if (Sub.isInvalid()) 11670 return ExprError(); 11671 11672 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11673 Sub.get(), BCE->getEndLoc()); 11674 } 11675 11676 template<typename Derived> 11677 ExprResult 11678 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11679 return getDerived().TransformCXXNamedCastExpr(E); 11680 } 11681 11682 template<typename Derived> 11683 ExprResult 11684 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11685 return getDerived().TransformCXXNamedCastExpr(E); 11686 } 11687 11688 template<typename Derived> 11689 ExprResult 11690 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11691 CXXReinterpretCastExpr *E) { 11692 return getDerived().TransformCXXNamedCastExpr(E); 11693 } 11694 11695 template<typename Derived> 11696 ExprResult 11697 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11698 return getDerived().TransformCXXNamedCastExpr(E); 11699 } 11700 11701 template<typename Derived> 11702 ExprResult 11703 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11704 return getDerived().TransformCXXNamedCastExpr(E); 11705 } 11706 11707 template<typename Derived> 11708 ExprResult 11709 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11710 CXXFunctionalCastExpr *E) { 11711 TypeSourceInfo *Type = 11712 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11713 if (!Type) 11714 return ExprError(); 11715 11716 ExprResult SubExpr 11717 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11718 if (SubExpr.isInvalid()) 11719 return ExprError(); 11720 11721 if (!getDerived().AlwaysRebuild() && 11722 Type == E->getTypeInfoAsWritten() && 11723 SubExpr.get() == E->getSubExpr()) 11724 return E; 11725 11726 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11727 E->getLParenLoc(), 11728 SubExpr.get(), 11729 E->getRParenLoc(), 11730 E->isListInitialization()); 11731 } 11732 11733 template<typename Derived> 11734 ExprResult 11735 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11736 if (E->isTypeOperand()) { 11737 TypeSourceInfo *TInfo 11738 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11739 if (!TInfo) 11740 return ExprError(); 11741 11742 if (!getDerived().AlwaysRebuild() && 11743 TInfo == E->getTypeOperandSourceInfo()) 11744 return E; 11745 11746 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11747 TInfo, E->getEndLoc()); 11748 } 11749 11750 // Typeid's operand is an unevaluated context, unless it's a polymorphic 11751 // type. We must not unilaterally enter unevaluated context here, as then 11752 // semantic processing can re-transform an already transformed operand. 11753 Expr *Op = E->getExprOperand(); 11754 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 11755 if (E->isGLValue()) 11756 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 11757 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 11758 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 11759 11760 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 11761 Sema::ReuseLambdaContextDecl); 11762 11763 ExprResult SubExpr = getDerived().TransformExpr(Op); 11764 if (SubExpr.isInvalid()) 11765 return ExprError(); 11766 11767 if (!getDerived().AlwaysRebuild() && 11768 SubExpr.get() == E->getExprOperand()) 11769 return E; 11770 11771 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11772 SubExpr.get(), E->getEndLoc()); 11773 } 11774 11775 template<typename Derived> 11776 ExprResult 11777 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11778 if (E->isTypeOperand()) { 11779 TypeSourceInfo *TInfo 11780 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11781 if (!TInfo) 11782 return ExprError(); 11783 11784 if (!getDerived().AlwaysRebuild() && 11785 TInfo == E->getTypeOperandSourceInfo()) 11786 return E; 11787 11788 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11789 TInfo, E->getEndLoc()); 11790 } 11791 11792 EnterExpressionEvaluationContext Unevaluated( 11793 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11794 11795 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11796 if (SubExpr.isInvalid()) 11797 return ExprError(); 11798 11799 if (!getDerived().AlwaysRebuild() && 11800 SubExpr.get() == E->getExprOperand()) 11801 return E; 11802 11803 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11804 SubExpr.get(), E->getEndLoc()); 11805 } 11806 11807 template<typename Derived> 11808 ExprResult 11809 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11810 return E; 11811 } 11812 11813 template<typename Derived> 11814 ExprResult 11815 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11816 CXXNullPtrLiteralExpr *E) { 11817 return E; 11818 } 11819 11820 template<typename Derived> 11821 ExprResult 11822 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11823 QualType T = getSema().getCurrentThisType(); 11824 11825 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11826 // Mark it referenced in the new context regardless. 11827 // FIXME: this is a bit instantiation-specific. 11828 getSema().MarkThisReferenced(E); 11829 return E; 11830 } 11831 11832 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11833 } 11834 11835 template<typename Derived> 11836 ExprResult 11837 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11838 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11839 if (SubExpr.isInvalid()) 11840 return ExprError(); 11841 11842 if (!getDerived().AlwaysRebuild() && 11843 SubExpr.get() == E->getSubExpr()) 11844 return E; 11845 11846 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11847 E->isThrownVariableInScope()); 11848 } 11849 11850 template<typename Derived> 11851 ExprResult 11852 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11853 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11854 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11855 if (!Param) 11856 return ExprError(); 11857 11858 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11859 E->getUsedContext() == SemaRef.CurContext) 11860 return E; 11861 11862 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11863 } 11864 11865 template<typename Derived> 11866 ExprResult 11867 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11868 FieldDecl *Field = cast_or_null<FieldDecl>( 11869 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11870 if (!Field) 11871 return ExprError(); 11872 11873 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11874 E->getUsedContext() == SemaRef.CurContext) 11875 return E; 11876 11877 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11878 } 11879 11880 template<typename Derived> 11881 ExprResult 11882 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11883 CXXScalarValueInitExpr *E) { 11884 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11885 if (!T) 11886 return ExprError(); 11887 11888 if (!getDerived().AlwaysRebuild() && 11889 T == E->getTypeSourceInfo()) 11890 return E; 11891 11892 return getDerived().RebuildCXXScalarValueInitExpr(T, 11893 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11894 E->getRParenLoc()); 11895 } 11896 11897 template<typename Derived> 11898 ExprResult 11899 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11900 // Transform the type that we're allocating 11901 TypeSourceInfo *AllocTypeInfo = 11902 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11903 if (!AllocTypeInfo) 11904 return ExprError(); 11905 11906 // Transform the size of the array we're allocating (if any). 11907 Optional<Expr *> ArraySize; 11908 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11909 ExprResult NewArraySize; 11910 if (*OldArraySize) { 11911 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11912 if (NewArraySize.isInvalid()) 11913 return ExprError(); 11914 } 11915 ArraySize = NewArraySize.get(); 11916 } 11917 11918 // Transform the placement arguments (if any). 11919 bool ArgumentChanged = false; 11920 SmallVector<Expr*, 8> PlacementArgs; 11921 if (getDerived().TransformExprs(E->getPlacementArgs(), 11922 E->getNumPlacementArgs(), true, 11923 PlacementArgs, &ArgumentChanged)) 11924 return ExprError(); 11925 11926 // Transform the initializer (if any). 11927 Expr *OldInit = E->getInitializer(); 11928 ExprResult NewInit; 11929 if (OldInit) 11930 NewInit = getDerived().TransformInitializer(OldInit, true); 11931 if (NewInit.isInvalid()) 11932 return ExprError(); 11933 11934 // Transform new operator and delete operator. 11935 FunctionDecl *OperatorNew = nullptr; 11936 if (E->getOperatorNew()) { 11937 OperatorNew = cast_or_null<FunctionDecl>( 11938 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11939 if (!OperatorNew) 11940 return ExprError(); 11941 } 11942 11943 FunctionDecl *OperatorDelete = nullptr; 11944 if (E->getOperatorDelete()) { 11945 OperatorDelete = cast_or_null<FunctionDecl>( 11946 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11947 if (!OperatorDelete) 11948 return ExprError(); 11949 } 11950 11951 if (!getDerived().AlwaysRebuild() && 11952 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11953 ArraySize == E->getArraySize() && 11954 NewInit.get() == OldInit && 11955 OperatorNew == E->getOperatorNew() && 11956 OperatorDelete == E->getOperatorDelete() && 11957 !ArgumentChanged) { 11958 // Mark any declarations we need as referenced. 11959 // FIXME: instantiation-specific. 11960 if (OperatorNew) 11961 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11962 if (OperatorDelete) 11963 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11964 11965 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11966 QualType ElementType 11967 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11968 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11969 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11970 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11971 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11972 } 11973 } 11974 } 11975 11976 return E; 11977 } 11978 11979 QualType AllocType = AllocTypeInfo->getType(); 11980 if (!ArraySize) { 11981 // If no array size was specified, but the new expression was 11982 // instantiated with an array type (e.g., "new T" where T is 11983 // instantiated with "int[4]"), extract the outer bound from the 11984 // array type as our array size. We do this with constant and 11985 // dependently-sized array types. 11986 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11987 if (!ArrayT) { 11988 // Do nothing 11989 } else if (const ConstantArrayType *ConsArrayT 11990 = dyn_cast<ConstantArrayType>(ArrayT)) { 11991 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11992 SemaRef.Context.getSizeType(), 11993 /*FIXME:*/ E->getBeginLoc()); 11994 AllocType = ConsArrayT->getElementType(); 11995 } else if (const DependentSizedArrayType *DepArrayT 11996 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11997 if (DepArrayT->getSizeExpr()) { 11998 ArraySize = DepArrayT->getSizeExpr(); 11999 AllocType = DepArrayT->getElementType(); 12000 } 12001 } 12002 } 12003 12004 return getDerived().RebuildCXXNewExpr( 12005 E->getBeginLoc(), E->isGlobalNew(), 12006 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 12007 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 12008 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 12009 } 12010 12011 template<typename Derived> 12012 ExprResult 12013 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 12014 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 12015 if (Operand.isInvalid()) 12016 return ExprError(); 12017 12018 // Transform the delete operator, if known. 12019 FunctionDecl *OperatorDelete = nullptr; 12020 if (E->getOperatorDelete()) { 12021 OperatorDelete = cast_or_null<FunctionDecl>( 12022 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12023 if (!OperatorDelete) 12024 return ExprError(); 12025 } 12026 12027 if (!getDerived().AlwaysRebuild() && 12028 Operand.get() == E->getArgument() && 12029 OperatorDelete == E->getOperatorDelete()) { 12030 // Mark any declarations we need as referenced. 12031 // FIXME: instantiation-specific. 12032 if (OperatorDelete) 12033 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12034 12035 if (!E->getArgument()->isTypeDependent()) { 12036 QualType Destroyed = SemaRef.Context.getBaseElementType( 12037 E->getDestroyedType()); 12038 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 12039 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 12040 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12041 SemaRef.LookupDestructor(Record)); 12042 } 12043 } 12044 12045 return E; 12046 } 12047 12048 return getDerived().RebuildCXXDeleteExpr( 12049 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 12050 } 12051 12052 template<typename Derived> 12053 ExprResult 12054 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 12055 CXXPseudoDestructorExpr *E) { 12056 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12057 if (Base.isInvalid()) 12058 return ExprError(); 12059 12060 ParsedType ObjectTypePtr; 12061 bool MayBePseudoDestructor = false; 12062 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12063 E->getOperatorLoc(), 12064 E->isArrow()? tok::arrow : tok::period, 12065 ObjectTypePtr, 12066 MayBePseudoDestructor); 12067 if (Base.isInvalid()) 12068 return ExprError(); 12069 12070 QualType ObjectType = ObjectTypePtr.get(); 12071 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12072 if (QualifierLoc) { 12073 QualifierLoc 12074 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12075 if (!QualifierLoc) 12076 return ExprError(); 12077 } 12078 CXXScopeSpec SS; 12079 SS.Adopt(QualifierLoc); 12080 12081 PseudoDestructorTypeStorage Destroyed; 12082 if (E->getDestroyedTypeInfo()) { 12083 TypeSourceInfo *DestroyedTypeInfo 12084 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12085 ObjectType, nullptr, SS); 12086 if (!DestroyedTypeInfo) 12087 return ExprError(); 12088 Destroyed = DestroyedTypeInfo; 12089 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12090 // We aren't likely to be able to resolve the identifier down to a type 12091 // now anyway, so just retain the identifier. 12092 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12093 E->getDestroyedTypeLoc()); 12094 } else { 12095 // Look for a destructor known with the given name. 12096 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 12097 *E->getDestroyedTypeIdentifier(), 12098 E->getDestroyedTypeLoc(), 12099 /*Scope=*/nullptr, 12100 SS, ObjectTypePtr, 12101 false); 12102 if (!T) 12103 return ExprError(); 12104 12105 Destroyed 12106 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12107 E->getDestroyedTypeLoc()); 12108 } 12109 12110 TypeSourceInfo *ScopeTypeInfo = nullptr; 12111 if (E->getScopeTypeInfo()) { 12112 CXXScopeSpec EmptySS; 12113 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12114 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12115 if (!ScopeTypeInfo) 12116 return ExprError(); 12117 } 12118 12119 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12120 E->getOperatorLoc(), 12121 E->isArrow(), 12122 SS, 12123 ScopeTypeInfo, 12124 E->getColonColonLoc(), 12125 E->getTildeLoc(), 12126 Destroyed); 12127 } 12128 12129 template <typename Derived> 12130 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12131 bool RequiresADL, 12132 LookupResult &R) { 12133 // Transform all the decls. 12134 bool AllEmptyPacks = true; 12135 for (auto *OldD : Old->decls()) { 12136 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12137 if (!InstD) { 12138 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12139 // This can happen because of dependent hiding. 12140 if (isa<UsingShadowDecl>(OldD)) 12141 continue; 12142 else { 12143 R.clear(); 12144 return true; 12145 } 12146 } 12147 12148 // Expand using pack declarations. 12149 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12150 ArrayRef<NamedDecl*> Decls = SingleDecl; 12151 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12152 Decls = UPD->expansions(); 12153 12154 // Expand using declarations. 12155 for (auto *D : Decls) { 12156 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12157 for (auto *SD : UD->shadows()) 12158 R.addDecl(SD); 12159 } else { 12160 R.addDecl(D); 12161 } 12162 } 12163 12164 AllEmptyPacks &= Decls.empty(); 12165 }; 12166 12167 // C++ [temp.res]/8.4.2: 12168 // The program is ill-formed, no diagnostic required, if [...] lookup for 12169 // a name in the template definition found a using-declaration, but the 12170 // lookup in the corresponding scope in the instantiation odoes not find 12171 // any declarations because the using-declaration was a pack expansion and 12172 // the corresponding pack is empty 12173 if (AllEmptyPacks && !RequiresADL) { 12174 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12175 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12176 return true; 12177 } 12178 12179 // Resolve a kind, but don't do any further analysis. If it's 12180 // ambiguous, the callee needs to deal with it. 12181 R.resolveKind(); 12182 return false; 12183 } 12184 12185 template<typename Derived> 12186 ExprResult 12187 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12188 UnresolvedLookupExpr *Old) { 12189 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12190 Sema::LookupOrdinaryName); 12191 12192 // Transform the declaration set. 12193 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12194 return ExprError(); 12195 12196 // Rebuild the nested-name qualifier, if present. 12197 CXXScopeSpec SS; 12198 if (Old->getQualifierLoc()) { 12199 NestedNameSpecifierLoc QualifierLoc 12200 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12201 if (!QualifierLoc) 12202 return ExprError(); 12203 12204 SS.Adopt(QualifierLoc); 12205 } 12206 12207 if (Old->getNamingClass()) { 12208 CXXRecordDecl *NamingClass 12209 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12210 Old->getNameLoc(), 12211 Old->getNamingClass())); 12212 if (!NamingClass) { 12213 R.clear(); 12214 return ExprError(); 12215 } 12216 12217 R.setNamingClass(NamingClass); 12218 } 12219 12220 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12221 12222 // If we have neither explicit template arguments, nor the template keyword, 12223 // it's a normal declaration name or member reference. 12224 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12225 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12226 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12227 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12228 // give a good diagnostic. 12229 if (D && D->isCXXInstanceMember()) { 12230 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12231 /*TemplateArgs=*/nullptr, 12232 /*Scope=*/nullptr); 12233 } 12234 12235 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12236 } 12237 12238 // If we have template arguments, rebuild them, then rebuild the 12239 // templateid expression. 12240 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12241 if (Old->hasExplicitTemplateArgs() && 12242 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12243 Old->getNumTemplateArgs(), 12244 TransArgs)) { 12245 R.clear(); 12246 return ExprError(); 12247 } 12248 12249 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12250 Old->requiresADL(), &TransArgs); 12251 } 12252 12253 template<typename Derived> 12254 ExprResult 12255 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12256 bool ArgChanged = false; 12257 SmallVector<TypeSourceInfo *, 4> Args; 12258 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12259 TypeSourceInfo *From = E->getArg(I); 12260 TypeLoc FromTL = From->getTypeLoc(); 12261 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12262 TypeLocBuilder TLB; 12263 TLB.reserve(FromTL.getFullDataSize()); 12264 QualType To = getDerived().TransformType(TLB, FromTL); 12265 if (To.isNull()) 12266 return ExprError(); 12267 12268 if (To == From->getType()) 12269 Args.push_back(From); 12270 else { 12271 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12272 ArgChanged = true; 12273 } 12274 continue; 12275 } 12276 12277 ArgChanged = true; 12278 12279 // We have a pack expansion. Instantiate it. 12280 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12281 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12282 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12283 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12284 12285 // Determine whether the set of unexpanded parameter packs can and should 12286 // be expanded. 12287 bool Expand = true; 12288 bool RetainExpansion = false; 12289 Optional<unsigned> OrigNumExpansions = 12290 ExpansionTL.getTypePtr()->getNumExpansions(); 12291 Optional<unsigned> NumExpansions = OrigNumExpansions; 12292 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12293 PatternTL.getSourceRange(), 12294 Unexpanded, 12295 Expand, RetainExpansion, 12296 NumExpansions)) 12297 return ExprError(); 12298 12299 if (!Expand) { 12300 // The transform has determined that we should perform a simple 12301 // transformation on the pack expansion, producing another pack 12302 // expansion. 12303 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12304 12305 TypeLocBuilder TLB; 12306 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12307 12308 QualType To = getDerived().TransformType(TLB, PatternTL); 12309 if (To.isNull()) 12310 return ExprError(); 12311 12312 To = getDerived().RebuildPackExpansionType(To, 12313 PatternTL.getSourceRange(), 12314 ExpansionTL.getEllipsisLoc(), 12315 NumExpansions); 12316 if (To.isNull()) 12317 return ExprError(); 12318 12319 PackExpansionTypeLoc ToExpansionTL 12320 = TLB.push<PackExpansionTypeLoc>(To); 12321 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12322 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12323 continue; 12324 } 12325 12326 // Expand the pack expansion by substituting for each argument in the 12327 // pack(s). 12328 for (unsigned I = 0; I != *NumExpansions; ++I) { 12329 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12330 TypeLocBuilder TLB; 12331 TLB.reserve(PatternTL.getFullDataSize()); 12332 QualType To = getDerived().TransformType(TLB, PatternTL); 12333 if (To.isNull()) 12334 return ExprError(); 12335 12336 if (To->containsUnexpandedParameterPack()) { 12337 To = getDerived().RebuildPackExpansionType(To, 12338 PatternTL.getSourceRange(), 12339 ExpansionTL.getEllipsisLoc(), 12340 NumExpansions); 12341 if (To.isNull()) 12342 return ExprError(); 12343 12344 PackExpansionTypeLoc ToExpansionTL 12345 = TLB.push<PackExpansionTypeLoc>(To); 12346 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12347 } 12348 12349 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12350 } 12351 12352 if (!RetainExpansion) 12353 continue; 12354 12355 // If we're supposed to retain a pack expansion, do so by temporarily 12356 // forgetting the partially-substituted parameter pack. 12357 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12358 12359 TypeLocBuilder TLB; 12360 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12361 12362 QualType To = getDerived().TransformType(TLB, PatternTL); 12363 if (To.isNull()) 12364 return ExprError(); 12365 12366 To = getDerived().RebuildPackExpansionType(To, 12367 PatternTL.getSourceRange(), 12368 ExpansionTL.getEllipsisLoc(), 12369 NumExpansions); 12370 if (To.isNull()) 12371 return ExprError(); 12372 12373 PackExpansionTypeLoc ToExpansionTL 12374 = TLB.push<PackExpansionTypeLoc>(To); 12375 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12376 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12377 } 12378 12379 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12380 return E; 12381 12382 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12383 E->getEndLoc()); 12384 } 12385 12386 template<typename Derived> 12387 ExprResult 12388 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12389 ConceptSpecializationExpr *E) { 12390 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12391 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12392 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12393 Old->NumTemplateArgs, TransArgs)) 12394 return ExprError(); 12395 12396 return getDerived().RebuildConceptSpecializationExpr( 12397 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12398 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12399 &TransArgs); 12400 } 12401 12402 template<typename Derived> 12403 ExprResult 12404 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12405 SmallVector<ParmVarDecl*, 4> TransParams; 12406 SmallVector<QualType, 4> TransParamTypes; 12407 Sema::ExtParameterInfoBuilder ExtParamInfos; 12408 12409 // C++2a [expr.prim.req]p2 12410 // Expressions appearing within a requirement-body are unevaluated operands. 12411 EnterExpressionEvaluationContext Ctx( 12412 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12413 12414 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12415 getSema().Context, getSema().CurContext, 12416 E->getBody()->getBeginLoc()); 12417 12418 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12419 12420 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12421 E->getLocalParameters(), 12422 /*ParamTypes=*/nullptr, 12423 /*ParamInfos=*/nullptr, 12424 TransParamTypes, &TransParams, 12425 ExtParamInfos)) 12426 return ExprError(); 12427 12428 for (ParmVarDecl *Param : TransParams) 12429 Param->setDeclContext(Body); 12430 12431 SmallVector<concepts::Requirement *, 4> TransReqs; 12432 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12433 TransReqs)) 12434 return ExprError(); 12435 12436 for (concepts::Requirement *Req : TransReqs) { 12437 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12438 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12439 ER->getReturnTypeRequirement() 12440 .getTypeConstraintTemplateParameterList()->getParam(0) 12441 ->setDeclContext(Body); 12442 } 12443 } 12444 } 12445 12446 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12447 TransParams, TransReqs, 12448 E->getRBraceLoc()); 12449 } 12450 12451 template<typename Derived> 12452 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12453 ArrayRef<concepts::Requirement *> Reqs, 12454 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12455 for (concepts::Requirement *Req : Reqs) { 12456 concepts::Requirement *TransReq = nullptr; 12457 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12458 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12459 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12460 TransReq = getDerived().TransformExprRequirement(ExprReq); 12461 else 12462 TransReq = getDerived().TransformNestedRequirement( 12463 cast<concepts::NestedRequirement>(Req)); 12464 if (!TransReq) 12465 return true; 12466 Transformed.push_back(TransReq); 12467 } 12468 return false; 12469 } 12470 12471 template<typename Derived> 12472 concepts::TypeRequirement * 12473 TreeTransform<Derived>::TransformTypeRequirement( 12474 concepts::TypeRequirement *Req) { 12475 if (Req->isSubstitutionFailure()) { 12476 if (getDerived().AlwaysRebuild()) 12477 return getDerived().RebuildTypeRequirement( 12478 Req->getSubstitutionDiagnostic()); 12479 return Req; 12480 } 12481 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12482 if (!TransType) 12483 return nullptr; 12484 return getDerived().RebuildTypeRequirement(TransType); 12485 } 12486 12487 template<typename Derived> 12488 concepts::ExprRequirement * 12489 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12490 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12491 if (Req->isExprSubstitutionFailure()) 12492 TransExpr = Req->getExprSubstitutionDiagnostic(); 12493 else { 12494 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12495 if (TransExprRes.isInvalid()) 12496 return nullptr; 12497 TransExpr = TransExprRes.get(); 12498 } 12499 12500 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12501 const auto &RetReq = Req->getReturnTypeRequirement(); 12502 if (RetReq.isEmpty()) 12503 TransRetReq.emplace(); 12504 else if (RetReq.isSubstitutionFailure()) 12505 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12506 else if (RetReq.isTypeConstraint()) { 12507 TemplateParameterList *OrigTPL = 12508 RetReq.getTypeConstraintTemplateParameterList(); 12509 TemplateParameterList *TPL = 12510 getDerived().TransformTemplateParameterList(OrigTPL); 12511 if (!TPL) 12512 return nullptr; 12513 TransRetReq.emplace(TPL); 12514 } 12515 assert(TransRetReq.hasValue() && 12516 "All code paths leading here must set TransRetReq"); 12517 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12518 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12519 Req->getNoexceptLoc(), 12520 std::move(*TransRetReq)); 12521 return getDerived().RebuildExprRequirement( 12522 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12523 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12524 } 12525 12526 template<typename Derived> 12527 concepts::NestedRequirement * 12528 TreeTransform<Derived>::TransformNestedRequirement( 12529 concepts::NestedRequirement *Req) { 12530 if (Req->isSubstitutionFailure()) { 12531 if (getDerived().AlwaysRebuild()) 12532 return getDerived().RebuildNestedRequirement( 12533 Req->getSubstitutionDiagnostic()); 12534 return Req; 12535 } 12536 ExprResult TransConstraint = 12537 getDerived().TransformExpr(Req->getConstraintExpr()); 12538 if (TransConstraint.isInvalid()) 12539 return nullptr; 12540 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12541 } 12542 12543 template<typename Derived> 12544 ExprResult 12545 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12546 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12547 if (!T) 12548 return ExprError(); 12549 12550 if (!getDerived().AlwaysRebuild() && 12551 T == E->getQueriedTypeSourceInfo()) 12552 return E; 12553 12554 ExprResult SubExpr; 12555 { 12556 EnterExpressionEvaluationContext Unevaluated( 12557 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12558 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12559 if (SubExpr.isInvalid()) 12560 return ExprError(); 12561 12562 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12563 return E; 12564 } 12565 12566 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12567 SubExpr.get(), E->getEndLoc()); 12568 } 12569 12570 template<typename Derived> 12571 ExprResult 12572 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12573 ExprResult SubExpr; 12574 { 12575 EnterExpressionEvaluationContext Unevaluated( 12576 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12577 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12578 if (SubExpr.isInvalid()) 12579 return ExprError(); 12580 12581 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12582 return E; 12583 } 12584 12585 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12586 SubExpr.get(), E->getEndLoc()); 12587 } 12588 12589 template <typename Derived> 12590 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12591 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12592 TypeSourceInfo **RecoveryTSI) { 12593 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12594 DRE, AddrTaken, RecoveryTSI); 12595 12596 // Propagate both errors and recovered types, which return ExprEmpty. 12597 if (!NewDRE.isUsable()) 12598 return NewDRE; 12599 12600 // We got an expr, wrap it up in parens. 12601 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12602 return PE; 12603 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12604 PE->getRParen()); 12605 } 12606 12607 template <typename Derived> 12608 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12609 DependentScopeDeclRefExpr *E) { 12610 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12611 nullptr); 12612 } 12613 12614 template <typename Derived> 12615 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12616 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 12617 TypeSourceInfo **RecoveryTSI) { 12618 assert(E->getQualifierLoc()); 12619 NestedNameSpecifierLoc QualifierLoc = 12620 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12621 if (!QualifierLoc) 12622 return ExprError(); 12623 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12624 12625 // TODO: If this is a conversion-function-id, verify that the 12626 // destination type name (if present) resolves the same way after 12627 // instantiation as it did in the local scope. 12628 12629 DeclarationNameInfo NameInfo = 12630 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12631 if (!NameInfo.getName()) 12632 return ExprError(); 12633 12634 if (!E->hasExplicitTemplateArgs()) { 12635 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 12636 // Note: it is sufficient to compare the Name component of NameInfo: 12637 // if name has not changed, DNLoc has not changed either. 12638 NameInfo.getName() == E->getDeclName()) 12639 return E; 12640 12641 return getDerived().RebuildDependentScopeDeclRefExpr( 12642 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12643 IsAddressOfOperand, RecoveryTSI); 12644 } 12645 12646 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12647 if (getDerived().TransformTemplateArguments( 12648 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 12649 return ExprError(); 12650 12651 return getDerived().RebuildDependentScopeDeclRefExpr( 12652 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12653 RecoveryTSI); 12654 } 12655 12656 template<typename Derived> 12657 ExprResult 12658 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12659 // CXXConstructExprs other than for list-initialization and 12660 // CXXTemporaryObjectExpr are always implicit, so when we have 12661 // a 1-argument construction we just transform that argument. 12662 if (getDerived().AllowSkippingCXXConstructExpr() && 12663 ((E->getNumArgs() == 1 || 12664 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12665 (!getDerived().DropCallArgument(E->getArg(0))) && 12666 !E->isListInitialization())) 12667 return getDerived().TransformInitializer(E->getArg(0), 12668 /*DirectInit*/ false); 12669 12670 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12671 12672 QualType T = getDerived().TransformType(E->getType()); 12673 if (T.isNull()) 12674 return ExprError(); 12675 12676 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12677 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12678 if (!Constructor) 12679 return ExprError(); 12680 12681 bool ArgumentChanged = false; 12682 SmallVector<Expr*, 8> Args; 12683 { 12684 EnterExpressionEvaluationContext Context( 12685 getSema(), EnterExpressionEvaluationContext::InitList, 12686 E->isListInitialization()); 12687 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12688 &ArgumentChanged)) 12689 return ExprError(); 12690 } 12691 12692 if (!getDerived().AlwaysRebuild() && 12693 T == E->getType() && 12694 Constructor == E->getConstructor() && 12695 !ArgumentChanged) { 12696 // Mark the constructor as referenced. 12697 // FIXME: Instantiation-specific 12698 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12699 return E; 12700 } 12701 12702 return getDerived().RebuildCXXConstructExpr( 12703 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12704 E->hadMultipleCandidates(), E->isListInitialization(), 12705 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12706 E->getConstructionKind(), E->getParenOrBraceRange()); 12707 } 12708 12709 template<typename Derived> 12710 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12711 CXXInheritedCtorInitExpr *E) { 12712 QualType T = getDerived().TransformType(E->getType()); 12713 if (T.isNull()) 12714 return ExprError(); 12715 12716 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12717 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12718 if (!Constructor) 12719 return ExprError(); 12720 12721 if (!getDerived().AlwaysRebuild() && 12722 T == E->getType() && 12723 Constructor == E->getConstructor()) { 12724 // Mark the constructor as referenced. 12725 // FIXME: Instantiation-specific 12726 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12727 return E; 12728 } 12729 12730 return getDerived().RebuildCXXInheritedCtorInitExpr( 12731 T, E->getLocation(), Constructor, 12732 E->constructsVBase(), E->inheritedFromVBase()); 12733 } 12734 12735 /// Transform a C++ temporary-binding expression. 12736 /// 12737 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12738 /// transform the subexpression and return that. 12739 template<typename Derived> 12740 ExprResult 12741 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12742 return getDerived().TransformExpr(E->getSubExpr()); 12743 } 12744 12745 /// Transform a C++ expression that contains cleanups that should 12746 /// be run after the expression is evaluated. 12747 /// 12748 /// Since ExprWithCleanups nodes are implicitly generated, we 12749 /// just transform the subexpression and return that. 12750 template<typename Derived> 12751 ExprResult 12752 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12753 return getDerived().TransformExpr(E->getSubExpr()); 12754 } 12755 12756 template<typename Derived> 12757 ExprResult 12758 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12759 CXXTemporaryObjectExpr *E) { 12760 TypeSourceInfo *T = 12761 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12762 if (!T) 12763 return ExprError(); 12764 12765 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12766 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12767 if (!Constructor) 12768 return ExprError(); 12769 12770 bool ArgumentChanged = false; 12771 SmallVector<Expr*, 8> Args; 12772 Args.reserve(E->getNumArgs()); 12773 { 12774 EnterExpressionEvaluationContext Context( 12775 getSema(), EnterExpressionEvaluationContext::InitList, 12776 E->isListInitialization()); 12777 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12778 &ArgumentChanged)) 12779 return ExprError(); 12780 } 12781 12782 if (!getDerived().AlwaysRebuild() && 12783 T == E->getTypeSourceInfo() && 12784 Constructor == E->getConstructor() && 12785 !ArgumentChanged) { 12786 // FIXME: Instantiation-specific 12787 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12788 return SemaRef.MaybeBindToTemporary(E); 12789 } 12790 12791 // FIXME: We should just pass E->isListInitialization(), but we're not 12792 // prepared to handle list-initialization without a child InitListExpr. 12793 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12794 return getDerived().RebuildCXXTemporaryObjectExpr( 12795 T, LParenLoc, Args, E->getEndLoc(), 12796 /*ListInitialization=*/LParenLoc.isInvalid()); 12797 } 12798 12799 template<typename Derived> 12800 ExprResult 12801 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12802 // Transform any init-capture expressions before entering the scope of the 12803 // lambda body, because they are not semantically within that scope. 12804 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12805 struct TransformedInitCapture { 12806 // The location of the ... if the result is retaining a pack expansion. 12807 SourceLocation EllipsisLoc; 12808 // Zero or more expansions of the init-capture. 12809 SmallVector<InitCaptureInfoTy, 4> Expansions; 12810 }; 12811 SmallVector<TransformedInitCapture, 4> InitCaptures; 12812 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12813 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12814 CEnd = E->capture_end(); 12815 C != CEnd; ++C) { 12816 if (!E->isInitCapture(C)) 12817 continue; 12818 12819 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12820 VarDecl *OldVD = C->getCapturedVar(); 12821 12822 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12823 Optional<unsigned> NumExpansions) { 12824 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12825 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12826 12827 if (NewExprInitResult.isInvalid()) { 12828 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12829 return; 12830 } 12831 Expr *NewExprInit = NewExprInitResult.get(); 12832 12833 QualType NewInitCaptureType = 12834 getSema().buildLambdaInitCaptureInitialization( 12835 C->getLocation(), OldVD->getType()->isReferenceType(), 12836 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12837 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12838 NewExprInit); 12839 Result.Expansions.push_back( 12840 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12841 }; 12842 12843 // If this is an init-capture pack, consider expanding the pack now. 12844 if (OldVD->isParameterPack()) { 12845 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12846 ->getTypeLoc() 12847 .castAs<PackExpansionTypeLoc>(); 12848 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12849 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12850 12851 // Determine whether the set of unexpanded parameter packs can and should 12852 // be expanded. 12853 bool Expand = true; 12854 bool RetainExpansion = false; 12855 Optional<unsigned> OrigNumExpansions = 12856 ExpansionTL.getTypePtr()->getNumExpansions(); 12857 Optional<unsigned> NumExpansions = OrigNumExpansions; 12858 if (getDerived().TryExpandParameterPacks( 12859 ExpansionTL.getEllipsisLoc(), 12860 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12861 RetainExpansion, NumExpansions)) 12862 return ExprError(); 12863 if (Expand) { 12864 for (unsigned I = 0; I != *NumExpansions; ++I) { 12865 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12866 SubstInitCapture(SourceLocation(), None); 12867 } 12868 } 12869 if (!Expand || RetainExpansion) { 12870 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12871 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12872 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12873 } 12874 } else { 12875 SubstInitCapture(SourceLocation(), None); 12876 } 12877 } 12878 12879 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12880 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12881 12882 // Transform the template parameters, and add them to the current 12883 // instantiation scope. The null case is handled correctly. 12884 auto TPL = getDerived().TransformTemplateParameterList( 12885 E->getTemplateParameterList()); 12886 LSI->GLTemplateParameterList = TPL; 12887 12888 // Transform the type of the original lambda's call operator. 12889 // The transformation MUST be done in the CurrentInstantiationScope since 12890 // it introduces a mapping of the original to the newly created 12891 // transformed parameters. 12892 TypeSourceInfo *NewCallOpTSI = nullptr; 12893 { 12894 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12895 FunctionProtoTypeLoc OldCallOpFPTL = 12896 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12897 12898 TypeLocBuilder NewCallOpTLBuilder; 12899 SmallVector<QualType, 4> ExceptionStorage; 12900 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12901 QualType NewCallOpType = TransformFunctionProtoType( 12902 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12903 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12904 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12905 ExceptionStorage, Changed); 12906 }); 12907 if (NewCallOpType.isNull()) 12908 return ExprError(); 12909 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12910 NewCallOpType); 12911 } 12912 12913 // Transform the trailing requires clause 12914 ExprResult NewTrailingRequiresClause; 12915 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12916 // FIXME: Concepts: Substitution into requires clause should only happen 12917 // when checking satisfaction. 12918 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12919 12920 // Create the local class that will describe the lambda. 12921 // FIXME: KnownDependent below is wrong when substituting inside a templated 12922 // context that isn't a DeclContext (such as a variable template). 12923 CXXRecordDecl *OldClass = E->getLambdaClass(); 12924 CXXRecordDecl *Class 12925 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12926 NewCallOpTSI, 12927 /*KnownDependent=*/false, 12928 E->getCaptureDefault()); 12929 getDerived().transformedLocalDecl(OldClass, {Class}); 12930 12931 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 12932 if (getDerived().ReplacingOriginal()) 12933 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 12934 OldClass->getLambdaManglingNumber(), 12935 OldClass->getDeviceLambdaManglingNumber(), 12936 OldClass->getLambdaContextDecl()); 12937 12938 // Build the call operator. 12939 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12940 Class, E->getIntroducerRange(), NewCallOpTSI, 12941 E->getCallOperator()->getEndLoc(), 12942 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12943 E->getCallOperator()->getConstexprKind(), 12944 NewTrailingRequiresClause.get()); 12945 12946 LSI->CallOperator = NewCallOperator; 12947 12948 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12949 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12950 12951 // Number the lambda for linkage purposes if necessary. 12952 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12953 12954 // Introduce the context of the call operator. 12955 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12956 /*NewThisContext*/false); 12957 12958 // Enter the scope of the lambda. 12959 getSema().buildLambdaScope(LSI, NewCallOperator, 12960 E->getIntroducerRange(), 12961 E->getCaptureDefault(), 12962 E->getCaptureDefaultLoc(), 12963 E->hasExplicitParameters(), 12964 E->hasExplicitResultType(), 12965 E->isMutable()); 12966 12967 bool Invalid = false; 12968 12969 // Transform captures. 12970 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12971 CEnd = E->capture_end(); 12972 C != CEnd; ++C) { 12973 // When we hit the first implicit capture, tell Sema that we've finished 12974 // the list of explicit captures. 12975 if (C->isImplicit()) 12976 break; 12977 12978 // Capturing 'this' is trivial. 12979 if (C->capturesThis()) { 12980 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12981 /*BuildAndDiagnose*/ true, nullptr, 12982 C->getCaptureKind() == LCK_StarThis); 12983 continue; 12984 } 12985 // Captured expression will be recaptured during captured variables 12986 // rebuilding. 12987 if (C->capturesVLAType()) 12988 continue; 12989 12990 // Rebuild init-captures, including the implied field declaration. 12991 if (E->isInitCapture(C)) { 12992 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12993 12994 VarDecl *OldVD = C->getCapturedVar(); 12995 llvm::SmallVector<Decl*, 4> NewVDs; 12996 12997 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12998 ExprResult Init = Info.first; 12999 QualType InitQualType = Info.second; 13000 if (Init.isInvalid() || InitQualType.isNull()) { 13001 Invalid = true; 13002 break; 13003 } 13004 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 13005 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 13006 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 13007 if (!NewVD) { 13008 Invalid = true; 13009 break; 13010 } 13011 NewVDs.push_back(NewVD); 13012 getSema().addInitCapture(LSI, NewVD); 13013 } 13014 13015 if (Invalid) 13016 break; 13017 13018 getDerived().transformedLocalDecl(OldVD, NewVDs); 13019 continue; 13020 } 13021 13022 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13023 13024 // Determine the capture kind for Sema. 13025 Sema::TryCaptureKind Kind 13026 = C->isImplicit()? Sema::TryCapture_Implicit 13027 : C->getCaptureKind() == LCK_ByCopy 13028 ? Sema::TryCapture_ExplicitByVal 13029 : Sema::TryCapture_ExplicitByRef; 13030 SourceLocation EllipsisLoc; 13031 if (C->isPackExpansion()) { 13032 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 13033 bool ShouldExpand = false; 13034 bool RetainExpansion = false; 13035 Optional<unsigned> NumExpansions; 13036 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 13037 C->getLocation(), 13038 Unexpanded, 13039 ShouldExpand, RetainExpansion, 13040 NumExpansions)) { 13041 Invalid = true; 13042 continue; 13043 } 13044 13045 if (ShouldExpand) { 13046 // The transform has determined that we should perform an expansion; 13047 // transform and capture each of the arguments. 13048 // expansion of the pattern. Do so. 13049 VarDecl *Pack = C->getCapturedVar(); 13050 for (unsigned I = 0; I != *NumExpansions; ++I) { 13051 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13052 VarDecl *CapturedVar 13053 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13054 Pack)); 13055 if (!CapturedVar) { 13056 Invalid = true; 13057 continue; 13058 } 13059 13060 // Capture the transformed variable. 13061 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 13062 } 13063 13064 // FIXME: Retain a pack expansion if RetainExpansion is true. 13065 13066 continue; 13067 } 13068 13069 EllipsisLoc = C->getEllipsisLoc(); 13070 } 13071 13072 // Transform the captured variable. 13073 VarDecl *CapturedVar 13074 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13075 C->getCapturedVar())); 13076 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13077 Invalid = true; 13078 continue; 13079 } 13080 13081 // Capture the transformed variable. 13082 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13083 EllipsisLoc); 13084 } 13085 getSema().finishLambdaExplicitCaptures(LSI); 13086 13087 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13088 // evaluation context even if we're not transforming the function body. 13089 getSema().PushExpressionEvaluationContext( 13090 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13091 13092 // Instantiate the body of the lambda expression. 13093 StmtResult Body = 13094 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13095 13096 // ActOnLambda* will pop the function scope for us. 13097 FuncScopeCleanup.disable(); 13098 13099 if (Body.isInvalid()) { 13100 SavedContext.pop(); 13101 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13102 /*IsInstantiation=*/true); 13103 return ExprError(); 13104 } 13105 13106 // Copy the LSI before ActOnFinishFunctionBody removes it. 13107 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13108 // the call operator. 13109 auto LSICopy = *LSI; 13110 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13111 /*IsInstantiation*/ true); 13112 SavedContext.pop(); 13113 13114 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13115 &LSICopy); 13116 } 13117 13118 template<typename Derived> 13119 StmtResult 13120 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13121 return TransformStmt(S); 13122 } 13123 13124 template<typename Derived> 13125 StmtResult 13126 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13127 // Transform captures. 13128 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13129 CEnd = E->capture_end(); 13130 C != CEnd; ++C) { 13131 // When we hit the first implicit capture, tell Sema that we've finished 13132 // the list of explicit captures. 13133 if (!C->isImplicit()) 13134 continue; 13135 13136 // Capturing 'this' is trivial. 13137 if (C->capturesThis()) { 13138 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13139 /*BuildAndDiagnose*/ true, nullptr, 13140 C->getCaptureKind() == LCK_StarThis); 13141 continue; 13142 } 13143 // Captured expression will be recaptured during captured variables 13144 // rebuilding. 13145 if (C->capturesVLAType()) 13146 continue; 13147 13148 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13149 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13150 13151 // Transform the captured variable. 13152 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13153 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13154 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13155 return StmtError(); 13156 13157 // Capture the transformed variable. 13158 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13159 } 13160 13161 return S; 13162 } 13163 13164 template<typename Derived> 13165 ExprResult 13166 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13167 CXXUnresolvedConstructExpr *E) { 13168 TypeSourceInfo *T = 13169 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13170 if (!T) 13171 return ExprError(); 13172 13173 bool ArgumentChanged = false; 13174 SmallVector<Expr*, 8> Args; 13175 Args.reserve(E->getNumArgs()); 13176 { 13177 EnterExpressionEvaluationContext Context( 13178 getSema(), EnterExpressionEvaluationContext::InitList, 13179 E->isListInitialization()); 13180 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13181 &ArgumentChanged)) 13182 return ExprError(); 13183 } 13184 13185 if (!getDerived().AlwaysRebuild() && 13186 T == E->getTypeSourceInfo() && 13187 !ArgumentChanged) 13188 return E; 13189 13190 // FIXME: we're faking the locations of the commas 13191 return getDerived().RebuildCXXUnresolvedConstructExpr( 13192 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13193 } 13194 13195 template<typename Derived> 13196 ExprResult 13197 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13198 CXXDependentScopeMemberExpr *E) { 13199 // Transform the base of the expression. 13200 ExprResult Base((Expr*) nullptr); 13201 Expr *OldBase; 13202 QualType BaseType; 13203 QualType ObjectType; 13204 if (!E->isImplicitAccess()) { 13205 OldBase = E->getBase(); 13206 Base = getDerived().TransformExpr(OldBase); 13207 if (Base.isInvalid()) 13208 return ExprError(); 13209 13210 // Start the member reference and compute the object's type. 13211 ParsedType ObjectTy; 13212 bool MayBePseudoDestructor = false; 13213 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13214 E->getOperatorLoc(), 13215 E->isArrow()? tok::arrow : tok::period, 13216 ObjectTy, 13217 MayBePseudoDestructor); 13218 if (Base.isInvalid()) 13219 return ExprError(); 13220 13221 ObjectType = ObjectTy.get(); 13222 BaseType = ((Expr*) Base.get())->getType(); 13223 } else { 13224 OldBase = nullptr; 13225 BaseType = getDerived().TransformType(E->getBaseType()); 13226 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13227 } 13228 13229 // Transform the first part of the nested-name-specifier that qualifies 13230 // the member name. 13231 NamedDecl *FirstQualifierInScope 13232 = getDerived().TransformFirstQualifierInScope( 13233 E->getFirstQualifierFoundInScope(), 13234 E->getQualifierLoc().getBeginLoc()); 13235 13236 NestedNameSpecifierLoc QualifierLoc; 13237 if (E->getQualifier()) { 13238 QualifierLoc 13239 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13240 ObjectType, 13241 FirstQualifierInScope); 13242 if (!QualifierLoc) 13243 return ExprError(); 13244 } 13245 13246 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13247 13248 // TODO: If this is a conversion-function-id, verify that the 13249 // destination type name (if present) resolves the same way after 13250 // instantiation as it did in the local scope. 13251 13252 DeclarationNameInfo NameInfo 13253 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13254 if (!NameInfo.getName()) 13255 return ExprError(); 13256 13257 if (!E->hasExplicitTemplateArgs()) { 13258 // This is a reference to a member without an explicitly-specified 13259 // template argument list. Optimize for this common case. 13260 if (!getDerived().AlwaysRebuild() && 13261 Base.get() == OldBase && 13262 BaseType == E->getBaseType() && 13263 QualifierLoc == E->getQualifierLoc() && 13264 NameInfo.getName() == E->getMember() && 13265 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13266 return E; 13267 13268 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13269 BaseType, 13270 E->isArrow(), 13271 E->getOperatorLoc(), 13272 QualifierLoc, 13273 TemplateKWLoc, 13274 FirstQualifierInScope, 13275 NameInfo, 13276 /*TemplateArgs*/nullptr); 13277 } 13278 13279 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13280 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13281 E->getNumTemplateArgs(), 13282 TransArgs)) 13283 return ExprError(); 13284 13285 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13286 BaseType, 13287 E->isArrow(), 13288 E->getOperatorLoc(), 13289 QualifierLoc, 13290 TemplateKWLoc, 13291 FirstQualifierInScope, 13292 NameInfo, 13293 &TransArgs); 13294 } 13295 13296 template <typename Derived> 13297 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13298 UnresolvedMemberExpr *Old) { 13299 // Transform the base of the expression. 13300 ExprResult Base((Expr *)nullptr); 13301 QualType BaseType; 13302 if (!Old->isImplicitAccess()) { 13303 Base = getDerived().TransformExpr(Old->getBase()); 13304 if (Base.isInvalid()) 13305 return ExprError(); 13306 Base = 13307 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13308 if (Base.isInvalid()) 13309 return ExprError(); 13310 BaseType = Base.get()->getType(); 13311 } else { 13312 BaseType = getDerived().TransformType(Old->getBaseType()); 13313 } 13314 13315 NestedNameSpecifierLoc QualifierLoc; 13316 if (Old->getQualifierLoc()) { 13317 QualifierLoc = 13318 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13319 if (!QualifierLoc) 13320 return ExprError(); 13321 } 13322 13323 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13324 13325 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13326 13327 // Transform the declaration set. 13328 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13329 return ExprError(); 13330 13331 // Determine the naming class. 13332 if (Old->getNamingClass()) { 13333 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13334 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13335 if (!NamingClass) 13336 return ExprError(); 13337 13338 R.setNamingClass(NamingClass); 13339 } 13340 13341 TemplateArgumentListInfo TransArgs; 13342 if (Old->hasExplicitTemplateArgs()) { 13343 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13344 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13345 if (getDerived().TransformTemplateArguments( 13346 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13347 return ExprError(); 13348 } 13349 13350 // FIXME: to do this check properly, we will need to preserve the 13351 // first-qualifier-in-scope here, just in case we had a dependent 13352 // base (and therefore couldn't do the check) and a 13353 // nested-name-qualifier (and therefore could do the lookup). 13354 NamedDecl *FirstQualifierInScope = nullptr; 13355 13356 return getDerived().RebuildUnresolvedMemberExpr( 13357 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13358 TemplateKWLoc, FirstQualifierInScope, R, 13359 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13360 } 13361 13362 template<typename Derived> 13363 ExprResult 13364 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13365 EnterExpressionEvaluationContext Unevaluated( 13366 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13367 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13368 if (SubExpr.isInvalid()) 13369 return ExprError(); 13370 13371 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13372 return E; 13373 13374 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13375 } 13376 13377 template<typename Derived> 13378 ExprResult 13379 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13380 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13381 if (Pattern.isInvalid()) 13382 return ExprError(); 13383 13384 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13385 return E; 13386 13387 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13388 E->getNumExpansions()); 13389 } 13390 13391 template<typename Derived> 13392 ExprResult 13393 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13394 // If E is not value-dependent, then nothing will change when we transform it. 13395 // Note: This is an instantiation-centric view. 13396 if (!E->isValueDependent()) 13397 return E; 13398 13399 EnterExpressionEvaluationContext Unevaluated( 13400 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13401 13402 ArrayRef<TemplateArgument> PackArgs; 13403 TemplateArgument ArgStorage; 13404 13405 // Find the argument list to transform. 13406 if (E->isPartiallySubstituted()) { 13407 PackArgs = E->getPartialArguments(); 13408 } else if (E->isValueDependent()) { 13409 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13410 bool ShouldExpand = false; 13411 bool RetainExpansion = false; 13412 Optional<unsigned> NumExpansions; 13413 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13414 Unexpanded, 13415 ShouldExpand, RetainExpansion, 13416 NumExpansions)) 13417 return ExprError(); 13418 13419 // If we need to expand the pack, build a template argument from it and 13420 // expand that. 13421 if (ShouldExpand) { 13422 auto *Pack = E->getPack(); 13423 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13424 ArgStorage = getSema().Context.getPackExpansionType( 13425 getSema().Context.getTypeDeclType(TTPD), None); 13426 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13427 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13428 } else { 13429 auto *VD = cast<ValueDecl>(Pack); 13430 ExprResult DRE = getSema().BuildDeclRefExpr( 13431 VD, VD->getType().getNonLValueExprType(getSema().Context), 13432 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 13433 E->getPackLoc()); 13434 if (DRE.isInvalid()) 13435 return ExprError(); 13436 ArgStorage = new (getSema().Context) PackExpansionExpr( 13437 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13438 } 13439 PackArgs = ArgStorage; 13440 } 13441 } 13442 13443 // If we're not expanding the pack, just transform the decl. 13444 if (!PackArgs.size()) { 13445 auto *Pack = cast_or_null<NamedDecl>( 13446 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13447 if (!Pack) 13448 return ExprError(); 13449 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13450 E->getPackLoc(), 13451 E->getRParenLoc(), None, None); 13452 } 13453 13454 // Try to compute the result without performing a partial substitution. 13455 Optional<unsigned> Result = 0; 13456 for (const TemplateArgument &Arg : PackArgs) { 13457 if (!Arg.isPackExpansion()) { 13458 Result = *Result + 1; 13459 continue; 13460 } 13461 13462 TemplateArgumentLoc ArgLoc; 13463 InventTemplateArgumentLoc(Arg, ArgLoc); 13464 13465 // Find the pattern of the pack expansion. 13466 SourceLocation Ellipsis; 13467 Optional<unsigned> OrigNumExpansions; 13468 TemplateArgumentLoc Pattern = 13469 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13470 OrigNumExpansions); 13471 13472 // Substitute under the pack expansion. Do not expand the pack (yet). 13473 TemplateArgumentLoc OutPattern; 13474 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13475 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13476 /*Uneval*/ true)) 13477 return true; 13478 13479 // See if we can determine the number of arguments from the result. 13480 Optional<unsigned> NumExpansions = 13481 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13482 if (!NumExpansions) { 13483 // No: we must be in an alias template expansion, and we're going to need 13484 // to actually expand the packs. 13485 Result = None; 13486 break; 13487 } 13488 13489 Result = *Result + *NumExpansions; 13490 } 13491 13492 // Common case: we could determine the number of expansions without 13493 // substituting. 13494 if (Result) 13495 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13496 E->getPackLoc(), 13497 E->getRParenLoc(), *Result, None); 13498 13499 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13500 E->getPackLoc()); 13501 { 13502 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13503 typedef TemplateArgumentLocInventIterator< 13504 Derived, const TemplateArgument*> PackLocIterator; 13505 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13506 PackLocIterator(*this, PackArgs.end()), 13507 TransformedPackArgs, /*Uneval*/true)) 13508 return ExprError(); 13509 } 13510 13511 // Check whether we managed to fully-expand the pack. 13512 // FIXME: Is it possible for us to do so and not hit the early exit path? 13513 SmallVector<TemplateArgument, 8> Args; 13514 bool PartialSubstitution = false; 13515 for (auto &Loc : TransformedPackArgs.arguments()) { 13516 Args.push_back(Loc.getArgument()); 13517 if (Loc.getArgument().isPackExpansion()) 13518 PartialSubstitution = true; 13519 } 13520 13521 if (PartialSubstitution) 13522 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13523 E->getPackLoc(), 13524 E->getRParenLoc(), None, Args); 13525 13526 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13527 E->getPackLoc(), E->getRParenLoc(), 13528 Args.size(), None); 13529 } 13530 13531 template<typename Derived> 13532 ExprResult 13533 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13534 SubstNonTypeTemplateParmPackExpr *E) { 13535 // Default behavior is to do nothing with this transformation. 13536 return E; 13537 } 13538 13539 template<typename Derived> 13540 ExprResult 13541 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13542 SubstNonTypeTemplateParmExpr *E) { 13543 // Default behavior is to do nothing with this transformation. 13544 return E; 13545 } 13546 13547 template<typename Derived> 13548 ExprResult 13549 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13550 // Default behavior is to do nothing with this transformation. 13551 return E; 13552 } 13553 13554 template<typename Derived> 13555 ExprResult 13556 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13557 MaterializeTemporaryExpr *E) { 13558 return getDerived().TransformExpr(E->getSubExpr()); 13559 } 13560 13561 template<typename Derived> 13562 ExprResult 13563 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13564 UnresolvedLookupExpr *Callee = nullptr; 13565 if (Expr *OldCallee = E->getCallee()) { 13566 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13567 if (CalleeResult.isInvalid()) 13568 return ExprError(); 13569 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13570 } 13571 13572 Expr *Pattern = E->getPattern(); 13573 13574 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13575 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13576 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13577 13578 // Determine whether the set of unexpanded parameter packs can and should 13579 // be expanded. 13580 bool Expand = true; 13581 bool RetainExpansion = false; 13582 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13583 NumExpansions = OrigNumExpansions; 13584 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13585 Pattern->getSourceRange(), 13586 Unexpanded, 13587 Expand, RetainExpansion, 13588 NumExpansions)) 13589 return true; 13590 13591 if (!Expand) { 13592 // Do not expand any packs here, just transform and rebuild a fold 13593 // expression. 13594 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13595 13596 ExprResult LHS = 13597 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13598 if (LHS.isInvalid()) 13599 return true; 13600 13601 ExprResult RHS = 13602 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13603 if (RHS.isInvalid()) 13604 return true; 13605 13606 if (!getDerived().AlwaysRebuild() && 13607 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13608 return E; 13609 13610 return getDerived().RebuildCXXFoldExpr( 13611 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13612 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13613 } 13614 13615 // Formally a fold expression expands to nested parenthesized expressions. 13616 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13617 // them. 13618 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13619 SemaRef.Diag(E->getEllipsisLoc(), 13620 clang::diag::err_fold_expression_limit_exceeded) 13621 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13622 << E->getSourceRange(); 13623 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13624 return ExprError(); 13625 } 13626 13627 // The transform has determined that we should perform an elementwise 13628 // expansion of the pattern. Do so. 13629 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13630 if (Result.isInvalid()) 13631 return true; 13632 bool LeftFold = E->isLeftFold(); 13633 13634 // If we're retaining an expansion for a right fold, it is the innermost 13635 // component and takes the init (if any). 13636 if (!LeftFold && RetainExpansion) { 13637 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13638 13639 ExprResult Out = getDerived().TransformExpr(Pattern); 13640 if (Out.isInvalid()) 13641 return true; 13642 13643 Result = getDerived().RebuildCXXFoldExpr( 13644 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13645 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13646 if (Result.isInvalid()) 13647 return true; 13648 } 13649 13650 for (unsigned I = 0; I != *NumExpansions; ++I) { 13651 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13652 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13653 ExprResult Out = getDerived().TransformExpr(Pattern); 13654 if (Out.isInvalid()) 13655 return true; 13656 13657 if (Out.get()->containsUnexpandedParameterPack()) { 13658 // We still have a pack; retain a pack expansion for this slice. 13659 Result = getDerived().RebuildCXXFoldExpr( 13660 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13661 E->getOperator(), E->getEllipsisLoc(), 13662 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13663 OrigNumExpansions); 13664 } else if (Result.isUsable()) { 13665 // We've got down to a single element; build a binary operator. 13666 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13667 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13668 if (Callee) 13669 Result = getDerived().RebuildCXXOperatorCallExpr( 13670 BinaryOperator::getOverloadedOperator(E->getOperator()), 13671 E->getEllipsisLoc(), Callee, LHS, RHS); 13672 else 13673 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13674 E->getOperator(), LHS, RHS); 13675 } else 13676 Result = Out; 13677 13678 if (Result.isInvalid()) 13679 return true; 13680 } 13681 13682 // If we're retaining an expansion for a left fold, it is the outermost 13683 // component and takes the complete expansion so far as its init (if any). 13684 if (LeftFold && RetainExpansion) { 13685 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13686 13687 ExprResult Out = getDerived().TransformExpr(Pattern); 13688 if (Out.isInvalid()) 13689 return true; 13690 13691 Result = getDerived().RebuildCXXFoldExpr( 13692 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13693 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13694 if (Result.isInvalid()) 13695 return true; 13696 } 13697 13698 // If we had no init and an empty pack, and we're not retaining an expansion, 13699 // then produce a fallback value or error. 13700 if (Result.isUnset()) 13701 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13702 E->getOperator()); 13703 13704 return Result; 13705 } 13706 13707 template<typename Derived> 13708 ExprResult 13709 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13710 CXXStdInitializerListExpr *E) { 13711 return getDerived().TransformExpr(E->getSubExpr()); 13712 } 13713 13714 template<typename Derived> 13715 ExprResult 13716 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13717 return SemaRef.MaybeBindToTemporary(E); 13718 } 13719 13720 template<typename Derived> 13721 ExprResult 13722 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13723 return E; 13724 } 13725 13726 template<typename Derived> 13727 ExprResult 13728 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13729 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13730 if (SubExpr.isInvalid()) 13731 return ExprError(); 13732 13733 if (!getDerived().AlwaysRebuild() && 13734 SubExpr.get() == E->getSubExpr()) 13735 return E; 13736 13737 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13738 } 13739 13740 template<typename Derived> 13741 ExprResult 13742 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13743 // Transform each of the elements. 13744 SmallVector<Expr *, 8> Elements; 13745 bool ArgChanged = false; 13746 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13747 /*IsCall=*/false, Elements, &ArgChanged)) 13748 return ExprError(); 13749 13750 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13751 return SemaRef.MaybeBindToTemporary(E); 13752 13753 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13754 Elements.data(), 13755 Elements.size()); 13756 } 13757 13758 template<typename Derived> 13759 ExprResult 13760 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13761 ObjCDictionaryLiteral *E) { 13762 // Transform each of the elements. 13763 SmallVector<ObjCDictionaryElement, 8> Elements; 13764 bool ArgChanged = false; 13765 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13766 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13767 13768 if (OrigElement.isPackExpansion()) { 13769 // This key/value element is a pack expansion. 13770 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13771 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13772 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13773 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13774 13775 // Determine whether the set of unexpanded parameter packs can 13776 // and should be expanded. 13777 bool Expand = true; 13778 bool RetainExpansion = false; 13779 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13780 Optional<unsigned> NumExpansions = OrigNumExpansions; 13781 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13782 OrigElement.Value->getEndLoc()); 13783 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13784 PatternRange, Unexpanded, Expand, 13785 RetainExpansion, NumExpansions)) 13786 return ExprError(); 13787 13788 if (!Expand) { 13789 // The transform has determined that we should perform a simple 13790 // transformation on the pack expansion, producing another pack 13791 // expansion. 13792 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13793 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13794 if (Key.isInvalid()) 13795 return ExprError(); 13796 13797 if (Key.get() != OrigElement.Key) 13798 ArgChanged = true; 13799 13800 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13801 if (Value.isInvalid()) 13802 return ExprError(); 13803 13804 if (Value.get() != OrigElement.Value) 13805 ArgChanged = true; 13806 13807 ObjCDictionaryElement Expansion = { 13808 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13809 }; 13810 Elements.push_back(Expansion); 13811 continue; 13812 } 13813 13814 // Record right away that the argument was changed. This needs 13815 // to happen even if the array expands to nothing. 13816 ArgChanged = true; 13817 13818 // The transform has determined that we should perform an elementwise 13819 // expansion of the pattern. Do so. 13820 for (unsigned I = 0; I != *NumExpansions; ++I) { 13821 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13822 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13823 if (Key.isInvalid()) 13824 return ExprError(); 13825 13826 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13827 if (Value.isInvalid()) 13828 return ExprError(); 13829 13830 ObjCDictionaryElement Element = { 13831 Key.get(), Value.get(), SourceLocation(), NumExpansions 13832 }; 13833 13834 // If any unexpanded parameter packs remain, we still have a 13835 // pack expansion. 13836 // FIXME: Can this really happen? 13837 if (Key.get()->containsUnexpandedParameterPack() || 13838 Value.get()->containsUnexpandedParameterPack()) 13839 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13840 13841 Elements.push_back(Element); 13842 } 13843 13844 // FIXME: Retain a pack expansion if RetainExpansion is true. 13845 13846 // We've finished with this pack expansion. 13847 continue; 13848 } 13849 13850 // Transform and check key. 13851 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13852 if (Key.isInvalid()) 13853 return ExprError(); 13854 13855 if (Key.get() != OrigElement.Key) 13856 ArgChanged = true; 13857 13858 // Transform and check value. 13859 ExprResult Value 13860 = getDerived().TransformExpr(OrigElement.Value); 13861 if (Value.isInvalid()) 13862 return ExprError(); 13863 13864 if (Value.get() != OrigElement.Value) 13865 ArgChanged = true; 13866 13867 ObjCDictionaryElement Element = { 13868 Key.get(), Value.get(), SourceLocation(), None 13869 }; 13870 Elements.push_back(Element); 13871 } 13872 13873 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13874 return SemaRef.MaybeBindToTemporary(E); 13875 13876 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13877 Elements); 13878 } 13879 13880 template<typename Derived> 13881 ExprResult 13882 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13883 TypeSourceInfo *EncodedTypeInfo 13884 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13885 if (!EncodedTypeInfo) 13886 return ExprError(); 13887 13888 if (!getDerived().AlwaysRebuild() && 13889 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13890 return E; 13891 13892 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13893 EncodedTypeInfo, 13894 E->getRParenLoc()); 13895 } 13896 13897 template<typename Derived> 13898 ExprResult TreeTransform<Derived>:: 13899 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13900 // This is a kind of implicit conversion, and it needs to get dropped 13901 // and recomputed for the same general reasons that ImplicitCastExprs 13902 // do, as well a more specific one: this expression is only valid when 13903 // it appears *immediately* as an argument expression. 13904 return getDerived().TransformExpr(E->getSubExpr()); 13905 } 13906 13907 template<typename Derived> 13908 ExprResult TreeTransform<Derived>:: 13909 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13910 TypeSourceInfo *TSInfo 13911 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13912 if (!TSInfo) 13913 return ExprError(); 13914 13915 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13916 if (Result.isInvalid()) 13917 return ExprError(); 13918 13919 if (!getDerived().AlwaysRebuild() && 13920 TSInfo == E->getTypeInfoAsWritten() && 13921 Result.get() == E->getSubExpr()) 13922 return E; 13923 13924 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13925 E->getBridgeKeywordLoc(), TSInfo, 13926 Result.get()); 13927 } 13928 13929 template <typename Derived> 13930 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13931 ObjCAvailabilityCheckExpr *E) { 13932 return E; 13933 } 13934 13935 template<typename Derived> 13936 ExprResult 13937 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13938 // Transform arguments. 13939 bool ArgChanged = false; 13940 SmallVector<Expr*, 8> Args; 13941 Args.reserve(E->getNumArgs()); 13942 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13943 &ArgChanged)) 13944 return ExprError(); 13945 13946 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13947 // Class message: transform the receiver type. 13948 TypeSourceInfo *ReceiverTypeInfo 13949 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13950 if (!ReceiverTypeInfo) 13951 return ExprError(); 13952 13953 // If nothing changed, just retain the existing message send. 13954 if (!getDerived().AlwaysRebuild() && 13955 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13956 return SemaRef.MaybeBindToTemporary(E); 13957 13958 // Build a new class message send. 13959 SmallVector<SourceLocation, 16> SelLocs; 13960 E->getSelectorLocs(SelLocs); 13961 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13962 E->getSelector(), 13963 SelLocs, 13964 E->getMethodDecl(), 13965 E->getLeftLoc(), 13966 Args, 13967 E->getRightLoc()); 13968 } 13969 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13970 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13971 if (!E->getMethodDecl()) 13972 return ExprError(); 13973 13974 // Build a new class message send to 'super'. 13975 SmallVector<SourceLocation, 16> SelLocs; 13976 E->getSelectorLocs(SelLocs); 13977 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13978 E->getSelector(), 13979 SelLocs, 13980 E->getReceiverType(), 13981 E->getMethodDecl(), 13982 E->getLeftLoc(), 13983 Args, 13984 E->getRightLoc()); 13985 } 13986 13987 // Instance message: transform the receiver 13988 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13989 "Only class and instance messages may be instantiated"); 13990 ExprResult Receiver 13991 = getDerived().TransformExpr(E->getInstanceReceiver()); 13992 if (Receiver.isInvalid()) 13993 return ExprError(); 13994 13995 // If nothing changed, just retain the existing message send. 13996 if (!getDerived().AlwaysRebuild() && 13997 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13998 return SemaRef.MaybeBindToTemporary(E); 13999 14000 // Build a new instance message send. 14001 SmallVector<SourceLocation, 16> SelLocs; 14002 E->getSelectorLocs(SelLocs); 14003 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 14004 E->getSelector(), 14005 SelLocs, 14006 E->getMethodDecl(), 14007 E->getLeftLoc(), 14008 Args, 14009 E->getRightLoc()); 14010 } 14011 14012 template<typename Derived> 14013 ExprResult 14014 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 14015 return E; 14016 } 14017 14018 template<typename Derived> 14019 ExprResult 14020 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 14021 return E; 14022 } 14023 14024 template<typename Derived> 14025 ExprResult 14026 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 14027 // Transform the base expression. 14028 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14029 if (Base.isInvalid()) 14030 return ExprError(); 14031 14032 // We don't need to transform the ivar; it will never change. 14033 14034 // If nothing changed, just retain the existing expression. 14035 if (!getDerived().AlwaysRebuild() && 14036 Base.get() == E->getBase()) 14037 return E; 14038 14039 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 14040 E->getLocation(), 14041 E->isArrow(), E->isFreeIvar()); 14042 } 14043 14044 template<typename Derived> 14045 ExprResult 14046 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 14047 // 'super' and types never change. Property never changes. Just 14048 // retain the existing expression. 14049 if (!E->isObjectReceiver()) 14050 return E; 14051 14052 // Transform the base expression. 14053 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14054 if (Base.isInvalid()) 14055 return ExprError(); 14056 14057 // We don't need to transform the property; it will never change. 14058 14059 // If nothing changed, just retain the existing expression. 14060 if (!getDerived().AlwaysRebuild() && 14061 Base.get() == E->getBase()) 14062 return E; 14063 14064 if (E->isExplicitProperty()) 14065 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14066 E->getExplicitProperty(), 14067 E->getLocation()); 14068 14069 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14070 SemaRef.Context.PseudoObjectTy, 14071 E->getImplicitPropertyGetter(), 14072 E->getImplicitPropertySetter(), 14073 E->getLocation()); 14074 } 14075 14076 template<typename Derived> 14077 ExprResult 14078 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14079 // Transform the base expression. 14080 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14081 if (Base.isInvalid()) 14082 return ExprError(); 14083 14084 // Transform the key expression. 14085 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14086 if (Key.isInvalid()) 14087 return ExprError(); 14088 14089 // If nothing changed, just retain the existing expression. 14090 if (!getDerived().AlwaysRebuild() && 14091 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14092 return E; 14093 14094 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14095 Base.get(), Key.get(), 14096 E->getAtIndexMethodDecl(), 14097 E->setAtIndexMethodDecl()); 14098 } 14099 14100 template<typename Derived> 14101 ExprResult 14102 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14103 // Transform the base expression. 14104 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14105 if (Base.isInvalid()) 14106 return ExprError(); 14107 14108 // If nothing changed, just retain the existing expression. 14109 if (!getDerived().AlwaysRebuild() && 14110 Base.get() == E->getBase()) 14111 return E; 14112 14113 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14114 E->getOpLoc(), 14115 E->isArrow()); 14116 } 14117 14118 template<typename Derived> 14119 ExprResult 14120 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14121 bool ArgumentChanged = false; 14122 SmallVector<Expr*, 8> SubExprs; 14123 SubExprs.reserve(E->getNumSubExprs()); 14124 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14125 SubExprs, &ArgumentChanged)) 14126 return ExprError(); 14127 14128 if (!getDerived().AlwaysRebuild() && 14129 !ArgumentChanged) 14130 return E; 14131 14132 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14133 SubExprs, 14134 E->getRParenLoc()); 14135 } 14136 14137 template<typename Derived> 14138 ExprResult 14139 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14140 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14141 if (SrcExpr.isInvalid()) 14142 return ExprError(); 14143 14144 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14145 if (!Type) 14146 return ExprError(); 14147 14148 if (!getDerived().AlwaysRebuild() && 14149 Type == E->getTypeSourceInfo() && 14150 SrcExpr.get() == E->getSrcExpr()) 14151 return E; 14152 14153 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14154 SrcExpr.get(), Type, 14155 E->getRParenLoc()); 14156 } 14157 14158 template<typename Derived> 14159 ExprResult 14160 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14161 BlockDecl *oldBlock = E->getBlockDecl(); 14162 14163 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14164 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14165 14166 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14167 blockScope->TheDecl->setBlockMissingReturnType( 14168 oldBlock->blockMissingReturnType()); 14169 14170 SmallVector<ParmVarDecl*, 4> params; 14171 SmallVector<QualType, 4> paramTypes; 14172 14173 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14174 14175 // Parameter substitution. 14176 Sema::ExtParameterInfoBuilder extParamInfos; 14177 if (getDerived().TransformFunctionTypeParams( 14178 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14179 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14180 extParamInfos)) { 14181 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14182 return ExprError(); 14183 } 14184 14185 QualType exprResultType = 14186 getDerived().TransformType(exprFunctionType->getReturnType()); 14187 14188 auto epi = exprFunctionType->getExtProtoInfo(); 14189 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14190 14191 QualType functionType = 14192 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14193 blockScope->FunctionType = functionType; 14194 14195 // Set the parameters on the block decl. 14196 if (!params.empty()) 14197 blockScope->TheDecl->setParams(params); 14198 14199 if (!oldBlock->blockMissingReturnType()) { 14200 blockScope->HasImplicitReturnType = false; 14201 blockScope->ReturnType = exprResultType; 14202 } 14203 14204 // Transform the body 14205 StmtResult body = getDerived().TransformStmt(E->getBody()); 14206 if (body.isInvalid()) { 14207 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14208 return ExprError(); 14209 } 14210 14211 #ifndef NDEBUG 14212 // In builds with assertions, make sure that we captured everything we 14213 // captured before. 14214 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14215 for (const auto &I : oldBlock->captures()) { 14216 VarDecl *oldCapture = I.getVariable(); 14217 14218 // Ignore parameter packs. 14219 if (oldCapture->isParameterPack()) 14220 continue; 14221 14222 VarDecl *newCapture = 14223 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14224 oldCapture)); 14225 assert(blockScope->CaptureMap.count(newCapture)); 14226 } 14227 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14228 } 14229 #endif 14230 14231 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14232 /*Scope=*/nullptr); 14233 } 14234 14235 template<typename Derived> 14236 ExprResult 14237 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14238 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14239 if (SrcExpr.isInvalid()) 14240 return ExprError(); 14241 14242 QualType Type = getDerived().TransformType(E->getType()); 14243 14244 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14245 E->getRParenLoc()); 14246 } 14247 14248 template<typename Derived> 14249 ExprResult 14250 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14251 bool ArgumentChanged = false; 14252 SmallVector<Expr*, 8> SubExprs; 14253 SubExprs.reserve(E->getNumSubExprs()); 14254 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14255 SubExprs, &ArgumentChanged)) 14256 return ExprError(); 14257 14258 if (!getDerived().AlwaysRebuild() && 14259 !ArgumentChanged) 14260 return E; 14261 14262 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14263 E->getOp(), E->getRParenLoc()); 14264 } 14265 14266 //===----------------------------------------------------------------------===// 14267 // Type reconstruction 14268 //===----------------------------------------------------------------------===// 14269 14270 template<typename Derived> 14271 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14272 SourceLocation Star) { 14273 return SemaRef.BuildPointerType(PointeeType, Star, 14274 getDerived().getBaseEntity()); 14275 } 14276 14277 template<typename Derived> 14278 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14279 SourceLocation Star) { 14280 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14281 getDerived().getBaseEntity()); 14282 } 14283 14284 template<typename Derived> 14285 QualType 14286 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14287 bool WrittenAsLValue, 14288 SourceLocation Sigil) { 14289 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14290 Sigil, getDerived().getBaseEntity()); 14291 } 14292 14293 template<typename Derived> 14294 QualType 14295 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14296 QualType ClassType, 14297 SourceLocation Sigil) { 14298 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14299 getDerived().getBaseEntity()); 14300 } 14301 14302 template<typename Derived> 14303 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14304 const ObjCTypeParamDecl *Decl, 14305 SourceLocation ProtocolLAngleLoc, 14306 ArrayRef<ObjCProtocolDecl *> Protocols, 14307 ArrayRef<SourceLocation> ProtocolLocs, 14308 SourceLocation ProtocolRAngleLoc) { 14309 return SemaRef.BuildObjCTypeParamType(Decl, 14310 ProtocolLAngleLoc, Protocols, 14311 ProtocolLocs, ProtocolRAngleLoc, 14312 /*FailOnError=*/true); 14313 } 14314 14315 template<typename Derived> 14316 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14317 QualType BaseType, 14318 SourceLocation Loc, 14319 SourceLocation TypeArgsLAngleLoc, 14320 ArrayRef<TypeSourceInfo *> TypeArgs, 14321 SourceLocation TypeArgsRAngleLoc, 14322 SourceLocation ProtocolLAngleLoc, 14323 ArrayRef<ObjCProtocolDecl *> Protocols, 14324 ArrayRef<SourceLocation> ProtocolLocs, 14325 SourceLocation ProtocolRAngleLoc) { 14326 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14327 TypeArgs, TypeArgsRAngleLoc, 14328 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14329 ProtocolRAngleLoc, 14330 /*FailOnError=*/true); 14331 } 14332 14333 template<typename Derived> 14334 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14335 QualType PointeeType, 14336 SourceLocation Star) { 14337 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14338 } 14339 14340 template<typename Derived> 14341 QualType 14342 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14343 ArrayType::ArraySizeModifier SizeMod, 14344 const llvm::APInt *Size, 14345 Expr *SizeExpr, 14346 unsigned IndexTypeQuals, 14347 SourceRange BracketsRange) { 14348 if (SizeExpr || !Size) 14349 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14350 IndexTypeQuals, BracketsRange, 14351 getDerived().getBaseEntity()); 14352 14353 QualType Types[] = { 14354 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14355 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14356 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14357 }; 14358 const unsigned NumTypes = llvm::array_lengthof(Types); 14359 QualType SizeType; 14360 for (unsigned I = 0; I != NumTypes; ++I) 14361 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14362 SizeType = Types[I]; 14363 break; 14364 } 14365 14366 // Note that we can return a VariableArrayType here in the case where 14367 // the element type was a dependent VariableArrayType. 14368 IntegerLiteral *ArraySize 14369 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14370 /*FIXME*/BracketsRange.getBegin()); 14371 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14372 IndexTypeQuals, BracketsRange, 14373 getDerived().getBaseEntity()); 14374 } 14375 14376 template<typename Derived> 14377 QualType 14378 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14379 ArrayType::ArraySizeModifier SizeMod, 14380 const llvm::APInt &Size, 14381 Expr *SizeExpr, 14382 unsigned IndexTypeQuals, 14383 SourceRange BracketsRange) { 14384 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14385 IndexTypeQuals, BracketsRange); 14386 } 14387 14388 template<typename Derived> 14389 QualType 14390 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14391 ArrayType::ArraySizeModifier SizeMod, 14392 unsigned IndexTypeQuals, 14393 SourceRange BracketsRange) { 14394 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14395 IndexTypeQuals, BracketsRange); 14396 } 14397 14398 template<typename Derived> 14399 QualType 14400 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14401 ArrayType::ArraySizeModifier SizeMod, 14402 Expr *SizeExpr, 14403 unsigned IndexTypeQuals, 14404 SourceRange BracketsRange) { 14405 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14406 SizeExpr, 14407 IndexTypeQuals, BracketsRange); 14408 } 14409 14410 template<typename Derived> 14411 QualType 14412 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14413 ArrayType::ArraySizeModifier SizeMod, 14414 Expr *SizeExpr, 14415 unsigned IndexTypeQuals, 14416 SourceRange BracketsRange) { 14417 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14418 SizeExpr, 14419 IndexTypeQuals, BracketsRange); 14420 } 14421 14422 template <typename Derived> 14423 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14424 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14425 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14426 AttributeLoc); 14427 } 14428 14429 template <typename Derived> 14430 QualType 14431 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14432 unsigned NumElements, 14433 VectorType::VectorKind VecKind) { 14434 // FIXME: semantic checking! 14435 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14436 } 14437 14438 template <typename Derived> 14439 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14440 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14441 VectorType::VectorKind VecKind) { 14442 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14443 } 14444 14445 template<typename Derived> 14446 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14447 unsigned NumElements, 14448 SourceLocation AttributeLoc) { 14449 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14450 NumElements, true); 14451 IntegerLiteral *VectorSize 14452 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14453 AttributeLoc); 14454 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14455 } 14456 14457 template<typename Derived> 14458 QualType 14459 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14460 Expr *SizeExpr, 14461 SourceLocation AttributeLoc) { 14462 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14463 } 14464 14465 template <typename Derived> 14466 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14467 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14468 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14469 NumColumns); 14470 } 14471 14472 template <typename Derived> 14473 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14474 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14475 SourceLocation AttributeLoc) { 14476 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14477 AttributeLoc); 14478 } 14479 14480 template<typename Derived> 14481 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14482 QualType T, 14483 MutableArrayRef<QualType> ParamTypes, 14484 const FunctionProtoType::ExtProtoInfo &EPI) { 14485 return SemaRef.BuildFunctionType(T, ParamTypes, 14486 getDerived().getBaseLocation(), 14487 getDerived().getBaseEntity(), 14488 EPI); 14489 } 14490 14491 template<typename Derived> 14492 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14493 return SemaRef.Context.getFunctionNoProtoType(T); 14494 } 14495 14496 template<typename Derived> 14497 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14498 Decl *D) { 14499 assert(D && "no decl found"); 14500 if (D->isInvalidDecl()) return QualType(); 14501 14502 // FIXME: Doesn't account for ObjCInterfaceDecl! 14503 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14504 // A valid resolved using typename pack expansion decl can have multiple 14505 // UsingDecls, but they must each have exactly one type, and it must be 14506 // the same type in every case. But we must have at least one expansion! 14507 if (UPD->expansions().empty()) { 14508 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14509 << UPD->isCXXClassMember() << UPD; 14510 return QualType(); 14511 } 14512 14513 // We might still have some unresolved types. Try to pick a resolved type 14514 // if we can. The final instantiation will check that the remaining 14515 // unresolved types instantiate to the type we pick. 14516 QualType FallbackT; 14517 QualType T; 14518 for (auto *E : UPD->expansions()) { 14519 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14520 if (ThisT.isNull()) 14521 continue; 14522 else if (ThisT->getAs<UnresolvedUsingType>()) 14523 FallbackT = ThisT; 14524 else if (T.isNull()) 14525 T = ThisT; 14526 else 14527 assert(getSema().Context.hasSameType(ThisT, T) && 14528 "mismatched resolved types in using pack expansion"); 14529 } 14530 return T.isNull() ? FallbackT : T; 14531 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14532 assert(Using->hasTypename() && 14533 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14534 14535 // A valid resolved using typename decl points to exactly one type decl. 14536 assert(++Using->shadow_begin() == Using->shadow_end()); 14537 14538 UsingShadowDecl *Shadow = *Using->shadow_begin(); 14539 if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc)) 14540 return QualType(); 14541 return SemaRef.Context.getUsingType( 14542 Shadow, SemaRef.Context.getTypeDeclType( 14543 cast<TypeDecl>(Shadow->getTargetDecl()))); 14544 } else { 14545 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14546 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14547 return SemaRef.Context.getTypeDeclType( 14548 cast<UnresolvedUsingTypenameDecl>(D)); 14549 } 14550 } 14551 14552 template <typename Derived> 14553 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14554 SourceLocation) { 14555 return SemaRef.BuildTypeofExprType(E); 14556 } 14557 14558 template<typename Derived> 14559 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14560 return SemaRef.Context.getTypeOfType(Underlying); 14561 } 14562 14563 template <typename Derived> 14564 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) { 14565 return SemaRef.BuildDecltypeType(E); 14566 } 14567 14568 template<typename Derived> 14569 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14570 UnaryTransformType::UTTKind UKind, 14571 SourceLocation Loc) { 14572 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14573 } 14574 14575 template<typename Derived> 14576 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14577 TemplateName Template, 14578 SourceLocation TemplateNameLoc, 14579 TemplateArgumentListInfo &TemplateArgs) { 14580 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14581 } 14582 14583 template<typename Derived> 14584 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14585 SourceLocation KWLoc) { 14586 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14587 } 14588 14589 template<typename Derived> 14590 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14591 SourceLocation KWLoc, 14592 bool isReadPipe) { 14593 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14594 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14595 } 14596 14597 template <typename Derived> 14598 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned, 14599 unsigned NumBits, 14600 SourceLocation Loc) { 14601 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14602 NumBits, true); 14603 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14604 SemaRef.Context.IntTy, Loc); 14605 return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc); 14606 } 14607 14608 template <typename Derived> 14609 QualType TreeTransform<Derived>::RebuildDependentBitIntType( 14610 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14611 return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc); 14612 } 14613 14614 template<typename Derived> 14615 TemplateName 14616 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14617 bool TemplateKW, 14618 TemplateDecl *Template) { 14619 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14620 Template); 14621 } 14622 14623 template<typename Derived> 14624 TemplateName 14625 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14626 SourceLocation TemplateKWLoc, 14627 const IdentifierInfo &Name, 14628 SourceLocation NameLoc, 14629 QualType ObjectType, 14630 NamedDecl *FirstQualifierInScope, 14631 bool AllowInjectedClassName) { 14632 UnqualifiedId TemplateName; 14633 TemplateName.setIdentifier(&Name, NameLoc); 14634 Sema::TemplateTy Template; 14635 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14636 TemplateName, ParsedType::make(ObjectType), 14637 /*EnteringContext=*/false, Template, 14638 AllowInjectedClassName); 14639 return Template.get(); 14640 } 14641 14642 template<typename Derived> 14643 TemplateName 14644 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14645 SourceLocation TemplateKWLoc, 14646 OverloadedOperatorKind Operator, 14647 SourceLocation NameLoc, 14648 QualType ObjectType, 14649 bool AllowInjectedClassName) { 14650 UnqualifiedId Name; 14651 // FIXME: Bogus location information. 14652 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14653 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14654 Sema::TemplateTy Template; 14655 getSema().ActOnTemplateName( 14656 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14657 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14658 return Template.get(); 14659 } 14660 14661 template<typename Derived> 14662 ExprResult 14663 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14664 SourceLocation OpLoc, 14665 Expr *OrigCallee, 14666 Expr *First, 14667 Expr *Second) { 14668 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14669 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14670 14671 if (First->getObjectKind() == OK_ObjCProperty) { 14672 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14673 if (BinaryOperator::isAssignmentOp(Opc)) 14674 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14675 First, Second); 14676 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14677 if (Result.isInvalid()) 14678 return ExprError(); 14679 First = Result.get(); 14680 } 14681 14682 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14683 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14684 if (Result.isInvalid()) 14685 return ExprError(); 14686 Second = Result.get(); 14687 } 14688 14689 // Determine whether this should be a builtin operation. 14690 if (Op == OO_Subscript) { 14691 if (!First->getType()->isOverloadableType() && 14692 !Second->getType()->isOverloadableType()) 14693 return getSema().CreateBuiltinArraySubscriptExpr( 14694 First, Callee->getBeginLoc(), Second, OpLoc); 14695 } else if (Op == OO_Arrow) { 14696 // -> is never a builtin operation. 14697 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14698 } else if (Second == nullptr || isPostIncDec) { 14699 if (!First->getType()->isOverloadableType() || 14700 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14701 // The argument is not of overloadable type, or this is an expression 14702 // of the form &Class::member, so try to create a built-in unary 14703 // operation. 14704 UnaryOperatorKind Opc 14705 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14706 14707 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14708 } 14709 } else { 14710 if (!First->getType()->isOverloadableType() && 14711 !Second->getType()->isOverloadableType()) { 14712 // Neither of the arguments is an overloadable type, so try to 14713 // create a built-in binary operation. 14714 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14715 ExprResult Result 14716 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14717 if (Result.isInvalid()) 14718 return ExprError(); 14719 14720 return Result; 14721 } 14722 } 14723 14724 // Compute the transformed set of functions (and function templates) to be 14725 // used during overload resolution. 14726 UnresolvedSet<16> Functions; 14727 bool RequiresADL; 14728 14729 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14730 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14731 // If the overload could not be resolved in the template definition 14732 // (because we had a dependent argument), ADL is performed as part of 14733 // template instantiation. 14734 RequiresADL = ULE->requiresADL(); 14735 } else { 14736 // If we've resolved this to a particular non-member function, just call 14737 // that function. If we resolved it to a member function, 14738 // CreateOverloaded* will find that function for us. 14739 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14740 if (!isa<CXXMethodDecl>(ND)) 14741 Functions.addDecl(ND); 14742 RequiresADL = false; 14743 } 14744 14745 // Add any functions found via argument-dependent lookup. 14746 Expr *Args[2] = { First, Second }; 14747 unsigned NumArgs = 1 + (Second != nullptr); 14748 14749 // Create the overloaded operator invocation for unary operators. 14750 if (NumArgs == 1 || isPostIncDec) { 14751 UnaryOperatorKind Opc 14752 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14753 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14754 RequiresADL); 14755 } 14756 14757 if (Op == OO_Subscript) { 14758 SourceLocation LBrace; 14759 SourceLocation RBrace; 14760 14761 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14762 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14763 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14764 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14765 } else { 14766 LBrace = Callee->getBeginLoc(); 14767 RBrace = OpLoc; 14768 } 14769 14770 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14771 First, Second); 14772 } 14773 14774 // Create the overloaded operator invocation for binary operators. 14775 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14776 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14777 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14778 if (Result.isInvalid()) 14779 return ExprError(); 14780 14781 return Result; 14782 } 14783 14784 template<typename Derived> 14785 ExprResult 14786 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14787 SourceLocation OperatorLoc, 14788 bool isArrow, 14789 CXXScopeSpec &SS, 14790 TypeSourceInfo *ScopeType, 14791 SourceLocation CCLoc, 14792 SourceLocation TildeLoc, 14793 PseudoDestructorTypeStorage Destroyed) { 14794 QualType BaseType = Base->getType(); 14795 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14796 (!isArrow && !BaseType->getAs<RecordType>()) || 14797 (isArrow && BaseType->getAs<PointerType>() && 14798 !BaseType->castAs<PointerType>()->getPointeeType() 14799 ->template getAs<RecordType>())){ 14800 // This pseudo-destructor expression is still a pseudo-destructor. 14801 return SemaRef.BuildPseudoDestructorExpr( 14802 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14803 CCLoc, TildeLoc, Destroyed); 14804 } 14805 14806 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14807 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14808 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14809 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14810 NameInfo.setNamedTypeInfo(DestroyedType); 14811 14812 // The scope type is now known to be a valid nested name specifier 14813 // component. Tack it on to the end of the nested name specifier. 14814 if (ScopeType) { 14815 if (!ScopeType->getType()->getAs<TagType>()) { 14816 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14817 diag::err_expected_class_or_namespace) 14818 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14819 return ExprError(); 14820 } 14821 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14822 CCLoc); 14823 } 14824 14825 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14826 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14827 OperatorLoc, isArrow, 14828 SS, TemplateKWLoc, 14829 /*FIXME: FirstQualifier*/ nullptr, 14830 NameInfo, 14831 /*TemplateArgs*/ nullptr, 14832 /*S*/nullptr); 14833 } 14834 14835 template<typename Derived> 14836 StmtResult 14837 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14838 SourceLocation Loc = S->getBeginLoc(); 14839 CapturedDecl *CD = S->getCapturedDecl(); 14840 unsigned NumParams = CD->getNumParams(); 14841 unsigned ContextParamPos = CD->getContextParamPosition(); 14842 SmallVector<Sema::CapturedParamNameType, 4> Params; 14843 for (unsigned I = 0; I < NumParams; ++I) { 14844 if (I != ContextParamPos) { 14845 Params.push_back( 14846 std::make_pair( 14847 CD->getParam(I)->getName(), 14848 getDerived().TransformType(CD->getParam(I)->getType()))); 14849 } else { 14850 Params.push_back(std::make_pair(StringRef(), QualType())); 14851 } 14852 } 14853 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14854 S->getCapturedRegionKind(), Params); 14855 StmtResult Body; 14856 { 14857 Sema::CompoundScopeRAII CompoundScope(getSema()); 14858 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14859 } 14860 14861 if (Body.isInvalid()) { 14862 getSema().ActOnCapturedRegionError(); 14863 return StmtError(); 14864 } 14865 14866 return getSema().ActOnCapturedRegionEnd(Body.get()); 14867 } 14868 14869 } // end namespace clang 14870 14871 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14872