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 'has_device_addr' 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 *RebuildOMPHasDeviceAddrClause(ArrayRef<Expr *> VarList, 2109 const OMPVarListLocTy &Locs) { 2110 return getSema().ActOnOpenMPHasDeviceAddrClause(VarList, Locs); 2111 } 2112 2113 /// Build a new OpenMP 'defaultmap' clause. 2114 /// 2115 /// By default, performs semantic analysis to build the new OpenMP clause. 2116 /// Subclasses may override this routine to provide different behavior. 2117 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2118 OpenMPDefaultmapClauseKind Kind, 2119 SourceLocation StartLoc, 2120 SourceLocation LParenLoc, 2121 SourceLocation MLoc, 2122 SourceLocation KindLoc, 2123 SourceLocation EndLoc) { 2124 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2125 MLoc, KindLoc, EndLoc); 2126 } 2127 2128 /// Build a new OpenMP 'nontemporal' clause. 2129 /// 2130 /// By default, performs semantic analysis to build the new OpenMP clause. 2131 /// Subclasses may override this routine to provide different behavior. 2132 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2133 SourceLocation StartLoc, 2134 SourceLocation LParenLoc, 2135 SourceLocation EndLoc) { 2136 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2137 EndLoc); 2138 } 2139 2140 /// Build a new OpenMP 'inclusive' clause. 2141 /// 2142 /// By default, performs semantic analysis to build the new OpenMP clause. 2143 /// Subclasses may override this routine to provide different behavior. 2144 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2145 SourceLocation StartLoc, 2146 SourceLocation LParenLoc, 2147 SourceLocation EndLoc) { 2148 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2149 EndLoc); 2150 } 2151 2152 /// Build a new OpenMP 'exclusive' clause. 2153 /// 2154 /// By default, performs semantic analysis to build the new OpenMP clause. 2155 /// Subclasses may override this routine to provide different behavior. 2156 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2157 SourceLocation StartLoc, 2158 SourceLocation LParenLoc, 2159 SourceLocation EndLoc) { 2160 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2161 EndLoc); 2162 } 2163 2164 /// Build a new OpenMP 'uses_allocators' clause. 2165 /// 2166 /// By default, performs semantic analysis to build the new OpenMP clause. 2167 /// Subclasses may override this routine to provide different behavior. 2168 OMPClause *RebuildOMPUsesAllocatorsClause( 2169 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2170 SourceLocation LParenLoc, SourceLocation EndLoc) { 2171 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2172 Data); 2173 } 2174 2175 /// Build a new OpenMP 'affinity' clause. 2176 /// 2177 /// By default, performs semantic analysis to build the new OpenMP clause. 2178 /// Subclasses may override this routine to provide different behavior. 2179 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2180 SourceLocation LParenLoc, 2181 SourceLocation ColonLoc, 2182 SourceLocation EndLoc, Expr *Modifier, 2183 ArrayRef<Expr *> Locators) { 2184 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2185 EndLoc, Modifier, Locators); 2186 } 2187 2188 /// Build a new OpenMP 'order' clause. 2189 /// 2190 /// By default, performs semantic analysis to build the new OpenMP clause. 2191 /// Subclasses may override this routine to provide different behavior. 2192 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2193 SourceLocation KindKwLoc, 2194 SourceLocation StartLoc, 2195 SourceLocation LParenLoc, 2196 SourceLocation EndLoc) { 2197 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2198 LParenLoc, EndLoc); 2199 } 2200 2201 /// Build a new OpenMP 'init' clause. 2202 /// 2203 /// By default, performs semantic analysis to build the new OpenMP clause. 2204 /// Subclasses may override this routine to provide different behavior. 2205 OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs, 2206 bool IsTarget, bool IsTargetSync, 2207 SourceLocation StartLoc, 2208 SourceLocation LParenLoc, 2209 SourceLocation VarLoc, 2210 SourceLocation EndLoc) { 2211 return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget, 2212 IsTargetSync, StartLoc, LParenLoc, 2213 VarLoc, EndLoc); 2214 } 2215 2216 /// Build a new OpenMP 'use' clause. 2217 /// 2218 /// By default, performs semantic analysis to build the new OpenMP clause. 2219 /// Subclasses may override this routine to provide different behavior. 2220 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2221 SourceLocation LParenLoc, 2222 SourceLocation VarLoc, SourceLocation EndLoc) { 2223 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2224 VarLoc, EndLoc); 2225 } 2226 2227 /// Build a new OpenMP 'destroy' clause. 2228 /// 2229 /// By default, performs semantic analysis to build the new OpenMP clause. 2230 /// Subclasses may override this routine to provide different behavior. 2231 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2232 SourceLocation LParenLoc, 2233 SourceLocation VarLoc, 2234 SourceLocation EndLoc) { 2235 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2236 VarLoc, EndLoc); 2237 } 2238 2239 /// Build a new OpenMP 'novariants' clause. 2240 /// 2241 /// By default, performs semantic analysis to build the new OpenMP clause. 2242 /// Subclasses may override this routine to provide different behavior. 2243 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2244 SourceLocation StartLoc, 2245 SourceLocation LParenLoc, 2246 SourceLocation EndLoc) { 2247 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2248 EndLoc); 2249 } 2250 2251 /// Build a new OpenMP 'nocontext' clause. 2252 /// 2253 /// By default, performs semantic analysis to build the new OpenMP clause. 2254 /// Subclasses may override this routine to provide different behavior. 2255 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2256 SourceLocation LParenLoc, 2257 SourceLocation EndLoc) { 2258 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2259 EndLoc); 2260 } 2261 2262 /// Build a new OpenMP 'filter' clause. 2263 /// 2264 /// By default, performs semantic analysis to build the new OpenMP clause. 2265 /// Subclasses may override this routine to provide different behavior. 2266 OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2267 SourceLocation LParenLoc, 2268 SourceLocation EndLoc) { 2269 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2270 EndLoc); 2271 } 2272 2273 /// Build a new OpenMP 'bind' clause. 2274 /// 2275 /// By default, performs semantic analysis to build the new OpenMP clause. 2276 /// Subclasses may override this routine to provide different behavior. 2277 OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind, 2278 SourceLocation KindLoc, 2279 SourceLocation StartLoc, 2280 SourceLocation LParenLoc, 2281 SourceLocation EndLoc) { 2282 return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc, 2283 EndLoc); 2284 } 2285 2286 /// Build a new OpenMP 'align' clause. 2287 /// 2288 /// By default, performs semantic analysis to build the new OpenMP clause. 2289 /// Subclasses may override this routine to provide different behavior. 2290 OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc, 2291 SourceLocation LParenLoc, 2292 SourceLocation EndLoc) { 2293 return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc); 2294 } 2295 2296 /// Rebuild the operand to an 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 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2301 Expr *object) { 2302 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2303 } 2304 2305 /// Build a new Objective-C \@synchronized 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 RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2310 Expr *Object, Stmt *Body) { 2311 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2312 } 2313 2314 /// Build a new Objective-C \@autoreleasepool 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 RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2319 Stmt *Body) { 2320 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2321 } 2322 2323 /// Build a new Objective-C fast enumeration statement. 2324 /// 2325 /// By default, performs semantic analysis to build the new statement. 2326 /// Subclasses may override this routine to provide different behavior. 2327 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2328 Stmt *Element, 2329 Expr *Collection, 2330 SourceLocation RParenLoc, 2331 Stmt *Body) { 2332 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2333 Element, 2334 Collection, 2335 RParenLoc); 2336 if (ForEachStmt.isInvalid()) 2337 return StmtError(); 2338 2339 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2340 } 2341 2342 /// Build a new C++ exception declaration. 2343 /// 2344 /// By default, performs semantic analysis to build the new decaration. 2345 /// Subclasses may override this routine to provide different behavior. 2346 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2347 TypeSourceInfo *Declarator, 2348 SourceLocation StartLoc, 2349 SourceLocation IdLoc, 2350 IdentifierInfo *Id) { 2351 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2352 StartLoc, IdLoc, Id); 2353 if (Var) 2354 getSema().CurContext->addDecl(Var); 2355 return Var; 2356 } 2357 2358 /// Build a new C++ catch statement. 2359 /// 2360 /// By default, performs semantic analysis to build the new statement. 2361 /// Subclasses may override this routine to provide different behavior. 2362 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2363 VarDecl *ExceptionDecl, 2364 Stmt *Handler) { 2365 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2366 Handler)); 2367 } 2368 2369 /// Build a new C++ try 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 RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2374 ArrayRef<Stmt *> Handlers) { 2375 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2376 } 2377 2378 /// Build a new C++0x range-based for statement. 2379 /// 2380 /// By default, performs semantic analysis to build the new statement. 2381 /// Subclasses may override this routine to provide different behavior. 2382 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2383 SourceLocation CoawaitLoc, Stmt *Init, 2384 SourceLocation ColonLoc, Stmt *Range, 2385 Stmt *Begin, Stmt *End, Expr *Cond, 2386 Expr *Inc, Stmt *LoopVar, 2387 SourceLocation RParenLoc) { 2388 // If we've just learned that the range is actually an Objective-C 2389 // collection, treat this as an Objective-C fast enumeration loop. 2390 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2391 if (RangeStmt->isSingleDecl()) { 2392 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2393 if (RangeVar->isInvalidDecl()) 2394 return StmtError(); 2395 2396 Expr *RangeExpr = RangeVar->getInit(); 2397 if (!RangeExpr->isTypeDependent() && 2398 RangeExpr->getType()->isObjCObjectPointerType()) { 2399 // FIXME: Support init-statements in Objective-C++20 ranged for 2400 // statement. 2401 if (Init) { 2402 return SemaRef.Diag(Init->getBeginLoc(), 2403 diag::err_objc_for_range_init_stmt) 2404 << Init->getSourceRange(); 2405 } 2406 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2407 RangeExpr, RParenLoc); 2408 } 2409 } 2410 } 2411 } 2412 2413 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2414 Range, Begin, End, Cond, Inc, LoopVar, 2415 RParenLoc, Sema::BFRK_Rebuild); 2416 } 2417 2418 /// Build a new C++0x range-based for statement. 2419 /// 2420 /// By default, performs semantic analysis to build the new statement. 2421 /// Subclasses may override this routine to provide different behavior. 2422 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2423 bool IsIfExists, 2424 NestedNameSpecifierLoc QualifierLoc, 2425 DeclarationNameInfo NameInfo, 2426 Stmt *Nested) { 2427 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2428 QualifierLoc, NameInfo, Nested); 2429 } 2430 2431 /// Attach body to a C++0x range-based for statement. 2432 /// 2433 /// By default, performs semantic analysis to finish the new statement. 2434 /// Subclasses may override this routine to provide different behavior. 2435 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2436 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2437 } 2438 2439 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2440 Stmt *TryBlock, Stmt *Handler) { 2441 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2442 } 2443 2444 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2445 Stmt *Block) { 2446 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2447 } 2448 2449 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2450 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2451 } 2452 2453 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2454 SourceLocation LParen, 2455 SourceLocation RParen, 2456 TypeSourceInfo *TSI) { 2457 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI); 2458 } 2459 2460 /// Build a new predefined expression. 2461 /// 2462 /// By default, performs semantic analysis to build the new expression. 2463 /// Subclasses may override this routine to provide different behavior. 2464 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2465 PredefinedExpr::IdentKind IK) { 2466 return getSema().BuildPredefinedExpr(Loc, IK); 2467 } 2468 2469 /// Build a new expression that references a declaration. 2470 /// 2471 /// By default, performs semantic analysis to build the new expression. 2472 /// Subclasses may override this routine to provide different behavior. 2473 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2474 LookupResult &R, 2475 bool RequiresADL) { 2476 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2477 } 2478 2479 2480 /// Build a new expression that references a declaration. 2481 /// 2482 /// By default, performs semantic analysis to build the new expression. 2483 /// Subclasses may override this routine to provide different behavior. 2484 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2485 ValueDecl *VD, 2486 const DeclarationNameInfo &NameInfo, 2487 NamedDecl *Found, 2488 TemplateArgumentListInfo *TemplateArgs) { 2489 CXXScopeSpec SS; 2490 SS.Adopt(QualifierLoc); 2491 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2492 TemplateArgs); 2493 } 2494 2495 /// Build a new expression in parentheses. 2496 /// 2497 /// By default, performs semantic analysis to build the new expression. 2498 /// Subclasses may override this routine to provide different behavior. 2499 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2500 SourceLocation RParen) { 2501 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2502 } 2503 2504 /// Build a new pseudo-destructor expression. 2505 /// 2506 /// By default, performs semantic analysis to build the new expression. 2507 /// Subclasses may override this routine to provide different behavior. 2508 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2509 SourceLocation OperatorLoc, 2510 bool isArrow, 2511 CXXScopeSpec &SS, 2512 TypeSourceInfo *ScopeType, 2513 SourceLocation CCLoc, 2514 SourceLocation TildeLoc, 2515 PseudoDestructorTypeStorage Destroyed); 2516 2517 /// Build a new unary operator expression. 2518 /// 2519 /// By default, performs semantic analysis to build the new expression. 2520 /// Subclasses may override this routine to provide different behavior. 2521 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2522 UnaryOperatorKind Opc, 2523 Expr *SubExpr) { 2524 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2525 } 2526 2527 /// Build a new builtin offsetof expression. 2528 /// 2529 /// By default, performs semantic analysis to build the new expression. 2530 /// Subclasses may override this routine to provide different behavior. 2531 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2532 TypeSourceInfo *Type, 2533 ArrayRef<Sema::OffsetOfComponent> Components, 2534 SourceLocation RParenLoc) { 2535 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2536 RParenLoc); 2537 } 2538 2539 /// Build a new sizeof, alignof or vec_step expression with a 2540 /// type argument. 2541 /// 2542 /// By default, performs semantic analysis to build the new expression. 2543 /// Subclasses may override this routine to provide different behavior. 2544 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2545 SourceLocation OpLoc, 2546 UnaryExprOrTypeTrait ExprKind, 2547 SourceRange R) { 2548 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2549 } 2550 2551 /// Build a new sizeof, alignof or vec step expression with an 2552 /// expression argument. 2553 /// 2554 /// By default, performs semantic analysis to build the new expression. 2555 /// Subclasses may override this routine to provide different behavior. 2556 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2557 UnaryExprOrTypeTrait ExprKind, 2558 SourceRange R) { 2559 ExprResult Result 2560 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2561 if (Result.isInvalid()) 2562 return ExprError(); 2563 2564 return Result; 2565 } 2566 2567 /// Build a new array subscript expression. 2568 /// 2569 /// By default, performs semantic analysis to build the new expression. 2570 /// Subclasses may override this routine to provide different behavior. 2571 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2572 SourceLocation LBracketLoc, 2573 Expr *RHS, 2574 SourceLocation RBracketLoc) { 2575 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2576 LBracketLoc, RHS, 2577 RBracketLoc); 2578 } 2579 2580 /// Build a new matrix subscript expression. 2581 /// 2582 /// By default, performs semantic analysis to build the new expression. 2583 /// Subclasses may override this routine to provide different behavior. 2584 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2585 Expr *ColumnIdx, 2586 SourceLocation RBracketLoc) { 2587 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2588 RBracketLoc); 2589 } 2590 2591 /// Build a new array section expression. 2592 /// 2593 /// By default, performs semantic analysis to build the new expression. 2594 /// Subclasses may override this routine to provide different behavior. 2595 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2596 Expr *LowerBound, 2597 SourceLocation ColonLocFirst, 2598 SourceLocation ColonLocSecond, 2599 Expr *Length, Expr *Stride, 2600 SourceLocation RBracketLoc) { 2601 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2602 ColonLocFirst, ColonLocSecond, 2603 Length, Stride, RBracketLoc); 2604 } 2605 2606 /// Build a new array shaping expression. 2607 /// 2608 /// By default, performs semantic analysis to build the new expression. 2609 /// Subclasses may override this routine to provide different behavior. 2610 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2611 SourceLocation RParenLoc, 2612 ArrayRef<Expr *> Dims, 2613 ArrayRef<SourceRange> BracketsRanges) { 2614 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2615 BracketsRanges); 2616 } 2617 2618 /// Build a new iterator expression. 2619 /// 2620 /// By default, performs semantic analysis to build the new expression. 2621 /// Subclasses may override this routine to provide different behavior. 2622 ExprResult RebuildOMPIteratorExpr( 2623 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2624 ArrayRef<Sema::OMPIteratorData> Data) { 2625 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2626 LLoc, RLoc, Data); 2627 } 2628 2629 /// Build a new call expression. 2630 /// 2631 /// By default, performs semantic analysis to build the new expression. 2632 /// Subclasses may override this routine to provide different behavior. 2633 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2634 MultiExprArg Args, 2635 SourceLocation RParenLoc, 2636 Expr *ExecConfig = nullptr) { 2637 return getSema().ActOnCallExpr( 2638 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2639 } 2640 2641 ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc, 2642 MultiExprArg Args, 2643 SourceLocation RParenLoc) { 2644 return getSema().ActOnArraySubscriptExpr( 2645 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc); 2646 } 2647 2648 /// Build a new member access expression. 2649 /// 2650 /// By default, performs semantic analysis to build the new expression. 2651 /// Subclasses may override this routine to provide different behavior. 2652 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2653 bool isArrow, 2654 NestedNameSpecifierLoc QualifierLoc, 2655 SourceLocation TemplateKWLoc, 2656 const DeclarationNameInfo &MemberNameInfo, 2657 ValueDecl *Member, 2658 NamedDecl *FoundDecl, 2659 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2660 NamedDecl *FirstQualifierInScope) { 2661 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2662 isArrow); 2663 if (!Member->getDeclName()) { 2664 // We have a reference to an unnamed field. This is always the 2665 // base of an anonymous struct/union member access, i.e. the 2666 // field is always of record type. 2667 assert(Member->getType()->isRecordType() && 2668 "unnamed member not of record type?"); 2669 2670 BaseResult = 2671 getSema().PerformObjectMemberConversion(BaseResult.get(), 2672 QualifierLoc.getNestedNameSpecifier(), 2673 FoundDecl, Member); 2674 if (BaseResult.isInvalid()) 2675 return ExprError(); 2676 Base = BaseResult.get(); 2677 2678 CXXScopeSpec EmptySS; 2679 return getSema().BuildFieldReferenceExpr( 2680 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2681 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2682 } 2683 2684 CXXScopeSpec SS; 2685 SS.Adopt(QualifierLoc); 2686 2687 Base = BaseResult.get(); 2688 QualType BaseType = Base->getType(); 2689 2690 if (isArrow && !BaseType->isPointerType()) 2691 return ExprError(); 2692 2693 // FIXME: this involves duplicating earlier analysis in a lot of 2694 // cases; we should avoid this when possible. 2695 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2696 R.addDecl(FoundDecl); 2697 R.resolveKind(); 2698 2699 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2700 SS, TemplateKWLoc, 2701 FirstQualifierInScope, 2702 R, ExplicitTemplateArgs, 2703 /*S*/nullptr); 2704 } 2705 2706 /// Build a new binary operator expression. 2707 /// 2708 /// By default, performs semantic analysis to build the new expression. 2709 /// Subclasses may override this routine to provide different behavior. 2710 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2711 BinaryOperatorKind Opc, 2712 Expr *LHS, Expr *RHS) { 2713 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2714 } 2715 2716 /// Build a new rewritten operator expression. 2717 /// 2718 /// By default, performs semantic analysis to build the new expression. 2719 /// Subclasses may override this routine to provide different behavior. 2720 ExprResult RebuildCXXRewrittenBinaryOperator( 2721 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2722 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2723 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2724 RHS, /*RequiresADL*/false); 2725 } 2726 2727 /// Build a new conditional operator expression. 2728 /// 2729 /// By default, performs semantic analysis to build the new expression. 2730 /// Subclasses may override this routine to provide different behavior. 2731 ExprResult RebuildConditionalOperator(Expr *Cond, 2732 SourceLocation QuestionLoc, 2733 Expr *LHS, 2734 SourceLocation ColonLoc, 2735 Expr *RHS) { 2736 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2737 LHS, RHS); 2738 } 2739 2740 /// Build a new C-style cast expression. 2741 /// 2742 /// By default, performs semantic analysis to build the new expression. 2743 /// Subclasses may override this routine to provide different behavior. 2744 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2745 TypeSourceInfo *TInfo, 2746 SourceLocation RParenLoc, 2747 Expr *SubExpr) { 2748 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2749 SubExpr); 2750 } 2751 2752 /// Build a new compound literal expression. 2753 /// 2754 /// By default, performs semantic analysis to build the new expression. 2755 /// Subclasses may override this routine to provide different behavior. 2756 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2757 TypeSourceInfo *TInfo, 2758 SourceLocation RParenLoc, 2759 Expr *Init) { 2760 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2761 Init); 2762 } 2763 2764 /// Build a new extended vector element access expression. 2765 /// 2766 /// By default, performs semantic analysis to build the new expression. 2767 /// Subclasses may override this routine to provide different behavior. 2768 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2769 SourceLocation OpLoc, 2770 SourceLocation AccessorLoc, 2771 IdentifierInfo &Accessor) { 2772 2773 CXXScopeSpec SS; 2774 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2775 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2776 OpLoc, /*IsArrow*/ false, 2777 SS, SourceLocation(), 2778 /*FirstQualifierInScope*/ nullptr, 2779 NameInfo, 2780 /* TemplateArgs */ nullptr, 2781 /*S*/ nullptr); 2782 } 2783 2784 /// Build a new initializer list expression. 2785 /// 2786 /// By default, performs semantic analysis to build the new expression. 2787 /// Subclasses may override this routine to provide different behavior. 2788 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2789 MultiExprArg Inits, 2790 SourceLocation RBraceLoc) { 2791 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2792 } 2793 2794 /// Build a new designated initializer expression. 2795 /// 2796 /// By default, performs semantic analysis to build the new expression. 2797 /// Subclasses may override this routine to provide different behavior. 2798 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2799 MultiExprArg ArrayExprs, 2800 SourceLocation EqualOrColonLoc, 2801 bool GNUSyntax, 2802 Expr *Init) { 2803 ExprResult Result 2804 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2805 Init); 2806 if (Result.isInvalid()) 2807 return ExprError(); 2808 2809 return Result; 2810 } 2811 2812 /// Build a new value-initialized expression. 2813 /// 2814 /// By default, builds the implicit value initialization without performing 2815 /// any semantic analysis. Subclasses may override this routine to provide 2816 /// different behavior. 2817 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2818 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2819 } 2820 2821 /// Build a new \c va_arg expression. 2822 /// 2823 /// By default, performs semantic analysis to build the new expression. 2824 /// Subclasses may override this routine to provide different behavior. 2825 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2826 Expr *SubExpr, TypeSourceInfo *TInfo, 2827 SourceLocation RParenLoc) { 2828 return getSema().BuildVAArgExpr(BuiltinLoc, 2829 SubExpr, TInfo, 2830 RParenLoc); 2831 } 2832 2833 /// Build a new expression list in parentheses. 2834 /// 2835 /// By default, performs semantic analysis to build the new expression. 2836 /// Subclasses may override this routine to provide different behavior. 2837 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2838 MultiExprArg SubExprs, 2839 SourceLocation RParenLoc) { 2840 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2841 } 2842 2843 /// Build a new address-of-label expression. 2844 /// 2845 /// By default, performs semantic analysis, using the name of the label 2846 /// rather than attempting to map the label statement itself. 2847 /// Subclasses may override this routine to provide different behavior. 2848 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2849 SourceLocation LabelLoc, LabelDecl *Label) { 2850 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2851 } 2852 2853 /// Build a new GNU statement expression. 2854 /// 2855 /// By default, performs semantic analysis to build the new expression. 2856 /// Subclasses may override this routine to provide different behavior. 2857 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2858 SourceLocation RParenLoc, unsigned TemplateDepth) { 2859 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2860 TemplateDepth); 2861 } 2862 2863 /// Build a new __builtin_choose_expr expression. 2864 /// 2865 /// By default, performs semantic analysis to build the new expression. 2866 /// Subclasses may override this routine to provide different behavior. 2867 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2868 Expr *Cond, Expr *LHS, Expr *RHS, 2869 SourceLocation RParenLoc) { 2870 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2871 Cond, LHS, RHS, 2872 RParenLoc); 2873 } 2874 2875 /// Build a new generic selection expression. 2876 /// 2877 /// By default, performs semantic analysis to build the new expression. 2878 /// Subclasses may override this routine to provide different behavior. 2879 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2880 SourceLocation DefaultLoc, 2881 SourceLocation RParenLoc, 2882 Expr *ControllingExpr, 2883 ArrayRef<TypeSourceInfo *> Types, 2884 ArrayRef<Expr *> Exprs) { 2885 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2886 ControllingExpr, Types, Exprs); 2887 } 2888 2889 /// Build a new overloaded operator call expression. 2890 /// 2891 /// By default, performs semantic analysis to build the new expression. 2892 /// The semantic analysis provides the behavior of template instantiation, 2893 /// copying with transformations that turn what looks like an overloaded 2894 /// operator call into a use of a builtin operator, performing 2895 /// argument-dependent lookup, etc. Subclasses may override this routine to 2896 /// provide different behavior. 2897 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2898 SourceLocation OpLoc, 2899 Expr *Callee, 2900 Expr *First, 2901 Expr *Second); 2902 2903 /// Build a new C++ "named" cast expression, such as static_cast or 2904 /// reinterpret_cast. 2905 /// 2906 /// By default, this routine dispatches to one of the more-specific routines 2907 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2908 /// Subclasses may override this routine to provide different behavior. 2909 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2910 Stmt::StmtClass Class, 2911 SourceLocation LAngleLoc, 2912 TypeSourceInfo *TInfo, 2913 SourceLocation RAngleLoc, 2914 SourceLocation LParenLoc, 2915 Expr *SubExpr, 2916 SourceLocation RParenLoc) { 2917 switch (Class) { 2918 case Stmt::CXXStaticCastExprClass: 2919 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2920 RAngleLoc, LParenLoc, 2921 SubExpr, RParenLoc); 2922 2923 case Stmt::CXXDynamicCastExprClass: 2924 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2925 RAngleLoc, LParenLoc, 2926 SubExpr, RParenLoc); 2927 2928 case Stmt::CXXReinterpretCastExprClass: 2929 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2930 RAngleLoc, LParenLoc, 2931 SubExpr, 2932 RParenLoc); 2933 2934 case Stmt::CXXConstCastExprClass: 2935 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2936 RAngleLoc, LParenLoc, 2937 SubExpr, RParenLoc); 2938 2939 case Stmt::CXXAddrspaceCastExprClass: 2940 return getDerived().RebuildCXXAddrspaceCastExpr( 2941 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2942 2943 default: 2944 llvm_unreachable("Invalid C++ named cast"); 2945 } 2946 } 2947 2948 /// Build a new C++ static_cast expression. 2949 /// 2950 /// By default, performs semantic analysis to build the new expression. 2951 /// Subclasses may override this routine to provide different behavior. 2952 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2953 SourceLocation LAngleLoc, 2954 TypeSourceInfo *TInfo, 2955 SourceLocation RAngleLoc, 2956 SourceLocation LParenLoc, 2957 Expr *SubExpr, 2958 SourceLocation RParenLoc) { 2959 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2960 TInfo, SubExpr, 2961 SourceRange(LAngleLoc, RAngleLoc), 2962 SourceRange(LParenLoc, RParenLoc)); 2963 } 2964 2965 /// Build a new C++ dynamic_cast expression. 2966 /// 2967 /// By default, performs semantic analysis to build the new expression. 2968 /// Subclasses may override this routine to provide different behavior. 2969 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2970 SourceLocation LAngleLoc, 2971 TypeSourceInfo *TInfo, 2972 SourceLocation RAngleLoc, 2973 SourceLocation LParenLoc, 2974 Expr *SubExpr, 2975 SourceLocation RParenLoc) { 2976 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2977 TInfo, SubExpr, 2978 SourceRange(LAngleLoc, RAngleLoc), 2979 SourceRange(LParenLoc, RParenLoc)); 2980 } 2981 2982 /// Build a new C++ reinterpret_cast expression. 2983 /// 2984 /// By default, performs semantic analysis to build the new expression. 2985 /// Subclasses may override this routine to provide different behavior. 2986 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2987 SourceLocation LAngleLoc, 2988 TypeSourceInfo *TInfo, 2989 SourceLocation RAngleLoc, 2990 SourceLocation LParenLoc, 2991 Expr *SubExpr, 2992 SourceLocation RParenLoc) { 2993 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2994 TInfo, SubExpr, 2995 SourceRange(LAngleLoc, RAngleLoc), 2996 SourceRange(LParenLoc, RParenLoc)); 2997 } 2998 2999 /// Build a new C++ const_cast expression. 3000 /// 3001 /// By default, performs semantic analysis to build the new expression. 3002 /// Subclasses may override this routine to provide different behavior. 3003 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 3004 SourceLocation LAngleLoc, 3005 TypeSourceInfo *TInfo, 3006 SourceLocation RAngleLoc, 3007 SourceLocation LParenLoc, 3008 Expr *SubExpr, 3009 SourceLocation RParenLoc) { 3010 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 3011 TInfo, SubExpr, 3012 SourceRange(LAngleLoc, RAngleLoc), 3013 SourceRange(LParenLoc, RParenLoc)); 3014 } 3015 3016 ExprResult 3017 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 3018 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 3019 SourceLocation LParenLoc, Expr *SubExpr, 3020 SourceLocation RParenLoc) { 3021 return getSema().BuildCXXNamedCast( 3022 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 3023 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 3024 } 3025 3026 /// Build a new C++ functional-style cast expression. 3027 /// 3028 /// By default, performs semantic analysis to build the new expression. 3029 /// Subclasses may override this routine to provide different behavior. 3030 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 3031 SourceLocation LParenLoc, 3032 Expr *Sub, 3033 SourceLocation RParenLoc, 3034 bool ListInitialization) { 3035 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 3036 MultiExprArg(&Sub, 1), RParenLoc, 3037 ListInitialization); 3038 } 3039 3040 /// Build a new C++ __builtin_bit_cast expression. 3041 /// 3042 /// By default, performs semantic analysis to build the new expression. 3043 /// Subclasses may override this routine to provide different behavior. 3044 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 3045 TypeSourceInfo *TSI, Expr *Sub, 3046 SourceLocation RParenLoc) { 3047 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 3048 } 3049 3050 /// Build a new C++ typeid(type) expression. 3051 /// 3052 /// By default, performs semantic analysis to build the new expression. 3053 /// Subclasses may override this routine to provide different behavior. 3054 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3055 SourceLocation TypeidLoc, 3056 TypeSourceInfo *Operand, 3057 SourceLocation RParenLoc) { 3058 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3059 RParenLoc); 3060 } 3061 3062 3063 /// Build a new C++ typeid(expr) expression. 3064 /// 3065 /// By default, performs semantic analysis to build the new expression. 3066 /// Subclasses may override this routine to provide different behavior. 3067 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3068 SourceLocation TypeidLoc, 3069 Expr *Operand, 3070 SourceLocation RParenLoc) { 3071 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3072 RParenLoc); 3073 } 3074 3075 /// Build a new C++ __uuidof(type) expression. 3076 /// 3077 /// By default, performs semantic analysis to build the new expression. 3078 /// Subclasses may override this routine to provide different behavior. 3079 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3080 TypeSourceInfo *Operand, 3081 SourceLocation RParenLoc) { 3082 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3083 } 3084 3085 /// Build a new C++ __uuidof(expr) expression. 3086 /// 3087 /// By default, performs semantic analysis to build the new expression. 3088 /// Subclasses may override this routine to provide different behavior. 3089 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3090 Expr *Operand, SourceLocation RParenLoc) { 3091 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3092 } 3093 3094 /// Build a new C++ "this" expression. 3095 /// 3096 /// By default, builds a new "this" expression without performing any 3097 /// semantic analysis. Subclasses may override this routine to provide 3098 /// different behavior. 3099 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3100 QualType ThisType, 3101 bool isImplicit) { 3102 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3103 } 3104 3105 /// Build a new C++ throw expression. 3106 /// 3107 /// By default, performs semantic analysis to build the new expression. 3108 /// Subclasses may override this routine to provide different behavior. 3109 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3110 bool IsThrownVariableInScope) { 3111 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3112 } 3113 3114 /// Build a new C++ default-argument expression. 3115 /// 3116 /// By default, builds a new default-argument expression, which does not 3117 /// require any semantic analysis. Subclasses may override this routine to 3118 /// provide different behavior. 3119 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3120 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3121 getSema().CurContext); 3122 } 3123 3124 /// Build a new C++11 default-initialization expression. 3125 /// 3126 /// By default, builds a new default field initialization expression, which 3127 /// does not require any semantic analysis. Subclasses may override this 3128 /// routine to provide different behavior. 3129 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3130 FieldDecl *Field) { 3131 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3132 getSema().CurContext); 3133 } 3134 3135 /// Build a new C++ zero-initialization expression. 3136 /// 3137 /// By default, performs semantic analysis to build the new expression. 3138 /// Subclasses may override this routine to provide different behavior. 3139 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3140 SourceLocation LParenLoc, 3141 SourceLocation RParenLoc) { 3142 return getSema().BuildCXXTypeConstructExpr( 3143 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3144 } 3145 3146 /// Build a new C++ "new" expression. 3147 /// 3148 /// By default, performs semantic analysis to build the new expression. 3149 /// Subclasses may override this routine to provide different behavior. 3150 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3151 bool UseGlobal, 3152 SourceLocation PlacementLParen, 3153 MultiExprArg PlacementArgs, 3154 SourceLocation PlacementRParen, 3155 SourceRange TypeIdParens, 3156 QualType AllocatedType, 3157 TypeSourceInfo *AllocatedTypeInfo, 3158 Optional<Expr *> ArraySize, 3159 SourceRange DirectInitRange, 3160 Expr *Initializer) { 3161 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3162 PlacementLParen, 3163 PlacementArgs, 3164 PlacementRParen, 3165 TypeIdParens, 3166 AllocatedType, 3167 AllocatedTypeInfo, 3168 ArraySize, 3169 DirectInitRange, 3170 Initializer); 3171 } 3172 3173 /// Build a new C++ "delete" expression. 3174 /// 3175 /// By default, performs semantic analysis to build the new expression. 3176 /// Subclasses may override this routine to provide different behavior. 3177 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3178 bool IsGlobalDelete, 3179 bool IsArrayForm, 3180 Expr *Operand) { 3181 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3182 Operand); 3183 } 3184 3185 /// Build a new type trait expression. 3186 /// 3187 /// By default, performs semantic analysis to build the new expression. 3188 /// Subclasses may override this routine to provide different behavior. 3189 ExprResult RebuildTypeTrait(TypeTrait Trait, 3190 SourceLocation StartLoc, 3191 ArrayRef<TypeSourceInfo *> Args, 3192 SourceLocation RParenLoc) { 3193 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3194 } 3195 3196 /// Build a new array type trait expression. 3197 /// 3198 /// By default, performs semantic analysis to build the new expression. 3199 /// Subclasses may override this routine to provide different behavior. 3200 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3201 SourceLocation StartLoc, 3202 TypeSourceInfo *TSInfo, 3203 Expr *DimExpr, 3204 SourceLocation RParenLoc) { 3205 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3206 } 3207 3208 /// Build a new expression trait expression. 3209 /// 3210 /// By default, performs semantic analysis to build the new expression. 3211 /// Subclasses may override this routine to provide different behavior. 3212 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3213 SourceLocation StartLoc, 3214 Expr *Queried, 3215 SourceLocation RParenLoc) { 3216 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3217 } 3218 3219 /// Build a new (previously unresolved) declaration reference 3220 /// expression. 3221 /// 3222 /// By default, performs semantic analysis to build the new expression. 3223 /// Subclasses may override this routine to provide different behavior. 3224 ExprResult RebuildDependentScopeDeclRefExpr( 3225 NestedNameSpecifierLoc QualifierLoc, 3226 SourceLocation TemplateKWLoc, 3227 const DeclarationNameInfo &NameInfo, 3228 const TemplateArgumentListInfo *TemplateArgs, 3229 bool IsAddressOfOperand, 3230 TypeSourceInfo **RecoveryTSI) { 3231 CXXScopeSpec SS; 3232 SS.Adopt(QualifierLoc); 3233 3234 if (TemplateArgs || TemplateKWLoc.isValid()) 3235 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3236 TemplateArgs); 3237 3238 return getSema().BuildQualifiedDeclarationNameExpr( 3239 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3240 } 3241 3242 /// Build a new template-id expression. 3243 /// 3244 /// By default, performs semantic analysis to build the new expression. 3245 /// Subclasses may override this routine to provide different behavior. 3246 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3247 SourceLocation TemplateKWLoc, 3248 LookupResult &R, 3249 bool RequiresADL, 3250 const TemplateArgumentListInfo *TemplateArgs) { 3251 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3252 TemplateArgs); 3253 } 3254 3255 /// Build a new object-construction expression. 3256 /// 3257 /// By default, performs semantic analysis to build the new expression. 3258 /// Subclasses may override this routine to provide different behavior. 3259 ExprResult RebuildCXXConstructExpr(QualType T, 3260 SourceLocation Loc, 3261 CXXConstructorDecl *Constructor, 3262 bool IsElidable, 3263 MultiExprArg Args, 3264 bool HadMultipleCandidates, 3265 bool ListInitialization, 3266 bool StdInitListInitialization, 3267 bool RequiresZeroInit, 3268 CXXConstructExpr::ConstructionKind ConstructKind, 3269 SourceRange ParenRange) { 3270 // Reconstruct the constructor we originally found, which might be 3271 // different if this is a call to an inherited constructor. 3272 CXXConstructorDecl *FoundCtor = Constructor; 3273 if (Constructor->isInheritingConstructor()) 3274 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3275 3276 SmallVector<Expr *, 8> ConvertedArgs; 3277 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3278 ConvertedArgs)) 3279 return ExprError(); 3280 3281 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3282 IsElidable, 3283 ConvertedArgs, 3284 HadMultipleCandidates, 3285 ListInitialization, 3286 StdInitListInitialization, 3287 RequiresZeroInit, ConstructKind, 3288 ParenRange); 3289 } 3290 3291 /// Build a new implicit construction via inherited constructor 3292 /// expression. 3293 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3294 CXXConstructorDecl *Constructor, 3295 bool ConstructsVBase, 3296 bool InheritedFromVBase) { 3297 return new (getSema().Context) CXXInheritedCtorInitExpr( 3298 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3299 } 3300 3301 /// Build a new object-construction expression. 3302 /// 3303 /// By default, performs semantic analysis to build the new expression. 3304 /// Subclasses may override this routine to provide different behavior. 3305 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3306 SourceLocation LParenOrBraceLoc, 3307 MultiExprArg Args, 3308 SourceLocation RParenOrBraceLoc, 3309 bool ListInitialization) { 3310 return getSema().BuildCXXTypeConstructExpr( 3311 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3312 } 3313 3314 /// Build a new object-construction expression. 3315 /// 3316 /// By default, performs semantic analysis to build the new expression. 3317 /// Subclasses may override this routine to provide different behavior. 3318 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3319 SourceLocation LParenLoc, 3320 MultiExprArg Args, 3321 SourceLocation RParenLoc, 3322 bool ListInitialization) { 3323 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3324 RParenLoc, ListInitialization); 3325 } 3326 3327 /// Build a new member reference expression. 3328 /// 3329 /// By default, performs semantic analysis to build the new expression. 3330 /// Subclasses may override this routine to provide different behavior. 3331 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3332 QualType BaseType, 3333 bool IsArrow, 3334 SourceLocation OperatorLoc, 3335 NestedNameSpecifierLoc QualifierLoc, 3336 SourceLocation TemplateKWLoc, 3337 NamedDecl *FirstQualifierInScope, 3338 const DeclarationNameInfo &MemberNameInfo, 3339 const TemplateArgumentListInfo *TemplateArgs) { 3340 CXXScopeSpec SS; 3341 SS.Adopt(QualifierLoc); 3342 3343 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3344 OperatorLoc, IsArrow, 3345 SS, TemplateKWLoc, 3346 FirstQualifierInScope, 3347 MemberNameInfo, 3348 TemplateArgs, /*S*/nullptr); 3349 } 3350 3351 /// Build a new member reference expression. 3352 /// 3353 /// By default, performs semantic analysis to build the new expression. 3354 /// Subclasses may override this routine to provide different behavior. 3355 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3356 SourceLocation OperatorLoc, 3357 bool IsArrow, 3358 NestedNameSpecifierLoc QualifierLoc, 3359 SourceLocation TemplateKWLoc, 3360 NamedDecl *FirstQualifierInScope, 3361 LookupResult &R, 3362 const TemplateArgumentListInfo *TemplateArgs) { 3363 CXXScopeSpec SS; 3364 SS.Adopt(QualifierLoc); 3365 3366 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3367 OperatorLoc, IsArrow, 3368 SS, TemplateKWLoc, 3369 FirstQualifierInScope, 3370 R, TemplateArgs, /*S*/nullptr); 3371 } 3372 3373 /// Build a new noexcept expression. 3374 /// 3375 /// By default, performs semantic analysis to build the new expression. 3376 /// Subclasses may override this routine to provide different behavior. 3377 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3378 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3379 } 3380 3381 /// Build a new expression to compute the length of a parameter pack. 3382 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3383 NamedDecl *Pack, 3384 SourceLocation PackLoc, 3385 SourceLocation RParenLoc, 3386 Optional<unsigned> Length, 3387 ArrayRef<TemplateArgument> PartialArgs) { 3388 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3389 RParenLoc, Length, PartialArgs); 3390 } 3391 3392 /// Build a new expression representing a call to a source location 3393 /// builtin. 3394 /// 3395 /// By default, performs semantic analysis to build the new expression. 3396 /// Subclasses may override this routine to provide different behavior. 3397 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3398 QualType ResultTy, SourceLocation BuiltinLoc, 3399 SourceLocation RPLoc, 3400 DeclContext *ParentContext) { 3401 return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc, 3402 ParentContext); 3403 } 3404 3405 /// Build a new Objective-C boxed expression. 3406 /// 3407 /// By default, performs semantic analysis to build the new expression. 3408 /// Subclasses may override this routine to provide different behavior. 3409 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3410 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3411 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3412 TemplateArgumentListInfo *TALI) { 3413 CXXScopeSpec SS; 3414 SS.Adopt(NNS); 3415 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3416 ConceptNameInfo, 3417 FoundDecl, 3418 NamedConcept, TALI); 3419 if (Result.isInvalid()) 3420 return ExprError(); 3421 return Result; 3422 } 3423 3424 /// \brief Build a new requires expression. 3425 /// 3426 /// By default, performs semantic analysis to build the new expression. 3427 /// Subclasses may override this routine to provide different behavior. 3428 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3429 RequiresExprBodyDecl *Body, 3430 ArrayRef<ParmVarDecl *> LocalParameters, 3431 ArrayRef<concepts::Requirement *> Requirements, 3432 SourceLocation ClosingBraceLoc) { 3433 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3434 LocalParameters, Requirements, ClosingBraceLoc); 3435 } 3436 3437 concepts::TypeRequirement * 3438 RebuildTypeRequirement( 3439 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3440 return SemaRef.BuildTypeRequirement(SubstDiag); 3441 } 3442 3443 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3444 return SemaRef.BuildTypeRequirement(T); 3445 } 3446 3447 concepts::ExprRequirement * 3448 RebuildExprRequirement( 3449 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3450 SourceLocation NoexceptLoc, 3451 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3452 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3453 std::move(Ret)); 3454 } 3455 3456 concepts::ExprRequirement * 3457 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3458 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3459 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3460 std::move(Ret)); 3461 } 3462 3463 concepts::NestedRequirement * 3464 RebuildNestedRequirement( 3465 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3466 return SemaRef.BuildNestedRequirement(SubstDiag); 3467 } 3468 3469 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3470 return SemaRef.BuildNestedRequirement(Constraint); 3471 } 3472 3473 /// \brief Build a new Objective-C boxed expression. 3474 /// 3475 /// By default, performs semantic analysis to build the new expression. 3476 /// Subclasses may override this routine to provide different behavior. 3477 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3478 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3479 } 3480 3481 /// Build a new Objective-C array literal. 3482 /// 3483 /// By default, performs semantic analysis to build the new expression. 3484 /// Subclasses may override this routine to provide different behavior. 3485 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3486 Expr **Elements, unsigned NumElements) { 3487 return getSema().BuildObjCArrayLiteral(Range, 3488 MultiExprArg(Elements, NumElements)); 3489 } 3490 3491 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3492 Expr *Base, Expr *Key, 3493 ObjCMethodDecl *getterMethod, 3494 ObjCMethodDecl *setterMethod) { 3495 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3496 getterMethod, setterMethod); 3497 } 3498 3499 /// Build a new Objective-C dictionary literal. 3500 /// 3501 /// By default, performs semantic analysis to build the new expression. 3502 /// Subclasses may override this routine to provide different behavior. 3503 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3504 MutableArrayRef<ObjCDictionaryElement> Elements) { 3505 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3506 } 3507 3508 /// Build a new Objective-C \@encode expression. 3509 /// 3510 /// By default, performs semantic analysis to build the new expression. 3511 /// Subclasses may override this routine to provide different behavior. 3512 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3513 TypeSourceInfo *EncodeTypeInfo, 3514 SourceLocation RParenLoc) { 3515 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3516 } 3517 3518 /// Build a new Objective-C class message. 3519 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3520 Selector Sel, 3521 ArrayRef<SourceLocation> SelectorLocs, 3522 ObjCMethodDecl *Method, 3523 SourceLocation LBracLoc, 3524 MultiExprArg Args, 3525 SourceLocation RBracLoc) { 3526 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3527 ReceiverTypeInfo->getType(), 3528 /*SuperLoc=*/SourceLocation(), 3529 Sel, Method, LBracLoc, SelectorLocs, 3530 RBracLoc, Args); 3531 } 3532 3533 /// Build a new Objective-C instance message. 3534 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3535 Selector Sel, 3536 ArrayRef<SourceLocation> SelectorLocs, 3537 ObjCMethodDecl *Method, 3538 SourceLocation LBracLoc, 3539 MultiExprArg Args, 3540 SourceLocation RBracLoc) { 3541 return SemaRef.BuildInstanceMessage(Receiver, 3542 Receiver->getType(), 3543 /*SuperLoc=*/SourceLocation(), 3544 Sel, Method, LBracLoc, SelectorLocs, 3545 RBracLoc, Args); 3546 } 3547 3548 /// Build a new Objective-C instance/class message to 'super'. 3549 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3550 Selector Sel, 3551 ArrayRef<SourceLocation> SelectorLocs, 3552 QualType SuperType, 3553 ObjCMethodDecl *Method, 3554 SourceLocation LBracLoc, 3555 MultiExprArg Args, 3556 SourceLocation RBracLoc) { 3557 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3558 SuperType, 3559 SuperLoc, 3560 Sel, Method, LBracLoc, SelectorLocs, 3561 RBracLoc, Args) 3562 : SemaRef.BuildClassMessage(nullptr, 3563 SuperType, 3564 SuperLoc, 3565 Sel, Method, LBracLoc, SelectorLocs, 3566 RBracLoc, Args); 3567 3568 3569 } 3570 3571 /// Build a new Objective-C ivar reference expression. 3572 /// 3573 /// By default, performs semantic analysis to build the new expression. 3574 /// Subclasses may override this routine to provide different behavior. 3575 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3576 SourceLocation IvarLoc, 3577 bool IsArrow, bool IsFreeIvar) { 3578 CXXScopeSpec SS; 3579 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3580 ExprResult Result = getSema().BuildMemberReferenceExpr( 3581 BaseArg, BaseArg->getType(), 3582 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3583 /*FirstQualifierInScope=*/nullptr, NameInfo, 3584 /*TemplateArgs=*/nullptr, 3585 /*S=*/nullptr); 3586 if (IsFreeIvar && Result.isUsable()) 3587 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3588 return Result; 3589 } 3590 3591 /// Build a new Objective-C property reference expression. 3592 /// 3593 /// By default, performs semantic analysis to build the new expression. 3594 /// Subclasses may override this routine to provide different behavior. 3595 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3596 ObjCPropertyDecl *Property, 3597 SourceLocation PropertyLoc) { 3598 CXXScopeSpec SS; 3599 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3600 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3601 /*FIXME:*/PropertyLoc, 3602 /*IsArrow=*/false, 3603 SS, SourceLocation(), 3604 /*FirstQualifierInScope=*/nullptr, 3605 NameInfo, 3606 /*TemplateArgs=*/nullptr, 3607 /*S=*/nullptr); 3608 } 3609 3610 /// Build a new Objective-C property reference expression. 3611 /// 3612 /// By default, performs semantic analysis to build the new expression. 3613 /// Subclasses may override this routine to provide different behavior. 3614 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3615 ObjCMethodDecl *Getter, 3616 ObjCMethodDecl *Setter, 3617 SourceLocation PropertyLoc) { 3618 // Since these expressions can only be value-dependent, we do not 3619 // need to perform semantic analysis again. 3620 return Owned( 3621 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3622 VK_LValue, OK_ObjCProperty, 3623 PropertyLoc, Base)); 3624 } 3625 3626 /// Build a new Objective-C "isa" 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 RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3631 SourceLocation OpLoc, bool IsArrow) { 3632 CXXScopeSpec SS; 3633 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3634 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3635 OpLoc, IsArrow, 3636 SS, SourceLocation(), 3637 /*FirstQualifierInScope=*/nullptr, 3638 NameInfo, 3639 /*TemplateArgs=*/nullptr, 3640 /*S=*/nullptr); 3641 } 3642 3643 /// Build a new shuffle vector expression. 3644 /// 3645 /// By default, performs semantic analysis to build the new expression. 3646 /// Subclasses may override this routine to provide different behavior. 3647 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3648 MultiExprArg SubExprs, 3649 SourceLocation RParenLoc) { 3650 // Find the declaration for __builtin_shufflevector 3651 const IdentifierInfo &Name 3652 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3653 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3654 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3655 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3656 3657 // Build a reference to the __builtin_shufflevector builtin 3658 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3659 Expr *Callee = new (SemaRef.Context) 3660 DeclRefExpr(SemaRef.Context, Builtin, false, 3661 SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc); 3662 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3663 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3664 CK_BuiltinFnToFnPtr).get(); 3665 3666 // Build the CallExpr 3667 ExprResult TheCall = CallExpr::Create( 3668 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3669 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3670 FPOptionsOverride()); 3671 3672 // Type-check the __builtin_shufflevector expression. 3673 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3674 } 3675 3676 /// Build a new convert vector expression. 3677 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3678 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3679 SourceLocation RParenLoc) { 3680 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3681 BuiltinLoc, RParenLoc); 3682 } 3683 3684 /// Build a new template argument pack expansion. 3685 /// 3686 /// By default, performs semantic analysis to build a new pack expansion 3687 /// for a template argument. Subclasses may override this routine to provide 3688 /// different behavior. 3689 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3690 SourceLocation EllipsisLoc, 3691 Optional<unsigned> NumExpansions) { 3692 switch (Pattern.getArgument().getKind()) { 3693 case TemplateArgument::Expression: { 3694 ExprResult Result 3695 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3696 EllipsisLoc, NumExpansions); 3697 if (Result.isInvalid()) 3698 return TemplateArgumentLoc(); 3699 3700 return TemplateArgumentLoc(Result.get(), Result.get()); 3701 } 3702 3703 case TemplateArgument::Template: 3704 return TemplateArgumentLoc( 3705 SemaRef.Context, 3706 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3707 NumExpansions), 3708 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3709 EllipsisLoc); 3710 3711 case TemplateArgument::Null: 3712 case TemplateArgument::Integral: 3713 case TemplateArgument::Declaration: 3714 case TemplateArgument::Pack: 3715 case TemplateArgument::TemplateExpansion: 3716 case TemplateArgument::NullPtr: 3717 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3718 3719 case TemplateArgument::Type: 3720 if (TypeSourceInfo *Expansion 3721 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3722 EllipsisLoc, 3723 NumExpansions)) 3724 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3725 Expansion); 3726 break; 3727 } 3728 3729 return TemplateArgumentLoc(); 3730 } 3731 3732 /// Build a new expression pack expansion. 3733 /// 3734 /// By default, performs semantic analysis to build a new pack expansion 3735 /// for an expression. Subclasses may override this routine to provide 3736 /// different behavior. 3737 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3738 Optional<unsigned> NumExpansions) { 3739 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3740 } 3741 3742 /// Build a new C++1z fold-expression. 3743 /// 3744 /// By default, performs semantic analysis in order to build a new fold 3745 /// expression. 3746 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3747 SourceLocation LParenLoc, Expr *LHS, 3748 BinaryOperatorKind Operator, 3749 SourceLocation EllipsisLoc, Expr *RHS, 3750 SourceLocation RParenLoc, 3751 Optional<unsigned> NumExpansions) { 3752 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3753 EllipsisLoc, RHS, RParenLoc, 3754 NumExpansions); 3755 } 3756 3757 /// Build an empty C++1z fold-expression with the given operator. 3758 /// 3759 /// By default, produces the fallback value for the fold-expression, or 3760 /// produce an error if there is no fallback value. 3761 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3762 BinaryOperatorKind Operator) { 3763 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3764 } 3765 3766 /// Build a new atomic operation expression. 3767 /// 3768 /// By default, performs semantic analysis to build the new expression. 3769 /// Subclasses may override this routine to provide different behavior. 3770 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3771 AtomicExpr::AtomicOp Op, 3772 SourceLocation RParenLoc) { 3773 // Use this for all of the locations, since we don't know the difference 3774 // between the call and the expr at this point. 3775 SourceRange Range{BuiltinLoc, RParenLoc}; 3776 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3777 Sema::AtomicArgumentOrder::AST); 3778 } 3779 3780 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3781 ArrayRef<Expr *> SubExprs, QualType Type) { 3782 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3783 } 3784 3785 private: 3786 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3787 QualType ObjectType, 3788 NamedDecl *FirstQualifierInScope, 3789 CXXScopeSpec &SS); 3790 3791 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3792 QualType ObjectType, 3793 NamedDecl *FirstQualifierInScope, 3794 CXXScopeSpec &SS); 3795 3796 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3797 NamedDecl *FirstQualifierInScope, 3798 CXXScopeSpec &SS); 3799 3800 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3801 DependentNameTypeLoc TL, 3802 bool DeducibleTSTContext); 3803 }; 3804 3805 template <typename Derived> 3806 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3807 if (!S) 3808 return S; 3809 3810 switch (S->getStmtClass()) { 3811 case Stmt::NoStmtClass: break; 3812 3813 // Transform individual statement nodes 3814 // Pass SDK into statements that can produce a value 3815 #define STMT(Node, Parent) \ 3816 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3817 #define VALUESTMT(Node, Parent) \ 3818 case Stmt::Node##Class: \ 3819 return getDerived().Transform##Node(cast<Node>(S), SDK); 3820 #define ABSTRACT_STMT(Node) 3821 #define EXPR(Node, Parent) 3822 #include "clang/AST/StmtNodes.inc" 3823 3824 // Transform expressions by calling TransformExpr. 3825 #define STMT(Node, Parent) 3826 #define ABSTRACT_STMT(Stmt) 3827 #define EXPR(Node, Parent) case Stmt::Node##Class: 3828 #include "clang/AST/StmtNodes.inc" 3829 { 3830 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3831 3832 if (SDK == SDK_StmtExprResult) 3833 E = getSema().ActOnStmtExprResult(E); 3834 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3835 } 3836 } 3837 3838 return S; 3839 } 3840 3841 template<typename Derived> 3842 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3843 if (!S) 3844 return S; 3845 3846 switch (S->getClauseKind()) { 3847 default: break; 3848 // Transform individual clause nodes 3849 #define GEN_CLANG_CLAUSE_CLASS 3850 #define CLAUSE_CLASS(Enum, Str, Class) \ 3851 case Enum: \ 3852 return getDerived().Transform##Class(cast<Class>(S)); 3853 #include "llvm/Frontend/OpenMP/OMP.inc" 3854 } 3855 3856 return S; 3857 } 3858 3859 3860 template<typename Derived> 3861 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3862 if (!E) 3863 return E; 3864 3865 switch (E->getStmtClass()) { 3866 case Stmt::NoStmtClass: break; 3867 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3868 #define ABSTRACT_STMT(Stmt) 3869 #define EXPR(Node, Parent) \ 3870 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3871 #include "clang/AST/StmtNodes.inc" 3872 } 3873 3874 return E; 3875 } 3876 3877 template<typename Derived> 3878 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3879 bool NotCopyInit) { 3880 // Initializers are instantiated like expressions, except that various outer 3881 // layers are stripped. 3882 if (!Init) 3883 return Init; 3884 3885 if (auto *FE = dyn_cast<FullExpr>(Init)) 3886 Init = FE->getSubExpr(); 3887 3888 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) { 3889 OpaqueValueExpr *OVE = AIL->getCommonExpr(); 3890 Init = OVE->getSourceExpr(); 3891 } 3892 3893 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3894 Init = MTE->getSubExpr(); 3895 3896 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3897 Init = Binder->getSubExpr(); 3898 3899 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3900 Init = ICE->getSubExprAsWritten(); 3901 3902 if (CXXStdInitializerListExpr *ILE = 3903 dyn_cast<CXXStdInitializerListExpr>(Init)) 3904 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3905 3906 // If this is copy-initialization, we only need to reconstruct 3907 // InitListExprs. Other forms of copy-initialization will be a no-op if 3908 // the initializer is already the right type. 3909 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3910 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3911 return getDerived().TransformExpr(Init); 3912 3913 // Revert value-initialization back to empty parens. 3914 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3915 SourceRange Parens = VIE->getSourceRange(); 3916 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3917 Parens.getEnd()); 3918 } 3919 3920 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3921 if (isa<ImplicitValueInitExpr>(Init)) 3922 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3923 SourceLocation()); 3924 3925 // Revert initialization by constructor back to a parenthesized or braced list 3926 // of expressions. Any other form of initializer can just be reused directly. 3927 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3928 return getDerived().TransformExpr(Init); 3929 3930 // If the initialization implicitly converted an initializer list to a 3931 // std::initializer_list object, unwrap the std::initializer_list too. 3932 if (Construct && Construct->isStdInitListInitialization()) 3933 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3934 3935 // Enter a list-init context if this was list initialization. 3936 EnterExpressionEvaluationContext Context( 3937 getSema(), EnterExpressionEvaluationContext::InitList, 3938 Construct->isListInitialization()); 3939 3940 SmallVector<Expr*, 8> NewArgs; 3941 bool ArgChanged = false; 3942 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3943 /*IsCall*/true, NewArgs, &ArgChanged)) 3944 return ExprError(); 3945 3946 // If this was list initialization, revert to syntactic list form. 3947 if (Construct->isListInitialization()) 3948 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3949 Construct->getEndLoc()); 3950 3951 // Build a ParenListExpr to represent anything else. 3952 SourceRange Parens = Construct->getParenOrBraceRange(); 3953 if (Parens.isInvalid()) { 3954 // This was a variable declaration's initialization for which no initializer 3955 // was specified. 3956 assert(NewArgs.empty() && 3957 "no parens or braces but have direct init with arguments?"); 3958 return ExprEmpty(); 3959 } 3960 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3961 Parens.getEnd()); 3962 } 3963 3964 template<typename Derived> 3965 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3966 unsigned NumInputs, 3967 bool IsCall, 3968 SmallVectorImpl<Expr *> &Outputs, 3969 bool *ArgChanged) { 3970 for (unsigned I = 0; I != NumInputs; ++I) { 3971 // If requested, drop call arguments that need to be dropped. 3972 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3973 if (ArgChanged) 3974 *ArgChanged = true; 3975 3976 break; 3977 } 3978 3979 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3980 Expr *Pattern = Expansion->getPattern(); 3981 3982 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3983 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3984 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3985 3986 // Determine whether the set of unexpanded parameter packs can and should 3987 // be expanded. 3988 bool Expand = true; 3989 bool RetainExpansion = false; 3990 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3991 Optional<unsigned> NumExpansions = OrigNumExpansions; 3992 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3993 Pattern->getSourceRange(), 3994 Unexpanded, 3995 Expand, RetainExpansion, 3996 NumExpansions)) 3997 return true; 3998 3999 if (!Expand) { 4000 // The transform has determined that we should perform a simple 4001 // transformation on the pack expansion, producing another pack 4002 // expansion. 4003 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4004 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 4005 if (OutPattern.isInvalid()) 4006 return true; 4007 4008 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 4009 Expansion->getEllipsisLoc(), 4010 NumExpansions); 4011 if (Out.isInvalid()) 4012 return true; 4013 4014 if (ArgChanged) 4015 *ArgChanged = true; 4016 Outputs.push_back(Out.get()); 4017 continue; 4018 } 4019 4020 // Record right away that the argument was changed. This needs 4021 // to happen even if the array expands to nothing. 4022 if (ArgChanged) *ArgChanged = true; 4023 4024 // The transform has determined that we should perform an elementwise 4025 // expansion of the pattern. Do so. 4026 for (unsigned I = 0; I != *NumExpansions; ++I) { 4027 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4028 ExprResult Out = getDerived().TransformExpr(Pattern); 4029 if (Out.isInvalid()) 4030 return true; 4031 4032 if (Out.get()->containsUnexpandedParameterPack()) { 4033 Out = getDerived().RebuildPackExpansion( 4034 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4035 if (Out.isInvalid()) 4036 return true; 4037 } 4038 4039 Outputs.push_back(Out.get()); 4040 } 4041 4042 // If we're supposed to retain a pack expansion, do so by temporarily 4043 // forgetting the partially-substituted parameter pack. 4044 if (RetainExpansion) { 4045 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4046 4047 ExprResult Out = getDerived().TransformExpr(Pattern); 4048 if (Out.isInvalid()) 4049 return true; 4050 4051 Out = getDerived().RebuildPackExpansion( 4052 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4053 if (Out.isInvalid()) 4054 return true; 4055 4056 Outputs.push_back(Out.get()); 4057 } 4058 4059 continue; 4060 } 4061 4062 ExprResult Result = 4063 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4064 : getDerived().TransformExpr(Inputs[I]); 4065 if (Result.isInvalid()) 4066 return true; 4067 4068 if (Result.get() != Inputs[I] && ArgChanged) 4069 *ArgChanged = true; 4070 4071 Outputs.push_back(Result.get()); 4072 } 4073 4074 return false; 4075 } 4076 4077 template <typename Derived> 4078 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4079 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4080 if (Var) { 4081 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4082 getDerived().TransformDefinition(Var->getLocation(), Var)); 4083 4084 if (!ConditionVar) 4085 return Sema::ConditionError(); 4086 4087 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4088 } 4089 4090 if (Expr) { 4091 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4092 4093 if (CondExpr.isInvalid()) 4094 return Sema::ConditionError(); 4095 4096 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind, 4097 /*MissingOK=*/true); 4098 } 4099 4100 return Sema::ConditionResult(); 4101 } 4102 4103 template <typename Derived> 4104 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4105 NestedNameSpecifierLoc NNS, QualType ObjectType, 4106 NamedDecl *FirstQualifierInScope) { 4107 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4108 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4109 Qualifier = Qualifier.getPrefix()) 4110 Qualifiers.push_back(Qualifier); 4111 4112 CXXScopeSpec SS; 4113 while (!Qualifiers.empty()) { 4114 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4115 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4116 4117 switch (QNNS->getKind()) { 4118 case NestedNameSpecifier::Identifier: { 4119 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4120 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4121 ObjectType); 4122 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4123 SS, FirstQualifierInScope, false)) 4124 return NestedNameSpecifierLoc(); 4125 break; 4126 } 4127 4128 case NestedNameSpecifier::Namespace: { 4129 NamespaceDecl *NS = 4130 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4131 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4132 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4133 break; 4134 } 4135 4136 case NestedNameSpecifier::NamespaceAlias: { 4137 NamespaceAliasDecl *Alias = 4138 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4139 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4140 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4141 Q.getLocalEndLoc()); 4142 break; 4143 } 4144 4145 case NestedNameSpecifier::Global: 4146 // There is no meaningful transformation that one could perform on the 4147 // global scope. 4148 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4149 break; 4150 4151 case NestedNameSpecifier::Super: { 4152 CXXRecordDecl *RD = 4153 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4154 SourceLocation(), QNNS->getAsRecordDecl())); 4155 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4156 break; 4157 } 4158 4159 case NestedNameSpecifier::TypeSpecWithTemplate: 4160 case NestedNameSpecifier::TypeSpec: { 4161 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4162 FirstQualifierInScope, SS); 4163 4164 if (!TL) 4165 return NestedNameSpecifierLoc(); 4166 4167 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4168 (SemaRef.getLangOpts().CPlusPlus11 && 4169 TL.getType()->isEnumeralType())) { 4170 assert(!TL.getType().hasLocalQualifiers() && 4171 "Can't get cv-qualifiers here"); 4172 if (TL.getType()->isEnumeralType()) 4173 SemaRef.Diag(TL.getBeginLoc(), 4174 diag::warn_cxx98_compat_enum_nested_name_spec); 4175 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4176 Q.getLocalEndLoc()); 4177 break; 4178 } 4179 // If the nested-name-specifier is an invalid type def, don't emit an 4180 // error because a previous error should have already been emitted. 4181 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4182 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4183 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4184 << TL.getType() << SS.getRange(); 4185 } 4186 return NestedNameSpecifierLoc(); 4187 } 4188 } 4189 4190 // The qualifier-in-scope and object type only apply to the leftmost entity. 4191 FirstQualifierInScope = nullptr; 4192 ObjectType = QualType(); 4193 } 4194 4195 // Don't rebuild the nested-name-specifier if we don't have to. 4196 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4197 !getDerived().AlwaysRebuild()) 4198 return NNS; 4199 4200 // If we can re-use the source-location data from the original 4201 // nested-name-specifier, do so. 4202 if (SS.location_size() == NNS.getDataLength() && 4203 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4204 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4205 4206 // Allocate new nested-name-specifier location information. 4207 return SS.getWithLocInContext(SemaRef.Context); 4208 } 4209 4210 template<typename Derived> 4211 DeclarationNameInfo 4212 TreeTransform<Derived> 4213 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4214 DeclarationName Name = NameInfo.getName(); 4215 if (!Name) 4216 return DeclarationNameInfo(); 4217 4218 switch (Name.getNameKind()) { 4219 case DeclarationName::Identifier: 4220 case DeclarationName::ObjCZeroArgSelector: 4221 case DeclarationName::ObjCOneArgSelector: 4222 case DeclarationName::ObjCMultiArgSelector: 4223 case DeclarationName::CXXOperatorName: 4224 case DeclarationName::CXXLiteralOperatorName: 4225 case DeclarationName::CXXUsingDirective: 4226 return NameInfo; 4227 4228 case DeclarationName::CXXDeductionGuideName: { 4229 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4230 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4231 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4232 if (!NewTemplate) 4233 return DeclarationNameInfo(); 4234 4235 DeclarationNameInfo NewNameInfo(NameInfo); 4236 NewNameInfo.setName( 4237 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4238 return NewNameInfo; 4239 } 4240 4241 case DeclarationName::CXXConstructorName: 4242 case DeclarationName::CXXDestructorName: 4243 case DeclarationName::CXXConversionFunctionName: { 4244 TypeSourceInfo *NewTInfo; 4245 CanQualType NewCanTy; 4246 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4247 NewTInfo = getDerived().TransformType(OldTInfo); 4248 if (!NewTInfo) 4249 return DeclarationNameInfo(); 4250 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4251 } 4252 else { 4253 NewTInfo = nullptr; 4254 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4255 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4256 if (NewT.isNull()) 4257 return DeclarationNameInfo(); 4258 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4259 } 4260 4261 DeclarationName NewName 4262 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4263 NewCanTy); 4264 DeclarationNameInfo NewNameInfo(NameInfo); 4265 NewNameInfo.setName(NewName); 4266 NewNameInfo.setNamedTypeInfo(NewTInfo); 4267 return NewNameInfo; 4268 } 4269 } 4270 4271 llvm_unreachable("Unknown name kind."); 4272 } 4273 4274 template<typename Derived> 4275 TemplateName 4276 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4277 TemplateName Name, 4278 SourceLocation NameLoc, 4279 QualType ObjectType, 4280 NamedDecl *FirstQualifierInScope, 4281 bool AllowInjectedClassName) { 4282 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4283 TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl(); 4284 assert(Template && "qualified template name must refer to a template"); 4285 4286 TemplateDecl *TransTemplate 4287 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4288 Template)); 4289 if (!TransTemplate) 4290 return TemplateName(); 4291 4292 if (!getDerived().AlwaysRebuild() && 4293 SS.getScopeRep() == QTN->getQualifier() && 4294 TransTemplate == Template) 4295 return Name; 4296 4297 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4298 TransTemplate); 4299 } 4300 4301 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4302 if (SS.getScopeRep()) { 4303 // These apply to the scope specifier, not the template. 4304 ObjectType = QualType(); 4305 FirstQualifierInScope = nullptr; 4306 } 4307 4308 if (!getDerived().AlwaysRebuild() && 4309 SS.getScopeRep() == DTN->getQualifier() && 4310 ObjectType.isNull()) 4311 return Name; 4312 4313 // FIXME: Preserve the location of the "template" keyword. 4314 SourceLocation TemplateKWLoc = NameLoc; 4315 4316 if (DTN->isIdentifier()) { 4317 return getDerived().RebuildTemplateName(SS, 4318 TemplateKWLoc, 4319 *DTN->getIdentifier(), 4320 NameLoc, 4321 ObjectType, 4322 FirstQualifierInScope, 4323 AllowInjectedClassName); 4324 } 4325 4326 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4327 DTN->getOperator(), NameLoc, 4328 ObjectType, AllowInjectedClassName); 4329 } 4330 4331 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4332 TemplateDecl *TransTemplate 4333 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4334 Template)); 4335 if (!TransTemplate) 4336 return TemplateName(); 4337 4338 if (!getDerived().AlwaysRebuild() && 4339 TransTemplate == Template) 4340 return Name; 4341 4342 return TemplateName(TransTemplate); 4343 } 4344 4345 if (SubstTemplateTemplateParmPackStorage *SubstPack 4346 = Name.getAsSubstTemplateTemplateParmPack()) { 4347 TemplateTemplateParmDecl *TransParam 4348 = cast_or_null<TemplateTemplateParmDecl>( 4349 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4350 if (!TransParam) 4351 return TemplateName(); 4352 4353 if (!getDerived().AlwaysRebuild() && 4354 TransParam == SubstPack->getParameterPack()) 4355 return Name; 4356 4357 return getDerived().RebuildTemplateName(TransParam, 4358 SubstPack->getArgumentPack()); 4359 } 4360 4361 // These should be getting filtered out before they reach the AST. 4362 llvm_unreachable("overloaded function decl survived to here"); 4363 } 4364 4365 template<typename Derived> 4366 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4367 const TemplateArgument &Arg, 4368 TemplateArgumentLoc &Output) { 4369 Output = getSema().getTrivialTemplateArgumentLoc( 4370 Arg, QualType(), getDerived().getBaseLocation()); 4371 } 4372 4373 template <typename Derived> 4374 bool TreeTransform<Derived>::TransformTemplateArgument( 4375 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4376 bool Uneval) { 4377 const TemplateArgument &Arg = Input.getArgument(); 4378 switch (Arg.getKind()) { 4379 case TemplateArgument::Null: 4380 case TemplateArgument::Pack: 4381 llvm_unreachable("Unexpected TemplateArgument"); 4382 4383 case TemplateArgument::Integral: 4384 case TemplateArgument::NullPtr: 4385 case TemplateArgument::Declaration: { 4386 // Transform a resolved template argument straight to a resolved template 4387 // argument. We get here when substituting into an already-substituted 4388 // template type argument during concept satisfaction checking. 4389 QualType T = Arg.getNonTypeTemplateArgumentType(); 4390 QualType NewT = getDerived().TransformType(T); 4391 if (NewT.isNull()) 4392 return true; 4393 4394 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4395 ? Arg.getAsDecl() 4396 : nullptr; 4397 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4398 getDerived().getBaseLocation(), D)) 4399 : nullptr; 4400 if (D && !NewD) 4401 return true; 4402 4403 if (NewT == T && D == NewD) 4404 Output = Input; 4405 else if (Arg.getKind() == TemplateArgument::Integral) 4406 Output = TemplateArgumentLoc( 4407 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4408 TemplateArgumentLocInfo()); 4409 else if (Arg.getKind() == TemplateArgument::NullPtr) 4410 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4411 TemplateArgumentLocInfo()); 4412 else 4413 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4414 TemplateArgumentLocInfo()); 4415 4416 return false; 4417 } 4418 4419 case TemplateArgument::Type: { 4420 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4421 if (!DI) 4422 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4423 4424 DI = getDerived().TransformType(DI); 4425 if (!DI) 4426 return true; 4427 4428 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4429 return false; 4430 } 4431 4432 case TemplateArgument::Template: { 4433 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4434 if (QualifierLoc) { 4435 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4436 if (!QualifierLoc) 4437 return true; 4438 } 4439 4440 CXXScopeSpec SS; 4441 SS.Adopt(QualifierLoc); 4442 TemplateName Template = getDerived().TransformTemplateName( 4443 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4444 if (Template.isNull()) 4445 return true; 4446 4447 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4448 QualifierLoc, Input.getTemplateNameLoc()); 4449 return false; 4450 } 4451 4452 case TemplateArgument::TemplateExpansion: 4453 llvm_unreachable("Caller should expand pack expansions"); 4454 4455 case TemplateArgument::Expression: { 4456 // Template argument expressions are constant expressions. 4457 EnterExpressionEvaluationContext Unevaluated( 4458 getSema(), 4459 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4460 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4461 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4462 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4463 4464 Expr *InputExpr = Input.getSourceExpression(); 4465 if (!InputExpr) 4466 InputExpr = Input.getArgument().getAsExpr(); 4467 4468 ExprResult E = getDerived().TransformExpr(InputExpr); 4469 E = SemaRef.ActOnConstantExpression(E); 4470 if (E.isInvalid()) 4471 return true; 4472 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4473 return false; 4474 } 4475 } 4476 4477 // Work around bogus GCC warning 4478 return true; 4479 } 4480 4481 /// Iterator adaptor that invents template argument location information 4482 /// for each of the template arguments in its underlying iterator. 4483 template<typename Derived, typename InputIterator> 4484 class TemplateArgumentLocInventIterator { 4485 TreeTransform<Derived> &Self; 4486 InputIterator Iter; 4487 4488 public: 4489 typedef TemplateArgumentLoc value_type; 4490 typedef TemplateArgumentLoc reference; 4491 typedef typename std::iterator_traits<InputIterator>::difference_type 4492 difference_type; 4493 typedef std::input_iterator_tag iterator_category; 4494 4495 class pointer { 4496 TemplateArgumentLoc Arg; 4497 4498 public: 4499 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4500 4501 const TemplateArgumentLoc *operator->() const { return &Arg; } 4502 }; 4503 4504 TemplateArgumentLocInventIterator() { } 4505 4506 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4507 InputIterator Iter) 4508 : Self(Self), Iter(Iter) { } 4509 4510 TemplateArgumentLocInventIterator &operator++() { 4511 ++Iter; 4512 return *this; 4513 } 4514 4515 TemplateArgumentLocInventIterator operator++(int) { 4516 TemplateArgumentLocInventIterator Old(*this); 4517 ++(*this); 4518 return Old; 4519 } 4520 4521 reference operator*() const { 4522 TemplateArgumentLoc Result; 4523 Self.InventTemplateArgumentLoc(*Iter, Result); 4524 return Result; 4525 } 4526 4527 pointer operator->() const { return pointer(**this); } 4528 4529 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4530 const TemplateArgumentLocInventIterator &Y) { 4531 return X.Iter == Y.Iter; 4532 } 4533 4534 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4535 const TemplateArgumentLocInventIterator &Y) { 4536 return X.Iter != Y.Iter; 4537 } 4538 }; 4539 4540 template<typename Derived> 4541 template<typename InputIterator> 4542 bool TreeTransform<Derived>::TransformTemplateArguments( 4543 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4544 bool Uneval) { 4545 for (; First != Last; ++First) { 4546 TemplateArgumentLoc Out; 4547 TemplateArgumentLoc In = *First; 4548 4549 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4550 // Unpack argument packs, which we translate them into separate 4551 // arguments. 4552 // FIXME: We could do much better if we could guarantee that the 4553 // TemplateArgumentLocInfo for the pack expansion would be usable for 4554 // all of the template arguments in the argument pack. 4555 typedef TemplateArgumentLocInventIterator<Derived, 4556 TemplateArgument::pack_iterator> 4557 PackLocIterator; 4558 if (TransformTemplateArguments(PackLocIterator(*this, 4559 In.getArgument().pack_begin()), 4560 PackLocIterator(*this, 4561 In.getArgument().pack_end()), 4562 Outputs, Uneval)) 4563 return true; 4564 4565 continue; 4566 } 4567 4568 if (In.getArgument().isPackExpansion()) { 4569 // We have a pack expansion, for which we will be substituting into 4570 // the pattern. 4571 SourceLocation Ellipsis; 4572 Optional<unsigned> OrigNumExpansions; 4573 TemplateArgumentLoc Pattern 4574 = getSema().getTemplateArgumentPackExpansionPattern( 4575 In, Ellipsis, OrigNumExpansions); 4576 4577 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4578 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4579 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4580 4581 // Determine whether the set of unexpanded parameter packs can and should 4582 // be expanded. 4583 bool Expand = true; 4584 bool RetainExpansion = false; 4585 Optional<unsigned> NumExpansions = OrigNumExpansions; 4586 if (getDerived().TryExpandParameterPacks(Ellipsis, 4587 Pattern.getSourceRange(), 4588 Unexpanded, 4589 Expand, 4590 RetainExpansion, 4591 NumExpansions)) 4592 return true; 4593 4594 if (!Expand) { 4595 // The transform has determined that we should perform a simple 4596 // transformation on the pack expansion, producing another pack 4597 // expansion. 4598 TemplateArgumentLoc OutPattern; 4599 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4600 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4601 return true; 4602 4603 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4604 NumExpansions); 4605 if (Out.getArgument().isNull()) 4606 return true; 4607 4608 Outputs.addArgument(Out); 4609 continue; 4610 } 4611 4612 // The transform has determined that we should perform an elementwise 4613 // expansion of the pattern. Do so. 4614 for (unsigned I = 0; I != *NumExpansions; ++I) { 4615 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4616 4617 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4618 return true; 4619 4620 if (Out.getArgument().containsUnexpandedParameterPack()) { 4621 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4622 OrigNumExpansions); 4623 if (Out.getArgument().isNull()) 4624 return true; 4625 } 4626 4627 Outputs.addArgument(Out); 4628 } 4629 4630 // If we're supposed to retain a pack expansion, do so by temporarily 4631 // forgetting the partially-substituted parameter pack. 4632 if (RetainExpansion) { 4633 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4634 4635 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4636 return true; 4637 4638 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4639 OrigNumExpansions); 4640 if (Out.getArgument().isNull()) 4641 return true; 4642 4643 Outputs.addArgument(Out); 4644 } 4645 4646 continue; 4647 } 4648 4649 // The simple case: 4650 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4651 return true; 4652 4653 Outputs.addArgument(Out); 4654 } 4655 4656 return false; 4657 4658 } 4659 4660 //===----------------------------------------------------------------------===// 4661 // Type transformation 4662 //===----------------------------------------------------------------------===// 4663 4664 template<typename Derived> 4665 QualType TreeTransform<Derived>::TransformType(QualType T) { 4666 if (getDerived().AlreadyTransformed(T)) 4667 return T; 4668 4669 // Temporary workaround. All of these transformations should 4670 // eventually turn into transformations on TypeLocs. 4671 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4672 getDerived().getBaseLocation()); 4673 4674 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4675 4676 if (!NewDI) 4677 return QualType(); 4678 4679 return NewDI->getType(); 4680 } 4681 4682 template<typename Derived> 4683 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4684 // Refine the base location to the type's location. 4685 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4686 getDerived().getBaseEntity()); 4687 if (getDerived().AlreadyTransformed(DI->getType())) 4688 return DI; 4689 4690 TypeLocBuilder TLB; 4691 4692 TypeLoc TL = DI->getTypeLoc(); 4693 TLB.reserve(TL.getFullDataSize()); 4694 4695 QualType Result = getDerived().TransformType(TLB, TL); 4696 if (Result.isNull()) 4697 return nullptr; 4698 4699 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4700 } 4701 4702 template<typename Derived> 4703 QualType 4704 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4705 switch (T.getTypeLocClass()) { 4706 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4707 #define TYPELOC(CLASS, PARENT) \ 4708 case TypeLoc::CLASS: \ 4709 return getDerived().Transform##CLASS##Type(TLB, \ 4710 T.castAs<CLASS##TypeLoc>()); 4711 #include "clang/AST/TypeLocNodes.def" 4712 } 4713 4714 llvm_unreachable("unhandled type loc!"); 4715 } 4716 4717 template<typename Derived> 4718 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4719 if (!isa<DependentNameType>(T)) 4720 return TransformType(T); 4721 4722 if (getDerived().AlreadyTransformed(T)) 4723 return T; 4724 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4725 getDerived().getBaseLocation()); 4726 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4727 return NewDI ? NewDI->getType() : QualType(); 4728 } 4729 4730 template<typename Derived> 4731 TypeSourceInfo * 4732 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4733 if (!isa<DependentNameType>(DI->getType())) 4734 return TransformType(DI); 4735 4736 // Refine the base location to the type's location. 4737 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4738 getDerived().getBaseEntity()); 4739 if (getDerived().AlreadyTransformed(DI->getType())) 4740 return DI; 4741 4742 TypeLocBuilder TLB; 4743 4744 TypeLoc TL = DI->getTypeLoc(); 4745 TLB.reserve(TL.getFullDataSize()); 4746 4747 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4748 if (QTL) 4749 TL = QTL.getUnqualifiedLoc(); 4750 4751 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4752 4753 QualType Result = getDerived().TransformDependentNameType( 4754 TLB, DNTL, /*DeducedTSTContext*/true); 4755 if (Result.isNull()) 4756 return nullptr; 4757 4758 if (QTL) { 4759 Result = getDerived().RebuildQualifiedType(Result, QTL); 4760 if (Result.isNull()) 4761 return nullptr; 4762 TLB.TypeWasModifiedSafely(Result); 4763 } 4764 4765 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4766 } 4767 4768 template<typename Derived> 4769 QualType 4770 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4771 QualifiedTypeLoc T) { 4772 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4773 if (Result.isNull()) 4774 return QualType(); 4775 4776 Result = getDerived().RebuildQualifiedType(Result, T); 4777 4778 if (Result.isNull()) 4779 return QualType(); 4780 4781 // RebuildQualifiedType might have updated the type, but not in a way 4782 // that invalidates the TypeLoc. (There's no location information for 4783 // qualifiers.) 4784 TLB.TypeWasModifiedSafely(Result); 4785 4786 return Result; 4787 } 4788 4789 template <typename Derived> 4790 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4791 QualifiedTypeLoc TL) { 4792 4793 SourceLocation Loc = TL.getBeginLoc(); 4794 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4795 4796 if ((T.getAddressSpace() != LangAS::Default && 4797 Quals.getAddressSpace() != LangAS::Default) && 4798 T.getAddressSpace() != Quals.getAddressSpace()) { 4799 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4800 << TL.getType() << T; 4801 return QualType(); 4802 } 4803 4804 // C++ [dcl.fct]p7: 4805 // [When] adding cv-qualifications on top of the function type [...] the 4806 // cv-qualifiers are ignored. 4807 if (T->isFunctionType()) { 4808 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4809 Quals.getAddressSpace()); 4810 return T; 4811 } 4812 4813 // C++ [dcl.ref]p1: 4814 // when the cv-qualifiers are introduced through the use of a typedef-name 4815 // or decltype-specifier [...] the cv-qualifiers are ignored. 4816 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4817 // applied to a reference type. 4818 if (T->isReferenceType()) { 4819 // The only qualifier that applies to a reference type is restrict. 4820 if (!Quals.hasRestrict()) 4821 return T; 4822 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4823 } 4824 4825 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4826 // resulting type. 4827 if (Quals.hasObjCLifetime()) { 4828 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4829 Quals.removeObjCLifetime(); 4830 else if (T.getObjCLifetime()) { 4831 // Objective-C ARC: 4832 // A lifetime qualifier applied to a substituted template parameter 4833 // overrides the lifetime qualifier from the template argument. 4834 const AutoType *AutoTy; 4835 if (const SubstTemplateTypeParmType *SubstTypeParam 4836 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4837 QualType Replacement = SubstTypeParam->getReplacementType(); 4838 Qualifiers Qs = Replacement.getQualifiers(); 4839 Qs.removeObjCLifetime(); 4840 Replacement = SemaRef.Context.getQualifiedType( 4841 Replacement.getUnqualifiedType(), Qs); 4842 T = SemaRef.Context.getSubstTemplateTypeParmType( 4843 SubstTypeParam->getReplacedParameter(), Replacement); 4844 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4845 // 'auto' types behave the same way as template parameters. 4846 QualType Deduced = AutoTy->getDeducedType(); 4847 Qualifiers Qs = Deduced.getQualifiers(); 4848 Qs.removeObjCLifetime(); 4849 Deduced = 4850 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4851 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4852 AutoTy->isDependentType(), 4853 /*isPack=*/false, 4854 AutoTy->getTypeConstraintConcept(), 4855 AutoTy->getTypeConstraintArguments()); 4856 } else { 4857 // Otherwise, complain about the addition of a qualifier to an 4858 // already-qualified type. 4859 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4860 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4861 Quals.removeObjCLifetime(); 4862 } 4863 } 4864 } 4865 4866 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4867 } 4868 4869 template<typename Derived> 4870 TypeLoc 4871 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4872 QualType ObjectType, 4873 NamedDecl *UnqualLookup, 4874 CXXScopeSpec &SS) { 4875 if (getDerived().AlreadyTransformed(TL.getType())) 4876 return TL; 4877 4878 TypeSourceInfo *TSI = 4879 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4880 if (TSI) 4881 return TSI->getTypeLoc(); 4882 return TypeLoc(); 4883 } 4884 4885 template<typename Derived> 4886 TypeSourceInfo * 4887 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4888 QualType ObjectType, 4889 NamedDecl *UnqualLookup, 4890 CXXScopeSpec &SS) { 4891 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4892 return TSInfo; 4893 4894 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4895 UnqualLookup, SS); 4896 } 4897 4898 template <typename Derived> 4899 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4900 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4901 CXXScopeSpec &SS) { 4902 QualType T = TL.getType(); 4903 assert(!getDerived().AlreadyTransformed(T)); 4904 4905 TypeLocBuilder TLB; 4906 QualType Result; 4907 4908 if (isa<TemplateSpecializationType>(T)) { 4909 TemplateSpecializationTypeLoc SpecTL = 4910 TL.castAs<TemplateSpecializationTypeLoc>(); 4911 4912 TemplateName Template = getDerived().TransformTemplateName( 4913 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4914 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4915 if (Template.isNull()) 4916 return nullptr; 4917 4918 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4919 Template); 4920 } else if (isa<DependentTemplateSpecializationType>(T)) { 4921 DependentTemplateSpecializationTypeLoc SpecTL = 4922 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4923 4924 TemplateName Template 4925 = getDerived().RebuildTemplateName(SS, 4926 SpecTL.getTemplateKeywordLoc(), 4927 *SpecTL.getTypePtr()->getIdentifier(), 4928 SpecTL.getTemplateNameLoc(), 4929 ObjectType, UnqualLookup, 4930 /*AllowInjectedClassName*/true); 4931 if (Template.isNull()) 4932 return nullptr; 4933 4934 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4935 SpecTL, 4936 Template, 4937 SS); 4938 } else { 4939 // Nothing special needs to be done for these. 4940 Result = getDerived().TransformType(TLB, TL); 4941 } 4942 4943 if (Result.isNull()) 4944 return nullptr; 4945 4946 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4947 } 4948 4949 template <class TyLoc> static inline 4950 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4951 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4952 NewT.setNameLoc(T.getNameLoc()); 4953 return T.getType(); 4954 } 4955 4956 template<typename Derived> 4957 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4958 BuiltinTypeLoc T) { 4959 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4960 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4961 if (T.needsExtraLocalData()) 4962 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4963 return T.getType(); 4964 } 4965 4966 template<typename Derived> 4967 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4968 ComplexTypeLoc T) { 4969 // FIXME: recurse? 4970 return TransformTypeSpecType(TLB, T); 4971 } 4972 4973 template <typename Derived> 4974 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4975 AdjustedTypeLoc TL) { 4976 // Adjustments applied during transformation are handled elsewhere. 4977 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4978 } 4979 4980 template<typename Derived> 4981 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4982 DecayedTypeLoc TL) { 4983 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4984 if (OriginalType.isNull()) 4985 return QualType(); 4986 4987 QualType Result = TL.getType(); 4988 if (getDerived().AlwaysRebuild() || 4989 OriginalType != TL.getOriginalLoc().getType()) 4990 Result = SemaRef.Context.getDecayedType(OriginalType); 4991 TLB.push<DecayedTypeLoc>(Result); 4992 // Nothing to set for DecayedTypeLoc. 4993 return Result; 4994 } 4995 4996 template<typename Derived> 4997 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4998 PointerTypeLoc TL) { 4999 QualType PointeeType 5000 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5001 if (PointeeType.isNull()) 5002 return QualType(); 5003 5004 QualType Result = TL.getType(); 5005 if (PointeeType->getAs<ObjCObjectType>()) { 5006 // A dependent pointer type 'T *' has is being transformed such 5007 // that an Objective-C class type is being replaced for 'T'. The 5008 // resulting pointer type is an ObjCObjectPointerType, not a 5009 // PointerType. 5010 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 5011 5012 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 5013 NewT.setStarLoc(TL.getStarLoc()); 5014 return Result; 5015 } 5016 5017 if (getDerived().AlwaysRebuild() || 5018 PointeeType != TL.getPointeeLoc().getType()) { 5019 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 5020 if (Result.isNull()) 5021 return QualType(); 5022 } 5023 5024 // Objective-C ARC can add lifetime qualifiers to the type that we're 5025 // pointing to. 5026 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 5027 5028 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 5029 NewT.setSigilLoc(TL.getSigilLoc()); 5030 return Result; 5031 } 5032 5033 template<typename Derived> 5034 QualType 5035 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5036 BlockPointerTypeLoc TL) { 5037 QualType PointeeType 5038 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5039 if (PointeeType.isNull()) 5040 return QualType(); 5041 5042 QualType Result = TL.getType(); 5043 if (getDerived().AlwaysRebuild() || 5044 PointeeType != TL.getPointeeLoc().getType()) { 5045 Result = getDerived().RebuildBlockPointerType(PointeeType, 5046 TL.getSigilLoc()); 5047 if (Result.isNull()) 5048 return QualType(); 5049 } 5050 5051 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5052 NewT.setSigilLoc(TL.getSigilLoc()); 5053 return Result; 5054 } 5055 5056 /// Transforms a reference type. Note that somewhat paradoxically we 5057 /// don't care whether the type itself is an l-value type or an r-value 5058 /// type; we only care if the type was *written* as an l-value type 5059 /// or an r-value type. 5060 template<typename Derived> 5061 QualType 5062 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5063 ReferenceTypeLoc TL) { 5064 const ReferenceType *T = TL.getTypePtr(); 5065 5066 // Note that this works with the pointee-as-written. 5067 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5068 if (PointeeType.isNull()) 5069 return QualType(); 5070 5071 QualType Result = TL.getType(); 5072 if (getDerived().AlwaysRebuild() || 5073 PointeeType != T->getPointeeTypeAsWritten()) { 5074 Result = getDerived().RebuildReferenceType(PointeeType, 5075 T->isSpelledAsLValue(), 5076 TL.getSigilLoc()); 5077 if (Result.isNull()) 5078 return QualType(); 5079 } 5080 5081 // Objective-C ARC can add lifetime qualifiers to the type that we're 5082 // referring to. 5083 TLB.TypeWasModifiedSafely( 5084 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5085 5086 // r-value references can be rebuilt as l-value references. 5087 ReferenceTypeLoc NewTL; 5088 if (isa<LValueReferenceType>(Result)) 5089 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5090 else 5091 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5092 NewTL.setSigilLoc(TL.getSigilLoc()); 5093 5094 return Result; 5095 } 5096 5097 template<typename Derived> 5098 QualType 5099 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5100 LValueReferenceTypeLoc TL) { 5101 return TransformReferenceType(TLB, TL); 5102 } 5103 5104 template<typename Derived> 5105 QualType 5106 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5107 RValueReferenceTypeLoc TL) { 5108 return TransformReferenceType(TLB, TL); 5109 } 5110 5111 template<typename Derived> 5112 QualType 5113 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5114 MemberPointerTypeLoc TL) { 5115 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5116 if (PointeeType.isNull()) 5117 return QualType(); 5118 5119 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5120 TypeSourceInfo *NewClsTInfo = nullptr; 5121 if (OldClsTInfo) { 5122 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5123 if (!NewClsTInfo) 5124 return QualType(); 5125 } 5126 5127 const MemberPointerType *T = TL.getTypePtr(); 5128 QualType OldClsType = QualType(T->getClass(), 0); 5129 QualType NewClsType; 5130 if (NewClsTInfo) 5131 NewClsType = NewClsTInfo->getType(); 5132 else { 5133 NewClsType = getDerived().TransformType(OldClsType); 5134 if (NewClsType.isNull()) 5135 return QualType(); 5136 } 5137 5138 QualType Result = TL.getType(); 5139 if (getDerived().AlwaysRebuild() || 5140 PointeeType != T->getPointeeType() || 5141 NewClsType != OldClsType) { 5142 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5143 TL.getStarLoc()); 5144 if (Result.isNull()) 5145 return QualType(); 5146 } 5147 5148 // If we had to adjust the pointee type when building a member pointer, make 5149 // sure to push TypeLoc info for it. 5150 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5151 if (MPT && PointeeType != MPT->getPointeeType()) { 5152 assert(isa<AdjustedType>(MPT->getPointeeType())); 5153 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5154 } 5155 5156 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5157 NewTL.setSigilLoc(TL.getSigilLoc()); 5158 NewTL.setClassTInfo(NewClsTInfo); 5159 5160 return Result; 5161 } 5162 5163 template<typename Derived> 5164 QualType 5165 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5166 ConstantArrayTypeLoc TL) { 5167 const ConstantArrayType *T = TL.getTypePtr(); 5168 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5169 if (ElementType.isNull()) 5170 return QualType(); 5171 5172 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5173 Expr *OldSize = TL.getSizeExpr(); 5174 if (!OldSize) 5175 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5176 Expr *NewSize = nullptr; 5177 if (OldSize) { 5178 EnterExpressionEvaluationContext Unevaluated( 5179 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5180 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5181 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5182 } 5183 5184 QualType Result = TL.getType(); 5185 if (getDerived().AlwaysRebuild() || 5186 ElementType != T->getElementType() || 5187 (T->getSizeExpr() && NewSize != OldSize)) { 5188 Result = getDerived().RebuildConstantArrayType(ElementType, 5189 T->getSizeModifier(), 5190 T->getSize(), NewSize, 5191 T->getIndexTypeCVRQualifiers(), 5192 TL.getBracketsRange()); 5193 if (Result.isNull()) 5194 return QualType(); 5195 } 5196 5197 // We might have either a ConstantArrayType or a VariableArrayType now: 5198 // a ConstantArrayType is allowed to have an element type which is a 5199 // VariableArrayType if the type is dependent. Fortunately, all array 5200 // types have the same location layout. 5201 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5202 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5203 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5204 NewTL.setSizeExpr(NewSize); 5205 5206 return Result; 5207 } 5208 5209 template<typename Derived> 5210 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5211 TypeLocBuilder &TLB, 5212 IncompleteArrayTypeLoc TL) { 5213 const IncompleteArrayType *T = TL.getTypePtr(); 5214 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5215 if (ElementType.isNull()) 5216 return QualType(); 5217 5218 QualType Result = TL.getType(); 5219 if (getDerived().AlwaysRebuild() || 5220 ElementType != T->getElementType()) { 5221 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5222 T->getSizeModifier(), 5223 T->getIndexTypeCVRQualifiers(), 5224 TL.getBracketsRange()); 5225 if (Result.isNull()) 5226 return QualType(); 5227 } 5228 5229 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5230 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5231 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5232 NewTL.setSizeExpr(nullptr); 5233 5234 return Result; 5235 } 5236 5237 template<typename Derived> 5238 QualType 5239 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5240 VariableArrayTypeLoc TL) { 5241 const VariableArrayType *T = TL.getTypePtr(); 5242 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5243 if (ElementType.isNull()) 5244 return QualType(); 5245 5246 ExprResult SizeResult; 5247 { 5248 EnterExpressionEvaluationContext Context( 5249 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5250 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5251 } 5252 if (SizeResult.isInvalid()) 5253 return QualType(); 5254 SizeResult = 5255 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5256 if (SizeResult.isInvalid()) 5257 return QualType(); 5258 5259 Expr *Size = SizeResult.get(); 5260 5261 QualType Result = TL.getType(); 5262 if (getDerived().AlwaysRebuild() || 5263 ElementType != T->getElementType() || 5264 Size != T->getSizeExpr()) { 5265 Result = getDerived().RebuildVariableArrayType(ElementType, 5266 T->getSizeModifier(), 5267 Size, 5268 T->getIndexTypeCVRQualifiers(), 5269 TL.getBracketsRange()); 5270 if (Result.isNull()) 5271 return QualType(); 5272 } 5273 5274 // We might have constant size array now, but fortunately it has the same 5275 // location layout. 5276 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5277 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5278 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5279 NewTL.setSizeExpr(Size); 5280 5281 return Result; 5282 } 5283 5284 template<typename Derived> 5285 QualType 5286 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5287 DependentSizedArrayTypeLoc TL) { 5288 const DependentSizedArrayType *T = TL.getTypePtr(); 5289 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5290 if (ElementType.isNull()) 5291 return QualType(); 5292 5293 // Array bounds are constant expressions. 5294 EnterExpressionEvaluationContext Unevaluated( 5295 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5296 5297 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5298 Expr *origSize = TL.getSizeExpr(); 5299 if (!origSize) origSize = T->getSizeExpr(); 5300 5301 ExprResult sizeResult 5302 = getDerived().TransformExpr(origSize); 5303 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5304 if (sizeResult.isInvalid()) 5305 return QualType(); 5306 5307 Expr *size = sizeResult.get(); 5308 5309 QualType Result = TL.getType(); 5310 if (getDerived().AlwaysRebuild() || 5311 ElementType != T->getElementType() || 5312 size != origSize) { 5313 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5314 T->getSizeModifier(), 5315 size, 5316 T->getIndexTypeCVRQualifiers(), 5317 TL.getBracketsRange()); 5318 if (Result.isNull()) 5319 return QualType(); 5320 } 5321 5322 // We might have any sort of array type now, but fortunately they 5323 // all have the same location layout. 5324 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5325 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5326 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5327 NewTL.setSizeExpr(size); 5328 5329 return Result; 5330 } 5331 5332 template <typename Derived> 5333 QualType TreeTransform<Derived>::TransformDependentVectorType( 5334 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5335 const DependentVectorType *T = TL.getTypePtr(); 5336 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5337 if (ElementType.isNull()) 5338 return QualType(); 5339 5340 EnterExpressionEvaluationContext Unevaluated( 5341 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5342 5343 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5344 Size = SemaRef.ActOnConstantExpression(Size); 5345 if (Size.isInvalid()) 5346 return QualType(); 5347 5348 QualType Result = TL.getType(); 5349 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5350 Size.get() != T->getSizeExpr()) { 5351 Result = getDerived().RebuildDependentVectorType( 5352 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5353 if (Result.isNull()) 5354 return QualType(); 5355 } 5356 5357 // Result might be dependent or not. 5358 if (isa<DependentVectorType>(Result)) { 5359 DependentVectorTypeLoc NewTL = 5360 TLB.push<DependentVectorTypeLoc>(Result); 5361 NewTL.setNameLoc(TL.getNameLoc()); 5362 } else { 5363 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5364 NewTL.setNameLoc(TL.getNameLoc()); 5365 } 5366 5367 return Result; 5368 } 5369 5370 template<typename Derived> 5371 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5372 TypeLocBuilder &TLB, 5373 DependentSizedExtVectorTypeLoc TL) { 5374 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5375 5376 // FIXME: ext vector locs should be nested 5377 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5378 if (ElementType.isNull()) 5379 return QualType(); 5380 5381 // Vector sizes are constant expressions. 5382 EnterExpressionEvaluationContext Unevaluated( 5383 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5384 5385 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5386 Size = SemaRef.ActOnConstantExpression(Size); 5387 if (Size.isInvalid()) 5388 return QualType(); 5389 5390 QualType Result = TL.getType(); 5391 if (getDerived().AlwaysRebuild() || 5392 ElementType != T->getElementType() || 5393 Size.get() != T->getSizeExpr()) { 5394 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5395 Size.get(), 5396 T->getAttributeLoc()); 5397 if (Result.isNull()) 5398 return QualType(); 5399 } 5400 5401 // Result might be dependent or not. 5402 if (isa<DependentSizedExtVectorType>(Result)) { 5403 DependentSizedExtVectorTypeLoc NewTL 5404 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5405 NewTL.setNameLoc(TL.getNameLoc()); 5406 } else { 5407 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5408 NewTL.setNameLoc(TL.getNameLoc()); 5409 } 5410 5411 return Result; 5412 } 5413 5414 template <typename Derived> 5415 QualType 5416 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5417 ConstantMatrixTypeLoc TL) { 5418 const ConstantMatrixType *T = TL.getTypePtr(); 5419 QualType ElementType = getDerived().TransformType(T->getElementType()); 5420 if (ElementType.isNull()) 5421 return QualType(); 5422 5423 QualType Result = TL.getType(); 5424 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5425 Result = getDerived().RebuildConstantMatrixType( 5426 ElementType, T->getNumRows(), T->getNumColumns()); 5427 if (Result.isNull()) 5428 return QualType(); 5429 } 5430 5431 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5432 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5433 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5434 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5435 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5436 5437 return Result; 5438 } 5439 5440 template <typename Derived> 5441 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5442 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5443 const DependentSizedMatrixType *T = TL.getTypePtr(); 5444 5445 QualType ElementType = getDerived().TransformType(T->getElementType()); 5446 if (ElementType.isNull()) { 5447 return QualType(); 5448 } 5449 5450 // Matrix dimensions are constant expressions. 5451 EnterExpressionEvaluationContext Unevaluated( 5452 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5453 5454 Expr *origRows = TL.getAttrRowOperand(); 5455 if (!origRows) 5456 origRows = T->getRowExpr(); 5457 Expr *origColumns = TL.getAttrColumnOperand(); 5458 if (!origColumns) 5459 origColumns = T->getColumnExpr(); 5460 5461 ExprResult rowResult = getDerived().TransformExpr(origRows); 5462 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5463 if (rowResult.isInvalid()) 5464 return QualType(); 5465 5466 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5467 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5468 if (columnResult.isInvalid()) 5469 return QualType(); 5470 5471 Expr *rows = rowResult.get(); 5472 Expr *columns = columnResult.get(); 5473 5474 QualType Result = TL.getType(); 5475 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5476 rows != origRows || columns != origColumns) { 5477 Result = getDerived().RebuildDependentSizedMatrixType( 5478 ElementType, rows, columns, T->getAttributeLoc()); 5479 5480 if (Result.isNull()) 5481 return QualType(); 5482 } 5483 5484 // We might have any sort of matrix type now, but fortunately they 5485 // all have the same location layout. 5486 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5487 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5488 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5489 NewTL.setAttrRowOperand(rows); 5490 NewTL.setAttrColumnOperand(columns); 5491 return Result; 5492 } 5493 5494 template <typename Derived> 5495 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5496 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5497 const DependentAddressSpaceType *T = TL.getTypePtr(); 5498 5499 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5500 5501 if (pointeeType.isNull()) 5502 return QualType(); 5503 5504 // Address spaces are constant expressions. 5505 EnterExpressionEvaluationContext Unevaluated( 5506 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5507 5508 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5509 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5510 if (AddrSpace.isInvalid()) 5511 return QualType(); 5512 5513 QualType Result = TL.getType(); 5514 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5515 AddrSpace.get() != T->getAddrSpaceExpr()) { 5516 Result = getDerived().RebuildDependentAddressSpaceType( 5517 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5518 if (Result.isNull()) 5519 return QualType(); 5520 } 5521 5522 // Result might be dependent or not. 5523 if (isa<DependentAddressSpaceType>(Result)) { 5524 DependentAddressSpaceTypeLoc NewTL = 5525 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5526 5527 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5528 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5529 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5530 5531 } else { 5532 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5533 Result, getDerived().getBaseLocation()); 5534 TransformType(TLB, DI->getTypeLoc()); 5535 } 5536 5537 return Result; 5538 } 5539 5540 template <typename Derived> 5541 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5542 VectorTypeLoc TL) { 5543 const VectorType *T = TL.getTypePtr(); 5544 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5545 if (ElementType.isNull()) 5546 return QualType(); 5547 5548 QualType Result = TL.getType(); 5549 if (getDerived().AlwaysRebuild() || 5550 ElementType != T->getElementType()) { 5551 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5552 T->getVectorKind()); 5553 if (Result.isNull()) 5554 return QualType(); 5555 } 5556 5557 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5558 NewTL.setNameLoc(TL.getNameLoc()); 5559 5560 return Result; 5561 } 5562 5563 template<typename Derived> 5564 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5565 ExtVectorTypeLoc TL) { 5566 const VectorType *T = TL.getTypePtr(); 5567 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5568 if (ElementType.isNull()) 5569 return QualType(); 5570 5571 QualType Result = TL.getType(); 5572 if (getDerived().AlwaysRebuild() || 5573 ElementType != T->getElementType()) { 5574 Result = getDerived().RebuildExtVectorType(ElementType, 5575 T->getNumElements(), 5576 /*FIXME*/ SourceLocation()); 5577 if (Result.isNull()) 5578 return QualType(); 5579 } 5580 5581 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5582 NewTL.setNameLoc(TL.getNameLoc()); 5583 5584 return Result; 5585 } 5586 5587 template <typename Derived> 5588 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5589 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5590 bool ExpectParameterPack) { 5591 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5592 TypeSourceInfo *NewDI = nullptr; 5593 5594 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5595 // If we're substituting into a pack expansion type and we know the 5596 // length we want to expand to, just substitute for the pattern. 5597 TypeLoc OldTL = OldDI->getTypeLoc(); 5598 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5599 5600 TypeLocBuilder TLB; 5601 TypeLoc NewTL = OldDI->getTypeLoc(); 5602 TLB.reserve(NewTL.getFullDataSize()); 5603 5604 QualType Result = getDerived().TransformType(TLB, 5605 OldExpansionTL.getPatternLoc()); 5606 if (Result.isNull()) 5607 return nullptr; 5608 5609 Result = RebuildPackExpansionType(Result, 5610 OldExpansionTL.getPatternLoc().getSourceRange(), 5611 OldExpansionTL.getEllipsisLoc(), 5612 NumExpansions); 5613 if (Result.isNull()) 5614 return nullptr; 5615 5616 PackExpansionTypeLoc NewExpansionTL 5617 = TLB.push<PackExpansionTypeLoc>(Result); 5618 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5619 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5620 } else 5621 NewDI = getDerived().TransformType(OldDI); 5622 if (!NewDI) 5623 return nullptr; 5624 5625 if (NewDI == OldDI && indexAdjustment == 0) 5626 return OldParm; 5627 5628 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5629 OldParm->getDeclContext(), 5630 OldParm->getInnerLocStart(), 5631 OldParm->getLocation(), 5632 OldParm->getIdentifier(), 5633 NewDI->getType(), 5634 NewDI, 5635 OldParm->getStorageClass(), 5636 /* DefArg */ nullptr); 5637 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5638 OldParm->getFunctionScopeIndex() + indexAdjustment); 5639 transformedLocalDecl(OldParm, {newParm}); 5640 return newParm; 5641 } 5642 5643 template <typename Derived> 5644 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5645 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5646 const QualType *ParamTypes, 5647 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5648 SmallVectorImpl<QualType> &OutParamTypes, 5649 SmallVectorImpl<ParmVarDecl *> *PVars, 5650 Sema::ExtParameterInfoBuilder &PInfos) { 5651 int indexAdjustment = 0; 5652 5653 unsigned NumParams = Params.size(); 5654 for (unsigned i = 0; i != NumParams; ++i) { 5655 if (ParmVarDecl *OldParm = Params[i]) { 5656 assert(OldParm->getFunctionScopeIndex() == i); 5657 5658 Optional<unsigned> NumExpansions; 5659 ParmVarDecl *NewParm = nullptr; 5660 if (OldParm->isParameterPack()) { 5661 // We have a function parameter pack that may need to be expanded. 5662 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5663 5664 // Find the parameter packs that could be expanded. 5665 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5666 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5667 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5668 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5669 5670 // Determine whether we should expand the parameter packs. 5671 bool ShouldExpand = false; 5672 bool RetainExpansion = false; 5673 Optional<unsigned> OrigNumExpansions; 5674 if (Unexpanded.size() > 0) { 5675 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5676 NumExpansions = OrigNumExpansions; 5677 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5678 Pattern.getSourceRange(), 5679 Unexpanded, 5680 ShouldExpand, 5681 RetainExpansion, 5682 NumExpansions)) { 5683 return true; 5684 } 5685 } else { 5686 #ifndef NDEBUG 5687 const AutoType *AT = 5688 Pattern.getType().getTypePtr()->getContainedAutoType(); 5689 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5690 "Could not find parameter packs or undeduced auto type!"); 5691 #endif 5692 } 5693 5694 if (ShouldExpand) { 5695 // Expand the function parameter pack into multiple, separate 5696 // parameters. 5697 getDerived().ExpandingFunctionParameterPack(OldParm); 5698 for (unsigned I = 0; I != *NumExpansions; ++I) { 5699 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5700 ParmVarDecl *NewParm 5701 = getDerived().TransformFunctionTypeParam(OldParm, 5702 indexAdjustment++, 5703 OrigNumExpansions, 5704 /*ExpectParameterPack=*/false); 5705 if (!NewParm) 5706 return true; 5707 5708 if (ParamInfos) 5709 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5710 OutParamTypes.push_back(NewParm->getType()); 5711 if (PVars) 5712 PVars->push_back(NewParm); 5713 } 5714 5715 // If we're supposed to retain a pack expansion, do so by temporarily 5716 // forgetting the partially-substituted parameter pack. 5717 if (RetainExpansion) { 5718 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5719 ParmVarDecl *NewParm 5720 = getDerived().TransformFunctionTypeParam(OldParm, 5721 indexAdjustment++, 5722 OrigNumExpansions, 5723 /*ExpectParameterPack=*/false); 5724 if (!NewParm) 5725 return true; 5726 5727 if (ParamInfos) 5728 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5729 OutParamTypes.push_back(NewParm->getType()); 5730 if (PVars) 5731 PVars->push_back(NewParm); 5732 } 5733 5734 // The next parameter should have the same adjustment as the 5735 // last thing we pushed, but we post-incremented indexAdjustment 5736 // on every push. Also, if we push nothing, the adjustment should 5737 // go down by one. 5738 indexAdjustment--; 5739 5740 // We're done with the pack expansion. 5741 continue; 5742 } 5743 5744 // We'll substitute the parameter now without expanding the pack 5745 // expansion. 5746 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5747 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5748 indexAdjustment, 5749 NumExpansions, 5750 /*ExpectParameterPack=*/true); 5751 assert(NewParm->isParameterPack() && 5752 "Parameter pack no longer a parameter pack after " 5753 "transformation."); 5754 } else { 5755 NewParm = getDerived().TransformFunctionTypeParam( 5756 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5757 } 5758 5759 if (!NewParm) 5760 return true; 5761 5762 if (ParamInfos) 5763 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5764 OutParamTypes.push_back(NewParm->getType()); 5765 if (PVars) 5766 PVars->push_back(NewParm); 5767 continue; 5768 } 5769 5770 // Deal with the possibility that we don't have a parameter 5771 // declaration for this parameter. 5772 QualType OldType = ParamTypes[i]; 5773 bool IsPackExpansion = false; 5774 Optional<unsigned> NumExpansions; 5775 QualType NewType; 5776 if (const PackExpansionType *Expansion 5777 = dyn_cast<PackExpansionType>(OldType)) { 5778 // We have a function parameter pack that may need to be expanded. 5779 QualType Pattern = Expansion->getPattern(); 5780 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5781 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5782 5783 // Determine whether we should expand the parameter packs. 5784 bool ShouldExpand = false; 5785 bool RetainExpansion = false; 5786 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5787 Unexpanded, 5788 ShouldExpand, 5789 RetainExpansion, 5790 NumExpansions)) { 5791 return true; 5792 } 5793 5794 if (ShouldExpand) { 5795 // Expand the function parameter pack into multiple, separate 5796 // parameters. 5797 for (unsigned I = 0; I != *NumExpansions; ++I) { 5798 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5799 QualType NewType = getDerived().TransformType(Pattern); 5800 if (NewType.isNull()) 5801 return true; 5802 5803 if (NewType->containsUnexpandedParameterPack()) { 5804 NewType = 5805 getSema().getASTContext().getPackExpansionType(NewType, None); 5806 5807 if (NewType.isNull()) 5808 return true; 5809 } 5810 5811 if (ParamInfos) 5812 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5813 OutParamTypes.push_back(NewType); 5814 if (PVars) 5815 PVars->push_back(nullptr); 5816 } 5817 5818 // We're done with the pack expansion. 5819 continue; 5820 } 5821 5822 // If we're supposed to retain a pack expansion, do so by temporarily 5823 // forgetting the partially-substituted parameter pack. 5824 if (RetainExpansion) { 5825 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5826 QualType NewType = getDerived().TransformType(Pattern); 5827 if (NewType.isNull()) 5828 return true; 5829 5830 if (ParamInfos) 5831 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5832 OutParamTypes.push_back(NewType); 5833 if (PVars) 5834 PVars->push_back(nullptr); 5835 } 5836 5837 // We'll substitute the parameter now without expanding the pack 5838 // expansion. 5839 OldType = Expansion->getPattern(); 5840 IsPackExpansion = true; 5841 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5842 NewType = getDerived().TransformType(OldType); 5843 } else { 5844 NewType = getDerived().TransformType(OldType); 5845 } 5846 5847 if (NewType.isNull()) 5848 return true; 5849 5850 if (IsPackExpansion) 5851 NewType = getSema().Context.getPackExpansionType(NewType, 5852 NumExpansions); 5853 5854 if (ParamInfos) 5855 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5856 OutParamTypes.push_back(NewType); 5857 if (PVars) 5858 PVars->push_back(nullptr); 5859 } 5860 5861 #ifndef NDEBUG 5862 if (PVars) { 5863 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5864 if (ParmVarDecl *parm = (*PVars)[i]) 5865 assert(parm->getFunctionScopeIndex() == i); 5866 } 5867 #endif 5868 5869 return false; 5870 } 5871 5872 template<typename Derived> 5873 QualType 5874 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5875 FunctionProtoTypeLoc TL) { 5876 SmallVector<QualType, 4> ExceptionStorage; 5877 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5878 return getDerived().TransformFunctionProtoType( 5879 TLB, TL, nullptr, Qualifiers(), 5880 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5881 return This->getDerived().TransformExceptionSpec( 5882 TL.getBeginLoc(), ESI, ExceptionStorage, Changed); 5883 }); 5884 } 5885 5886 template<typename Derived> template<typename Fn> 5887 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5888 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5889 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5890 5891 // Transform the parameters and return type. 5892 // 5893 // We are required to instantiate the params and return type in source order. 5894 // When the function has a trailing return type, we instantiate the 5895 // parameters before the return type, since the return type can then refer 5896 // to the parameters themselves (via decltype, sizeof, etc.). 5897 // 5898 SmallVector<QualType, 4> ParamTypes; 5899 SmallVector<ParmVarDecl*, 4> ParamDecls; 5900 Sema::ExtParameterInfoBuilder ExtParamInfos; 5901 const FunctionProtoType *T = TL.getTypePtr(); 5902 5903 QualType ResultType; 5904 5905 if (T->hasTrailingReturn()) { 5906 if (getDerived().TransformFunctionTypeParams( 5907 TL.getBeginLoc(), TL.getParams(), 5908 TL.getTypePtr()->param_type_begin(), 5909 T->getExtParameterInfosOrNull(), 5910 ParamTypes, &ParamDecls, ExtParamInfos)) 5911 return QualType(); 5912 5913 { 5914 // C++11 [expr.prim.general]p3: 5915 // If a declaration declares a member function or member function 5916 // template of a class X, the expression this is a prvalue of type 5917 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5918 // and the end of the function-definition, member-declarator, or 5919 // declarator. 5920 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5921 5922 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5923 if (ResultType.isNull()) 5924 return QualType(); 5925 } 5926 } 5927 else { 5928 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5929 if (ResultType.isNull()) 5930 return QualType(); 5931 5932 if (getDerived().TransformFunctionTypeParams( 5933 TL.getBeginLoc(), TL.getParams(), 5934 TL.getTypePtr()->param_type_begin(), 5935 T->getExtParameterInfosOrNull(), 5936 ParamTypes, &ParamDecls, ExtParamInfos)) 5937 return QualType(); 5938 } 5939 5940 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5941 5942 bool EPIChanged = false; 5943 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5944 return QualType(); 5945 5946 // Handle extended parameter information. 5947 if (auto NewExtParamInfos = 5948 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5949 if (!EPI.ExtParameterInfos || 5950 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5951 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5952 EPIChanged = true; 5953 } 5954 EPI.ExtParameterInfos = NewExtParamInfos; 5955 } else if (EPI.ExtParameterInfos) { 5956 EPIChanged = true; 5957 EPI.ExtParameterInfos = nullptr; 5958 } 5959 5960 QualType Result = TL.getType(); 5961 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5962 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5963 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5964 if (Result.isNull()) 5965 return QualType(); 5966 } 5967 5968 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5969 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5970 NewTL.setLParenLoc(TL.getLParenLoc()); 5971 NewTL.setRParenLoc(TL.getRParenLoc()); 5972 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5973 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5974 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5975 NewTL.setParam(i, ParamDecls[i]); 5976 5977 return Result; 5978 } 5979 5980 template<typename Derived> 5981 bool TreeTransform<Derived>::TransformExceptionSpec( 5982 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5983 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5984 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5985 5986 // Instantiate a dynamic noexcept expression, if any. 5987 if (isComputedNoexcept(ESI.Type)) { 5988 EnterExpressionEvaluationContext Unevaluated( 5989 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5990 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5991 if (NoexceptExpr.isInvalid()) 5992 return true; 5993 5994 ExceptionSpecificationType EST = ESI.Type; 5995 NoexceptExpr = 5996 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 5997 if (NoexceptExpr.isInvalid()) 5998 return true; 5999 6000 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 6001 Changed = true; 6002 ESI.NoexceptExpr = NoexceptExpr.get(); 6003 ESI.Type = EST; 6004 } 6005 6006 if (ESI.Type != EST_Dynamic) 6007 return false; 6008 6009 // Instantiate a dynamic exception specification's type. 6010 for (QualType T : ESI.Exceptions) { 6011 if (const PackExpansionType *PackExpansion = 6012 T->getAs<PackExpansionType>()) { 6013 Changed = true; 6014 6015 // We have a pack expansion. Instantiate it. 6016 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6017 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6018 Unexpanded); 6019 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6020 6021 // Determine whether the set of unexpanded parameter packs can and 6022 // should 6023 // be expanded. 6024 bool Expand = false; 6025 bool RetainExpansion = false; 6026 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6027 // FIXME: Track the location of the ellipsis (and track source location 6028 // information for the types in the exception specification in general). 6029 if (getDerived().TryExpandParameterPacks( 6030 Loc, SourceRange(), Unexpanded, Expand, 6031 RetainExpansion, NumExpansions)) 6032 return true; 6033 6034 if (!Expand) { 6035 // We can't expand this pack expansion into separate arguments yet; 6036 // just substitute into the pattern and create a new pack expansion 6037 // type. 6038 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6039 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6040 if (U.isNull()) 6041 return true; 6042 6043 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6044 Exceptions.push_back(U); 6045 continue; 6046 } 6047 6048 // Substitute into the pack expansion pattern for each slice of the 6049 // pack. 6050 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6051 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6052 6053 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6054 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6055 return true; 6056 6057 Exceptions.push_back(U); 6058 } 6059 } else { 6060 QualType U = getDerived().TransformType(T); 6061 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6062 return true; 6063 if (T != U) 6064 Changed = true; 6065 6066 Exceptions.push_back(U); 6067 } 6068 } 6069 6070 ESI.Exceptions = Exceptions; 6071 if (ESI.Exceptions.empty()) 6072 ESI.Type = EST_DynamicNone; 6073 return false; 6074 } 6075 6076 template<typename Derived> 6077 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6078 TypeLocBuilder &TLB, 6079 FunctionNoProtoTypeLoc TL) { 6080 const FunctionNoProtoType *T = TL.getTypePtr(); 6081 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6082 if (ResultType.isNull()) 6083 return QualType(); 6084 6085 QualType Result = TL.getType(); 6086 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6087 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6088 6089 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6090 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6091 NewTL.setLParenLoc(TL.getLParenLoc()); 6092 NewTL.setRParenLoc(TL.getRParenLoc()); 6093 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6094 6095 return Result; 6096 } 6097 6098 template <typename Derived> 6099 QualType TreeTransform<Derived>::TransformUnresolvedUsingType( 6100 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) { 6101 const UnresolvedUsingType *T = TL.getTypePtr(); 6102 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6103 if (!D) 6104 return QualType(); 6105 6106 QualType Result = TL.getType(); 6107 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6108 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6109 if (Result.isNull()) 6110 return QualType(); 6111 } 6112 6113 // We might get an arbitrary type spec type back. We should at 6114 // least always get a type spec type, though. 6115 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6116 NewTL.setNameLoc(TL.getNameLoc()); 6117 6118 return Result; 6119 } 6120 6121 template <typename Derived> 6122 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB, 6123 UsingTypeLoc TL) { 6124 const UsingType *T = TL.getTypePtr(); 6125 6126 auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl( 6127 TL.getLocalSourceRange().getBegin(), T->getFoundDecl())); 6128 if (!Found) 6129 return QualType(); 6130 6131 QualType Underlying = getDerived().TransformType(T->desugar()); 6132 if (Underlying.isNull()) 6133 return QualType(); 6134 6135 QualType Result = TL.getType(); 6136 if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() || 6137 Underlying != T->getUnderlyingType()) { 6138 Result = getDerived().RebuildUsingType(Found, Underlying); 6139 if (Result.isNull()) 6140 return QualType(); 6141 } 6142 6143 TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc()); 6144 return Result; 6145 } 6146 6147 template<typename Derived> 6148 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6149 TypedefTypeLoc TL) { 6150 const TypedefType *T = TL.getTypePtr(); 6151 TypedefNameDecl *Typedef 6152 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6153 T->getDecl())); 6154 if (!Typedef) 6155 return QualType(); 6156 6157 QualType Result = TL.getType(); 6158 if (getDerived().AlwaysRebuild() || 6159 Typedef != T->getDecl()) { 6160 Result = getDerived().RebuildTypedefType(Typedef); 6161 if (Result.isNull()) 6162 return QualType(); 6163 } 6164 6165 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6166 NewTL.setNameLoc(TL.getNameLoc()); 6167 6168 return Result; 6169 } 6170 6171 template<typename Derived> 6172 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6173 TypeOfExprTypeLoc TL) { 6174 // typeof expressions are not potentially evaluated contexts 6175 EnterExpressionEvaluationContext Unevaluated( 6176 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6177 Sema::ReuseLambdaContextDecl); 6178 6179 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6180 if (E.isInvalid()) 6181 return QualType(); 6182 6183 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6184 if (E.isInvalid()) 6185 return QualType(); 6186 6187 QualType Result = TL.getType(); 6188 if (getDerived().AlwaysRebuild() || 6189 E.get() != TL.getUnderlyingExpr()) { 6190 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6191 if (Result.isNull()) 6192 return QualType(); 6193 } 6194 else E.get(); 6195 6196 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6197 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6198 NewTL.setLParenLoc(TL.getLParenLoc()); 6199 NewTL.setRParenLoc(TL.getRParenLoc()); 6200 6201 return Result; 6202 } 6203 6204 template<typename Derived> 6205 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6206 TypeOfTypeLoc TL) { 6207 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6208 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6209 if (!New_Under_TI) 6210 return QualType(); 6211 6212 QualType Result = TL.getType(); 6213 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6214 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6215 if (Result.isNull()) 6216 return QualType(); 6217 } 6218 6219 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6220 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6221 NewTL.setLParenLoc(TL.getLParenLoc()); 6222 NewTL.setRParenLoc(TL.getRParenLoc()); 6223 NewTL.setUnderlyingTInfo(New_Under_TI); 6224 6225 return Result; 6226 } 6227 6228 template<typename Derived> 6229 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6230 DecltypeTypeLoc TL) { 6231 const DecltypeType *T = TL.getTypePtr(); 6232 6233 // decltype expressions are not potentially evaluated contexts 6234 EnterExpressionEvaluationContext Unevaluated( 6235 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6236 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6237 6238 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6239 if (E.isInvalid()) 6240 return QualType(); 6241 6242 E = getSema().ActOnDecltypeExpression(E.get()); 6243 if (E.isInvalid()) 6244 return QualType(); 6245 6246 QualType Result = TL.getType(); 6247 if (getDerived().AlwaysRebuild() || 6248 E.get() != T->getUnderlyingExpr()) { 6249 Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc()); 6250 if (Result.isNull()) 6251 return QualType(); 6252 } 6253 else E.get(); 6254 6255 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6256 NewTL.setDecltypeLoc(TL.getDecltypeLoc()); 6257 NewTL.setRParenLoc(TL.getRParenLoc()); 6258 return Result; 6259 } 6260 6261 template<typename Derived> 6262 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6263 TypeLocBuilder &TLB, 6264 UnaryTransformTypeLoc TL) { 6265 QualType Result = TL.getType(); 6266 if (Result->isDependentType()) { 6267 const UnaryTransformType *T = TL.getTypePtr(); 6268 QualType NewBase = 6269 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6270 Result = getDerived().RebuildUnaryTransformType(NewBase, 6271 T->getUTTKind(), 6272 TL.getKWLoc()); 6273 if (Result.isNull()) 6274 return QualType(); 6275 } 6276 6277 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6278 NewTL.setKWLoc(TL.getKWLoc()); 6279 NewTL.setParensRange(TL.getParensRange()); 6280 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6281 return Result; 6282 } 6283 6284 template<typename Derived> 6285 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6286 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6287 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6288 6289 CXXScopeSpec SS; 6290 TemplateName TemplateName = getDerived().TransformTemplateName( 6291 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6292 if (TemplateName.isNull()) 6293 return QualType(); 6294 6295 QualType OldDeduced = T->getDeducedType(); 6296 QualType NewDeduced; 6297 if (!OldDeduced.isNull()) { 6298 NewDeduced = getDerived().TransformType(OldDeduced); 6299 if (NewDeduced.isNull()) 6300 return QualType(); 6301 } 6302 6303 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6304 TemplateName, NewDeduced); 6305 if (Result.isNull()) 6306 return QualType(); 6307 6308 DeducedTemplateSpecializationTypeLoc NewTL = 6309 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6310 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6311 6312 return Result; 6313 } 6314 6315 template<typename Derived> 6316 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6317 RecordTypeLoc TL) { 6318 const RecordType *T = TL.getTypePtr(); 6319 RecordDecl *Record 6320 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6321 T->getDecl())); 6322 if (!Record) 6323 return QualType(); 6324 6325 QualType Result = TL.getType(); 6326 if (getDerived().AlwaysRebuild() || 6327 Record != T->getDecl()) { 6328 Result = getDerived().RebuildRecordType(Record); 6329 if (Result.isNull()) 6330 return QualType(); 6331 } 6332 6333 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6334 NewTL.setNameLoc(TL.getNameLoc()); 6335 6336 return Result; 6337 } 6338 6339 template<typename Derived> 6340 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6341 EnumTypeLoc TL) { 6342 const EnumType *T = TL.getTypePtr(); 6343 EnumDecl *Enum 6344 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6345 T->getDecl())); 6346 if (!Enum) 6347 return QualType(); 6348 6349 QualType Result = TL.getType(); 6350 if (getDerived().AlwaysRebuild() || 6351 Enum != T->getDecl()) { 6352 Result = getDerived().RebuildEnumType(Enum); 6353 if (Result.isNull()) 6354 return QualType(); 6355 } 6356 6357 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6358 NewTL.setNameLoc(TL.getNameLoc()); 6359 6360 return Result; 6361 } 6362 6363 template<typename Derived> 6364 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6365 TypeLocBuilder &TLB, 6366 InjectedClassNameTypeLoc TL) { 6367 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6368 TL.getTypePtr()->getDecl()); 6369 if (!D) return QualType(); 6370 6371 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6372 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6373 return T; 6374 } 6375 6376 template<typename Derived> 6377 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6378 TypeLocBuilder &TLB, 6379 TemplateTypeParmTypeLoc TL) { 6380 return TransformTypeSpecType(TLB, TL); 6381 } 6382 6383 template<typename Derived> 6384 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6385 TypeLocBuilder &TLB, 6386 SubstTemplateTypeParmTypeLoc TL) { 6387 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6388 6389 // Substitute into the replacement type, which itself might involve something 6390 // that needs to be transformed. This only tends to occur with default 6391 // template arguments of template template parameters. 6392 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6393 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6394 if (Replacement.isNull()) 6395 return QualType(); 6396 6397 // Always canonicalize the replacement type. 6398 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6399 QualType Result 6400 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6401 Replacement); 6402 6403 // Propagate type-source information. 6404 SubstTemplateTypeParmTypeLoc NewTL 6405 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6406 NewTL.setNameLoc(TL.getNameLoc()); 6407 return Result; 6408 6409 } 6410 6411 template<typename Derived> 6412 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6413 TypeLocBuilder &TLB, 6414 SubstTemplateTypeParmPackTypeLoc TL) { 6415 return TransformTypeSpecType(TLB, TL); 6416 } 6417 6418 template<typename Derived> 6419 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6420 TypeLocBuilder &TLB, 6421 TemplateSpecializationTypeLoc TL) { 6422 const TemplateSpecializationType *T = TL.getTypePtr(); 6423 6424 // The nested-name-specifier never matters in a TemplateSpecializationType, 6425 // because we can't have a dependent nested-name-specifier anyway. 6426 CXXScopeSpec SS; 6427 TemplateName Template 6428 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6429 TL.getTemplateNameLoc()); 6430 if (Template.isNull()) 6431 return QualType(); 6432 6433 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6434 } 6435 6436 template<typename Derived> 6437 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6438 AtomicTypeLoc TL) { 6439 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6440 if (ValueType.isNull()) 6441 return QualType(); 6442 6443 QualType Result = TL.getType(); 6444 if (getDerived().AlwaysRebuild() || 6445 ValueType != TL.getValueLoc().getType()) { 6446 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6447 if (Result.isNull()) 6448 return QualType(); 6449 } 6450 6451 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6452 NewTL.setKWLoc(TL.getKWLoc()); 6453 NewTL.setLParenLoc(TL.getLParenLoc()); 6454 NewTL.setRParenLoc(TL.getRParenLoc()); 6455 6456 return Result; 6457 } 6458 6459 template <typename Derived> 6460 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6461 PipeTypeLoc TL) { 6462 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6463 if (ValueType.isNull()) 6464 return QualType(); 6465 6466 QualType Result = TL.getType(); 6467 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6468 const PipeType *PT = Result->castAs<PipeType>(); 6469 bool isReadPipe = PT->isReadOnly(); 6470 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6471 if (Result.isNull()) 6472 return QualType(); 6473 } 6474 6475 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6476 NewTL.setKWLoc(TL.getKWLoc()); 6477 6478 return Result; 6479 } 6480 6481 template <typename Derived> 6482 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB, 6483 BitIntTypeLoc TL) { 6484 const BitIntType *EIT = TL.getTypePtr(); 6485 QualType Result = TL.getType(); 6486 6487 if (getDerived().AlwaysRebuild()) { 6488 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(), 6489 EIT->getNumBits(), TL.getNameLoc()); 6490 if (Result.isNull()) 6491 return QualType(); 6492 } 6493 6494 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6495 NewTL.setNameLoc(TL.getNameLoc()); 6496 return Result; 6497 } 6498 6499 template <typename Derived> 6500 QualType TreeTransform<Derived>::TransformDependentBitIntType( 6501 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) { 6502 const DependentBitIntType *EIT = TL.getTypePtr(); 6503 6504 EnterExpressionEvaluationContext Unevaluated( 6505 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6506 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6507 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6508 6509 if (BitsExpr.isInvalid()) 6510 return QualType(); 6511 6512 QualType Result = TL.getType(); 6513 6514 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6515 Result = getDerived().RebuildDependentBitIntType( 6516 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6517 6518 if (Result.isNull()) 6519 return QualType(); 6520 } 6521 6522 if (isa<DependentBitIntType>(Result)) { 6523 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result); 6524 NewTL.setNameLoc(TL.getNameLoc()); 6525 } else { 6526 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6527 NewTL.setNameLoc(TL.getNameLoc()); 6528 } 6529 return Result; 6530 } 6531 6532 /// Simple iterator that traverses the template arguments in a 6533 /// container that provides a \c getArgLoc() member function. 6534 /// 6535 /// This iterator is intended to be used with the iterator form of 6536 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6537 template<typename ArgLocContainer> 6538 class TemplateArgumentLocContainerIterator { 6539 ArgLocContainer *Container; 6540 unsigned Index; 6541 6542 public: 6543 typedef TemplateArgumentLoc value_type; 6544 typedef TemplateArgumentLoc reference; 6545 typedef int difference_type; 6546 typedef std::input_iterator_tag iterator_category; 6547 6548 class pointer { 6549 TemplateArgumentLoc Arg; 6550 6551 public: 6552 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6553 6554 const TemplateArgumentLoc *operator->() const { 6555 return &Arg; 6556 } 6557 }; 6558 6559 6560 TemplateArgumentLocContainerIterator() {} 6561 6562 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6563 unsigned Index) 6564 : Container(&Container), Index(Index) { } 6565 6566 TemplateArgumentLocContainerIterator &operator++() { 6567 ++Index; 6568 return *this; 6569 } 6570 6571 TemplateArgumentLocContainerIterator operator++(int) { 6572 TemplateArgumentLocContainerIterator Old(*this); 6573 ++(*this); 6574 return Old; 6575 } 6576 6577 TemplateArgumentLoc operator*() const { 6578 return Container->getArgLoc(Index); 6579 } 6580 6581 pointer operator->() const { 6582 return pointer(Container->getArgLoc(Index)); 6583 } 6584 6585 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6586 const TemplateArgumentLocContainerIterator &Y) { 6587 return X.Container == Y.Container && X.Index == Y.Index; 6588 } 6589 6590 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6591 const TemplateArgumentLocContainerIterator &Y) { 6592 return !(X == Y); 6593 } 6594 }; 6595 6596 template<typename Derived> 6597 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6598 AutoTypeLoc TL) { 6599 const AutoType *T = TL.getTypePtr(); 6600 QualType OldDeduced = T->getDeducedType(); 6601 QualType NewDeduced; 6602 if (!OldDeduced.isNull()) { 6603 NewDeduced = getDerived().TransformType(OldDeduced); 6604 if (NewDeduced.isNull()) 6605 return QualType(); 6606 } 6607 6608 ConceptDecl *NewCD = nullptr; 6609 TemplateArgumentListInfo NewTemplateArgs; 6610 NestedNameSpecifierLoc NewNestedNameSpec; 6611 if (T->isConstrained()) { 6612 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6613 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6614 6615 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6616 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6617 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6618 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6619 ArgIterator(TL, 6620 TL.getNumArgs()), 6621 NewTemplateArgs)) 6622 return QualType(); 6623 6624 if (TL.getNestedNameSpecifierLoc()) { 6625 NewNestedNameSpec 6626 = getDerived().TransformNestedNameSpecifierLoc( 6627 TL.getNestedNameSpecifierLoc()); 6628 if (!NewNestedNameSpec) 6629 return QualType(); 6630 } 6631 } 6632 6633 QualType Result = TL.getType(); 6634 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6635 T->isDependentType() || T->isConstrained()) { 6636 // FIXME: Maybe don't rebuild if all template arguments are the same. 6637 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6638 NewArgList.reserve(NewTemplateArgs.size()); 6639 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6640 NewArgList.push_back(ArgLoc.getArgument()); 6641 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6642 NewArgList); 6643 if (Result.isNull()) 6644 return QualType(); 6645 } 6646 6647 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6648 NewTL.setNameLoc(TL.getNameLoc()); 6649 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6650 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6651 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6652 NewTL.setFoundDecl(TL.getFoundDecl()); 6653 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6654 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6655 NewTL.setRParenLoc(TL.getRParenLoc()); 6656 for (unsigned I = 0; I < NewTL.getNumArgs(); ++I) 6657 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6658 6659 return Result; 6660 } 6661 6662 template <typename Derived> 6663 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6664 TypeLocBuilder &TLB, 6665 TemplateSpecializationTypeLoc TL, 6666 TemplateName Template) { 6667 TemplateArgumentListInfo NewTemplateArgs; 6668 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6669 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6670 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6671 ArgIterator; 6672 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6673 ArgIterator(TL, TL.getNumArgs()), 6674 NewTemplateArgs)) 6675 return QualType(); 6676 6677 // FIXME: maybe don't rebuild if all the template arguments are the same. 6678 6679 QualType Result = 6680 getDerived().RebuildTemplateSpecializationType(Template, 6681 TL.getTemplateNameLoc(), 6682 NewTemplateArgs); 6683 6684 if (!Result.isNull()) { 6685 // Specializations of template template parameters are represented as 6686 // TemplateSpecializationTypes, and substitution of type alias templates 6687 // within a dependent context can transform them into 6688 // DependentTemplateSpecializationTypes. 6689 if (isa<DependentTemplateSpecializationType>(Result)) { 6690 DependentTemplateSpecializationTypeLoc NewTL 6691 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6692 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6693 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6694 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6695 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6696 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6697 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6698 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6699 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6700 return Result; 6701 } 6702 6703 TemplateSpecializationTypeLoc NewTL 6704 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6705 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6706 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6707 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6708 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6709 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6710 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6711 } 6712 6713 return Result; 6714 } 6715 6716 template <typename Derived> 6717 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6718 TypeLocBuilder &TLB, 6719 DependentTemplateSpecializationTypeLoc TL, 6720 TemplateName Template, 6721 CXXScopeSpec &SS) { 6722 TemplateArgumentListInfo NewTemplateArgs; 6723 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6724 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6725 typedef TemplateArgumentLocContainerIterator< 6726 DependentTemplateSpecializationTypeLoc> ArgIterator; 6727 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6728 ArgIterator(TL, TL.getNumArgs()), 6729 NewTemplateArgs)) 6730 return QualType(); 6731 6732 // FIXME: maybe don't rebuild if all the template arguments are the same. 6733 6734 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6735 QualType Result 6736 = getSema().Context.getDependentTemplateSpecializationType( 6737 TL.getTypePtr()->getKeyword(), 6738 DTN->getQualifier(), 6739 DTN->getIdentifier(), 6740 NewTemplateArgs); 6741 6742 DependentTemplateSpecializationTypeLoc NewTL 6743 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6744 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6745 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6746 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6747 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6748 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6749 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6750 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6751 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6752 return Result; 6753 } 6754 6755 QualType Result 6756 = getDerived().RebuildTemplateSpecializationType(Template, 6757 TL.getTemplateNameLoc(), 6758 NewTemplateArgs); 6759 6760 if (!Result.isNull()) { 6761 /// FIXME: Wrap this in an elaborated-type-specifier? 6762 TemplateSpecializationTypeLoc NewTL 6763 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6764 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6765 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6766 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6767 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6768 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6769 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6770 } 6771 6772 return Result; 6773 } 6774 6775 template<typename Derived> 6776 QualType 6777 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6778 ElaboratedTypeLoc TL) { 6779 const ElaboratedType *T = TL.getTypePtr(); 6780 6781 NestedNameSpecifierLoc QualifierLoc; 6782 // NOTE: the qualifier in an ElaboratedType is optional. 6783 if (TL.getQualifierLoc()) { 6784 QualifierLoc 6785 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6786 if (!QualifierLoc) 6787 return QualType(); 6788 } 6789 6790 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6791 if (NamedT.isNull()) 6792 return QualType(); 6793 6794 // C++0x [dcl.type.elab]p2: 6795 // If the identifier resolves to a typedef-name or the simple-template-id 6796 // resolves to an alias template specialization, the 6797 // elaborated-type-specifier is ill-formed. 6798 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6799 if (const TemplateSpecializationType *TST = 6800 NamedT->getAs<TemplateSpecializationType>()) { 6801 TemplateName Template = TST->getTemplateName(); 6802 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6803 Template.getAsTemplateDecl())) { 6804 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6805 diag::err_tag_reference_non_tag) 6806 << TAT << Sema::NTK_TypeAliasTemplate 6807 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6808 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6809 } 6810 } 6811 } 6812 6813 QualType Result = TL.getType(); 6814 if (getDerived().AlwaysRebuild() || 6815 QualifierLoc != TL.getQualifierLoc() || 6816 NamedT != T->getNamedType()) { 6817 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6818 T->getKeyword(), 6819 QualifierLoc, NamedT); 6820 if (Result.isNull()) 6821 return QualType(); 6822 } 6823 6824 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6825 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6826 NewTL.setQualifierLoc(QualifierLoc); 6827 return Result; 6828 } 6829 6830 template<typename Derived> 6831 QualType TreeTransform<Derived>::TransformAttributedType( 6832 TypeLocBuilder &TLB, 6833 AttributedTypeLoc TL) { 6834 const AttributedType *oldType = TL.getTypePtr(); 6835 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6836 if (modifiedType.isNull()) 6837 return QualType(); 6838 6839 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6840 const Attr *oldAttr = TL.getAttr(); 6841 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6842 if (oldAttr && !newAttr) 6843 return QualType(); 6844 6845 QualType result = TL.getType(); 6846 6847 // FIXME: dependent operand expressions? 6848 if (getDerived().AlwaysRebuild() || 6849 modifiedType != oldType->getModifiedType()) { 6850 // TODO: this is really lame; we should really be rebuilding the 6851 // equivalent type from first principles. 6852 QualType equivalentType 6853 = getDerived().TransformType(oldType->getEquivalentType()); 6854 if (equivalentType.isNull()) 6855 return QualType(); 6856 6857 // Check whether we can add nullability; it is only represented as 6858 // type sugar, and therefore cannot be diagnosed in any other way. 6859 if (auto nullability = oldType->getImmediateNullability()) { 6860 if (!modifiedType->canHaveNullability()) { 6861 SemaRef.Diag(TL.getAttr()->getLocation(), 6862 diag::err_nullability_nonpointer) 6863 << DiagNullabilityKind(*nullability, false) << modifiedType; 6864 return QualType(); 6865 } 6866 } 6867 6868 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6869 modifiedType, 6870 equivalentType); 6871 } 6872 6873 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6874 newTL.setAttr(newAttr); 6875 return result; 6876 } 6877 6878 template <typename Derived> 6879 QualType TreeTransform<Derived>::TransformBTFTagAttributedType( 6880 TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) { 6881 // The BTFTagAttributedType is available for C only. 6882 llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType"); 6883 } 6884 6885 template<typename Derived> 6886 QualType 6887 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6888 ParenTypeLoc TL) { 6889 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6890 if (Inner.isNull()) 6891 return QualType(); 6892 6893 QualType Result = TL.getType(); 6894 if (getDerived().AlwaysRebuild() || 6895 Inner != TL.getInnerLoc().getType()) { 6896 Result = getDerived().RebuildParenType(Inner); 6897 if (Result.isNull()) 6898 return QualType(); 6899 } 6900 6901 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6902 NewTL.setLParenLoc(TL.getLParenLoc()); 6903 NewTL.setRParenLoc(TL.getRParenLoc()); 6904 return Result; 6905 } 6906 6907 template <typename Derived> 6908 QualType 6909 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6910 MacroQualifiedTypeLoc TL) { 6911 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6912 if (Inner.isNull()) 6913 return QualType(); 6914 6915 QualType Result = TL.getType(); 6916 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6917 Result = 6918 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6919 if (Result.isNull()) 6920 return QualType(); 6921 } 6922 6923 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6924 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6925 return Result; 6926 } 6927 6928 template<typename Derived> 6929 QualType TreeTransform<Derived>::TransformDependentNameType( 6930 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6931 return TransformDependentNameType(TLB, TL, false); 6932 } 6933 6934 template<typename Derived> 6935 QualType TreeTransform<Derived>::TransformDependentNameType( 6936 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6937 const DependentNameType *T = TL.getTypePtr(); 6938 6939 NestedNameSpecifierLoc QualifierLoc 6940 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6941 if (!QualifierLoc) 6942 return QualType(); 6943 6944 QualType Result 6945 = getDerived().RebuildDependentNameType(T->getKeyword(), 6946 TL.getElaboratedKeywordLoc(), 6947 QualifierLoc, 6948 T->getIdentifier(), 6949 TL.getNameLoc(), 6950 DeducedTSTContext); 6951 if (Result.isNull()) 6952 return QualType(); 6953 6954 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6955 QualType NamedT = ElabT->getNamedType(); 6956 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6957 6958 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6959 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6960 NewTL.setQualifierLoc(QualifierLoc); 6961 } else { 6962 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6963 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6964 NewTL.setQualifierLoc(QualifierLoc); 6965 NewTL.setNameLoc(TL.getNameLoc()); 6966 } 6967 return Result; 6968 } 6969 6970 template<typename Derived> 6971 QualType TreeTransform<Derived>:: 6972 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6973 DependentTemplateSpecializationTypeLoc TL) { 6974 NestedNameSpecifierLoc QualifierLoc; 6975 if (TL.getQualifierLoc()) { 6976 QualifierLoc 6977 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6978 if (!QualifierLoc) 6979 return QualType(); 6980 } 6981 6982 return getDerived() 6983 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6984 } 6985 6986 template<typename Derived> 6987 QualType TreeTransform<Derived>:: 6988 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6989 DependentTemplateSpecializationTypeLoc TL, 6990 NestedNameSpecifierLoc QualifierLoc) { 6991 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6992 6993 TemplateArgumentListInfo NewTemplateArgs; 6994 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6995 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6996 6997 typedef TemplateArgumentLocContainerIterator< 6998 DependentTemplateSpecializationTypeLoc> ArgIterator; 6999 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 7000 ArgIterator(TL, TL.getNumArgs()), 7001 NewTemplateArgs)) 7002 return QualType(); 7003 7004 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 7005 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 7006 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 7007 /*AllowInjectedClassName*/ false); 7008 if (Result.isNull()) 7009 return QualType(); 7010 7011 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 7012 QualType NamedT = ElabT->getNamedType(); 7013 7014 // Copy information relevant to the template specialization. 7015 TemplateSpecializationTypeLoc NamedTL 7016 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 7017 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7018 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7019 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 7020 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 7021 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7022 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7023 7024 // Copy information relevant to the elaborated type. 7025 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7026 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7027 NewTL.setQualifierLoc(QualifierLoc); 7028 } else if (isa<DependentTemplateSpecializationType>(Result)) { 7029 DependentTemplateSpecializationTypeLoc SpecTL 7030 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 7031 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7032 SpecTL.setQualifierLoc(QualifierLoc); 7033 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7034 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7035 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7036 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7037 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7038 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7039 } else { 7040 TemplateSpecializationTypeLoc SpecTL 7041 = TLB.push<TemplateSpecializationTypeLoc>(Result); 7042 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7043 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7044 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7045 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7046 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7047 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7048 } 7049 return Result; 7050 } 7051 7052 template<typename Derived> 7053 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 7054 PackExpansionTypeLoc TL) { 7055 QualType Pattern 7056 = getDerived().TransformType(TLB, TL.getPatternLoc()); 7057 if (Pattern.isNull()) 7058 return QualType(); 7059 7060 QualType Result = TL.getType(); 7061 if (getDerived().AlwaysRebuild() || 7062 Pattern != TL.getPatternLoc().getType()) { 7063 Result = getDerived().RebuildPackExpansionType(Pattern, 7064 TL.getPatternLoc().getSourceRange(), 7065 TL.getEllipsisLoc(), 7066 TL.getTypePtr()->getNumExpansions()); 7067 if (Result.isNull()) 7068 return QualType(); 7069 } 7070 7071 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7072 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7073 return Result; 7074 } 7075 7076 template<typename Derived> 7077 QualType 7078 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7079 ObjCInterfaceTypeLoc TL) { 7080 // ObjCInterfaceType is never dependent. 7081 TLB.pushFullCopy(TL); 7082 return TL.getType(); 7083 } 7084 7085 template<typename Derived> 7086 QualType 7087 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7088 ObjCTypeParamTypeLoc TL) { 7089 const ObjCTypeParamType *T = TL.getTypePtr(); 7090 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7091 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7092 if (!OTP) 7093 return QualType(); 7094 7095 QualType Result = TL.getType(); 7096 if (getDerived().AlwaysRebuild() || 7097 OTP != T->getDecl()) { 7098 Result = getDerived().RebuildObjCTypeParamType(OTP, 7099 TL.getProtocolLAngleLoc(), 7100 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 7101 TL.getNumProtocols()), 7102 TL.getProtocolLocs(), 7103 TL.getProtocolRAngleLoc()); 7104 if (Result.isNull()) 7105 return QualType(); 7106 } 7107 7108 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7109 if (TL.getNumProtocols()) { 7110 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7111 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7112 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7113 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7114 } 7115 return Result; 7116 } 7117 7118 template<typename Derived> 7119 QualType 7120 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7121 ObjCObjectTypeLoc TL) { 7122 // Transform base type. 7123 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7124 if (BaseType.isNull()) 7125 return QualType(); 7126 7127 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7128 7129 // Transform type arguments. 7130 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7131 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7132 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7133 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7134 QualType TypeArg = TypeArgInfo->getType(); 7135 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7136 AnyChanged = true; 7137 7138 // We have a pack expansion. Instantiate it. 7139 const auto *PackExpansion = PackExpansionLoc.getType() 7140 ->castAs<PackExpansionType>(); 7141 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7142 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7143 Unexpanded); 7144 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7145 7146 // Determine whether the set of unexpanded parameter packs can 7147 // and should be expanded. 7148 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7149 bool Expand = false; 7150 bool RetainExpansion = false; 7151 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7152 if (getDerived().TryExpandParameterPacks( 7153 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7154 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7155 return QualType(); 7156 7157 if (!Expand) { 7158 // We can't expand this pack expansion into separate arguments yet; 7159 // just substitute into the pattern and create a new pack expansion 7160 // type. 7161 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7162 7163 TypeLocBuilder TypeArgBuilder; 7164 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7165 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7166 PatternLoc); 7167 if (NewPatternType.isNull()) 7168 return QualType(); 7169 7170 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7171 NewPatternType, NumExpansions); 7172 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7173 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7174 NewTypeArgInfos.push_back( 7175 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7176 continue; 7177 } 7178 7179 // Substitute into the pack expansion pattern for each slice of the 7180 // pack. 7181 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7182 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7183 7184 TypeLocBuilder TypeArgBuilder; 7185 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7186 7187 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7188 PatternLoc); 7189 if (NewTypeArg.isNull()) 7190 return QualType(); 7191 7192 NewTypeArgInfos.push_back( 7193 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7194 } 7195 7196 continue; 7197 } 7198 7199 TypeLocBuilder TypeArgBuilder; 7200 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7201 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7202 if (NewTypeArg.isNull()) 7203 return QualType(); 7204 7205 // If nothing changed, just keep the old TypeSourceInfo. 7206 if (NewTypeArg == TypeArg) { 7207 NewTypeArgInfos.push_back(TypeArgInfo); 7208 continue; 7209 } 7210 7211 NewTypeArgInfos.push_back( 7212 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7213 AnyChanged = true; 7214 } 7215 7216 QualType Result = TL.getType(); 7217 if (getDerived().AlwaysRebuild() || AnyChanged) { 7218 // Rebuild the type. 7219 Result = getDerived().RebuildObjCObjectType( 7220 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7221 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7222 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7223 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7224 7225 if (Result.isNull()) 7226 return QualType(); 7227 } 7228 7229 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7230 NewT.setHasBaseTypeAsWritten(true); 7231 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7232 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7233 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7234 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7235 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7236 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7237 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7238 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7239 return Result; 7240 } 7241 7242 template<typename Derived> 7243 QualType 7244 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7245 ObjCObjectPointerTypeLoc TL) { 7246 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7247 if (PointeeType.isNull()) 7248 return QualType(); 7249 7250 QualType Result = TL.getType(); 7251 if (getDerived().AlwaysRebuild() || 7252 PointeeType != TL.getPointeeLoc().getType()) { 7253 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7254 TL.getStarLoc()); 7255 if (Result.isNull()) 7256 return QualType(); 7257 } 7258 7259 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7260 NewT.setStarLoc(TL.getStarLoc()); 7261 return Result; 7262 } 7263 7264 //===----------------------------------------------------------------------===// 7265 // Statement transformation 7266 //===----------------------------------------------------------------------===// 7267 template<typename Derived> 7268 StmtResult 7269 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7270 return S; 7271 } 7272 7273 template<typename Derived> 7274 StmtResult 7275 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7276 return getDerived().TransformCompoundStmt(S, false); 7277 } 7278 7279 template<typename Derived> 7280 StmtResult 7281 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7282 bool IsStmtExpr) { 7283 Sema::CompoundScopeRAII CompoundScope(getSema()); 7284 7285 const Stmt *ExprResult = S->getStmtExprResult(); 7286 bool SubStmtInvalid = false; 7287 bool SubStmtChanged = false; 7288 SmallVector<Stmt*, 8> Statements; 7289 for (auto *B : S->body()) { 7290 StmtResult Result = getDerived().TransformStmt( 7291 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7292 7293 if (Result.isInvalid()) { 7294 // Immediately fail if this was a DeclStmt, since it's very 7295 // likely that this will cause problems for future statements. 7296 if (isa<DeclStmt>(B)) 7297 return StmtError(); 7298 7299 // Otherwise, just keep processing substatements and fail later. 7300 SubStmtInvalid = true; 7301 continue; 7302 } 7303 7304 SubStmtChanged = SubStmtChanged || Result.get() != B; 7305 Statements.push_back(Result.getAs<Stmt>()); 7306 } 7307 7308 if (SubStmtInvalid) 7309 return StmtError(); 7310 7311 if (!getDerived().AlwaysRebuild() && 7312 !SubStmtChanged) 7313 return S; 7314 7315 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7316 Statements, 7317 S->getRBracLoc(), 7318 IsStmtExpr); 7319 } 7320 7321 template<typename Derived> 7322 StmtResult 7323 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7324 ExprResult LHS, RHS; 7325 { 7326 EnterExpressionEvaluationContext Unevaluated( 7327 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7328 7329 // Transform the left-hand case value. 7330 LHS = getDerived().TransformExpr(S->getLHS()); 7331 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7332 if (LHS.isInvalid()) 7333 return StmtError(); 7334 7335 // Transform the right-hand case value (for the GNU case-range extension). 7336 RHS = getDerived().TransformExpr(S->getRHS()); 7337 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7338 if (RHS.isInvalid()) 7339 return StmtError(); 7340 } 7341 7342 // Build the case statement. 7343 // Case statements are always rebuilt so that they will attached to their 7344 // transformed switch statement. 7345 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7346 LHS.get(), 7347 S->getEllipsisLoc(), 7348 RHS.get(), 7349 S->getColonLoc()); 7350 if (Case.isInvalid()) 7351 return StmtError(); 7352 7353 // Transform the statement following the case 7354 StmtResult SubStmt = 7355 getDerived().TransformStmt(S->getSubStmt()); 7356 if (SubStmt.isInvalid()) 7357 return StmtError(); 7358 7359 // Attach the body to the case statement 7360 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7361 } 7362 7363 template <typename Derived> 7364 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7365 // Transform the statement following the default case 7366 StmtResult SubStmt = 7367 getDerived().TransformStmt(S->getSubStmt()); 7368 if (SubStmt.isInvalid()) 7369 return StmtError(); 7370 7371 // Default statements are always rebuilt 7372 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7373 SubStmt.get()); 7374 } 7375 7376 template<typename Derived> 7377 StmtResult 7378 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7379 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7380 if (SubStmt.isInvalid()) 7381 return StmtError(); 7382 7383 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7384 S->getDecl()); 7385 if (!LD) 7386 return StmtError(); 7387 7388 // If we're transforming "in-place" (we're not creating new local 7389 // declarations), assume we're replacing the old label statement 7390 // and clear out the reference to it. 7391 if (LD == S->getDecl()) 7392 S->getDecl()->setStmt(nullptr); 7393 7394 // FIXME: Pass the real colon location in. 7395 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7396 cast<LabelDecl>(LD), SourceLocation(), 7397 SubStmt.get()); 7398 } 7399 7400 template <typename Derived> 7401 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7402 if (!R) 7403 return R; 7404 7405 switch (R->getKind()) { 7406 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7407 #define ATTR(X) 7408 #define PRAGMA_SPELLING_ATTR(X) \ 7409 case attr::X: \ 7410 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7411 #include "clang/Basic/AttrList.inc" 7412 default: 7413 return R; 7414 } 7415 } 7416 7417 template <typename Derived> 7418 StmtResult 7419 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7420 StmtDiscardKind SDK) { 7421 bool AttrsChanged = false; 7422 SmallVector<const Attr *, 1> Attrs; 7423 7424 // Visit attributes and keep track if any are transformed. 7425 for (const auto *I : S->getAttrs()) { 7426 const Attr *R = getDerived().TransformAttr(I); 7427 AttrsChanged |= (I != R); 7428 if (R) 7429 Attrs.push_back(R); 7430 } 7431 7432 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7433 if (SubStmt.isInvalid()) 7434 return StmtError(); 7435 7436 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7437 return S; 7438 7439 // If transforming the attributes failed for all of the attributes in the 7440 // statement, don't make an AttributedStmt without attributes. 7441 if (Attrs.empty()) 7442 return SubStmt; 7443 7444 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7445 SubStmt.get()); 7446 } 7447 7448 template<typename Derived> 7449 StmtResult 7450 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7451 // Transform the initialization statement 7452 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7453 if (Init.isInvalid()) 7454 return StmtError(); 7455 7456 Sema::ConditionResult Cond; 7457 if (!S->isConsteval()) { 7458 // Transform the condition 7459 Cond = getDerived().TransformCondition( 7460 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7461 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7462 : Sema::ConditionKind::Boolean); 7463 if (Cond.isInvalid()) 7464 return StmtError(); 7465 } 7466 7467 // If this is a constexpr if, determine which arm we should instantiate. 7468 llvm::Optional<bool> ConstexprConditionValue; 7469 if (S->isConstexpr()) 7470 ConstexprConditionValue = Cond.getKnownValue(); 7471 7472 // Transform the "then" branch. 7473 StmtResult Then; 7474 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7475 Then = getDerived().TransformStmt(S->getThen()); 7476 if (Then.isInvalid()) 7477 return StmtError(); 7478 } else { 7479 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7480 } 7481 7482 // Transform the "else" branch. 7483 StmtResult Else; 7484 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7485 Else = getDerived().TransformStmt(S->getElse()); 7486 if (Else.isInvalid()) 7487 return StmtError(); 7488 } 7489 7490 if (!getDerived().AlwaysRebuild() && 7491 Init.get() == S->getInit() && 7492 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7493 Then.get() == S->getThen() && 7494 Else.get() == S->getElse()) 7495 return S; 7496 7497 return getDerived().RebuildIfStmt( 7498 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7499 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7500 } 7501 7502 template<typename Derived> 7503 StmtResult 7504 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7505 // Transform the initialization statement 7506 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7507 if (Init.isInvalid()) 7508 return StmtError(); 7509 7510 // Transform the condition. 7511 Sema::ConditionResult Cond = getDerived().TransformCondition( 7512 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7513 Sema::ConditionKind::Switch); 7514 if (Cond.isInvalid()) 7515 return StmtError(); 7516 7517 // Rebuild the switch statement. 7518 StmtResult Switch = 7519 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7520 Init.get(), Cond, S->getRParenLoc()); 7521 if (Switch.isInvalid()) 7522 return StmtError(); 7523 7524 // Transform the body of the switch statement. 7525 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7526 if (Body.isInvalid()) 7527 return StmtError(); 7528 7529 // Complete the switch statement. 7530 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7531 Body.get()); 7532 } 7533 7534 template<typename Derived> 7535 StmtResult 7536 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7537 // Transform the condition 7538 Sema::ConditionResult Cond = getDerived().TransformCondition( 7539 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7540 Sema::ConditionKind::Boolean); 7541 if (Cond.isInvalid()) 7542 return StmtError(); 7543 7544 // Transform the body 7545 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7546 if (Body.isInvalid()) 7547 return StmtError(); 7548 7549 if (!getDerived().AlwaysRebuild() && 7550 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7551 Body.get() == S->getBody()) 7552 return Owned(S); 7553 7554 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7555 Cond, S->getRParenLoc(), Body.get()); 7556 } 7557 7558 template<typename Derived> 7559 StmtResult 7560 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7561 // Transform the body 7562 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7563 if (Body.isInvalid()) 7564 return StmtError(); 7565 7566 // Transform the condition 7567 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7568 if (Cond.isInvalid()) 7569 return StmtError(); 7570 7571 if (!getDerived().AlwaysRebuild() && 7572 Cond.get() == S->getCond() && 7573 Body.get() == S->getBody()) 7574 return S; 7575 7576 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7577 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7578 S->getRParenLoc()); 7579 } 7580 7581 template<typename Derived> 7582 StmtResult 7583 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7584 if (getSema().getLangOpts().OpenMP) 7585 getSema().startOpenMPLoop(); 7586 7587 // Transform the initialization statement 7588 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7589 if (Init.isInvalid()) 7590 return StmtError(); 7591 7592 // In OpenMP loop region loop control variable must be captured and be 7593 // private. Perform analysis of first part (if any). 7594 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7595 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7596 7597 // Transform the condition 7598 Sema::ConditionResult Cond = getDerived().TransformCondition( 7599 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7600 Sema::ConditionKind::Boolean); 7601 if (Cond.isInvalid()) 7602 return StmtError(); 7603 7604 // Transform the increment 7605 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7606 if (Inc.isInvalid()) 7607 return StmtError(); 7608 7609 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7610 if (S->getInc() && !FullInc.get()) 7611 return StmtError(); 7612 7613 // Transform the body 7614 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7615 if (Body.isInvalid()) 7616 return StmtError(); 7617 7618 if (!getDerived().AlwaysRebuild() && 7619 Init.get() == S->getInit() && 7620 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7621 Inc.get() == S->getInc() && 7622 Body.get() == S->getBody()) 7623 return S; 7624 7625 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7626 Init.get(), Cond, FullInc, 7627 S->getRParenLoc(), Body.get()); 7628 } 7629 7630 template<typename Derived> 7631 StmtResult 7632 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7633 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7634 S->getLabel()); 7635 if (!LD) 7636 return StmtError(); 7637 7638 // Goto statements must always be rebuilt, to resolve the label. 7639 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7640 cast<LabelDecl>(LD)); 7641 } 7642 7643 template<typename Derived> 7644 StmtResult 7645 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7646 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7647 if (Target.isInvalid()) 7648 return StmtError(); 7649 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7650 7651 if (!getDerived().AlwaysRebuild() && 7652 Target.get() == S->getTarget()) 7653 return S; 7654 7655 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7656 Target.get()); 7657 } 7658 7659 template<typename Derived> 7660 StmtResult 7661 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7662 return S; 7663 } 7664 7665 template<typename Derived> 7666 StmtResult 7667 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7668 return S; 7669 } 7670 7671 template<typename Derived> 7672 StmtResult 7673 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7674 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7675 /*NotCopyInit*/false); 7676 if (Result.isInvalid()) 7677 return StmtError(); 7678 7679 // FIXME: We always rebuild the return statement because there is no way 7680 // to tell whether the return type of the function has changed. 7681 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7682 } 7683 7684 template<typename Derived> 7685 StmtResult 7686 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7687 bool DeclChanged = false; 7688 SmallVector<Decl *, 4> Decls; 7689 for (auto *D : S->decls()) { 7690 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7691 if (!Transformed) 7692 return StmtError(); 7693 7694 if (Transformed != D) 7695 DeclChanged = true; 7696 7697 Decls.push_back(Transformed); 7698 } 7699 7700 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7701 return S; 7702 7703 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7704 } 7705 7706 template<typename Derived> 7707 StmtResult 7708 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7709 7710 SmallVector<Expr*, 8> Constraints; 7711 SmallVector<Expr*, 8> Exprs; 7712 SmallVector<IdentifierInfo *, 4> Names; 7713 7714 ExprResult AsmString; 7715 SmallVector<Expr*, 8> Clobbers; 7716 7717 bool ExprsChanged = false; 7718 7719 // Go through the outputs. 7720 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7721 Names.push_back(S->getOutputIdentifier(I)); 7722 7723 // No need to transform the constraint literal. 7724 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7725 7726 // Transform the output expr. 7727 Expr *OutputExpr = S->getOutputExpr(I); 7728 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7729 if (Result.isInvalid()) 7730 return StmtError(); 7731 7732 ExprsChanged |= Result.get() != OutputExpr; 7733 7734 Exprs.push_back(Result.get()); 7735 } 7736 7737 // Go through the inputs. 7738 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7739 Names.push_back(S->getInputIdentifier(I)); 7740 7741 // No need to transform the constraint literal. 7742 Constraints.push_back(S->getInputConstraintLiteral(I)); 7743 7744 // Transform the input expr. 7745 Expr *InputExpr = S->getInputExpr(I); 7746 ExprResult Result = getDerived().TransformExpr(InputExpr); 7747 if (Result.isInvalid()) 7748 return StmtError(); 7749 7750 ExprsChanged |= Result.get() != InputExpr; 7751 7752 Exprs.push_back(Result.get()); 7753 } 7754 7755 // Go through the Labels. 7756 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7757 Names.push_back(S->getLabelIdentifier(I)); 7758 7759 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7760 if (Result.isInvalid()) 7761 return StmtError(); 7762 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7763 Exprs.push_back(Result.get()); 7764 } 7765 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7766 return S; 7767 7768 // Go through the clobbers. 7769 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7770 Clobbers.push_back(S->getClobberStringLiteral(I)); 7771 7772 // No need to transform the asm string literal. 7773 AsmString = S->getAsmString(); 7774 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7775 S->isVolatile(), S->getNumOutputs(), 7776 S->getNumInputs(), Names.data(), 7777 Constraints, Exprs, AsmString.get(), 7778 Clobbers, S->getNumLabels(), 7779 S->getRParenLoc()); 7780 } 7781 7782 template<typename Derived> 7783 StmtResult 7784 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7785 ArrayRef<Token> AsmToks = 7786 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7787 7788 bool HadError = false, HadChange = false; 7789 7790 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7791 SmallVector<Expr*, 8> TransformedExprs; 7792 TransformedExprs.reserve(SrcExprs.size()); 7793 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7794 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7795 if (!Result.isUsable()) { 7796 HadError = true; 7797 } else { 7798 HadChange |= (Result.get() != SrcExprs[i]); 7799 TransformedExprs.push_back(Result.get()); 7800 } 7801 } 7802 7803 if (HadError) return StmtError(); 7804 if (!HadChange && !getDerived().AlwaysRebuild()) 7805 return Owned(S); 7806 7807 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7808 AsmToks, S->getAsmString(), 7809 S->getNumOutputs(), S->getNumInputs(), 7810 S->getAllConstraints(), S->getClobbers(), 7811 TransformedExprs, S->getEndLoc()); 7812 } 7813 7814 // C++ Coroutines TS 7815 7816 template<typename Derived> 7817 StmtResult 7818 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7819 auto *ScopeInfo = SemaRef.getCurFunction(); 7820 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7821 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7822 ScopeInfo->NeedsCoroutineSuspends && 7823 ScopeInfo->CoroutineSuspends.first == nullptr && 7824 ScopeInfo->CoroutineSuspends.second == nullptr && 7825 "expected clean scope info"); 7826 7827 // Set that we have (possibly-invalid) suspend points before we do anything 7828 // that may fail. 7829 ScopeInfo->setNeedsCoroutineSuspends(false); 7830 7831 // We re-build the coroutine promise object (and the coroutine parameters its 7832 // type and constructor depend on) based on the types used in our current 7833 // function. We must do so, and set it on the current FunctionScopeInfo, 7834 // before attempting to transform the other parts of the coroutine body 7835 // statement, such as the implicit suspend statements (because those 7836 // statements reference the FunctionScopeInfo::CoroutinePromise). 7837 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7838 return StmtError(); 7839 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7840 if (!Promise) 7841 return StmtError(); 7842 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7843 ScopeInfo->CoroutinePromise = Promise; 7844 7845 // Transform the implicit coroutine statements constructed using dependent 7846 // types during the previous parse: initial and final suspensions, the return 7847 // object, and others. We also transform the coroutine function's body. 7848 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7849 if (InitSuspend.isInvalid()) 7850 return StmtError(); 7851 StmtResult FinalSuspend = 7852 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7853 if (FinalSuspend.isInvalid() || 7854 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7855 return StmtError(); 7856 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7857 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7858 7859 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7860 if (BodyRes.isInvalid()) 7861 return StmtError(); 7862 7863 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7864 if (Builder.isInvalid()) 7865 return StmtError(); 7866 7867 Expr *ReturnObject = S->getReturnValueInit(); 7868 assert(ReturnObject && "the return object is expected to be valid"); 7869 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7870 /*NoCopyInit*/ false); 7871 if (Res.isInvalid()) 7872 return StmtError(); 7873 Builder.ReturnValue = Res.get(); 7874 7875 // If during the previous parse the coroutine still had a dependent promise 7876 // statement, we may need to build some implicit coroutine statements 7877 // (such as exception and fallthrough handlers) for the first time. 7878 if (S->hasDependentPromiseType()) { 7879 // We can only build these statements, however, if the current promise type 7880 // is not dependent. 7881 if (!Promise->getType()->isDependentType()) { 7882 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7883 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7884 "these nodes should not have been built yet"); 7885 if (!Builder.buildDependentStatements()) 7886 return StmtError(); 7887 } 7888 } else { 7889 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7890 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7891 if (Res.isInvalid()) 7892 return StmtError(); 7893 Builder.OnFallthrough = Res.get(); 7894 } 7895 7896 if (auto *OnException = S->getExceptionHandler()) { 7897 StmtResult Res = getDerived().TransformStmt(OnException); 7898 if (Res.isInvalid()) 7899 return StmtError(); 7900 Builder.OnException = Res.get(); 7901 } 7902 7903 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7904 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7905 if (Res.isInvalid()) 7906 return StmtError(); 7907 Builder.ReturnStmtOnAllocFailure = Res.get(); 7908 } 7909 7910 // Transform any additional statements we may have already built 7911 assert(S->getAllocate() && S->getDeallocate() && 7912 "allocation and deallocation calls must already be built"); 7913 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7914 if (AllocRes.isInvalid()) 7915 return StmtError(); 7916 Builder.Allocate = AllocRes.get(); 7917 7918 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7919 if (DeallocRes.isInvalid()) 7920 return StmtError(); 7921 Builder.Deallocate = DeallocRes.get(); 7922 7923 if (auto *ReturnStmt = S->getReturnStmt()) { 7924 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7925 if (Res.isInvalid()) 7926 return StmtError(); 7927 Builder.ReturnStmt = Res.get(); 7928 } 7929 } 7930 7931 return getDerived().RebuildCoroutineBodyStmt(Builder); 7932 } 7933 7934 template<typename Derived> 7935 StmtResult 7936 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7937 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7938 /*NotCopyInit*/false); 7939 if (Result.isInvalid()) 7940 return StmtError(); 7941 7942 // Always rebuild; we don't know if this needs to be injected into a new 7943 // context or if the promise type has changed. 7944 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7945 S->isImplicit()); 7946 } 7947 7948 template<typename Derived> 7949 ExprResult 7950 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7951 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7952 /*NotCopyInit*/false); 7953 if (Result.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().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7959 E->isImplicit()); 7960 } 7961 7962 template <typename Derived> 7963 ExprResult 7964 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7965 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7966 /*NotCopyInit*/ false); 7967 if (OperandResult.isInvalid()) 7968 return ExprError(); 7969 7970 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7971 E->getOperatorCoawaitLookup()); 7972 7973 if (LookupResult.isInvalid()) 7974 return ExprError(); 7975 7976 // Always rebuild; we don't know if this needs to be injected into a new 7977 // context or if the promise type has changed. 7978 return getDerived().RebuildDependentCoawaitExpr( 7979 E->getKeywordLoc(), OperandResult.get(), 7980 cast<UnresolvedLookupExpr>(LookupResult.get())); 7981 } 7982 7983 template<typename Derived> 7984 ExprResult 7985 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7986 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7987 /*NotCopyInit*/false); 7988 if (Result.isInvalid()) 7989 return ExprError(); 7990 7991 // Always rebuild; we don't know if this needs to be injected into a new 7992 // context or if the promise type has changed. 7993 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7994 } 7995 7996 // Objective-C Statements. 7997 7998 template<typename Derived> 7999 StmtResult 8000 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 8001 // Transform the body of the @try. 8002 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 8003 if (TryBody.isInvalid()) 8004 return StmtError(); 8005 8006 // Transform the @catch statements (if present). 8007 bool AnyCatchChanged = false; 8008 SmallVector<Stmt*, 8> CatchStmts; 8009 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 8010 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 8011 if (Catch.isInvalid()) 8012 return StmtError(); 8013 if (Catch.get() != S->getCatchStmt(I)) 8014 AnyCatchChanged = true; 8015 CatchStmts.push_back(Catch.get()); 8016 } 8017 8018 // Transform the @finally statement (if present). 8019 StmtResult Finally; 8020 if (S->getFinallyStmt()) { 8021 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 8022 if (Finally.isInvalid()) 8023 return StmtError(); 8024 } 8025 8026 // If nothing changed, just retain this statement. 8027 if (!getDerived().AlwaysRebuild() && 8028 TryBody.get() == S->getTryBody() && 8029 !AnyCatchChanged && 8030 Finally.get() == S->getFinallyStmt()) 8031 return S; 8032 8033 // Build a new statement. 8034 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 8035 CatchStmts, Finally.get()); 8036 } 8037 8038 template<typename Derived> 8039 StmtResult 8040 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 8041 // Transform the @catch parameter, if there is one. 8042 VarDecl *Var = nullptr; 8043 if (VarDecl *FromVar = S->getCatchParamDecl()) { 8044 TypeSourceInfo *TSInfo = nullptr; 8045 if (FromVar->getTypeSourceInfo()) { 8046 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 8047 if (!TSInfo) 8048 return StmtError(); 8049 } 8050 8051 QualType T; 8052 if (TSInfo) 8053 T = TSInfo->getType(); 8054 else { 8055 T = getDerived().TransformType(FromVar->getType()); 8056 if (T.isNull()) 8057 return StmtError(); 8058 } 8059 8060 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 8061 if (!Var) 8062 return StmtError(); 8063 } 8064 8065 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8066 if (Body.isInvalid()) 8067 return StmtError(); 8068 8069 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8070 S->getRParenLoc(), 8071 Var, Body.get()); 8072 } 8073 8074 template<typename Derived> 8075 StmtResult 8076 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8077 // Transform the body. 8078 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8079 if (Body.isInvalid()) 8080 return StmtError(); 8081 8082 // If nothing changed, just retain this statement. 8083 if (!getDerived().AlwaysRebuild() && 8084 Body.get() == S->getFinallyBody()) 8085 return S; 8086 8087 // Build a new statement. 8088 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8089 Body.get()); 8090 } 8091 8092 template<typename Derived> 8093 StmtResult 8094 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8095 ExprResult Operand; 8096 if (S->getThrowExpr()) { 8097 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8098 if (Operand.isInvalid()) 8099 return StmtError(); 8100 } 8101 8102 if (!getDerived().AlwaysRebuild() && 8103 Operand.get() == S->getThrowExpr()) 8104 return S; 8105 8106 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8107 } 8108 8109 template<typename Derived> 8110 StmtResult 8111 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8112 ObjCAtSynchronizedStmt *S) { 8113 // Transform the object we are locking. 8114 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8115 if (Object.isInvalid()) 8116 return StmtError(); 8117 Object = 8118 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8119 Object.get()); 8120 if (Object.isInvalid()) 8121 return StmtError(); 8122 8123 // Transform the body. 8124 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8125 if (Body.isInvalid()) 8126 return StmtError(); 8127 8128 // If nothing change, just retain the current statement. 8129 if (!getDerived().AlwaysRebuild() && 8130 Object.get() == S->getSynchExpr() && 8131 Body.get() == S->getSynchBody()) 8132 return S; 8133 8134 // Build a new statement. 8135 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8136 Object.get(), Body.get()); 8137 } 8138 8139 template<typename Derived> 8140 StmtResult 8141 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8142 ObjCAutoreleasePoolStmt *S) { 8143 // Transform the body. 8144 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8145 if (Body.isInvalid()) 8146 return StmtError(); 8147 8148 // If nothing changed, just retain this statement. 8149 if (!getDerived().AlwaysRebuild() && 8150 Body.get() == S->getSubStmt()) 8151 return S; 8152 8153 // Build a new statement. 8154 return getDerived().RebuildObjCAutoreleasePoolStmt( 8155 S->getAtLoc(), Body.get()); 8156 } 8157 8158 template<typename Derived> 8159 StmtResult 8160 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8161 ObjCForCollectionStmt *S) { 8162 // Transform the element statement. 8163 StmtResult Element = 8164 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8165 if (Element.isInvalid()) 8166 return StmtError(); 8167 8168 // Transform the collection expression. 8169 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8170 if (Collection.isInvalid()) 8171 return StmtError(); 8172 8173 // Transform the body. 8174 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8175 if (Body.isInvalid()) 8176 return StmtError(); 8177 8178 // If nothing changed, just retain this statement. 8179 if (!getDerived().AlwaysRebuild() && 8180 Element.get() == S->getElement() && 8181 Collection.get() == S->getCollection() && 8182 Body.get() == S->getBody()) 8183 return S; 8184 8185 // Build a new statement. 8186 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8187 Element.get(), 8188 Collection.get(), 8189 S->getRParenLoc(), 8190 Body.get()); 8191 } 8192 8193 template <typename Derived> 8194 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8195 // Transform the exception declaration, if any. 8196 VarDecl *Var = nullptr; 8197 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8198 TypeSourceInfo *T = 8199 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8200 if (!T) 8201 return StmtError(); 8202 8203 Var = getDerived().RebuildExceptionDecl( 8204 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8205 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8206 if (!Var || Var->isInvalidDecl()) 8207 return StmtError(); 8208 } 8209 8210 // Transform the actual exception handler. 8211 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8212 if (Handler.isInvalid()) 8213 return StmtError(); 8214 8215 if (!getDerived().AlwaysRebuild() && !Var && 8216 Handler.get() == S->getHandlerBlock()) 8217 return S; 8218 8219 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8220 } 8221 8222 template <typename Derived> 8223 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8224 // Transform the try block itself. 8225 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8226 if (TryBlock.isInvalid()) 8227 return StmtError(); 8228 8229 // Transform the handlers. 8230 bool HandlerChanged = false; 8231 SmallVector<Stmt *, 8> Handlers; 8232 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8233 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8234 if (Handler.isInvalid()) 8235 return StmtError(); 8236 8237 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8238 Handlers.push_back(Handler.getAs<Stmt>()); 8239 } 8240 8241 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8242 !HandlerChanged) 8243 return S; 8244 8245 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8246 Handlers); 8247 } 8248 8249 template<typename Derived> 8250 StmtResult 8251 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8252 StmtResult Init = 8253 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8254 if (Init.isInvalid()) 8255 return StmtError(); 8256 8257 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8258 if (Range.isInvalid()) 8259 return StmtError(); 8260 8261 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8262 if (Begin.isInvalid()) 8263 return StmtError(); 8264 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8265 if (End.isInvalid()) 8266 return StmtError(); 8267 8268 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8269 if (Cond.isInvalid()) 8270 return StmtError(); 8271 if (Cond.get()) 8272 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8273 if (Cond.isInvalid()) 8274 return StmtError(); 8275 if (Cond.get()) 8276 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8277 8278 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8279 if (Inc.isInvalid()) 8280 return StmtError(); 8281 if (Inc.get()) 8282 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8283 8284 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8285 if (LoopVar.isInvalid()) 8286 return StmtError(); 8287 8288 StmtResult NewStmt = S; 8289 if (getDerived().AlwaysRebuild() || 8290 Init.get() != S->getInit() || 8291 Range.get() != S->getRangeStmt() || 8292 Begin.get() != S->getBeginStmt() || 8293 End.get() != S->getEndStmt() || 8294 Cond.get() != S->getCond() || 8295 Inc.get() != S->getInc() || 8296 LoopVar.get() != S->getLoopVarStmt()) { 8297 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8298 S->getCoawaitLoc(), Init.get(), 8299 S->getColonLoc(), Range.get(), 8300 Begin.get(), End.get(), 8301 Cond.get(), 8302 Inc.get(), LoopVar.get(), 8303 S->getRParenLoc()); 8304 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8305 // Might not have attached any initializer to the loop variable. 8306 getSema().ActOnInitializerError( 8307 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8308 return StmtError(); 8309 } 8310 } 8311 8312 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8313 if (Body.isInvalid()) 8314 return StmtError(); 8315 8316 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8317 // it now so we have a new statement to attach the body to. 8318 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8319 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8320 S->getCoawaitLoc(), Init.get(), 8321 S->getColonLoc(), Range.get(), 8322 Begin.get(), End.get(), 8323 Cond.get(), 8324 Inc.get(), LoopVar.get(), 8325 S->getRParenLoc()); 8326 if (NewStmt.isInvalid()) 8327 return StmtError(); 8328 } 8329 8330 if (NewStmt.get() == S) 8331 return S; 8332 8333 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8334 } 8335 8336 template<typename Derived> 8337 StmtResult 8338 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8339 MSDependentExistsStmt *S) { 8340 // Transform the nested-name-specifier, if any. 8341 NestedNameSpecifierLoc QualifierLoc; 8342 if (S->getQualifierLoc()) { 8343 QualifierLoc 8344 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8345 if (!QualifierLoc) 8346 return StmtError(); 8347 } 8348 8349 // Transform the declaration name. 8350 DeclarationNameInfo NameInfo = S->getNameInfo(); 8351 if (NameInfo.getName()) { 8352 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8353 if (!NameInfo.getName()) 8354 return StmtError(); 8355 } 8356 8357 // Check whether anything changed. 8358 if (!getDerived().AlwaysRebuild() && 8359 QualifierLoc == S->getQualifierLoc() && 8360 NameInfo.getName() == S->getNameInfo().getName()) 8361 return S; 8362 8363 // Determine whether this name exists, if we can. 8364 CXXScopeSpec SS; 8365 SS.Adopt(QualifierLoc); 8366 bool Dependent = false; 8367 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8368 case Sema::IER_Exists: 8369 if (S->isIfExists()) 8370 break; 8371 8372 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8373 8374 case Sema::IER_DoesNotExist: 8375 if (S->isIfNotExists()) 8376 break; 8377 8378 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8379 8380 case Sema::IER_Dependent: 8381 Dependent = true; 8382 break; 8383 8384 case Sema::IER_Error: 8385 return StmtError(); 8386 } 8387 8388 // We need to continue with the instantiation, so do so now. 8389 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8390 if (SubStmt.isInvalid()) 8391 return StmtError(); 8392 8393 // If we have resolved the name, just transform to the substatement. 8394 if (!Dependent) 8395 return SubStmt; 8396 8397 // The name is still dependent, so build a dependent expression again. 8398 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8399 S->isIfExists(), 8400 QualifierLoc, 8401 NameInfo, 8402 SubStmt.get()); 8403 } 8404 8405 template<typename Derived> 8406 ExprResult 8407 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8408 NestedNameSpecifierLoc QualifierLoc; 8409 if (E->getQualifierLoc()) { 8410 QualifierLoc 8411 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8412 if (!QualifierLoc) 8413 return ExprError(); 8414 } 8415 8416 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8417 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8418 if (!PD) 8419 return ExprError(); 8420 8421 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8422 if (Base.isInvalid()) 8423 return ExprError(); 8424 8425 return new (SemaRef.getASTContext()) 8426 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8427 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8428 QualifierLoc, E->getMemberLoc()); 8429 } 8430 8431 template <typename Derived> 8432 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8433 MSPropertySubscriptExpr *E) { 8434 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8435 if (BaseRes.isInvalid()) 8436 return ExprError(); 8437 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8438 if (IdxRes.isInvalid()) 8439 return ExprError(); 8440 8441 if (!getDerived().AlwaysRebuild() && 8442 BaseRes.get() == E->getBase() && 8443 IdxRes.get() == E->getIdx()) 8444 return E; 8445 8446 return getDerived().RebuildArraySubscriptExpr( 8447 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8448 } 8449 8450 template <typename Derived> 8451 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8452 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8453 if (TryBlock.isInvalid()) 8454 return StmtError(); 8455 8456 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8457 if (Handler.isInvalid()) 8458 return StmtError(); 8459 8460 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8461 Handler.get() == S->getHandler()) 8462 return S; 8463 8464 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8465 TryBlock.get(), Handler.get()); 8466 } 8467 8468 template <typename Derived> 8469 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8470 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8471 if (Block.isInvalid()) 8472 return StmtError(); 8473 8474 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8475 } 8476 8477 template <typename Derived> 8478 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8479 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8480 if (FilterExpr.isInvalid()) 8481 return StmtError(); 8482 8483 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8484 if (Block.isInvalid()) 8485 return StmtError(); 8486 8487 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8488 Block.get()); 8489 } 8490 8491 template <typename Derived> 8492 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8493 if (isa<SEHFinallyStmt>(Handler)) 8494 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8495 else 8496 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8497 } 8498 8499 template<typename Derived> 8500 StmtResult 8501 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8502 return S; 8503 } 8504 8505 //===----------------------------------------------------------------------===// 8506 // OpenMP directive transformation 8507 //===----------------------------------------------------------------------===// 8508 8509 template <typename Derived> 8510 StmtResult 8511 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8512 // OMPCanonicalLoops are eliminated during transformation, since they will be 8513 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8514 // after transformation. 8515 return getDerived().TransformStmt(L->getLoopStmt()); 8516 } 8517 8518 template <typename Derived> 8519 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8520 OMPExecutableDirective *D) { 8521 8522 // Transform the clauses 8523 llvm::SmallVector<OMPClause *, 16> TClauses; 8524 ArrayRef<OMPClause *> Clauses = D->clauses(); 8525 TClauses.reserve(Clauses.size()); 8526 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8527 I != E; ++I) { 8528 if (*I) { 8529 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8530 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8531 getDerived().getSema().EndOpenMPClause(); 8532 if (Clause) 8533 TClauses.push_back(Clause); 8534 } else { 8535 TClauses.push_back(nullptr); 8536 } 8537 } 8538 StmtResult AssociatedStmt; 8539 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8540 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8541 /*CurScope=*/nullptr); 8542 StmtResult Body; 8543 { 8544 Sema::CompoundScopeRAII CompoundScope(getSema()); 8545 Stmt *CS; 8546 if (D->getDirectiveKind() == OMPD_atomic || 8547 D->getDirectiveKind() == OMPD_critical || 8548 D->getDirectiveKind() == OMPD_section || 8549 D->getDirectiveKind() == OMPD_master) 8550 CS = D->getAssociatedStmt(); 8551 else 8552 CS = D->getRawStmt(); 8553 Body = getDerived().TransformStmt(CS); 8554 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8555 getSema().getLangOpts().OpenMPIRBuilder) 8556 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8557 } 8558 AssociatedStmt = 8559 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8560 if (AssociatedStmt.isInvalid()) { 8561 return StmtError(); 8562 } 8563 } 8564 if (TClauses.size() != Clauses.size()) { 8565 return StmtError(); 8566 } 8567 8568 // Transform directive name for 'omp critical' directive. 8569 DeclarationNameInfo DirName; 8570 if (D->getDirectiveKind() == OMPD_critical) { 8571 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8572 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8573 } 8574 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8575 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8576 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8577 } else if (D->getDirectiveKind() == OMPD_cancel) { 8578 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8579 } 8580 8581 return getDerived().RebuildOMPExecutableDirective( 8582 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8583 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8584 } 8585 8586 template <typename Derived> 8587 StmtResult 8588 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8589 // TODO: Fix This 8590 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8591 << getOpenMPDirectiveName(D->getDirectiveKind()); 8592 return StmtError(); 8593 } 8594 8595 template <typename Derived> 8596 StmtResult 8597 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8598 DeclarationNameInfo DirName; 8599 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8600 D->getBeginLoc()); 8601 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8602 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8603 return Res; 8604 } 8605 8606 template <typename Derived> 8607 StmtResult 8608 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8609 DeclarationNameInfo DirName; 8610 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8611 D->getBeginLoc()); 8612 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8613 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8614 return Res; 8615 } 8616 8617 template <typename Derived> 8618 StmtResult 8619 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8620 DeclarationNameInfo DirName; 8621 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8622 nullptr, D->getBeginLoc()); 8623 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8624 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8625 return Res; 8626 } 8627 8628 template <typename Derived> 8629 StmtResult 8630 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8631 DeclarationNameInfo DirName; 8632 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8633 nullptr, D->getBeginLoc()); 8634 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8635 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8636 return Res; 8637 } 8638 8639 template <typename Derived> 8640 StmtResult 8641 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8642 DeclarationNameInfo DirName; 8643 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8644 D->getBeginLoc()); 8645 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8646 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8647 return Res; 8648 } 8649 8650 template <typename Derived> 8651 StmtResult 8652 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8653 DeclarationNameInfo DirName; 8654 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8655 D->getBeginLoc()); 8656 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8657 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8658 return Res; 8659 } 8660 8661 template <typename Derived> 8662 StmtResult 8663 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8664 DeclarationNameInfo DirName; 8665 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8666 D->getBeginLoc()); 8667 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8668 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8669 return Res; 8670 } 8671 8672 template <typename Derived> 8673 StmtResult 8674 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8675 DeclarationNameInfo DirName; 8676 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8677 D->getBeginLoc()); 8678 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8679 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8680 return Res; 8681 } 8682 8683 template <typename Derived> 8684 StmtResult 8685 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8686 DeclarationNameInfo DirName; 8687 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8688 D->getBeginLoc()); 8689 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8690 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8691 return Res; 8692 } 8693 8694 template <typename Derived> 8695 StmtResult 8696 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8697 DeclarationNameInfo DirName; 8698 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8699 D->getBeginLoc()); 8700 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8701 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8702 return Res; 8703 } 8704 8705 template <typename Derived> 8706 StmtResult 8707 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8708 getDerived().getSema().StartOpenMPDSABlock( 8709 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8710 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8711 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8712 return Res; 8713 } 8714 8715 template <typename Derived> 8716 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8717 OMPParallelForDirective *D) { 8718 DeclarationNameInfo DirName; 8719 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8720 nullptr, D->getBeginLoc()); 8721 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8722 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8723 return Res; 8724 } 8725 8726 template <typename Derived> 8727 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8728 OMPParallelForSimdDirective *D) { 8729 DeclarationNameInfo DirName; 8730 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8731 nullptr, D->getBeginLoc()); 8732 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8733 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8734 return Res; 8735 } 8736 8737 template <typename Derived> 8738 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8739 OMPParallelMasterDirective *D) { 8740 DeclarationNameInfo DirName; 8741 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8742 nullptr, D->getBeginLoc()); 8743 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8744 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8745 return Res; 8746 } 8747 8748 template <typename Derived> 8749 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8750 OMPParallelSectionsDirective *D) { 8751 DeclarationNameInfo DirName; 8752 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8753 nullptr, D->getBeginLoc()); 8754 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8755 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8756 return Res; 8757 } 8758 8759 template <typename Derived> 8760 StmtResult 8761 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8762 DeclarationNameInfo DirName; 8763 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8764 D->getBeginLoc()); 8765 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8766 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8767 return Res; 8768 } 8769 8770 template <typename Derived> 8771 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8772 OMPTaskyieldDirective *D) { 8773 DeclarationNameInfo DirName; 8774 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8775 D->getBeginLoc()); 8776 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8777 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8778 return Res; 8779 } 8780 8781 template <typename Derived> 8782 StmtResult 8783 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8784 DeclarationNameInfo DirName; 8785 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8786 D->getBeginLoc()); 8787 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8788 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8789 return Res; 8790 } 8791 8792 template <typename Derived> 8793 StmtResult 8794 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8795 DeclarationNameInfo DirName; 8796 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8797 D->getBeginLoc()); 8798 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8799 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8800 return Res; 8801 } 8802 8803 template <typename Derived> 8804 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8805 OMPTaskgroupDirective *D) { 8806 DeclarationNameInfo DirName; 8807 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8808 D->getBeginLoc()); 8809 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8810 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8811 return Res; 8812 } 8813 8814 template <typename Derived> 8815 StmtResult 8816 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8817 DeclarationNameInfo DirName; 8818 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8819 D->getBeginLoc()); 8820 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8821 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8822 return Res; 8823 } 8824 8825 template <typename Derived> 8826 StmtResult 8827 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8828 DeclarationNameInfo DirName; 8829 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8830 D->getBeginLoc()); 8831 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8832 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8833 return Res; 8834 } 8835 8836 template <typename Derived> 8837 StmtResult 8838 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8839 DeclarationNameInfo DirName; 8840 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8841 D->getBeginLoc()); 8842 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8843 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8844 return Res; 8845 } 8846 8847 template <typename Derived> 8848 StmtResult 8849 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8850 DeclarationNameInfo DirName; 8851 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8852 D->getBeginLoc()); 8853 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8854 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8855 return Res; 8856 } 8857 8858 template <typename Derived> 8859 StmtResult 8860 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8861 DeclarationNameInfo DirName; 8862 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8863 D->getBeginLoc()); 8864 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8865 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8866 return Res; 8867 } 8868 8869 template <typename Derived> 8870 StmtResult 8871 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8872 DeclarationNameInfo DirName; 8873 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8874 D->getBeginLoc()); 8875 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8876 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8877 return Res; 8878 } 8879 8880 template <typename Derived> 8881 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8882 OMPTargetDataDirective *D) { 8883 DeclarationNameInfo DirName; 8884 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8885 D->getBeginLoc()); 8886 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8887 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8888 return Res; 8889 } 8890 8891 template <typename Derived> 8892 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8893 OMPTargetEnterDataDirective *D) { 8894 DeclarationNameInfo DirName; 8895 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8896 nullptr, D->getBeginLoc()); 8897 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8898 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8899 return Res; 8900 } 8901 8902 template <typename Derived> 8903 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8904 OMPTargetExitDataDirective *D) { 8905 DeclarationNameInfo DirName; 8906 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8907 nullptr, D->getBeginLoc()); 8908 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8909 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8910 return Res; 8911 } 8912 8913 template <typename Derived> 8914 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8915 OMPTargetParallelDirective *D) { 8916 DeclarationNameInfo DirName; 8917 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8918 nullptr, D->getBeginLoc()); 8919 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8920 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8921 return Res; 8922 } 8923 8924 template <typename Derived> 8925 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8926 OMPTargetParallelForDirective *D) { 8927 DeclarationNameInfo DirName; 8928 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8929 nullptr, D->getBeginLoc()); 8930 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8931 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8932 return Res; 8933 } 8934 8935 template <typename Derived> 8936 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8937 OMPTargetUpdateDirective *D) { 8938 DeclarationNameInfo DirName; 8939 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8940 nullptr, D->getBeginLoc()); 8941 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8942 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8943 return Res; 8944 } 8945 8946 template <typename Derived> 8947 StmtResult 8948 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8949 DeclarationNameInfo DirName; 8950 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8951 D->getBeginLoc()); 8952 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8953 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8954 return Res; 8955 } 8956 8957 template <typename Derived> 8958 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8959 OMPCancellationPointDirective *D) { 8960 DeclarationNameInfo DirName; 8961 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8962 nullptr, D->getBeginLoc()); 8963 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8964 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8965 return Res; 8966 } 8967 8968 template <typename Derived> 8969 StmtResult 8970 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8971 DeclarationNameInfo DirName; 8972 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8973 D->getBeginLoc()); 8974 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8975 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8976 return Res; 8977 } 8978 8979 template <typename Derived> 8980 StmtResult 8981 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8982 DeclarationNameInfo DirName; 8983 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8984 D->getBeginLoc()); 8985 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8986 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8987 return Res; 8988 } 8989 8990 template <typename Derived> 8991 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8992 OMPTaskLoopSimdDirective *D) { 8993 DeclarationNameInfo DirName; 8994 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8995 nullptr, D->getBeginLoc()); 8996 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8997 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8998 return Res; 8999 } 9000 9001 template <typename Derived> 9002 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 9003 OMPMasterTaskLoopDirective *D) { 9004 DeclarationNameInfo DirName; 9005 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 9006 nullptr, D->getBeginLoc()); 9007 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9008 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9009 return Res; 9010 } 9011 9012 template <typename Derived> 9013 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 9014 OMPMasterTaskLoopSimdDirective *D) { 9015 DeclarationNameInfo DirName; 9016 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 9017 nullptr, D->getBeginLoc()); 9018 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9019 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9020 return Res; 9021 } 9022 9023 template <typename Derived> 9024 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 9025 OMPParallelMasterTaskLoopDirective *D) { 9026 DeclarationNameInfo DirName; 9027 getDerived().getSema().StartOpenMPDSABlock( 9028 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 9029 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9030 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9031 return Res; 9032 } 9033 9034 template <typename Derived> 9035 StmtResult 9036 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 9037 OMPParallelMasterTaskLoopSimdDirective *D) { 9038 DeclarationNameInfo DirName; 9039 getDerived().getSema().StartOpenMPDSABlock( 9040 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9041 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9042 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9043 return Res; 9044 } 9045 9046 template <typename Derived> 9047 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 9048 OMPDistributeDirective *D) { 9049 DeclarationNameInfo DirName; 9050 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 9051 D->getBeginLoc()); 9052 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9053 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9054 return Res; 9055 } 9056 9057 template <typename Derived> 9058 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 9059 OMPDistributeParallelForDirective *D) { 9060 DeclarationNameInfo DirName; 9061 getDerived().getSema().StartOpenMPDSABlock( 9062 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9063 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9064 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9065 return Res; 9066 } 9067 9068 template <typename Derived> 9069 StmtResult 9070 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9071 OMPDistributeParallelForSimdDirective *D) { 9072 DeclarationNameInfo DirName; 9073 getDerived().getSema().StartOpenMPDSABlock( 9074 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9075 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9076 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9077 return Res; 9078 } 9079 9080 template <typename Derived> 9081 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9082 OMPDistributeSimdDirective *D) { 9083 DeclarationNameInfo DirName; 9084 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9085 nullptr, D->getBeginLoc()); 9086 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9087 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9088 return Res; 9089 } 9090 9091 template <typename Derived> 9092 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 9093 OMPTargetParallelForSimdDirective *D) { 9094 DeclarationNameInfo DirName; 9095 getDerived().getSema().StartOpenMPDSABlock( 9096 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9097 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9098 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9099 return Res; 9100 } 9101 9102 template <typename Derived> 9103 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 9104 OMPTargetSimdDirective *D) { 9105 DeclarationNameInfo DirName; 9106 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 9107 D->getBeginLoc()); 9108 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9109 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9110 return Res; 9111 } 9112 9113 template <typename Derived> 9114 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9115 OMPTeamsDistributeDirective *D) { 9116 DeclarationNameInfo DirName; 9117 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9118 nullptr, D->getBeginLoc()); 9119 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9120 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9121 return Res; 9122 } 9123 9124 template <typename Derived> 9125 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9126 OMPTeamsDistributeSimdDirective *D) { 9127 DeclarationNameInfo DirName; 9128 getDerived().getSema().StartOpenMPDSABlock( 9129 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9130 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9131 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9132 return Res; 9133 } 9134 9135 template <typename Derived> 9136 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9137 OMPTeamsDistributeParallelForSimdDirective *D) { 9138 DeclarationNameInfo DirName; 9139 getDerived().getSema().StartOpenMPDSABlock( 9140 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9141 D->getBeginLoc()); 9142 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9143 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9144 return Res; 9145 } 9146 9147 template <typename Derived> 9148 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9149 OMPTeamsDistributeParallelForDirective *D) { 9150 DeclarationNameInfo DirName; 9151 getDerived().getSema().StartOpenMPDSABlock( 9152 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9153 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9154 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9155 return Res; 9156 } 9157 9158 template <typename Derived> 9159 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9160 OMPTargetTeamsDirective *D) { 9161 DeclarationNameInfo DirName; 9162 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9163 nullptr, D->getBeginLoc()); 9164 auto Res = getDerived().TransformOMPExecutableDirective(D); 9165 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9166 return Res; 9167 } 9168 9169 template <typename Derived> 9170 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9171 OMPTargetTeamsDistributeDirective *D) { 9172 DeclarationNameInfo DirName; 9173 getDerived().getSema().StartOpenMPDSABlock( 9174 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9175 auto Res = getDerived().TransformOMPExecutableDirective(D); 9176 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9177 return Res; 9178 } 9179 9180 template <typename Derived> 9181 StmtResult 9182 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9183 OMPTargetTeamsDistributeParallelForDirective *D) { 9184 DeclarationNameInfo DirName; 9185 getDerived().getSema().StartOpenMPDSABlock( 9186 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9187 D->getBeginLoc()); 9188 auto Res = getDerived().TransformOMPExecutableDirective(D); 9189 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9190 return Res; 9191 } 9192 9193 template <typename Derived> 9194 StmtResult TreeTransform<Derived>:: 9195 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9196 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9197 DeclarationNameInfo DirName; 9198 getDerived().getSema().StartOpenMPDSABlock( 9199 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9200 D->getBeginLoc()); 9201 auto Res = getDerived().TransformOMPExecutableDirective(D); 9202 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9203 return Res; 9204 } 9205 9206 template <typename Derived> 9207 StmtResult 9208 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9209 OMPTargetTeamsDistributeSimdDirective *D) { 9210 DeclarationNameInfo DirName; 9211 getDerived().getSema().StartOpenMPDSABlock( 9212 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9213 auto Res = getDerived().TransformOMPExecutableDirective(D); 9214 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9215 return Res; 9216 } 9217 9218 template <typename Derived> 9219 StmtResult 9220 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9221 DeclarationNameInfo DirName; 9222 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9223 D->getBeginLoc()); 9224 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9225 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9226 return Res; 9227 } 9228 9229 template <typename Derived> 9230 StmtResult 9231 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9232 DeclarationNameInfo DirName; 9233 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9234 D->getBeginLoc()); 9235 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9236 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9237 return Res; 9238 } 9239 9240 template <typename Derived> 9241 StmtResult 9242 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9243 DeclarationNameInfo DirName; 9244 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9245 D->getBeginLoc()); 9246 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9247 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9248 return Res; 9249 } 9250 9251 template <typename Derived> 9252 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9253 OMPGenericLoopDirective *D) { 9254 DeclarationNameInfo DirName; 9255 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9256 D->getBeginLoc()); 9257 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9258 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9259 return Res; 9260 } 9261 9262 template <typename Derived> 9263 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective( 9264 OMPTeamsGenericLoopDirective *D) { 9265 DeclarationNameInfo DirName; 9266 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr, 9267 D->getBeginLoc()); 9268 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9269 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9270 return Res; 9271 } 9272 9273 template <typename Derived> 9274 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective( 9275 OMPTargetTeamsGenericLoopDirective *D) { 9276 DeclarationNameInfo DirName; 9277 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName, 9278 nullptr, D->getBeginLoc()); 9279 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9280 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9281 return Res; 9282 } 9283 9284 template <typename Derived> 9285 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective( 9286 OMPParallelGenericLoopDirective *D) { 9287 DeclarationNameInfo DirName; 9288 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName, 9289 nullptr, D->getBeginLoc()); 9290 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9291 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9292 return Res; 9293 } 9294 9295 template <typename Derived> 9296 StmtResult 9297 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective( 9298 OMPTargetParallelGenericLoopDirective *D) { 9299 DeclarationNameInfo DirName; 9300 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName, 9301 nullptr, D->getBeginLoc()); 9302 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9303 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9304 return Res; 9305 } 9306 9307 //===----------------------------------------------------------------------===// 9308 // OpenMP clause transformation 9309 //===----------------------------------------------------------------------===// 9310 template <typename Derived> 9311 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9312 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9313 if (Cond.isInvalid()) 9314 return nullptr; 9315 return getDerived().RebuildOMPIfClause( 9316 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9317 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9318 } 9319 9320 template <typename Derived> 9321 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9322 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9323 if (Cond.isInvalid()) 9324 return nullptr; 9325 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9326 C->getLParenLoc(), C->getEndLoc()); 9327 } 9328 9329 template <typename Derived> 9330 OMPClause * 9331 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9332 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9333 if (NumThreads.isInvalid()) 9334 return nullptr; 9335 return getDerived().RebuildOMPNumThreadsClause( 9336 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9337 } 9338 9339 template <typename Derived> 9340 OMPClause * 9341 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9342 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9343 if (E.isInvalid()) 9344 return nullptr; 9345 return getDerived().RebuildOMPSafelenClause( 9346 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9347 } 9348 9349 template <typename Derived> 9350 OMPClause * 9351 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9352 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9353 if (E.isInvalid()) 9354 return nullptr; 9355 return getDerived().RebuildOMPAllocatorClause( 9356 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9357 } 9358 9359 template <typename Derived> 9360 OMPClause * 9361 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9362 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9363 if (E.isInvalid()) 9364 return nullptr; 9365 return getDerived().RebuildOMPSimdlenClause( 9366 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9367 } 9368 9369 template <typename Derived> 9370 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9371 SmallVector<Expr *, 4> TransformedSizes; 9372 TransformedSizes.reserve(C->getNumSizes()); 9373 bool Changed = false; 9374 for (Expr *E : C->getSizesRefs()) { 9375 if (!E) { 9376 TransformedSizes.push_back(nullptr); 9377 continue; 9378 } 9379 9380 ExprResult T = getDerived().TransformExpr(E); 9381 if (T.isInvalid()) 9382 return nullptr; 9383 if (E != T.get()) 9384 Changed = true; 9385 TransformedSizes.push_back(T.get()); 9386 } 9387 9388 if (!Changed && !getDerived().AlwaysRebuild()) 9389 return C; 9390 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9391 C->getLParenLoc(), C->getEndLoc()); 9392 } 9393 9394 template <typename Derived> 9395 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9396 if (!getDerived().AlwaysRebuild()) 9397 return C; 9398 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9399 } 9400 9401 template <typename Derived> 9402 OMPClause * 9403 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9404 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9405 if (T.isInvalid()) 9406 return nullptr; 9407 Expr *Factor = T.get(); 9408 bool Changed = Factor != C->getFactor(); 9409 9410 if (!Changed && !getDerived().AlwaysRebuild()) 9411 return C; 9412 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9413 C->getEndLoc()); 9414 } 9415 9416 template <typename Derived> 9417 OMPClause * 9418 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9419 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9420 if (E.isInvalid()) 9421 return nullptr; 9422 return getDerived().RebuildOMPCollapseClause( 9423 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9424 } 9425 9426 template <typename Derived> 9427 OMPClause * 9428 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9429 return getDerived().RebuildOMPDefaultClause( 9430 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9431 C->getLParenLoc(), C->getEndLoc()); 9432 } 9433 9434 template <typename Derived> 9435 OMPClause * 9436 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9437 return getDerived().RebuildOMPProcBindClause( 9438 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9439 C->getLParenLoc(), C->getEndLoc()); 9440 } 9441 9442 template <typename Derived> 9443 OMPClause * 9444 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9445 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9446 if (E.isInvalid()) 9447 return nullptr; 9448 return getDerived().RebuildOMPScheduleClause( 9449 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9450 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9451 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9452 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9453 } 9454 9455 template <typename Derived> 9456 OMPClause * 9457 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9458 ExprResult E; 9459 if (auto *Num = C->getNumForLoops()) { 9460 E = getDerived().TransformExpr(Num); 9461 if (E.isInvalid()) 9462 return nullptr; 9463 } 9464 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9465 C->getLParenLoc(), E.get()); 9466 } 9467 9468 template <typename Derived> 9469 OMPClause * 9470 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9471 ExprResult E; 9472 if (Expr *Evt = C->getEventHandler()) { 9473 E = getDerived().TransformExpr(Evt); 9474 if (E.isInvalid()) 9475 return nullptr; 9476 } 9477 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9478 C->getLParenLoc(), C->getEndLoc()); 9479 } 9480 9481 template <typename Derived> 9482 OMPClause * 9483 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9484 // No need to rebuild this clause, no template-dependent parameters. 9485 return C; 9486 } 9487 9488 template <typename Derived> 9489 OMPClause * 9490 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9491 // No need to rebuild this clause, no template-dependent parameters. 9492 return C; 9493 } 9494 9495 template <typename Derived> 9496 OMPClause * 9497 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9498 // No need to rebuild this clause, no template-dependent parameters. 9499 return C; 9500 } 9501 9502 template <typename Derived> 9503 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9504 // No need to rebuild this clause, no template-dependent parameters. 9505 return C; 9506 } 9507 9508 template <typename Derived> 9509 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9510 // No need to rebuild this clause, no template-dependent parameters. 9511 return C; 9512 } 9513 9514 template <typename Derived> 9515 OMPClause * 9516 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9517 // No need to rebuild this clause, no template-dependent parameters. 9518 return C; 9519 } 9520 9521 template <typename Derived> 9522 OMPClause * 9523 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9524 // No need to rebuild this clause, no template-dependent parameters. 9525 return C; 9526 } 9527 9528 template <typename Derived> 9529 OMPClause * 9530 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) { 9531 // No need to rebuild this clause, no template-dependent parameters. 9532 return C; 9533 } 9534 9535 template <typename Derived> 9536 OMPClause * 9537 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9538 // No need to rebuild this clause, no template-dependent parameters. 9539 return C; 9540 } 9541 9542 template <typename Derived> 9543 OMPClause * 9544 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9545 // No need to rebuild this clause, no template-dependent parameters. 9546 return C; 9547 } 9548 9549 template <typename Derived> 9550 OMPClause * 9551 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9552 // No need to rebuild this clause, no template-dependent parameters. 9553 return C; 9554 } 9555 9556 template <typename Derived> 9557 OMPClause * 9558 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9559 // No need to rebuild this clause, no template-dependent parameters. 9560 return C; 9561 } 9562 9563 template <typename Derived> 9564 OMPClause * 9565 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9566 // No need to rebuild this clause, no template-dependent parameters. 9567 return C; 9568 } 9569 9570 template <typename Derived> 9571 OMPClause * 9572 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9573 // No need to rebuild this clause, no template-dependent parameters. 9574 return C; 9575 } 9576 9577 template <typename Derived> 9578 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9579 // No need to rebuild this clause, no template-dependent parameters. 9580 return C; 9581 } 9582 9583 template <typename Derived> 9584 OMPClause * 9585 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9586 // No need to rebuild this clause, no template-dependent parameters. 9587 return C; 9588 } 9589 9590 template <typename Derived> 9591 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9592 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9593 if (IVR.isInvalid()) 9594 return nullptr; 9595 9596 llvm::SmallVector<Expr *, 8> PrefExprs; 9597 PrefExprs.reserve(C->varlist_size() - 1); 9598 for (Expr *E : llvm::drop_begin(C->varlists())) { 9599 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9600 if (ER.isInvalid()) 9601 return nullptr; 9602 PrefExprs.push_back(ER.get()); 9603 } 9604 return getDerived().RebuildOMPInitClause( 9605 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9606 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9607 } 9608 9609 template <typename Derived> 9610 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9611 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9612 if (ER.isInvalid()) 9613 return nullptr; 9614 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9615 C->getLParenLoc(), C->getVarLoc(), 9616 C->getEndLoc()); 9617 } 9618 9619 template <typename Derived> 9620 OMPClause * 9621 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9622 ExprResult ER; 9623 if (Expr *IV = C->getInteropVar()) { 9624 ER = getDerived().TransformExpr(IV); 9625 if (ER.isInvalid()) 9626 return nullptr; 9627 } 9628 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9629 C->getLParenLoc(), C->getVarLoc(), 9630 C->getEndLoc()); 9631 } 9632 9633 template <typename Derived> 9634 OMPClause * 9635 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9636 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9637 if (Cond.isInvalid()) 9638 return nullptr; 9639 return getDerived().RebuildOMPNovariantsClause( 9640 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9641 } 9642 9643 template <typename Derived> 9644 OMPClause * 9645 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9646 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9647 if (Cond.isInvalid()) 9648 return nullptr; 9649 return getDerived().RebuildOMPNocontextClause( 9650 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9651 } 9652 9653 template <typename Derived> 9654 OMPClause * 9655 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9656 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9657 if (ThreadID.isInvalid()) 9658 return nullptr; 9659 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9660 C->getLParenLoc(), C->getEndLoc()); 9661 } 9662 9663 template <typename Derived> 9664 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) { 9665 ExprResult E = getDerived().TransformExpr(C->getAlignment()); 9666 if (E.isInvalid()) 9667 return nullptr; 9668 return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(), 9669 C->getLParenLoc(), C->getEndLoc()); 9670 } 9671 9672 template <typename Derived> 9673 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9674 OMPUnifiedAddressClause *C) { 9675 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9676 } 9677 9678 template <typename Derived> 9679 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9680 OMPUnifiedSharedMemoryClause *C) { 9681 llvm_unreachable( 9682 "unified_shared_memory clause cannot appear in dependent context"); 9683 } 9684 9685 template <typename Derived> 9686 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9687 OMPReverseOffloadClause *C) { 9688 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9689 } 9690 9691 template <typename Derived> 9692 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9693 OMPDynamicAllocatorsClause *C) { 9694 llvm_unreachable( 9695 "dynamic_allocators clause cannot appear in dependent context"); 9696 } 9697 9698 template <typename Derived> 9699 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9700 OMPAtomicDefaultMemOrderClause *C) { 9701 llvm_unreachable( 9702 "atomic_default_mem_order clause cannot appear in dependent context"); 9703 } 9704 9705 template <typename Derived> 9706 OMPClause * 9707 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9708 llvm::SmallVector<Expr *, 16> Vars; 9709 Vars.reserve(C->varlist_size()); 9710 for (auto *VE : C->varlists()) { 9711 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9712 if (EVar.isInvalid()) 9713 return nullptr; 9714 Vars.push_back(EVar.get()); 9715 } 9716 return getDerived().RebuildOMPPrivateClause( 9717 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9718 } 9719 9720 template <typename Derived> 9721 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9722 OMPFirstprivateClause *C) { 9723 llvm::SmallVector<Expr *, 16> Vars; 9724 Vars.reserve(C->varlist_size()); 9725 for (auto *VE : C->varlists()) { 9726 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9727 if (EVar.isInvalid()) 9728 return nullptr; 9729 Vars.push_back(EVar.get()); 9730 } 9731 return getDerived().RebuildOMPFirstprivateClause( 9732 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9733 } 9734 9735 template <typename Derived> 9736 OMPClause * 9737 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9738 llvm::SmallVector<Expr *, 16> Vars; 9739 Vars.reserve(C->varlist_size()); 9740 for (auto *VE : C->varlists()) { 9741 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9742 if (EVar.isInvalid()) 9743 return nullptr; 9744 Vars.push_back(EVar.get()); 9745 } 9746 return getDerived().RebuildOMPLastprivateClause( 9747 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9748 C->getLParenLoc(), C->getEndLoc()); 9749 } 9750 9751 template <typename Derived> 9752 OMPClause * 9753 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9754 llvm::SmallVector<Expr *, 16> Vars; 9755 Vars.reserve(C->varlist_size()); 9756 for (auto *VE : C->varlists()) { 9757 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9758 if (EVar.isInvalid()) 9759 return nullptr; 9760 Vars.push_back(EVar.get()); 9761 } 9762 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9763 C->getLParenLoc(), C->getEndLoc()); 9764 } 9765 9766 template <typename Derived> 9767 OMPClause * 9768 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9769 llvm::SmallVector<Expr *, 16> Vars; 9770 Vars.reserve(C->varlist_size()); 9771 for (auto *VE : C->varlists()) { 9772 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9773 if (EVar.isInvalid()) 9774 return nullptr; 9775 Vars.push_back(EVar.get()); 9776 } 9777 CXXScopeSpec ReductionIdScopeSpec; 9778 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9779 9780 DeclarationNameInfo NameInfo = C->getNameInfo(); 9781 if (NameInfo.getName()) { 9782 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9783 if (!NameInfo.getName()) 9784 return nullptr; 9785 } 9786 // Build a list of all UDR decls with the same names ranged by the Scopes. 9787 // The Scope boundary is a duplication of the previous decl. 9788 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9789 for (auto *E : C->reduction_ops()) { 9790 // Transform all the decls. 9791 if (E) { 9792 auto *ULE = cast<UnresolvedLookupExpr>(E); 9793 UnresolvedSet<8> Decls; 9794 for (auto *D : ULE->decls()) { 9795 NamedDecl *InstD = 9796 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9797 Decls.addDecl(InstD, InstD->getAccess()); 9798 } 9799 UnresolvedReductions.push_back( 9800 UnresolvedLookupExpr::Create( 9801 SemaRef.Context, /*NamingClass=*/nullptr, 9802 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9803 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9804 Decls.begin(), Decls.end())); 9805 } else 9806 UnresolvedReductions.push_back(nullptr); 9807 } 9808 return getDerived().RebuildOMPReductionClause( 9809 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9810 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9811 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9812 } 9813 9814 template <typename Derived> 9815 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9816 OMPTaskReductionClause *C) { 9817 llvm::SmallVector<Expr *, 16> Vars; 9818 Vars.reserve(C->varlist_size()); 9819 for (auto *VE : C->varlists()) { 9820 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9821 if (EVar.isInvalid()) 9822 return nullptr; 9823 Vars.push_back(EVar.get()); 9824 } 9825 CXXScopeSpec ReductionIdScopeSpec; 9826 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9827 9828 DeclarationNameInfo NameInfo = C->getNameInfo(); 9829 if (NameInfo.getName()) { 9830 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9831 if (!NameInfo.getName()) 9832 return nullptr; 9833 } 9834 // Build a list of all UDR decls with the same names ranged by the Scopes. 9835 // The Scope boundary is a duplication of the previous decl. 9836 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9837 for (auto *E : C->reduction_ops()) { 9838 // Transform all the decls. 9839 if (E) { 9840 auto *ULE = cast<UnresolvedLookupExpr>(E); 9841 UnresolvedSet<8> Decls; 9842 for (auto *D : ULE->decls()) { 9843 NamedDecl *InstD = 9844 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9845 Decls.addDecl(InstD, InstD->getAccess()); 9846 } 9847 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9848 SemaRef.Context, /*NamingClass=*/nullptr, 9849 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9850 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9851 } else 9852 UnresolvedReductions.push_back(nullptr); 9853 } 9854 return getDerived().RebuildOMPTaskReductionClause( 9855 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9856 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9857 } 9858 9859 template <typename Derived> 9860 OMPClause * 9861 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9862 llvm::SmallVector<Expr *, 16> Vars; 9863 Vars.reserve(C->varlist_size()); 9864 for (auto *VE : C->varlists()) { 9865 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9866 if (EVar.isInvalid()) 9867 return nullptr; 9868 Vars.push_back(EVar.get()); 9869 } 9870 CXXScopeSpec ReductionIdScopeSpec; 9871 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9872 9873 DeclarationNameInfo NameInfo = C->getNameInfo(); 9874 if (NameInfo.getName()) { 9875 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9876 if (!NameInfo.getName()) 9877 return nullptr; 9878 } 9879 // Build a list of all UDR decls with the same names ranged by the Scopes. 9880 // The Scope boundary is a duplication of the previous decl. 9881 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9882 for (auto *E : C->reduction_ops()) { 9883 // Transform all the decls. 9884 if (E) { 9885 auto *ULE = cast<UnresolvedLookupExpr>(E); 9886 UnresolvedSet<8> Decls; 9887 for (auto *D : ULE->decls()) { 9888 NamedDecl *InstD = 9889 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9890 Decls.addDecl(InstD, InstD->getAccess()); 9891 } 9892 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9893 SemaRef.Context, /*NamingClass=*/nullptr, 9894 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9895 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9896 } else 9897 UnresolvedReductions.push_back(nullptr); 9898 } 9899 return getDerived().RebuildOMPInReductionClause( 9900 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9901 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9902 } 9903 9904 template <typename Derived> 9905 OMPClause * 9906 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9907 llvm::SmallVector<Expr *, 16> Vars; 9908 Vars.reserve(C->varlist_size()); 9909 for (auto *VE : C->varlists()) { 9910 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9911 if (EVar.isInvalid()) 9912 return nullptr; 9913 Vars.push_back(EVar.get()); 9914 } 9915 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9916 if (Step.isInvalid()) 9917 return nullptr; 9918 return getDerived().RebuildOMPLinearClause( 9919 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9920 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9921 } 9922 9923 template <typename Derived> 9924 OMPClause * 9925 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9926 llvm::SmallVector<Expr *, 16> Vars; 9927 Vars.reserve(C->varlist_size()); 9928 for (auto *VE : C->varlists()) { 9929 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9930 if (EVar.isInvalid()) 9931 return nullptr; 9932 Vars.push_back(EVar.get()); 9933 } 9934 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9935 if (Alignment.isInvalid()) 9936 return nullptr; 9937 return getDerived().RebuildOMPAlignedClause( 9938 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9939 C->getColonLoc(), C->getEndLoc()); 9940 } 9941 9942 template <typename Derived> 9943 OMPClause * 9944 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9945 llvm::SmallVector<Expr *, 16> Vars; 9946 Vars.reserve(C->varlist_size()); 9947 for (auto *VE : C->varlists()) { 9948 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9949 if (EVar.isInvalid()) 9950 return nullptr; 9951 Vars.push_back(EVar.get()); 9952 } 9953 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9954 C->getLParenLoc(), C->getEndLoc()); 9955 } 9956 9957 template <typename Derived> 9958 OMPClause * 9959 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9960 llvm::SmallVector<Expr *, 16> Vars; 9961 Vars.reserve(C->varlist_size()); 9962 for (auto *VE : C->varlists()) { 9963 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9964 if (EVar.isInvalid()) 9965 return nullptr; 9966 Vars.push_back(EVar.get()); 9967 } 9968 return getDerived().RebuildOMPCopyprivateClause( 9969 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9970 } 9971 9972 template <typename Derived> 9973 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9974 llvm::SmallVector<Expr *, 16> Vars; 9975 Vars.reserve(C->varlist_size()); 9976 for (auto *VE : C->varlists()) { 9977 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9978 if (EVar.isInvalid()) 9979 return nullptr; 9980 Vars.push_back(EVar.get()); 9981 } 9982 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9983 C->getLParenLoc(), C->getEndLoc()); 9984 } 9985 9986 template <typename Derived> 9987 OMPClause * 9988 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9989 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9990 if (E.isInvalid()) 9991 return nullptr; 9992 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9993 C->getLParenLoc(), C->getEndLoc()); 9994 } 9995 9996 template <typename Derived> 9997 OMPClause * 9998 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9999 llvm::SmallVector<Expr *, 16> Vars; 10000 Expr *DepModifier = C->getModifier(); 10001 if (DepModifier) { 10002 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 10003 if (DepModRes.isInvalid()) 10004 return nullptr; 10005 DepModifier = DepModRes.get(); 10006 } 10007 Vars.reserve(C->varlist_size()); 10008 for (auto *VE : C->varlists()) { 10009 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10010 if (EVar.isInvalid()) 10011 return nullptr; 10012 Vars.push_back(EVar.get()); 10013 } 10014 return getDerived().RebuildOMPDependClause( 10015 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 10016 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 10017 C->getEndLoc()); 10018 } 10019 10020 template <typename Derived> 10021 OMPClause * 10022 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 10023 ExprResult E = getDerived().TransformExpr(C->getDevice()); 10024 if (E.isInvalid()) 10025 return nullptr; 10026 return getDerived().RebuildOMPDeviceClause( 10027 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10028 C->getModifierLoc(), C->getEndLoc()); 10029 } 10030 10031 template <typename Derived, class T> 10032 bool transformOMPMappableExprListClause( 10033 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 10034 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 10035 DeclarationNameInfo &MapperIdInfo, 10036 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 10037 // Transform expressions in the list. 10038 Vars.reserve(C->varlist_size()); 10039 for (auto *VE : C->varlists()) { 10040 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 10041 if (EVar.isInvalid()) 10042 return true; 10043 Vars.push_back(EVar.get()); 10044 } 10045 // Transform mapper scope specifier and identifier. 10046 NestedNameSpecifierLoc QualifierLoc; 10047 if (C->getMapperQualifierLoc()) { 10048 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 10049 C->getMapperQualifierLoc()); 10050 if (!QualifierLoc) 10051 return true; 10052 } 10053 MapperIdScopeSpec.Adopt(QualifierLoc); 10054 MapperIdInfo = C->getMapperIdInfo(); 10055 if (MapperIdInfo.getName()) { 10056 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 10057 if (!MapperIdInfo.getName()) 10058 return true; 10059 } 10060 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 10061 // the previous user-defined mapper lookup in dependent environment. 10062 for (auto *E : C->mapperlists()) { 10063 // Transform all the decls. 10064 if (E) { 10065 auto *ULE = cast<UnresolvedLookupExpr>(E); 10066 UnresolvedSet<8> Decls; 10067 for (auto *D : ULE->decls()) { 10068 NamedDecl *InstD = 10069 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 10070 Decls.addDecl(InstD, InstD->getAccess()); 10071 } 10072 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 10073 TT.getSema().Context, /*NamingClass=*/nullptr, 10074 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 10075 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 10076 Decls.end())); 10077 } else { 10078 UnresolvedMappers.push_back(nullptr); 10079 } 10080 } 10081 return false; 10082 } 10083 10084 template <typename Derived> 10085 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 10086 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10087 llvm::SmallVector<Expr *, 16> Vars; 10088 CXXScopeSpec MapperIdScopeSpec; 10089 DeclarationNameInfo MapperIdInfo; 10090 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10091 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 10092 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10093 return nullptr; 10094 return getDerived().RebuildOMPMapClause( 10095 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 10096 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 10097 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10098 } 10099 10100 template <typename Derived> 10101 OMPClause * 10102 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 10103 Expr *Allocator = C->getAllocator(); 10104 if (Allocator) { 10105 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 10106 if (AllocatorRes.isInvalid()) 10107 return nullptr; 10108 Allocator = AllocatorRes.get(); 10109 } 10110 llvm::SmallVector<Expr *, 16> Vars; 10111 Vars.reserve(C->varlist_size()); 10112 for (auto *VE : C->varlists()) { 10113 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10114 if (EVar.isInvalid()) 10115 return nullptr; 10116 Vars.push_back(EVar.get()); 10117 } 10118 return getDerived().RebuildOMPAllocateClause( 10119 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10120 C->getEndLoc()); 10121 } 10122 10123 template <typename Derived> 10124 OMPClause * 10125 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10126 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10127 if (E.isInvalid()) 10128 return nullptr; 10129 return getDerived().RebuildOMPNumTeamsClause( 10130 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10131 } 10132 10133 template <typename Derived> 10134 OMPClause * 10135 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10136 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10137 if (E.isInvalid()) 10138 return nullptr; 10139 return getDerived().RebuildOMPThreadLimitClause( 10140 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10141 } 10142 10143 template <typename Derived> 10144 OMPClause * 10145 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10146 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10147 if (E.isInvalid()) 10148 return nullptr; 10149 return getDerived().RebuildOMPPriorityClause( 10150 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10151 } 10152 10153 template <typename Derived> 10154 OMPClause * 10155 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10156 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10157 if (E.isInvalid()) 10158 return nullptr; 10159 return getDerived().RebuildOMPGrainsizeClause( 10160 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10161 } 10162 10163 template <typename Derived> 10164 OMPClause * 10165 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10166 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10167 if (E.isInvalid()) 10168 return nullptr; 10169 return getDerived().RebuildOMPNumTasksClause( 10170 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10171 } 10172 10173 template <typename Derived> 10174 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10175 ExprResult E = getDerived().TransformExpr(C->getHint()); 10176 if (E.isInvalid()) 10177 return nullptr; 10178 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10179 C->getLParenLoc(), C->getEndLoc()); 10180 } 10181 10182 template <typename Derived> 10183 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10184 OMPDistScheduleClause *C) { 10185 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10186 if (E.isInvalid()) 10187 return nullptr; 10188 return getDerived().RebuildOMPDistScheduleClause( 10189 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10190 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10191 } 10192 10193 template <typename Derived> 10194 OMPClause * 10195 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10196 // Rebuild Defaultmap Clause since we need to invoke the checking of 10197 // defaultmap(none:variable-category) after template initialization. 10198 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10199 C->getDefaultmapKind(), 10200 C->getBeginLoc(), 10201 C->getLParenLoc(), 10202 C->getDefaultmapModifierLoc(), 10203 C->getDefaultmapKindLoc(), 10204 C->getEndLoc()); 10205 } 10206 10207 template <typename Derived> 10208 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10209 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10210 llvm::SmallVector<Expr *, 16> Vars; 10211 CXXScopeSpec MapperIdScopeSpec; 10212 DeclarationNameInfo MapperIdInfo; 10213 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10214 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10215 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10216 return nullptr; 10217 return getDerived().RebuildOMPToClause( 10218 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10219 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10220 } 10221 10222 template <typename Derived> 10223 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10224 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10225 llvm::SmallVector<Expr *, 16> Vars; 10226 CXXScopeSpec MapperIdScopeSpec; 10227 DeclarationNameInfo MapperIdInfo; 10228 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10229 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10230 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10231 return nullptr; 10232 return getDerived().RebuildOMPFromClause( 10233 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10234 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10235 } 10236 10237 template <typename Derived> 10238 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10239 OMPUseDevicePtrClause *C) { 10240 llvm::SmallVector<Expr *, 16> Vars; 10241 Vars.reserve(C->varlist_size()); 10242 for (auto *VE : C->varlists()) { 10243 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10244 if (EVar.isInvalid()) 10245 return nullptr; 10246 Vars.push_back(EVar.get()); 10247 } 10248 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10249 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10250 } 10251 10252 template <typename Derived> 10253 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10254 OMPUseDeviceAddrClause *C) { 10255 llvm::SmallVector<Expr *, 16> Vars; 10256 Vars.reserve(C->varlist_size()); 10257 for (auto *VE : C->varlists()) { 10258 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10259 if (EVar.isInvalid()) 10260 return nullptr; 10261 Vars.push_back(EVar.get()); 10262 } 10263 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10264 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10265 } 10266 10267 template <typename Derived> 10268 OMPClause * 10269 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10270 llvm::SmallVector<Expr *, 16> Vars; 10271 Vars.reserve(C->varlist_size()); 10272 for (auto *VE : C->varlists()) { 10273 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10274 if (EVar.isInvalid()) 10275 return nullptr; 10276 Vars.push_back(EVar.get()); 10277 } 10278 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10279 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10280 } 10281 10282 template <typename Derived> 10283 OMPClause *TreeTransform<Derived>::TransformOMPHasDeviceAddrClause( 10284 OMPHasDeviceAddrClause *C) { 10285 llvm::SmallVector<Expr *, 16> Vars; 10286 Vars.reserve(C->varlist_size()); 10287 for (auto *VE : C->varlists()) { 10288 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10289 if (EVar.isInvalid()) 10290 return nullptr; 10291 Vars.push_back(EVar.get()); 10292 } 10293 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10294 return getDerived().RebuildOMPHasDeviceAddrClause(Vars, Locs); 10295 } 10296 10297 template <typename Derived> 10298 OMPClause * 10299 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10300 llvm::SmallVector<Expr *, 16> Vars; 10301 Vars.reserve(C->varlist_size()); 10302 for (auto *VE : C->varlists()) { 10303 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10304 if (EVar.isInvalid()) 10305 return nullptr; 10306 Vars.push_back(EVar.get()); 10307 } 10308 return getDerived().RebuildOMPNontemporalClause( 10309 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10310 } 10311 10312 template <typename Derived> 10313 OMPClause * 10314 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10315 llvm::SmallVector<Expr *, 16> Vars; 10316 Vars.reserve(C->varlist_size()); 10317 for (auto *VE : C->varlists()) { 10318 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10319 if (EVar.isInvalid()) 10320 return nullptr; 10321 Vars.push_back(EVar.get()); 10322 } 10323 return getDerived().RebuildOMPInclusiveClause( 10324 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10325 } 10326 10327 template <typename Derived> 10328 OMPClause * 10329 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10330 llvm::SmallVector<Expr *, 16> Vars; 10331 Vars.reserve(C->varlist_size()); 10332 for (auto *VE : C->varlists()) { 10333 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10334 if (EVar.isInvalid()) 10335 return nullptr; 10336 Vars.push_back(EVar.get()); 10337 } 10338 return getDerived().RebuildOMPExclusiveClause( 10339 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10340 } 10341 10342 template <typename Derived> 10343 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10344 OMPUsesAllocatorsClause *C) { 10345 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10346 Data.reserve(C->getNumberOfAllocators()); 10347 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10348 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10349 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10350 if (Allocator.isInvalid()) 10351 continue; 10352 ExprResult AllocatorTraits; 10353 if (Expr *AT = D.AllocatorTraits) { 10354 AllocatorTraits = getDerived().TransformExpr(AT); 10355 if (AllocatorTraits.isInvalid()) 10356 continue; 10357 } 10358 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10359 NewD.Allocator = Allocator.get(); 10360 NewD.AllocatorTraits = AllocatorTraits.get(); 10361 NewD.LParenLoc = D.LParenLoc; 10362 NewD.RParenLoc = D.RParenLoc; 10363 } 10364 return getDerived().RebuildOMPUsesAllocatorsClause( 10365 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10366 } 10367 10368 template <typename Derived> 10369 OMPClause * 10370 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10371 SmallVector<Expr *, 4> Locators; 10372 Locators.reserve(C->varlist_size()); 10373 ExprResult ModifierRes; 10374 if (Expr *Modifier = C->getModifier()) { 10375 ModifierRes = getDerived().TransformExpr(Modifier); 10376 if (ModifierRes.isInvalid()) 10377 return nullptr; 10378 } 10379 for (Expr *E : C->varlists()) { 10380 ExprResult Locator = getDerived().TransformExpr(E); 10381 if (Locator.isInvalid()) 10382 continue; 10383 Locators.push_back(Locator.get()); 10384 } 10385 return getDerived().RebuildOMPAffinityClause( 10386 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10387 ModifierRes.get(), Locators); 10388 } 10389 10390 template <typename Derived> 10391 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10392 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10393 C->getBeginLoc(), C->getLParenLoc(), 10394 C->getEndLoc()); 10395 } 10396 10397 template <typename Derived> 10398 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10399 return getDerived().RebuildOMPBindClause( 10400 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10401 C->getLParenLoc(), C->getEndLoc()); 10402 } 10403 10404 //===----------------------------------------------------------------------===// 10405 // Expression transformation 10406 //===----------------------------------------------------------------------===// 10407 template<typename Derived> 10408 ExprResult 10409 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10410 return TransformExpr(E->getSubExpr()); 10411 } 10412 10413 template <typename Derived> 10414 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10415 SYCLUniqueStableNameExpr *E) { 10416 if (!E->isTypeDependent()) 10417 return E; 10418 10419 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10420 10421 if (!NewT) 10422 return ExprError(); 10423 10424 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10425 return E; 10426 10427 return getDerived().RebuildSYCLUniqueStableNameExpr( 10428 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10429 } 10430 10431 template<typename Derived> 10432 ExprResult 10433 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10434 if (!E->isTypeDependent()) 10435 return E; 10436 10437 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10438 E->getIdentKind()); 10439 } 10440 10441 template<typename Derived> 10442 ExprResult 10443 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10444 NestedNameSpecifierLoc QualifierLoc; 10445 if (E->getQualifierLoc()) { 10446 QualifierLoc 10447 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10448 if (!QualifierLoc) 10449 return ExprError(); 10450 } 10451 10452 ValueDecl *ND 10453 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10454 E->getDecl())); 10455 if (!ND) 10456 return ExprError(); 10457 10458 NamedDecl *Found = ND; 10459 if (E->getFoundDecl() != E->getDecl()) { 10460 Found = cast_or_null<NamedDecl>( 10461 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10462 if (!Found) 10463 return ExprError(); 10464 } 10465 10466 DeclarationNameInfo NameInfo = E->getNameInfo(); 10467 if (NameInfo.getName()) { 10468 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10469 if (!NameInfo.getName()) 10470 return ExprError(); 10471 } 10472 10473 if (!getDerived().AlwaysRebuild() && 10474 QualifierLoc == E->getQualifierLoc() && 10475 ND == E->getDecl() && 10476 Found == E->getFoundDecl() && 10477 NameInfo.getName() == E->getDecl()->getDeclName() && 10478 !E->hasExplicitTemplateArgs()) { 10479 10480 // Mark it referenced in the new context regardless. 10481 // FIXME: this is a bit instantiation-specific. 10482 SemaRef.MarkDeclRefReferenced(E); 10483 10484 return E; 10485 } 10486 10487 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10488 if (E->hasExplicitTemplateArgs()) { 10489 TemplateArgs = &TransArgs; 10490 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10491 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10492 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10493 E->getNumTemplateArgs(), 10494 TransArgs)) 10495 return ExprError(); 10496 } 10497 10498 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10499 Found, TemplateArgs); 10500 } 10501 10502 template<typename Derived> 10503 ExprResult 10504 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10505 return E; 10506 } 10507 10508 template <typename Derived> 10509 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10510 FixedPointLiteral *E) { 10511 return E; 10512 } 10513 10514 template<typename Derived> 10515 ExprResult 10516 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10517 return E; 10518 } 10519 10520 template<typename Derived> 10521 ExprResult 10522 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10523 return E; 10524 } 10525 10526 template<typename Derived> 10527 ExprResult 10528 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10529 return E; 10530 } 10531 10532 template<typename Derived> 10533 ExprResult 10534 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10535 return E; 10536 } 10537 10538 template<typename Derived> 10539 ExprResult 10540 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10541 return getDerived().TransformCallExpr(E); 10542 } 10543 10544 template<typename Derived> 10545 ExprResult 10546 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10547 ExprResult ControllingExpr = 10548 getDerived().TransformExpr(E->getControllingExpr()); 10549 if (ControllingExpr.isInvalid()) 10550 return ExprError(); 10551 10552 SmallVector<Expr *, 4> AssocExprs; 10553 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10554 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10555 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10556 if (TSI) { 10557 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10558 if (!AssocType) 10559 return ExprError(); 10560 AssocTypes.push_back(AssocType); 10561 } else { 10562 AssocTypes.push_back(nullptr); 10563 } 10564 10565 ExprResult AssocExpr = 10566 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10567 if (AssocExpr.isInvalid()) 10568 return ExprError(); 10569 AssocExprs.push_back(AssocExpr.get()); 10570 } 10571 10572 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10573 E->getDefaultLoc(), 10574 E->getRParenLoc(), 10575 ControllingExpr.get(), 10576 AssocTypes, 10577 AssocExprs); 10578 } 10579 10580 template<typename Derived> 10581 ExprResult 10582 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10583 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10584 if (SubExpr.isInvalid()) 10585 return ExprError(); 10586 10587 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10588 return E; 10589 10590 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10591 E->getRParen()); 10592 } 10593 10594 /// The operand of a unary address-of operator has special rules: it's 10595 /// allowed to refer to a non-static member of a class even if there's no 'this' 10596 /// object available. 10597 template<typename Derived> 10598 ExprResult 10599 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10600 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10601 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10602 else 10603 return getDerived().TransformExpr(E); 10604 } 10605 10606 template<typename Derived> 10607 ExprResult 10608 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10609 ExprResult SubExpr; 10610 if (E->getOpcode() == UO_AddrOf) 10611 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10612 else 10613 SubExpr = TransformExpr(E->getSubExpr()); 10614 if (SubExpr.isInvalid()) 10615 return ExprError(); 10616 10617 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10618 return E; 10619 10620 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10621 E->getOpcode(), 10622 SubExpr.get()); 10623 } 10624 10625 template<typename Derived> 10626 ExprResult 10627 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10628 // Transform the type. 10629 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10630 if (!Type) 10631 return ExprError(); 10632 10633 // Transform all of the components into components similar to what the 10634 // parser uses. 10635 // FIXME: It would be slightly more efficient in the non-dependent case to 10636 // just map FieldDecls, rather than requiring the rebuilder to look for 10637 // the fields again. However, __builtin_offsetof is rare enough in 10638 // template code that we don't care. 10639 bool ExprChanged = false; 10640 typedef Sema::OffsetOfComponent Component; 10641 SmallVector<Component, 4> Components; 10642 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10643 const OffsetOfNode &ON = E->getComponent(I); 10644 Component Comp; 10645 Comp.isBrackets = true; 10646 Comp.LocStart = ON.getSourceRange().getBegin(); 10647 Comp.LocEnd = ON.getSourceRange().getEnd(); 10648 switch (ON.getKind()) { 10649 case OffsetOfNode::Array: { 10650 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10651 ExprResult Index = getDerived().TransformExpr(FromIndex); 10652 if (Index.isInvalid()) 10653 return ExprError(); 10654 10655 ExprChanged = ExprChanged || Index.get() != FromIndex; 10656 Comp.isBrackets = true; 10657 Comp.U.E = Index.get(); 10658 break; 10659 } 10660 10661 case OffsetOfNode::Field: 10662 case OffsetOfNode::Identifier: 10663 Comp.isBrackets = false; 10664 Comp.U.IdentInfo = ON.getFieldName(); 10665 if (!Comp.U.IdentInfo) 10666 continue; 10667 10668 break; 10669 10670 case OffsetOfNode::Base: 10671 // Will be recomputed during the rebuild. 10672 continue; 10673 } 10674 10675 Components.push_back(Comp); 10676 } 10677 10678 // If nothing changed, retain the existing expression. 10679 if (!getDerived().AlwaysRebuild() && 10680 Type == E->getTypeSourceInfo() && 10681 !ExprChanged) 10682 return E; 10683 10684 // Build a new offsetof expression. 10685 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10686 Components, E->getRParenLoc()); 10687 } 10688 10689 template<typename Derived> 10690 ExprResult 10691 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10692 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10693 "opaque value expression requires transformation"); 10694 return E; 10695 } 10696 10697 template<typename Derived> 10698 ExprResult 10699 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10700 return E; 10701 } 10702 10703 template <typename Derived> 10704 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10705 llvm::SmallVector<Expr *, 8> Children; 10706 bool Changed = false; 10707 for (Expr *C : E->subExpressions()) { 10708 ExprResult NewC = getDerived().TransformExpr(C); 10709 if (NewC.isInvalid()) 10710 return ExprError(); 10711 Children.push_back(NewC.get()); 10712 10713 Changed |= NewC.get() != C; 10714 } 10715 if (!getDerived().AlwaysRebuild() && !Changed) 10716 return E; 10717 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10718 Children, E->getType()); 10719 } 10720 10721 template<typename Derived> 10722 ExprResult 10723 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10724 // Rebuild the syntactic form. The original syntactic form has 10725 // opaque-value expressions in it, so strip those away and rebuild 10726 // the result. This is a really awful way of doing this, but the 10727 // better solution (rebuilding the semantic expressions and 10728 // rebinding OVEs as necessary) doesn't work; we'd need 10729 // TreeTransform to not strip away implicit conversions. 10730 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10731 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10732 if (result.isInvalid()) return ExprError(); 10733 10734 // If that gives us a pseudo-object result back, the pseudo-object 10735 // expression must have been an lvalue-to-rvalue conversion which we 10736 // should reapply. 10737 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10738 result = SemaRef.checkPseudoObjectRValue(result.get()); 10739 10740 return result; 10741 } 10742 10743 template<typename Derived> 10744 ExprResult 10745 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10746 UnaryExprOrTypeTraitExpr *E) { 10747 if (E->isArgumentType()) { 10748 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10749 10750 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10751 if (!NewT) 10752 return ExprError(); 10753 10754 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10755 return E; 10756 10757 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10758 E->getKind(), 10759 E->getSourceRange()); 10760 } 10761 10762 // C++0x [expr.sizeof]p1: 10763 // The operand is either an expression, which is an unevaluated operand 10764 // [...] 10765 EnterExpressionEvaluationContext Unevaluated( 10766 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10767 Sema::ReuseLambdaContextDecl); 10768 10769 // Try to recover if we have something like sizeof(T::X) where X is a type. 10770 // Notably, there must be *exactly* one set of parens if X is a type. 10771 TypeSourceInfo *RecoveryTSI = nullptr; 10772 ExprResult SubExpr; 10773 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10774 if (auto *DRE = 10775 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10776 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10777 PE, DRE, false, &RecoveryTSI); 10778 else 10779 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10780 10781 if (RecoveryTSI) { 10782 return getDerived().RebuildUnaryExprOrTypeTrait( 10783 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10784 } else if (SubExpr.isInvalid()) 10785 return ExprError(); 10786 10787 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10788 return E; 10789 10790 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10791 E->getOperatorLoc(), 10792 E->getKind(), 10793 E->getSourceRange()); 10794 } 10795 10796 template<typename Derived> 10797 ExprResult 10798 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10799 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10800 if (LHS.isInvalid()) 10801 return ExprError(); 10802 10803 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10804 if (RHS.isInvalid()) 10805 return ExprError(); 10806 10807 10808 if (!getDerived().AlwaysRebuild() && 10809 LHS.get() == E->getLHS() && 10810 RHS.get() == E->getRHS()) 10811 return E; 10812 10813 return getDerived().RebuildArraySubscriptExpr( 10814 LHS.get(), 10815 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10816 } 10817 10818 template <typename Derived> 10819 ExprResult 10820 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10821 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10822 if (Base.isInvalid()) 10823 return ExprError(); 10824 10825 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10826 if (RowIdx.isInvalid()) 10827 return ExprError(); 10828 10829 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10830 if (ColumnIdx.isInvalid()) 10831 return ExprError(); 10832 10833 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10834 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10835 return E; 10836 10837 return getDerived().RebuildMatrixSubscriptExpr( 10838 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10839 } 10840 10841 template <typename Derived> 10842 ExprResult 10843 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10844 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10845 if (Base.isInvalid()) 10846 return ExprError(); 10847 10848 ExprResult LowerBound; 10849 if (E->getLowerBound()) { 10850 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10851 if (LowerBound.isInvalid()) 10852 return ExprError(); 10853 } 10854 10855 ExprResult Length; 10856 if (E->getLength()) { 10857 Length = getDerived().TransformExpr(E->getLength()); 10858 if (Length.isInvalid()) 10859 return ExprError(); 10860 } 10861 10862 ExprResult Stride; 10863 if (Expr *Str = E->getStride()) { 10864 Stride = getDerived().TransformExpr(Str); 10865 if (Stride.isInvalid()) 10866 return ExprError(); 10867 } 10868 10869 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10870 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10871 return E; 10872 10873 return getDerived().RebuildOMPArraySectionExpr( 10874 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10875 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10876 E->getRBracketLoc()); 10877 } 10878 10879 template <typename Derived> 10880 ExprResult 10881 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10882 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10883 if (Base.isInvalid()) 10884 return ExprError(); 10885 10886 SmallVector<Expr *, 4> Dims; 10887 bool ErrorFound = false; 10888 for (Expr *Dim : E->getDimensions()) { 10889 ExprResult DimRes = getDerived().TransformExpr(Dim); 10890 if (DimRes.isInvalid()) { 10891 ErrorFound = true; 10892 continue; 10893 } 10894 Dims.push_back(DimRes.get()); 10895 } 10896 10897 if (ErrorFound) 10898 return ExprError(); 10899 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10900 E->getRParenLoc(), Dims, 10901 E->getBracketsRanges()); 10902 } 10903 10904 template <typename Derived> 10905 ExprResult 10906 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10907 unsigned NumIterators = E->numOfIterators(); 10908 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10909 10910 bool ErrorFound = false; 10911 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10912 for (unsigned I = 0; I < NumIterators; ++I) { 10913 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10914 Data[I].DeclIdent = D->getIdentifier(); 10915 Data[I].DeclIdentLoc = D->getLocation(); 10916 if (D->getLocation() == D->getBeginLoc()) { 10917 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10918 "Implicit type must be int."); 10919 } else { 10920 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10921 QualType DeclTy = getDerived().TransformType(D->getType()); 10922 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10923 } 10924 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10925 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10926 ExprResult End = getDerived().TransformExpr(Range.End); 10927 ExprResult Step = getDerived().TransformExpr(Range.Step); 10928 ErrorFound = ErrorFound || 10929 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10930 !Data[I].Type.get().isNull())) || 10931 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10932 if (ErrorFound) 10933 continue; 10934 Data[I].Range.Begin = Begin.get(); 10935 Data[I].Range.End = End.get(); 10936 Data[I].Range.Step = Step.get(); 10937 Data[I].AssignLoc = E->getAssignLoc(I); 10938 Data[I].ColonLoc = E->getColonLoc(I); 10939 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10940 NeedToRebuild = 10941 NeedToRebuild || 10942 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10943 D->getType().getTypePtrOrNull()) || 10944 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10945 Range.Step != Data[I].Range.Step; 10946 } 10947 if (ErrorFound) 10948 return ExprError(); 10949 if (!NeedToRebuild) 10950 return E; 10951 10952 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10953 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10954 if (!Res.isUsable()) 10955 return Res; 10956 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10957 for (unsigned I = 0; I < NumIterators; ++I) 10958 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10959 IE->getIteratorDecl(I)); 10960 return Res; 10961 } 10962 10963 template<typename Derived> 10964 ExprResult 10965 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10966 // Transform the callee. 10967 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10968 if (Callee.isInvalid()) 10969 return ExprError(); 10970 10971 // Transform arguments. 10972 bool ArgChanged = false; 10973 SmallVector<Expr*, 8> Args; 10974 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10975 &ArgChanged)) 10976 return ExprError(); 10977 10978 if (!getDerived().AlwaysRebuild() && 10979 Callee.get() == E->getCallee() && 10980 !ArgChanged) 10981 return SemaRef.MaybeBindToTemporary(E); 10982 10983 // FIXME: Wrong source location information for the '('. 10984 SourceLocation FakeLParenLoc 10985 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10986 10987 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10988 if (E->hasStoredFPFeatures()) { 10989 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10990 getSema().CurFPFeatures = 10991 NewOverrides.applyOverrides(getSema().getLangOpts()); 10992 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10993 } 10994 10995 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10996 Args, 10997 E->getRParenLoc()); 10998 } 10999 11000 template<typename Derived> 11001 ExprResult 11002 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 11003 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11004 if (Base.isInvalid()) 11005 return ExprError(); 11006 11007 NestedNameSpecifierLoc QualifierLoc; 11008 if (E->hasQualifier()) { 11009 QualifierLoc 11010 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 11011 11012 if (!QualifierLoc) 11013 return ExprError(); 11014 } 11015 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11016 11017 ValueDecl *Member 11018 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 11019 E->getMemberDecl())); 11020 if (!Member) 11021 return ExprError(); 11022 11023 NamedDecl *FoundDecl = E->getFoundDecl(); 11024 if (FoundDecl == E->getMemberDecl()) { 11025 FoundDecl = Member; 11026 } else { 11027 FoundDecl = cast_or_null<NamedDecl>( 11028 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 11029 if (!FoundDecl) 11030 return ExprError(); 11031 } 11032 11033 if (!getDerived().AlwaysRebuild() && 11034 Base.get() == E->getBase() && 11035 QualifierLoc == E->getQualifierLoc() && 11036 Member == E->getMemberDecl() && 11037 FoundDecl == E->getFoundDecl() && 11038 !E->hasExplicitTemplateArgs()) { 11039 11040 // Mark it referenced in the new context regardless. 11041 // FIXME: this is a bit instantiation-specific. 11042 SemaRef.MarkMemberReferenced(E); 11043 11044 return E; 11045 } 11046 11047 TemplateArgumentListInfo TransArgs; 11048 if (E->hasExplicitTemplateArgs()) { 11049 TransArgs.setLAngleLoc(E->getLAngleLoc()); 11050 TransArgs.setRAngleLoc(E->getRAngleLoc()); 11051 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11052 E->getNumTemplateArgs(), 11053 TransArgs)) 11054 return ExprError(); 11055 } 11056 11057 // FIXME: Bogus source location for the operator 11058 SourceLocation FakeOperatorLoc = 11059 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 11060 11061 // FIXME: to do this check properly, we will need to preserve the 11062 // first-qualifier-in-scope here, just in case we had a dependent 11063 // base (and therefore couldn't do the check) and a 11064 // nested-name-qualifier (and therefore could do the lookup). 11065 NamedDecl *FirstQualifierInScope = nullptr; 11066 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 11067 if (MemberNameInfo.getName()) { 11068 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 11069 if (!MemberNameInfo.getName()) 11070 return ExprError(); 11071 } 11072 11073 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 11074 E->isArrow(), 11075 QualifierLoc, 11076 TemplateKWLoc, 11077 MemberNameInfo, 11078 Member, 11079 FoundDecl, 11080 (E->hasExplicitTemplateArgs() 11081 ? &TransArgs : nullptr), 11082 FirstQualifierInScope); 11083 } 11084 11085 template<typename Derived> 11086 ExprResult 11087 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 11088 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11089 if (LHS.isInvalid()) 11090 return ExprError(); 11091 11092 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11093 if (RHS.isInvalid()) 11094 return ExprError(); 11095 11096 if (!getDerived().AlwaysRebuild() && 11097 LHS.get() == E->getLHS() && 11098 RHS.get() == E->getRHS()) 11099 return E; 11100 11101 if (E->isCompoundAssignmentOp()) 11102 // FPFeatures has already been established from trailing storage 11103 return getDerived().RebuildBinaryOperator( 11104 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 11105 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11106 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11107 getSema().CurFPFeatures = 11108 NewOverrides.applyOverrides(getSema().getLangOpts()); 11109 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11110 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 11111 LHS.get(), RHS.get()); 11112 } 11113 11114 template <typename Derived> 11115 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 11116 CXXRewrittenBinaryOperator *E) { 11117 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 11118 11119 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 11120 if (LHS.isInvalid()) 11121 return ExprError(); 11122 11123 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 11124 if (RHS.isInvalid()) 11125 return ExprError(); 11126 11127 // Extract the already-resolved callee declarations so that we can restrict 11128 // ourselves to using them as the unqualified lookup results when rebuilding. 11129 UnresolvedSet<2> UnqualLookups; 11130 bool ChangedAnyLookups = false; 11131 Expr *PossibleBinOps[] = {E->getSemanticForm(), 11132 const_cast<Expr *>(Decomp.InnerBinOp)}; 11133 for (Expr *PossibleBinOp : PossibleBinOps) { 11134 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11135 if (!Op) 11136 continue; 11137 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11138 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11139 continue; 11140 11141 // Transform the callee in case we built a call to a local extern 11142 // declaration. 11143 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11144 E->getOperatorLoc(), Callee->getFoundDecl())); 11145 if (!Found) 11146 return ExprError(); 11147 if (Found != Callee->getFoundDecl()) 11148 ChangedAnyLookups = true; 11149 UnqualLookups.addDecl(Found); 11150 } 11151 11152 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups && 11153 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) { 11154 // Mark all functions used in the rewrite as referenced. Note that when 11155 // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be 11156 // function calls, and/or there might be a user-defined conversion sequence 11157 // applied to the operands of the <. 11158 // FIXME: this is a bit instantiation-specific. 11159 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS}; 11160 SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt); 11161 return E; 11162 } 11163 11164 return getDerived().RebuildCXXRewrittenBinaryOperator( 11165 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11166 } 11167 11168 template<typename Derived> 11169 ExprResult 11170 TreeTransform<Derived>::TransformCompoundAssignOperator( 11171 CompoundAssignOperator *E) { 11172 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11173 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11174 getSema().CurFPFeatures = 11175 NewOverrides.applyOverrides(getSema().getLangOpts()); 11176 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11177 return getDerived().TransformBinaryOperator(E); 11178 } 11179 11180 template<typename Derived> 11181 ExprResult TreeTransform<Derived>:: 11182 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11183 // Just rebuild the common and RHS expressions and see whether we 11184 // get any changes. 11185 11186 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11187 if (commonExpr.isInvalid()) 11188 return ExprError(); 11189 11190 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11191 if (rhs.isInvalid()) 11192 return ExprError(); 11193 11194 if (!getDerived().AlwaysRebuild() && 11195 commonExpr.get() == e->getCommon() && 11196 rhs.get() == e->getFalseExpr()) 11197 return e; 11198 11199 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11200 e->getQuestionLoc(), 11201 nullptr, 11202 e->getColonLoc(), 11203 rhs.get()); 11204 } 11205 11206 template<typename Derived> 11207 ExprResult 11208 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11209 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11210 if (Cond.isInvalid()) 11211 return ExprError(); 11212 11213 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11214 if (LHS.isInvalid()) 11215 return ExprError(); 11216 11217 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11218 if (RHS.isInvalid()) 11219 return ExprError(); 11220 11221 if (!getDerived().AlwaysRebuild() && 11222 Cond.get() == E->getCond() && 11223 LHS.get() == E->getLHS() && 11224 RHS.get() == E->getRHS()) 11225 return E; 11226 11227 return getDerived().RebuildConditionalOperator(Cond.get(), 11228 E->getQuestionLoc(), 11229 LHS.get(), 11230 E->getColonLoc(), 11231 RHS.get()); 11232 } 11233 11234 template<typename Derived> 11235 ExprResult 11236 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11237 // Implicit casts are eliminated during transformation, since they 11238 // will be recomputed by semantic analysis after transformation. 11239 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11240 } 11241 11242 template<typename Derived> 11243 ExprResult 11244 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11245 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11246 if (!Type) 11247 return ExprError(); 11248 11249 ExprResult SubExpr 11250 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11251 if (SubExpr.isInvalid()) 11252 return ExprError(); 11253 11254 if (!getDerived().AlwaysRebuild() && 11255 Type == E->getTypeInfoAsWritten() && 11256 SubExpr.get() == E->getSubExpr()) 11257 return E; 11258 11259 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11260 Type, 11261 E->getRParenLoc(), 11262 SubExpr.get()); 11263 } 11264 11265 template<typename Derived> 11266 ExprResult 11267 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11268 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11269 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11270 if (!NewT) 11271 return ExprError(); 11272 11273 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11274 if (Init.isInvalid()) 11275 return ExprError(); 11276 11277 if (!getDerived().AlwaysRebuild() && 11278 OldT == NewT && 11279 Init.get() == E->getInitializer()) 11280 return SemaRef.MaybeBindToTemporary(E); 11281 11282 // Note: the expression type doesn't necessarily match the 11283 // type-as-written, but that's okay, because it should always be 11284 // derivable from the initializer. 11285 11286 return getDerived().RebuildCompoundLiteralExpr( 11287 E->getLParenLoc(), NewT, 11288 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11289 } 11290 11291 template<typename Derived> 11292 ExprResult 11293 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11294 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11295 if (Base.isInvalid()) 11296 return ExprError(); 11297 11298 if (!getDerived().AlwaysRebuild() && 11299 Base.get() == E->getBase()) 11300 return E; 11301 11302 // FIXME: Bad source location 11303 SourceLocation FakeOperatorLoc = 11304 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11305 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11306 E->getAccessorLoc(), 11307 E->getAccessor()); 11308 } 11309 11310 template<typename Derived> 11311 ExprResult 11312 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11313 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11314 E = Syntactic; 11315 11316 bool InitChanged = false; 11317 11318 EnterExpressionEvaluationContext Context( 11319 getSema(), EnterExpressionEvaluationContext::InitList); 11320 11321 SmallVector<Expr*, 4> Inits; 11322 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11323 Inits, &InitChanged)) 11324 return ExprError(); 11325 11326 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11327 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11328 // in some cases. We can't reuse it in general, because the syntactic and 11329 // semantic forms are linked, and we can't know that semantic form will 11330 // match even if the syntactic form does. 11331 } 11332 11333 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11334 E->getRBraceLoc()); 11335 } 11336 11337 template<typename Derived> 11338 ExprResult 11339 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11340 Designation Desig; 11341 11342 // transform the initializer value 11343 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11344 if (Init.isInvalid()) 11345 return ExprError(); 11346 11347 // transform the designators. 11348 SmallVector<Expr*, 4> ArrayExprs; 11349 bool ExprChanged = false; 11350 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11351 if (D.isFieldDesignator()) { 11352 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11353 D.getDotLoc(), 11354 D.getFieldLoc())); 11355 if (D.getField()) { 11356 FieldDecl *Field = cast_or_null<FieldDecl>( 11357 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11358 if (Field != D.getField()) 11359 // Rebuild the expression when the transformed FieldDecl is 11360 // different to the already assigned FieldDecl. 11361 ExprChanged = true; 11362 } else { 11363 // Ensure that the designator expression is rebuilt when there isn't 11364 // a resolved FieldDecl in the designator as we don't want to assign 11365 // a FieldDecl to a pattern designator that will be instantiated again. 11366 ExprChanged = true; 11367 } 11368 continue; 11369 } 11370 11371 if (D.isArrayDesignator()) { 11372 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11373 if (Index.isInvalid()) 11374 return ExprError(); 11375 11376 Desig.AddDesignator( 11377 Designator::getArray(Index.get(), D.getLBracketLoc())); 11378 11379 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11380 ArrayExprs.push_back(Index.get()); 11381 continue; 11382 } 11383 11384 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11385 ExprResult Start 11386 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11387 if (Start.isInvalid()) 11388 return ExprError(); 11389 11390 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11391 if (End.isInvalid()) 11392 return ExprError(); 11393 11394 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11395 End.get(), 11396 D.getLBracketLoc(), 11397 D.getEllipsisLoc())); 11398 11399 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11400 End.get() != E->getArrayRangeEnd(D); 11401 11402 ArrayExprs.push_back(Start.get()); 11403 ArrayExprs.push_back(End.get()); 11404 } 11405 11406 if (!getDerived().AlwaysRebuild() && 11407 Init.get() == E->getInit() && 11408 !ExprChanged) 11409 return E; 11410 11411 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11412 E->getEqualOrColonLoc(), 11413 E->usesGNUSyntax(), Init.get()); 11414 } 11415 11416 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11417 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11418 template<typename Derived> 11419 ExprResult 11420 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11421 DesignatedInitUpdateExpr *E) { 11422 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11423 "initializer"); 11424 return ExprError(); 11425 } 11426 11427 template<typename Derived> 11428 ExprResult 11429 TreeTransform<Derived>::TransformNoInitExpr( 11430 NoInitExpr *E) { 11431 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11432 return ExprError(); 11433 } 11434 11435 template<typename Derived> 11436 ExprResult 11437 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11438 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11439 return ExprError(); 11440 } 11441 11442 template<typename Derived> 11443 ExprResult 11444 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11445 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11446 return ExprError(); 11447 } 11448 11449 template<typename Derived> 11450 ExprResult 11451 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11452 ImplicitValueInitExpr *E) { 11453 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11454 11455 // FIXME: Will we ever have proper type location here? Will we actually 11456 // need to transform the type? 11457 QualType T = getDerived().TransformType(E->getType()); 11458 if (T.isNull()) 11459 return ExprError(); 11460 11461 if (!getDerived().AlwaysRebuild() && 11462 T == E->getType()) 11463 return E; 11464 11465 return getDerived().RebuildImplicitValueInitExpr(T); 11466 } 11467 11468 template<typename Derived> 11469 ExprResult 11470 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11471 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11472 if (!TInfo) 11473 return ExprError(); 11474 11475 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11476 if (SubExpr.isInvalid()) 11477 return ExprError(); 11478 11479 if (!getDerived().AlwaysRebuild() && 11480 TInfo == E->getWrittenTypeInfo() && 11481 SubExpr.get() == E->getSubExpr()) 11482 return E; 11483 11484 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11485 TInfo, E->getRParenLoc()); 11486 } 11487 11488 template<typename Derived> 11489 ExprResult 11490 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11491 bool ArgumentChanged = false; 11492 SmallVector<Expr*, 4> Inits; 11493 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11494 &ArgumentChanged)) 11495 return ExprError(); 11496 11497 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11498 Inits, 11499 E->getRParenLoc()); 11500 } 11501 11502 /// Transform an address-of-label expression. 11503 /// 11504 /// By default, the transformation of an address-of-label expression always 11505 /// rebuilds the expression, so that the label identifier can be resolved to 11506 /// the corresponding label statement by semantic analysis. 11507 template<typename Derived> 11508 ExprResult 11509 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11510 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11511 E->getLabel()); 11512 if (!LD) 11513 return ExprError(); 11514 11515 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11516 cast<LabelDecl>(LD)); 11517 } 11518 11519 template<typename Derived> 11520 ExprResult 11521 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11522 SemaRef.ActOnStartStmtExpr(); 11523 StmtResult SubStmt 11524 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11525 if (SubStmt.isInvalid()) { 11526 SemaRef.ActOnStmtExprError(); 11527 return ExprError(); 11528 } 11529 11530 unsigned OldDepth = E->getTemplateDepth(); 11531 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11532 11533 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11534 SubStmt.get() == E->getSubStmt()) { 11535 // Calling this an 'error' is unintuitive, but it does the right thing. 11536 SemaRef.ActOnStmtExprError(); 11537 return SemaRef.MaybeBindToTemporary(E); 11538 } 11539 11540 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11541 E->getRParenLoc(), NewDepth); 11542 } 11543 11544 template<typename Derived> 11545 ExprResult 11546 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11547 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11548 if (Cond.isInvalid()) 11549 return ExprError(); 11550 11551 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11552 if (LHS.isInvalid()) 11553 return ExprError(); 11554 11555 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11556 if (RHS.isInvalid()) 11557 return ExprError(); 11558 11559 if (!getDerived().AlwaysRebuild() && 11560 Cond.get() == E->getCond() && 11561 LHS.get() == E->getLHS() && 11562 RHS.get() == E->getRHS()) 11563 return E; 11564 11565 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11566 Cond.get(), LHS.get(), RHS.get(), 11567 E->getRParenLoc()); 11568 } 11569 11570 template<typename Derived> 11571 ExprResult 11572 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11573 return E; 11574 } 11575 11576 template<typename Derived> 11577 ExprResult 11578 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11579 switch (E->getOperator()) { 11580 case OO_New: 11581 case OO_Delete: 11582 case OO_Array_New: 11583 case OO_Array_Delete: 11584 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11585 11586 case OO_Subscript: 11587 case OO_Call: { 11588 // This is a call to an object's operator(). 11589 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11590 11591 // Transform the object itself. 11592 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11593 if (Object.isInvalid()) 11594 return ExprError(); 11595 11596 // FIXME: Poor location information 11597 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11598 static_cast<Expr *>(Object.get())->getEndLoc()); 11599 11600 // Transform the call arguments. 11601 SmallVector<Expr*, 8> Args; 11602 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11603 Args)) 11604 return ExprError(); 11605 11606 if (E->getOperator() == OO_Subscript) 11607 return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc, 11608 Args, E->getEndLoc()); 11609 11610 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11611 E->getEndLoc()); 11612 } 11613 11614 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 11615 case OO_##Name: \ 11616 break; 11617 11618 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11619 #include "clang/Basic/OperatorKinds.def" 11620 11621 case OO_Conditional: 11622 llvm_unreachable("conditional operator is not actually overloadable"); 11623 11624 case OO_None: 11625 case NUM_OVERLOADED_OPERATORS: 11626 llvm_unreachable("not an overloaded operator?"); 11627 } 11628 11629 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11630 if (Callee.isInvalid()) 11631 return ExprError(); 11632 11633 ExprResult First; 11634 if (E->getOperator() == OO_Amp) 11635 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11636 else 11637 First = getDerived().TransformExpr(E->getArg(0)); 11638 if (First.isInvalid()) 11639 return ExprError(); 11640 11641 ExprResult Second; 11642 if (E->getNumArgs() == 2) { 11643 Second = getDerived().TransformExpr(E->getArg(1)); 11644 if (Second.isInvalid()) 11645 return ExprError(); 11646 } 11647 11648 if (!getDerived().AlwaysRebuild() && 11649 Callee.get() == E->getCallee() && 11650 First.get() == E->getArg(0) && 11651 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11652 return SemaRef.MaybeBindToTemporary(E); 11653 11654 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11655 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11656 getSema().CurFPFeatures = 11657 NewOverrides.applyOverrides(getSema().getLangOpts()); 11658 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11659 11660 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11661 E->getOperatorLoc(), 11662 Callee.get(), 11663 First.get(), 11664 Second.get()); 11665 } 11666 11667 template<typename Derived> 11668 ExprResult 11669 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11670 return getDerived().TransformCallExpr(E); 11671 } 11672 11673 template <typename Derived> 11674 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11675 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11676 getSema().CurContext != E->getParentContext(); 11677 11678 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11679 return E; 11680 11681 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(), 11682 E->getBeginLoc(), E->getEndLoc(), 11683 getSema().CurContext); 11684 } 11685 11686 template<typename Derived> 11687 ExprResult 11688 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11689 // Transform the callee. 11690 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11691 if (Callee.isInvalid()) 11692 return ExprError(); 11693 11694 // Transform exec config. 11695 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11696 if (EC.isInvalid()) 11697 return ExprError(); 11698 11699 // Transform arguments. 11700 bool ArgChanged = false; 11701 SmallVector<Expr*, 8> Args; 11702 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11703 &ArgChanged)) 11704 return ExprError(); 11705 11706 if (!getDerived().AlwaysRebuild() && 11707 Callee.get() == E->getCallee() && 11708 !ArgChanged) 11709 return SemaRef.MaybeBindToTemporary(E); 11710 11711 // FIXME: Wrong source location information for the '('. 11712 SourceLocation FakeLParenLoc 11713 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11714 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11715 Args, 11716 E->getRParenLoc(), EC.get()); 11717 } 11718 11719 template<typename Derived> 11720 ExprResult 11721 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11722 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11723 if (!Type) 11724 return ExprError(); 11725 11726 ExprResult SubExpr 11727 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11728 if (SubExpr.isInvalid()) 11729 return ExprError(); 11730 11731 if (!getDerived().AlwaysRebuild() && 11732 Type == E->getTypeInfoAsWritten() && 11733 SubExpr.get() == E->getSubExpr()) 11734 return E; 11735 return getDerived().RebuildCXXNamedCastExpr( 11736 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11737 Type, E->getAngleBrackets().getEnd(), 11738 // FIXME. this should be '(' location 11739 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11740 } 11741 11742 template<typename Derived> 11743 ExprResult 11744 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11745 TypeSourceInfo *TSI = 11746 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11747 if (!TSI) 11748 return ExprError(); 11749 11750 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11751 if (Sub.isInvalid()) 11752 return ExprError(); 11753 11754 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11755 Sub.get(), BCE->getEndLoc()); 11756 } 11757 11758 template<typename Derived> 11759 ExprResult 11760 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11761 return getDerived().TransformCXXNamedCastExpr(E); 11762 } 11763 11764 template<typename Derived> 11765 ExprResult 11766 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11767 return getDerived().TransformCXXNamedCastExpr(E); 11768 } 11769 11770 template<typename Derived> 11771 ExprResult 11772 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11773 CXXReinterpretCastExpr *E) { 11774 return getDerived().TransformCXXNamedCastExpr(E); 11775 } 11776 11777 template<typename Derived> 11778 ExprResult 11779 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11780 return getDerived().TransformCXXNamedCastExpr(E); 11781 } 11782 11783 template<typename Derived> 11784 ExprResult 11785 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11786 return getDerived().TransformCXXNamedCastExpr(E); 11787 } 11788 11789 template<typename Derived> 11790 ExprResult 11791 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11792 CXXFunctionalCastExpr *E) { 11793 TypeSourceInfo *Type = 11794 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11795 if (!Type) 11796 return ExprError(); 11797 11798 ExprResult SubExpr 11799 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11800 if (SubExpr.isInvalid()) 11801 return ExprError(); 11802 11803 if (!getDerived().AlwaysRebuild() && 11804 Type == E->getTypeInfoAsWritten() && 11805 SubExpr.get() == E->getSubExpr()) 11806 return E; 11807 11808 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11809 E->getLParenLoc(), 11810 SubExpr.get(), 11811 E->getRParenLoc(), 11812 E->isListInitialization()); 11813 } 11814 11815 template<typename Derived> 11816 ExprResult 11817 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11818 if (E->isTypeOperand()) { 11819 TypeSourceInfo *TInfo 11820 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11821 if (!TInfo) 11822 return ExprError(); 11823 11824 if (!getDerived().AlwaysRebuild() && 11825 TInfo == E->getTypeOperandSourceInfo()) 11826 return E; 11827 11828 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11829 TInfo, E->getEndLoc()); 11830 } 11831 11832 // Typeid's operand is an unevaluated context, unless it's a polymorphic 11833 // type. We must not unilaterally enter unevaluated context here, as then 11834 // semantic processing can re-transform an already transformed operand. 11835 Expr *Op = E->getExprOperand(); 11836 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 11837 if (E->isGLValue()) 11838 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 11839 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 11840 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 11841 11842 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 11843 Sema::ReuseLambdaContextDecl); 11844 11845 ExprResult SubExpr = getDerived().TransformExpr(Op); 11846 if (SubExpr.isInvalid()) 11847 return ExprError(); 11848 11849 if (!getDerived().AlwaysRebuild() && 11850 SubExpr.get() == E->getExprOperand()) 11851 return E; 11852 11853 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11854 SubExpr.get(), E->getEndLoc()); 11855 } 11856 11857 template<typename Derived> 11858 ExprResult 11859 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11860 if (E->isTypeOperand()) { 11861 TypeSourceInfo *TInfo 11862 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11863 if (!TInfo) 11864 return ExprError(); 11865 11866 if (!getDerived().AlwaysRebuild() && 11867 TInfo == E->getTypeOperandSourceInfo()) 11868 return E; 11869 11870 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11871 TInfo, E->getEndLoc()); 11872 } 11873 11874 EnterExpressionEvaluationContext Unevaluated( 11875 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11876 11877 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11878 if (SubExpr.isInvalid()) 11879 return ExprError(); 11880 11881 if (!getDerived().AlwaysRebuild() && 11882 SubExpr.get() == E->getExprOperand()) 11883 return E; 11884 11885 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11886 SubExpr.get(), E->getEndLoc()); 11887 } 11888 11889 template<typename Derived> 11890 ExprResult 11891 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11892 return E; 11893 } 11894 11895 template<typename Derived> 11896 ExprResult 11897 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11898 CXXNullPtrLiteralExpr *E) { 11899 return E; 11900 } 11901 11902 template<typename Derived> 11903 ExprResult 11904 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11905 QualType T = getSema().getCurrentThisType(); 11906 11907 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11908 // Mark it referenced in the new context regardless. 11909 // FIXME: this is a bit instantiation-specific. 11910 getSema().MarkThisReferenced(E); 11911 return E; 11912 } 11913 11914 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11915 } 11916 11917 template<typename Derived> 11918 ExprResult 11919 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11920 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11921 if (SubExpr.isInvalid()) 11922 return ExprError(); 11923 11924 if (!getDerived().AlwaysRebuild() && 11925 SubExpr.get() == E->getSubExpr()) 11926 return E; 11927 11928 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11929 E->isThrownVariableInScope()); 11930 } 11931 11932 template<typename Derived> 11933 ExprResult 11934 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11935 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11936 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11937 if (!Param) 11938 return ExprError(); 11939 11940 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11941 E->getUsedContext() == SemaRef.CurContext) 11942 return E; 11943 11944 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11945 } 11946 11947 template<typename Derived> 11948 ExprResult 11949 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11950 FieldDecl *Field = cast_or_null<FieldDecl>( 11951 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11952 if (!Field) 11953 return ExprError(); 11954 11955 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11956 E->getUsedContext() == SemaRef.CurContext) 11957 return E; 11958 11959 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11960 } 11961 11962 template<typename Derived> 11963 ExprResult 11964 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11965 CXXScalarValueInitExpr *E) { 11966 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11967 if (!T) 11968 return ExprError(); 11969 11970 if (!getDerived().AlwaysRebuild() && 11971 T == E->getTypeSourceInfo()) 11972 return E; 11973 11974 return getDerived().RebuildCXXScalarValueInitExpr(T, 11975 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11976 E->getRParenLoc()); 11977 } 11978 11979 template<typename Derived> 11980 ExprResult 11981 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11982 // Transform the type that we're allocating 11983 TypeSourceInfo *AllocTypeInfo = 11984 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11985 if (!AllocTypeInfo) 11986 return ExprError(); 11987 11988 // Transform the size of the array we're allocating (if any). 11989 Optional<Expr *> ArraySize; 11990 if (E->isArray()) { 11991 ExprResult NewArraySize; 11992 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11993 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11994 if (NewArraySize.isInvalid()) 11995 return ExprError(); 11996 } 11997 ArraySize = NewArraySize.get(); 11998 } 11999 12000 // Transform the placement arguments (if any). 12001 bool ArgumentChanged = false; 12002 SmallVector<Expr*, 8> PlacementArgs; 12003 if (getDerived().TransformExprs(E->getPlacementArgs(), 12004 E->getNumPlacementArgs(), true, 12005 PlacementArgs, &ArgumentChanged)) 12006 return ExprError(); 12007 12008 // Transform the initializer (if any). 12009 Expr *OldInit = E->getInitializer(); 12010 ExprResult NewInit; 12011 if (OldInit) 12012 NewInit = getDerived().TransformInitializer(OldInit, true); 12013 if (NewInit.isInvalid()) 12014 return ExprError(); 12015 12016 // Transform new operator and delete operator. 12017 FunctionDecl *OperatorNew = nullptr; 12018 if (E->getOperatorNew()) { 12019 OperatorNew = cast_or_null<FunctionDecl>( 12020 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 12021 if (!OperatorNew) 12022 return ExprError(); 12023 } 12024 12025 FunctionDecl *OperatorDelete = nullptr; 12026 if (E->getOperatorDelete()) { 12027 OperatorDelete = cast_or_null<FunctionDecl>( 12028 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12029 if (!OperatorDelete) 12030 return ExprError(); 12031 } 12032 12033 if (!getDerived().AlwaysRebuild() && 12034 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 12035 ArraySize == E->getArraySize() && 12036 NewInit.get() == OldInit && 12037 OperatorNew == E->getOperatorNew() && 12038 OperatorDelete == E->getOperatorDelete() && 12039 !ArgumentChanged) { 12040 // Mark any declarations we need as referenced. 12041 // FIXME: instantiation-specific. 12042 if (OperatorNew) 12043 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 12044 if (OperatorDelete) 12045 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12046 12047 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 12048 QualType ElementType 12049 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 12050 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 12051 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 12052 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 12053 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 12054 } 12055 } 12056 } 12057 12058 return E; 12059 } 12060 12061 QualType AllocType = AllocTypeInfo->getType(); 12062 if (!ArraySize) { 12063 // If no array size was specified, but the new expression was 12064 // instantiated with an array type (e.g., "new T" where T is 12065 // instantiated with "int[4]"), extract the outer bound from the 12066 // array type as our array size. We do this with constant and 12067 // dependently-sized array types. 12068 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 12069 if (!ArrayT) { 12070 // Do nothing 12071 } else if (const ConstantArrayType *ConsArrayT 12072 = dyn_cast<ConstantArrayType>(ArrayT)) { 12073 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 12074 SemaRef.Context.getSizeType(), 12075 /*FIXME:*/ E->getBeginLoc()); 12076 AllocType = ConsArrayT->getElementType(); 12077 } else if (const DependentSizedArrayType *DepArrayT 12078 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 12079 if (DepArrayT->getSizeExpr()) { 12080 ArraySize = DepArrayT->getSizeExpr(); 12081 AllocType = DepArrayT->getElementType(); 12082 } 12083 } 12084 } 12085 12086 return getDerived().RebuildCXXNewExpr( 12087 E->getBeginLoc(), E->isGlobalNew(), 12088 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 12089 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 12090 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 12091 } 12092 12093 template<typename Derived> 12094 ExprResult 12095 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 12096 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 12097 if (Operand.isInvalid()) 12098 return ExprError(); 12099 12100 // Transform the delete operator, if known. 12101 FunctionDecl *OperatorDelete = nullptr; 12102 if (E->getOperatorDelete()) { 12103 OperatorDelete = cast_or_null<FunctionDecl>( 12104 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12105 if (!OperatorDelete) 12106 return ExprError(); 12107 } 12108 12109 if (!getDerived().AlwaysRebuild() && 12110 Operand.get() == E->getArgument() && 12111 OperatorDelete == E->getOperatorDelete()) { 12112 // Mark any declarations we need as referenced. 12113 // FIXME: instantiation-specific. 12114 if (OperatorDelete) 12115 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12116 12117 if (!E->getArgument()->isTypeDependent()) { 12118 QualType Destroyed = SemaRef.Context.getBaseElementType( 12119 E->getDestroyedType()); 12120 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 12121 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 12122 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12123 SemaRef.LookupDestructor(Record)); 12124 } 12125 } 12126 12127 return E; 12128 } 12129 12130 return getDerived().RebuildCXXDeleteExpr( 12131 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 12132 } 12133 12134 template<typename Derived> 12135 ExprResult 12136 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 12137 CXXPseudoDestructorExpr *E) { 12138 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12139 if (Base.isInvalid()) 12140 return ExprError(); 12141 12142 ParsedType ObjectTypePtr; 12143 bool MayBePseudoDestructor = false; 12144 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12145 E->getOperatorLoc(), 12146 E->isArrow()? tok::arrow : tok::period, 12147 ObjectTypePtr, 12148 MayBePseudoDestructor); 12149 if (Base.isInvalid()) 12150 return ExprError(); 12151 12152 QualType ObjectType = ObjectTypePtr.get(); 12153 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12154 if (QualifierLoc) { 12155 QualifierLoc 12156 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12157 if (!QualifierLoc) 12158 return ExprError(); 12159 } 12160 CXXScopeSpec SS; 12161 SS.Adopt(QualifierLoc); 12162 12163 PseudoDestructorTypeStorage Destroyed; 12164 if (E->getDestroyedTypeInfo()) { 12165 TypeSourceInfo *DestroyedTypeInfo 12166 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12167 ObjectType, nullptr, SS); 12168 if (!DestroyedTypeInfo) 12169 return ExprError(); 12170 Destroyed = DestroyedTypeInfo; 12171 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12172 // We aren't likely to be able to resolve the identifier down to a type 12173 // now anyway, so just retain the identifier. 12174 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12175 E->getDestroyedTypeLoc()); 12176 } else { 12177 // Look for a destructor known with the given name. 12178 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 12179 *E->getDestroyedTypeIdentifier(), 12180 E->getDestroyedTypeLoc(), 12181 /*Scope=*/nullptr, 12182 SS, ObjectTypePtr, 12183 false); 12184 if (!T) 12185 return ExprError(); 12186 12187 Destroyed 12188 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12189 E->getDestroyedTypeLoc()); 12190 } 12191 12192 TypeSourceInfo *ScopeTypeInfo = nullptr; 12193 if (E->getScopeTypeInfo()) { 12194 CXXScopeSpec EmptySS; 12195 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12196 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12197 if (!ScopeTypeInfo) 12198 return ExprError(); 12199 } 12200 12201 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12202 E->getOperatorLoc(), 12203 E->isArrow(), 12204 SS, 12205 ScopeTypeInfo, 12206 E->getColonColonLoc(), 12207 E->getTildeLoc(), 12208 Destroyed); 12209 } 12210 12211 template <typename Derived> 12212 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12213 bool RequiresADL, 12214 LookupResult &R) { 12215 // Transform all the decls. 12216 bool AllEmptyPacks = true; 12217 for (auto *OldD : Old->decls()) { 12218 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12219 if (!InstD) { 12220 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12221 // This can happen because of dependent hiding. 12222 if (isa<UsingShadowDecl>(OldD)) 12223 continue; 12224 else { 12225 R.clear(); 12226 return true; 12227 } 12228 } 12229 12230 // Expand using pack declarations. 12231 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12232 ArrayRef<NamedDecl*> Decls = SingleDecl; 12233 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12234 Decls = UPD->expansions(); 12235 12236 // Expand using declarations. 12237 for (auto *D : Decls) { 12238 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12239 for (auto *SD : UD->shadows()) 12240 R.addDecl(SD); 12241 } else { 12242 R.addDecl(D); 12243 } 12244 } 12245 12246 AllEmptyPacks &= Decls.empty(); 12247 }; 12248 12249 // C++ [temp.res]/8.4.2: 12250 // The program is ill-formed, no diagnostic required, if [...] lookup for 12251 // a name in the template definition found a using-declaration, but the 12252 // lookup in the corresponding scope in the instantiation odoes not find 12253 // any declarations because the using-declaration was a pack expansion and 12254 // the corresponding pack is empty 12255 if (AllEmptyPacks && !RequiresADL) { 12256 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12257 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12258 return true; 12259 } 12260 12261 // Resolve a kind, but don't do any further analysis. If it's 12262 // ambiguous, the callee needs to deal with it. 12263 R.resolveKind(); 12264 return false; 12265 } 12266 12267 template<typename Derived> 12268 ExprResult 12269 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12270 UnresolvedLookupExpr *Old) { 12271 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12272 Sema::LookupOrdinaryName); 12273 12274 // Transform the declaration set. 12275 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12276 return ExprError(); 12277 12278 // Rebuild the nested-name qualifier, if present. 12279 CXXScopeSpec SS; 12280 if (Old->getQualifierLoc()) { 12281 NestedNameSpecifierLoc QualifierLoc 12282 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12283 if (!QualifierLoc) 12284 return ExprError(); 12285 12286 SS.Adopt(QualifierLoc); 12287 } 12288 12289 if (Old->getNamingClass()) { 12290 CXXRecordDecl *NamingClass 12291 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12292 Old->getNameLoc(), 12293 Old->getNamingClass())); 12294 if (!NamingClass) { 12295 R.clear(); 12296 return ExprError(); 12297 } 12298 12299 R.setNamingClass(NamingClass); 12300 } 12301 12302 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12303 12304 // If we have neither explicit template arguments, nor the template keyword, 12305 // it's a normal declaration name or member reference. 12306 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12307 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12308 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12309 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12310 // give a good diagnostic. 12311 if (D && D->isCXXInstanceMember()) { 12312 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12313 /*TemplateArgs=*/nullptr, 12314 /*Scope=*/nullptr); 12315 } 12316 12317 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12318 } 12319 12320 // If we have template arguments, rebuild them, then rebuild the 12321 // templateid expression. 12322 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12323 if (Old->hasExplicitTemplateArgs() && 12324 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12325 Old->getNumTemplateArgs(), 12326 TransArgs)) { 12327 R.clear(); 12328 return ExprError(); 12329 } 12330 12331 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12332 Old->requiresADL(), &TransArgs); 12333 } 12334 12335 template<typename Derived> 12336 ExprResult 12337 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12338 bool ArgChanged = false; 12339 SmallVector<TypeSourceInfo *, 4> Args; 12340 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12341 TypeSourceInfo *From = E->getArg(I); 12342 TypeLoc FromTL = From->getTypeLoc(); 12343 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12344 TypeLocBuilder TLB; 12345 TLB.reserve(FromTL.getFullDataSize()); 12346 QualType To = getDerived().TransformType(TLB, FromTL); 12347 if (To.isNull()) 12348 return ExprError(); 12349 12350 if (To == From->getType()) 12351 Args.push_back(From); 12352 else { 12353 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12354 ArgChanged = true; 12355 } 12356 continue; 12357 } 12358 12359 ArgChanged = true; 12360 12361 // We have a pack expansion. Instantiate it. 12362 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12363 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12364 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12365 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12366 12367 // Determine whether the set of unexpanded parameter packs can and should 12368 // be expanded. 12369 bool Expand = true; 12370 bool RetainExpansion = false; 12371 Optional<unsigned> OrigNumExpansions = 12372 ExpansionTL.getTypePtr()->getNumExpansions(); 12373 Optional<unsigned> NumExpansions = OrigNumExpansions; 12374 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12375 PatternTL.getSourceRange(), 12376 Unexpanded, 12377 Expand, RetainExpansion, 12378 NumExpansions)) 12379 return ExprError(); 12380 12381 if (!Expand) { 12382 // The transform has determined that we should perform a simple 12383 // transformation on the pack expansion, producing another pack 12384 // expansion. 12385 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12386 12387 TypeLocBuilder TLB; 12388 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12389 12390 QualType To = getDerived().TransformType(TLB, PatternTL); 12391 if (To.isNull()) 12392 return ExprError(); 12393 12394 To = getDerived().RebuildPackExpansionType(To, 12395 PatternTL.getSourceRange(), 12396 ExpansionTL.getEllipsisLoc(), 12397 NumExpansions); 12398 if (To.isNull()) 12399 return ExprError(); 12400 12401 PackExpansionTypeLoc ToExpansionTL 12402 = TLB.push<PackExpansionTypeLoc>(To); 12403 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12404 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12405 continue; 12406 } 12407 12408 // Expand the pack expansion by substituting for each argument in the 12409 // pack(s). 12410 for (unsigned I = 0; I != *NumExpansions; ++I) { 12411 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12412 TypeLocBuilder TLB; 12413 TLB.reserve(PatternTL.getFullDataSize()); 12414 QualType To = getDerived().TransformType(TLB, PatternTL); 12415 if (To.isNull()) 12416 return ExprError(); 12417 12418 if (To->containsUnexpandedParameterPack()) { 12419 To = getDerived().RebuildPackExpansionType(To, 12420 PatternTL.getSourceRange(), 12421 ExpansionTL.getEllipsisLoc(), 12422 NumExpansions); 12423 if (To.isNull()) 12424 return ExprError(); 12425 12426 PackExpansionTypeLoc ToExpansionTL 12427 = TLB.push<PackExpansionTypeLoc>(To); 12428 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12429 } 12430 12431 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12432 } 12433 12434 if (!RetainExpansion) 12435 continue; 12436 12437 // If we're supposed to retain a pack expansion, do so by temporarily 12438 // forgetting the partially-substituted parameter pack. 12439 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12440 12441 TypeLocBuilder TLB; 12442 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12443 12444 QualType To = getDerived().TransformType(TLB, PatternTL); 12445 if (To.isNull()) 12446 return ExprError(); 12447 12448 To = getDerived().RebuildPackExpansionType(To, 12449 PatternTL.getSourceRange(), 12450 ExpansionTL.getEllipsisLoc(), 12451 NumExpansions); 12452 if (To.isNull()) 12453 return ExprError(); 12454 12455 PackExpansionTypeLoc ToExpansionTL 12456 = TLB.push<PackExpansionTypeLoc>(To); 12457 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12458 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12459 } 12460 12461 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12462 return E; 12463 12464 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12465 E->getEndLoc()); 12466 } 12467 12468 template<typename Derived> 12469 ExprResult 12470 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12471 ConceptSpecializationExpr *E) { 12472 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12473 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12474 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12475 Old->NumTemplateArgs, TransArgs)) 12476 return ExprError(); 12477 12478 return getDerived().RebuildConceptSpecializationExpr( 12479 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12480 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12481 &TransArgs); 12482 } 12483 12484 template<typename Derived> 12485 ExprResult 12486 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12487 SmallVector<ParmVarDecl*, 4> TransParams; 12488 SmallVector<QualType, 4> TransParamTypes; 12489 Sema::ExtParameterInfoBuilder ExtParamInfos; 12490 12491 // C++2a [expr.prim.req]p2 12492 // Expressions appearing within a requirement-body are unevaluated operands. 12493 EnterExpressionEvaluationContext Ctx( 12494 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12495 12496 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12497 getSema().Context, getSema().CurContext, 12498 E->getBody()->getBeginLoc()); 12499 12500 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12501 12502 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12503 E->getLocalParameters(), 12504 /*ParamTypes=*/nullptr, 12505 /*ParamInfos=*/nullptr, 12506 TransParamTypes, &TransParams, 12507 ExtParamInfos)) 12508 return ExprError(); 12509 12510 for (ParmVarDecl *Param : TransParams) 12511 Param->setDeclContext(Body); 12512 12513 SmallVector<concepts::Requirement *, 4> TransReqs; 12514 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12515 TransReqs)) 12516 return ExprError(); 12517 12518 for (concepts::Requirement *Req : TransReqs) { 12519 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12520 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12521 ER->getReturnTypeRequirement() 12522 .getTypeConstraintTemplateParameterList()->getParam(0) 12523 ->setDeclContext(Body); 12524 } 12525 } 12526 } 12527 12528 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12529 TransParams, TransReqs, 12530 E->getRBraceLoc()); 12531 } 12532 12533 template<typename Derived> 12534 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12535 ArrayRef<concepts::Requirement *> Reqs, 12536 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12537 for (concepts::Requirement *Req : Reqs) { 12538 concepts::Requirement *TransReq = nullptr; 12539 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12540 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12541 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12542 TransReq = getDerived().TransformExprRequirement(ExprReq); 12543 else 12544 TransReq = getDerived().TransformNestedRequirement( 12545 cast<concepts::NestedRequirement>(Req)); 12546 if (!TransReq) 12547 return true; 12548 Transformed.push_back(TransReq); 12549 } 12550 return false; 12551 } 12552 12553 template<typename Derived> 12554 concepts::TypeRequirement * 12555 TreeTransform<Derived>::TransformTypeRequirement( 12556 concepts::TypeRequirement *Req) { 12557 if (Req->isSubstitutionFailure()) { 12558 if (getDerived().AlwaysRebuild()) 12559 return getDerived().RebuildTypeRequirement( 12560 Req->getSubstitutionDiagnostic()); 12561 return Req; 12562 } 12563 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12564 if (!TransType) 12565 return nullptr; 12566 return getDerived().RebuildTypeRequirement(TransType); 12567 } 12568 12569 template<typename Derived> 12570 concepts::ExprRequirement * 12571 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12572 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12573 if (Req->isExprSubstitutionFailure()) 12574 TransExpr = Req->getExprSubstitutionDiagnostic(); 12575 else { 12576 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12577 if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType()) 12578 TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get()); 12579 if (TransExprRes.isInvalid()) 12580 return nullptr; 12581 TransExpr = TransExprRes.get(); 12582 } 12583 12584 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12585 const auto &RetReq = Req->getReturnTypeRequirement(); 12586 if (RetReq.isEmpty()) 12587 TransRetReq.emplace(); 12588 else if (RetReq.isSubstitutionFailure()) 12589 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12590 else if (RetReq.isTypeConstraint()) { 12591 TemplateParameterList *OrigTPL = 12592 RetReq.getTypeConstraintTemplateParameterList(); 12593 TemplateParameterList *TPL = 12594 getDerived().TransformTemplateParameterList(OrigTPL); 12595 if (!TPL) 12596 return nullptr; 12597 TransRetReq.emplace(TPL); 12598 } 12599 assert(TransRetReq.hasValue() && 12600 "All code paths leading here must set TransRetReq"); 12601 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12602 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12603 Req->getNoexceptLoc(), 12604 std::move(*TransRetReq)); 12605 return getDerived().RebuildExprRequirement( 12606 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12607 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12608 } 12609 12610 template<typename Derived> 12611 concepts::NestedRequirement * 12612 TreeTransform<Derived>::TransformNestedRequirement( 12613 concepts::NestedRequirement *Req) { 12614 if (Req->isSubstitutionFailure()) { 12615 if (getDerived().AlwaysRebuild()) 12616 return getDerived().RebuildNestedRequirement( 12617 Req->getSubstitutionDiagnostic()); 12618 return Req; 12619 } 12620 ExprResult TransConstraint = 12621 getDerived().TransformExpr(Req->getConstraintExpr()); 12622 if (TransConstraint.isInvalid()) 12623 return nullptr; 12624 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12625 } 12626 12627 template<typename Derived> 12628 ExprResult 12629 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12630 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12631 if (!T) 12632 return ExprError(); 12633 12634 if (!getDerived().AlwaysRebuild() && 12635 T == E->getQueriedTypeSourceInfo()) 12636 return E; 12637 12638 ExprResult SubExpr; 12639 { 12640 EnterExpressionEvaluationContext Unevaluated( 12641 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12642 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12643 if (SubExpr.isInvalid()) 12644 return ExprError(); 12645 12646 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12647 return E; 12648 } 12649 12650 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12651 SubExpr.get(), E->getEndLoc()); 12652 } 12653 12654 template<typename Derived> 12655 ExprResult 12656 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12657 ExprResult SubExpr; 12658 { 12659 EnterExpressionEvaluationContext Unevaluated( 12660 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12661 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12662 if (SubExpr.isInvalid()) 12663 return ExprError(); 12664 12665 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12666 return E; 12667 } 12668 12669 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12670 SubExpr.get(), E->getEndLoc()); 12671 } 12672 12673 template <typename Derived> 12674 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12675 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12676 TypeSourceInfo **RecoveryTSI) { 12677 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12678 DRE, AddrTaken, RecoveryTSI); 12679 12680 // Propagate both errors and recovered types, which return ExprEmpty. 12681 if (!NewDRE.isUsable()) 12682 return NewDRE; 12683 12684 // We got an expr, wrap it up in parens. 12685 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12686 return PE; 12687 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12688 PE->getRParen()); 12689 } 12690 12691 template <typename Derived> 12692 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12693 DependentScopeDeclRefExpr *E) { 12694 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12695 nullptr); 12696 } 12697 12698 template <typename Derived> 12699 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12700 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 12701 TypeSourceInfo **RecoveryTSI) { 12702 assert(E->getQualifierLoc()); 12703 NestedNameSpecifierLoc QualifierLoc = 12704 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12705 if (!QualifierLoc) 12706 return ExprError(); 12707 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12708 12709 // TODO: If this is a conversion-function-id, verify that the 12710 // destination type name (if present) resolves the same way after 12711 // instantiation as it did in the local scope. 12712 12713 DeclarationNameInfo NameInfo = 12714 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12715 if (!NameInfo.getName()) 12716 return ExprError(); 12717 12718 if (!E->hasExplicitTemplateArgs()) { 12719 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 12720 // Note: it is sufficient to compare the Name component of NameInfo: 12721 // if name has not changed, DNLoc has not changed either. 12722 NameInfo.getName() == E->getDeclName()) 12723 return E; 12724 12725 return getDerived().RebuildDependentScopeDeclRefExpr( 12726 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12727 IsAddressOfOperand, RecoveryTSI); 12728 } 12729 12730 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12731 if (getDerived().TransformTemplateArguments( 12732 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 12733 return ExprError(); 12734 12735 return getDerived().RebuildDependentScopeDeclRefExpr( 12736 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12737 RecoveryTSI); 12738 } 12739 12740 template<typename Derived> 12741 ExprResult 12742 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12743 // CXXConstructExprs other than for list-initialization and 12744 // CXXTemporaryObjectExpr are always implicit, so when we have 12745 // a 1-argument construction we just transform that argument. 12746 if (getDerived().AllowSkippingCXXConstructExpr() && 12747 ((E->getNumArgs() == 1 || 12748 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12749 (!getDerived().DropCallArgument(E->getArg(0))) && 12750 !E->isListInitialization())) 12751 return getDerived().TransformInitializer(E->getArg(0), 12752 /*DirectInit*/ false); 12753 12754 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12755 12756 QualType T = getDerived().TransformType(E->getType()); 12757 if (T.isNull()) 12758 return ExprError(); 12759 12760 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12761 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12762 if (!Constructor) 12763 return ExprError(); 12764 12765 bool ArgumentChanged = false; 12766 SmallVector<Expr*, 8> Args; 12767 { 12768 EnterExpressionEvaluationContext Context( 12769 getSema(), EnterExpressionEvaluationContext::InitList, 12770 E->isListInitialization()); 12771 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12772 &ArgumentChanged)) 12773 return ExprError(); 12774 } 12775 12776 if (!getDerived().AlwaysRebuild() && 12777 T == E->getType() && 12778 Constructor == E->getConstructor() && 12779 !ArgumentChanged) { 12780 // Mark the constructor as referenced. 12781 // FIXME: Instantiation-specific 12782 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12783 return E; 12784 } 12785 12786 return getDerived().RebuildCXXConstructExpr( 12787 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12788 E->hadMultipleCandidates(), E->isListInitialization(), 12789 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12790 E->getConstructionKind(), E->getParenOrBraceRange()); 12791 } 12792 12793 template<typename Derived> 12794 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12795 CXXInheritedCtorInitExpr *E) { 12796 QualType T = getDerived().TransformType(E->getType()); 12797 if (T.isNull()) 12798 return ExprError(); 12799 12800 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12801 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12802 if (!Constructor) 12803 return ExprError(); 12804 12805 if (!getDerived().AlwaysRebuild() && 12806 T == E->getType() && 12807 Constructor == E->getConstructor()) { 12808 // Mark the constructor as referenced. 12809 // FIXME: Instantiation-specific 12810 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12811 return E; 12812 } 12813 12814 return getDerived().RebuildCXXInheritedCtorInitExpr( 12815 T, E->getLocation(), Constructor, 12816 E->constructsVBase(), E->inheritedFromVBase()); 12817 } 12818 12819 /// Transform a C++ temporary-binding expression. 12820 /// 12821 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12822 /// transform the subexpression and return that. 12823 template<typename Derived> 12824 ExprResult 12825 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12826 if (auto *Dtor = E->getTemporary()->getDestructor()) 12827 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12828 const_cast<CXXDestructorDecl *>(Dtor)); 12829 return getDerived().TransformExpr(E->getSubExpr()); 12830 } 12831 12832 /// Transform a C++ expression that contains cleanups that should 12833 /// be run after the expression is evaluated. 12834 /// 12835 /// Since ExprWithCleanups nodes are implicitly generated, we 12836 /// just transform the subexpression and return that. 12837 template<typename Derived> 12838 ExprResult 12839 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12840 return getDerived().TransformExpr(E->getSubExpr()); 12841 } 12842 12843 template<typename Derived> 12844 ExprResult 12845 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12846 CXXTemporaryObjectExpr *E) { 12847 TypeSourceInfo *T = 12848 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12849 if (!T) 12850 return ExprError(); 12851 12852 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12853 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12854 if (!Constructor) 12855 return ExprError(); 12856 12857 bool ArgumentChanged = false; 12858 SmallVector<Expr*, 8> Args; 12859 Args.reserve(E->getNumArgs()); 12860 { 12861 EnterExpressionEvaluationContext Context( 12862 getSema(), EnterExpressionEvaluationContext::InitList, 12863 E->isListInitialization()); 12864 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12865 &ArgumentChanged)) 12866 return ExprError(); 12867 } 12868 12869 if (!getDerived().AlwaysRebuild() && 12870 T == E->getTypeSourceInfo() && 12871 Constructor == E->getConstructor() && 12872 !ArgumentChanged) { 12873 // FIXME: Instantiation-specific 12874 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12875 return SemaRef.MaybeBindToTemporary(E); 12876 } 12877 12878 // FIXME: We should just pass E->isListInitialization(), but we're not 12879 // prepared to handle list-initialization without a child InitListExpr. 12880 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12881 return getDerived().RebuildCXXTemporaryObjectExpr( 12882 T, LParenLoc, Args, E->getEndLoc(), 12883 /*ListInitialization=*/LParenLoc.isInvalid()); 12884 } 12885 12886 template<typename Derived> 12887 ExprResult 12888 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12889 // Transform any init-capture expressions before entering the scope of the 12890 // lambda body, because they are not semantically within that scope. 12891 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12892 struct TransformedInitCapture { 12893 // The location of the ... if the result is retaining a pack expansion. 12894 SourceLocation EllipsisLoc; 12895 // Zero or more expansions of the init-capture. 12896 SmallVector<InitCaptureInfoTy, 4> Expansions; 12897 }; 12898 SmallVector<TransformedInitCapture, 4> InitCaptures; 12899 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12900 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12901 CEnd = E->capture_end(); 12902 C != CEnd; ++C) { 12903 if (!E->isInitCapture(C)) 12904 continue; 12905 12906 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12907 VarDecl *OldVD = C->getCapturedVar(); 12908 12909 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12910 Optional<unsigned> NumExpansions) { 12911 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12912 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12913 12914 if (NewExprInitResult.isInvalid()) { 12915 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12916 return; 12917 } 12918 Expr *NewExprInit = NewExprInitResult.get(); 12919 12920 QualType NewInitCaptureType = 12921 getSema().buildLambdaInitCaptureInitialization( 12922 C->getLocation(), OldVD->getType()->isReferenceType(), 12923 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12924 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12925 NewExprInit); 12926 Result.Expansions.push_back( 12927 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12928 }; 12929 12930 // If this is an init-capture pack, consider expanding the pack now. 12931 if (OldVD->isParameterPack()) { 12932 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12933 ->getTypeLoc() 12934 .castAs<PackExpansionTypeLoc>(); 12935 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12936 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12937 12938 // Determine whether the set of unexpanded parameter packs can and should 12939 // be expanded. 12940 bool Expand = true; 12941 bool RetainExpansion = false; 12942 Optional<unsigned> OrigNumExpansions = 12943 ExpansionTL.getTypePtr()->getNumExpansions(); 12944 Optional<unsigned> NumExpansions = OrigNumExpansions; 12945 if (getDerived().TryExpandParameterPacks( 12946 ExpansionTL.getEllipsisLoc(), 12947 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12948 RetainExpansion, NumExpansions)) 12949 return ExprError(); 12950 if (Expand) { 12951 for (unsigned I = 0; I != *NumExpansions; ++I) { 12952 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12953 SubstInitCapture(SourceLocation(), None); 12954 } 12955 } 12956 if (!Expand || RetainExpansion) { 12957 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12958 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12959 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12960 } 12961 } else { 12962 SubstInitCapture(SourceLocation(), None); 12963 } 12964 } 12965 12966 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12967 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12968 12969 // Transform the template parameters, and add them to the current 12970 // instantiation scope. The null case is handled correctly. 12971 auto TPL = getDerived().TransformTemplateParameterList( 12972 E->getTemplateParameterList()); 12973 LSI->GLTemplateParameterList = TPL; 12974 12975 // Transform the type of the original lambda's call operator. 12976 // The transformation MUST be done in the CurrentInstantiationScope since 12977 // it introduces a mapping of the original to the newly created 12978 // transformed parameters. 12979 TypeSourceInfo *NewCallOpTSI = nullptr; 12980 { 12981 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12982 FunctionProtoTypeLoc OldCallOpFPTL = 12983 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12984 12985 TypeLocBuilder NewCallOpTLBuilder; 12986 SmallVector<QualType, 4> ExceptionStorage; 12987 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12988 QualType NewCallOpType = TransformFunctionProtoType( 12989 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12990 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12991 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12992 ExceptionStorage, Changed); 12993 }); 12994 if (NewCallOpType.isNull()) 12995 return ExprError(); 12996 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12997 NewCallOpType); 12998 } 12999 13000 // Transform the trailing requires clause 13001 ExprResult NewTrailingRequiresClause; 13002 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 13003 // FIXME: Concepts: Substitution into requires clause should only happen 13004 // when checking satisfaction. 13005 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 13006 13007 // Create the local class that will describe the lambda. 13008 13009 // FIXME: DependencyKind below is wrong when substituting inside a templated 13010 // context that isn't a DeclContext (such as a variable template), or when 13011 // substituting an unevaluated lambda inside of a function's parameter's type 13012 // - as parameter types are not instantiated from within a function's DC. We 13013 // use isUnevaluatedContext() to distinguish the function parameter case. 13014 CXXRecordDecl::LambdaDependencyKind DependencyKind = 13015 CXXRecordDecl::LDK_Unknown; 13016 if (getSema().isUnevaluatedContext() && 13017 (getSema().CurContext->isFileContext() || 13018 !getSema().CurContext->getParent()->isDependentContext())) 13019 DependencyKind = CXXRecordDecl::LDK_NeverDependent; 13020 13021 CXXRecordDecl *OldClass = E->getLambdaClass(); 13022 CXXRecordDecl *Class = 13023 getSema().createLambdaClosureType(E->getIntroducerRange(), NewCallOpTSI, 13024 DependencyKind, E->getCaptureDefault()); 13025 13026 getDerived().transformedLocalDecl(OldClass, {Class}); 13027 13028 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 13029 if (getDerived().ReplacingOriginal()) 13030 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 13031 OldClass->getLambdaManglingNumber(), 13032 OldClass->getDeviceLambdaManglingNumber(), 13033 OldClass->getLambdaContextDecl()); 13034 13035 // Build the call operator. 13036 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 13037 Class, E->getIntroducerRange(), NewCallOpTSI, 13038 E->getCallOperator()->getEndLoc(), 13039 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 13040 E->getCallOperator()->getConstexprKind(), 13041 NewTrailingRequiresClause.get()); 13042 13043 LSI->CallOperator = NewCallOperator; 13044 13045 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 13046 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 13047 13048 // Number the lambda for linkage purposes if necessary. 13049 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 13050 13051 // Introduce the context of the call operator. 13052 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 13053 /*NewThisContext*/false); 13054 13055 // Enter the scope of the lambda. 13056 getSema().buildLambdaScope(LSI, NewCallOperator, 13057 E->getIntroducerRange(), 13058 E->getCaptureDefault(), 13059 E->getCaptureDefaultLoc(), 13060 E->hasExplicitParameters(), 13061 E->hasExplicitResultType(), 13062 E->isMutable()); 13063 13064 bool Invalid = false; 13065 13066 // Transform captures. 13067 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13068 CEnd = E->capture_end(); 13069 C != CEnd; ++C) { 13070 // When we hit the first implicit capture, tell Sema that we've finished 13071 // the list of explicit captures. 13072 if (C->isImplicit()) 13073 break; 13074 13075 // Capturing 'this' is trivial. 13076 if (C->capturesThis()) { 13077 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13078 /*BuildAndDiagnose*/ true, nullptr, 13079 C->getCaptureKind() == LCK_StarThis); 13080 continue; 13081 } 13082 // Captured expression will be recaptured during captured variables 13083 // rebuilding. 13084 if (C->capturesVLAType()) 13085 continue; 13086 13087 // Rebuild init-captures, including the implied field declaration. 13088 if (E->isInitCapture(C)) { 13089 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 13090 13091 VarDecl *OldVD = C->getCapturedVar(); 13092 llvm::SmallVector<Decl*, 4> NewVDs; 13093 13094 for (InitCaptureInfoTy &Info : NewC.Expansions) { 13095 ExprResult Init = Info.first; 13096 QualType InitQualType = Info.second; 13097 if (Init.isInvalid() || InitQualType.isNull()) { 13098 Invalid = true; 13099 break; 13100 } 13101 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 13102 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 13103 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 13104 if (!NewVD) { 13105 Invalid = true; 13106 break; 13107 } 13108 NewVDs.push_back(NewVD); 13109 getSema().addInitCapture(LSI, NewVD); 13110 } 13111 13112 if (Invalid) 13113 break; 13114 13115 getDerived().transformedLocalDecl(OldVD, NewVDs); 13116 continue; 13117 } 13118 13119 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13120 13121 // Determine the capture kind for Sema. 13122 Sema::TryCaptureKind Kind 13123 = C->isImplicit()? Sema::TryCapture_Implicit 13124 : C->getCaptureKind() == LCK_ByCopy 13125 ? Sema::TryCapture_ExplicitByVal 13126 : Sema::TryCapture_ExplicitByRef; 13127 SourceLocation EllipsisLoc; 13128 if (C->isPackExpansion()) { 13129 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 13130 bool ShouldExpand = false; 13131 bool RetainExpansion = false; 13132 Optional<unsigned> NumExpansions; 13133 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 13134 C->getLocation(), 13135 Unexpanded, 13136 ShouldExpand, RetainExpansion, 13137 NumExpansions)) { 13138 Invalid = true; 13139 continue; 13140 } 13141 13142 if (ShouldExpand) { 13143 // The transform has determined that we should perform an expansion; 13144 // transform and capture each of the arguments. 13145 // expansion of the pattern. Do so. 13146 VarDecl *Pack = C->getCapturedVar(); 13147 for (unsigned I = 0; I != *NumExpansions; ++I) { 13148 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13149 VarDecl *CapturedVar 13150 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13151 Pack)); 13152 if (!CapturedVar) { 13153 Invalid = true; 13154 continue; 13155 } 13156 13157 // Capture the transformed variable. 13158 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 13159 } 13160 13161 // FIXME: Retain a pack expansion if RetainExpansion is true. 13162 13163 continue; 13164 } 13165 13166 EllipsisLoc = C->getEllipsisLoc(); 13167 } 13168 13169 // Transform the captured variable. 13170 VarDecl *CapturedVar 13171 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13172 C->getCapturedVar())); 13173 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13174 Invalid = true; 13175 continue; 13176 } 13177 13178 // Capture the transformed variable. 13179 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13180 EllipsisLoc); 13181 } 13182 getSema().finishLambdaExplicitCaptures(LSI); 13183 13184 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13185 // evaluation context even if we're not transforming the function body. 13186 getSema().PushExpressionEvaluationContext( 13187 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13188 13189 // Instantiate the body of the lambda expression. 13190 StmtResult Body = 13191 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13192 13193 // ActOnLambda* will pop the function scope for us. 13194 FuncScopeCleanup.disable(); 13195 13196 if (Body.isInvalid()) { 13197 SavedContext.pop(); 13198 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13199 /*IsInstantiation=*/true); 13200 return ExprError(); 13201 } 13202 13203 // Copy the LSI before ActOnFinishFunctionBody removes it. 13204 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13205 // the call operator. 13206 auto LSICopy = *LSI; 13207 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13208 /*IsInstantiation*/ true); 13209 SavedContext.pop(); 13210 13211 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13212 &LSICopy); 13213 } 13214 13215 template<typename Derived> 13216 StmtResult 13217 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13218 return TransformStmt(S); 13219 } 13220 13221 template<typename Derived> 13222 StmtResult 13223 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13224 // Transform captures. 13225 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13226 CEnd = E->capture_end(); 13227 C != CEnd; ++C) { 13228 // When we hit the first implicit capture, tell Sema that we've finished 13229 // the list of explicit captures. 13230 if (!C->isImplicit()) 13231 continue; 13232 13233 // Capturing 'this' is trivial. 13234 if (C->capturesThis()) { 13235 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13236 /*BuildAndDiagnose*/ true, nullptr, 13237 C->getCaptureKind() == LCK_StarThis); 13238 continue; 13239 } 13240 // Captured expression will be recaptured during captured variables 13241 // rebuilding. 13242 if (C->capturesVLAType()) 13243 continue; 13244 13245 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13246 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13247 13248 // Transform the captured variable. 13249 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13250 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13251 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13252 return StmtError(); 13253 13254 // Capture the transformed variable. 13255 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13256 } 13257 13258 return S; 13259 } 13260 13261 template<typename Derived> 13262 ExprResult 13263 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13264 CXXUnresolvedConstructExpr *E) { 13265 TypeSourceInfo *T = 13266 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13267 if (!T) 13268 return ExprError(); 13269 13270 bool ArgumentChanged = false; 13271 SmallVector<Expr*, 8> Args; 13272 Args.reserve(E->getNumArgs()); 13273 { 13274 EnterExpressionEvaluationContext Context( 13275 getSema(), EnterExpressionEvaluationContext::InitList, 13276 E->isListInitialization()); 13277 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13278 &ArgumentChanged)) 13279 return ExprError(); 13280 } 13281 13282 if (!getDerived().AlwaysRebuild() && 13283 T == E->getTypeSourceInfo() && 13284 !ArgumentChanged) 13285 return E; 13286 13287 // FIXME: we're faking the locations of the commas 13288 return getDerived().RebuildCXXUnresolvedConstructExpr( 13289 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13290 } 13291 13292 template<typename Derived> 13293 ExprResult 13294 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13295 CXXDependentScopeMemberExpr *E) { 13296 // Transform the base of the expression. 13297 ExprResult Base((Expr*) nullptr); 13298 Expr *OldBase; 13299 QualType BaseType; 13300 QualType ObjectType; 13301 if (!E->isImplicitAccess()) { 13302 OldBase = E->getBase(); 13303 Base = getDerived().TransformExpr(OldBase); 13304 if (Base.isInvalid()) 13305 return ExprError(); 13306 13307 // Start the member reference and compute the object's type. 13308 ParsedType ObjectTy; 13309 bool MayBePseudoDestructor = false; 13310 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13311 E->getOperatorLoc(), 13312 E->isArrow()? tok::arrow : tok::period, 13313 ObjectTy, 13314 MayBePseudoDestructor); 13315 if (Base.isInvalid()) 13316 return ExprError(); 13317 13318 ObjectType = ObjectTy.get(); 13319 BaseType = ((Expr*) Base.get())->getType(); 13320 } else { 13321 OldBase = nullptr; 13322 BaseType = getDerived().TransformType(E->getBaseType()); 13323 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13324 } 13325 13326 // Transform the first part of the nested-name-specifier that qualifies 13327 // the member name. 13328 NamedDecl *FirstQualifierInScope 13329 = getDerived().TransformFirstQualifierInScope( 13330 E->getFirstQualifierFoundInScope(), 13331 E->getQualifierLoc().getBeginLoc()); 13332 13333 NestedNameSpecifierLoc QualifierLoc; 13334 if (E->getQualifier()) { 13335 QualifierLoc 13336 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13337 ObjectType, 13338 FirstQualifierInScope); 13339 if (!QualifierLoc) 13340 return ExprError(); 13341 } 13342 13343 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13344 13345 // TODO: If this is a conversion-function-id, verify that the 13346 // destination type name (if present) resolves the same way after 13347 // instantiation as it did in the local scope. 13348 13349 DeclarationNameInfo NameInfo 13350 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13351 if (!NameInfo.getName()) 13352 return ExprError(); 13353 13354 if (!E->hasExplicitTemplateArgs()) { 13355 // This is a reference to a member without an explicitly-specified 13356 // template argument list. Optimize for this common case. 13357 if (!getDerived().AlwaysRebuild() && 13358 Base.get() == OldBase && 13359 BaseType == E->getBaseType() && 13360 QualifierLoc == E->getQualifierLoc() && 13361 NameInfo.getName() == E->getMember() && 13362 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13363 return E; 13364 13365 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13366 BaseType, 13367 E->isArrow(), 13368 E->getOperatorLoc(), 13369 QualifierLoc, 13370 TemplateKWLoc, 13371 FirstQualifierInScope, 13372 NameInfo, 13373 /*TemplateArgs*/nullptr); 13374 } 13375 13376 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13377 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13378 E->getNumTemplateArgs(), 13379 TransArgs)) 13380 return ExprError(); 13381 13382 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13383 BaseType, 13384 E->isArrow(), 13385 E->getOperatorLoc(), 13386 QualifierLoc, 13387 TemplateKWLoc, 13388 FirstQualifierInScope, 13389 NameInfo, 13390 &TransArgs); 13391 } 13392 13393 template <typename Derived> 13394 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13395 UnresolvedMemberExpr *Old) { 13396 // Transform the base of the expression. 13397 ExprResult Base((Expr *)nullptr); 13398 QualType BaseType; 13399 if (!Old->isImplicitAccess()) { 13400 Base = getDerived().TransformExpr(Old->getBase()); 13401 if (Base.isInvalid()) 13402 return ExprError(); 13403 Base = 13404 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13405 if (Base.isInvalid()) 13406 return ExprError(); 13407 BaseType = Base.get()->getType(); 13408 } else { 13409 BaseType = getDerived().TransformType(Old->getBaseType()); 13410 } 13411 13412 NestedNameSpecifierLoc QualifierLoc; 13413 if (Old->getQualifierLoc()) { 13414 QualifierLoc = 13415 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13416 if (!QualifierLoc) 13417 return ExprError(); 13418 } 13419 13420 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13421 13422 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13423 13424 // Transform the declaration set. 13425 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13426 return ExprError(); 13427 13428 // Determine the naming class. 13429 if (Old->getNamingClass()) { 13430 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13431 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13432 if (!NamingClass) 13433 return ExprError(); 13434 13435 R.setNamingClass(NamingClass); 13436 } 13437 13438 TemplateArgumentListInfo TransArgs; 13439 if (Old->hasExplicitTemplateArgs()) { 13440 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13441 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13442 if (getDerived().TransformTemplateArguments( 13443 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13444 return ExprError(); 13445 } 13446 13447 // FIXME: to do this check properly, we will need to preserve the 13448 // first-qualifier-in-scope here, just in case we had a dependent 13449 // base (and therefore couldn't do the check) and a 13450 // nested-name-qualifier (and therefore could do the lookup). 13451 NamedDecl *FirstQualifierInScope = nullptr; 13452 13453 return getDerived().RebuildUnresolvedMemberExpr( 13454 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13455 TemplateKWLoc, FirstQualifierInScope, R, 13456 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13457 } 13458 13459 template<typename Derived> 13460 ExprResult 13461 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13462 EnterExpressionEvaluationContext Unevaluated( 13463 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13464 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13465 if (SubExpr.isInvalid()) 13466 return ExprError(); 13467 13468 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13469 return E; 13470 13471 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13472 } 13473 13474 template<typename Derived> 13475 ExprResult 13476 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13477 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13478 if (Pattern.isInvalid()) 13479 return ExprError(); 13480 13481 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13482 return E; 13483 13484 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13485 E->getNumExpansions()); 13486 } 13487 13488 template<typename Derived> 13489 ExprResult 13490 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13491 // If E is not value-dependent, then nothing will change when we transform it. 13492 // Note: This is an instantiation-centric view. 13493 if (!E->isValueDependent()) 13494 return E; 13495 13496 EnterExpressionEvaluationContext Unevaluated( 13497 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13498 13499 ArrayRef<TemplateArgument> PackArgs; 13500 TemplateArgument ArgStorage; 13501 13502 // Find the argument list to transform. 13503 if (E->isPartiallySubstituted()) { 13504 PackArgs = E->getPartialArguments(); 13505 } else if (E->isValueDependent()) { 13506 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13507 bool ShouldExpand = false; 13508 bool RetainExpansion = false; 13509 Optional<unsigned> NumExpansions; 13510 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13511 Unexpanded, 13512 ShouldExpand, RetainExpansion, 13513 NumExpansions)) 13514 return ExprError(); 13515 13516 // If we need to expand the pack, build a template argument from it and 13517 // expand that. 13518 if (ShouldExpand) { 13519 auto *Pack = E->getPack(); 13520 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13521 ArgStorage = getSema().Context.getPackExpansionType( 13522 getSema().Context.getTypeDeclType(TTPD), None); 13523 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13524 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13525 } else { 13526 auto *VD = cast<ValueDecl>(Pack); 13527 ExprResult DRE = getSema().BuildDeclRefExpr( 13528 VD, VD->getType().getNonLValueExprType(getSema().Context), 13529 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 13530 E->getPackLoc()); 13531 if (DRE.isInvalid()) 13532 return ExprError(); 13533 ArgStorage = new (getSema().Context) PackExpansionExpr( 13534 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13535 } 13536 PackArgs = ArgStorage; 13537 } 13538 } 13539 13540 // If we're not expanding the pack, just transform the decl. 13541 if (!PackArgs.size()) { 13542 auto *Pack = cast_or_null<NamedDecl>( 13543 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13544 if (!Pack) 13545 return ExprError(); 13546 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13547 E->getPackLoc(), 13548 E->getRParenLoc(), None, None); 13549 } 13550 13551 // Try to compute the result without performing a partial substitution. 13552 Optional<unsigned> Result = 0; 13553 for (const TemplateArgument &Arg : PackArgs) { 13554 if (!Arg.isPackExpansion()) { 13555 Result = *Result + 1; 13556 continue; 13557 } 13558 13559 TemplateArgumentLoc ArgLoc; 13560 InventTemplateArgumentLoc(Arg, ArgLoc); 13561 13562 // Find the pattern of the pack expansion. 13563 SourceLocation Ellipsis; 13564 Optional<unsigned> OrigNumExpansions; 13565 TemplateArgumentLoc Pattern = 13566 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13567 OrigNumExpansions); 13568 13569 // Substitute under the pack expansion. Do not expand the pack (yet). 13570 TemplateArgumentLoc OutPattern; 13571 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13572 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13573 /*Uneval*/ true)) 13574 return true; 13575 13576 // See if we can determine the number of arguments from the result. 13577 Optional<unsigned> NumExpansions = 13578 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13579 if (!NumExpansions) { 13580 // No: we must be in an alias template expansion, and we're going to need 13581 // to actually expand the packs. 13582 Result = None; 13583 break; 13584 } 13585 13586 Result = *Result + *NumExpansions; 13587 } 13588 13589 // Common case: we could determine the number of expansions without 13590 // substituting. 13591 if (Result) 13592 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13593 E->getPackLoc(), 13594 E->getRParenLoc(), *Result, None); 13595 13596 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13597 E->getPackLoc()); 13598 { 13599 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13600 typedef TemplateArgumentLocInventIterator< 13601 Derived, const TemplateArgument*> PackLocIterator; 13602 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13603 PackLocIterator(*this, PackArgs.end()), 13604 TransformedPackArgs, /*Uneval*/true)) 13605 return ExprError(); 13606 } 13607 13608 // Check whether we managed to fully-expand the pack. 13609 // FIXME: Is it possible for us to do so and not hit the early exit path? 13610 SmallVector<TemplateArgument, 8> Args; 13611 bool PartialSubstitution = false; 13612 for (auto &Loc : TransformedPackArgs.arguments()) { 13613 Args.push_back(Loc.getArgument()); 13614 if (Loc.getArgument().isPackExpansion()) 13615 PartialSubstitution = true; 13616 } 13617 13618 if (PartialSubstitution) 13619 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13620 E->getPackLoc(), 13621 E->getRParenLoc(), None, Args); 13622 13623 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13624 E->getPackLoc(), E->getRParenLoc(), 13625 Args.size(), None); 13626 } 13627 13628 template<typename Derived> 13629 ExprResult 13630 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13631 SubstNonTypeTemplateParmPackExpr *E) { 13632 // Default behavior is to do nothing with this transformation. 13633 return E; 13634 } 13635 13636 template<typename Derived> 13637 ExprResult 13638 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13639 SubstNonTypeTemplateParmExpr *E) { 13640 // Default behavior is to do nothing with this transformation. 13641 return E; 13642 } 13643 13644 template<typename Derived> 13645 ExprResult 13646 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13647 // Default behavior is to do nothing with this transformation. 13648 return E; 13649 } 13650 13651 template<typename Derived> 13652 ExprResult 13653 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13654 MaterializeTemporaryExpr *E) { 13655 return getDerived().TransformExpr(E->getSubExpr()); 13656 } 13657 13658 template<typename Derived> 13659 ExprResult 13660 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13661 UnresolvedLookupExpr *Callee = nullptr; 13662 if (Expr *OldCallee = E->getCallee()) { 13663 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13664 if (CalleeResult.isInvalid()) 13665 return ExprError(); 13666 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13667 } 13668 13669 Expr *Pattern = E->getPattern(); 13670 13671 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13672 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13673 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13674 13675 // Determine whether the set of unexpanded parameter packs can and should 13676 // be expanded. 13677 bool Expand = true; 13678 bool RetainExpansion = false; 13679 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13680 NumExpansions = OrigNumExpansions; 13681 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13682 Pattern->getSourceRange(), 13683 Unexpanded, 13684 Expand, RetainExpansion, 13685 NumExpansions)) 13686 return true; 13687 13688 if (!Expand) { 13689 // Do not expand any packs here, just transform and rebuild a fold 13690 // expression. 13691 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13692 13693 ExprResult LHS = 13694 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13695 if (LHS.isInvalid()) 13696 return true; 13697 13698 ExprResult RHS = 13699 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13700 if (RHS.isInvalid()) 13701 return true; 13702 13703 if (!getDerived().AlwaysRebuild() && 13704 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13705 return E; 13706 13707 return getDerived().RebuildCXXFoldExpr( 13708 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13709 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13710 } 13711 13712 // Formally a fold expression expands to nested parenthesized expressions. 13713 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13714 // them. 13715 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13716 SemaRef.Diag(E->getEllipsisLoc(), 13717 clang::diag::err_fold_expression_limit_exceeded) 13718 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13719 << E->getSourceRange(); 13720 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13721 return ExprError(); 13722 } 13723 13724 // The transform has determined that we should perform an elementwise 13725 // expansion of the pattern. Do so. 13726 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13727 if (Result.isInvalid()) 13728 return true; 13729 bool LeftFold = E->isLeftFold(); 13730 13731 // If we're retaining an expansion for a right fold, it is the innermost 13732 // component and takes the init (if any). 13733 if (!LeftFold && RetainExpansion) { 13734 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13735 13736 ExprResult Out = getDerived().TransformExpr(Pattern); 13737 if (Out.isInvalid()) 13738 return true; 13739 13740 Result = getDerived().RebuildCXXFoldExpr( 13741 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13742 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13743 if (Result.isInvalid()) 13744 return true; 13745 } 13746 13747 for (unsigned I = 0; I != *NumExpansions; ++I) { 13748 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13749 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13750 ExprResult Out = getDerived().TransformExpr(Pattern); 13751 if (Out.isInvalid()) 13752 return true; 13753 13754 if (Out.get()->containsUnexpandedParameterPack()) { 13755 // We still have a pack; retain a pack expansion for this slice. 13756 Result = getDerived().RebuildCXXFoldExpr( 13757 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13758 E->getOperator(), E->getEllipsisLoc(), 13759 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13760 OrigNumExpansions); 13761 } else if (Result.isUsable()) { 13762 // We've got down to a single element; build a binary operator. 13763 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13764 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13765 if (Callee) 13766 Result = getDerived().RebuildCXXOperatorCallExpr( 13767 BinaryOperator::getOverloadedOperator(E->getOperator()), 13768 E->getEllipsisLoc(), Callee, LHS, RHS); 13769 else 13770 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13771 E->getOperator(), LHS, RHS); 13772 } else 13773 Result = Out; 13774 13775 if (Result.isInvalid()) 13776 return true; 13777 } 13778 13779 // If we're retaining an expansion for a left fold, it is the outermost 13780 // component and takes the complete expansion so far as its init (if any). 13781 if (LeftFold && RetainExpansion) { 13782 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13783 13784 ExprResult Out = getDerived().TransformExpr(Pattern); 13785 if (Out.isInvalid()) 13786 return true; 13787 13788 Result = getDerived().RebuildCXXFoldExpr( 13789 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13790 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13791 if (Result.isInvalid()) 13792 return true; 13793 } 13794 13795 // If we had no init and an empty pack, and we're not retaining an expansion, 13796 // then produce a fallback value or error. 13797 if (Result.isUnset()) 13798 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13799 E->getOperator()); 13800 13801 return Result; 13802 } 13803 13804 template<typename Derived> 13805 ExprResult 13806 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13807 CXXStdInitializerListExpr *E) { 13808 return getDerived().TransformExpr(E->getSubExpr()); 13809 } 13810 13811 template<typename Derived> 13812 ExprResult 13813 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13814 return SemaRef.MaybeBindToTemporary(E); 13815 } 13816 13817 template<typename Derived> 13818 ExprResult 13819 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13820 return E; 13821 } 13822 13823 template<typename Derived> 13824 ExprResult 13825 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13826 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13827 if (SubExpr.isInvalid()) 13828 return ExprError(); 13829 13830 if (!getDerived().AlwaysRebuild() && 13831 SubExpr.get() == E->getSubExpr()) 13832 return E; 13833 13834 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13835 } 13836 13837 template<typename Derived> 13838 ExprResult 13839 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13840 // Transform each of the elements. 13841 SmallVector<Expr *, 8> Elements; 13842 bool ArgChanged = false; 13843 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13844 /*IsCall=*/false, Elements, &ArgChanged)) 13845 return ExprError(); 13846 13847 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13848 return SemaRef.MaybeBindToTemporary(E); 13849 13850 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13851 Elements.data(), 13852 Elements.size()); 13853 } 13854 13855 template<typename Derived> 13856 ExprResult 13857 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13858 ObjCDictionaryLiteral *E) { 13859 // Transform each of the elements. 13860 SmallVector<ObjCDictionaryElement, 8> Elements; 13861 bool ArgChanged = false; 13862 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13863 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13864 13865 if (OrigElement.isPackExpansion()) { 13866 // This key/value element is a pack expansion. 13867 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13868 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13869 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13870 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13871 13872 // Determine whether the set of unexpanded parameter packs can 13873 // and should be expanded. 13874 bool Expand = true; 13875 bool RetainExpansion = false; 13876 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13877 Optional<unsigned> NumExpansions = OrigNumExpansions; 13878 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13879 OrigElement.Value->getEndLoc()); 13880 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13881 PatternRange, Unexpanded, Expand, 13882 RetainExpansion, NumExpansions)) 13883 return ExprError(); 13884 13885 if (!Expand) { 13886 // The transform has determined that we should perform a simple 13887 // transformation on the pack expansion, producing another pack 13888 // expansion. 13889 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13890 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13891 if (Key.isInvalid()) 13892 return ExprError(); 13893 13894 if (Key.get() != OrigElement.Key) 13895 ArgChanged = true; 13896 13897 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13898 if (Value.isInvalid()) 13899 return ExprError(); 13900 13901 if (Value.get() != OrigElement.Value) 13902 ArgChanged = true; 13903 13904 ObjCDictionaryElement Expansion = { 13905 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13906 }; 13907 Elements.push_back(Expansion); 13908 continue; 13909 } 13910 13911 // Record right away that the argument was changed. This needs 13912 // to happen even if the array expands to nothing. 13913 ArgChanged = true; 13914 13915 // The transform has determined that we should perform an elementwise 13916 // expansion of the pattern. Do so. 13917 for (unsigned I = 0; I != *NumExpansions; ++I) { 13918 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13919 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13920 if (Key.isInvalid()) 13921 return ExprError(); 13922 13923 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13924 if (Value.isInvalid()) 13925 return ExprError(); 13926 13927 ObjCDictionaryElement Element = { 13928 Key.get(), Value.get(), SourceLocation(), NumExpansions 13929 }; 13930 13931 // If any unexpanded parameter packs remain, we still have a 13932 // pack expansion. 13933 // FIXME: Can this really happen? 13934 if (Key.get()->containsUnexpandedParameterPack() || 13935 Value.get()->containsUnexpandedParameterPack()) 13936 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13937 13938 Elements.push_back(Element); 13939 } 13940 13941 // FIXME: Retain a pack expansion if RetainExpansion is true. 13942 13943 // We've finished with this pack expansion. 13944 continue; 13945 } 13946 13947 // Transform and check key. 13948 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13949 if (Key.isInvalid()) 13950 return ExprError(); 13951 13952 if (Key.get() != OrigElement.Key) 13953 ArgChanged = true; 13954 13955 // Transform and check value. 13956 ExprResult Value 13957 = getDerived().TransformExpr(OrigElement.Value); 13958 if (Value.isInvalid()) 13959 return ExprError(); 13960 13961 if (Value.get() != OrigElement.Value) 13962 ArgChanged = true; 13963 13964 ObjCDictionaryElement Element = { 13965 Key.get(), Value.get(), SourceLocation(), None 13966 }; 13967 Elements.push_back(Element); 13968 } 13969 13970 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13971 return SemaRef.MaybeBindToTemporary(E); 13972 13973 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13974 Elements); 13975 } 13976 13977 template<typename Derived> 13978 ExprResult 13979 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13980 TypeSourceInfo *EncodedTypeInfo 13981 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13982 if (!EncodedTypeInfo) 13983 return ExprError(); 13984 13985 if (!getDerived().AlwaysRebuild() && 13986 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13987 return E; 13988 13989 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13990 EncodedTypeInfo, 13991 E->getRParenLoc()); 13992 } 13993 13994 template<typename Derived> 13995 ExprResult TreeTransform<Derived>:: 13996 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13997 // This is a kind of implicit conversion, and it needs to get dropped 13998 // and recomputed for the same general reasons that ImplicitCastExprs 13999 // do, as well a more specific one: this expression is only valid when 14000 // it appears *immediately* as an argument expression. 14001 return getDerived().TransformExpr(E->getSubExpr()); 14002 } 14003 14004 template<typename Derived> 14005 ExprResult TreeTransform<Derived>:: 14006 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 14007 TypeSourceInfo *TSInfo 14008 = getDerived().TransformType(E->getTypeInfoAsWritten()); 14009 if (!TSInfo) 14010 return ExprError(); 14011 14012 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 14013 if (Result.isInvalid()) 14014 return ExprError(); 14015 14016 if (!getDerived().AlwaysRebuild() && 14017 TSInfo == E->getTypeInfoAsWritten() && 14018 Result.get() == E->getSubExpr()) 14019 return E; 14020 14021 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 14022 E->getBridgeKeywordLoc(), TSInfo, 14023 Result.get()); 14024 } 14025 14026 template <typename Derived> 14027 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 14028 ObjCAvailabilityCheckExpr *E) { 14029 return E; 14030 } 14031 14032 template<typename Derived> 14033 ExprResult 14034 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 14035 // Transform arguments. 14036 bool ArgChanged = false; 14037 SmallVector<Expr*, 8> Args; 14038 Args.reserve(E->getNumArgs()); 14039 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 14040 &ArgChanged)) 14041 return ExprError(); 14042 14043 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 14044 // Class message: transform the receiver type. 14045 TypeSourceInfo *ReceiverTypeInfo 14046 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 14047 if (!ReceiverTypeInfo) 14048 return ExprError(); 14049 14050 // If nothing changed, just retain the existing message send. 14051 if (!getDerived().AlwaysRebuild() && 14052 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 14053 return SemaRef.MaybeBindToTemporary(E); 14054 14055 // Build a new class message send. 14056 SmallVector<SourceLocation, 16> SelLocs; 14057 E->getSelectorLocs(SelLocs); 14058 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 14059 E->getSelector(), 14060 SelLocs, 14061 E->getMethodDecl(), 14062 E->getLeftLoc(), 14063 Args, 14064 E->getRightLoc()); 14065 } 14066 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 14067 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 14068 if (!E->getMethodDecl()) 14069 return ExprError(); 14070 14071 // Build a new class message send to 'super'. 14072 SmallVector<SourceLocation, 16> SelLocs; 14073 E->getSelectorLocs(SelLocs); 14074 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 14075 E->getSelector(), 14076 SelLocs, 14077 E->getReceiverType(), 14078 E->getMethodDecl(), 14079 E->getLeftLoc(), 14080 Args, 14081 E->getRightLoc()); 14082 } 14083 14084 // Instance message: transform the receiver 14085 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 14086 "Only class and instance messages may be instantiated"); 14087 ExprResult Receiver 14088 = getDerived().TransformExpr(E->getInstanceReceiver()); 14089 if (Receiver.isInvalid()) 14090 return ExprError(); 14091 14092 // If nothing changed, just retain the existing message send. 14093 if (!getDerived().AlwaysRebuild() && 14094 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 14095 return SemaRef.MaybeBindToTemporary(E); 14096 14097 // Build a new instance message send. 14098 SmallVector<SourceLocation, 16> SelLocs; 14099 E->getSelectorLocs(SelLocs); 14100 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 14101 E->getSelector(), 14102 SelLocs, 14103 E->getMethodDecl(), 14104 E->getLeftLoc(), 14105 Args, 14106 E->getRightLoc()); 14107 } 14108 14109 template<typename Derived> 14110 ExprResult 14111 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 14112 return E; 14113 } 14114 14115 template<typename Derived> 14116 ExprResult 14117 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 14118 return E; 14119 } 14120 14121 template<typename Derived> 14122 ExprResult 14123 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 14124 // Transform the base expression. 14125 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14126 if (Base.isInvalid()) 14127 return ExprError(); 14128 14129 // We don't need to transform the ivar; it will never change. 14130 14131 // If nothing changed, just retain the existing expression. 14132 if (!getDerived().AlwaysRebuild() && 14133 Base.get() == E->getBase()) 14134 return E; 14135 14136 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 14137 E->getLocation(), 14138 E->isArrow(), E->isFreeIvar()); 14139 } 14140 14141 template<typename Derived> 14142 ExprResult 14143 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 14144 // 'super' and types never change. Property never changes. Just 14145 // retain the existing expression. 14146 if (!E->isObjectReceiver()) 14147 return E; 14148 14149 // Transform the base expression. 14150 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14151 if (Base.isInvalid()) 14152 return ExprError(); 14153 14154 // We don't need to transform the property; it will never change. 14155 14156 // If nothing changed, just retain the existing expression. 14157 if (!getDerived().AlwaysRebuild() && 14158 Base.get() == E->getBase()) 14159 return E; 14160 14161 if (E->isExplicitProperty()) 14162 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14163 E->getExplicitProperty(), 14164 E->getLocation()); 14165 14166 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14167 SemaRef.Context.PseudoObjectTy, 14168 E->getImplicitPropertyGetter(), 14169 E->getImplicitPropertySetter(), 14170 E->getLocation()); 14171 } 14172 14173 template<typename Derived> 14174 ExprResult 14175 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14176 // Transform the base expression. 14177 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14178 if (Base.isInvalid()) 14179 return ExprError(); 14180 14181 // Transform the key expression. 14182 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14183 if (Key.isInvalid()) 14184 return ExprError(); 14185 14186 // If nothing changed, just retain the existing expression. 14187 if (!getDerived().AlwaysRebuild() && 14188 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14189 return E; 14190 14191 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14192 Base.get(), Key.get(), 14193 E->getAtIndexMethodDecl(), 14194 E->setAtIndexMethodDecl()); 14195 } 14196 14197 template<typename Derived> 14198 ExprResult 14199 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14200 // Transform the base expression. 14201 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14202 if (Base.isInvalid()) 14203 return ExprError(); 14204 14205 // If nothing changed, just retain the existing expression. 14206 if (!getDerived().AlwaysRebuild() && 14207 Base.get() == E->getBase()) 14208 return E; 14209 14210 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14211 E->getOpLoc(), 14212 E->isArrow()); 14213 } 14214 14215 template<typename Derived> 14216 ExprResult 14217 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14218 bool ArgumentChanged = false; 14219 SmallVector<Expr*, 8> SubExprs; 14220 SubExprs.reserve(E->getNumSubExprs()); 14221 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14222 SubExprs, &ArgumentChanged)) 14223 return ExprError(); 14224 14225 if (!getDerived().AlwaysRebuild() && 14226 !ArgumentChanged) 14227 return E; 14228 14229 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14230 SubExprs, 14231 E->getRParenLoc()); 14232 } 14233 14234 template<typename Derived> 14235 ExprResult 14236 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14237 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14238 if (SrcExpr.isInvalid()) 14239 return ExprError(); 14240 14241 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14242 if (!Type) 14243 return ExprError(); 14244 14245 if (!getDerived().AlwaysRebuild() && 14246 Type == E->getTypeSourceInfo() && 14247 SrcExpr.get() == E->getSrcExpr()) 14248 return E; 14249 14250 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14251 SrcExpr.get(), Type, 14252 E->getRParenLoc()); 14253 } 14254 14255 template<typename Derived> 14256 ExprResult 14257 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14258 BlockDecl *oldBlock = E->getBlockDecl(); 14259 14260 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14261 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14262 14263 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14264 blockScope->TheDecl->setBlockMissingReturnType( 14265 oldBlock->blockMissingReturnType()); 14266 14267 SmallVector<ParmVarDecl*, 4> params; 14268 SmallVector<QualType, 4> paramTypes; 14269 14270 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14271 14272 // Parameter substitution. 14273 Sema::ExtParameterInfoBuilder extParamInfos; 14274 if (getDerived().TransformFunctionTypeParams( 14275 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14276 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14277 extParamInfos)) { 14278 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14279 return ExprError(); 14280 } 14281 14282 QualType exprResultType = 14283 getDerived().TransformType(exprFunctionType->getReturnType()); 14284 14285 auto epi = exprFunctionType->getExtProtoInfo(); 14286 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14287 14288 QualType functionType = 14289 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14290 blockScope->FunctionType = functionType; 14291 14292 // Set the parameters on the block decl. 14293 if (!params.empty()) 14294 blockScope->TheDecl->setParams(params); 14295 14296 if (!oldBlock->blockMissingReturnType()) { 14297 blockScope->HasImplicitReturnType = false; 14298 blockScope->ReturnType = exprResultType; 14299 } 14300 14301 // Transform the body 14302 StmtResult body = getDerived().TransformStmt(E->getBody()); 14303 if (body.isInvalid()) { 14304 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14305 return ExprError(); 14306 } 14307 14308 #ifndef NDEBUG 14309 // In builds with assertions, make sure that we captured everything we 14310 // captured before. 14311 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14312 for (const auto &I : oldBlock->captures()) { 14313 VarDecl *oldCapture = I.getVariable(); 14314 14315 // Ignore parameter packs. 14316 if (oldCapture->isParameterPack()) 14317 continue; 14318 14319 VarDecl *newCapture = 14320 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14321 oldCapture)); 14322 assert(blockScope->CaptureMap.count(newCapture)); 14323 } 14324 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14325 } 14326 #endif 14327 14328 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14329 /*Scope=*/nullptr); 14330 } 14331 14332 template<typename Derived> 14333 ExprResult 14334 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14335 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14336 if (SrcExpr.isInvalid()) 14337 return ExprError(); 14338 14339 QualType Type = getDerived().TransformType(E->getType()); 14340 14341 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14342 E->getRParenLoc()); 14343 } 14344 14345 template<typename Derived> 14346 ExprResult 14347 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14348 bool ArgumentChanged = false; 14349 SmallVector<Expr*, 8> SubExprs; 14350 SubExprs.reserve(E->getNumSubExprs()); 14351 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14352 SubExprs, &ArgumentChanged)) 14353 return ExprError(); 14354 14355 if (!getDerived().AlwaysRebuild() && 14356 !ArgumentChanged) 14357 return E; 14358 14359 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14360 E->getOp(), E->getRParenLoc()); 14361 } 14362 14363 //===----------------------------------------------------------------------===// 14364 // Type reconstruction 14365 //===----------------------------------------------------------------------===// 14366 14367 template<typename Derived> 14368 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14369 SourceLocation Star) { 14370 return SemaRef.BuildPointerType(PointeeType, Star, 14371 getDerived().getBaseEntity()); 14372 } 14373 14374 template<typename Derived> 14375 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14376 SourceLocation Star) { 14377 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14378 getDerived().getBaseEntity()); 14379 } 14380 14381 template<typename Derived> 14382 QualType 14383 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14384 bool WrittenAsLValue, 14385 SourceLocation Sigil) { 14386 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14387 Sigil, getDerived().getBaseEntity()); 14388 } 14389 14390 template<typename Derived> 14391 QualType 14392 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14393 QualType ClassType, 14394 SourceLocation Sigil) { 14395 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14396 getDerived().getBaseEntity()); 14397 } 14398 14399 template<typename Derived> 14400 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14401 const ObjCTypeParamDecl *Decl, 14402 SourceLocation ProtocolLAngleLoc, 14403 ArrayRef<ObjCProtocolDecl *> Protocols, 14404 ArrayRef<SourceLocation> ProtocolLocs, 14405 SourceLocation ProtocolRAngleLoc) { 14406 return SemaRef.BuildObjCTypeParamType(Decl, 14407 ProtocolLAngleLoc, Protocols, 14408 ProtocolLocs, ProtocolRAngleLoc, 14409 /*FailOnError=*/true); 14410 } 14411 14412 template<typename Derived> 14413 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14414 QualType BaseType, 14415 SourceLocation Loc, 14416 SourceLocation TypeArgsLAngleLoc, 14417 ArrayRef<TypeSourceInfo *> TypeArgs, 14418 SourceLocation TypeArgsRAngleLoc, 14419 SourceLocation ProtocolLAngleLoc, 14420 ArrayRef<ObjCProtocolDecl *> Protocols, 14421 ArrayRef<SourceLocation> ProtocolLocs, 14422 SourceLocation ProtocolRAngleLoc) { 14423 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14424 TypeArgs, TypeArgsRAngleLoc, 14425 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14426 ProtocolRAngleLoc, 14427 /*FailOnError=*/true); 14428 } 14429 14430 template<typename Derived> 14431 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14432 QualType PointeeType, 14433 SourceLocation Star) { 14434 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14435 } 14436 14437 template<typename Derived> 14438 QualType 14439 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14440 ArrayType::ArraySizeModifier SizeMod, 14441 const llvm::APInt *Size, 14442 Expr *SizeExpr, 14443 unsigned IndexTypeQuals, 14444 SourceRange BracketsRange) { 14445 if (SizeExpr || !Size) 14446 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14447 IndexTypeQuals, BracketsRange, 14448 getDerived().getBaseEntity()); 14449 14450 QualType Types[] = { 14451 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14452 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14453 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14454 }; 14455 const unsigned NumTypes = llvm::array_lengthof(Types); 14456 QualType SizeType; 14457 for (unsigned I = 0; I != NumTypes; ++I) 14458 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14459 SizeType = Types[I]; 14460 break; 14461 } 14462 14463 // Note that we can return a VariableArrayType here in the case where 14464 // the element type was a dependent VariableArrayType. 14465 IntegerLiteral *ArraySize 14466 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14467 /*FIXME*/BracketsRange.getBegin()); 14468 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14469 IndexTypeQuals, BracketsRange, 14470 getDerived().getBaseEntity()); 14471 } 14472 14473 template<typename Derived> 14474 QualType 14475 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14476 ArrayType::ArraySizeModifier SizeMod, 14477 const llvm::APInt &Size, 14478 Expr *SizeExpr, 14479 unsigned IndexTypeQuals, 14480 SourceRange BracketsRange) { 14481 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14482 IndexTypeQuals, BracketsRange); 14483 } 14484 14485 template<typename Derived> 14486 QualType 14487 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14488 ArrayType::ArraySizeModifier SizeMod, 14489 unsigned IndexTypeQuals, 14490 SourceRange BracketsRange) { 14491 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14492 IndexTypeQuals, BracketsRange); 14493 } 14494 14495 template<typename Derived> 14496 QualType 14497 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14498 ArrayType::ArraySizeModifier SizeMod, 14499 Expr *SizeExpr, 14500 unsigned IndexTypeQuals, 14501 SourceRange BracketsRange) { 14502 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14503 SizeExpr, 14504 IndexTypeQuals, BracketsRange); 14505 } 14506 14507 template<typename Derived> 14508 QualType 14509 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14510 ArrayType::ArraySizeModifier SizeMod, 14511 Expr *SizeExpr, 14512 unsigned IndexTypeQuals, 14513 SourceRange BracketsRange) { 14514 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14515 SizeExpr, 14516 IndexTypeQuals, BracketsRange); 14517 } 14518 14519 template <typename Derived> 14520 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14521 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14522 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14523 AttributeLoc); 14524 } 14525 14526 template <typename Derived> 14527 QualType 14528 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14529 unsigned NumElements, 14530 VectorType::VectorKind VecKind) { 14531 // FIXME: semantic checking! 14532 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14533 } 14534 14535 template <typename Derived> 14536 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14537 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14538 VectorType::VectorKind VecKind) { 14539 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14540 } 14541 14542 template<typename Derived> 14543 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14544 unsigned NumElements, 14545 SourceLocation AttributeLoc) { 14546 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14547 NumElements, true); 14548 IntegerLiteral *VectorSize 14549 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14550 AttributeLoc); 14551 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14552 } 14553 14554 template<typename Derived> 14555 QualType 14556 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14557 Expr *SizeExpr, 14558 SourceLocation AttributeLoc) { 14559 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14560 } 14561 14562 template <typename Derived> 14563 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14564 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14565 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14566 NumColumns); 14567 } 14568 14569 template <typename Derived> 14570 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14571 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14572 SourceLocation AttributeLoc) { 14573 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14574 AttributeLoc); 14575 } 14576 14577 template<typename Derived> 14578 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14579 QualType T, 14580 MutableArrayRef<QualType> ParamTypes, 14581 const FunctionProtoType::ExtProtoInfo &EPI) { 14582 return SemaRef.BuildFunctionType(T, ParamTypes, 14583 getDerived().getBaseLocation(), 14584 getDerived().getBaseEntity(), 14585 EPI); 14586 } 14587 14588 template<typename Derived> 14589 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14590 return SemaRef.Context.getFunctionNoProtoType(T); 14591 } 14592 14593 template<typename Derived> 14594 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14595 Decl *D) { 14596 assert(D && "no decl found"); 14597 if (D->isInvalidDecl()) return QualType(); 14598 14599 // FIXME: Doesn't account for ObjCInterfaceDecl! 14600 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14601 // A valid resolved using typename pack expansion decl can have multiple 14602 // UsingDecls, but they must each have exactly one type, and it must be 14603 // the same type in every case. But we must have at least one expansion! 14604 if (UPD->expansions().empty()) { 14605 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14606 << UPD->isCXXClassMember() << UPD; 14607 return QualType(); 14608 } 14609 14610 // We might still have some unresolved types. Try to pick a resolved type 14611 // if we can. The final instantiation will check that the remaining 14612 // unresolved types instantiate to the type we pick. 14613 QualType FallbackT; 14614 QualType T; 14615 for (auto *E : UPD->expansions()) { 14616 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14617 if (ThisT.isNull()) 14618 continue; 14619 else if (ThisT->getAs<UnresolvedUsingType>()) 14620 FallbackT = ThisT; 14621 else if (T.isNull()) 14622 T = ThisT; 14623 else 14624 assert(getSema().Context.hasSameType(ThisT, T) && 14625 "mismatched resolved types in using pack expansion"); 14626 } 14627 return T.isNull() ? FallbackT : T; 14628 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14629 assert(Using->hasTypename() && 14630 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14631 14632 // A valid resolved using typename decl points to exactly one type decl. 14633 assert(++Using->shadow_begin() == Using->shadow_end()); 14634 14635 UsingShadowDecl *Shadow = *Using->shadow_begin(); 14636 if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc)) 14637 return QualType(); 14638 return SemaRef.Context.getUsingType( 14639 Shadow, SemaRef.Context.getTypeDeclType( 14640 cast<TypeDecl>(Shadow->getTargetDecl()))); 14641 } else { 14642 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14643 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14644 return SemaRef.Context.getTypeDeclType( 14645 cast<UnresolvedUsingTypenameDecl>(D)); 14646 } 14647 } 14648 14649 template <typename Derived> 14650 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14651 SourceLocation) { 14652 return SemaRef.BuildTypeofExprType(E); 14653 } 14654 14655 template<typename Derived> 14656 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14657 return SemaRef.Context.getTypeOfType(Underlying); 14658 } 14659 14660 template <typename Derived> 14661 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) { 14662 return SemaRef.BuildDecltypeType(E); 14663 } 14664 14665 template<typename Derived> 14666 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14667 UnaryTransformType::UTTKind UKind, 14668 SourceLocation Loc) { 14669 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14670 } 14671 14672 template<typename Derived> 14673 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14674 TemplateName Template, 14675 SourceLocation TemplateNameLoc, 14676 TemplateArgumentListInfo &TemplateArgs) { 14677 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14678 } 14679 14680 template<typename Derived> 14681 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14682 SourceLocation KWLoc) { 14683 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14684 } 14685 14686 template<typename Derived> 14687 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14688 SourceLocation KWLoc, 14689 bool isReadPipe) { 14690 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14691 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14692 } 14693 14694 template <typename Derived> 14695 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned, 14696 unsigned NumBits, 14697 SourceLocation Loc) { 14698 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14699 NumBits, true); 14700 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14701 SemaRef.Context.IntTy, Loc); 14702 return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc); 14703 } 14704 14705 template <typename Derived> 14706 QualType TreeTransform<Derived>::RebuildDependentBitIntType( 14707 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14708 return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc); 14709 } 14710 14711 template<typename Derived> 14712 TemplateName 14713 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14714 bool TemplateKW, 14715 TemplateDecl *Template) { 14716 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14717 TemplateName(Template)); 14718 } 14719 14720 template<typename Derived> 14721 TemplateName 14722 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14723 SourceLocation TemplateKWLoc, 14724 const IdentifierInfo &Name, 14725 SourceLocation NameLoc, 14726 QualType ObjectType, 14727 NamedDecl *FirstQualifierInScope, 14728 bool AllowInjectedClassName) { 14729 UnqualifiedId TemplateName; 14730 TemplateName.setIdentifier(&Name, NameLoc); 14731 Sema::TemplateTy Template; 14732 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14733 TemplateName, ParsedType::make(ObjectType), 14734 /*EnteringContext=*/false, Template, 14735 AllowInjectedClassName); 14736 return Template.get(); 14737 } 14738 14739 template<typename Derived> 14740 TemplateName 14741 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14742 SourceLocation TemplateKWLoc, 14743 OverloadedOperatorKind Operator, 14744 SourceLocation NameLoc, 14745 QualType ObjectType, 14746 bool AllowInjectedClassName) { 14747 UnqualifiedId Name; 14748 // FIXME: Bogus location information. 14749 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14750 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14751 Sema::TemplateTy Template; 14752 getSema().ActOnTemplateName( 14753 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14754 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14755 return Template.get(); 14756 } 14757 14758 template<typename Derived> 14759 ExprResult 14760 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14761 SourceLocation OpLoc, 14762 Expr *OrigCallee, 14763 Expr *First, 14764 Expr *Second) { 14765 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14766 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14767 14768 if (First->getObjectKind() == OK_ObjCProperty) { 14769 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14770 if (BinaryOperator::isAssignmentOp(Opc)) 14771 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14772 First, Second); 14773 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14774 if (Result.isInvalid()) 14775 return ExprError(); 14776 First = Result.get(); 14777 } 14778 14779 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14780 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14781 if (Result.isInvalid()) 14782 return ExprError(); 14783 Second = Result.get(); 14784 } 14785 14786 // Determine whether this should be a builtin operation. 14787 if (Op == OO_Subscript) { 14788 if (!First->getType()->isOverloadableType() && 14789 !Second->getType()->isOverloadableType()) 14790 return getSema().CreateBuiltinArraySubscriptExpr( 14791 First, Callee->getBeginLoc(), Second, OpLoc); 14792 } else if (Op == OO_Arrow) { 14793 // It is possible that the type refers to a RecoveryExpr created earlier 14794 // in the tree transformation. 14795 if (First->getType()->isDependentType()) 14796 return ExprError(); 14797 // -> is never a builtin operation. 14798 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14799 } else if (Second == nullptr || isPostIncDec) { 14800 if (!First->getType()->isOverloadableType() || 14801 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14802 // The argument is not of overloadable type, or this is an expression 14803 // of the form &Class::member, so try to create a built-in unary 14804 // operation. 14805 UnaryOperatorKind Opc 14806 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14807 14808 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14809 } 14810 } else { 14811 if (!First->getType()->isOverloadableType() && 14812 !Second->getType()->isOverloadableType()) { 14813 // Neither of the arguments is an overloadable type, so try to 14814 // create a built-in binary operation. 14815 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14816 ExprResult Result 14817 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14818 if (Result.isInvalid()) 14819 return ExprError(); 14820 14821 return Result; 14822 } 14823 } 14824 14825 // Compute the transformed set of functions (and function templates) to be 14826 // used during overload resolution. 14827 UnresolvedSet<16> Functions; 14828 bool RequiresADL; 14829 14830 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14831 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14832 // If the overload could not be resolved in the template definition 14833 // (because we had a dependent argument), ADL is performed as part of 14834 // template instantiation. 14835 RequiresADL = ULE->requiresADL(); 14836 } else { 14837 // If we've resolved this to a particular non-member function, just call 14838 // that function. If we resolved it to a member function, 14839 // CreateOverloaded* will find that function for us. 14840 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14841 if (!isa<CXXMethodDecl>(ND)) 14842 Functions.addDecl(ND); 14843 RequiresADL = false; 14844 } 14845 14846 // Add any functions found via argument-dependent lookup. 14847 Expr *Args[2] = { First, Second }; 14848 unsigned NumArgs = 1 + (Second != nullptr); 14849 14850 // Create the overloaded operator invocation for unary operators. 14851 if (NumArgs == 1 || isPostIncDec) { 14852 UnaryOperatorKind Opc 14853 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14854 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14855 RequiresADL); 14856 } 14857 14858 if (Op == OO_Subscript) { 14859 SourceLocation LBrace; 14860 SourceLocation RBrace; 14861 14862 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14863 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14864 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14865 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14866 } else { 14867 LBrace = Callee->getBeginLoc(); 14868 RBrace = OpLoc; 14869 } 14870 14871 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14872 First, Second); 14873 } 14874 14875 // Create the overloaded operator invocation for binary operators. 14876 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14877 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14878 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14879 if (Result.isInvalid()) 14880 return ExprError(); 14881 14882 return Result; 14883 } 14884 14885 template<typename Derived> 14886 ExprResult 14887 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14888 SourceLocation OperatorLoc, 14889 bool isArrow, 14890 CXXScopeSpec &SS, 14891 TypeSourceInfo *ScopeType, 14892 SourceLocation CCLoc, 14893 SourceLocation TildeLoc, 14894 PseudoDestructorTypeStorage Destroyed) { 14895 QualType BaseType = Base->getType(); 14896 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14897 (!isArrow && !BaseType->getAs<RecordType>()) || 14898 (isArrow && BaseType->getAs<PointerType>() && 14899 !BaseType->castAs<PointerType>()->getPointeeType() 14900 ->template getAs<RecordType>())){ 14901 // This pseudo-destructor expression is still a pseudo-destructor. 14902 return SemaRef.BuildPseudoDestructorExpr( 14903 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14904 CCLoc, TildeLoc, Destroyed); 14905 } 14906 14907 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14908 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14909 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14910 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14911 NameInfo.setNamedTypeInfo(DestroyedType); 14912 14913 // The scope type is now known to be a valid nested name specifier 14914 // component. Tack it on to the end of the nested name specifier. 14915 if (ScopeType) { 14916 if (!ScopeType->getType()->getAs<TagType>()) { 14917 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14918 diag::err_expected_class_or_namespace) 14919 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14920 return ExprError(); 14921 } 14922 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14923 CCLoc); 14924 } 14925 14926 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14927 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14928 OperatorLoc, isArrow, 14929 SS, TemplateKWLoc, 14930 /*FIXME: FirstQualifier*/ nullptr, 14931 NameInfo, 14932 /*TemplateArgs*/ nullptr, 14933 /*S*/nullptr); 14934 } 14935 14936 template<typename Derived> 14937 StmtResult 14938 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14939 SourceLocation Loc = S->getBeginLoc(); 14940 CapturedDecl *CD = S->getCapturedDecl(); 14941 unsigned NumParams = CD->getNumParams(); 14942 unsigned ContextParamPos = CD->getContextParamPosition(); 14943 SmallVector<Sema::CapturedParamNameType, 4> Params; 14944 for (unsigned I = 0; I < NumParams; ++I) { 14945 if (I != ContextParamPos) { 14946 Params.push_back( 14947 std::make_pair( 14948 CD->getParam(I)->getName(), 14949 getDerived().TransformType(CD->getParam(I)->getType()))); 14950 } else { 14951 Params.push_back(std::make_pair(StringRef(), QualType())); 14952 } 14953 } 14954 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14955 S->getCapturedRegionKind(), Params); 14956 StmtResult Body; 14957 { 14958 Sema::CompoundScopeRAII CompoundScope(getSema()); 14959 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14960 } 14961 14962 if (Body.isInvalid()) { 14963 getSema().ActOnCapturedRegionError(); 14964 return StmtError(); 14965 } 14966 14967 return getSema().ActOnCapturedRegionEnd(Body.get()); 14968 } 14969 14970 } // end namespace clang 14971 14972 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14973