1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 //===----------------------------------------------------------------------===// 7 // 8 // This file implements a semantic tree transformation that takes a given 9 // AST and rebuilds it, possibly transforming some nodes in the process. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 16 #include "CoroutineStmtBuilder.h" 17 #include "TypeLocBuilder.h" 18 #include "clang/AST/Decl.h" 19 #include "clang/AST/DeclObjC.h" 20 #include "clang/AST/DeclTemplate.h" 21 #include "clang/AST/Expr.h" 22 #include "clang/AST/ExprConcepts.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/OpenMPClause.h" 27 #include "clang/AST/Stmt.h" 28 #include "clang/AST/StmtCXX.h" 29 #include "clang/AST/StmtObjC.h" 30 #include "clang/AST/StmtOpenMP.h" 31 #include "clang/Basic/DiagnosticParse.h" 32 #include "clang/Basic/OpenMPKinds.h" 33 #include "clang/Sema/Designator.h" 34 #include "clang/Sema/Lookup.h" 35 #include "clang/Sema/Ownership.h" 36 #include "clang/Sema/ParsedTemplate.h" 37 #include "clang/Sema/ScopeInfo.h" 38 #include "clang/Sema/SemaDiagnostic.h" 39 #include "clang/Sema/SemaInternal.h" 40 #include "llvm/ADT/ArrayRef.h" 41 #include "llvm/Support/ErrorHandling.h" 42 #include <algorithm> 43 44 using namespace llvm::omp; 45 46 namespace clang { 47 using namespace sema; 48 49 /// A semantic tree transformation that allows one to transform one 50 /// abstract syntax tree into another. 51 /// 52 /// A new tree transformation is defined by creating a new subclass \c X of 53 /// \c TreeTransform<X> and then overriding certain operations to provide 54 /// behavior specific to that transformation. For example, template 55 /// instantiation is implemented as a tree transformation where the 56 /// transformation of TemplateTypeParmType nodes involves substituting the 57 /// template arguments for their corresponding template parameters; a similar 58 /// transformation is performed for non-type template parameters and 59 /// template template parameters. 60 /// 61 /// This tree-transformation template uses static polymorphism to allow 62 /// subclasses to customize any of its operations. Thus, a subclass can 63 /// override any of the transformation or rebuild operators by providing an 64 /// operation with the same signature as the default implementation. The 65 /// overriding function should not be virtual. 66 /// 67 /// Semantic tree transformations are split into two stages, either of which 68 /// can be replaced by a subclass. The "transform" step transforms an AST node 69 /// or the parts of an AST node using the various transformation functions, 70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 71 /// node of the appropriate kind from the pieces. The default transformation 72 /// routines recursively transform the operands to composite AST nodes (e.g., 73 /// the pointee type of a PointerType node) and, if any of those operand nodes 74 /// were changed by the transformation, invokes the rebuild operation to create 75 /// a new AST node. 76 /// 77 /// Subclasses can customize the transformation at various levels. The 78 /// most coarse-grained transformations involve replacing TransformType(), 79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 81 /// new implementations. 82 /// 83 /// For more fine-grained transformations, subclasses can replace any of the 84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 86 /// replacing TransformTemplateTypeParmType() allows template instantiation 87 /// to substitute template arguments for their corresponding template 88 /// parameters. Additionally, subclasses can override the \c RebuildXXX 89 /// functions to control how AST nodes are rebuilt when their operands change. 90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 92 /// be able to use more efficient rebuild steps. 93 /// 94 /// There are a handful of other functions that can be overridden, allowing one 95 /// to avoid traversing nodes that don't need any transformation 96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 97 /// operands have not changed (\c AlwaysRebuild()), and customize the 98 /// default locations and entity names used for type-checking 99 /// (\c getBaseLocation(), \c getBaseEntity()). 100 template<typename Derived> 101 class TreeTransform { 102 /// Private RAII object that helps us forget and then re-remember 103 /// the template argument corresponding to a partially-substituted parameter 104 /// pack. 105 class ForgetPartiallySubstitutedPackRAII { 106 Derived &Self; 107 TemplateArgument Old; 108 109 public: 110 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 111 Old = Self.ForgetPartiallySubstitutedPack(); 112 } 113 114 ~ForgetPartiallySubstitutedPackRAII() { 115 Self.RememberPartiallySubstitutedPack(Old); 116 } 117 }; 118 119 protected: 120 Sema &SemaRef; 121 122 /// The set of local declarations that have been transformed, for 123 /// cases where we are forced to build new declarations within the transformer 124 /// rather than in the subclass (e.g., lambda closure types). 125 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 126 127 public: 128 /// Initializes a new tree transformer. 129 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 130 131 /// Retrieves a reference to the derived class. 132 Derived &getDerived() { return static_cast<Derived&>(*this); } 133 134 /// Retrieves a reference to the derived class. 135 const Derived &getDerived() const { 136 return static_cast<const Derived&>(*this); 137 } 138 139 static inline ExprResult Owned(Expr *E) { return E; } 140 static inline StmtResult Owned(Stmt *S) { return S; } 141 142 /// Retrieves a reference to the semantic analysis object used for 143 /// this tree transform. 144 Sema &getSema() const { return SemaRef; } 145 146 /// Whether the transformation should always rebuild AST nodes, even 147 /// if none of the children have changed. 148 /// 149 /// Subclasses may override this function to specify when the transformation 150 /// should rebuild all AST nodes. 151 /// 152 /// We must always rebuild all AST nodes when performing variadic template 153 /// pack expansion, in order to avoid violating the AST invariant that each 154 /// statement node appears at most once in its containing declaration. 155 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 156 157 /// Whether the transformation is forming an expression or statement that 158 /// replaces the original. In this case, we'll reuse mangling numbers from 159 /// existing lambdas. 160 bool ReplacingOriginal() { return false; } 161 162 /// Wether CXXConstructExpr can be skipped when they are implicit. 163 /// They will be reconstructed when used if needed. 164 /// This is useful when the user that cause rebuilding of the 165 /// CXXConstructExpr is outside of the expression at which the TreeTransform 166 /// started. 167 bool AllowSkippingCXXConstructExpr() { return true; } 168 169 /// Returns the location of the entity being transformed, if that 170 /// information was not available elsewhere in the AST. 171 /// 172 /// By default, returns no source-location information. Subclasses can 173 /// provide an alternative implementation that provides better location 174 /// information. 175 SourceLocation getBaseLocation() { return SourceLocation(); } 176 177 /// Returns the name of the entity being transformed, if that 178 /// information was not available elsewhere in the AST. 179 /// 180 /// By default, returns an empty name. Subclasses can provide an alternative 181 /// implementation with a more precise name. 182 DeclarationName getBaseEntity() { return DeclarationName(); } 183 184 /// Sets the "base" location and entity when that 185 /// information is known based on another transformation. 186 /// 187 /// By default, the source location and entity are ignored. Subclasses can 188 /// override this function to provide a customized implementation. 189 void setBase(SourceLocation Loc, DeclarationName Entity) { } 190 191 /// RAII object that temporarily sets the base location and entity 192 /// used for reporting diagnostics in types. 193 class TemporaryBase { 194 TreeTransform &Self; 195 SourceLocation OldLocation; 196 DeclarationName OldEntity; 197 198 public: 199 TemporaryBase(TreeTransform &Self, SourceLocation Location, 200 DeclarationName Entity) : Self(Self) { 201 OldLocation = Self.getDerived().getBaseLocation(); 202 OldEntity = Self.getDerived().getBaseEntity(); 203 204 if (Location.isValid()) 205 Self.getDerived().setBase(Location, Entity); 206 } 207 208 ~TemporaryBase() { 209 Self.getDerived().setBase(OldLocation, OldEntity); 210 } 211 }; 212 213 /// Determine whether the given type \p T has already been 214 /// transformed. 215 /// 216 /// Subclasses can provide an alternative implementation of this routine 217 /// to short-circuit evaluation when it is known that a given type will 218 /// not change. For example, template instantiation need not traverse 219 /// non-dependent types. 220 bool AlreadyTransformed(QualType T) { 221 return T.isNull(); 222 } 223 224 /// Transform a template parameter depth level. 225 /// 226 /// During a transformation that transforms template parameters, this maps 227 /// an old template parameter depth to a new depth. 228 unsigned TransformTemplateDepth(unsigned Depth) { 229 return Depth; 230 } 231 232 /// Determine whether the given call argument should be dropped, e.g., 233 /// because it is a default argument. 234 /// 235 /// Subclasses can provide an alternative implementation of this routine to 236 /// determine which kinds of call arguments get dropped. By default, 237 /// CXXDefaultArgument nodes are dropped (prior to transformation). 238 bool DropCallArgument(Expr *E) { 239 return E->isDefaultArgument(); 240 } 241 242 /// Determine whether we should expand a pack expansion with the 243 /// given set of parameter packs into separate arguments by repeatedly 244 /// transforming the pattern. 245 /// 246 /// By default, the transformer never tries to expand pack expansions. 247 /// Subclasses can override this routine to provide different behavior. 248 /// 249 /// \param EllipsisLoc The location of the ellipsis that identifies the 250 /// pack expansion. 251 /// 252 /// \param PatternRange The source range that covers the entire pattern of 253 /// the pack expansion. 254 /// 255 /// \param Unexpanded The set of unexpanded parameter packs within the 256 /// pattern. 257 /// 258 /// \param ShouldExpand Will be set to \c true if the transformer should 259 /// expand the corresponding pack expansions into separate arguments. When 260 /// set, \c NumExpansions must also be set. 261 /// 262 /// \param RetainExpansion Whether the caller should add an unexpanded 263 /// pack expansion after all of the expanded arguments. This is used 264 /// when extending explicitly-specified template argument packs per 265 /// C++0x [temp.arg.explicit]p9. 266 /// 267 /// \param NumExpansions The number of separate arguments that will be in 268 /// the expanded form of the corresponding pack expansion. This is both an 269 /// input and an output parameter, which can be set by the caller if the 270 /// number of expansions is known a priori (e.g., due to a prior substitution) 271 /// and will be set by the callee when the number of expansions is known. 272 /// The callee must set this value when \c ShouldExpand is \c true; it may 273 /// set this value in other cases. 274 /// 275 /// \returns true if an error occurred (e.g., because the parameter packs 276 /// are to be instantiated with arguments of different lengths), false 277 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 278 /// must be set. 279 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 280 SourceRange PatternRange, 281 ArrayRef<UnexpandedParameterPack> Unexpanded, 282 bool &ShouldExpand, 283 bool &RetainExpansion, 284 Optional<unsigned> &NumExpansions) { 285 ShouldExpand = false; 286 return false; 287 } 288 289 /// "Forget" about the partially-substituted pack template argument, 290 /// when performing an instantiation that must preserve the parameter pack 291 /// use. 292 /// 293 /// This routine is meant to be overridden by the template instantiator. 294 TemplateArgument ForgetPartiallySubstitutedPack() { 295 return TemplateArgument(); 296 } 297 298 /// "Remember" the partially-substituted pack template argument 299 /// after performing an instantiation that must preserve the parameter pack 300 /// use. 301 /// 302 /// This routine is meant to be overridden by the template instantiator. 303 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 304 305 /// Note to the derived class when a function parameter pack is 306 /// being expanded. 307 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 308 309 /// Transforms the given type into another type. 310 /// 311 /// By default, this routine transforms a type by creating a 312 /// TypeSourceInfo for it and delegating to the appropriate 313 /// function. This is expensive, but we don't mind, because 314 /// this method is deprecated anyway; all users should be 315 /// switched to storing TypeSourceInfos. 316 /// 317 /// \returns the transformed type. 318 QualType TransformType(QualType T); 319 320 /// Transforms the given type-with-location into a new 321 /// type-with-location. 322 /// 323 /// By default, this routine transforms a type by delegating to the 324 /// appropriate TransformXXXType to build a new type. Subclasses 325 /// may override this function (to take over all type 326 /// transformations) or some set of the TransformXXXType functions 327 /// to alter the transformation. 328 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 329 330 /// Transform the given type-with-location into a new 331 /// type, collecting location information in the given builder 332 /// as necessary. 333 /// 334 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 335 336 /// Transform a type that is permitted to produce a 337 /// DeducedTemplateSpecializationType. 338 /// 339 /// This is used in the (relatively rare) contexts where it is acceptable 340 /// for transformation to produce a class template type with deduced 341 /// template arguments. 342 /// @{ 343 QualType TransformTypeWithDeducedTST(QualType T); 344 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 345 /// @} 346 347 /// The reason why the value of a statement is not discarded, if any. 348 enum StmtDiscardKind { 349 SDK_Discarded, 350 SDK_NotDiscarded, 351 SDK_StmtExprResult, 352 }; 353 354 /// Transform the given statement. 355 /// 356 /// By default, this routine transforms a statement by delegating to the 357 /// appropriate TransformXXXStmt function to transform a specific kind of 358 /// statement or the TransformExpr() function to transform an expression. 359 /// Subclasses may override this function to transform statements using some 360 /// other mechanism. 361 /// 362 /// \returns the transformed statement. 363 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 364 365 /// Transform the given statement. 366 /// 367 /// By default, this routine transforms a statement by delegating to the 368 /// appropriate TransformOMPXXXClause function to transform a specific kind 369 /// of clause. Subclasses may override this function to transform statements 370 /// using some other mechanism. 371 /// 372 /// \returns the transformed OpenMP clause. 373 OMPClause *TransformOMPClause(OMPClause *S); 374 375 /// Transform the given attribute. 376 /// 377 /// By default, this routine transforms a statement by delegating to the 378 /// appropriate TransformXXXAttr function to transform a specific kind 379 /// of attribute. Subclasses may override this function to transform 380 /// attributed statements using some other mechanism. 381 /// 382 /// \returns the transformed attribute 383 const Attr *TransformAttr(const Attr *S); 384 385 /// Transform the specified attribute. 386 /// 387 /// Subclasses should override the transformation of attributes with a pragma 388 /// spelling to transform expressions stored within the attribute. 389 /// 390 /// \returns the transformed attribute. 391 #define ATTR(X) 392 #define PRAGMA_SPELLING_ATTR(X) \ 393 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 394 #include "clang/Basic/AttrList.inc" 395 396 /// Transform the given expression. 397 /// 398 /// By default, this routine transforms an expression by delegating to the 399 /// appropriate TransformXXXExpr function to build a new expression. 400 /// Subclasses may override this function to transform expressions using some 401 /// other mechanism. 402 /// 403 /// \returns the transformed expression. 404 ExprResult TransformExpr(Expr *E); 405 406 /// Transform the given initializer. 407 /// 408 /// By default, this routine transforms an initializer by stripping off the 409 /// semantic nodes added by initialization, then passing the result to 410 /// TransformExpr or TransformExprs. 411 /// 412 /// \returns the transformed initializer. 413 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 414 415 /// Transform the given list of expressions. 416 /// 417 /// This routine transforms a list of expressions by invoking 418 /// \c TransformExpr() for each subexpression. However, it also provides 419 /// support for variadic templates by expanding any pack expansions (if the 420 /// derived class permits such expansion) along the way. When pack expansions 421 /// are present, the number of outputs may not equal the number of inputs. 422 /// 423 /// \param Inputs The set of expressions to be transformed. 424 /// 425 /// \param NumInputs The number of expressions in \c Inputs. 426 /// 427 /// \param IsCall If \c true, then this transform is being performed on 428 /// function-call arguments, and any arguments that should be dropped, will 429 /// be. 430 /// 431 /// \param Outputs The transformed input expressions will be added to this 432 /// vector. 433 /// 434 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 435 /// due to transformation. 436 /// 437 /// \returns true if an error occurred, false otherwise. 438 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 439 SmallVectorImpl<Expr *> &Outputs, 440 bool *ArgChanged = nullptr); 441 442 /// Transform the given declaration, which is referenced from a type 443 /// or expression. 444 /// 445 /// By default, acts as the identity function on declarations, unless the 446 /// transformer has had to transform the declaration itself. Subclasses 447 /// may override this function to provide alternate behavior. 448 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 449 llvm::DenseMap<Decl *, Decl *>::iterator Known 450 = TransformedLocalDecls.find(D); 451 if (Known != TransformedLocalDecls.end()) 452 return Known->second; 453 454 return D; 455 } 456 457 /// Transform the specified condition. 458 /// 459 /// By default, this transforms the variable and expression and rebuilds 460 /// the condition. 461 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 462 Expr *Expr, 463 Sema::ConditionKind Kind); 464 465 /// Transform the attributes associated with the given declaration and 466 /// place them on the new declaration. 467 /// 468 /// By default, this operation does nothing. Subclasses may override this 469 /// behavior to transform attributes. 470 void transformAttrs(Decl *Old, Decl *New) { } 471 472 /// Note that a local declaration has been transformed by this 473 /// transformer. 474 /// 475 /// Local declarations are typically transformed via a call to 476 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 477 /// the transformer itself has to transform the declarations. This routine 478 /// can be overridden by a subclass that keeps track of such mappings. 479 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 480 assert(New.size() == 1 && 481 "must override transformedLocalDecl if performing pack expansion"); 482 TransformedLocalDecls[Old] = New.front(); 483 } 484 485 /// Transform the definition of the given declaration. 486 /// 487 /// By default, invokes TransformDecl() to transform the declaration. 488 /// Subclasses may override this function to provide alternate behavior. 489 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 490 return getDerived().TransformDecl(Loc, D); 491 } 492 493 /// Transform the given declaration, which was the first part of a 494 /// nested-name-specifier in a member access expression. 495 /// 496 /// This specific declaration transformation only applies to the first 497 /// identifier in a nested-name-specifier of a member access expression, e.g., 498 /// the \c T in \c x->T::member 499 /// 500 /// By default, invokes TransformDecl() to transform the declaration. 501 /// Subclasses may override this function to provide alternate behavior. 502 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 503 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 504 } 505 506 /// Transform the set of declarations in an OverloadExpr. 507 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 508 LookupResult &R); 509 510 /// Transform the given nested-name-specifier with source-location 511 /// information. 512 /// 513 /// By default, transforms all of the types and declarations within the 514 /// nested-name-specifier. Subclasses may override this function to provide 515 /// alternate behavior. 516 NestedNameSpecifierLoc 517 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 518 QualType ObjectType = QualType(), 519 NamedDecl *FirstQualifierInScope = nullptr); 520 521 /// Transform the given declaration name. 522 /// 523 /// By default, transforms the types of conversion function, constructor, 524 /// and destructor names and then (if needed) rebuilds the declaration name. 525 /// Identifiers and selectors are returned unmodified. Subclasses may 526 /// override this function to provide alternate behavior. 527 DeclarationNameInfo 528 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 529 530 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 531 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 532 concepts::TypeRequirement * 533 TransformTypeRequirement(concepts::TypeRequirement *Req); 534 concepts::ExprRequirement * 535 TransformExprRequirement(concepts::ExprRequirement *Req); 536 concepts::NestedRequirement * 537 TransformNestedRequirement(concepts::NestedRequirement *Req); 538 539 /// Transform the given template name. 540 /// 541 /// \param SS The nested-name-specifier that qualifies the template 542 /// name. This nested-name-specifier must already have been transformed. 543 /// 544 /// \param Name The template name to transform. 545 /// 546 /// \param NameLoc The source location of the template name. 547 /// 548 /// \param ObjectType If we're translating a template name within a member 549 /// access expression, this is the type of the object whose member template 550 /// is being referenced. 551 /// 552 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 553 /// also refers to a name within the current (lexical) scope, this is the 554 /// declaration it refers to. 555 /// 556 /// By default, transforms the template name by transforming the declarations 557 /// and nested-name-specifiers that occur within the template name. 558 /// Subclasses may override this function to provide alternate behavior. 559 TemplateName 560 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 561 SourceLocation NameLoc, 562 QualType ObjectType = QualType(), 563 NamedDecl *FirstQualifierInScope = nullptr, 564 bool AllowInjectedClassName = false); 565 566 /// Transform the given template argument. 567 /// 568 /// By default, this operation transforms the type, expression, or 569 /// declaration stored within the template argument and constructs a 570 /// new template argument from the transformed result. Subclasses may 571 /// override this function to provide alternate behavior. 572 /// 573 /// Returns true if there was an error. 574 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 575 TemplateArgumentLoc &Output, 576 bool Uneval = false); 577 578 /// Transform the given set of template arguments. 579 /// 580 /// By default, this operation transforms all of the template arguments 581 /// in the input set using \c TransformTemplateArgument(), and appends 582 /// the transformed arguments to the output list. 583 /// 584 /// Note that this overload of \c TransformTemplateArguments() is merely 585 /// a convenience function. Subclasses that wish to override this behavior 586 /// should override the iterator-based member template version. 587 /// 588 /// \param Inputs The set of template arguments to be transformed. 589 /// 590 /// \param NumInputs The number of template arguments in \p Inputs. 591 /// 592 /// \param Outputs The set of transformed template arguments output by this 593 /// routine. 594 /// 595 /// Returns true if an error occurred. 596 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 597 unsigned NumInputs, 598 TemplateArgumentListInfo &Outputs, 599 bool Uneval = false) { 600 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 601 Uneval); 602 } 603 604 /// Transform the given set of template arguments. 605 /// 606 /// By default, this operation transforms all of the template arguments 607 /// in the input set using \c TransformTemplateArgument(), and appends 608 /// the transformed arguments to the output list. 609 /// 610 /// \param First An iterator to the first template argument. 611 /// 612 /// \param Last An iterator one step past the last template argument. 613 /// 614 /// \param Outputs The set of transformed template arguments output by this 615 /// routine. 616 /// 617 /// Returns true if an error occurred. 618 template<typename InputIterator> 619 bool TransformTemplateArguments(InputIterator First, 620 InputIterator Last, 621 TemplateArgumentListInfo &Outputs, 622 bool Uneval = false); 623 624 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 625 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 626 TemplateArgumentLoc &ArgLoc); 627 628 /// Fakes up a TypeSourceInfo for a type. 629 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 630 return SemaRef.Context.getTrivialTypeSourceInfo(T, 631 getDerived().getBaseLocation()); 632 } 633 634 #define ABSTRACT_TYPELOC(CLASS, PARENT) 635 #define TYPELOC(CLASS, PARENT) \ 636 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 637 #include "clang/AST/TypeLocNodes.def" 638 639 template<typename Fn> 640 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 641 FunctionProtoTypeLoc TL, 642 CXXRecordDecl *ThisContext, 643 Qualifiers ThisTypeQuals, 644 Fn TransformExceptionSpec); 645 646 bool TransformExceptionSpec(SourceLocation Loc, 647 FunctionProtoType::ExceptionSpecInfo &ESI, 648 SmallVectorImpl<QualType> &Exceptions, 649 bool &Changed); 650 651 StmtResult TransformSEHHandler(Stmt *Handler); 652 653 QualType 654 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 655 TemplateSpecializationTypeLoc TL, 656 TemplateName Template); 657 658 QualType 659 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 660 DependentTemplateSpecializationTypeLoc TL, 661 TemplateName Template, 662 CXXScopeSpec &SS); 663 664 QualType TransformDependentTemplateSpecializationType( 665 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 666 NestedNameSpecifierLoc QualifierLoc); 667 668 /// Transforms the parameters of a function type into the 669 /// given vectors. 670 /// 671 /// The result vectors should be kept in sync; null entries in the 672 /// variables vector are acceptable. 673 /// 674 /// Return true on error. 675 bool TransformFunctionTypeParams( 676 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 677 const QualType *ParamTypes, 678 const FunctionProtoType::ExtParameterInfo *ParamInfos, 679 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 680 Sema::ExtParameterInfoBuilder &PInfos); 681 682 /// Transforms a single function-type parameter. Return null 683 /// on error. 684 /// 685 /// \param indexAdjustment - A number to add to the parameter's 686 /// scope index; can be negative 687 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 688 int indexAdjustment, 689 Optional<unsigned> NumExpansions, 690 bool ExpectParameterPack); 691 692 /// Transform the body of a lambda-expression. 693 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 694 /// Alternative implementation of TransformLambdaBody that skips transforming 695 /// the body. 696 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 697 698 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 699 700 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 701 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 702 703 TemplateParameterList *TransformTemplateParameterList( 704 TemplateParameterList *TPL) { 705 return TPL; 706 } 707 708 ExprResult TransformAddressOfOperand(Expr *E); 709 710 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 711 bool IsAddressOfOperand, 712 TypeSourceInfo **RecoveryTSI); 713 714 ExprResult TransformParenDependentScopeDeclRefExpr( 715 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 716 TypeSourceInfo **RecoveryTSI); 717 718 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 719 720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 721 // amount of stack usage with clang. 722 #define STMT(Node, Parent) \ 723 LLVM_ATTRIBUTE_NOINLINE \ 724 StmtResult Transform##Node(Node *S); 725 #define VALUESTMT(Node, Parent) \ 726 LLVM_ATTRIBUTE_NOINLINE \ 727 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 728 #define EXPR(Node, Parent) \ 729 LLVM_ATTRIBUTE_NOINLINE \ 730 ExprResult Transform##Node(Node *E); 731 #define ABSTRACT_STMT(Stmt) 732 #include "clang/AST/StmtNodes.inc" 733 734 #define GEN_CLANG_CLAUSE_CLASS 735 #define CLAUSE_CLASS(Enum, Str, Class) \ 736 LLVM_ATTRIBUTE_NOINLINE \ 737 OMPClause *Transform##Class(Class *S); 738 #include "llvm/Frontend/OpenMP/OMP.inc" 739 740 /// Build a new qualified type given its unqualified type and type location. 741 /// 742 /// By default, this routine adds type qualifiers only to types that can 743 /// have qualifiers, and silently suppresses those qualifiers that are not 744 /// permitted. Subclasses may override this routine to provide different 745 /// behavior. 746 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 747 748 /// Build a new pointer type given its pointee type. 749 /// 750 /// By default, performs semantic analysis when building the pointer type. 751 /// Subclasses may override this routine to provide different behavior. 752 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 753 754 /// Build a new block pointer type given its pointee type. 755 /// 756 /// By default, performs semantic analysis when building the block pointer 757 /// type. Subclasses may override this routine to provide different behavior. 758 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 759 760 /// Build a new reference type given the type it references. 761 /// 762 /// By default, performs semantic analysis when building the 763 /// reference type. Subclasses may override this routine to provide 764 /// different behavior. 765 /// 766 /// \param LValue whether the type was written with an lvalue sigil 767 /// or an rvalue sigil. 768 QualType RebuildReferenceType(QualType ReferentType, 769 bool LValue, 770 SourceLocation Sigil); 771 772 /// Build a new member pointer type given the pointee type and the 773 /// class type it refers into. 774 /// 775 /// By default, performs semantic analysis when building the member pointer 776 /// type. Subclasses may override this routine to provide different behavior. 777 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 778 SourceLocation Sigil); 779 780 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 781 SourceLocation ProtocolLAngleLoc, 782 ArrayRef<ObjCProtocolDecl *> Protocols, 783 ArrayRef<SourceLocation> ProtocolLocs, 784 SourceLocation ProtocolRAngleLoc); 785 786 /// Build an Objective-C object type. 787 /// 788 /// By default, performs semantic analysis when building the object type. 789 /// Subclasses may override this routine to provide different behavior. 790 QualType RebuildObjCObjectType(QualType BaseType, 791 SourceLocation Loc, 792 SourceLocation TypeArgsLAngleLoc, 793 ArrayRef<TypeSourceInfo *> TypeArgs, 794 SourceLocation TypeArgsRAngleLoc, 795 SourceLocation ProtocolLAngleLoc, 796 ArrayRef<ObjCProtocolDecl *> Protocols, 797 ArrayRef<SourceLocation> ProtocolLocs, 798 SourceLocation ProtocolRAngleLoc); 799 800 /// Build a new Objective-C object pointer type given the pointee type. 801 /// 802 /// By default, directly builds the pointer type, with no additional semantic 803 /// analysis. 804 QualType RebuildObjCObjectPointerType(QualType PointeeType, 805 SourceLocation Star); 806 807 /// Build a new array type given the element type, size 808 /// modifier, size of the array (if known), size expression, and index type 809 /// qualifiers. 810 /// 811 /// By default, performs semantic analysis when building the array type. 812 /// Subclasses may override this routine to provide different behavior. 813 /// Also by default, all of the other Rebuild*Array 814 QualType RebuildArrayType(QualType ElementType, 815 ArrayType::ArraySizeModifier SizeMod, 816 const llvm::APInt *Size, 817 Expr *SizeExpr, 818 unsigned IndexTypeQuals, 819 SourceRange BracketsRange); 820 821 /// Build a new constant array type given the element type, size 822 /// modifier, (known) size of the array, and index type qualifiers. 823 /// 824 /// By default, performs semantic analysis when building the array type. 825 /// Subclasses may override this routine to provide different behavior. 826 QualType RebuildConstantArrayType(QualType ElementType, 827 ArrayType::ArraySizeModifier SizeMod, 828 const llvm::APInt &Size, 829 Expr *SizeExpr, 830 unsigned IndexTypeQuals, 831 SourceRange BracketsRange); 832 833 /// Build a new incomplete array type given the element type, size 834 /// modifier, and index type qualifiers. 835 /// 836 /// By default, performs semantic analysis when building the array type. 837 /// Subclasses may override this routine to provide different behavior. 838 QualType RebuildIncompleteArrayType(QualType ElementType, 839 ArrayType::ArraySizeModifier SizeMod, 840 unsigned IndexTypeQuals, 841 SourceRange BracketsRange); 842 843 /// Build a new variable-length array type given the element type, 844 /// size modifier, size expression, and index type qualifiers. 845 /// 846 /// By default, performs semantic analysis when building the array type. 847 /// Subclasses may override this routine to provide different behavior. 848 QualType RebuildVariableArrayType(QualType ElementType, 849 ArrayType::ArraySizeModifier SizeMod, 850 Expr *SizeExpr, 851 unsigned IndexTypeQuals, 852 SourceRange BracketsRange); 853 854 /// Build a new dependent-sized array type given the element type, 855 /// size modifier, size expression, and index type qualifiers. 856 /// 857 /// By default, performs semantic analysis when building the array type. 858 /// Subclasses may override this routine to provide different behavior. 859 QualType RebuildDependentSizedArrayType(QualType ElementType, 860 ArrayType::ArraySizeModifier SizeMod, 861 Expr *SizeExpr, 862 unsigned IndexTypeQuals, 863 SourceRange BracketsRange); 864 865 /// Build a new vector type given the element type and 866 /// number of elements. 867 /// 868 /// By default, performs semantic analysis when building the vector type. 869 /// Subclasses may override this routine to provide different behavior. 870 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 871 VectorType::VectorKind VecKind); 872 873 /// Build a new potentially dependently-sized extended vector type 874 /// given the element type and number of elements. 875 /// 876 /// By default, performs semantic analysis when building the vector type. 877 /// Subclasses may override this routine to provide different behavior. 878 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 879 SourceLocation AttributeLoc, 880 VectorType::VectorKind); 881 882 /// Build a new extended vector type given the element type and 883 /// number of elements. 884 /// 885 /// By default, performs semantic analysis when building the vector type. 886 /// Subclasses may override this routine to provide different behavior. 887 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 888 SourceLocation AttributeLoc); 889 890 /// Build a new potentially dependently-sized extended vector type 891 /// given the element type and number of elements. 892 /// 893 /// By default, performs semantic analysis when building the vector type. 894 /// Subclasses may override this routine to provide different behavior. 895 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 896 Expr *SizeExpr, 897 SourceLocation AttributeLoc); 898 899 /// Build a new matrix type given the element type and dimensions. 900 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 901 unsigned NumColumns); 902 903 /// Build a new matrix type given the type and dependently-defined 904 /// dimensions. 905 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 906 Expr *ColumnExpr, 907 SourceLocation AttributeLoc); 908 909 /// Build a new DependentAddressSpaceType or return the pointee 910 /// type variable with the correct address space (retrieved from 911 /// AddrSpaceExpr) applied to it. The former will be returned in cases 912 /// where the address space remains dependent. 913 /// 914 /// By default, performs semantic analysis when building the type with address 915 /// space applied. Subclasses may override this routine to provide different 916 /// behavior. 917 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 918 Expr *AddrSpaceExpr, 919 SourceLocation AttributeLoc); 920 921 /// Build a new function type. 922 /// 923 /// By default, performs semantic analysis when building the function type. 924 /// Subclasses may override this routine to provide different behavior. 925 QualType RebuildFunctionProtoType(QualType T, 926 MutableArrayRef<QualType> ParamTypes, 927 const FunctionProtoType::ExtProtoInfo &EPI); 928 929 /// Build a new unprototyped function type. 930 QualType RebuildFunctionNoProtoType(QualType ResultType); 931 932 /// Rebuild an unresolved typename type, given the decl that 933 /// the UnresolvedUsingTypenameDecl was transformed to. 934 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 935 936 /// Build a new type found via an alias. 937 QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) { 938 return SemaRef.Context.getUsingType(Found, Underlying); 939 } 940 941 /// Build a new typedef type. 942 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 943 return SemaRef.Context.getTypeDeclType(Typedef); 944 } 945 946 /// Build a new MacroDefined type. 947 QualType RebuildMacroQualifiedType(QualType T, 948 const IdentifierInfo *MacroII) { 949 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 950 } 951 952 /// Build a new class/struct/union type. 953 QualType RebuildRecordType(RecordDecl *Record) { 954 return SemaRef.Context.getTypeDeclType(Record); 955 } 956 957 /// Build a new Enum type. 958 QualType RebuildEnumType(EnumDecl *Enum) { 959 return SemaRef.Context.getTypeDeclType(Enum); 960 } 961 962 /// Build a new typeof(expr) type. 963 /// 964 /// By default, performs semantic analysis when building the typeof type. 965 /// Subclasses may override this routine to provide different behavior. 966 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 967 968 /// Build a new typeof(type) type. 969 /// 970 /// By default, builds a new TypeOfType with the given underlying type. 971 QualType RebuildTypeOfType(QualType Underlying); 972 973 /// Build a new unary transform type. 974 QualType RebuildUnaryTransformType(QualType BaseType, 975 UnaryTransformType::UTTKind UKind, 976 SourceLocation Loc); 977 978 /// Build a new C++11 decltype type. 979 /// 980 /// By default, performs semantic analysis when building the decltype type. 981 /// Subclasses may override this routine to provide different behavior. 982 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 983 984 /// Build a new C++11 auto type. 985 /// 986 /// By default, builds a new AutoType with the given deduced type. 987 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 988 ConceptDecl *TypeConstraintConcept, 989 ArrayRef<TemplateArgument> TypeConstraintArgs) { 990 // Note, IsDependent is always false here: we implicitly convert an 'auto' 991 // which has been deduced to a dependent type into an undeduced 'auto', so 992 // that we'll retry deduction after the transformation. 993 return SemaRef.Context.getAutoType(Deduced, Keyword, 994 /*IsDependent*/ false, /*IsPack=*/false, 995 TypeConstraintConcept, 996 TypeConstraintArgs); 997 } 998 999 /// By default, builds a new DeducedTemplateSpecializationType with the given 1000 /// deduced type. 1001 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 1002 QualType Deduced) { 1003 return SemaRef.Context.getDeducedTemplateSpecializationType( 1004 Template, Deduced, /*IsDependent*/ false); 1005 } 1006 1007 /// Build a new template specialization type. 1008 /// 1009 /// By default, performs semantic analysis when building the template 1010 /// specialization type. Subclasses may override this routine to provide 1011 /// different behavior. 1012 QualType RebuildTemplateSpecializationType(TemplateName Template, 1013 SourceLocation TemplateLoc, 1014 TemplateArgumentListInfo &Args); 1015 1016 /// Build a new parenthesized type. 1017 /// 1018 /// By default, builds a new ParenType type from the inner type. 1019 /// Subclasses may override this routine to provide different behavior. 1020 QualType RebuildParenType(QualType InnerType) { 1021 return SemaRef.BuildParenType(InnerType); 1022 } 1023 1024 /// Build a new qualified name type. 1025 /// 1026 /// By default, builds a new ElaboratedType type from the keyword, 1027 /// the nested-name-specifier and the named type. 1028 /// Subclasses may override this routine to provide different behavior. 1029 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1030 ElaboratedTypeKeyword Keyword, 1031 NestedNameSpecifierLoc QualifierLoc, 1032 QualType Named) { 1033 return SemaRef.Context.getElaboratedType(Keyword, 1034 QualifierLoc.getNestedNameSpecifier(), 1035 Named); 1036 } 1037 1038 /// Build a new typename type that refers to a template-id. 1039 /// 1040 /// By default, builds a new DependentNameType type from the 1041 /// nested-name-specifier and the given type. Subclasses may override 1042 /// this routine to provide different behavior. 1043 QualType RebuildDependentTemplateSpecializationType( 1044 ElaboratedTypeKeyword Keyword, 1045 NestedNameSpecifierLoc QualifierLoc, 1046 SourceLocation TemplateKWLoc, 1047 const IdentifierInfo *Name, 1048 SourceLocation NameLoc, 1049 TemplateArgumentListInfo &Args, 1050 bool AllowInjectedClassName) { 1051 // Rebuild the template name. 1052 // TODO: avoid TemplateName abstraction 1053 CXXScopeSpec SS; 1054 SS.Adopt(QualifierLoc); 1055 TemplateName InstName = getDerived().RebuildTemplateName( 1056 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1057 AllowInjectedClassName); 1058 1059 if (InstName.isNull()) 1060 return QualType(); 1061 1062 // If it's still dependent, make a dependent specialization. 1063 if (InstName.getAsDependentTemplateName()) 1064 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1065 QualifierLoc.getNestedNameSpecifier(), 1066 Name, 1067 Args); 1068 1069 // Otherwise, make an elaborated type wrapping a non-dependent 1070 // specialization. 1071 QualType T = 1072 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1073 if (T.isNull()) return QualType(); 1074 1075 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1076 return T; 1077 1078 return SemaRef.Context.getElaboratedType(Keyword, 1079 QualifierLoc.getNestedNameSpecifier(), 1080 T); 1081 } 1082 1083 /// Build a new typename type that refers to an identifier. 1084 /// 1085 /// By default, performs semantic analysis when building the typename type 1086 /// (or elaborated type). Subclasses may override this routine to provide 1087 /// different behavior. 1088 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1089 SourceLocation KeywordLoc, 1090 NestedNameSpecifierLoc QualifierLoc, 1091 const IdentifierInfo *Id, 1092 SourceLocation IdLoc, 1093 bool DeducedTSTContext) { 1094 CXXScopeSpec SS; 1095 SS.Adopt(QualifierLoc); 1096 1097 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1098 // If the name is still dependent, just build a new dependent name type. 1099 if (!SemaRef.computeDeclContext(SS)) 1100 return SemaRef.Context.getDependentNameType(Keyword, 1101 QualifierLoc.getNestedNameSpecifier(), 1102 Id); 1103 } 1104 1105 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1106 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1107 *Id, IdLoc, DeducedTSTContext); 1108 } 1109 1110 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1111 1112 // We had a dependent elaborated-type-specifier that has been transformed 1113 // into a non-dependent elaborated-type-specifier. Find the tag we're 1114 // referring to. 1115 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1116 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1117 if (!DC) 1118 return QualType(); 1119 1120 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1121 return QualType(); 1122 1123 TagDecl *Tag = nullptr; 1124 SemaRef.LookupQualifiedName(Result, DC); 1125 switch (Result.getResultKind()) { 1126 case LookupResult::NotFound: 1127 case LookupResult::NotFoundInCurrentInstantiation: 1128 break; 1129 1130 case LookupResult::Found: 1131 Tag = Result.getAsSingle<TagDecl>(); 1132 break; 1133 1134 case LookupResult::FoundOverloaded: 1135 case LookupResult::FoundUnresolvedValue: 1136 llvm_unreachable("Tag lookup cannot find non-tags"); 1137 1138 case LookupResult::Ambiguous: 1139 // Let the LookupResult structure handle ambiguities. 1140 return QualType(); 1141 } 1142 1143 if (!Tag) { 1144 // Check where the name exists but isn't a tag type and use that to emit 1145 // better diagnostics. 1146 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1147 SemaRef.LookupQualifiedName(Result, DC); 1148 switch (Result.getResultKind()) { 1149 case LookupResult::Found: 1150 case LookupResult::FoundOverloaded: 1151 case LookupResult::FoundUnresolvedValue: { 1152 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1153 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1154 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1155 << NTK << Kind; 1156 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1157 break; 1158 } 1159 default: 1160 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1161 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1162 break; 1163 } 1164 return QualType(); 1165 } 1166 1167 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1168 IdLoc, Id)) { 1169 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1170 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1171 return QualType(); 1172 } 1173 1174 // Build the elaborated-type-specifier type. 1175 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1176 return SemaRef.Context.getElaboratedType(Keyword, 1177 QualifierLoc.getNestedNameSpecifier(), 1178 T); 1179 } 1180 1181 /// Build a new pack expansion type. 1182 /// 1183 /// By default, builds a new PackExpansionType type from the given pattern. 1184 /// Subclasses may override this routine to provide different behavior. 1185 QualType RebuildPackExpansionType(QualType Pattern, 1186 SourceRange PatternRange, 1187 SourceLocation EllipsisLoc, 1188 Optional<unsigned> NumExpansions) { 1189 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1190 NumExpansions); 1191 } 1192 1193 /// Build a new atomic type given its value type. 1194 /// 1195 /// By default, performs semantic analysis when building the atomic type. 1196 /// Subclasses may override this routine to provide different behavior. 1197 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1198 1199 /// Build a new pipe type given its value type. 1200 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1201 bool isReadPipe); 1202 1203 /// Build a bit-precise int given its value type. 1204 QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits, 1205 SourceLocation Loc); 1206 1207 /// Build a dependent bit-precise int given its value type. 1208 QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr, 1209 SourceLocation Loc); 1210 1211 /// Build a new template name given a nested name specifier, a flag 1212 /// indicating whether the "template" keyword was provided, and the template 1213 /// that the template name refers to. 1214 /// 1215 /// By default, builds the new template name directly. Subclasses may override 1216 /// this routine to provide different behavior. 1217 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1218 bool TemplateKW, 1219 TemplateDecl *Template); 1220 1221 /// Build a new template name given a nested name specifier and the 1222 /// name that is referred to as a template. 1223 /// 1224 /// By default, performs semantic analysis to determine whether the name can 1225 /// be resolved to a specific template, then builds the appropriate kind of 1226 /// template name. Subclasses may override this routine to provide different 1227 /// behavior. 1228 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1229 SourceLocation TemplateKWLoc, 1230 const IdentifierInfo &Name, 1231 SourceLocation NameLoc, QualType ObjectType, 1232 NamedDecl *FirstQualifierInScope, 1233 bool AllowInjectedClassName); 1234 1235 /// Build a new template name given a nested name specifier and the 1236 /// overloaded operator name that is referred to as a template. 1237 /// 1238 /// By default, performs semantic analysis to determine whether the name can 1239 /// be resolved to a specific template, then builds the appropriate kind of 1240 /// template name. Subclasses may override this routine to provide different 1241 /// behavior. 1242 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1243 SourceLocation TemplateKWLoc, 1244 OverloadedOperatorKind Operator, 1245 SourceLocation NameLoc, QualType ObjectType, 1246 bool AllowInjectedClassName); 1247 1248 /// Build a new template name given a template template parameter pack 1249 /// and the 1250 /// 1251 /// By default, performs semantic analysis to determine whether the name can 1252 /// be resolved to a specific template, then builds the appropriate kind of 1253 /// template name. Subclasses may override this routine to provide different 1254 /// behavior. 1255 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1256 const TemplateArgument &ArgPack) { 1257 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1258 } 1259 1260 /// Build a new compound statement. 1261 /// 1262 /// By default, performs semantic analysis to build the new statement. 1263 /// Subclasses may override this routine to provide different behavior. 1264 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1265 MultiStmtArg Statements, 1266 SourceLocation RBraceLoc, 1267 bool IsStmtExpr) { 1268 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1269 IsStmtExpr); 1270 } 1271 1272 /// Build a new case statement. 1273 /// 1274 /// By default, performs semantic analysis to build the new statement. 1275 /// Subclasses may override this routine to provide different behavior. 1276 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1277 Expr *LHS, 1278 SourceLocation EllipsisLoc, 1279 Expr *RHS, 1280 SourceLocation ColonLoc) { 1281 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1282 ColonLoc); 1283 } 1284 1285 /// Attach the body to a new case statement. 1286 /// 1287 /// By default, performs semantic analysis to build the new statement. 1288 /// Subclasses may override this routine to provide different behavior. 1289 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1290 getSema().ActOnCaseStmtBody(S, Body); 1291 return S; 1292 } 1293 1294 /// Build a new default statement. 1295 /// 1296 /// By default, performs semantic analysis to build the new statement. 1297 /// Subclasses may override this routine to provide different behavior. 1298 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1299 SourceLocation ColonLoc, 1300 Stmt *SubStmt) { 1301 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1302 /*CurScope=*/nullptr); 1303 } 1304 1305 /// Build a new label statement. 1306 /// 1307 /// By default, performs semantic analysis to build the new statement. 1308 /// Subclasses may override this routine to provide different behavior. 1309 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1310 SourceLocation ColonLoc, Stmt *SubStmt) { 1311 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1312 } 1313 1314 /// Build a new attributed statement. 1315 /// 1316 /// By default, performs semantic analysis to build the new statement. 1317 /// Subclasses may override this routine to provide different behavior. 1318 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1319 ArrayRef<const Attr *> Attrs, 1320 Stmt *SubStmt) { 1321 return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt); 1322 } 1323 1324 /// Build a new "if" statement. 1325 /// 1326 /// By default, performs semantic analysis to build the new statement. 1327 /// Subclasses may override this routine to provide different behavior. 1328 StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind, 1329 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1330 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1331 SourceLocation ElseLoc, Stmt *Else) { 1332 return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc, 1333 Then, ElseLoc, Else); 1334 } 1335 1336 /// Start building a new switch statement. 1337 /// 1338 /// By default, performs semantic analysis to build the new statement. 1339 /// Subclasses may override this routine to provide different behavior. 1340 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1341 SourceLocation LParenLoc, Stmt *Init, 1342 Sema::ConditionResult Cond, 1343 SourceLocation RParenLoc) { 1344 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1345 RParenLoc); 1346 } 1347 1348 /// Attach the body to the switch statement. 1349 /// 1350 /// By default, performs semantic analysis to build the new statement. 1351 /// Subclasses may override this routine to provide different behavior. 1352 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1353 Stmt *Switch, Stmt *Body) { 1354 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1355 } 1356 1357 /// Build a new while statement. 1358 /// 1359 /// By default, performs semantic analysis to build the new statement. 1360 /// Subclasses may override this routine to provide different behavior. 1361 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1362 Sema::ConditionResult Cond, 1363 SourceLocation RParenLoc, Stmt *Body) { 1364 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1365 } 1366 1367 /// Build a new do-while statement. 1368 /// 1369 /// By default, performs semantic analysis to build the new statement. 1370 /// Subclasses may override this routine to provide different behavior. 1371 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1372 SourceLocation WhileLoc, SourceLocation LParenLoc, 1373 Expr *Cond, SourceLocation RParenLoc) { 1374 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1375 Cond, RParenLoc); 1376 } 1377 1378 /// Build a new for statement. 1379 /// 1380 /// By default, performs semantic analysis to build the new statement. 1381 /// Subclasses may override this routine to provide different behavior. 1382 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1383 Stmt *Init, Sema::ConditionResult Cond, 1384 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1385 Stmt *Body) { 1386 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1387 Inc, RParenLoc, Body); 1388 } 1389 1390 /// Build a new goto statement. 1391 /// 1392 /// By default, performs semantic analysis to build the new statement. 1393 /// Subclasses may override this routine to provide different behavior. 1394 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1395 LabelDecl *Label) { 1396 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1397 } 1398 1399 /// Build a new indirect goto statement. 1400 /// 1401 /// By default, performs semantic analysis to build the new statement. 1402 /// Subclasses may override this routine to provide different behavior. 1403 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1404 SourceLocation StarLoc, 1405 Expr *Target) { 1406 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1407 } 1408 1409 /// Build a new return statement. 1410 /// 1411 /// By default, performs semantic analysis to build the new statement. 1412 /// Subclasses may override this routine to provide different behavior. 1413 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1414 return getSema().BuildReturnStmt(ReturnLoc, Result); 1415 } 1416 1417 /// Build a new declaration statement. 1418 /// 1419 /// By default, performs semantic analysis to build the new statement. 1420 /// Subclasses may override this routine to provide different behavior. 1421 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1422 SourceLocation StartLoc, SourceLocation EndLoc) { 1423 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1424 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1425 } 1426 1427 /// Build a new inline asm statement. 1428 /// 1429 /// By default, performs semantic analysis to build the new statement. 1430 /// Subclasses may override this routine to provide different behavior. 1431 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1432 bool IsVolatile, unsigned NumOutputs, 1433 unsigned NumInputs, IdentifierInfo **Names, 1434 MultiExprArg Constraints, MultiExprArg Exprs, 1435 Expr *AsmString, MultiExprArg Clobbers, 1436 unsigned NumLabels, 1437 SourceLocation RParenLoc) { 1438 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1439 NumInputs, Names, Constraints, Exprs, 1440 AsmString, Clobbers, NumLabels, RParenLoc); 1441 } 1442 1443 /// Build a new MS style inline asm statement. 1444 /// 1445 /// By default, performs semantic analysis to build the new statement. 1446 /// Subclasses may override this routine to provide different behavior. 1447 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1448 ArrayRef<Token> AsmToks, 1449 StringRef AsmString, 1450 unsigned NumOutputs, unsigned NumInputs, 1451 ArrayRef<StringRef> Constraints, 1452 ArrayRef<StringRef> Clobbers, 1453 ArrayRef<Expr*> Exprs, 1454 SourceLocation EndLoc) { 1455 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1456 NumOutputs, NumInputs, 1457 Constraints, Clobbers, Exprs, EndLoc); 1458 } 1459 1460 /// Build a new co_return statement. 1461 /// 1462 /// By default, performs semantic analysis to build the new statement. 1463 /// Subclasses may override this routine to provide different behavior. 1464 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1465 bool IsImplicit) { 1466 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1467 } 1468 1469 /// Build a new co_await expression. 1470 /// 1471 /// By default, performs semantic analysis to build the new expression. 1472 /// Subclasses may override this routine to provide different behavior. 1473 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1474 bool IsImplicit) { 1475 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1476 } 1477 1478 /// Build a new co_await expression. 1479 /// 1480 /// By default, performs semantic analysis to build the new expression. 1481 /// Subclasses may override this routine to provide different behavior. 1482 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1483 Expr *Result, 1484 UnresolvedLookupExpr *Lookup) { 1485 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1486 } 1487 1488 /// Build a new co_yield expression. 1489 /// 1490 /// By default, performs semantic analysis to build the new expression. 1491 /// Subclasses may override this routine to provide different behavior. 1492 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1493 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1494 } 1495 1496 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1497 return getSema().BuildCoroutineBodyStmt(Args); 1498 } 1499 1500 /// Build a new Objective-C \@try statement. 1501 /// 1502 /// By default, performs semantic analysis to build the new statement. 1503 /// Subclasses may override this routine to provide different behavior. 1504 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1505 Stmt *TryBody, 1506 MultiStmtArg CatchStmts, 1507 Stmt *Finally) { 1508 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1509 Finally); 1510 } 1511 1512 /// Rebuild an Objective-C exception declaration. 1513 /// 1514 /// By default, performs semantic analysis to build the new declaration. 1515 /// Subclasses may override this routine to provide different behavior. 1516 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1517 TypeSourceInfo *TInfo, QualType T) { 1518 return getSema().BuildObjCExceptionDecl(TInfo, T, 1519 ExceptionDecl->getInnerLocStart(), 1520 ExceptionDecl->getLocation(), 1521 ExceptionDecl->getIdentifier()); 1522 } 1523 1524 /// Build a new Objective-C \@catch statement. 1525 /// 1526 /// By default, performs semantic analysis to build the new statement. 1527 /// Subclasses may override this routine to provide different behavior. 1528 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1529 SourceLocation RParenLoc, 1530 VarDecl *Var, 1531 Stmt *Body) { 1532 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1533 Var, Body); 1534 } 1535 1536 /// Build a new Objective-C \@finally statement. 1537 /// 1538 /// By default, performs semantic analysis to build the new statement. 1539 /// Subclasses may override this routine to provide different behavior. 1540 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1541 Stmt *Body) { 1542 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1543 } 1544 1545 /// Build a new Objective-C \@throw statement. 1546 /// 1547 /// By default, performs semantic analysis to build the new statement. 1548 /// Subclasses may override this routine to provide different behavior. 1549 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1550 Expr *Operand) { 1551 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1552 } 1553 1554 /// Build a new OpenMP Canonical loop. 1555 /// 1556 /// Ensures that the outermost loop in @p LoopStmt is wrapped by a 1557 /// OMPCanonicalLoop. 1558 StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) { 1559 return getSema().ActOnOpenMPCanonicalLoop(LoopStmt); 1560 } 1561 1562 /// Build a new OpenMP executable directive. 1563 /// 1564 /// By default, performs semantic analysis to build the new statement. 1565 /// Subclasses may override this routine to provide different behavior. 1566 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1567 DeclarationNameInfo DirName, 1568 OpenMPDirectiveKind CancelRegion, 1569 ArrayRef<OMPClause *> Clauses, 1570 Stmt *AStmt, SourceLocation StartLoc, 1571 SourceLocation EndLoc) { 1572 return getSema().ActOnOpenMPExecutableDirective( 1573 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1574 } 1575 1576 /// Build a new OpenMP 'if' clause. 1577 /// 1578 /// By default, performs semantic analysis to build the new OpenMP clause. 1579 /// Subclasses may override this routine to provide different behavior. 1580 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1581 Expr *Condition, SourceLocation StartLoc, 1582 SourceLocation LParenLoc, 1583 SourceLocation NameModifierLoc, 1584 SourceLocation ColonLoc, 1585 SourceLocation EndLoc) { 1586 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1587 LParenLoc, NameModifierLoc, ColonLoc, 1588 EndLoc); 1589 } 1590 1591 /// Build a new OpenMP 'final' clause. 1592 /// 1593 /// By default, performs semantic analysis to build the new OpenMP clause. 1594 /// Subclasses may override this routine to provide different behavior. 1595 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1596 SourceLocation LParenLoc, 1597 SourceLocation EndLoc) { 1598 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1599 EndLoc); 1600 } 1601 1602 /// Build a new OpenMP 'num_threads' clause. 1603 /// 1604 /// By default, performs semantic analysis to build the new OpenMP clause. 1605 /// Subclasses may override this routine to provide different behavior. 1606 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1607 SourceLocation StartLoc, 1608 SourceLocation LParenLoc, 1609 SourceLocation EndLoc) { 1610 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1611 LParenLoc, EndLoc); 1612 } 1613 1614 /// Build a new OpenMP 'safelen' clause. 1615 /// 1616 /// By default, performs semantic analysis to build the new OpenMP clause. 1617 /// Subclasses may override this routine to provide different behavior. 1618 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1619 SourceLocation LParenLoc, 1620 SourceLocation EndLoc) { 1621 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1622 } 1623 1624 /// Build a new OpenMP 'simdlen' clause. 1625 /// 1626 /// By default, performs semantic analysis to build the new OpenMP clause. 1627 /// Subclasses may override this routine to provide different behavior. 1628 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1629 SourceLocation LParenLoc, 1630 SourceLocation EndLoc) { 1631 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1632 } 1633 1634 OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes, 1635 SourceLocation StartLoc, 1636 SourceLocation LParenLoc, 1637 SourceLocation EndLoc) { 1638 return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc); 1639 } 1640 1641 /// Build a new OpenMP 'full' clause. 1642 OMPClause *RebuildOMPFullClause(SourceLocation StartLoc, 1643 SourceLocation EndLoc) { 1644 return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc); 1645 } 1646 1647 /// Build a new OpenMP 'partial' clause. 1648 OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc, 1649 SourceLocation LParenLoc, 1650 SourceLocation EndLoc) { 1651 return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc, 1652 EndLoc); 1653 } 1654 1655 /// Build a new OpenMP 'allocator' clause. 1656 /// 1657 /// By default, performs semantic analysis to build the new OpenMP clause. 1658 /// Subclasses may override this routine to provide different behavior. 1659 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1660 SourceLocation LParenLoc, 1661 SourceLocation EndLoc) { 1662 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1663 } 1664 1665 /// Build a new OpenMP 'collapse' clause. 1666 /// 1667 /// By default, performs semantic analysis to build the new OpenMP clause. 1668 /// Subclasses may override this routine to provide different behavior. 1669 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1670 SourceLocation LParenLoc, 1671 SourceLocation EndLoc) { 1672 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1673 EndLoc); 1674 } 1675 1676 /// Build a new OpenMP 'default' clause. 1677 /// 1678 /// By default, performs semantic analysis to build the new OpenMP clause. 1679 /// Subclasses may override this routine to provide different behavior. 1680 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1681 SourceLocation StartLoc, 1682 SourceLocation LParenLoc, 1683 SourceLocation EndLoc) { 1684 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1685 StartLoc, LParenLoc, EndLoc); 1686 } 1687 1688 /// Build a new OpenMP 'proc_bind' clause. 1689 /// 1690 /// By default, performs semantic analysis to build the new OpenMP clause. 1691 /// Subclasses may override this routine to provide different behavior. 1692 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1693 SourceLocation KindKwLoc, 1694 SourceLocation StartLoc, 1695 SourceLocation LParenLoc, 1696 SourceLocation EndLoc) { 1697 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1698 StartLoc, LParenLoc, EndLoc); 1699 } 1700 1701 /// Build a new OpenMP 'schedule' clause. 1702 /// 1703 /// By default, performs semantic analysis to build the new OpenMP clause. 1704 /// Subclasses may override this routine to provide different behavior. 1705 OMPClause *RebuildOMPScheduleClause( 1706 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1707 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1708 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1709 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1710 return getSema().ActOnOpenMPScheduleClause( 1711 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1712 CommaLoc, EndLoc); 1713 } 1714 1715 /// Build a new OpenMP 'ordered' clause. 1716 /// 1717 /// By default, performs semantic analysis to build the new OpenMP clause. 1718 /// Subclasses may override this routine to provide different behavior. 1719 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1720 SourceLocation EndLoc, 1721 SourceLocation LParenLoc, Expr *Num) { 1722 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1723 } 1724 1725 /// Build a new OpenMP 'private' clause. 1726 /// 1727 /// By default, performs semantic analysis to build the new OpenMP clause. 1728 /// Subclasses may override this routine to provide different behavior. 1729 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1730 SourceLocation StartLoc, 1731 SourceLocation LParenLoc, 1732 SourceLocation EndLoc) { 1733 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1734 EndLoc); 1735 } 1736 1737 /// Build a new OpenMP 'firstprivate' clause. 1738 /// 1739 /// By default, performs semantic analysis to build the new OpenMP clause. 1740 /// Subclasses may override this routine to provide different behavior. 1741 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1742 SourceLocation StartLoc, 1743 SourceLocation LParenLoc, 1744 SourceLocation EndLoc) { 1745 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1746 EndLoc); 1747 } 1748 1749 /// Build a new OpenMP 'lastprivate' clause. 1750 /// 1751 /// By default, performs semantic analysis to build the new OpenMP clause. 1752 /// Subclasses may override this routine to provide different behavior. 1753 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1754 OpenMPLastprivateModifier LPKind, 1755 SourceLocation LPKindLoc, 1756 SourceLocation ColonLoc, 1757 SourceLocation StartLoc, 1758 SourceLocation LParenLoc, 1759 SourceLocation EndLoc) { 1760 return getSema().ActOnOpenMPLastprivateClause( 1761 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1762 } 1763 1764 /// Build a new OpenMP 'shared' clause. 1765 /// 1766 /// By default, performs semantic analysis to build the new OpenMP clause. 1767 /// Subclasses may override this routine to provide different behavior. 1768 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1769 SourceLocation StartLoc, 1770 SourceLocation LParenLoc, 1771 SourceLocation EndLoc) { 1772 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1773 EndLoc); 1774 } 1775 1776 /// Build a new OpenMP 'reduction' clause. 1777 /// 1778 /// By default, performs semantic analysis to build the new statement. 1779 /// Subclasses may override this routine to provide different behavior. 1780 OMPClause *RebuildOMPReductionClause( 1781 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1782 SourceLocation StartLoc, SourceLocation LParenLoc, 1783 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1784 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1785 const DeclarationNameInfo &ReductionId, 1786 ArrayRef<Expr *> UnresolvedReductions) { 1787 return getSema().ActOnOpenMPReductionClause( 1788 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1789 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1790 } 1791 1792 /// Build a new OpenMP 'task_reduction' clause. 1793 /// 1794 /// By default, performs semantic analysis to build the new statement. 1795 /// Subclasses may override this routine to provide different behavior. 1796 OMPClause *RebuildOMPTaskReductionClause( 1797 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1798 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1799 CXXScopeSpec &ReductionIdScopeSpec, 1800 const DeclarationNameInfo &ReductionId, 1801 ArrayRef<Expr *> UnresolvedReductions) { 1802 return getSema().ActOnOpenMPTaskReductionClause( 1803 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1804 ReductionId, UnresolvedReductions); 1805 } 1806 1807 /// Build a new OpenMP 'in_reduction' clause. 1808 /// 1809 /// By default, performs semantic analysis to build the new statement. 1810 /// Subclasses may override this routine to provide different behavior. 1811 OMPClause * 1812 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1813 SourceLocation LParenLoc, SourceLocation ColonLoc, 1814 SourceLocation EndLoc, 1815 CXXScopeSpec &ReductionIdScopeSpec, 1816 const DeclarationNameInfo &ReductionId, 1817 ArrayRef<Expr *> UnresolvedReductions) { 1818 return getSema().ActOnOpenMPInReductionClause( 1819 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1820 ReductionId, UnresolvedReductions); 1821 } 1822 1823 /// Build a new OpenMP 'linear' clause. 1824 /// 1825 /// By default, performs semantic analysis to build the new OpenMP clause. 1826 /// Subclasses may override this routine to provide different behavior. 1827 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1828 SourceLocation StartLoc, 1829 SourceLocation LParenLoc, 1830 OpenMPLinearClauseKind Modifier, 1831 SourceLocation ModifierLoc, 1832 SourceLocation ColonLoc, 1833 SourceLocation EndLoc) { 1834 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1835 Modifier, ModifierLoc, ColonLoc, 1836 EndLoc); 1837 } 1838 1839 /// Build a new OpenMP 'aligned' clause. 1840 /// 1841 /// By default, performs semantic analysis to build the new OpenMP clause. 1842 /// Subclasses may override this routine to provide different behavior. 1843 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1844 SourceLocation StartLoc, 1845 SourceLocation LParenLoc, 1846 SourceLocation ColonLoc, 1847 SourceLocation EndLoc) { 1848 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1849 LParenLoc, ColonLoc, EndLoc); 1850 } 1851 1852 /// Build a new OpenMP 'copyin' clause. 1853 /// 1854 /// By default, performs semantic analysis to build the new OpenMP clause. 1855 /// Subclasses may override this routine to provide different behavior. 1856 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1857 SourceLocation StartLoc, 1858 SourceLocation LParenLoc, 1859 SourceLocation EndLoc) { 1860 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1861 EndLoc); 1862 } 1863 1864 /// Build a new OpenMP 'copyprivate' clause. 1865 /// 1866 /// By default, performs semantic analysis to build the new OpenMP clause. 1867 /// Subclasses may override this routine to provide different behavior. 1868 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1869 SourceLocation StartLoc, 1870 SourceLocation LParenLoc, 1871 SourceLocation EndLoc) { 1872 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1873 EndLoc); 1874 } 1875 1876 /// Build a new OpenMP 'flush' pseudo clause. 1877 /// 1878 /// By default, performs semantic analysis to build the new OpenMP clause. 1879 /// Subclasses may override this routine to provide different behavior. 1880 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1881 SourceLocation StartLoc, 1882 SourceLocation LParenLoc, 1883 SourceLocation EndLoc) { 1884 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1885 EndLoc); 1886 } 1887 1888 /// Build a new OpenMP 'depobj' pseudo clause. 1889 /// 1890 /// By default, performs semantic analysis to build the new OpenMP clause. 1891 /// Subclasses may override this routine to provide different behavior. 1892 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1893 SourceLocation LParenLoc, 1894 SourceLocation EndLoc) { 1895 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1896 EndLoc); 1897 } 1898 1899 /// Build a new OpenMP 'depend' pseudo clause. 1900 /// 1901 /// By default, performs semantic analysis to build the new OpenMP clause. 1902 /// Subclasses may override this routine to provide different behavior. 1903 OMPClause * 1904 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1905 SourceLocation DepLoc, SourceLocation ColonLoc, 1906 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1907 SourceLocation LParenLoc, SourceLocation EndLoc) { 1908 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1909 ColonLoc, VarList, StartLoc, 1910 LParenLoc, EndLoc); 1911 } 1912 1913 /// Build a new OpenMP 'device' clause. 1914 /// 1915 /// By default, performs semantic analysis to build the new statement. 1916 /// Subclasses may override this routine to provide different behavior. 1917 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1918 Expr *Device, SourceLocation StartLoc, 1919 SourceLocation LParenLoc, 1920 SourceLocation ModifierLoc, 1921 SourceLocation EndLoc) { 1922 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1923 LParenLoc, ModifierLoc, EndLoc); 1924 } 1925 1926 /// Build a new OpenMP 'map' clause. 1927 /// 1928 /// By default, performs semantic analysis to build the new OpenMP clause. 1929 /// Subclasses may override this routine to provide different behavior. 1930 OMPClause *RebuildOMPMapClause( 1931 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1932 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1933 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1934 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1935 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1936 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1937 return getSema().ActOnOpenMPMapClause( 1938 MapTypeModifiers, MapTypeModifiersLoc, MapperIdScopeSpec, MapperId, 1939 MapType, IsMapTypeImplicit, MapLoc, ColonLoc, VarList, Locs, 1940 /*NoDiagnose=*/false, UnresolvedMappers); 1941 } 1942 1943 /// Build a new OpenMP 'allocate' clause. 1944 /// 1945 /// By default, performs semantic analysis to build the new OpenMP clause. 1946 /// Subclasses may override this routine to provide different behavior. 1947 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1948 SourceLocation StartLoc, 1949 SourceLocation LParenLoc, 1950 SourceLocation ColonLoc, 1951 SourceLocation EndLoc) { 1952 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1953 LParenLoc, ColonLoc, EndLoc); 1954 } 1955 1956 /// Build a new OpenMP 'num_teams' clause. 1957 /// 1958 /// By default, performs semantic analysis to build the new statement. 1959 /// Subclasses may override this routine to provide different behavior. 1960 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1961 SourceLocation LParenLoc, 1962 SourceLocation EndLoc) { 1963 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1964 EndLoc); 1965 } 1966 1967 /// Build a new OpenMP 'thread_limit' clause. 1968 /// 1969 /// By default, performs semantic analysis to build the new statement. 1970 /// Subclasses may override this routine to provide different behavior. 1971 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1972 SourceLocation StartLoc, 1973 SourceLocation LParenLoc, 1974 SourceLocation EndLoc) { 1975 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1976 LParenLoc, EndLoc); 1977 } 1978 1979 /// Build a new OpenMP 'priority' clause. 1980 /// 1981 /// By default, performs semantic analysis to build the new statement. 1982 /// Subclasses may override this routine to provide different behavior. 1983 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1984 SourceLocation LParenLoc, 1985 SourceLocation EndLoc) { 1986 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1987 EndLoc); 1988 } 1989 1990 /// Build a new OpenMP 'grainsize' clause. 1991 /// 1992 /// By default, performs semantic analysis to build the new statement. 1993 /// Subclasses may override this routine to provide different behavior. 1994 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1995 SourceLocation LParenLoc, 1996 SourceLocation EndLoc) { 1997 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1998 EndLoc); 1999 } 2000 2001 /// Build a new OpenMP 'num_tasks' clause. 2002 /// 2003 /// By default, performs semantic analysis to build the new statement. 2004 /// Subclasses may override this routine to provide different behavior. 2005 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 2006 SourceLocation LParenLoc, 2007 SourceLocation EndLoc) { 2008 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 2009 EndLoc); 2010 } 2011 2012 /// Build a new OpenMP 'hint' clause. 2013 /// 2014 /// By default, performs semantic analysis to build the new statement. 2015 /// Subclasses may override this routine to provide different behavior. 2016 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 2017 SourceLocation LParenLoc, 2018 SourceLocation EndLoc) { 2019 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 2020 } 2021 2022 /// Build a new OpenMP 'detach' clause. 2023 /// 2024 /// By default, performs semantic analysis to build the new statement. 2025 /// Subclasses may override this routine to provide different behavior. 2026 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 2027 SourceLocation LParenLoc, 2028 SourceLocation EndLoc) { 2029 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 2030 } 2031 2032 /// Build a new OpenMP 'dist_schedule' clause. 2033 /// 2034 /// By default, performs semantic analysis to build the new OpenMP clause. 2035 /// Subclasses may override this routine to provide different behavior. 2036 OMPClause * 2037 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2038 Expr *ChunkSize, SourceLocation StartLoc, 2039 SourceLocation LParenLoc, SourceLocation KindLoc, 2040 SourceLocation CommaLoc, SourceLocation EndLoc) { 2041 return getSema().ActOnOpenMPDistScheduleClause( 2042 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2043 } 2044 2045 /// Build a new OpenMP 'to' clause. 2046 /// 2047 /// By default, performs semantic analysis to build the new statement. 2048 /// Subclasses may override this routine to provide different behavior. 2049 OMPClause * 2050 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2051 ArrayRef<SourceLocation> MotionModifiersLoc, 2052 CXXScopeSpec &MapperIdScopeSpec, 2053 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2054 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2055 ArrayRef<Expr *> UnresolvedMappers) { 2056 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2057 MapperIdScopeSpec, MapperId, ColonLoc, 2058 VarList, Locs, UnresolvedMappers); 2059 } 2060 2061 /// Build a new OpenMP 'from' clause. 2062 /// 2063 /// By default, performs semantic analysis to build the new statement. 2064 /// Subclasses may override this routine to provide different behavior. 2065 OMPClause * 2066 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2067 ArrayRef<SourceLocation> MotionModifiersLoc, 2068 CXXScopeSpec &MapperIdScopeSpec, 2069 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2070 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2071 ArrayRef<Expr *> UnresolvedMappers) { 2072 return getSema().ActOnOpenMPFromClause( 2073 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2074 ColonLoc, VarList, Locs, UnresolvedMappers); 2075 } 2076 2077 /// Build a new OpenMP 'use_device_ptr' clause. 2078 /// 2079 /// By default, performs semantic analysis to build the new OpenMP clause. 2080 /// Subclasses may override this routine to provide different behavior. 2081 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2082 const OMPVarListLocTy &Locs) { 2083 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2084 } 2085 2086 /// Build a new OpenMP 'use_device_addr' clause. 2087 /// 2088 /// By default, performs semantic analysis to build the new OpenMP clause. 2089 /// Subclasses may override this routine to provide different behavior. 2090 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2091 const OMPVarListLocTy &Locs) { 2092 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2093 } 2094 2095 /// Build a new OpenMP 'is_device_ptr' clause. 2096 /// 2097 /// By default, performs semantic analysis to build the new OpenMP clause. 2098 /// Subclasses may override this routine to provide different behavior. 2099 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2100 const OMPVarListLocTy &Locs) { 2101 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2102 } 2103 2104 /// Build a new OpenMP 'defaultmap' clause. 2105 /// 2106 /// By default, performs semantic analysis to build the new OpenMP clause. 2107 /// Subclasses may override this routine to provide different behavior. 2108 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2109 OpenMPDefaultmapClauseKind Kind, 2110 SourceLocation StartLoc, 2111 SourceLocation LParenLoc, 2112 SourceLocation MLoc, 2113 SourceLocation KindLoc, 2114 SourceLocation EndLoc) { 2115 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2116 MLoc, KindLoc, EndLoc); 2117 } 2118 2119 /// Build a new OpenMP 'nontemporal' clause. 2120 /// 2121 /// By default, performs semantic analysis to build the new OpenMP clause. 2122 /// Subclasses may override this routine to provide different behavior. 2123 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2124 SourceLocation StartLoc, 2125 SourceLocation LParenLoc, 2126 SourceLocation EndLoc) { 2127 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2128 EndLoc); 2129 } 2130 2131 /// Build a new OpenMP 'inclusive' clause. 2132 /// 2133 /// By default, performs semantic analysis to build the new OpenMP clause. 2134 /// Subclasses may override this routine to provide different behavior. 2135 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2136 SourceLocation StartLoc, 2137 SourceLocation LParenLoc, 2138 SourceLocation EndLoc) { 2139 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2140 EndLoc); 2141 } 2142 2143 /// Build a new OpenMP 'exclusive' clause. 2144 /// 2145 /// By default, performs semantic analysis to build the new OpenMP clause. 2146 /// Subclasses may override this routine to provide different behavior. 2147 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2148 SourceLocation StartLoc, 2149 SourceLocation LParenLoc, 2150 SourceLocation EndLoc) { 2151 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2152 EndLoc); 2153 } 2154 2155 /// Build a new OpenMP 'uses_allocators' clause. 2156 /// 2157 /// By default, performs semantic analysis to build the new OpenMP clause. 2158 /// Subclasses may override this routine to provide different behavior. 2159 OMPClause *RebuildOMPUsesAllocatorsClause( 2160 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2161 SourceLocation LParenLoc, SourceLocation EndLoc) { 2162 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2163 Data); 2164 } 2165 2166 /// Build a new OpenMP 'affinity' clause. 2167 /// 2168 /// By default, performs semantic analysis to build the new OpenMP clause. 2169 /// Subclasses may override this routine to provide different behavior. 2170 OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc, 2171 SourceLocation LParenLoc, 2172 SourceLocation ColonLoc, 2173 SourceLocation EndLoc, Expr *Modifier, 2174 ArrayRef<Expr *> Locators) { 2175 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2176 EndLoc, Modifier, Locators); 2177 } 2178 2179 /// Build a new OpenMP 'order' clause. 2180 /// 2181 /// By default, performs semantic analysis to build the new OpenMP clause. 2182 /// Subclasses may override this routine to provide different behavior. 2183 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2184 SourceLocation KindKwLoc, 2185 SourceLocation StartLoc, 2186 SourceLocation LParenLoc, 2187 SourceLocation EndLoc) { 2188 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2189 LParenLoc, EndLoc); 2190 } 2191 2192 /// Build a new OpenMP 'init' clause. 2193 /// 2194 /// By default, performs semantic analysis to build the new OpenMP clause. 2195 /// Subclasses may override this routine to provide different behavior. 2196 OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs, 2197 bool IsTarget, bool IsTargetSync, 2198 SourceLocation StartLoc, 2199 SourceLocation LParenLoc, 2200 SourceLocation VarLoc, 2201 SourceLocation EndLoc) { 2202 return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget, 2203 IsTargetSync, StartLoc, LParenLoc, 2204 VarLoc, EndLoc); 2205 } 2206 2207 /// Build a new OpenMP 'use' clause. 2208 /// 2209 /// By default, performs semantic analysis to build the new OpenMP clause. 2210 /// Subclasses may override this routine to provide different behavior. 2211 OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc, 2212 SourceLocation LParenLoc, 2213 SourceLocation VarLoc, SourceLocation EndLoc) { 2214 return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc, 2215 VarLoc, EndLoc); 2216 } 2217 2218 /// Build a new OpenMP 'destroy' clause. 2219 /// 2220 /// By default, performs semantic analysis to build the new OpenMP clause. 2221 /// Subclasses may override this routine to provide different behavior. 2222 OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc, 2223 SourceLocation LParenLoc, 2224 SourceLocation VarLoc, 2225 SourceLocation EndLoc) { 2226 return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc, 2227 VarLoc, EndLoc); 2228 } 2229 2230 /// Build a new OpenMP 'novariants' clause. 2231 /// 2232 /// By default, performs semantic analysis to build the new OpenMP clause. 2233 /// Subclasses may override this routine to provide different behavior. 2234 OMPClause *RebuildOMPNovariantsClause(Expr *Condition, 2235 SourceLocation StartLoc, 2236 SourceLocation LParenLoc, 2237 SourceLocation EndLoc) { 2238 return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc, 2239 EndLoc); 2240 } 2241 2242 /// Build a new OpenMP 'nocontext' clause. 2243 /// 2244 /// By default, performs semantic analysis to build the new OpenMP clause. 2245 /// Subclasses may override this routine to provide different behavior. 2246 OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc, 2247 SourceLocation LParenLoc, 2248 SourceLocation EndLoc) { 2249 return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc, 2250 EndLoc); 2251 } 2252 2253 /// Build a new OpenMP 'filter' clause. 2254 /// 2255 /// By default, performs semantic analysis to build the new OpenMP clause. 2256 /// Subclasses may override this routine to provide different behavior. 2257 OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc, 2258 SourceLocation LParenLoc, 2259 SourceLocation EndLoc) { 2260 return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc, 2261 EndLoc); 2262 } 2263 2264 /// Build a new OpenMP 'bind' clause. 2265 /// 2266 /// By default, performs semantic analysis to build the new OpenMP clause. 2267 /// Subclasses may override this routine to provide different behavior. 2268 OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind, 2269 SourceLocation KindLoc, 2270 SourceLocation StartLoc, 2271 SourceLocation LParenLoc, 2272 SourceLocation EndLoc) { 2273 return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc, 2274 EndLoc); 2275 } 2276 2277 /// Build a new OpenMP 'align' clause. 2278 /// 2279 /// By default, performs semantic analysis to build the new OpenMP clause. 2280 /// Subclasses may override this routine to provide different behavior. 2281 OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc, 2282 SourceLocation LParenLoc, 2283 SourceLocation EndLoc) { 2284 return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc); 2285 } 2286 2287 /// Rebuild the operand to an Objective-C \@synchronized statement. 2288 /// 2289 /// By default, performs semantic analysis to build the new statement. 2290 /// Subclasses may override this routine to provide different behavior. 2291 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2292 Expr *object) { 2293 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2294 } 2295 2296 /// Build a new Objective-C \@synchronized statement. 2297 /// 2298 /// By default, performs semantic analysis to build the new statement. 2299 /// Subclasses may override this routine to provide different behavior. 2300 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2301 Expr *Object, Stmt *Body) { 2302 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2303 } 2304 2305 /// Build a new Objective-C \@autoreleasepool statement. 2306 /// 2307 /// By default, performs semantic analysis to build the new statement. 2308 /// Subclasses may override this routine to provide different behavior. 2309 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2310 Stmt *Body) { 2311 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2312 } 2313 2314 /// Build a new Objective-C fast enumeration statement. 2315 /// 2316 /// By default, performs semantic analysis to build the new statement. 2317 /// Subclasses may override this routine to provide different behavior. 2318 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2319 Stmt *Element, 2320 Expr *Collection, 2321 SourceLocation RParenLoc, 2322 Stmt *Body) { 2323 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2324 Element, 2325 Collection, 2326 RParenLoc); 2327 if (ForEachStmt.isInvalid()) 2328 return StmtError(); 2329 2330 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2331 } 2332 2333 /// Build a new C++ exception declaration. 2334 /// 2335 /// By default, performs semantic analysis to build the new decaration. 2336 /// Subclasses may override this routine to provide different behavior. 2337 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2338 TypeSourceInfo *Declarator, 2339 SourceLocation StartLoc, 2340 SourceLocation IdLoc, 2341 IdentifierInfo *Id) { 2342 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2343 StartLoc, IdLoc, Id); 2344 if (Var) 2345 getSema().CurContext->addDecl(Var); 2346 return Var; 2347 } 2348 2349 /// Build a new C++ catch statement. 2350 /// 2351 /// By default, performs semantic analysis to build the new statement. 2352 /// Subclasses may override this routine to provide different behavior. 2353 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2354 VarDecl *ExceptionDecl, 2355 Stmt *Handler) { 2356 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2357 Handler)); 2358 } 2359 2360 /// Build a new C++ try statement. 2361 /// 2362 /// By default, performs semantic analysis to build the new statement. 2363 /// Subclasses may override this routine to provide different behavior. 2364 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2365 ArrayRef<Stmt *> Handlers) { 2366 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2367 } 2368 2369 /// Build a new C++0x range-based for statement. 2370 /// 2371 /// By default, performs semantic analysis to build the new statement. 2372 /// Subclasses may override this routine to provide different behavior. 2373 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2374 SourceLocation CoawaitLoc, Stmt *Init, 2375 SourceLocation ColonLoc, Stmt *Range, 2376 Stmt *Begin, Stmt *End, Expr *Cond, 2377 Expr *Inc, Stmt *LoopVar, 2378 SourceLocation RParenLoc) { 2379 // If we've just learned that the range is actually an Objective-C 2380 // collection, treat this as an Objective-C fast enumeration loop. 2381 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2382 if (RangeStmt->isSingleDecl()) { 2383 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2384 if (RangeVar->isInvalidDecl()) 2385 return StmtError(); 2386 2387 Expr *RangeExpr = RangeVar->getInit(); 2388 if (!RangeExpr->isTypeDependent() && 2389 RangeExpr->getType()->isObjCObjectPointerType()) { 2390 // FIXME: Support init-statements in Objective-C++20 ranged for 2391 // statement. 2392 if (Init) { 2393 return SemaRef.Diag(Init->getBeginLoc(), 2394 diag::err_objc_for_range_init_stmt) 2395 << Init->getSourceRange(); 2396 } 2397 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2398 RangeExpr, RParenLoc); 2399 } 2400 } 2401 } 2402 } 2403 2404 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2405 Range, Begin, End, Cond, Inc, LoopVar, 2406 RParenLoc, Sema::BFRK_Rebuild); 2407 } 2408 2409 /// Build a new C++0x range-based for statement. 2410 /// 2411 /// By default, performs semantic analysis to build the new statement. 2412 /// Subclasses may override this routine to provide different behavior. 2413 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2414 bool IsIfExists, 2415 NestedNameSpecifierLoc QualifierLoc, 2416 DeclarationNameInfo NameInfo, 2417 Stmt *Nested) { 2418 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2419 QualifierLoc, NameInfo, Nested); 2420 } 2421 2422 /// Attach body to a C++0x range-based for statement. 2423 /// 2424 /// By default, performs semantic analysis to finish the new statement. 2425 /// Subclasses may override this routine to provide different behavior. 2426 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2427 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2428 } 2429 2430 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2431 Stmt *TryBlock, Stmt *Handler) { 2432 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2433 } 2434 2435 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2436 Stmt *Block) { 2437 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2438 } 2439 2440 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2441 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2442 } 2443 2444 ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc, 2445 SourceLocation LParen, 2446 SourceLocation RParen, 2447 TypeSourceInfo *TSI) { 2448 return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI); 2449 } 2450 2451 /// Build a new predefined expression. 2452 /// 2453 /// By default, performs semantic analysis to build the new expression. 2454 /// Subclasses may override this routine to provide different behavior. 2455 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2456 PredefinedExpr::IdentKind IK) { 2457 return getSema().BuildPredefinedExpr(Loc, IK); 2458 } 2459 2460 /// Build a new expression that references a declaration. 2461 /// 2462 /// By default, performs semantic analysis to build the new expression. 2463 /// Subclasses may override this routine to provide different behavior. 2464 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2465 LookupResult &R, 2466 bool RequiresADL) { 2467 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2468 } 2469 2470 2471 /// Build a new expression that references a declaration. 2472 /// 2473 /// By default, performs semantic analysis to build the new expression. 2474 /// Subclasses may override this routine to provide different behavior. 2475 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2476 ValueDecl *VD, 2477 const DeclarationNameInfo &NameInfo, 2478 NamedDecl *Found, 2479 TemplateArgumentListInfo *TemplateArgs) { 2480 CXXScopeSpec SS; 2481 SS.Adopt(QualifierLoc); 2482 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2483 TemplateArgs); 2484 } 2485 2486 /// Build a new expression in parentheses. 2487 /// 2488 /// By default, performs semantic analysis to build the new expression. 2489 /// Subclasses may override this routine to provide different behavior. 2490 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2491 SourceLocation RParen) { 2492 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2493 } 2494 2495 /// Build a new pseudo-destructor expression. 2496 /// 2497 /// By default, performs semantic analysis to build the new expression. 2498 /// Subclasses may override this routine to provide different behavior. 2499 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2500 SourceLocation OperatorLoc, 2501 bool isArrow, 2502 CXXScopeSpec &SS, 2503 TypeSourceInfo *ScopeType, 2504 SourceLocation CCLoc, 2505 SourceLocation TildeLoc, 2506 PseudoDestructorTypeStorage Destroyed); 2507 2508 /// Build a new unary operator expression. 2509 /// 2510 /// By default, performs semantic analysis to build the new expression. 2511 /// Subclasses may override this routine to provide different behavior. 2512 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2513 UnaryOperatorKind Opc, 2514 Expr *SubExpr) { 2515 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2516 } 2517 2518 /// Build a new builtin offsetof expression. 2519 /// 2520 /// By default, performs semantic analysis to build the new expression. 2521 /// Subclasses may override this routine to provide different behavior. 2522 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2523 TypeSourceInfo *Type, 2524 ArrayRef<Sema::OffsetOfComponent> Components, 2525 SourceLocation RParenLoc) { 2526 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2527 RParenLoc); 2528 } 2529 2530 /// Build a new sizeof, alignof or vec_step expression with a 2531 /// type argument. 2532 /// 2533 /// By default, performs semantic analysis to build the new expression. 2534 /// Subclasses may override this routine to provide different behavior. 2535 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2536 SourceLocation OpLoc, 2537 UnaryExprOrTypeTrait ExprKind, 2538 SourceRange R) { 2539 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2540 } 2541 2542 /// Build a new sizeof, alignof or vec step expression with an 2543 /// expression argument. 2544 /// 2545 /// By default, performs semantic analysis to build the new expression. 2546 /// Subclasses may override this routine to provide different behavior. 2547 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2548 UnaryExprOrTypeTrait ExprKind, 2549 SourceRange R) { 2550 ExprResult Result 2551 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2552 if (Result.isInvalid()) 2553 return ExprError(); 2554 2555 return Result; 2556 } 2557 2558 /// Build a new array subscript expression. 2559 /// 2560 /// By default, performs semantic analysis to build the new expression. 2561 /// Subclasses may override this routine to provide different behavior. 2562 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2563 SourceLocation LBracketLoc, 2564 Expr *RHS, 2565 SourceLocation RBracketLoc) { 2566 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2567 LBracketLoc, RHS, 2568 RBracketLoc); 2569 } 2570 2571 /// Build a new matrix subscript expression. 2572 /// 2573 /// By default, performs semantic analysis to build the new expression. 2574 /// Subclasses may override this routine to provide different behavior. 2575 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2576 Expr *ColumnIdx, 2577 SourceLocation RBracketLoc) { 2578 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2579 RBracketLoc); 2580 } 2581 2582 /// Build a new array section expression. 2583 /// 2584 /// By default, performs semantic analysis to build the new expression. 2585 /// Subclasses may override this routine to provide different behavior. 2586 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2587 Expr *LowerBound, 2588 SourceLocation ColonLocFirst, 2589 SourceLocation ColonLocSecond, 2590 Expr *Length, Expr *Stride, 2591 SourceLocation RBracketLoc) { 2592 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2593 ColonLocFirst, ColonLocSecond, 2594 Length, Stride, RBracketLoc); 2595 } 2596 2597 /// Build a new array shaping expression. 2598 /// 2599 /// By default, performs semantic analysis to build the new expression. 2600 /// Subclasses may override this routine to provide different behavior. 2601 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2602 SourceLocation RParenLoc, 2603 ArrayRef<Expr *> Dims, 2604 ArrayRef<SourceRange> BracketsRanges) { 2605 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2606 BracketsRanges); 2607 } 2608 2609 /// Build a new iterator expression. 2610 /// 2611 /// By default, performs semantic analysis to build the new expression. 2612 /// Subclasses may override this routine to provide different behavior. 2613 ExprResult RebuildOMPIteratorExpr( 2614 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2615 ArrayRef<Sema::OMPIteratorData> Data) { 2616 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2617 LLoc, RLoc, Data); 2618 } 2619 2620 /// Build a new call expression. 2621 /// 2622 /// By default, performs semantic analysis to build the new expression. 2623 /// Subclasses may override this routine to provide different behavior. 2624 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2625 MultiExprArg Args, 2626 SourceLocation RParenLoc, 2627 Expr *ExecConfig = nullptr) { 2628 return getSema().ActOnCallExpr( 2629 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2630 } 2631 2632 ExprResult RebuildCxxSubscriptExpr(Expr *Callee, SourceLocation LParenLoc, 2633 MultiExprArg Args, 2634 SourceLocation RParenLoc) { 2635 return getSema().ActOnArraySubscriptExpr( 2636 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc); 2637 } 2638 2639 /// Build a new member access expression. 2640 /// 2641 /// By default, performs semantic analysis to build the new expression. 2642 /// Subclasses may override this routine to provide different behavior. 2643 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2644 bool isArrow, 2645 NestedNameSpecifierLoc QualifierLoc, 2646 SourceLocation TemplateKWLoc, 2647 const DeclarationNameInfo &MemberNameInfo, 2648 ValueDecl *Member, 2649 NamedDecl *FoundDecl, 2650 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2651 NamedDecl *FirstQualifierInScope) { 2652 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2653 isArrow); 2654 if (!Member->getDeclName()) { 2655 // We have a reference to an unnamed field. This is always the 2656 // base of an anonymous struct/union member access, i.e. the 2657 // field is always of record type. 2658 assert(Member->getType()->isRecordType() && 2659 "unnamed member not of record type?"); 2660 2661 BaseResult = 2662 getSema().PerformObjectMemberConversion(BaseResult.get(), 2663 QualifierLoc.getNestedNameSpecifier(), 2664 FoundDecl, Member); 2665 if (BaseResult.isInvalid()) 2666 return ExprError(); 2667 Base = BaseResult.get(); 2668 2669 CXXScopeSpec EmptySS; 2670 return getSema().BuildFieldReferenceExpr( 2671 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2672 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2673 } 2674 2675 CXXScopeSpec SS; 2676 SS.Adopt(QualifierLoc); 2677 2678 Base = BaseResult.get(); 2679 QualType BaseType = Base->getType(); 2680 2681 if (isArrow && !BaseType->isPointerType()) 2682 return ExprError(); 2683 2684 // FIXME: this involves duplicating earlier analysis in a lot of 2685 // cases; we should avoid this when possible. 2686 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2687 R.addDecl(FoundDecl); 2688 R.resolveKind(); 2689 2690 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2691 SS, TemplateKWLoc, 2692 FirstQualifierInScope, 2693 R, ExplicitTemplateArgs, 2694 /*S*/nullptr); 2695 } 2696 2697 /// Build a new binary operator expression. 2698 /// 2699 /// By default, performs semantic analysis to build the new expression. 2700 /// Subclasses may override this routine to provide different behavior. 2701 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2702 BinaryOperatorKind Opc, 2703 Expr *LHS, Expr *RHS) { 2704 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2705 } 2706 2707 /// Build a new rewritten operator expression. 2708 /// 2709 /// By default, performs semantic analysis to build the new expression. 2710 /// Subclasses may override this routine to provide different behavior. 2711 ExprResult RebuildCXXRewrittenBinaryOperator( 2712 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2713 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2714 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2715 RHS, /*RequiresADL*/false); 2716 } 2717 2718 /// Build a new conditional operator expression. 2719 /// 2720 /// By default, performs semantic analysis to build the new expression. 2721 /// Subclasses may override this routine to provide different behavior. 2722 ExprResult RebuildConditionalOperator(Expr *Cond, 2723 SourceLocation QuestionLoc, 2724 Expr *LHS, 2725 SourceLocation ColonLoc, 2726 Expr *RHS) { 2727 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2728 LHS, RHS); 2729 } 2730 2731 /// Build a new C-style cast expression. 2732 /// 2733 /// By default, performs semantic analysis to build the new expression. 2734 /// Subclasses may override this routine to provide different behavior. 2735 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2736 TypeSourceInfo *TInfo, 2737 SourceLocation RParenLoc, 2738 Expr *SubExpr) { 2739 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2740 SubExpr); 2741 } 2742 2743 /// Build a new compound literal expression. 2744 /// 2745 /// By default, performs semantic analysis to build the new expression. 2746 /// Subclasses may override this routine to provide different behavior. 2747 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2748 TypeSourceInfo *TInfo, 2749 SourceLocation RParenLoc, 2750 Expr *Init) { 2751 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2752 Init); 2753 } 2754 2755 /// Build a new extended vector element access expression. 2756 /// 2757 /// By default, performs semantic analysis to build the new expression. 2758 /// Subclasses may override this routine to provide different behavior. 2759 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2760 SourceLocation OpLoc, 2761 SourceLocation AccessorLoc, 2762 IdentifierInfo &Accessor) { 2763 2764 CXXScopeSpec SS; 2765 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2766 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2767 OpLoc, /*IsArrow*/ false, 2768 SS, SourceLocation(), 2769 /*FirstQualifierInScope*/ nullptr, 2770 NameInfo, 2771 /* TemplateArgs */ nullptr, 2772 /*S*/ nullptr); 2773 } 2774 2775 /// Build a new initializer list expression. 2776 /// 2777 /// By default, performs semantic analysis to build the new expression. 2778 /// Subclasses may override this routine to provide different behavior. 2779 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2780 MultiExprArg Inits, 2781 SourceLocation RBraceLoc) { 2782 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2783 } 2784 2785 /// Build a new designated initializer expression. 2786 /// 2787 /// By default, performs semantic analysis to build the new expression. 2788 /// Subclasses may override this routine to provide different behavior. 2789 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2790 MultiExprArg ArrayExprs, 2791 SourceLocation EqualOrColonLoc, 2792 bool GNUSyntax, 2793 Expr *Init) { 2794 ExprResult Result 2795 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2796 Init); 2797 if (Result.isInvalid()) 2798 return ExprError(); 2799 2800 return Result; 2801 } 2802 2803 /// Build a new value-initialized expression. 2804 /// 2805 /// By default, builds the implicit value initialization without performing 2806 /// any semantic analysis. Subclasses may override this routine to provide 2807 /// different behavior. 2808 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2809 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2810 } 2811 2812 /// Build a new \c va_arg expression. 2813 /// 2814 /// By default, performs semantic analysis to build the new expression. 2815 /// Subclasses may override this routine to provide different behavior. 2816 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2817 Expr *SubExpr, TypeSourceInfo *TInfo, 2818 SourceLocation RParenLoc) { 2819 return getSema().BuildVAArgExpr(BuiltinLoc, 2820 SubExpr, TInfo, 2821 RParenLoc); 2822 } 2823 2824 /// Build a new expression list in parentheses. 2825 /// 2826 /// By default, performs semantic analysis to build the new expression. 2827 /// Subclasses may override this routine to provide different behavior. 2828 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2829 MultiExprArg SubExprs, 2830 SourceLocation RParenLoc) { 2831 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2832 } 2833 2834 /// Build a new address-of-label expression. 2835 /// 2836 /// By default, performs semantic analysis, using the name of the label 2837 /// rather than attempting to map the label statement itself. 2838 /// Subclasses may override this routine to provide different behavior. 2839 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2840 SourceLocation LabelLoc, LabelDecl *Label) { 2841 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2842 } 2843 2844 /// Build a new GNU statement expression. 2845 /// 2846 /// By default, performs semantic analysis to build the new expression. 2847 /// Subclasses may override this routine to provide different behavior. 2848 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2849 SourceLocation RParenLoc, unsigned TemplateDepth) { 2850 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2851 TemplateDepth); 2852 } 2853 2854 /// Build a new __builtin_choose_expr expression. 2855 /// 2856 /// By default, performs semantic analysis to build the new expression. 2857 /// Subclasses may override this routine to provide different behavior. 2858 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2859 Expr *Cond, Expr *LHS, Expr *RHS, 2860 SourceLocation RParenLoc) { 2861 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2862 Cond, LHS, RHS, 2863 RParenLoc); 2864 } 2865 2866 /// Build a new generic selection expression. 2867 /// 2868 /// By default, performs semantic analysis to build the new expression. 2869 /// Subclasses may override this routine to provide different behavior. 2870 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2871 SourceLocation DefaultLoc, 2872 SourceLocation RParenLoc, 2873 Expr *ControllingExpr, 2874 ArrayRef<TypeSourceInfo *> Types, 2875 ArrayRef<Expr *> Exprs) { 2876 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2877 ControllingExpr, Types, Exprs); 2878 } 2879 2880 /// Build a new overloaded operator call expression. 2881 /// 2882 /// By default, performs semantic analysis to build the new expression. 2883 /// The semantic analysis provides the behavior of template instantiation, 2884 /// copying with transformations that turn what looks like an overloaded 2885 /// operator call into a use of a builtin operator, performing 2886 /// argument-dependent lookup, etc. Subclasses may override this routine to 2887 /// provide different behavior. 2888 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2889 SourceLocation OpLoc, 2890 Expr *Callee, 2891 Expr *First, 2892 Expr *Second); 2893 2894 /// Build a new C++ "named" cast expression, such as static_cast or 2895 /// reinterpret_cast. 2896 /// 2897 /// By default, this routine dispatches to one of the more-specific routines 2898 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2899 /// Subclasses may override this routine to provide different behavior. 2900 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2901 Stmt::StmtClass Class, 2902 SourceLocation LAngleLoc, 2903 TypeSourceInfo *TInfo, 2904 SourceLocation RAngleLoc, 2905 SourceLocation LParenLoc, 2906 Expr *SubExpr, 2907 SourceLocation RParenLoc) { 2908 switch (Class) { 2909 case Stmt::CXXStaticCastExprClass: 2910 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2911 RAngleLoc, LParenLoc, 2912 SubExpr, RParenLoc); 2913 2914 case Stmt::CXXDynamicCastExprClass: 2915 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2916 RAngleLoc, LParenLoc, 2917 SubExpr, RParenLoc); 2918 2919 case Stmt::CXXReinterpretCastExprClass: 2920 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2921 RAngleLoc, LParenLoc, 2922 SubExpr, 2923 RParenLoc); 2924 2925 case Stmt::CXXConstCastExprClass: 2926 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2927 RAngleLoc, LParenLoc, 2928 SubExpr, RParenLoc); 2929 2930 case Stmt::CXXAddrspaceCastExprClass: 2931 return getDerived().RebuildCXXAddrspaceCastExpr( 2932 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2933 2934 default: 2935 llvm_unreachable("Invalid C++ named cast"); 2936 } 2937 } 2938 2939 /// Build a new C++ static_cast expression. 2940 /// 2941 /// By default, performs semantic analysis to build the new expression. 2942 /// Subclasses may override this routine to provide different behavior. 2943 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2944 SourceLocation LAngleLoc, 2945 TypeSourceInfo *TInfo, 2946 SourceLocation RAngleLoc, 2947 SourceLocation LParenLoc, 2948 Expr *SubExpr, 2949 SourceLocation RParenLoc) { 2950 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2951 TInfo, SubExpr, 2952 SourceRange(LAngleLoc, RAngleLoc), 2953 SourceRange(LParenLoc, RParenLoc)); 2954 } 2955 2956 /// Build a new C++ dynamic_cast expression. 2957 /// 2958 /// By default, performs semantic analysis to build the new expression. 2959 /// Subclasses may override this routine to provide different behavior. 2960 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2961 SourceLocation LAngleLoc, 2962 TypeSourceInfo *TInfo, 2963 SourceLocation RAngleLoc, 2964 SourceLocation LParenLoc, 2965 Expr *SubExpr, 2966 SourceLocation RParenLoc) { 2967 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2968 TInfo, SubExpr, 2969 SourceRange(LAngleLoc, RAngleLoc), 2970 SourceRange(LParenLoc, RParenLoc)); 2971 } 2972 2973 /// Build a new C++ reinterpret_cast expression. 2974 /// 2975 /// By default, performs semantic analysis to build the new expression. 2976 /// Subclasses may override this routine to provide different behavior. 2977 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2978 SourceLocation LAngleLoc, 2979 TypeSourceInfo *TInfo, 2980 SourceLocation RAngleLoc, 2981 SourceLocation LParenLoc, 2982 Expr *SubExpr, 2983 SourceLocation RParenLoc) { 2984 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2985 TInfo, SubExpr, 2986 SourceRange(LAngleLoc, RAngleLoc), 2987 SourceRange(LParenLoc, RParenLoc)); 2988 } 2989 2990 /// Build a new C++ const_cast expression. 2991 /// 2992 /// By default, performs semantic analysis to build the new expression. 2993 /// Subclasses may override this routine to provide different behavior. 2994 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2995 SourceLocation LAngleLoc, 2996 TypeSourceInfo *TInfo, 2997 SourceLocation RAngleLoc, 2998 SourceLocation LParenLoc, 2999 Expr *SubExpr, 3000 SourceLocation RParenLoc) { 3001 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 3002 TInfo, SubExpr, 3003 SourceRange(LAngleLoc, RAngleLoc), 3004 SourceRange(LParenLoc, RParenLoc)); 3005 } 3006 3007 ExprResult 3008 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 3009 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 3010 SourceLocation LParenLoc, Expr *SubExpr, 3011 SourceLocation RParenLoc) { 3012 return getSema().BuildCXXNamedCast( 3013 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 3014 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 3015 } 3016 3017 /// Build a new C++ functional-style cast expression. 3018 /// 3019 /// By default, performs semantic analysis to build the new expression. 3020 /// Subclasses may override this routine to provide different behavior. 3021 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 3022 SourceLocation LParenLoc, 3023 Expr *Sub, 3024 SourceLocation RParenLoc, 3025 bool ListInitialization) { 3026 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 3027 MultiExprArg(&Sub, 1), RParenLoc, 3028 ListInitialization); 3029 } 3030 3031 /// Build a new C++ __builtin_bit_cast expression. 3032 /// 3033 /// By default, performs semantic analysis to build the new expression. 3034 /// Subclasses may override this routine to provide different behavior. 3035 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 3036 TypeSourceInfo *TSI, Expr *Sub, 3037 SourceLocation RParenLoc) { 3038 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 3039 } 3040 3041 /// Build a new C++ typeid(type) expression. 3042 /// 3043 /// By default, performs semantic analysis to build the new expression. 3044 /// Subclasses may override this routine to provide different behavior. 3045 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3046 SourceLocation TypeidLoc, 3047 TypeSourceInfo *Operand, 3048 SourceLocation RParenLoc) { 3049 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3050 RParenLoc); 3051 } 3052 3053 3054 /// Build a new C++ typeid(expr) expression. 3055 /// 3056 /// By default, performs semantic analysis to build the new expression. 3057 /// Subclasses may override this routine to provide different behavior. 3058 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 3059 SourceLocation TypeidLoc, 3060 Expr *Operand, 3061 SourceLocation RParenLoc) { 3062 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 3063 RParenLoc); 3064 } 3065 3066 /// Build a new C++ __uuidof(type) expression. 3067 /// 3068 /// By default, performs semantic analysis to build the new expression. 3069 /// Subclasses may override this routine to provide different behavior. 3070 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3071 TypeSourceInfo *Operand, 3072 SourceLocation RParenLoc) { 3073 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3074 } 3075 3076 /// Build a new C++ __uuidof(expr) expression. 3077 /// 3078 /// By default, performs semantic analysis to build the new expression. 3079 /// Subclasses may override this routine to provide different behavior. 3080 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 3081 Expr *Operand, SourceLocation RParenLoc) { 3082 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 3083 } 3084 3085 /// Build a new C++ "this" expression. 3086 /// 3087 /// By default, builds a new "this" expression without performing any 3088 /// semantic analysis. Subclasses may override this routine to provide 3089 /// different behavior. 3090 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 3091 QualType ThisType, 3092 bool isImplicit) { 3093 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 3094 } 3095 3096 /// Build a new C++ throw expression. 3097 /// 3098 /// By default, performs semantic analysis to build the new expression. 3099 /// Subclasses may override this routine to provide different behavior. 3100 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 3101 bool IsThrownVariableInScope) { 3102 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 3103 } 3104 3105 /// Build a new C++ default-argument expression. 3106 /// 3107 /// By default, builds a new default-argument expression, which does not 3108 /// require any semantic analysis. Subclasses may override this routine to 3109 /// provide different behavior. 3110 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 3111 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 3112 getSema().CurContext); 3113 } 3114 3115 /// Build a new C++11 default-initialization expression. 3116 /// 3117 /// By default, builds a new default field initialization expression, which 3118 /// does not require any semantic analysis. Subclasses may override this 3119 /// routine to provide different behavior. 3120 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 3121 FieldDecl *Field) { 3122 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 3123 getSema().CurContext); 3124 } 3125 3126 /// Build a new C++ zero-initialization expression. 3127 /// 3128 /// By default, performs semantic analysis to build the new expression. 3129 /// Subclasses may override this routine to provide different behavior. 3130 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 3131 SourceLocation LParenLoc, 3132 SourceLocation RParenLoc) { 3133 return getSema().BuildCXXTypeConstructExpr( 3134 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 3135 } 3136 3137 /// Build a new C++ "new" expression. 3138 /// 3139 /// By default, performs semantic analysis to build the new expression. 3140 /// Subclasses may override this routine to provide different behavior. 3141 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 3142 bool UseGlobal, 3143 SourceLocation PlacementLParen, 3144 MultiExprArg PlacementArgs, 3145 SourceLocation PlacementRParen, 3146 SourceRange TypeIdParens, 3147 QualType AllocatedType, 3148 TypeSourceInfo *AllocatedTypeInfo, 3149 Optional<Expr *> ArraySize, 3150 SourceRange DirectInitRange, 3151 Expr *Initializer) { 3152 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3153 PlacementLParen, 3154 PlacementArgs, 3155 PlacementRParen, 3156 TypeIdParens, 3157 AllocatedType, 3158 AllocatedTypeInfo, 3159 ArraySize, 3160 DirectInitRange, 3161 Initializer); 3162 } 3163 3164 /// Build a new C++ "delete" expression. 3165 /// 3166 /// By default, performs semantic analysis to build the new expression. 3167 /// Subclasses may override this routine to provide different behavior. 3168 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3169 bool IsGlobalDelete, 3170 bool IsArrayForm, 3171 Expr *Operand) { 3172 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3173 Operand); 3174 } 3175 3176 /// Build a new type trait expression. 3177 /// 3178 /// By default, performs semantic analysis to build the new expression. 3179 /// Subclasses may override this routine to provide different behavior. 3180 ExprResult RebuildTypeTrait(TypeTrait Trait, 3181 SourceLocation StartLoc, 3182 ArrayRef<TypeSourceInfo *> Args, 3183 SourceLocation RParenLoc) { 3184 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3185 } 3186 3187 /// Build a new array type trait expression. 3188 /// 3189 /// By default, performs semantic analysis to build the new expression. 3190 /// Subclasses may override this routine to provide different behavior. 3191 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3192 SourceLocation StartLoc, 3193 TypeSourceInfo *TSInfo, 3194 Expr *DimExpr, 3195 SourceLocation RParenLoc) { 3196 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3197 } 3198 3199 /// Build a new expression trait expression. 3200 /// 3201 /// By default, performs semantic analysis to build the new expression. 3202 /// Subclasses may override this routine to provide different behavior. 3203 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3204 SourceLocation StartLoc, 3205 Expr *Queried, 3206 SourceLocation RParenLoc) { 3207 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3208 } 3209 3210 /// Build a new (previously unresolved) declaration reference 3211 /// expression. 3212 /// 3213 /// By default, performs semantic analysis to build the new expression. 3214 /// Subclasses may override this routine to provide different behavior. 3215 ExprResult RebuildDependentScopeDeclRefExpr( 3216 NestedNameSpecifierLoc QualifierLoc, 3217 SourceLocation TemplateKWLoc, 3218 const DeclarationNameInfo &NameInfo, 3219 const TemplateArgumentListInfo *TemplateArgs, 3220 bool IsAddressOfOperand, 3221 TypeSourceInfo **RecoveryTSI) { 3222 CXXScopeSpec SS; 3223 SS.Adopt(QualifierLoc); 3224 3225 if (TemplateArgs || TemplateKWLoc.isValid()) 3226 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3227 TemplateArgs); 3228 3229 return getSema().BuildQualifiedDeclarationNameExpr( 3230 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3231 } 3232 3233 /// Build a new template-id expression. 3234 /// 3235 /// By default, performs semantic analysis to build the new expression. 3236 /// Subclasses may override this routine to provide different behavior. 3237 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3238 SourceLocation TemplateKWLoc, 3239 LookupResult &R, 3240 bool RequiresADL, 3241 const TemplateArgumentListInfo *TemplateArgs) { 3242 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3243 TemplateArgs); 3244 } 3245 3246 /// Build a new object-construction expression. 3247 /// 3248 /// By default, performs semantic analysis to build the new expression. 3249 /// Subclasses may override this routine to provide different behavior. 3250 ExprResult RebuildCXXConstructExpr(QualType T, 3251 SourceLocation Loc, 3252 CXXConstructorDecl *Constructor, 3253 bool IsElidable, 3254 MultiExprArg Args, 3255 bool HadMultipleCandidates, 3256 bool ListInitialization, 3257 bool StdInitListInitialization, 3258 bool RequiresZeroInit, 3259 CXXConstructExpr::ConstructionKind ConstructKind, 3260 SourceRange ParenRange) { 3261 // Reconstruct the constructor we originally found, which might be 3262 // different if this is a call to an inherited constructor. 3263 CXXConstructorDecl *FoundCtor = Constructor; 3264 if (Constructor->isInheritingConstructor()) 3265 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3266 3267 SmallVector<Expr *, 8> ConvertedArgs; 3268 if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc, 3269 ConvertedArgs)) 3270 return ExprError(); 3271 3272 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3273 IsElidable, 3274 ConvertedArgs, 3275 HadMultipleCandidates, 3276 ListInitialization, 3277 StdInitListInitialization, 3278 RequiresZeroInit, ConstructKind, 3279 ParenRange); 3280 } 3281 3282 /// Build a new implicit construction via inherited constructor 3283 /// expression. 3284 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3285 CXXConstructorDecl *Constructor, 3286 bool ConstructsVBase, 3287 bool InheritedFromVBase) { 3288 return new (getSema().Context) CXXInheritedCtorInitExpr( 3289 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3290 } 3291 3292 /// Build a new object-construction expression. 3293 /// 3294 /// By default, performs semantic analysis to build the new expression. 3295 /// Subclasses may override this routine to provide different behavior. 3296 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3297 SourceLocation LParenOrBraceLoc, 3298 MultiExprArg Args, 3299 SourceLocation RParenOrBraceLoc, 3300 bool ListInitialization) { 3301 return getSema().BuildCXXTypeConstructExpr( 3302 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3303 } 3304 3305 /// Build a new object-construction expression. 3306 /// 3307 /// By default, performs semantic analysis to build the new expression. 3308 /// Subclasses may override this routine to provide different behavior. 3309 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3310 SourceLocation LParenLoc, 3311 MultiExprArg Args, 3312 SourceLocation RParenLoc, 3313 bool ListInitialization) { 3314 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3315 RParenLoc, ListInitialization); 3316 } 3317 3318 /// Build a new member reference expression. 3319 /// 3320 /// By default, performs semantic analysis to build the new expression. 3321 /// Subclasses may override this routine to provide different behavior. 3322 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3323 QualType BaseType, 3324 bool IsArrow, 3325 SourceLocation OperatorLoc, 3326 NestedNameSpecifierLoc QualifierLoc, 3327 SourceLocation TemplateKWLoc, 3328 NamedDecl *FirstQualifierInScope, 3329 const DeclarationNameInfo &MemberNameInfo, 3330 const TemplateArgumentListInfo *TemplateArgs) { 3331 CXXScopeSpec SS; 3332 SS.Adopt(QualifierLoc); 3333 3334 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3335 OperatorLoc, IsArrow, 3336 SS, TemplateKWLoc, 3337 FirstQualifierInScope, 3338 MemberNameInfo, 3339 TemplateArgs, /*S*/nullptr); 3340 } 3341 3342 /// Build a new member reference expression. 3343 /// 3344 /// By default, performs semantic analysis to build the new expression. 3345 /// Subclasses may override this routine to provide different behavior. 3346 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3347 SourceLocation OperatorLoc, 3348 bool IsArrow, 3349 NestedNameSpecifierLoc QualifierLoc, 3350 SourceLocation TemplateKWLoc, 3351 NamedDecl *FirstQualifierInScope, 3352 LookupResult &R, 3353 const TemplateArgumentListInfo *TemplateArgs) { 3354 CXXScopeSpec SS; 3355 SS.Adopt(QualifierLoc); 3356 3357 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3358 OperatorLoc, IsArrow, 3359 SS, TemplateKWLoc, 3360 FirstQualifierInScope, 3361 R, TemplateArgs, /*S*/nullptr); 3362 } 3363 3364 /// Build a new noexcept expression. 3365 /// 3366 /// By default, performs semantic analysis to build the new expression. 3367 /// Subclasses may override this routine to provide different behavior. 3368 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3369 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3370 } 3371 3372 /// Build a new expression to compute the length of a parameter pack. 3373 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3374 NamedDecl *Pack, 3375 SourceLocation PackLoc, 3376 SourceLocation RParenLoc, 3377 Optional<unsigned> Length, 3378 ArrayRef<TemplateArgument> PartialArgs) { 3379 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3380 RParenLoc, Length, PartialArgs); 3381 } 3382 3383 /// Build a new expression representing a call to a source location 3384 /// builtin. 3385 /// 3386 /// By default, performs semantic analysis to build the new expression. 3387 /// Subclasses may override this routine to provide different behavior. 3388 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3389 QualType ResultTy, SourceLocation BuiltinLoc, 3390 SourceLocation RPLoc, 3391 DeclContext *ParentContext) { 3392 return getSema().BuildSourceLocExpr(Kind, ResultTy, BuiltinLoc, RPLoc, 3393 ParentContext); 3394 } 3395 3396 /// Build a new Objective-C boxed expression. 3397 /// 3398 /// By default, performs semantic analysis to build the new expression. 3399 /// Subclasses may override this routine to provide different behavior. 3400 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3401 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3402 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3403 TemplateArgumentListInfo *TALI) { 3404 CXXScopeSpec SS; 3405 SS.Adopt(NNS); 3406 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3407 ConceptNameInfo, 3408 FoundDecl, 3409 NamedConcept, TALI); 3410 if (Result.isInvalid()) 3411 return ExprError(); 3412 return Result; 3413 } 3414 3415 /// \brief Build a new requires expression. 3416 /// 3417 /// By default, performs semantic analysis to build the new expression. 3418 /// Subclasses may override this routine to provide different behavior. 3419 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3420 RequiresExprBodyDecl *Body, 3421 ArrayRef<ParmVarDecl *> LocalParameters, 3422 ArrayRef<concepts::Requirement *> Requirements, 3423 SourceLocation ClosingBraceLoc) { 3424 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3425 LocalParameters, Requirements, ClosingBraceLoc); 3426 } 3427 3428 concepts::TypeRequirement * 3429 RebuildTypeRequirement( 3430 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3431 return SemaRef.BuildTypeRequirement(SubstDiag); 3432 } 3433 3434 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3435 return SemaRef.BuildTypeRequirement(T); 3436 } 3437 3438 concepts::ExprRequirement * 3439 RebuildExprRequirement( 3440 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3441 SourceLocation NoexceptLoc, 3442 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3443 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3444 std::move(Ret)); 3445 } 3446 3447 concepts::ExprRequirement * 3448 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3449 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3450 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3451 std::move(Ret)); 3452 } 3453 3454 concepts::NestedRequirement * 3455 RebuildNestedRequirement( 3456 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3457 return SemaRef.BuildNestedRequirement(SubstDiag); 3458 } 3459 3460 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3461 return SemaRef.BuildNestedRequirement(Constraint); 3462 } 3463 3464 /// \brief Build a new Objective-C boxed expression. 3465 /// 3466 /// By default, performs semantic analysis to build the new expression. 3467 /// Subclasses may override this routine to provide different behavior. 3468 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3469 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3470 } 3471 3472 /// Build a new Objective-C array literal. 3473 /// 3474 /// By default, performs semantic analysis to build the new expression. 3475 /// Subclasses may override this routine to provide different behavior. 3476 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3477 Expr **Elements, unsigned NumElements) { 3478 return getSema().BuildObjCArrayLiteral(Range, 3479 MultiExprArg(Elements, NumElements)); 3480 } 3481 3482 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3483 Expr *Base, Expr *Key, 3484 ObjCMethodDecl *getterMethod, 3485 ObjCMethodDecl *setterMethod) { 3486 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3487 getterMethod, setterMethod); 3488 } 3489 3490 /// Build a new Objective-C dictionary literal. 3491 /// 3492 /// By default, performs semantic analysis to build the new expression. 3493 /// Subclasses may override this routine to provide different behavior. 3494 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3495 MutableArrayRef<ObjCDictionaryElement> Elements) { 3496 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3497 } 3498 3499 /// Build a new Objective-C \@encode expression. 3500 /// 3501 /// By default, performs semantic analysis to build the new expression. 3502 /// Subclasses may override this routine to provide different behavior. 3503 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3504 TypeSourceInfo *EncodeTypeInfo, 3505 SourceLocation RParenLoc) { 3506 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3507 } 3508 3509 /// Build a new Objective-C class message. 3510 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3511 Selector Sel, 3512 ArrayRef<SourceLocation> SelectorLocs, 3513 ObjCMethodDecl *Method, 3514 SourceLocation LBracLoc, 3515 MultiExprArg Args, 3516 SourceLocation RBracLoc) { 3517 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3518 ReceiverTypeInfo->getType(), 3519 /*SuperLoc=*/SourceLocation(), 3520 Sel, Method, LBracLoc, SelectorLocs, 3521 RBracLoc, Args); 3522 } 3523 3524 /// Build a new Objective-C instance message. 3525 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3526 Selector Sel, 3527 ArrayRef<SourceLocation> SelectorLocs, 3528 ObjCMethodDecl *Method, 3529 SourceLocation LBracLoc, 3530 MultiExprArg Args, 3531 SourceLocation RBracLoc) { 3532 return SemaRef.BuildInstanceMessage(Receiver, 3533 Receiver->getType(), 3534 /*SuperLoc=*/SourceLocation(), 3535 Sel, Method, LBracLoc, SelectorLocs, 3536 RBracLoc, Args); 3537 } 3538 3539 /// Build a new Objective-C instance/class message to 'super'. 3540 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3541 Selector Sel, 3542 ArrayRef<SourceLocation> SelectorLocs, 3543 QualType SuperType, 3544 ObjCMethodDecl *Method, 3545 SourceLocation LBracLoc, 3546 MultiExprArg Args, 3547 SourceLocation RBracLoc) { 3548 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3549 SuperType, 3550 SuperLoc, 3551 Sel, Method, LBracLoc, SelectorLocs, 3552 RBracLoc, Args) 3553 : SemaRef.BuildClassMessage(nullptr, 3554 SuperType, 3555 SuperLoc, 3556 Sel, Method, LBracLoc, SelectorLocs, 3557 RBracLoc, Args); 3558 3559 3560 } 3561 3562 /// Build a new Objective-C ivar reference expression. 3563 /// 3564 /// By default, performs semantic analysis to build the new expression. 3565 /// Subclasses may override this routine to provide different behavior. 3566 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3567 SourceLocation IvarLoc, 3568 bool IsArrow, bool IsFreeIvar) { 3569 CXXScopeSpec SS; 3570 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3571 ExprResult Result = getSema().BuildMemberReferenceExpr( 3572 BaseArg, BaseArg->getType(), 3573 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3574 /*FirstQualifierInScope=*/nullptr, NameInfo, 3575 /*TemplateArgs=*/nullptr, 3576 /*S=*/nullptr); 3577 if (IsFreeIvar && Result.isUsable()) 3578 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3579 return Result; 3580 } 3581 3582 /// Build a new Objective-C property reference expression. 3583 /// 3584 /// By default, performs semantic analysis to build the new expression. 3585 /// Subclasses may override this routine to provide different behavior. 3586 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3587 ObjCPropertyDecl *Property, 3588 SourceLocation PropertyLoc) { 3589 CXXScopeSpec SS; 3590 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3591 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3592 /*FIXME:*/PropertyLoc, 3593 /*IsArrow=*/false, 3594 SS, SourceLocation(), 3595 /*FirstQualifierInScope=*/nullptr, 3596 NameInfo, 3597 /*TemplateArgs=*/nullptr, 3598 /*S=*/nullptr); 3599 } 3600 3601 /// Build a new Objective-C property reference expression. 3602 /// 3603 /// By default, performs semantic analysis to build the new expression. 3604 /// Subclasses may override this routine to provide different behavior. 3605 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3606 ObjCMethodDecl *Getter, 3607 ObjCMethodDecl *Setter, 3608 SourceLocation PropertyLoc) { 3609 // Since these expressions can only be value-dependent, we do not 3610 // need to perform semantic analysis again. 3611 return Owned( 3612 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3613 VK_LValue, OK_ObjCProperty, 3614 PropertyLoc, Base)); 3615 } 3616 3617 /// Build a new Objective-C "isa" expression. 3618 /// 3619 /// By default, performs semantic analysis to build the new expression. 3620 /// Subclasses may override this routine to provide different behavior. 3621 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3622 SourceLocation OpLoc, bool IsArrow) { 3623 CXXScopeSpec SS; 3624 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3625 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3626 OpLoc, IsArrow, 3627 SS, SourceLocation(), 3628 /*FirstQualifierInScope=*/nullptr, 3629 NameInfo, 3630 /*TemplateArgs=*/nullptr, 3631 /*S=*/nullptr); 3632 } 3633 3634 /// Build a new shuffle vector expression. 3635 /// 3636 /// By default, performs semantic analysis to build the new expression. 3637 /// Subclasses may override this routine to provide different behavior. 3638 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3639 MultiExprArg SubExprs, 3640 SourceLocation RParenLoc) { 3641 // Find the declaration for __builtin_shufflevector 3642 const IdentifierInfo &Name 3643 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3644 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3645 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3646 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3647 3648 // Build a reference to the __builtin_shufflevector builtin 3649 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3650 Expr *Callee = new (SemaRef.Context) 3651 DeclRefExpr(SemaRef.Context, Builtin, false, 3652 SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc); 3653 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3654 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3655 CK_BuiltinFnToFnPtr).get(); 3656 3657 // Build the CallExpr 3658 ExprResult TheCall = CallExpr::Create( 3659 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3660 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3661 FPOptionsOverride()); 3662 3663 // Type-check the __builtin_shufflevector expression. 3664 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3665 } 3666 3667 /// Build a new convert vector expression. 3668 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3669 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3670 SourceLocation RParenLoc) { 3671 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3672 BuiltinLoc, RParenLoc); 3673 } 3674 3675 /// Build a new template argument pack expansion. 3676 /// 3677 /// By default, performs semantic analysis to build a new pack expansion 3678 /// for a template argument. Subclasses may override this routine to provide 3679 /// different behavior. 3680 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3681 SourceLocation EllipsisLoc, 3682 Optional<unsigned> NumExpansions) { 3683 switch (Pattern.getArgument().getKind()) { 3684 case TemplateArgument::Expression: { 3685 ExprResult Result 3686 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3687 EllipsisLoc, NumExpansions); 3688 if (Result.isInvalid()) 3689 return TemplateArgumentLoc(); 3690 3691 return TemplateArgumentLoc(Result.get(), Result.get()); 3692 } 3693 3694 case TemplateArgument::Template: 3695 return TemplateArgumentLoc( 3696 SemaRef.Context, 3697 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3698 NumExpansions), 3699 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3700 EllipsisLoc); 3701 3702 case TemplateArgument::Null: 3703 case TemplateArgument::Integral: 3704 case TemplateArgument::Declaration: 3705 case TemplateArgument::Pack: 3706 case TemplateArgument::TemplateExpansion: 3707 case TemplateArgument::NullPtr: 3708 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3709 3710 case TemplateArgument::Type: 3711 if (TypeSourceInfo *Expansion 3712 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3713 EllipsisLoc, 3714 NumExpansions)) 3715 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3716 Expansion); 3717 break; 3718 } 3719 3720 return TemplateArgumentLoc(); 3721 } 3722 3723 /// Build a new expression pack expansion. 3724 /// 3725 /// By default, performs semantic analysis to build a new pack expansion 3726 /// for an expression. Subclasses may override this routine to provide 3727 /// different behavior. 3728 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3729 Optional<unsigned> NumExpansions) { 3730 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3731 } 3732 3733 /// Build a new C++1z fold-expression. 3734 /// 3735 /// By default, performs semantic analysis in order to build a new fold 3736 /// expression. 3737 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3738 SourceLocation LParenLoc, Expr *LHS, 3739 BinaryOperatorKind Operator, 3740 SourceLocation EllipsisLoc, Expr *RHS, 3741 SourceLocation RParenLoc, 3742 Optional<unsigned> NumExpansions) { 3743 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3744 EllipsisLoc, RHS, RParenLoc, 3745 NumExpansions); 3746 } 3747 3748 /// Build an empty C++1z fold-expression with the given operator. 3749 /// 3750 /// By default, produces the fallback value for the fold-expression, or 3751 /// produce an error if there is no fallback value. 3752 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3753 BinaryOperatorKind Operator) { 3754 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3755 } 3756 3757 /// Build a new atomic operation expression. 3758 /// 3759 /// By default, performs semantic analysis to build the new expression. 3760 /// Subclasses may override this routine to provide different behavior. 3761 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3762 AtomicExpr::AtomicOp Op, 3763 SourceLocation RParenLoc) { 3764 // Use this for all of the locations, since we don't know the difference 3765 // between the call and the expr at this point. 3766 SourceRange Range{BuiltinLoc, RParenLoc}; 3767 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3768 Sema::AtomicArgumentOrder::AST); 3769 } 3770 3771 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3772 ArrayRef<Expr *> SubExprs, QualType Type) { 3773 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3774 } 3775 3776 private: 3777 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3778 QualType ObjectType, 3779 NamedDecl *FirstQualifierInScope, 3780 CXXScopeSpec &SS); 3781 3782 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3783 QualType ObjectType, 3784 NamedDecl *FirstQualifierInScope, 3785 CXXScopeSpec &SS); 3786 3787 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3788 NamedDecl *FirstQualifierInScope, 3789 CXXScopeSpec &SS); 3790 3791 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3792 DependentNameTypeLoc TL, 3793 bool DeducibleTSTContext); 3794 }; 3795 3796 template <typename Derived> 3797 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3798 if (!S) 3799 return S; 3800 3801 switch (S->getStmtClass()) { 3802 case Stmt::NoStmtClass: break; 3803 3804 // Transform individual statement nodes 3805 // Pass SDK into statements that can produce a value 3806 #define STMT(Node, Parent) \ 3807 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3808 #define VALUESTMT(Node, Parent) \ 3809 case Stmt::Node##Class: \ 3810 return getDerived().Transform##Node(cast<Node>(S), SDK); 3811 #define ABSTRACT_STMT(Node) 3812 #define EXPR(Node, Parent) 3813 #include "clang/AST/StmtNodes.inc" 3814 3815 // Transform expressions by calling TransformExpr. 3816 #define STMT(Node, Parent) 3817 #define ABSTRACT_STMT(Stmt) 3818 #define EXPR(Node, Parent) case Stmt::Node##Class: 3819 #include "clang/AST/StmtNodes.inc" 3820 { 3821 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3822 3823 if (SDK == SDK_StmtExprResult) 3824 E = getSema().ActOnStmtExprResult(E); 3825 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3826 } 3827 } 3828 3829 return S; 3830 } 3831 3832 template<typename Derived> 3833 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3834 if (!S) 3835 return S; 3836 3837 switch (S->getClauseKind()) { 3838 default: break; 3839 // Transform individual clause nodes 3840 #define GEN_CLANG_CLAUSE_CLASS 3841 #define CLAUSE_CLASS(Enum, Str, Class) \ 3842 case Enum: \ 3843 return getDerived().Transform##Class(cast<Class>(S)); 3844 #include "llvm/Frontend/OpenMP/OMP.inc" 3845 } 3846 3847 return S; 3848 } 3849 3850 3851 template<typename Derived> 3852 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3853 if (!E) 3854 return E; 3855 3856 switch (E->getStmtClass()) { 3857 case Stmt::NoStmtClass: break; 3858 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3859 #define ABSTRACT_STMT(Stmt) 3860 #define EXPR(Node, Parent) \ 3861 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3862 #include "clang/AST/StmtNodes.inc" 3863 } 3864 3865 return E; 3866 } 3867 3868 template<typename Derived> 3869 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3870 bool NotCopyInit) { 3871 // Initializers are instantiated like expressions, except that various outer 3872 // layers are stripped. 3873 if (!Init) 3874 return Init; 3875 3876 if (auto *FE = dyn_cast<FullExpr>(Init)) 3877 Init = FE->getSubExpr(); 3878 3879 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) { 3880 OpaqueValueExpr *OVE = AIL->getCommonExpr(); 3881 Init = OVE->getSourceExpr(); 3882 } 3883 3884 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3885 Init = MTE->getSubExpr(); 3886 3887 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3888 Init = Binder->getSubExpr(); 3889 3890 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3891 Init = ICE->getSubExprAsWritten(); 3892 3893 if (CXXStdInitializerListExpr *ILE = 3894 dyn_cast<CXXStdInitializerListExpr>(Init)) 3895 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3896 3897 // If this is copy-initialization, we only need to reconstruct 3898 // InitListExprs. Other forms of copy-initialization will be a no-op if 3899 // the initializer is already the right type. 3900 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3901 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3902 return getDerived().TransformExpr(Init); 3903 3904 // Revert value-initialization back to empty parens. 3905 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3906 SourceRange Parens = VIE->getSourceRange(); 3907 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3908 Parens.getEnd()); 3909 } 3910 3911 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3912 if (isa<ImplicitValueInitExpr>(Init)) 3913 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3914 SourceLocation()); 3915 3916 // Revert initialization by constructor back to a parenthesized or braced list 3917 // of expressions. Any other form of initializer can just be reused directly. 3918 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3919 return getDerived().TransformExpr(Init); 3920 3921 // If the initialization implicitly converted an initializer list to a 3922 // std::initializer_list object, unwrap the std::initializer_list too. 3923 if (Construct && Construct->isStdInitListInitialization()) 3924 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3925 3926 // Enter a list-init context if this was list initialization. 3927 EnterExpressionEvaluationContext Context( 3928 getSema(), EnterExpressionEvaluationContext::InitList, 3929 Construct->isListInitialization()); 3930 3931 SmallVector<Expr*, 8> NewArgs; 3932 bool ArgChanged = false; 3933 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3934 /*IsCall*/true, NewArgs, &ArgChanged)) 3935 return ExprError(); 3936 3937 // If this was list initialization, revert to syntactic list form. 3938 if (Construct->isListInitialization()) 3939 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3940 Construct->getEndLoc()); 3941 3942 // Build a ParenListExpr to represent anything else. 3943 SourceRange Parens = Construct->getParenOrBraceRange(); 3944 if (Parens.isInvalid()) { 3945 // This was a variable declaration's initialization for which no initializer 3946 // was specified. 3947 assert(NewArgs.empty() && 3948 "no parens or braces but have direct init with arguments?"); 3949 return ExprEmpty(); 3950 } 3951 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3952 Parens.getEnd()); 3953 } 3954 3955 template<typename Derived> 3956 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3957 unsigned NumInputs, 3958 bool IsCall, 3959 SmallVectorImpl<Expr *> &Outputs, 3960 bool *ArgChanged) { 3961 for (unsigned I = 0; I != NumInputs; ++I) { 3962 // If requested, drop call arguments that need to be dropped. 3963 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3964 if (ArgChanged) 3965 *ArgChanged = true; 3966 3967 break; 3968 } 3969 3970 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3971 Expr *Pattern = Expansion->getPattern(); 3972 3973 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3974 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3975 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3976 3977 // Determine whether the set of unexpanded parameter packs can and should 3978 // be expanded. 3979 bool Expand = true; 3980 bool RetainExpansion = false; 3981 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3982 Optional<unsigned> NumExpansions = OrigNumExpansions; 3983 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3984 Pattern->getSourceRange(), 3985 Unexpanded, 3986 Expand, RetainExpansion, 3987 NumExpansions)) 3988 return true; 3989 3990 if (!Expand) { 3991 // The transform has determined that we should perform a simple 3992 // transformation on the pack expansion, producing another pack 3993 // expansion. 3994 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3995 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3996 if (OutPattern.isInvalid()) 3997 return true; 3998 3999 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 4000 Expansion->getEllipsisLoc(), 4001 NumExpansions); 4002 if (Out.isInvalid()) 4003 return true; 4004 4005 if (ArgChanged) 4006 *ArgChanged = true; 4007 Outputs.push_back(Out.get()); 4008 continue; 4009 } 4010 4011 // Record right away that the argument was changed. This needs 4012 // to happen even if the array expands to nothing. 4013 if (ArgChanged) *ArgChanged = true; 4014 4015 // The transform has determined that we should perform an elementwise 4016 // expansion of the pattern. Do so. 4017 for (unsigned I = 0; I != *NumExpansions; ++I) { 4018 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4019 ExprResult Out = getDerived().TransformExpr(Pattern); 4020 if (Out.isInvalid()) 4021 return true; 4022 4023 if (Out.get()->containsUnexpandedParameterPack()) { 4024 Out = getDerived().RebuildPackExpansion( 4025 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4026 if (Out.isInvalid()) 4027 return true; 4028 } 4029 4030 Outputs.push_back(Out.get()); 4031 } 4032 4033 // If we're supposed to retain a pack expansion, do so by temporarily 4034 // forgetting the partially-substituted parameter pack. 4035 if (RetainExpansion) { 4036 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4037 4038 ExprResult Out = getDerived().TransformExpr(Pattern); 4039 if (Out.isInvalid()) 4040 return true; 4041 4042 Out = getDerived().RebuildPackExpansion( 4043 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 4044 if (Out.isInvalid()) 4045 return true; 4046 4047 Outputs.push_back(Out.get()); 4048 } 4049 4050 continue; 4051 } 4052 4053 ExprResult Result = 4054 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 4055 : getDerived().TransformExpr(Inputs[I]); 4056 if (Result.isInvalid()) 4057 return true; 4058 4059 if (Result.get() != Inputs[I] && ArgChanged) 4060 *ArgChanged = true; 4061 4062 Outputs.push_back(Result.get()); 4063 } 4064 4065 return false; 4066 } 4067 4068 template <typename Derived> 4069 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 4070 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 4071 if (Var) { 4072 VarDecl *ConditionVar = cast_or_null<VarDecl>( 4073 getDerived().TransformDefinition(Var->getLocation(), Var)); 4074 4075 if (!ConditionVar) 4076 return Sema::ConditionError(); 4077 4078 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 4079 } 4080 4081 if (Expr) { 4082 ExprResult CondExpr = getDerived().TransformExpr(Expr); 4083 4084 if (CondExpr.isInvalid()) 4085 return Sema::ConditionError(); 4086 4087 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind, 4088 /*MissingOK=*/true); 4089 } 4090 4091 return Sema::ConditionResult(); 4092 } 4093 4094 template <typename Derived> 4095 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 4096 NestedNameSpecifierLoc NNS, QualType ObjectType, 4097 NamedDecl *FirstQualifierInScope) { 4098 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 4099 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 4100 Qualifier = Qualifier.getPrefix()) 4101 Qualifiers.push_back(Qualifier); 4102 4103 CXXScopeSpec SS; 4104 while (!Qualifiers.empty()) { 4105 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 4106 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 4107 4108 switch (QNNS->getKind()) { 4109 case NestedNameSpecifier::Identifier: { 4110 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 4111 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), 4112 ObjectType); 4113 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 4114 SS, FirstQualifierInScope, false)) 4115 return NestedNameSpecifierLoc(); 4116 break; 4117 } 4118 4119 case NestedNameSpecifier::Namespace: { 4120 NamespaceDecl *NS = 4121 cast_or_null<NamespaceDecl>(getDerived().TransformDecl( 4122 Q.getLocalBeginLoc(), QNNS->getAsNamespace())); 4123 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 4124 break; 4125 } 4126 4127 case NestedNameSpecifier::NamespaceAlias: { 4128 NamespaceAliasDecl *Alias = 4129 cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl( 4130 Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias())); 4131 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 4132 Q.getLocalEndLoc()); 4133 break; 4134 } 4135 4136 case NestedNameSpecifier::Global: 4137 // There is no meaningful transformation that one could perform on the 4138 // global scope. 4139 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 4140 break; 4141 4142 case NestedNameSpecifier::Super: { 4143 CXXRecordDecl *RD = 4144 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 4145 SourceLocation(), QNNS->getAsRecordDecl())); 4146 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4147 break; 4148 } 4149 4150 case NestedNameSpecifier::TypeSpecWithTemplate: 4151 case NestedNameSpecifier::TypeSpec: { 4152 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4153 FirstQualifierInScope, SS); 4154 4155 if (!TL) 4156 return NestedNameSpecifierLoc(); 4157 4158 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4159 (SemaRef.getLangOpts().CPlusPlus11 && 4160 TL.getType()->isEnumeralType())) { 4161 assert(!TL.getType().hasLocalQualifiers() && 4162 "Can't get cv-qualifiers here"); 4163 if (TL.getType()->isEnumeralType()) 4164 SemaRef.Diag(TL.getBeginLoc(), 4165 diag::warn_cxx98_compat_enum_nested_name_spec); 4166 SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL, 4167 Q.getLocalEndLoc()); 4168 break; 4169 } 4170 // If the nested-name-specifier is an invalid type def, don't emit an 4171 // error because a previous error should have already been emitted. 4172 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4173 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4174 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4175 << TL.getType() << SS.getRange(); 4176 } 4177 return NestedNameSpecifierLoc(); 4178 } 4179 } 4180 4181 // The qualifier-in-scope and object type only apply to the leftmost entity. 4182 FirstQualifierInScope = nullptr; 4183 ObjectType = QualType(); 4184 } 4185 4186 // Don't rebuild the nested-name-specifier if we don't have to. 4187 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4188 !getDerived().AlwaysRebuild()) 4189 return NNS; 4190 4191 // If we can re-use the source-location data from the original 4192 // nested-name-specifier, do so. 4193 if (SS.location_size() == NNS.getDataLength() && 4194 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4195 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4196 4197 // Allocate new nested-name-specifier location information. 4198 return SS.getWithLocInContext(SemaRef.Context); 4199 } 4200 4201 template<typename Derived> 4202 DeclarationNameInfo 4203 TreeTransform<Derived> 4204 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4205 DeclarationName Name = NameInfo.getName(); 4206 if (!Name) 4207 return DeclarationNameInfo(); 4208 4209 switch (Name.getNameKind()) { 4210 case DeclarationName::Identifier: 4211 case DeclarationName::ObjCZeroArgSelector: 4212 case DeclarationName::ObjCOneArgSelector: 4213 case DeclarationName::ObjCMultiArgSelector: 4214 case DeclarationName::CXXOperatorName: 4215 case DeclarationName::CXXLiteralOperatorName: 4216 case DeclarationName::CXXUsingDirective: 4217 return NameInfo; 4218 4219 case DeclarationName::CXXDeductionGuideName: { 4220 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4221 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4222 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4223 if (!NewTemplate) 4224 return DeclarationNameInfo(); 4225 4226 DeclarationNameInfo NewNameInfo(NameInfo); 4227 NewNameInfo.setName( 4228 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4229 return NewNameInfo; 4230 } 4231 4232 case DeclarationName::CXXConstructorName: 4233 case DeclarationName::CXXDestructorName: 4234 case DeclarationName::CXXConversionFunctionName: { 4235 TypeSourceInfo *NewTInfo; 4236 CanQualType NewCanTy; 4237 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4238 NewTInfo = getDerived().TransformType(OldTInfo); 4239 if (!NewTInfo) 4240 return DeclarationNameInfo(); 4241 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4242 } 4243 else { 4244 NewTInfo = nullptr; 4245 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4246 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4247 if (NewT.isNull()) 4248 return DeclarationNameInfo(); 4249 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4250 } 4251 4252 DeclarationName NewName 4253 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4254 NewCanTy); 4255 DeclarationNameInfo NewNameInfo(NameInfo); 4256 NewNameInfo.setName(NewName); 4257 NewNameInfo.setNamedTypeInfo(NewTInfo); 4258 return NewNameInfo; 4259 } 4260 } 4261 4262 llvm_unreachable("Unknown name kind."); 4263 } 4264 4265 template<typename Derived> 4266 TemplateName 4267 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4268 TemplateName Name, 4269 SourceLocation NameLoc, 4270 QualType ObjectType, 4271 NamedDecl *FirstQualifierInScope, 4272 bool AllowInjectedClassName) { 4273 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4274 TemplateDecl *Template = QTN->getTemplateDecl(); 4275 assert(Template && "qualified template name must refer to a template"); 4276 4277 TemplateDecl *TransTemplate 4278 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4279 Template)); 4280 if (!TransTemplate) 4281 return TemplateName(); 4282 4283 if (!getDerived().AlwaysRebuild() && 4284 SS.getScopeRep() == QTN->getQualifier() && 4285 TransTemplate == Template) 4286 return Name; 4287 4288 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4289 TransTemplate); 4290 } 4291 4292 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4293 if (SS.getScopeRep()) { 4294 // These apply to the scope specifier, not the template. 4295 ObjectType = QualType(); 4296 FirstQualifierInScope = nullptr; 4297 } 4298 4299 if (!getDerived().AlwaysRebuild() && 4300 SS.getScopeRep() == DTN->getQualifier() && 4301 ObjectType.isNull()) 4302 return Name; 4303 4304 // FIXME: Preserve the location of the "template" keyword. 4305 SourceLocation TemplateKWLoc = NameLoc; 4306 4307 if (DTN->isIdentifier()) { 4308 return getDerived().RebuildTemplateName(SS, 4309 TemplateKWLoc, 4310 *DTN->getIdentifier(), 4311 NameLoc, 4312 ObjectType, 4313 FirstQualifierInScope, 4314 AllowInjectedClassName); 4315 } 4316 4317 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4318 DTN->getOperator(), NameLoc, 4319 ObjectType, AllowInjectedClassName); 4320 } 4321 4322 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4323 TemplateDecl *TransTemplate 4324 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4325 Template)); 4326 if (!TransTemplate) 4327 return TemplateName(); 4328 4329 if (!getDerived().AlwaysRebuild() && 4330 TransTemplate == Template) 4331 return Name; 4332 4333 return TemplateName(TransTemplate); 4334 } 4335 4336 if (SubstTemplateTemplateParmPackStorage *SubstPack 4337 = Name.getAsSubstTemplateTemplateParmPack()) { 4338 TemplateTemplateParmDecl *TransParam 4339 = cast_or_null<TemplateTemplateParmDecl>( 4340 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4341 if (!TransParam) 4342 return TemplateName(); 4343 4344 if (!getDerived().AlwaysRebuild() && 4345 TransParam == SubstPack->getParameterPack()) 4346 return Name; 4347 4348 return getDerived().RebuildTemplateName(TransParam, 4349 SubstPack->getArgumentPack()); 4350 } 4351 4352 // These should be getting filtered out before they reach the AST. 4353 llvm_unreachable("overloaded function decl survived to here"); 4354 } 4355 4356 template<typename Derived> 4357 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4358 const TemplateArgument &Arg, 4359 TemplateArgumentLoc &Output) { 4360 Output = getSema().getTrivialTemplateArgumentLoc( 4361 Arg, QualType(), getDerived().getBaseLocation()); 4362 } 4363 4364 template <typename Derived> 4365 bool TreeTransform<Derived>::TransformTemplateArgument( 4366 const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output, 4367 bool Uneval) { 4368 const TemplateArgument &Arg = Input.getArgument(); 4369 switch (Arg.getKind()) { 4370 case TemplateArgument::Null: 4371 case TemplateArgument::Pack: 4372 llvm_unreachable("Unexpected TemplateArgument"); 4373 4374 case TemplateArgument::Integral: 4375 case TemplateArgument::NullPtr: 4376 case TemplateArgument::Declaration: { 4377 // Transform a resolved template argument straight to a resolved template 4378 // argument. We get here when substituting into an already-substituted 4379 // template type argument during concept satisfaction checking. 4380 QualType T = Arg.getNonTypeTemplateArgumentType(); 4381 QualType NewT = getDerived().TransformType(T); 4382 if (NewT.isNull()) 4383 return true; 4384 4385 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4386 ? Arg.getAsDecl() 4387 : nullptr; 4388 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4389 getDerived().getBaseLocation(), D)) 4390 : nullptr; 4391 if (D && !NewD) 4392 return true; 4393 4394 if (NewT == T && D == NewD) 4395 Output = Input; 4396 else if (Arg.getKind() == TemplateArgument::Integral) 4397 Output = TemplateArgumentLoc( 4398 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4399 TemplateArgumentLocInfo()); 4400 else if (Arg.getKind() == TemplateArgument::NullPtr) 4401 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4402 TemplateArgumentLocInfo()); 4403 else 4404 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4405 TemplateArgumentLocInfo()); 4406 4407 return false; 4408 } 4409 4410 case TemplateArgument::Type: { 4411 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4412 if (!DI) 4413 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4414 4415 DI = getDerived().TransformType(DI); 4416 if (!DI) 4417 return true; 4418 4419 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4420 return false; 4421 } 4422 4423 case TemplateArgument::Template: { 4424 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4425 if (QualifierLoc) { 4426 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4427 if (!QualifierLoc) 4428 return true; 4429 } 4430 4431 CXXScopeSpec SS; 4432 SS.Adopt(QualifierLoc); 4433 TemplateName Template = getDerived().TransformTemplateName( 4434 SS, Arg.getAsTemplate(), Input.getTemplateNameLoc()); 4435 if (Template.isNull()) 4436 return true; 4437 4438 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4439 QualifierLoc, Input.getTemplateNameLoc()); 4440 return false; 4441 } 4442 4443 case TemplateArgument::TemplateExpansion: 4444 llvm_unreachable("Caller should expand pack expansions"); 4445 4446 case TemplateArgument::Expression: { 4447 // Template argument expressions are constant expressions. 4448 EnterExpressionEvaluationContext Unevaluated( 4449 getSema(), 4450 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4451 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4452 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4453 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4454 4455 Expr *InputExpr = Input.getSourceExpression(); 4456 if (!InputExpr) 4457 InputExpr = Input.getArgument().getAsExpr(); 4458 4459 ExprResult E = getDerived().TransformExpr(InputExpr); 4460 E = SemaRef.ActOnConstantExpression(E); 4461 if (E.isInvalid()) 4462 return true; 4463 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4464 return false; 4465 } 4466 } 4467 4468 // Work around bogus GCC warning 4469 return true; 4470 } 4471 4472 /// Iterator adaptor that invents template argument location information 4473 /// for each of the template arguments in its underlying iterator. 4474 template<typename Derived, typename InputIterator> 4475 class TemplateArgumentLocInventIterator { 4476 TreeTransform<Derived> &Self; 4477 InputIterator Iter; 4478 4479 public: 4480 typedef TemplateArgumentLoc value_type; 4481 typedef TemplateArgumentLoc reference; 4482 typedef typename std::iterator_traits<InputIterator>::difference_type 4483 difference_type; 4484 typedef std::input_iterator_tag iterator_category; 4485 4486 class pointer { 4487 TemplateArgumentLoc Arg; 4488 4489 public: 4490 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4491 4492 const TemplateArgumentLoc *operator->() const { return &Arg; } 4493 }; 4494 4495 TemplateArgumentLocInventIterator() { } 4496 4497 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4498 InputIterator Iter) 4499 : Self(Self), Iter(Iter) { } 4500 4501 TemplateArgumentLocInventIterator &operator++() { 4502 ++Iter; 4503 return *this; 4504 } 4505 4506 TemplateArgumentLocInventIterator operator++(int) { 4507 TemplateArgumentLocInventIterator Old(*this); 4508 ++(*this); 4509 return Old; 4510 } 4511 4512 reference operator*() const { 4513 TemplateArgumentLoc Result; 4514 Self.InventTemplateArgumentLoc(*Iter, Result); 4515 return Result; 4516 } 4517 4518 pointer operator->() const { return pointer(**this); } 4519 4520 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4521 const TemplateArgumentLocInventIterator &Y) { 4522 return X.Iter == Y.Iter; 4523 } 4524 4525 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4526 const TemplateArgumentLocInventIterator &Y) { 4527 return X.Iter != Y.Iter; 4528 } 4529 }; 4530 4531 template<typename Derived> 4532 template<typename InputIterator> 4533 bool TreeTransform<Derived>::TransformTemplateArguments( 4534 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4535 bool Uneval) { 4536 for (; First != Last; ++First) { 4537 TemplateArgumentLoc Out; 4538 TemplateArgumentLoc In = *First; 4539 4540 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4541 // Unpack argument packs, which we translate them into separate 4542 // arguments. 4543 // FIXME: We could do much better if we could guarantee that the 4544 // TemplateArgumentLocInfo for the pack expansion would be usable for 4545 // all of the template arguments in the argument pack. 4546 typedef TemplateArgumentLocInventIterator<Derived, 4547 TemplateArgument::pack_iterator> 4548 PackLocIterator; 4549 if (TransformTemplateArguments(PackLocIterator(*this, 4550 In.getArgument().pack_begin()), 4551 PackLocIterator(*this, 4552 In.getArgument().pack_end()), 4553 Outputs, Uneval)) 4554 return true; 4555 4556 continue; 4557 } 4558 4559 if (In.getArgument().isPackExpansion()) { 4560 // We have a pack expansion, for which we will be substituting into 4561 // the pattern. 4562 SourceLocation Ellipsis; 4563 Optional<unsigned> OrigNumExpansions; 4564 TemplateArgumentLoc Pattern 4565 = getSema().getTemplateArgumentPackExpansionPattern( 4566 In, Ellipsis, OrigNumExpansions); 4567 4568 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4569 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4570 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4571 4572 // Determine whether the set of unexpanded parameter packs can and should 4573 // be expanded. 4574 bool Expand = true; 4575 bool RetainExpansion = false; 4576 Optional<unsigned> NumExpansions = OrigNumExpansions; 4577 if (getDerived().TryExpandParameterPacks(Ellipsis, 4578 Pattern.getSourceRange(), 4579 Unexpanded, 4580 Expand, 4581 RetainExpansion, 4582 NumExpansions)) 4583 return true; 4584 4585 if (!Expand) { 4586 // The transform has determined that we should perform a simple 4587 // transformation on the pack expansion, producing another pack 4588 // expansion. 4589 TemplateArgumentLoc OutPattern; 4590 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4591 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4592 return true; 4593 4594 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4595 NumExpansions); 4596 if (Out.getArgument().isNull()) 4597 return true; 4598 4599 Outputs.addArgument(Out); 4600 continue; 4601 } 4602 4603 // The transform has determined that we should perform an elementwise 4604 // expansion of the pattern. Do so. 4605 for (unsigned I = 0; I != *NumExpansions; ++I) { 4606 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4607 4608 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4609 return true; 4610 4611 if (Out.getArgument().containsUnexpandedParameterPack()) { 4612 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4613 OrigNumExpansions); 4614 if (Out.getArgument().isNull()) 4615 return true; 4616 } 4617 4618 Outputs.addArgument(Out); 4619 } 4620 4621 // If we're supposed to retain a pack expansion, do so by temporarily 4622 // forgetting the partially-substituted parameter pack. 4623 if (RetainExpansion) { 4624 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4625 4626 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4627 return true; 4628 4629 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4630 OrigNumExpansions); 4631 if (Out.getArgument().isNull()) 4632 return true; 4633 4634 Outputs.addArgument(Out); 4635 } 4636 4637 continue; 4638 } 4639 4640 // The simple case: 4641 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4642 return true; 4643 4644 Outputs.addArgument(Out); 4645 } 4646 4647 return false; 4648 4649 } 4650 4651 //===----------------------------------------------------------------------===// 4652 // Type transformation 4653 //===----------------------------------------------------------------------===// 4654 4655 template<typename Derived> 4656 QualType TreeTransform<Derived>::TransformType(QualType T) { 4657 if (getDerived().AlreadyTransformed(T)) 4658 return T; 4659 4660 // Temporary workaround. All of these transformations should 4661 // eventually turn into transformations on TypeLocs. 4662 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4663 getDerived().getBaseLocation()); 4664 4665 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4666 4667 if (!NewDI) 4668 return QualType(); 4669 4670 return NewDI->getType(); 4671 } 4672 4673 template<typename Derived> 4674 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4675 // Refine the base location to the type's location. 4676 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4677 getDerived().getBaseEntity()); 4678 if (getDerived().AlreadyTransformed(DI->getType())) 4679 return DI; 4680 4681 TypeLocBuilder TLB; 4682 4683 TypeLoc TL = DI->getTypeLoc(); 4684 TLB.reserve(TL.getFullDataSize()); 4685 4686 QualType Result = getDerived().TransformType(TLB, TL); 4687 if (Result.isNull()) 4688 return nullptr; 4689 4690 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4691 } 4692 4693 template<typename Derived> 4694 QualType 4695 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4696 switch (T.getTypeLocClass()) { 4697 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4698 #define TYPELOC(CLASS, PARENT) \ 4699 case TypeLoc::CLASS: \ 4700 return getDerived().Transform##CLASS##Type(TLB, \ 4701 T.castAs<CLASS##TypeLoc>()); 4702 #include "clang/AST/TypeLocNodes.def" 4703 } 4704 4705 llvm_unreachable("unhandled type loc!"); 4706 } 4707 4708 template<typename Derived> 4709 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4710 if (!isa<DependentNameType>(T)) 4711 return TransformType(T); 4712 4713 if (getDerived().AlreadyTransformed(T)) 4714 return T; 4715 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4716 getDerived().getBaseLocation()); 4717 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4718 return NewDI ? NewDI->getType() : QualType(); 4719 } 4720 4721 template<typename Derived> 4722 TypeSourceInfo * 4723 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4724 if (!isa<DependentNameType>(DI->getType())) 4725 return TransformType(DI); 4726 4727 // Refine the base location to the type's location. 4728 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4729 getDerived().getBaseEntity()); 4730 if (getDerived().AlreadyTransformed(DI->getType())) 4731 return DI; 4732 4733 TypeLocBuilder TLB; 4734 4735 TypeLoc TL = DI->getTypeLoc(); 4736 TLB.reserve(TL.getFullDataSize()); 4737 4738 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4739 if (QTL) 4740 TL = QTL.getUnqualifiedLoc(); 4741 4742 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4743 4744 QualType Result = getDerived().TransformDependentNameType( 4745 TLB, DNTL, /*DeducedTSTContext*/true); 4746 if (Result.isNull()) 4747 return nullptr; 4748 4749 if (QTL) { 4750 Result = getDerived().RebuildQualifiedType(Result, QTL); 4751 if (Result.isNull()) 4752 return nullptr; 4753 TLB.TypeWasModifiedSafely(Result); 4754 } 4755 4756 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4757 } 4758 4759 template<typename Derived> 4760 QualType 4761 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4762 QualifiedTypeLoc T) { 4763 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4764 if (Result.isNull()) 4765 return QualType(); 4766 4767 Result = getDerived().RebuildQualifiedType(Result, T); 4768 4769 if (Result.isNull()) 4770 return QualType(); 4771 4772 // RebuildQualifiedType might have updated the type, but not in a way 4773 // that invalidates the TypeLoc. (There's no location information for 4774 // qualifiers.) 4775 TLB.TypeWasModifiedSafely(Result); 4776 4777 return Result; 4778 } 4779 4780 template <typename Derived> 4781 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4782 QualifiedTypeLoc TL) { 4783 4784 SourceLocation Loc = TL.getBeginLoc(); 4785 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4786 4787 if ((T.getAddressSpace() != LangAS::Default && 4788 Quals.getAddressSpace() != LangAS::Default) && 4789 T.getAddressSpace() != Quals.getAddressSpace()) { 4790 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4791 << TL.getType() << T; 4792 return QualType(); 4793 } 4794 4795 // C++ [dcl.fct]p7: 4796 // [When] adding cv-qualifications on top of the function type [...] the 4797 // cv-qualifiers are ignored. 4798 if (T->isFunctionType()) { 4799 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4800 Quals.getAddressSpace()); 4801 return T; 4802 } 4803 4804 // C++ [dcl.ref]p1: 4805 // when the cv-qualifiers are introduced through the use of a typedef-name 4806 // or decltype-specifier [...] the cv-qualifiers are ignored. 4807 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4808 // applied to a reference type. 4809 if (T->isReferenceType()) { 4810 // The only qualifier that applies to a reference type is restrict. 4811 if (!Quals.hasRestrict()) 4812 return T; 4813 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4814 } 4815 4816 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4817 // resulting type. 4818 if (Quals.hasObjCLifetime()) { 4819 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4820 Quals.removeObjCLifetime(); 4821 else if (T.getObjCLifetime()) { 4822 // Objective-C ARC: 4823 // A lifetime qualifier applied to a substituted template parameter 4824 // overrides the lifetime qualifier from the template argument. 4825 const AutoType *AutoTy; 4826 if (const SubstTemplateTypeParmType *SubstTypeParam 4827 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4828 QualType Replacement = SubstTypeParam->getReplacementType(); 4829 Qualifiers Qs = Replacement.getQualifiers(); 4830 Qs.removeObjCLifetime(); 4831 Replacement = SemaRef.Context.getQualifiedType( 4832 Replacement.getUnqualifiedType(), Qs); 4833 T = SemaRef.Context.getSubstTemplateTypeParmType( 4834 SubstTypeParam->getReplacedParameter(), Replacement); 4835 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4836 // 'auto' types behave the same way as template parameters. 4837 QualType Deduced = AutoTy->getDeducedType(); 4838 Qualifiers Qs = Deduced.getQualifiers(); 4839 Qs.removeObjCLifetime(); 4840 Deduced = 4841 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4842 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4843 AutoTy->isDependentType(), 4844 /*isPack=*/false, 4845 AutoTy->getTypeConstraintConcept(), 4846 AutoTy->getTypeConstraintArguments()); 4847 } else { 4848 // Otherwise, complain about the addition of a qualifier to an 4849 // already-qualified type. 4850 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4851 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4852 Quals.removeObjCLifetime(); 4853 } 4854 } 4855 } 4856 4857 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4858 } 4859 4860 template<typename Derived> 4861 TypeLoc 4862 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4863 QualType ObjectType, 4864 NamedDecl *UnqualLookup, 4865 CXXScopeSpec &SS) { 4866 if (getDerived().AlreadyTransformed(TL.getType())) 4867 return TL; 4868 4869 TypeSourceInfo *TSI = 4870 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4871 if (TSI) 4872 return TSI->getTypeLoc(); 4873 return TypeLoc(); 4874 } 4875 4876 template<typename Derived> 4877 TypeSourceInfo * 4878 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4879 QualType ObjectType, 4880 NamedDecl *UnqualLookup, 4881 CXXScopeSpec &SS) { 4882 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4883 return TSInfo; 4884 4885 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4886 UnqualLookup, SS); 4887 } 4888 4889 template <typename Derived> 4890 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4891 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4892 CXXScopeSpec &SS) { 4893 QualType T = TL.getType(); 4894 assert(!getDerived().AlreadyTransformed(T)); 4895 4896 TypeLocBuilder TLB; 4897 QualType Result; 4898 4899 if (isa<TemplateSpecializationType>(T)) { 4900 TemplateSpecializationTypeLoc SpecTL = 4901 TL.castAs<TemplateSpecializationTypeLoc>(); 4902 4903 TemplateName Template = getDerived().TransformTemplateName( 4904 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4905 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4906 if (Template.isNull()) 4907 return nullptr; 4908 4909 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4910 Template); 4911 } else if (isa<DependentTemplateSpecializationType>(T)) { 4912 DependentTemplateSpecializationTypeLoc SpecTL = 4913 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4914 4915 TemplateName Template 4916 = getDerived().RebuildTemplateName(SS, 4917 SpecTL.getTemplateKeywordLoc(), 4918 *SpecTL.getTypePtr()->getIdentifier(), 4919 SpecTL.getTemplateNameLoc(), 4920 ObjectType, UnqualLookup, 4921 /*AllowInjectedClassName*/true); 4922 if (Template.isNull()) 4923 return nullptr; 4924 4925 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4926 SpecTL, 4927 Template, 4928 SS); 4929 } else { 4930 // Nothing special needs to be done for these. 4931 Result = getDerived().TransformType(TLB, TL); 4932 } 4933 4934 if (Result.isNull()) 4935 return nullptr; 4936 4937 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4938 } 4939 4940 template <class TyLoc> static inline 4941 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4942 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4943 NewT.setNameLoc(T.getNameLoc()); 4944 return T.getType(); 4945 } 4946 4947 template<typename Derived> 4948 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4949 BuiltinTypeLoc T) { 4950 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4951 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4952 if (T.needsExtraLocalData()) 4953 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4954 return T.getType(); 4955 } 4956 4957 template<typename Derived> 4958 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4959 ComplexTypeLoc T) { 4960 // FIXME: recurse? 4961 return TransformTypeSpecType(TLB, T); 4962 } 4963 4964 template <typename Derived> 4965 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4966 AdjustedTypeLoc TL) { 4967 // Adjustments applied during transformation are handled elsewhere. 4968 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4969 } 4970 4971 template<typename Derived> 4972 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4973 DecayedTypeLoc TL) { 4974 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4975 if (OriginalType.isNull()) 4976 return QualType(); 4977 4978 QualType Result = TL.getType(); 4979 if (getDerived().AlwaysRebuild() || 4980 OriginalType != TL.getOriginalLoc().getType()) 4981 Result = SemaRef.Context.getDecayedType(OriginalType); 4982 TLB.push<DecayedTypeLoc>(Result); 4983 // Nothing to set for DecayedTypeLoc. 4984 return Result; 4985 } 4986 4987 template<typename Derived> 4988 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4989 PointerTypeLoc TL) { 4990 QualType PointeeType 4991 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4992 if (PointeeType.isNull()) 4993 return QualType(); 4994 4995 QualType Result = TL.getType(); 4996 if (PointeeType->getAs<ObjCObjectType>()) { 4997 // A dependent pointer type 'T *' has is being transformed such 4998 // that an Objective-C class type is being replaced for 'T'. The 4999 // resulting pointer type is an ObjCObjectPointerType, not a 5000 // PointerType. 5001 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 5002 5003 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 5004 NewT.setStarLoc(TL.getStarLoc()); 5005 return Result; 5006 } 5007 5008 if (getDerived().AlwaysRebuild() || 5009 PointeeType != TL.getPointeeLoc().getType()) { 5010 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 5011 if (Result.isNull()) 5012 return QualType(); 5013 } 5014 5015 // Objective-C ARC can add lifetime qualifiers to the type that we're 5016 // pointing to. 5017 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 5018 5019 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 5020 NewT.setSigilLoc(TL.getSigilLoc()); 5021 return Result; 5022 } 5023 5024 template<typename Derived> 5025 QualType 5026 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 5027 BlockPointerTypeLoc TL) { 5028 QualType PointeeType 5029 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5030 if (PointeeType.isNull()) 5031 return QualType(); 5032 5033 QualType Result = TL.getType(); 5034 if (getDerived().AlwaysRebuild() || 5035 PointeeType != TL.getPointeeLoc().getType()) { 5036 Result = getDerived().RebuildBlockPointerType(PointeeType, 5037 TL.getSigilLoc()); 5038 if (Result.isNull()) 5039 return QualType(); 5040 } 5041 5042 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 5043 NewT.setSigilLoc(TL.getSigilLoc()); 5044 return Result; 5045 } 5046 5047 /// Transforms a reference type. Note that somewhat paradoxically we 5048 /// don't care whether the type itself is an l-value type or an r-value 5049 /// type; we only care if the type was *written* as an l-value type 5050 /// or an r-value type. 5051 template<typename Derived> 5052 QualType 5053 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 5054 ReferenceTypeLoc TL) { 5055 const ReferenceType *T = TL.getTypePtr(); 5056 5057 // Note that this works with the pointee-as-written. 5058 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5059 if (PointeeType.isNull()) 5060 return QualType(); 5061 5062 QualType Result = TL.getType(); 5063 if (getDerived().AlwaysRebuild() || 5064 PointeeType != T->getPointeeTypeAsWritten()) { 5065 Result = getDerived().RebuildReferenceType(PointeeType, 5066 T->isSpelledAsLValue(), 5067 TL.getSigilLoc()); 5068 if (Result.isNull()) 5069 return QualType(); 5070 } 5071 5072 // Objective-C ARC can add lifetime qualifiers to the type that we're 5073 // referring to. 5074 TLB.TypeWasModifiedSafely( 5075 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 5076 5077 // r-value references can be rebuilt as l-value references. 5078 ReferenceTypeLoc NewTL; 5079 if (isa<LValueReferenceType>(Result)) 5080 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 5081 else 5082 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 5083 NewTL.setSigilLoc(TL.getSigilLoc()); 5084 5085 return Result; 5086 } 5087 5088 template<typename Derived> 5089 QualType 5090 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 5091 LValueReferenceTypeLoc TL) { 5092 return TransformReferenceType(TLB, TL); 5093 } 5094 5095 template<typename Derived> 5096 QualType 5097 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 5098 RValueReferenceTypeLoc TL) { 5099 return TransformReferenceType(TLB, TL); 5100 } 5101 5102 template<typename Derived> 5103 QualType 5104 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 5105 MemberPointerTypeLoc TL) { 5106 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 5107 if (PointeeType.isNull()) 5108 return QualType(); 5109 5110 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 5111 TypeSourceInfo *NewClsTInfo = nullptr; 5112 if (OldClsTInfo) { 5113 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 5114 if (!NewClsTInfo) 5115 return QualType(); 5116 } 5117 5118 const MemberPointerType *T = TL.getTypePtr(); 5119 QualType OldClsType = QualType(T->getClass(), 0); 5120 QualType NewClsType; 5121 if (NewClsTInfo) 5122 NewClsType = NewClsTInfo->getType(); 5123 else { 5124 NewClsType = getDerived().TransformType(OldClsType); 5125 if (NewClsType.isNull()) 5126 return QualType(); 5127 } 5128 5129 QualType Result = TL.getType(); 5130 if (getDerived().AlwaysRebuild() || 5131 PointeeType != T->getPointeeType() || 5132 NewClsType != OldClsType) { 5133 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 5134 TL.getStarLoc()); 5135 if (Result.isNull()) 5136 return QualType(); 5137 } 5138 5139 // If we had to adjust the pointee type when building a member pointer, make 5140 // sure to push TypeLoc info for it. 5141 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 5142 if (MPT && PointeeType != MPT->getPointeeType()) { 5143 assert(isa<AdjustedType>(MPT->getPointeeType())); 5144 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 5145 } 5146 5147 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5148 NewTL.setSigilLoc(TL.getSigilLoc()); 5149 NewTL.setClassTInfo(NewClsTInfo); 5150 5151 return Result; 5152 } 5153 5154 template<typename Derived> 5155 QualType 5156 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5157 ConstantArrayTypeLoc TL) { 5158 const ConstantArrayType *T = TL.getTypePtr(); 5159 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5160 if (ElementType.isNull()) 5161 return QualType(); 5162 5163 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5164 Expr *OldSize = TL.getSizeExpr(); 5165 if (!OldSize) 5166 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5167 Expr *NewSize = nullptr; 5168 if (OldSize) { 5169 EnterExpressionEvaluationContext Unevaluated( 5170 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5171 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5172 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5173 } 5174 5175 QualType Result = TL.getType(); 5176 if (getDerived().AlwaysRebuild() || 5177 ElementType != T->getElementType() || 5178 (T->getSizeExpr() && NewSize != OldSize)) { 5179 Result = getDerived().RebuildConstantArrayType(ElementType, 5180 T->getSizeModifier(), 5181 T->getSize(), NewSize, 5182 T->getIndexTypeCVRQualifiers(), 5183 TL.getBracketsRange()); 5184 if (Result.isNull()) 5185 return QualType(); 5186 } 5187 5188 // We might have either a ConstantArrayType or a VariableArrayType now: 5189 // a ConstantArrayType is allowed to have an element type which is a 5190 // VariableArrayType if the type is dependent. Fortunately, all array 5191 // types have the same location layout. 5192 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5193 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5194 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5195 NewTL.setSizeExpr(NewSize); 5196 5197 return Result; 5198 } 5199 5200 template<typename Derived> 5201 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5202 TypeLocBuilder &TLB, 5203 IncompleteArrayTypeLoc TL) { 5204 const IncompleteArrayType *T = TL.getTypePtr(); 5205 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5206 if (ElementType.isNull()) 5207 return QualType(); 5208 5209 QualType Result = TL.getType(); 5210 if (getDerived().AlwaysRebuild() || 5211 ElementType != T->getElementType()) { 5212 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5213 T->getSizeModifier(), 5214 T->getIndexTypeCVRQualifiers(), 5215 TL.getBracketsRange()); 5216 if (Result.isNull()) 5217 return QualType(); 5218 } 5219 5220 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5221 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5222 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5223 NewTL.setSizeExpr(nullptr); 5224 5225 return Result; 5226 } 5227 5228 template<typename Derived> 5229 QualType 5230 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5231 VariableArrayTypeLoc TL) { 5232 const VariableArrayType *T = TL.getTypePtr(); 5233 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5234 if (ElementType.isNull()) 5235 return QualType(); 5236 5237 ExprResult SizeResult; 5238 { 5239 EnterExpressionEvaluationContext Context( 5240 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5241 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5242 } 5243 if (SizeResult.isInvalid()) 5244 return QualType(); 5245 SizeResult = 5246 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5247 if (SizeResult.isInvalid()) 5248 return QualType(); 5249 5250 Expr *Size = SizeResult.get(); 5251 5252 QualType Result = TL.getType(); 5253 if (getDerived().AlwaysRebuild() || 5254 ElementType != T->getElementType() || 5255 Size != T->getSizeExpr()) { 5256 Result = getDerived().RebuildVariableArrayType(ElementType, 5257 T->getSizeModifier(), 5258 Size, 5259 T->getIndexTypeCVRQualifiers(), 5260 TL.getBracketsRange()); 5261 if (Result.isNull()) 5262 return QualType(); 5263 } 5264 5265 // We might have constant size array now, but fortunately it has the same 5266 // location layout. 5267 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5268 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5269 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5270 NewTL.setSizeExpr(Size); 5271 5272 return Result; 5273 } 5274 5275 template<typename Derived> 5276 QualType 5277 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5278 DependentSizedArrayTypeLoc TL) { 5279 const DependentSizedArrayType *T = TL.getTypePtr(); 5280 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5281 if (ElementType.isNull()) 5282 return QualType(); 5283 5284 // Array bounds are constant expressions. 5285 EnterExpressionEvaluationContext Unevaluated( 5286 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5287 5288 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5289 Expr *origSize = TL.getSizeExpr(); 5290 if (!origSize) origSize = T->getSizeExpr(); 5291 5292 ExprResult sizeResult 5293 = getDerived().TransformExpr(origSize); 5294 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5295 if (sizeResult.isInvalid()) 5296 return QualType(); 5297 5298 Expr *size = sizeResult.get(); 5299 5300 QualType Result = TL.getType(); 5301 if (getDerived().AlwaysRebuild() || 5302 ElementType != T->getElementType() || 5303 size != origSize) { 5304 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5305 T->getSizeModifier(), 5306 size, 5307 T->getIndexTypeCVRQualifiers(), 5308 TL.getBracketsRange()); 5309 if (Result.isNull()) 5310 return QualType(); 5311 } 5312 5313 // We might have any sort of array type now, but fortunately they 5314 // all have the same location layout. 5315 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5316 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5317 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5318 NewTL.setSizeExpr(size); 5319 5320 return Result; 5321 } 5322 5323 template <typename Derived> 5324 QualType TreeTransform<Derived>::TransformDependentVectorType( 5325 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5326 const DependentVectorType *T = TL.getTypePtr(); 5327 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5328 if (ElementType.isNull()) 5329 return QualType(); 5330 5331 EnterExpressionEvaluationContext Unevaluated( 5332 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5333 5334 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5335 Size = SemaRef.ActOnConstantExpression(Size); 5336 if (Size.isInvalid()) 5337 return QualType(); 5338 5339 QualType Result = TL.getType(); 5340 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5341 Size.get() != T->getSizeExpr()) { 5342 Result = getDerived().RebuildDependentVectorType( 5343 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5344 if (Result.isNull()) 5345 return QualType(); 5346 } 5347 5348 // Result might be dependent or not. 5349 if (isa<DependentVectorType>(Result)) { 5350 DependentVectorTypeLoc NewTL = 5351 TLB.push<DependentVectorTypeLoc>(Result); 5352 NewTL.setNameLoc(TL.getNameLoc()); 5353 } else { 5354 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5355 NewTL.setNameLoc(TL.getNameLoc()); 5356 } 5357 5358 return Result; 5359 } 5360 5361 template<typename Derived> 5362 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5363 TypeLocBuilder &TLB, 5364 DependentSizedExtVectorTypeLoc TL) { 5365 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5366 5367 // FIXME: ext vector locs should be nested 5368 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5369 if (ElementType.isNull()) 5370 return QualType(); 5371 5372 // Vector sizes are constant expressions. 5373 EnterExpressionEvaluationContext Unevaluated( 5374 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5375 5376 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5377 Size = SemaRef.ActOnConstantExpression(Size); 5378 if (Size.isInvalid()) 5379 return QualType(); 5380 5381 QualType Result = TL.getType(); 5382 if (getDerived().AlwaysRebuild() || 5383 ElementType != T->getElementType() || 5384 Size.get() != T->getSizeExpr()) { 5385 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5386 Size.get(), 5387 T->getAttributeLoc()); 5388 if (Result.isNull()) 5389 return QualType(); 5390 } 5391 5392 // Result might be dependent or not. 5393 if (isa<DependentSizedExtVectorType>(Result)) { 5394 DependentSizedExtVectorTypeLoc NewTL 5395 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5396 NewTL.setNameLoc(TL.getNameLoc()); 5397 } else { 5398 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5399 NewTL.setNameLoc(TL.getNameLoc()); 5400 } 5401 5402 return Result; 5403 } 5404 5405 template <typename Derived> 5406 QualType 5407 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5408 ConstantMatrixTypeLoc TL) { 5409 const ConstantMatrixType *T = TL.getTypePtr(); 5410 QualType ElementType = getDerived().TransformType(T->getElementType()); 5411 if (ElementType.isNull()) 5412 return QualType(); 5413 5414 QualType Result = TL.getType(); 5415 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5416 Result = getDerived().RebuildConstantMatrixType( 5417 ElementType, T->getNumRows(), T->getNumColumns()); 5418 if (Result.isNull()) 5419 return QualType(); 5420 } 5421 5422 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5423 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5424 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5425 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5426 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5427 5428 return Result; 5429 } 5430 5431 template <typename Derived> 5432 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5433 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5434 const DependentSizedMatrixType *T = TL.getTypePtr(); 5435 5436 QualType ElementType = getDerived().TransformType(T->getElementType()); 5437 if (ElementType.isNull()) { 5438 return QualType(); 5439 } 5440 5441 // Matrix dimensions are constant expressions. 5442 EnterExpressionEvaluationContext Unevaluated( 5443 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5444 5445 Expr *origRows = TL.getAttrRowOperand(); 5446 if (!origRows) 5447 origRows = T->getRowExpr(); 5448 Expr *origColumns = TL.getAttrColumnOperand(); 5449 if (!origColumns) 5450 origColumns = T->getColumnExpr(); 5451 5452 ExprResult rowResult = getDerived().TransformExpr(origRows); 5453 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5454 if (rowResult.isInvalid()) 5455 return QualType(); 5456 5457 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5458 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5459 if (columnResult.isInvalid()) 5460 return QualType(); 5461 5462 Expr *rows = rowResult.get(); 5463 Expr *columns = columnResult.get(); 5464 5465 QualType Result = TL.getType(); 5466 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5467 rows != origRows || columns != origColumns) { 5468 Result = getDerived().RebuildDependentSizedMatrixType( 5469 ElementType, rows, columns, T->getAttributeLoc()); 5470 5471 if (Result.isNull()) 5472 return QualType(); 5473 } 5474 5475 // We might have any sort of matrix type now, but fortunately they 5476 // all have the same location layout. 5477 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5478 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5479 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5480 NewTL.setAttrRowOperand(rows); 5481 NewTL.setAttrColumnOperand(columns); 5482 return Result; 5483 } 5484 5485 template <typename Derived> 5486 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5487 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5488 const DependentAddressSpaceType *T = TL.getTypePtr(); 5489 5490 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5491 5492 if (pointeeType.isNull()) 5493 return QualType(); 5494 5495 // Address spaces are constant expressions. 5496 EnterExpressionEvaluationContext Unevaluated( 5497 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5498 5499 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5500 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5501 if (AddrSpace.isInvalid()) 5502 return QualType(); 5503 5504 QualType Result = TL.getType(); 5505 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5506 AddrSpace.get() != T->getAddrSpaceExpr()) { 5507 Result = getDerived().RebuildDependentAddressSpaceType( 5508 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5509 if (Result.isNull()) 5510 return QualType(); 5511 } 5512 5513 // Result might be dependent or not. 5514 if (isa<DependentAddressSpaceType>(Result)) { 5515 DependentAddressSpaceTypeLoc NewTL = 5516 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5517 5518 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5519 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5520 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5521 5522 } else { 5523 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5524 Result, getDerived().getBaseLocation()); 5525 TransformType(TLB, DI->getTypeLoc()); 5526 } 5527 5528 return Result; 5529 } 5530 5531 template <typename Derived> 5532 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5533 VectorTypeLoc TL) { 5534 const VectorType *T = TL.getTypePtr(); 5535 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5536 if (ElementType.isNull()) 5537 return QualType(); 5538 5539 QualType Result = TL.getType(); 5540 if (getDerived().AlwaysRebuild() || 5541 ElementType != T->getElementType()) { 5542 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5543 T->getVectorKind()); 5544 if (Result.isNull()) 5545 return QualType(); 5546 } 5547 5548 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5549 NewTL.setNameLoc(TL.getNameLoc()); 5550 5551 return Result; 5552 } 5553 5554 template<typename Derived> 5555 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5556 ExtVectorTypeLoc TL) { 5557 const VectorType *T = TL.getTypePtr(); 5558 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5559 if (ElementType.isNull()) 5560 return QualType(); 5561 5562 QualType Result = TL.getType(); 5563 if (getDerived().AlwaysRebuild() || 5564 ElementType != T->getElementType()) { 5565 Result = getDerived().RebuildExtVectorType(ElementType, 5566 T->getNumElements(), 5567 /*FIXME*/ SourceLocation()); 5568 if (Result.isNull()) 5569 return QualType(); 5570 } 5571 5572 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5573 NewTL.setNameLoc(TL.getNameLoc()); 5574 5575 return Result; 5576 } 5577 5578 template <typename Derived> 5579 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5580 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5581 bool ExpectParameterPack) { 5582 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5583 TypeSourceInfo *NewDI = nullptr; 5584 5585 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5586 // If we're substituting into a pack expansion type and we know the 5587 // length we want to expand to, just substitute for the pattern. 5588 TypeLoc OldTL = OldDI->getTypeLoc(); 5589 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5590 5591 TypeLocBuilder TLB; 5592 TypeLoc NewTL = OldDI->getTypeLoc(); 5593 TLB.reserve(NewTL.getFullDataSize()); 5594 5595 QualType Result = getDerived().TransformType(TLB, 5596 OldExpansionTL.getPatternLoc()); 5597 if (Result.isNull()) 5598 return nullptr; 5599 5600 Result = RebuildPackExpansionType(Result, 5601 OldExpansionTL.getPatternLoc().getSourceRange(), 5602 OldExpansionTL.getEllipsisLoc(), 5603 NumExpansions); 5604 if (Result.isNull()) 5605 return nullptr; 5606 5607 PackExpansionTypeLoc NewExpansionTL 5608 = TLB.push<PackExpansionTypeLoc>(Result); 5609 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5610 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5611 } else 5612 NewDI = getDerived().TransformType(OldDI); 5613 if (!NewDI) 5614 return nullptr; 5615 5616 if (NewDI == OldDI && indexAdjustment == 0) 5617 return OldParm; 5618 5619 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5620 OldParm->getDeclContext(), 5621 OldParm->getInnerLocStart(), 5622 OldParm->getLocation(), 5623 OldParm->getIdentifier(), 5624 NewDI->getType(), 5625 NewDI, 5626 OldParm->getStorageClass(), 5627 /* DefArg */ nullptr); 5628 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5629 OldParm->getFunctionScopeIndex() + indexAdjustment); 5630 transformedLocalDecl(OldParm, {newParm}); 5631 return newParm; 5632 } 5633 5634 template <typename Derived> 5635 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5636 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5637 const QualType *ParamTypes, 5638 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5639 SmallVectorImpl<QualType> &OutParamTypes, 5640 SmallVectorImpl<ParmVarDecl *> *PVars, 5641 Sema::ExtParameterInfoBuilder &PInfos) { 5642 int indexAdjustment = 0; 5643 5644 unsigned NumParams = Params.size(); 5645 for (unsigned i = 0; i != NumParams; ++i) { 5646 if (ParmVarDecl *OldParm = Params[i]) { 5647 assert(OldParm->getFunctionScopeIndex() == i); 5648 5649 Optional<unsigned> NumExpansions; 5650 ParmVarDecl *NewParm = nullptr; 5651 if (OldParm->isParameterPack()) { 5652 // We have a function parameter pack that may need to be expanded. 5653 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5654 5655 // Find the parameter packs that could be expanded. 5656 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5657 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5658 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5659 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5660 5661 // Determine whether we should expand the parameter packs. 5662 bool ShouldExpand = false; 5663 bool RetainExpansion = false; 5664 Optional<unsigned> OrigNumExpansions; 5665 if (Unexpanded.size() > 0) { 5666 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5667 NumExpansions = OrigNumExpansions; 5668 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5669 Pattern.getSourceRange(), 5670 Unexpanded, 5671 ShouldExpand, 5672 RetainExpansion, 5673 NumExpansions)) { 5674 return true; 5675 } 5676 } else { 5677 #ifndef NDEBUG 5678 const AutoType *AT = 5679 Pattern.getType().getTypePtr()->getContainedAutoType(); 5680 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5681 "Could not find parameter packs or undeduced auto type!"); 5682 #endif 5683 } 5684 5685 if (ShouldExpand) { 5686 // Expand the function parameter pack into multiple, separate 5687 // parameters. 5688 getDerived().ExpandingFunctionParameterPack(OldParm); 5689 for (unsigned I = 0; I != *NumExpansions; ++I) { 5690 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5691 ParmVarDecl *NewParm 5692 = getDerived().TransformFunctionTypeParam(OldParm, 5693 indexAdjustment++, 5694 OrigNumExpansions, 5695 /*ExpectParameterPack=*/false); 5696 if (!NewParm) 5697 return true; 5698 5699 if (ParamInfos) 5700 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5701 OutParamTypes.push_back(NewParm->getType()); 5702 if (PVars) 5703 PVars->push_back(NewParm); 5704 } 5705 5706 // If we're supposed to retain a pack expansion, do so by temporarily 5707 // forgetting the partially-substituted parameter pack. 5708 if (RetainExpansion) { 5709 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5710 ParmVarDecl *NewParm 5711 = getDerived().TransformFunctionTypeParam(OldParm, 5712 indexAdjustment++, 5713 OrigNumExpansions, 5714 /*ExpectParameterPack=*/false); 5715 if (!NewParm) 5716 return true; 5717 5718 if (ParamInfos) 5719 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5720 OutParamTypes.push_back(NewParm->getType()); 5721 if (PVars) 5722 PVars->push_back(NewParm); 5723 } 5724 5725 // The next parameter should have the same adjustment as the 5726 // last thing we pushed, but we post-incremented indexAdjustment 5727 // on every push. Also, if we push nothing, the adjustment should 5728 // go down by one. 5729 indexAdjustment--; 5730 5731 // We're done with the pack expansion. 5732 continue; 5733 } 5734 5735 // We'll substitute the parameter now without expanding the pack 5736 // expansion. 5737 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5738 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5739 indexAdjustment, 5740 NumExpansions, 5741 /*ExpectParameterPack=*/true); 5742 assert(NewParm->isParameterPack() && 5743 "Parameter pack no longer a parameter pack after " 5744 "transformation."); 5745 } else { 5746 NewParm = getDerived().TransformFunctionTypeParam( 5747 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5748 } 5749 5750 if (!NewParm) 5751 return true; 5752 5753 if (ParamInfos) 5754 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5755 OutParamTypes.push_back(NewParm->getType()); 5756 if (PVars) 5757 PVars->push_back(NewParm); 5758 continue; 5759 } 5760 5761 // Deal with the possibility that we don't have a parameter 5762 // declaration for this parameter. 5763 QualType OldType = ParamTypes[i]; 5764 bool IsPackExpansion = false; 5765 Optional<unsigned> NumExpansions; 5766 QualType NewType; 5767 if (const PackExpansionType *Expansion 5768 = dyn_cast<PackExpansionType>(OldType)) { 5769 // We have a function parameter pack that may need to be expanded. 5770 QualType Pattern = Expansion->getPattern(); 5771 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5772 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5773 5774 // Determine whether we should expand the parameter packs. 5775 bool ShouldExpand = false; 5776 bool RetainExpansion = false; 5777 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5778 Unexpanded, 5779 ShouldExpand, 5780 RetainExpansion, 5781 NumExpansions)) { 5782 return true; 5783 } 5784 5785 if (ShouldExpand) { 5786 // Expand the function parameter pack into multiple, separate 5787 // parameters. 5788 for (unsigned I = 0; I != *NumExpansions; ++I) { 5789 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5790 QualType NewType = getDerived().TransformType(Pattern); 5791 if (NewType.isNull()) 5792 return true; 5793 5794 if (NewType->containsUnexpandedParameterPack()) { 5795 NewType = 5796 getSema().getASTContext().getPackExpansionType(NewType, None); 5797 5798 if (NewType.isNull()) 5799 return true; 5800 } 5801 5802 if (ParamInfos) 5803 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5804 OutParamTypes.push_back(NewType); 5805 if (PVars) 5806 PVars->push_back(nullptr); 5807 } 5808 5809 // We're done with the pack expansion. 5810 continue; 5811 } 5812 5813 // If we're supposed to retain a pack expansion, do so by temporarily 5814 // forgetting the partially-substituted parameter pack. 5815 if (RetainExpansion) { 5816 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5817 QualType NewType = getDerived().TransformType(Pattern); 5818 if (NewType.isNull()) 5819 return true; 5820 5821 if (ParamInfos) 5822 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5823 OutParamTypes.push_back(NewType); 5824 if (PVars) 5825 PVars->push_back(nullptr); 5826 } 5827 5828 // We'll substitute the parameter now without expanding the pack 5829 // expansion. 5830 OldType = Expansion->getPattern(); 5831 IsPackExpansion = true; 5832 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5833 NewType = getDerived().TransformType(OldType); 5834 } else { 5835 NewType = getDerived().TransformType(OldType); 5836 } 5837 5838 if (NewType.isNull()) 5839 return true; 5840 5841 if (IsPackExpansion) 5842 NewType = getSema().Context.getPackExpansionType(NewType, 5843 NumExpansions); 5844 5845 if (ParamInfos) 5846 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5847 OutParamTypes.push_back(NewType); 5848 if (PVars) 5849 PVars->push_back(nullptr); 5850 } 5851 5852 #ifndef NDEBUG 5853 if (PVars) { 5854 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5855 if (ParmVarDecl *parm = (*PVars)[i]) 5856 assert(parm->getFunctionScopeIndex() == i); 5857 } 5858 #endif 5859 5860 return false; 5861 } 5862 5863 template<typename Derived> 5864 QualType 5865 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5866 FunctionProtoTypeLoc TL) { 5867 SmallVector<QualType, 4> ExceptionStorage; 5868 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5869 return getDerived().TransformFunctionProtoType( 5870 TLB, TL, nullptr, Qualifiers(), 5871 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5872 return This->getDerived().TransformExceptionSpec( 5873 TL.getBeginLoc(), ESI, ExceptionStorage, Changed); 5874 }); 5875 } 5876 5877 template<typename Derived> template<typename Fn> 5878 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5879 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5880 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5881 5882 // Transform the parameters and return type. 5883 // 5884 // We are required to instantiate the params and return type in source order. 5885 // When the function has a trailing return type, we instantiate the 5886 // parameters before the return type, since the return type can then refer 5887 // to the parameters themselves (via decltype, sizeof, etc.). 5888 // 5889 SmallVector<QualType, 4> ParamTypes; 5890 SmallVector<ParmVarDecl*, 4> ParamDecls; 5891 Sema::ExtParameterInfoBuilder ExtParamInfos; 5892 const FunctionProtoType *T = TL.getTypePtr(); 5893 5894 QualType ResultType; 5895 5896 if (T->hasTrailingReturn()) { 5897 if (getDerived().TransformFunctionTypeParams( 5898 TL.getBeginLoc(), TL.getParams(), 5899 TL.getTypePtr()->param_type_begin(), 5900 T->getExtParameterInfosOrNull(), 5901 ParamTypes, &ParamDecls, ExtParamInfos)) 5902 return QualType(); 5903 5904 { 5905 // C++11 [expr.prim.general]p3: 5906 // If a declaration declares a member function or member function 5907 // template of a class X, the expression this is a prvalue of type 5908 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5909 // and the end of the function-definition, member-declarator, or 5910 // declarator. 5911 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5912 5913 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5914 if (ResultType.isNull()) 5915 return QualType(); 5916 } 5917 } 5918 else { 5919 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5920 if (ResultType.isNull()) 5921 return QualType(); 5922 5923 if (getDerived().TransformFunctionTypeParams( 5924 TL.getBeginLoc(), TL.getParams(), 5925 TL.getTypePtr()->param_type_begin(), 5926 T->getExtParameterInfosOrNull(), 5927 ParamTypes, &ParamDecls, ExtParamInfos)) 5928 return QualType(); 5929 } 5930 5931 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5932 5933 bool EPIChanged = false; 5934 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5935 return QualType(); 5936 5937 // Handle extended parameter information. 5938 if (auto NewExtParamInfos = 5939 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5940 if (!EPI.ExtParameterInfos || 5941 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5942 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5943 EPIChanged = true; 5944 } 5945 EPI.ExtParameterInfos = NewExtParamInfos; 5946 } else if (EPI.ExtParameterInfos) { 5947 EPIChanged = true; 5948 EPI.ExtParameterInfos = nullptr; 5949 } 5950 5951 QualType Result = TL.getType(); 5952 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5953 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5954 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5955 if (Result.isNull()) 5956 return QualType(); 5957 } 5958 5959 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5960 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5961 NewTL.setLParenLoc(TL.getLParenLoc()); 5962 NewTL.setRParenLoc(TL.getRParenLoc()); 5963 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5964 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5965 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5966 NewTL.setParam(i, ParamDecls[i]); 5967 5968 return Result; 5969 } 5970 5971 template<typename Derived> 5972 bool TreeTransform<Derived>::TransformExceptionSpec( 5973 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5974 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5975 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5976 5977 // Instantiate a dynamic noexcept expression, if any. 5978 if (isComputedNoexcept(ESI.Type)) { 5979 EnterExpressionEvaluationContext Unevaluated( 5980 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5981 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5982 if (NoexceptExpr.isInvalid()) 5983 return true; 5984 5985 ExceptionSpecificationType EST = ESI.Type; 5986 NoexceptExpr = 5987 getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST); 5988 if (NoexceptExpr.isInvalid()) 5989 return true; 5990 5991 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5992 Changed = true; 5993 ESI.NoexceptExpr = NoexceptExpr.get(); 5994 ESI.Type = EST; 5995 } 5996 5997 if (ESI.Type != EST_Dynamic) 5998 return false; 5999 6000 // Instantiate a dynamic exception specification's type. 6001 for (QualType T : ESI.Exceptions) { 6002 if (const PackExpansionType *PackExpansion = 6003 T->getAs<PackExpansionType>()) { 6004 Changed = true; 6005 6006 // We have a pack expansion. Instantiate it. 6007 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6008 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6009 Unexpanded); 6010 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6011 6012 // Determine whether the set of unexpanded parameter packs can and 6013 // should 6014 // be expanded. 6015 bool Expand = false; 6016 bool RetainExpansion = false; 6017 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6018 // FIXME: Track the location of the ellipsis (and track source location 6019 // information for the types in the exception specification in general). 6020 if (getDerived().TryExpandParameterPacks( 6021 Loc, SourceRange(), Unexpanded, Expand, 6022 RetainExpansion, NumExpansions)) 6023 return true; 6024 6025 if (!Expand) { 6026 // We can't expand this pack expansion into separate arguments yet; 6027 // just substitute into the pattern and create a new pack expansion 6028 // type. 6029 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6030 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6031 if (U.isNull()) 6032 return true; 6033 6034 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 6035 Exceptions.push_back(U); 6036 continue; 6037 } 6038 6039 // Substitute into the pack expansion pattern for each slice of the 6040 // pack. 6041 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6042 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6043 6044 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 6045 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6046 return true; 6047 6048 Exceptions.push_back(U); 6049 } 6050 } else { 6051 QualType U = getDerived().TransformType(T); 6052 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 6053 return true; 6054 if (T != U) 6055 Changed = true; 6056 6057 Exceptions.push_back(U); 6058 } 6059 } 6060 6061 ESI.Exceptions = Exceptions; 6062 if (ESI.Exceptions.empty()) 6063 ESI.Type = EST_DynamicNone; 6064 return false; 6065 } 6066 6067 template<typename Derived> 6068 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 6069 TypeLocBuilder &TLB, 6070 FunctionNoProtoTypeLoc TL) { 6071 const FunctionNoProtoType *T = TL.getTypePtr(); 6072 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 6073 if (ResultType.isNull()) 6074 return QualType(); 6075 6076 QualType Result = TL.getType(); 6077 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 6078 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 6079 6080 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 6081 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 6082 NewTL.setLParenLoc(TL.getLParenLoc()); 6083 NewTL.setRParenLoc(TL.getRParenLoc()); 6084 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 6085 6086 return Result; 6087 } 6088 6089 template <typename Derived> 6090 QualType TreeTransform<Derived>::TransformUnresolvedUsingType( 6091 TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) { 6092 const UnresolvedUsingType *T = TL.getTypePtr(); 6093 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 6094 if (!D) 6095 return QualType(); 6096 6097 QualType Result = TL.getType(); 6098 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 6099 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 6100 if (Result.isNull()) 6101 return QualType(); 6102 } 6103 6104 // We might get an arbitrary type spec type back. We should at 6105 // least always get a type spec type, though. 6106 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 6107 NewTL.setNameLoc(TL.getNameLoc()); 6108 6109 return Result; 6110 } 6111 6112 template <typename Derived> 6113 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB, 6114 UsingTypeLoc TL) { 6115 const UsingType *T = TL.getTypePtr(); 6116 6117 auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl( 6118 TL.getLocalSourceRange().getBegin(), T->getFoundDecl())); 6119 if (!Found) 6120 return QualType(); 6121 6122 QualType Underlying = getDerived().TransformType(T->desugar()); 6123 if (Underlying.isNull()) 6124 return QualType(); 6125 6126 QualType Result = TL.getType(); 6127 if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() || 6128 Underlying != T->getUnderlyingType()) { 6129 Result = getDerived().RebuildUsingType(Found, Underlying); 6130 if (Result.isNull()) 6131 return QualType(); 6132 } 6133 6134 TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc()); 6135 return Result; 6136 } 6137 6138 template<typename Derived> 6139 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 6140 TypedefTypeLoc TL) { 6141 const TypedefType *T = TL.getTypePtr(); 6142 TypedefNameDecl *Typedef 6143 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6144 T->getDecl())); 6145 if (!Typedef) 6146 return QualType(); 6147 6148 QualType Result = TL.getType(); 6149 if (getDerived().AlwaysRebuild() || 6150 Typedef != T->getDecl()) { 6151 Result = getDerived().RebuildTypedefType(Typedef); 6152 if (Result.isNull()) 6153 return QualType(); 6154 } 6155 6156 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 6157 NewTL.setNameLoc(TL.getNameLoc()); 6158 6159 return Result; 6160 } 6161 6162 template<typename Derived> 6163 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 6164 TypeOfExprTypeLoc TL) { 6165 // typeof expressions are not potentially evaluated contexts 6166 EnterExpressionEvaluationContext Unevaluated( 6167 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 6168 Sema::ReuseLambdaContextDecl); 6169 6170 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 6171 if (E.isInvalid()) 6172 return QualType(); 6173 6174 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6175 if (E.isInvalid()) 6176 return QualType(); 6177 6178 QualType Result = TL.getType(); 6179 if (getDerived().AlwaysRebuild() || 6180 E.get() != TL.getUnderlyingExpr()) { 6181 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6182 if (Result.isNull()) 6183 return QualType(); 6184 } 6185 else E.get(); 6186 6187 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6188 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6189 NewTL.setLParenLoc(TL.getLParenLoc()); 6190 NewTL.setRParenLoc(TL.getRParenLoc()); 6191 6192 return Result; 6193 } 6194 6195 template<typename Derived> 6196 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6197 TypeOfTypeLoc TL) { 6198 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6199 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6200 if (!New_Under_TI) 6201 return QualType(); 6202 6203 QualType Result = TL.getType(); 6204 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6205 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6206 if (Result.isNull()) 6207 return QualType(); 6208 } 6209 6210 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6211 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6212 NewTL.setLParenLoc(TL.getLParenLoc()); 6213 NewTL.setRParenLoc(TL.getRParenLoc()); 6214 NewTL.setUnderlyingTInfo(New_Under_TI); 6215 6216 return Result; 6217 } 6218 6219 template<typename Derived> 6220 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6221 DecltypeTypeLoc TL) { 6222 const DecltypeType *T = TL.getTypePtr(); 6223 6224 // decltype expressions are not potentially evaluated contexts 6225 EnterExpressionEvaluationContext Unevaluated( 6226 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6227 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6228 6229 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6230 if (E.isInvalid()) 6231 return QualType(); 6232 6233 E = getSema().ActOnDecltypeExpression(E.get()); 6234 if (E.isInvalid()) 6235 return QualType(); 6236 6237 QualType Result = TL.getType(); 6238 if (getDerived().AlwaysRebuild() || 6239 E.get() != T->getUnderlyingExpr()) { 6240 Result = getDerived().RebuildDecltypeType(E.get(), TL.getDecltypeLoc()); 6241 if (Result.isNull()) 6242 return QualType(); 6243 } 6244 else E.get(); 6245 6246 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6247 NewTL.setDecltypeLoc(TL.getDecltypeLoc()); 6248 NewTL.setRParenLoc(TL.getRParenLoc()); 6249 return Result; 6250 } 6251 6252 template<typename Derived> 6253 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6254 TypeLocBuilder &TLB, 6255 UnaryTransformTypeLoc TL) { 6256 QualType Result = TL.getType(); 6257 if (Result->isDependentType()) { 6258 const UnaryTransformType *T = TL.getTypePtr(); 6259 QualType NewBase = 6260 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6261 Result = getDerived().RebuildUnaryTransformType(NewBase, 6262 T->getUTTKind(), 6263 TL.getKWLoc()); 6264 if (Result.isNull()) 6265 return QualType(); 6266 } 6267 6268 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6269 NewTL.setKWLoc(TL.getKWLoc()); 6270 NewTL.setParensRange(TL.getParensRange()); 6271 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6272 return Result; 6273 } 6274 6275 template<typename Derived> 6276 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6277 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6278 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6279 6280 CXXScopeSpec SS; 6281 TemplateName TemplateName = getDerived().TransformTemplateName( 6282 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6283 if (TemplateName.isNull()) 6284 return QualType(); 6285 6286 QualType OldDeduced = T->getDeducedType(); 6287 QualType NewDeduced; 6288 if (!OldDeduced.isNull()) { 6289 NewDeduced = getDerived().TransformType(OldDeduced); 6290 if (NewDeduced.isNull()) 6291 return QualType(); 6292 } 6293 6294 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6295 TemplateName, NewDeduced); 6296 if (Result.isNull()) 6297 return QualType(); 6298 6299 DeducedTemplateSpecializationTypeLoc NewTL = 6300 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6301 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6302 6303 return Result; 6304 } 6305 6306 template<typename Derived> 6307 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6308 RecordTypeLoc TL) { 6309 const RecordType *T = TL.getTypePtr(); 6310 RecordDecl *Record 6311 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6312 T->getDecl())); 6313 if (!Record) 6314 return QualType(); 6315 6316 QualType Result = TL.getType(); 6317 if (getDerived().AlwaysRebuild() || 6318 Record != T->getDecl()) { 6319 Result = getDerived().RebuildRecordType(Record); 6320 if (Result.isNull()) 6321 return QualType(); 6322 } 6323 6324 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6325 NewTL.setNameLoc(TL.getNameLoc()); 6326 6327 return Result; 6328 } 6329 6330 template<typename Derived> 6331 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6332 EnumTypeLoc TL) { 6333 const EnumType *T = TL.getTypePtr(); 6334 EnumDecl *Enum 6335 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6336 T->getDecl())); 6337 if (!Enum) 6338 return QualType(); 6339 6340 QualType Result = TL.getType(); 6341 if (getDerived().AlwaysRebuild() || 6342 Enum != T->getDecl()) { 6343 Result = getDerived().RebuildEnumType(Enum); 6344 if (Result.isNull()) 6345 return QualType(); 6346 } 6347 6348 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6349 NewTL.setNameLoc(TL.getNameLoc()); 6350 6351 return Result; 6352 } 6353 6354 template<typename Derived> 6355 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6356 TypeLocBuilder &TLB, 6357 InjectedClassNameTypeLoc TL) { 6358 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6359 TL.getTypePtr()->getDecl()); 6360 if (!D) return QualType(); 6361 6362 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6363 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6364 return T; 6365 } 6366 6367 template<typename Derived> 6368 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6369 TypeLocBuilder &TLB, 6370 TemplateTypeParmTypeLoc TL) { 6371 return TransformTypeSpecType(TLB, TL); 6372 } 6373 6374 template<typename Derived> 6375 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6376 TypeLocBuilder &TLB, 6377 SubstTemplateTypeParmTypeLoc TL) { 6378 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6379 6380 // Substitute into the replacement type, which itself might involve something 6381 // that needs to be transformed. This only tends to occur with default 6382 // template arguments of template template parameters. 6383 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6384 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6385 if (Replacement.isNull()) 6386 return QualType(); 6387 6388 // Always canonicalize the replacement type. 6389 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6390 QualType Result 6391 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6392 Replacement); 6393 6394 // Propagate type-source information. 6395 SubstTemplateTypeParmTypeLoc NewTL 6396 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6397 NewTL.setNameLoc(TL.getNameLoc()); 6398 return Result; 6399 6400 } 6401 6402 template<typename Derived> 6403 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6404 TypeLocBuilder &TLB, 6405 SubstTemplateTypeParmPackTypeLoc TL) { 6406 return TransformTypeSpecType(TLB, TL); 6407 } 6408 6409 template<typename Derived> 6410 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6411 TypeLocBuilder &TLB, 6412 TemplateSpecializationTypeLoc TL) { 6413 const TemplateSpecializationType *T = TL.getTypePtr(); 6414 6415 // The nested-name-specifier never matters in a TemplateSpecializationType, 6416 // because we can't have a dependent nested-name-specifier anyway. 6417 CXXScopeSpec SS; 6418 TemplateName Template 6419 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6420 TL.getTemplateNameLoc()); 6421 if (Template.isNull()) 6422 return QualType(); 6423 6424 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6425 } 6426 6427 template<typename Derived> 6428 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6429 AtomicTypeLoc TL) { 6430 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6431 if (ValueType.isNull()) 6432 return QualType(); 6433 6434 QualType Result = TL.getType(); 6435 if (getDerived().AlwaysRebuild() || 6436 ValueType != TL.getValueLoc().getType()) { 6437 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6438 if (Result.isNull()) 6439 return QualType(); 6440 } 6441 6442 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6443 NewTL.setKWLoc(TL.getKWLoc()); 6444 NewTL.setLParenLoc(TL.getLParenLoc()); 6445 NewTL.setRParenLoc(TL.getRParenLoc()); 6446 6447 return Result; 6448 } 6449 6450 template <typename Derived> 6451 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6452 PipeTypeLoc TL) { 6453 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6454 if (ValueType.isNull()) 6455 return QualType(); 6456 6457 QualType Result = TL.getType(); 6458 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6459 const PipeType *PT = Result->castAs<PipeType>(); 6460 bool isReadPipe = PT->isReadOnly(); 6461 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6462 if (Result.isNull()) 6463 return QualType(); 6464 } 6465 6466 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6467 NewTL.setKWLoc(TL.getKWLoc()); 6468 6469 return Result; 6470 } 6471 6472 template <typename Derived> 6473 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB, 6474 BitIntTypeLoc TL) { 6475 const BitIntType *EIT = TL.getTypePtr(); 6476 QualType Result = TL.getType(); 6477 6478 if (getDerived().AlwaysRebuild()) { 6479 Result = getDerived().RebuildBitIntType(EIT->isUnsigned(), 6480 EIT->getNumBits(), TL.getNameLoc()); 6481 if (Result.isNull()) 6482 return QualType(); 6483 } 6484 6485 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6486 NewTL.setNameLoc(TL.getNameLoc()); 6487 return Result; 6488 } 6489 6490 template <typename Derived> 6491 QualType TreeTransform<Derived>::TransformDependentBitIntType( 6492 TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) { 6493 const DependentBitIntType *EIT = TL.getTypePtr(); 6494 6495 EnterExpressionEvaluationContext Unevaluated( 6496 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6497 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6498 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6499 6500 if (BitsExpr.isInvalid()) 6501 return QualType(); 6502 6503 QualType Result = TL.getType(); 6504 6505 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6506 Result = getDerived().RebuildDependentBitIntType( 6507 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6508 6509 if (Result.isNull()) 6510 return QualType(); 6511 } 6512 6513 if (isa<DependentBitIntType>(Result)) { 6514 DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result); 6515 NewTL.setNameLoc(TL.getNameLoc()); 6516 } else { 6517 BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result); 6518 NewTL.setNameLoc(TL.getNameLoc()); 6519 } 6520 return Result; 6521 } 6522 6523 /// Simple iterator that traverses the template arguments in a 6524 /// container that provides a \c getArgLoc() member function. 6525 /// 6526 /// This iterator is intended to be used with the iterator form of 6527 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6528 template<typename ArgLocContainer> 6529 class TemplateArgumentLocContainerIterator { 6530 ArgLocContainer *Container; 6531 unsigned Index; 6532 6533 public: 6534 typedef TemplateArgumentLoc value_type; 6535 typedef TemplateArgumentLoc reference; 6536 typedef int difference_type; 6537 typedef std::input_iterator_tag iterator_category; 6538 6539 class pointer { 6540 TemplateArgumentLoc Arg; 6541 6542 public: 6543 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6544 6545 const TemplateArgumentLoc *operator->() const { 6546 return &Arg; 6547 } 6548 }; 6549 6550 6551 TemplateArgumentLocContainerIterator() {} 6552 6553 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6554 unsigned Index) 6555 : Container(&Container), Index(Index) { } 6556 6557 TemplateArgumentLocContainerIterator &operator++() { 6558 ++Index; 6559 return *this; 6560 } 6561 6562 TemplateArgumentLocContainerIterator operator++(int) { 6563 TemplateArgumentLocContainerIterator Old(*this); 6564 ++(*this); 6565 return Old; 6566 } 6567 6568 TemplateArgumentLoc operator*() const { 6569 return Container->getArgLoc(Index); 6570 } 6571 6572 pointer operator->() const { 6573 return pointer(Container->getArgLoc(Index)); 6574 } 6575 6576 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6577 const TemplateArgumentLocContainerIterator &Y) { 6578 return X.Container == Y.Container && X.Index == Y.Index; 6579 } 6580 6581 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6582 const TemplateArgumentLocContainerIterator &Y) { 6583 return !(X == Y); 6584 } 6585 }; 6586 6587 template<typename Derived> 6588 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6589 AutoTypeLoc TL) { 6590 const AutoType *T = TL.getTypePtr(); 6591 QualType OldDeduced = T->getDeducedType(); 6592 QualType NewDeduced; 6593 if (!OldDeduced.isNull()) { 6594 NewDeduced = getDerived().TransformType(OldDeduced); 6595 if (NewDeduced.isNull()) 6596 return QualType(); 6597 } 6598 6599 ConceptDecl *NewCD = nullptr; 6600 TemplateArgumentListInfo NewTemplateArgs; 6601 NestedNameSpecifierLoc NewNestedNameSpec; 6602 if (T->isConstrained()) { 6603 NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl( 6604 TL.getConceptNameLoc(), T->getTypeConstraintConcept())); 6605 6606 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6607 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6608 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6609 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6610 ArgIterator(TL, 6611 TL.getNumArgs()), 6612 NewTemplateArgs)) 6613 return QualType(); 6614 6615 if (TL.getNestedNameSpecifierLoc()) { 6616 NewNestedNameSpec 6617 = getDerived().TransformNestedNameSpecifierLoc( 6618 TL.getNestedNameSpecifierLoc()); 6619 if (!NewNestedNameSpec) 6620 return QualType(); 6621 } 6622 } 6623 6624 QualType Result = TL.getType(); 6625 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6626 T->isDependentType() || T->isConstrained()) { 6627 // FIXME: Maybe don't rebuild if all template arguments are the same. 6628 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6629 NewArgList.reserve(NewTemplateArgs.size()); 6630 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6631 NewArgList.push_back(ArgLoc.getArgument()); 6632 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6633 NewArgList); 6634 if (Result.isNull()) 6635 return QualType(); 6636 } 6637 6638 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6639 NewTL.setNameLoc(TL.getNameLoc()); 6640 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6641 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6642 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6643 NewTL.setFoundDecl(TL.getFoundDecl()); 6644 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6645 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6646 NewTL.setRParenLoc(TL.getRParenLoc()); 6647 for (unsigned I = 0; I < NewTL.getNumArgs(); ++I) 6648 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6649 6650 return Result; 6651 } 6652 6653 template <typename Derived> 6654 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6655 TypeLocBuilder &TLB, 6656 TemplateSpecializationTypeLoc TL, 6657 TemplateName Template) { 6658 TemplateArgumentListInfo NewTemplateArgs; 6659 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6660 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6661 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6662 ArgIterator; 6663 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6664 ArgIterator(TL, TL.getNumArgs()), 6665 NewTemplateArgs)) 6666 return QualType(); 6667 6668 // FIXME: maybe don't rebuild if all the template arguments are the same. 6669 6670 QualType Result = 6671 getDerived().RebuildTemplateSpecializationType(Template, 6672 TL.getTemplateNameLoc(), 6673 NewTemplateArgs); 6674 6675 if (!Result.isNull()) { 6676 // Specializations of template template parameters are represented as 6677 // TemplateSpecializationTypes, and substitution of type alias templates 6678 // within a dependent context can transform them into 6679 // DependentTemplateSpecializationTypes. 6680 if (isa<DependentTemplateSpecializationType>(Result)) { 6681 DependentTemplateSpecializationTypeLoc NewTL 6682 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6683 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6684 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6685 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6686 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6687 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6688 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6689 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6690 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6691 return Result; 6692 } 6693 6694 TemplateSpecializationTypeLoc NewTL 6695 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6696 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6697 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6698 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6699 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6700 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6701 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6702 } 6703 6704 return Result; 6705 } 6706 6707 template <typename Derived> 6708 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6709 TypeLocBuilder &TLB, 6710 DependentTemplateSpecializationTypeLoc TL, 6711 TemplateName Template, 6712 CXXScopeSpec &SS) { 6713 TemplateArgumentListInfo NewTemplateArgs; 6714 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6715 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6716 typedef TemplateArgumentLocContainerIterator< 6717 DependentTemplateSpecializationTypeLoc> ArgIterator; 6718 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6719 ArgIterator(TL, TL.getNumArgs()), 6720 NewTemplateArgs)) 6721 return QualType(); 6722 6723 // FIXME: maybe don't rebuild if all the template arguments are the same. 6724 6725 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6726 QualType Result 6727 = getSema().Context.getDependentTemplateSpecializationType( 6728 TL.getTypePtr()->getKeyword(), 6729 DTN->getQualifier(), 6730 DTN->getIdentifier(), 6731 NewTemplateArgs); 6732 6733 DependentTemplateSpecializationTypeLoc NewTL 6734 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6735 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6736 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6737 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6738 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6739 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6740 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6741 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6742 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6743 return Result; 6744 } 6745 6746 QualType Result 6747 = getDerived().RebuildTemplateSpecializationType(Template, 6748 TL.getTemplateNameLoc(), 6749 NewTemplateArgs); 6750 6751 if (!Result.isNull()) { 6752 /// FIXME: Wrap this in an elaborated-type-specifier? 6753 TemplateSpecializationTypeLoc NewTL 6754 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6755 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6756 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6757 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6758 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6759 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6760 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6761 } 6762 6763 return Result; 6764 } 6765 6766 template<typename Derived> 6767 QualType 6768 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6769 ElaboratedTypeLoc TL) { 6770 const ElaboratedType *T = TL.getTypePtr(); 6771 6772 NestedNameSpecifierLoc QualifierLoc; 6773 // NOTE: the qualifier in an ElaboratedType is optional. 6774 if (TL.getQualifierLoc()) { 6775 QualifierLoc 6776 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6777 if (!QualifierLoc) 6778 return QualType(); 6779 } 6780 6781 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6782 if (NamedT.isNull()) 6783 return QualType(); 6784 6785 // C++0x [dcl.type.elab]p2: 6786 // If the identifier resolves to a typedef-name or the simple-template-id 6787 // resolves to an alias template specialization, the 6788 // elaborated-type-specifier is ill-formed. 6789 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6790 if (const TemplateSpecializationType *TST = 6791 NamedT->getAs<TemplateSpecializationType>()) { 6792 TemplateName Template = TST->getTemplateName(); 6793 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6794 Template.getAsTemplateDecl())) { 6795 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6796 diag::err_tag_reference_non_tag) 6797 << TAT << Sema::NTK_TypeAliasTemplate 6798 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6799 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6800 } 6801 } 6802 } 6803 6804 QualType Result = TL.getType(); 6805 if (getDerived().AlwaysRebuild() || 6806 QualifierLoc != TL.getQualifierLoc() || 6807 NamedT != T->getNamedType()) { 6808 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6809 T->getKeyword(), 6810 QualifierLoc, NamedT); 6811 if (Result.isNull()) 6812 return QualType(); 6813 } 6814 6815 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6816 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6817 NewTL.setQualifierLoc(QualifierLoc); 6818 return Result; 6819 } 6820 6821 template<typename Derived> 6822 QualType TreeTransform<Derived>::TransformAttributedType( 6823 TypeLocBuilder &TLB, 6824 AttributedTypeLoc TL) { 6825 const AttributedType *oldType = TL.getTypePtr(); 6826 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6827 if (modifiedType.isNull()) 6828 return QualType(); 6829 6830 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6831 const Attr *oldAttr = TL.getAttr(); 6832 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6833 if (oldAttr && !newAttr) 6834 return QualType(); 6835 6836 QualType result = TL.getType(); 6837 6838 // FIXME: dependent operand expressions? 6839 if (getDerived().AlwaysRebuild() || 6840 modifiedType != oldType->getModifiedType()) { 6841 // TODO: this is really lame; we should really be rebuilding the 6842 // equivalent type from first principles. 6843 QualType equivalentType 6844 = getDerived().TransformType(oldType->getEquivalentType()); 6845 if (equivalentType.isNull()) 6846 return QualType(); 6847 6848 // Check whether we can add nullability; it is only represented as 6849 // type sugar, and therefore cannot be diagnosed in any other way. 6850 if (auto nullability = oldType->getImmediateNullability()) { 6851 if (!modifiedType->canHaveNullability()) { 6852 SemaRef.Diag(TL.getAttr()->getLocation(), 6853 diag::err_nullability_nonpointer) 6854 << DiagNullabilityKind(*nullability, false) << modifiedType; 6855 return QualType(); 6856 } 6857 } 6858 6859 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6860 modifiedType, 6861 equivalentType); 6862 } 6863 6864 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6865 newTL.setAttr(newAttr); 6866 return result; 6867 } 6868 6869 template <typename Derived> 6870 QualType TreeTransform<Derived>::TransformBTFTagAttributedType( 6871 TypeLocBuilder &TLB, BTFTagAttributedTypeLoc TL) { 6872 // The BTFTagAttributedType is available for C only. 6873 llvm_unreachable("Unexpected TreeTransform for BTFTagAttributedType"); 6874 } 6875 6876 template<typename Derived> 6877 QualType 6878 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6879 ParenTypeLoc TL) { 6880 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6881 if (Inner.isNull()) 6882 return QualType(); 6883 6884 QualType Result = TL.getType(); 6885 if (getDerived().AlwaysRebuild() || 6886 Inner != TL.getInnerLoc().getType()) { 6887 Result = getDerived().RebuildParenType(Inner); 6888 if (Result.isNull()) 6889 return QualType(); 6890 } 6891 6892 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6893 NewTL.setLParenLoc(TL.getLParenLoc()); 6894 NewTL.setRParenLoc(TL.getRParenLoc()); 6895 return Result; 6896 } 6897 6898 template <typename Derived> 6899 QualType 6900 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6901 MacroQualifiedTypeLoc TL) { 6902 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6903 if (Inner.isNull()) 6904 return QualType(); 6905 6906 QualType Result = TL.getType(); 6907 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6908 Result = 6909 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6910 if (Result.isNull()) 6911 return QualType(); 6912 } 6913 6914 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6915 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6916 return Result; 6917 } 6918 6919 template<typename Derived> 6920 QualType TreeTransform<Derived>::TransformDependentNameType( 6921 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6922 return TransformDependentNameType(TLB, TL, false); 6923 } 6924 6925 template<typename Derived> 6926 QualType TreeTransform<Derived>::TransformDependentNameType( 6927 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6928 const DependentNameType *T = TL.getTypePtr(); 6929 6930 NestedNameSpecifierLoc QualifierLoc 6931 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6932 if (!QualifierLoc) 6933 return QualType(); 6934 6935 QualType Result 6936 = getDerived().RebuildDependentNameType(T->getKeyword(), 6937 TL.getElaboratedKeywordLoc(), 6938 QualifierLoc, 6939 T->getIdentifier(), 6940 TL.getNameLoc(), 6941 DeducedTSTContext); 6942 if (Result.isNull()) 6943 return QualType(); 6944 6945 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6946 QualType NamedT = ElabT->getNamedType(); 6947 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6948 6949 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6950 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6951 NewTL.setQualifierLoc(QualifierLoc); 6952 } else { 6953 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6954 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6955 NewTL.setQualifierLoc(QualifierLoc); 6956 NewTL.setNameLoc(TL.getNameLoc()); 6957 } 6958 return Result; 6959 } 6960 6961 template<typename Derived> 6962 QualType TreeTransform<Derived>:: 6963 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6964 DependentTemplateSpecializationTypeLoc TL) { 6965 NestedNameSpecifierLoc QualifierLoc; 6966 if (TL.getQualifierLoc()) { 6967 QualifierLoc 6968 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6969 if (!QualifierLoc) 6970 return QualType(); 6971 } 6972 6973 return getDerived() 6974 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6975 } 6976 6977 template<typename Derived> 6978 QualType TreeTransform<Derived>:: 6979 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6980 DependentTemplateSpecializationTypeLoc TL, 6981 NestedNameSpecifierLoc QualifierLoc) { 6982 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6983 6984 TemplateArgumentListInfo NewTemplateArgs; 6985 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6986 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6987 6988 typedef TemplateArgumentLocContainerIterator< 6989 DependentTemplateSpecializationTypeLoc> ArgIterator; 6990 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6991 ArgIterator(TL, TL.getNumArgs()), 6992 NewTemplateArgs)) 6993 return QualType(); 6994 6995 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6996 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6997 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6998 /*AllowInjectedClassName*/ false); 6999 if (Result.isNull()) 7000 return QualType(); 7001 7002 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 7003 QualType NamedT = ElabT->getNamedType(); 7004 7005 // Copy information relevant to the template specialization. 7006 TemplateSpecializationTypeLoc NamedTL 7007 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 7008 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7009 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7010 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 7011 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 7012 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7013 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7014 7015 // Copy information relevant to the elaborated type. 7016 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 7017 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7018 NewTL.setQualifierLoc(QualifierLoc); 7019 } else if (isa<DependentTemplateSpecializationType>(Result)) { 7020 DependentTemplateSpecializationTypeLoc SpecTL 7021 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 7022 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 7023 SpecTL.setQualifierLoc(QualifierLoc); 7024 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 7025 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 7026 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 7027 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 7028 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 7029 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 7030 } else { 7031 TemplateSpecializationTypeLoc SpecTL 7032 = TLB.push<TemplateSpecializationTypeLoc>(Result); 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 } 7040 return Result; 7041 } 7042 7043 template<typename Derived> 7044 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 7045 PackExpansionTypeLoc TL) { 7046 QualType Pattern 7047 = getDerived().TransformType(TLB, TL.getPatternLoc()); 7048 if (Pattern.isNull()) 7049 return QualType(); 7050 7051 QualType Result = TL.getType(); 7052 if (getDerived().AlwaysRebuild() || 7053 Pattern != TL.getPatternLoc().getType()) { 7054 Result = getDerived().RebuildPackExpansionType(Pattern, 7055 TL.getPatternLoc().getSourceRange(), 7056 TL.getEllipsisLoc(), 7057 TL.getTypePtr()->getNumExpansions()); 7058 if (Result.isNull()) 7059 return QualType(); 7060 } 7061 7062 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 7063 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 7064 return Result; 7065 } 7066 7067 template<typename Derived> 7068 QualType 7069 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 7070 ObjCInterfaceTypeLoc TL) { 7071 // ObjCInterfaceType is never dependent. 7072 TLB.pushFullCopy(TL); 7073 return TL.getType(); 7074 } 7075 7076 template<typename Derived> 7077 QualType 7078 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 7079 ObjCTypeParamTypeLoc TL) { 7080 const ObjCTypeParamType *T = TL.getTypePtr(); 7081 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 7082 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 7083 if (!OTP) 7084 return QualType(); 7085 7086 QualType Result = TL.getType(); 7087 if (getDerived().AlwaysRebuild() || 7088 OTP != T->getDecl()) { 7089 Result = getDerived().RebuildObjCTypeParamType(OTP, 7090 TL.getProtocolLAngleLoc(), 7091 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 7092 TL.getNumProtocols()), 7093 TL.getProtocolLocs(), 7094 TL.getProtocolRAngleLoc()); 7095 if (Result.isNull()) 7096 return QualType(); 7097 } 7098 7099 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 7100 if (TL.getNumProtocols()) { 7101 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7102 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7103 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 7104 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7105 } 7106 return Result; 7107 } 7108 7109 template<typename Derived> 7110 QualType 7111 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 7112 ObjCObjectTypeLoc TL) { 7113 // Transform base type. 7114 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 7115 if (BaseType.isNull()) 7116 return QualType(); 7117 7118 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 7119 7120 // Transform type arguments. 7121 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 7122 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 7123 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 7124 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 7125 QualType TypeArg = TypeArgInfo->getType(); 7126 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 7127 AnyChanged = true; 7128 7129 // We have a pack expansion. Instantiate it. 7130 const auto *PackExpansion = PackExpansionLoc.getType() 7131 ->castAs<PackExpansionType>(); 7132 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7133 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 7134 Unexpanded); 7135 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 7136 7137 // Determine whether the set of unexpanded parameter packs can 7138 // and should be expanded. 7139 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 7140 bool Expand = false; 7141 bool RetainExpansion = false; 7142 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 7143 if (getDerived().TryExpandParameterPacks( 7144 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 7145 Unexpanded, Expand, RetainExpansion, NumExpansions)) 7146 return QualType(); 7147 7148 if (!Expand) { 7149 // We can't expand this pack expansion into separate arguments yet; 7150 // just substitute into the pattern and create a new pack expansion 7151 // type. 7152 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7153 7154 TypeLocBuilder TypeArgBuilder; 7155 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7156 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 7157 PatternLoc); 7158 if (NewPatternType.isNull()) 7159 return QualType(); 7160 7161 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 7162 NewPatternType, NumExpansions); 7163 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 7164 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 7165 NewTypeArgInfos.push_back( 7166 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 7167 continue; 7168 } 7169 7170 // Substitute into the pack expansion pattern for each slice of the 7171 // pack. 7172 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 7173 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 7174 7175 TypeLocBuilder TypeArgBuilder; 7176 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 7177 7178 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 7179 PatternLoc); 7180 if (NewTypeArg.isNull()) 7181 return QualType(); 7182 7183 NewTypeArgInfos.push_back( 7184 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7185 } 7186 7187 continue; 7188 } 7189 7190 TypeLocBuilder TypeArgBuilder; 7191 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7192 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7193 if (NewTypeArg.isNull()) 7194 return QualType(); 7195 7196 // If nothing changed, just keep the old TypeSourceInfo. 7197 if (NewTypeArg == TypeArg) { 7198 NewTypeArgInfos.push_back(TypeArgInfo); 7199 continue; 7200 } 7201 7202 NewTypeArgInfos.push_back( 7203 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7204 AnyChanged = true; 7205 } 7206 7207 QualType Result = TL.getType(); 7208 if (getDerived().AlwaysRebuild() || AnyChanged) { 7209 // Rebuild the type. 7210 Result = getDerived().RebuildObjCObjectType( 7211 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7212 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7213 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7214 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7215 7216 if (Result.isNull()) 7217 return QualType(); 7218 } 7219 7220 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7221 NewT.setHasBaseTypeAsWritten(true); 7222 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7223 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7224 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7225 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7226 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7227 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7228 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7229 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7230 return Result; 7231 } 7232 7233 template<typename Derived> 7234 QualType 7235 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7236 ObjCObjectPointerTypeLoc TL) { 7237 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7238 if (PointeeType.isNull()) 7239 return QualType(); 7240 7241 QualType Result = TL.getType(); 7242 if (getDerived().AlwaysRebuild() || 7243 PointeeType != TL.getPointeeLoc().getType()) { 7244 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7245 TL.getStarLoc()); 7246 if (Result.isNull()) 7247 return QualType(); 7248 } 7249 7250 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7251 NewT.setStarLoc(TL.getStarLoc()); 7252 return Result; 7253 } 7254 7255 //===----------------------------------------------------------------------===// 7256 // Statement transformation 7257 //===----------------------------------------------------------------------===// 7258 template<typename Derived> 7259 StmtResult 7260 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7261 return S; 7262 } 7263 7264 template<typename Derived> 7265 StmtResult 7266 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7267 return getDerived().TransformCompoundStmt(S, false); 7268 } 7269 7270 template<typename Derived> 7271 StmtResult 7272 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7273 bool IsStmtExpr) { 7274 Sema::CompoundScopeRAII CompoundScope(getSema()); 7275 7276 const Stmt *ExprResult = S->getStmtExprResult(); 7277 bool SubStmtInvalid = false; 7278 bool SubStmtChanged = false; 7279 SmallVector<Stmt*, 8> Statements; 7280 for (auto *B : S->body()) { 7281 StmtResult Result = getDerived().TransformStmt( 7282 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7283 7284 if (Result.isInvalid()) { 7285 // Immediately fail if this was a DeclStmt, since it's very 7286 // likely that this will cause problems for future statements. 7287 if (isa<DeclStmt>(B)) 7288 return StmtError(); 7289 7290 // Otherwise, just keep processing substatements and fail later. 7291 SubStmtInvalid = true; 7292 continue; 7293 } 7294 7295 SubStmtChanged = SubStmtChanged || Result.get() != B; 7296 Statements.push_back(Result.getAs<Stmt>()); 7297 } 7298 7299 if (SubStmtInvalid) 7300 return StmtError(); 7301 7302 if (!getDerived().AlwaysRebuild() && 7303 !SubStmtChanged) 7304 return S; 7305 7306 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7307 Statements, 7308 S->getRBracLoc(), 7309 IsStmtExpr); 7310 } 7311 7312 template<typename Derived> 7313 StmtResult 7314 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7315 ExprResult LHS, RHS; 7316 { 7317 EnterExpressionEvaluationContext Unevaluated( 7318 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7319 7320 // Transform the left-hand case value. 7321 LHS = getDerived().TransformExpr(S->getLHS()); 7322 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7323 if (LHS.isInvalid()) 7324 return StmtError(); 7325 7326 // Transform the right-hand case value (for the GNU case-range extension). 7327 RHS = getDerived().TransformExpr(S->getRHS()); 7328 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7329 if (RHS.isInvalid()) 7330 return StmtError(); 7331 } 7332 7333 // Build the case statement. 7334 // Case statements are always rebuilt so that they will attached to their 7335 // transformed switch statement. 7336 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7337 LHS.get(), 7338 S->getEllipsisLoc(), 7339 RHS.get(), 7340 S->getColonLoc()); 7341 if (Case.isInvalid()) 7342 return StmtError(); 7343 7344 // Transform the statement following the case 7345 StmtResult SubStmt = 7346 getDerived().TransformStmt(S->getSubStmt()); 7347 if (SubStmt.isInvalid()) 7348 return StmtError(); 7349 7350 // Attach the body to the case statement 7351 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7352 } 7353 7354 template <typename Derived> 7355 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7356 // Transform the statement following the default case 7357 StmtResult SubStmt = 7358 getDerived().TransformStmt(S->getSubStmt()); 7359 if (SubStmt.isInvalid()) 7360 return StmtError(); 7361 7362 // Default statements are always rebuilt 7363 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7364 SubStmt.get()); 7365 } 7366 7367 template<typename Derived> 7368 StmtResult 7369 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7370 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7371 if (SubStmt.isInvalid()) 7372 return StmtError(); 7373 7374 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7375 S->getDecl()); 7376 if (!LD) 7377 return StmtError(); 7378 7379 // If we're transforming "in-place" (we're not creating new local 7380 // declarations), assume we're replacing the old label statement 7381 // and clear out the reference to it. 7382 if (LD == S->getDecl()) 7383 S->getDecl()->setStmt(nullptr); 7384 7385 // FIXME: Pass the real colon location in. 7386 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7387 cast<LabelDecl>(LD), SourceLocation(), 7388 SubStmt.get()); 7389 } 7390 7391 template <typename Derived> 7392 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7393 if (!R) 7394 return R; 7395 7396 switch (R->getKind()) { 7397 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7398 #define ATTR(X) 7399 #define PRAGMA_SPELLING_ATTR(X) \ 7400 case attr::X: \ 7401 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7402 #include "clang/Basic/AttrList.inc" 7403 default: 7404 return R; 7405 } 7406 } 7407 7408 template <typename Derived> 7409 StmtResult 7410 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7411 StmtDiscardKind SDK) { 7412 bool AttrsChanged = false; 7413 SmallVector<const Attr *, 1> Attrs; 7414 7415 // Visit attributes and keep track if any are transformed. 7416 for (const auto *I : S->getAttrs()) { 7417 const Attr *R = getDerived().TransformAttr(I); 7418 AttrsChanged |= (I != R); 7419 if (R) 7420 Attrs.push_back(R); 7421 } 7422 7423 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7424 if (SubStmt.isInvalid()) 7425 return StmtError(); 7426 7427 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7428 return S; 7429 7430 // If transforming the attributes failed for all of the attributes in the 7431 // statement, don't make an AttributedStmt without attributes. 7432 if (Attrs.empty()) 7433 return SubStmt; 7434 7435 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7436 SubStmt.get()); 7437 } 7438 7439 template<typename Derived> 7440 StmtResult 7441 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7442 // Transform the initialization statement 7443 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7444 if (Init.isInvalid()) 7445 return StmtError(); 7446 7447 Sema::ConditionResult Cond; 7448 if (!S->isConsteval()) { 7449 // Transform the condition 7450 Cond = getDerived().TransformCondition( 7451 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7452 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7453 : Sema::ConditionKind::Boolean); 7454 if (Cond.isInvalid()) 7455 return StmtError(); 7456 } 7457 7458 // If this is a constexpr if, determine which arm we should instantiate. 7459 llvm::Optional<bool> ConstexprConditionValue; 7460 if (S->isConstexpr()) 7461 ConstexprConditionValue = Cond.getKnownValue(); 7462 7463 // Transform the "then" branch. 7464 StmtResult Then; 7465 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7466 Then = getDerived().TransformStmt(S->getThen()); 7467 if (Then.isInvalid()) 7468 return StmtError(); 7469 } else { 7470 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7471 } 7472 7473 // Transform the "else" branch. 7474 StmtResult Else; 7475 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7476 Else = getDerived().TransformStmt(S->getElse()); 7477 if (Else.isInvalid()) 7478 return StmtError(); 7479 } 7480 7481 if (!getDerived().AlwaysRebuild() && 7482 Init.get() == S->getInit() && 7483 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7484 Then.get() == S->getThen() && 7485 Else.get() == S->getElse()) 7486 return S; 7487 7488 return getDerived().RebuildIfStmt( 7489 S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond, 7490 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7491 } 7492 7493 template<typename Derived> 7494 StmtResult 7495 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7496 // Transform the initialization statement 7497 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7498 if (Init.isInvalid()) 7499 return StmtError(); 7500 7501 // Transform the condition. 7502 Sema::ConditionResult Cond = getDerived().TransformCondition( 7503 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7504 Sema::ConditionKind::Switch); 7505 if (Cond.isInvalid()) 7506 return StmtError(); 7507 7508 // Rebuild the switch statement. 7509 StmtResult Switch = 7510 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7511 Init.get(), Cond, S->getRParenLoc()); 7512 if (Switch.isInvalid()) 7513 return StmtError(); 7514 7515 // Transform the body of the switch statement. 7516 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7517 if (Body.isInvalid()) 7518 return StmtError(); 7519 7520 // Complete the switch statement. 7521 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7522 Body.get()); 7523 } 7524 7525 template<typename Derived> 7526 StmtResult 7527 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7528 // Transform the condition 7529 Sema::ConditionResult Cond = getDerived().TransformCondition( 7530 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7531 Sema::ConditionKind::Boolean); 7532 if (Cond.isInvalid()) 7533 return StmtError(); 7534 7535 // Transform the body 7536 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7537 if (Body.isInvalid()) 7538 return StmtError(); 7539 7540 if (!getDerived().AlwaysRebuild() && 7541 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7542 Body.get() == S->getBody()) 7543 return Owned(S); 7544 7545 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7546 Cond, S->getRParenLoc(), Body.get()); 7547 } 7548 7549 template<typename Derived> 7550 StmtResult 7551 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7552 // Transform the body 7553 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7554 if (Body.isInvalid()) 7555 return StmtError(); 7556 7557 // Transform the condition 7558 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7559 if (Cond.isInvalid()) 7560 return StmtError(); 7561 7562 if (!getDerived().AlwaysRebuild() && 7563 Cond.get() == S->getCond() && 7564 Body.get() == S->getBody()) 7565 return S; 7566 7567 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7568 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7569 S->getRParenLoc()); 7570 } 7571 7572 template<typename Derived> 7573 StmtResult 7574 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7575 if (getSema().getLangOpts().OpenMP) 7576 getSema().startOpenMPLoop(); 7577 7578 // Transform the initialization statement 7579 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7580 if (Init.isInvalid()) 7581 return StmtError(); 7582 7583 // In OpenMP loop region loop control variable must be captured and be 7584 // private. Perform analysis of first part (if any). 7585 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7586 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7587 7588 // Transform the condition 7589 Sema::ConditionResult Cond = getDerived().TransformCondition( 7590 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7591 Sema::ConditionKind::Boolean); 7592 if (Cond.isInvalid()) 7593 return StmtError(); 7594 7595 // Transform the increment 7596 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7597 if (Inc.isInvalid()) 7598 return StmtError(); 7599 7600 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7601 if (S->getInc() && !FullInc.get()) 7602 return StmtError(); 7603 7604 // Transform the body 7605 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7606 if (Body.isInvalid()) 7607 return StmtError(); 7608 7609 if (!getDerived().AlwaysRebuild() && 7610 Init.get() == S->getInit() && 7611 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7612 Inc.get() == S->getInc() && 7613 Body.get() == S->getBody()) 7614 return S; 7615 7616 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7617 Init.get(), Cond, FullInc, 7618 S->getRParenLoc(), Body.get()); 7619 } 7620 7621 template<typename Derived> 7622 StmtResult 7623 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7624 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7625 S->getLabel()); 7626 if (!LD) 7627 return StmtError(); 7628 7629 // Goto statements must always be rebuilt, to resolve the label. 7630 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7631 cast<LabelDecl>(LD)); 7632 } 7633 7634 template<typename Derived> 7635 StmtResult 7636 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7637 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7638 if (Target.isInvalid()) 7639 return StmtError(); 7640 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7641 7642 if (!getDerived().AlwaysRebuild() && 7643 Target.get() == S->getTarget()) 7644 return S; 7645 7646 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7647 Target.get()); 7648 } 7649 7650 template<typename Derived> 7651 StmtResult 7652 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7653 return S; 7654 } 7655 7656 template<typename Derived> 7657 StmtResult 7658 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7659 return S; 7660 } 7661 7662 template<typename Derived> 7663 StmtResult 7664 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7665 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7666 /*NotCopyInit*/false); 7667 if (Result.isInvalid()) 7668 return StmtError(); 7669 7670 // FIXME: We always rebuild the return statement because there is no way 7671 // to tell whether the return type of the function has changed. 7672 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7673 } 7674 7675 template<typename Derived> 7676 StmtResult 7677 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7678 bool DeclChanged = false; 7679 SmallVector<Decl *, 4> Decls; 7680 for (auto *D : S->decls()) { 7681 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7682 if (!Transformed) 7683 return StmtError(); 7684 7685 if (Transformed != D) 7686 DeclChanged = true; 7687 7688 Decls.push_back(Transformed); 7689 } 7690 7691 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7692 return S; 7693 7694 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7695 } 7696 7697 template<typename Derived> 7698 StmtResult 7699 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7700 7701 SmallVector<Expr*, 8> Constraints; 7702 SmallVector<Expr*, 8> Exprs; 7703 SmallVector<IdentifierInfo *, 4> Names; 7704 7705 ExprResult AsmString; 7706 SmallVector<Expr*, 8> Clobbers; 7707 7708 bool ExprsChanged = false; 7709 7710 // Go through the outputs. 7711 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7712 Names.push_back(S->getOutputIdentifier(I)); 7713 7714 // No need to transform the constraint literal. 7715 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7716 7717 // Transform the output expr. 7718 Expr *OutputExpr = S->getOutputExpr(I); 7719 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7720 if (Result.isInvalid()) 7721 return StmtError(); 7722 7723 ExprsChanged |= Result.get() != OutputExpr; 7724 7725 Exprs.push_back(Result.get()); 7726 } 7727 7728 // Go through the inputs. 7729 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7730 Names.push_back(S->getInputIdentifier(I)); 7731 7732 // No need to transform the constraint literal. 7733 Constraints.push_back(S->getInputConstraintLiteral(I)); 7734 7735 // Transform the input expr. 7736 Expr *InputExpr = S->getInputExpr(I); 7737 ExprResult Result = getDerived().TransformExpr(InputExpr); 7738 if (Result.isInvalid()) 7739 return StmtError(); 7740 7741 ExprsChanged |= Result.get() != InputExpr; 7742 7743 Exprs.push_back(Result.get()); 7744 } 7745 7746 // Go through the Labels. 7747 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7748 Names.push_back(S->getLabelIdentifier(I)); 7749 7750 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7751 if (Result.isInvalid()) 7752 return StmtError(); 7753 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7754 Exprs.push_back(Result.get()); 7755 } 7756 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7757 return S; 7758 7759 // Go through the clobbers. 7760 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7761 Clobbers.push_back(S->getClobberStringLiteral(I)); 7762 7763 // No need to transform the asm string literal. 7764 AsmString = S->getAsmString(); 7765 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7766 S->isVolatile(), S->getNumOutputs(), 7767 S->getNumInputs(), Names.data(), 7768 Constraints, Exprs, AsmString.get(), 7769 Clobbers, S->getNumLabels(), 7770 S->getRParenLoc()); 7771 } 7772 7773 template<typename Derived> 7774 StmtResult 7775 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7776 ArrayRef<Token> AsmToks = 7777 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7778 7779 bool HadError = false, HadChange = false; 7780 7781 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7782 SmallVector<Expr*, 8> TransformedExprs; 7783 TransformedExprs.reserve(SrcExprs.size()); 7784 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7785 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7786 if (!Result.isUsable()) { 7787 HadError = true; 7788 } else { 7789 HadChange |= (Result.get() != SrcExprs[i]); 7790 TransformedExprs.push_back(Result.get()); 7791 } 7792 } 7793 7794 if (HadError) return StmtError(); 7795 if (!HadChange && !getDerived().AlwaysRebuild()) 7796 return Owned(S); 7797 7798 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7799 AsmToks, S->getAsmString(), 7800 S->getNumOutputs(), S->getNumInputs(), 7801 S->getAllConstraints(), S->getClobbers(), 7802 TransformedExprs, S->getEndLoc()); 7803 } 7804 7805 // C++ Coroutines TS 7806 7807 template<typename Derived> 7808 StmtResult 7809 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7810 auto *ScopeInfo = SemaRef.getCurFunction(); 7811 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7812 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7813 ScopeInfo->NeedsCoroutineSuspends && 7814 ScopeInfo->CoroutineSuspends.first == nullptr && 7815 ScopeInfo->CoroutineSuspends.second == nullptr && 7816 "expected clean scope info"); 7817 7818 // Set that we have (possibly-invalid) suspend points before we do anything 7819 // that may fail. 7820 ScopeInfo->setNeedsCoroutineSuspends(false); 7821 7822 // We re-build the coroutine promise object (and the coroutine parameters its 7823 // type and constructor depend on) based on the types used in our current 7824 // function. We must do so, and set it on the current FunctionScopeInfo, 7825 // before attempting to transform the other parts of the coroutine body 7826 // statement, such as the implicit suspend statements (because those 7827 // statements reference the FunctionScopeInfo::CoroutinePromise). 7828 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7829 return StmtError(); 7830 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7831 if (!Promise) 7832 return StmtError(); 7833 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7834 ScopeInfo->CoroutinePromise = Promise; 7835 7836 // Transform the implicit coroutine statements constructed using dependent 7837 // types during the previous parse: initial and final suspensions, the return 7838 // object, and others. We also transform the coroutine function's body. 7839 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7840 if (InitSuspend.isInvalid()) 7841 return StmtError(); 7842 StmtResult FinalSuspend = 7843 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7844 if (FinalSuspend.isInvalid() || 7845 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7846 return StmtError(); 7847 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7848 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7849 7850 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7851 if (BodyRes.isInvalid()) 7852 return StmtError(); 7853 7854 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7855 if (Builder.isInvalid()) 7856 return StmtError(); 7857 7858 Expr *ReturnObject = S->getReturnValueInit(); 7859 assert(ReturnObject && "the return object is expected to be valid"); 7860 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7861 /*NoCopyInit*/ false); 7862 if (Res.isInvalid()) 7863 return StmtError(); 7864 Builder.ReturnValue = Res.get(); 7865 7866 // If during the previous parse the coroutine still had a dependent promise 7867 // statement, we may need to build some implicit coroutine statements 7868 // (such as exception and fallthrough handlers) for the first time. 7869 if (S->hasDependentPromiseType()) { 7870 // We can only build these statements, however, if the current promise type 7871 // is not dependent. 7872 if (!Promise->getType()->isDependentType()) { 7873 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7874 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7875 "these nodes should not have been built yet"); 7876 if (!Builder.buildDependentStatements()) 7877 return StmtError(); 7878 } 7879 } else { 7880 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7881 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7882 if (Res.isInvalid()) 7883 return StmtError(); 7884 Builder.OnFallthrough = Res.get(); 7885 } 7886 7887 if (auto *OnException = S->getExceptionHandler()) { 7888 StmtResult Res = getDerived().TransformStmt(OnException); 7889 if (Res.isInvalid()) 7890 return StmtError(); 7891 Builder.OnException = Res.get(); 7892 } 7893 7894 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7895 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7896 if (Res.isInvalid()) 7897 return StmtError(); 7898 Builder.ReturnStmtOnAllocFailure = Res.get(); 7899 } 7900 7901 // Transform any additional statements we may have already built 7902 assert(S->getAllocate() && S->getDeallocate() && 7903 "allocation and deallocation calls must already be built"); 7904 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7905 if (AllocRes.isInvalid()) 7906 return StmtError(); 7907 Builder.Allocate = AllocRes.get(); 7908 7909 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7910 if (DeallocRes.isInvalid()) 7911 return StmtError(); 7912 Builder.Deallocate = DeallocRes.get(); 7913 7914 if (auto *ReturnStmt = S->getReturnStmt()) { 7915 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7916 if (Res.isInvalid()) 7917 return StmtError(); 7918 Builder.ReturnStmt = Res.get(); 7919 } 7920 } 7921 7922 return getDerived().RebuildCoroutineBodyStmt(Builder); 7923 } 7924 7925 template<typename Derived> 7926 StmtResult 7927 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7928 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7929 /*NotCopyInit*/false); 7930 if (Result.isInvalid()) 7931 return StmtError(); 7932 7933 // Always rebuild; we don't know if this needs to be injected into a new 7934 // context or if the promise type has changed. 7935 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7936 S->isImplicit()); 7937 } 7938 7939 template<typename Derived> 7940 ExprResult 7941 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7942 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7943 /*NotCopyInit*/false); 7944 if (Result.isInvalid()) 7945 return ExprError(); 7946 7947 // Always rebuild; we don't know if this needs to be injected into a new 7948 // context or if the promise type has changed. 7949 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7950 E->isImplicit()); 7951 } 7952 7953 template <typename Derived> 7954 ExprResult 7955 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7956 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7957 /*NotCopyInit*/ false); 7958 if (OperandResult.isInvalid()) 7959 return ExprError(); 7960 7961 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7962 E->getOperatorCoawaitLookup()); 7963 7964 if (LookupResult.isInvalid()) 7965 return ExprError(); 7966 7967 // Always rebuild; we don't know if this needs to be injected into a new 7968 // context or if the promise type has changed. 7969 return getDerived().RebuildDependentCoawaitExpr( 7970 E->getKeywordLoc(), OperandResult.get(), 7971 cast<UnresolvedLookupExpr>(LookupResult.get())); 7972 } 7973 7974 template<typename Derived> 7975 ExprResult 7976 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7977 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7978 /*NotCopyInit*/false); 7979 if (Result.isInvalid()) 7980 return ExprError(); 7981 7982 // Always rebuild; we don't know if this needs to be injected into a new 7983 // context or if the promise type has changed. 7984 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7985 } 7986 7987 // Objective-C Statements. 7988 7989 template<typename Derived> 7990 StmtResult 7991 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7992 // Transform the body of the @try. 7993 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7994 if (TryBody.isInvalid()) 7995 return StmtError(); 7996 7997 // Transform the @catch statements (if present). 7998 bool AnyCatchChanged = false; 7999 SmallVector<Stmt*, 8> CatchStmts; 8000 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 8001 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 8002 if (Catch.isInvalid()) 8003 return StmtError(); 8004 if (Catch.get() != S->getCatchStmt(I)) 8005 AnyCatchChanged = true; 8006 CatchStmts.push_back(Catch.get()); 8007 } 8008 8009 // Transform the @finally statement (if present). 8010 StmtResult Finally; 8011 if (S->getFinallyStmt()) { 8012 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 8013 if (Finally.isInvalid()) 8014 return StmtError(); 8015 } 8016 8017 // If nothing changed, just retain this statement. 8018 if (!getDerived().AlwaysRebuild() && 8019 TryBody.get() == S->getTryBody() && 8020 !AnyCatchChanged && 8021 Finally.get() == S->getFinallyStmt()) 8022 return S; 8023 8024 // Build a new statement. 8025 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 8026 CatchStmts, Finally.get()); 8027 } 8028 8029 template<typename Derived> 8030 StmtResult 8031 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 8032 // Transform the @catch parameter, if there is one. 8033 VarDecl *Var = nullptr; 8034 if (VarDecl *FromVar = S->getCatchParamDecl()) { 8035 TypeSourceInfo *TSInfo = nullptr; 8036 if (FromVar->getTypeSourceInfo()) { 8037 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 8038 if (!TSInfo) 8039 return StmtError(); 8040 } 8041 8042 QualType T; 8043 if (TSInfo) 8044 T = TSInfo->getType(); 8045 else { 8046 T = getDerived().TransformType(FromVar->getType()); 8047 if (T.isNull()) 8048 return StmtError(); 8049 } 8050 8051 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 8052 if (!Var) 8053 return StmtError(); 8054 } 8055 8056 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 8057 if (Body.isInvalid()) 8058 return StmtError(); 8059 8060 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 8061 S->getRParenLoc(), 8062 Var, Body.get()); 8063 } 8064 8065 template<typename Derived> 8066 StmtResult 8067 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 8068 // Transform the body. 8069 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 8070 if (Body.isInvalid()) 8071 return StmtError(); 8072 8073 // If nothing changed, just retain this statement. 8074 if (!getDerived().AlwaysRebuild() && 8075 Body.get() == S->getFinallyBody()) 8076 return S; 8077 8078 // Build a new statement. 8079 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 8080 Body.get()); 8081 } 8082 8083 template<typename Derived> 8084 StmtResult 8085 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 8086 ExprResult Operand; 8087 if (S->getThrowExpr()) { 8088 Operand = getDerived().TransformExpr(S->getThrowExpr()); 8089 if (Operand.isInvalid()) 8090 return StmtError(); 8091 } 8092 8093 if (!getDerived().AlwaysRebuild() && 8094 Operand.get() == S->getThrowExpr()) 8095 return S; 8096 8097 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 8098 } 8099 8100 template<typename Derived> 8101 StmtResult 8102 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 8103 ObjCAtSynchronizedStmt *S) { 8104 // Transform the object we are locking. 8105 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 8106 if (Object.isInvalid()) 8107 return StmtError(); 8108 Object = 8109 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 8110 Object.get()); 8111 if (Object.isInvalid()) 8112 return StmtError(); 8113 8114 // Transform the body. 8115 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 8116 if (Body.isInvalid()) 8117 return StmtError(); 8118 8119 // If nothing change, just retain the current statement. 8120 if (!getDerived().AlwaysRebuild() && 8121 Object.get() == S->getSynchExpr() && 8122 Body.get() == S->getSynchBody()) 8123 return S; 8124 8125 // Build a new statement. 8126 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 8127 Object.get(), Body.get()); 8128 } 8129 8130 template<typename Derived> 8131 StmtResult 8132 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 8133 ObjCAutoreleasePoolStmt *S) { 8134 // Transform the body. 8135 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 8136 if (Body.isInvalid()) 8137 return StmtError(); 8138 8139 // If nothing changed, just retain this statement. 8140 if (!getDerived().AlwaysRebuild() && 8141 Body.get() == S->getSubStmt()) 8142 return S; 8143 8144 // Build a new statement. 8145 return getDerived().RebuildObjCAutoreleasePoolStmt( 8146 S->getAtLoc(), Body.get()); 8147 } 8148 8149 template<typename Derived> 8150 StmtResult 8151 TreeTransform<Derived>::TransformObjCForCollectionStmt( 8152 ObjCForCollectionStmt *S) { 8153 // Transform the element statement. 8154 StmtResult Element = 8155 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 8156 if (Element.isInvalid()) 8157 return StmtError(); 8158 8159 // Transform the collection expression. 8160 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 8161 if (Collection.isInvalid()) 8162 return StmtError(); 8163 8164 // Transform the body. 8165 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8166 if (Body.isInvalid()) 8167 return StmtError(); 8168 8169 // If nothing changed, just retain this statement. 8170 if (!getDerived().AlwaysRebuild() && 8171 Element.get() == S->getElement() && 8172 Collection.get() == S->getCollection() && 8173 Body.get() == S->getBody()) 8174 return S; 8175 8176 // Build a new statement. 8177 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 8178 Element.get(), 8179 Collection.get(), 8180 S->getRParenLoc(), 8181 Body.get()); 8182 } 8183 8184 template <typename Derived> 8185 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8186 // Transform the exception declaration, if any. 8187 VarDecl *Var = nullptr; 8188 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8189 TypeSourceInfo *T = 8190 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8191 if (!T) 8192 return StmtError(); 8193 8194 Var = getDerived().RebuildExceptionDecl( 8195 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8196 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8197 if (!Var || Var->isInvalidDecl()) 8198 return StmtError(); 8199 } 8200 8201 // Transform the actual exception handler. 8202 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8203 if (Handler.isInvalid()) 8204 return StmtError(); 8205 8206 if (!getDerived().AlwaysRebuild() && !Var && 8207 Handler.get() == S->getHandlerBlock()) 8208 return S; 8209 8210 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8211 } 8212 8213 template <typename Derived> 8214 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8215 // Transform the try block itself. 8216 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8217 if (TryBlock.isInvalid()) 8218 return StmtError(); 8219 8220 // Transform the handlers. 8221 bool HandlerChanged = false; 8222 SmallVector<Stmt *, 8> Handlers; 8223 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8224 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8225 if (Handler.isInvalid()) 8226 return StmtError(); 8227 8228 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8229 Handlers.push_back(Handler.getAs<Stmt>()); 8230 } 8231 8232 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8233 !HandlerChanged) 8234 return S; 8235 8236 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8237 Handlers); 8238 } 8239 8240 template<typename Derived> 8241 StmtResult 8242 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8243 StmtResult Init = 8244 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8245 if (Init.isInvalid()) 8246 return StmtError(); 8247 8248 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8249 if (Range.isInvalid()) 8250 return StmtError(); 8251 8252 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8253 if (Begin.isInvalid()) 8254 return StmtError(); 8255 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8256 if (End.isInvalid()) 8257 return StmtError(); 8258 8259 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8260 if (Cond.isInvalid()) 8261 return StmtError(); 8262 if (Cond.get()) 8263 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8264 if (Cond.isInvalid()) 8265 return StmtError(); 8266 if (Cond.get()) 8267 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8268 8269 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8270 if (Inc.isInvalid()) 8271 return StmtError(); 8272 if (Inc.get()) 8273 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8274 8275 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8276 if (LoopVar.isInvalid()) 8277 return StmtError(); 8278 8279 StmtResult NewStmt = S; 8280 if (getDerived().AlwaysRebuild() || 8281 Init.get() != S->getInit() || 8282 Range.get() != S->getRangeStmt() || 8283 Begin.get() != S->getBeginStmt() || 8284 End.get() != S->getEndStmt() || 8285 Cond.get() != S->getCond() || 8286 Inc.get() != S->getInc() || 8287 LoopVar.get() != S->getLoopVarStmt()) { 8288 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8289 S->getCoawaitLoc(), Init.get(), 8290 S->getColonLoc(), Range.get(), 8291 Begin.get(), End.get(), 8292 Cond.get(), 8293 Inc.get(), LoopVar.get(), 8294 S->getRParenLoc()); 8295 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8296 // Might not have attached any initializer to the loop variable. 8297 getSema().ActOnInitializerError( 8298 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8299 return StmtError(); 8300 } 8301 } 8302 8303 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8304 if (Body.isInvalid()) 8305 return StmtError(); 8306 8307 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8308 // it now so we have a new statement to attach the body to. 8309 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8310 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8311 S->getCoawaitLoc(), Init.get(), 8312 S->getColonLoc(), Range.get(), 8313 Begin.get(), End.get(), 8314 Cond.get(), 8315 Inc.get(), LoopVar.get(), 8316 S->getRParenLoc()); 8317 if (NewStmt.isInvalid()) 8318 return StmtError(); 8319 } 8320 8321 if (NewStmt.get() == S) 8322 return S; 8323 8324 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8325 } 8326 8327 template<typename Derived> 8328 StmtResult 8329 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8330 MSDependentExistsStmt *S) { 8331 // Transform the nested-name-specifier, if any. 8332 NestedNameSpecifierLoc QualifierLoc; 8333 if (S->getQualifierLoc()) { 8334 QualifierLoc 8335 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8336 if (!QualifierLoc) 8337 return StmtError(); 8338 } 8339 8340 // Transform the declaration name. 8341 DeclarationNameInfo NameInfo = S->getNameInfo(); 8342 if (NameInfo.getName()) { 8343 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8344 if (!NameInfo.getName()) 8345 return StmtError(); 8346 } 8347 8348 // Check whether anything changed. 8349 if (!getDerived().AlwaysRebuild() && 8350 QualifierLoc == S->getQualifierLoc() && 8351 NameInfo.getName() == S->getNameInfo().getName()) 8352 return S; 8353 8354 // Determine whether this name exists, if we can. 8355 CXXScopeSpec SS; 8356 SS.Adopt(QualifierLoc); 8357 bool Dependent = false; 8358 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8359 case Sema::IER_Exists: 8360 if (S->isIfExists()) 8361 break; 8362 8363 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8364 8365 case Sema::IER_DoesNotExist: 8366 if (S->isIfNotExists()) 8367 break; 8368 8369 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8370 8371 case Sema::IER_Dependent: 8372 Dependent = true; 8373 break; 8374 8375 case Sema::IER_Error: 8376 return StmtError(); 8377 } 8378 8379 // We need to continue with the instantiation, so do so now. 8380 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8381 if (SubStmt.isInvalid()) 8382 return StmtError(); 8383 8384 // If we have resolved the name, just transform to the substatement. 8385 if (!Dependent) 8386 return SubStmt; 8387 8388 // The name is still dependent, so build a dependent expression again. 8389 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8390 S->isIfExists(), 8391 QualifierLoc, 8392 NameInfo, 8393 SubStmt.get()); 8394 } 8395 8396 template<typename Derived> 8397 ExprResult 8398 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8399 NestedNameSpecifierLoc QualifierLoc; 8400 if (E->getQualifierLoc()) { 8401 QualifierLoc 8402 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8403 if (!QualifierLoc) 8404 return ExprError(); 8405 } 8406 8407 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8408 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8409 if (!PD) 8410 return ExprError(); 8411 8412 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8413 if (Base.isInvalid()) 8414 return ExprError(); 8415 8416 return new (SemaRef.getASTContext()) 8417 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8418 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8419 QualifierLoc, E->getMemberLoc()); 8420 } 8421 8422 template <typename Derived> 8423 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8424 MSPropertySubscriptExpr *E) { 8425 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8426 if (BaseRes.isInvalid()) 8427 return ExprError(); 8428 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8429 if (IdxRes.isInvalid()) 8430 return ExprError(); 8431 8432 if (!getDerived().AlwaysRebuild() && 8433 BaseRes.get() == E->getBase() && 8434 IdxRes.get() == E->getIdx()) 8435 return E; 8436 8437 return getDerived().RebuildArraySubscriptExpr( 8438 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8439 } 8440 8441 template <typename Derived> 8442 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8443 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8444 if (TryBlock.isInvalid()) 8445 return StmtError(); 8446 8447 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8448 if (Handler.isInvalid()) 8449 return StmtError(); 8450 8451 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8452 Handler.get() == S->getHandler()) 8453 return S; 8454 8455 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8456 TryBlock.get(), Handler.get()); 8457 } 8458 8459 template <typename Derived> 8460 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8461 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8462 if (Block.isInvalid()) 8463 return StmtError(); 8464 8465 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8466 } 8467 8468 template <typename Derived> 8469 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8470 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8471 if (FilterExpr.isInvalid()) 8472 return StmtError(); 8473 8474 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8475 if (Block.isInvalid()) 8476 return StmtError(); 8477 8478 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8479 Block.get()); 8480 } 8481 8482 template <typename Derived> 8483 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8484 if (isa<SEHFinallyStmt>(Handler)) 8485 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8486 else 8487 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8488 } 8489 8490 template<typename Derived> 8491 StmtResult 8492 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8493 return S; 8494 } 8495 8496 //===----------------------------------------------------------------------===// 8497 // OpenMP directive transformation 8498 //===----------------------------------------------------------------------===// 8499 8500 template <typename Derived> 8501 StmtResult 8502 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) { 8503 // OMPCanonicalLoops are eliminated during transformation, since they will be 8504 // recomputed by semantic analysis of the associated OMPLoopBasedDirective 8505 // after transformation. 8506 return getDerived().TransformStmt(L->getLoopStmt()); 8507 } 8508 8509 template <typename Derived> 8510 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8511 OMPExecutableDirective *D) { 8512 8513 // Transform the clauses 8514 llvm::SmallVector<OMPClause *, 16> TClauses; 8515 ArrayRef<OMPClause *> Clauses = D->clauses(); 8516 TClauses.reserve(Clauses.size()); 8517 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8518 I != E; ++I) { 8519 if (*I) { 8520 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8521 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8522 getDerived().getSema().EndOpenMPClause(); 8523 if (Clause) 8524 TClauses.push_back(Clause); 8525 } else { 8526 TClauses.push_back(nullptr); 8527 } 8528 } 8529 StmtResult AssociatedStmt; 8530 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8531 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8532 /*CurScope=*/nullptr); 8533 StmtResult Body; 8534 { 8535 Sema::CompoundScopeRAII CompoundScope(getSema()); 8536 Stmt *CS; 8537 if (D->getDirectiveKind() == OMPD_atomic || 8538 D->getDirectiveKind() == OMPD_critical || 8539 D->getDirectiveKind() == OMPD_section || 8540 D->getDirectiveKind() == OMPD_master) 8541 CS = D->getAssociatedStmt(); 8542 else 8543 CS = D->getRawStmt(); 8544 Body = getDerived().TransformStmt(CS); 8545 if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) && 8546 getSema().getLangOpts().OpenMPIRBuilder) 8547 Body = getDerived().RebuildOMPCanonicalLoop(Body.get()); 8548 } 8549 AssociatedStmt = 8550 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8551 if (AssociatedStmt.isInvalid()) { 8552 return StmtError(); 8553 } 8554 } 8555 if (TClauses.size() != Clauses.size()) { 8556 return StmtError(); 8557 } 8558 8559 // Transform directive name for 'omp critical' directive. 8560 DeclarationNameInfo DirName; 8561 if (D->getDirectiveKind() == OMPD_critical) { 8562 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8563 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8564 } 8565 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8566 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8567 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8568 } else if (D->getDirectiveKind() == OMPD_cancel) { 8569 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8570 } 8571 8572 return getDerived().RebuildOMPExecutableDirective( 8573 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8574 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8575 } 8576 8577 template <typename Derived> 8578 StmtResult 8579 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) { 8580 // TODO: Fix This 8581 SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported) 8582 << getOpenMPDirectiveName(D->getDirectiveKind()); 8583 return StmtError(); 8584 } 8585 8586 template <typename Derived> 8587 StmtResult 8588 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8589 DeclarationNameInfo DirName; 8590 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8591 D->getBeginLoc()); 8592 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8593 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8594 return Res; 8595 } 8596 8597 template <typename Derived> 8598 StmtResult 8599 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8600 DeclarationNameInfo DirName; 8601 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8602 D->getBeginLoc()); 8603 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8604 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8605 return Res; 8606 } 8607 8608 template <typename Derived> 8609 StmtResult 8610 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) { 8611 DeclarationNameInfo DirName; 8612 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8613 nullptr, D->getBeginLoc()); 8614 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8615 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8616 return Res; 8617 } 8618 8619 template <typename Derived> 8620 StmtResult 8621 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) { 8622 DeclarationNameInfo DirName; 8623 getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName, 8624 nullptr, D->getBeginLoc()); 8625 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8626 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8627 return Res; 8628 } 8629 8630 template <typename Derived> 8631 StmtResult 8632 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8633 DeclarationNameInfo DirName; 8634 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8635 D->getBeginLoc()); 8636 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8637 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8638 return Res; 8639 } 8640 8641 template <typename Derived> 8642 StmtResult 8643 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8644 DeclarationNameInfo DirName; 8645 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8646 D->getBeginLoc()); 8647 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8648 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8649 return Res; 8650 } 8651 8652 template <typename Derived> 8653 StmtResult 8654 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8655 DeclarationNameInfo DirName; 8656 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8657 D->getBeginLoc()); 8658 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8659 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8660 return Res; 8661 } 8662 8663 template <typename Derived> 8664 StmtResult 8665 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8666 DeclarationNameInfo DirName; 8667 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8668 D->getBeginLoc()); 8669 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8670 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8671 return Res; 8672 } 8673 8674 template <typename Derived> 8675 StmtResult 8676 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8677 DeclarationNameInfo DirName; 8678 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8679 D->getBeginLoc()); 8680 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8681 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8682 return Res; 8683 } 8684 8685 template <typename Derived> 8686 StmtResult 8687 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8688 DeclarationNameInfo DirName; 8689 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8690 D->getBeginLoc()); 8691 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8692 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8693 return Res; 8694 } 8695 8696 template <typename Derived> 8697 StmtResult 8698 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8699 getDerived().getSema().StartOpenMPDSABlock( 8700 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8701 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8702 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8703 return Res; 8704 } 8705 8706 template <typename Derived> 8707 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8708 OMPParallelForDirective *D) { 8709 DeclarationNameInfo DirName; 8710 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8711 nullptr, D->getBeginLoc()); 8712 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8713 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8714 return Res; 8715 } 8716 8717 template <typename Derived> 8718 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8719 OMPParallelForSimdDirective *D) { 8720 DeclarationNameInfo DirName; 8721 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8722 nullptr, D->getBeginLoc()); 8723 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8724 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8725 return Res; 8726 } 8727 8728 template <typename Derived> 8729 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8730 OMPParallelMasterDirective *D) { 8731 DeclarationNameInfo DirName; 8732 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8733 nullptr, D->getBeginLoc()); 8734 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8735 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8736 return Res; 8737 } 8738 8739 template <typename Derived> 8740 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8741 OMPParallelSectionsDirective *D) { 8742 DeclarationNameInfo DirName; 8743 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8744 nullptr, D->getBeginLoc()); 8745 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8746 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8747 return Res; 8748 } 8749 8750 template <typename Derived> 8751 StmtResult 8752 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8753 DeclarationNameInfo DirName; 8754 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8755 D->getBeginLoc()); 8756 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8757 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8758 return Res; 8759 } 8760 8761 template <typename Derived> 8762 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8763 OMPTaskyieldDirective *D) { 8764 DeclarationNameInfo DirName; 8765 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8766 D->getBeginLoc()); 8767 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8768 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8769 return Res; 8770 } 8771 8772 template <typename Derived> 8773 StmtResult 8774 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8775 DeclarationNameInfo DirName; 8776 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8777 D->getBeginLoc()); 8778 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8779 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8780 return Res; 8781 } 8782 8783 template <typename Derived> 8784 StmtResult 8785 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8786 DeclarationNameInfo DirName; 8787 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8788 D->getBeginLoc()); 8789 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8790 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8791 return Res; 8792 } 8793 8794 template <typename Derived> 8795 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8796 OMPTaskgroupDirective *D) { 8797 DeclarationNameInfo DirName; 8798 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8799 D->getBeginLoc()); 8800 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8801 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8802 return Res; 8803 } 8804 8805 template <typename Derived> 8806 StmtResult 8807 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8808 DeclarationNameInfo DirName; 8809 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8810 D->getBeginLoc()); 8811 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8812 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8813 return Res; 8814 } 8815 8816 template <typename Derived> 8817 StmtResult 8818 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8819 DeclarationNameInfo DirName; 8820 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8821 D->getBeginLoc()); 8822 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8823 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8824 return Res; 8825 } 8826 8827 template <typename Derived> 8828 StmtResult 8829 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8830 DeclarationNameInfo DirName; 8831 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8832 D->getBeginLoc()); 8833 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8834 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8835 return Res; 8836 } 8837 8838 template <typename Derived> 8839 StmtResult 8840 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8841 DeclarationNameInfo DirName; 8842 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8843 D->getBeginLoc()); 8844 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8845 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8846 return Res; 8847 } 8848 8849 template <typename Derived> 8850 StmtResult 8851 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8852 DeclarationNameInfo DirName; 8853 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8854 D->getBeginLoc()); 8855 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8856 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8857 return Res; 8858 } 8859 8860 template <typename Derived> 8861 StmtResult 8862 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8863 DeclarationNameInfo DirName; 8864 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8865 D->getBeginLoc()); 8866 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8867 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8868 return Res; 8869 } 8870 8871 template <typename Derived> 8872 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8873 OMPTargetDataDirective *D) { 8874 DeclarationNameInfo DirName; 8875 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8876 D->getBeginLoc()); 8877 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8878 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8879 return Res; 8880 } 8881 8882 template <typename Derived> 8883 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8884 OMPTargetEnterDataDirective *D) { 8885 DeclarationNameInfo DirName; 8886 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8887 nullptr, D->getBeginLoc()); 8888 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8889 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8890 return Res; 8891 } 8892 8893 template <typename Derived> 8894 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8895 OMPTargetExitDataDirective *D) { 8896 DeclarationNameInfo DirName; 8897 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8898 nullptr, D->getBeginLoc()); 8899 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8900 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8901 return Res; 8902 } 8903 8904 template <typename Derived> 8905 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8906 OMPTargetParallelDirective *D) { 8907 DeclarationNameInfo DirName; 8908 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8909 nullptr, D->getBeginLoc()); 8910 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8911 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8912 return Res; 8913 } 8914 8915 template <typename Derived> 8916 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8917 OMPTargetParallelForDirective *D) { 8918 DeclarationNameInfo DirName; 8919 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8920 nullptr, D->getBeginLoc()); 8921 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8922 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8923 return Res; 8924 } 8925 8926 template <typename Derived> 8927 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8928 OMPTargetUpdateDirective *D) { 8929 DeclarationNameInfo DirName; 8930 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8931 nullptr, D->getBeginLoc()); 8932 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8933 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8934 return Res; 8935 } 8936 8937 template <typename Derived> 8938 StmtResult 8939 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8940 DeclarationNameInfo DirName; 8941 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8942 D->getBeginLoc()); 8943 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8944 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8945 return Res; 8946 } 8947 8948 template <typename Derived> 8949 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8950 OMPCancellationPointDirective *D) { 8951 DeclarationNameInfo DirName; 8952 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8953 nullptr, D->getBeginLoc()); 8954 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8955 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8956 return Res; 8957 } 8958 8959 template <typename Derived> 8960 StmtResult 8961 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8962 DeclarationNameInfo DirName; 8963 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8964 D->getBeginLoc()); 8965 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8966 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8967 return Res; 8968 } 8969 8970 template <typename Derived> 8971 StmtResult 8972 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8973 DeclarationNameInfo DirName; 8974 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8975 D->getBeginLoc()); 8976 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8977 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8978 return Res; 8979 } 8980 8981 template <typename Derived> 8982 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8983 OMPTaskLoopSimdDirective *D) { 8984 DeclarationNameInfo DirName; 8985 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8986 nullptr, D->getBeginLoc()); 8987 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8988 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8989 return Res; 8990 } 8991 8992 template <typename Derived> 8993 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8994 OMPMasterTaskLoopDirective *D) { 8995 DeclarationNameInfo DirName; 8996 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8997 nullptr, D->getBeginLoc()); 8998 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8999 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9000 return Res; 9001 } 9002 9003 template <typename Derived> 9004 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 9005 OMPMasterTaskLoopSimdDirective *D) { 9006 DeclarationNameInfo DirName; 9007 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 9008 nullptr, D->getBeginLoc()); 9009 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9010 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9011 return Res; 9012 } 9013 9014 template <typename Derived> 9015 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 9016 OMPParallelMasterTaskLoopDirective *D) { 9017 DeclarationNameInfo DirName; 9018 getDerived().getSema().StartOpenMPDSABlock( 9019 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 9020 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9021 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9022 return Res; 9023 } 9024 9025 template <typename Derived> 9026 StmtResult 9027 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 9028 OMPParallelMasterTaskLoopSimdDirective *D) { 9029 DeclarationNameInfo DirName; 9030 getDerived().getSema().StartOpenMPDSABlock( 9031 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 9032 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9033 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9034 return Res; 9035 } 9036 9037 template <typename Derived> 9038 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 9039 OMPDistributeDirective *D) { 9040 DeclarationNameInfo DirName; 9041 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 9042 D->getBeginLoc()); 9043 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9044 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9045 return Res; 9046 } 9047 9048 template <typename Derived> 9049 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 9050 OMPDistributeParallelForDirective *D) { 9051 DeclarationNameInfo DirName; 9052 getDerived().getSema().StartOpenMPDSABlock( 9053 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9054 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9055 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9056 return Res; 9057 } 9058 9059 template <typename Derived> 9060 StmtResult 9061 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 9062 OMPDistributeParallelForSimdDirective *D) { 9063 DeclarationNameInfo DirName; 9064 getDerived().getSema().StartOpenMPDSABlock( 9065 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9066 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9067 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9068 return Res; 9069 } 9070 9071 template <typename Derived> 9072 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 9073 OMPDistributeSimdDirective *D) { 9074 DeclarationNameInfo DirName; 9075 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 9076 nullptr, D->getBeginLoc()); 9077 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9078 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9079 return Res; 9080 } 9081 9082 template <typename Derived> 9083 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 9084 OMPTargetParallelForSimdDirective *D) { 9085 DeclarationNameInfo DirName; 9086 getDerived().getSema().StartOpenMPDSABlock( 9087 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 9088 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9089 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9090 return Res; 9091 } 9092 9093 template <typename Derived> 9094 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 9095 OMPTargetSimdDirective *D) { 9096 DeclarationNameInfo DirName; 9097 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 9098 D->getBeginLoc()); 9099 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9100 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9101 return Res; 9102 } 9103 9104 template <typename Derived> 9105 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 9106 OMPTeamsDistributeDirective *D) { 9107 DeclarationNameInfo DirName; 9108 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 9109 nullptr, D->getBeginLoc()); 9110 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9111 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9112 return Res; 9113 } 9114 9115 template <typename Derived> 9116 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 9117 OMPTeamsDistributeSimdDirective *D) { 9118 DeclarationNameInfo DirName; 9119 getDerived().getSema().StartOpenMPDSABlock( 9120 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9121 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9122 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9123 return Res; 9124 } 9125 9126 template <typename Derived> 9127 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 9128 OMPTeamsDistributeParallelForSimdDirective *D) { 9129 DeclarationNameInfo DirName; 9130 getDerived().getSema().StartOpenMPDSABlock( 9131 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 9132 D->getBeginLoc()); 9133 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9134 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9135 return Res; 9136 } 9137 9138 template <typename Derived> 9139 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 9140 OMPTeamsDistributeParallelForDirective *D) { 9141 DeclarationNameInfo DirName; 9142 getDerived().getSema().StartOpenMPDSABlock( 9143 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 9144 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9145 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9146 return Res; 9147 } 9148 9149 template <typename Derived> 9150 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 9151 OMPTargetTeamsDirective *D) { 9152 DeclarationNameInfo DirName; 9153 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 9154 nullptr, D->getBeginLoc()); 9155 auto Res = getDerived().TransformOMPExecutableDirective(D); 9156 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9157 return Res; 9158 } 9159 9160 template <typename Derived> 9161 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 9162 OMPTargetTeamsDistributeDirective *D) { 9163 DeclarationNameInfo DirName; 9164 getDerived().getSema().StartOpenMPDSABlock( 9165 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 9166 auto Res = getDerived().TransformOMPExecutableDirective(D); 9167 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9168 return Res; 9169 } 9170 9171 template <typename Derived> 9172 StmtResult 9173 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 9174 OMPTargetTeamsDistributeParallelForDirective *D) { 9175 DeclarationNameInfo DirName; 9176 getDerived().getSema().StartOpenMPDSABlock( 9177 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 9178 D->getBeginLoc()); 9179 auto Res = getDerived().TransformOMPExecutableDirective(D); 9180 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9181 return Res; 9182 } 9183 9184 template <typename Derived> 9185 StmtResult TreeTransform<Derived>:: 9186 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 9187 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 9188 DeclarationNameInfo DirName; 9189 getDerived().getSema().StartOpenMPDSABlock( 9190 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 9191 D->getBeginLoc()); 9192 auto Res = getDerived().TransformOMPExecutableDirective(D); 9193 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9194 return Res; 9195 } 9196 9197 template <typename Derived> 9198 StmtResult 9199 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 9200 OMPTargetTeamsDistributeSimdDirective *D) { 9201 DeclarationNameInfo DirName; 9202 getDerived().getSema().StartOpenMPDSABlock( 9203 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 9204 auto Res = getDerived().TransformOMPExecutableDirective(D); 9205 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9206 return Res; 9207 } 9208 9209 template <typename Derived> 9210 StmtResult 9211 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) { 9212 DeclarationNameInfo DirName; 9213 getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr, 9214 D->getBeginLoc()); 9215 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9216 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9217 return Res; 9218 } 9219 9220 template <typename Derived> 9221 StmtResult 9222 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) { 9223 DeclarationNameInfo DirName; 9224 getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr, 9225 D->getBeginLoc()); 9226 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9227 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9228 return Res; 9229 } 9230 9231 template <typename Derived> 9232 StmtResult 9233 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) { 9234 DeclarationNameInfo DirName; 9235 getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr, 9236 D->getBeginLoc()); 9237 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9238 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9239 return Res; 9240 } 9241 9242 template <typename Derived> 9243 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective( 9244 OMPGenericLoopDirective *D) { 9245 DeclarationNameInfo DirName; 9246 getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr, 9247 D->getBeginLoc()); 9248 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9249 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9250 return Res; 9251 } 9252 9253 template <typename Derived> 9254 StmtResult TreeTransform<Derived>::TransformOMPTeamsGenericLoopDirective( 9255 OMPTeamsGenericLoopDirective *D) { 9256 DeclarationNameInfo DirName; 9257 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_loop, DirName, nullptr, 9258 D->getBeginLoc()); 9259 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9260 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9261 return Res; 9262 } 9263 9264 template <typename Derived> 9265 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsGenericLoopDirective( 9266 OMPTargetTeamsGenericLoopDirective *D) { 9267 DeclarationNameInfo DirName; 9268 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_loop, DirName, 9269 nullptr, D->getBeginLoc()); 9270 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9271 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9272 return Res; 9273 } 9274 9275 template <typename Derived> 9276 StmtResult TreeTransform<Derived>::TransformOMPParallelGenericLoopDirective( 9277 OMPParallelGenericLoopDirective *D) { 9278 DeclarationNameInfo DirName; 9279 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_loop, DirName, 9280 nullptr, D->getBeginLoc()); 9281 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9282 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9283 return Res; 9284 } 9285 9286 template <typename Derived> 9287 StmtResult 9288 TreeTransform<Derived>::TransformOMPTargetParallelGenericLoopDirective( 9289 OMPTargetParallelGenericLoopDirective *D) { 9290 DeclarationNameInfo DirName; 9291 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_loop, DirName, 9292 nullptr, D->getBeginLoc()); 9293 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 9294 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 9295 return Res; 9296 } 9297 9298 //===----------------------------------------------------------------------===// 9299 // OpenMP clause transformation 9300 //===----------------------------------------------------------------------===// 9301 template <typename Derived> 9302 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 9303 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9304 if (Cond.isInvalid()) 9305 return nullptr; 9306 return getDerived().RebuildOMPIfClause( 9307 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 9308 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9309 } 9310 9311 template <typename Derived> 9312 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 9313 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9314 if (Cond.isInvalid()) 9315 return nullptr; 9316 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9317 C->getLParenLoc(), C->getEndLoc()); 9318 } 9319 9320 template <typename Derived> 9321 OMPClause * 9322 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9323 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9324 if (NumThreads.isInvalid()) 9325 return nullptr; 9326 return getDerived().RebuildOMPNumThreadsClause( 9327 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9328 } 9329 9330 template <typename Derived> 9331 OMPClause * 9332 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9333 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9334 if (E.isInvalid()) 9335 return nullptr; 9336 return getDerived().RebuildOMPSafelenClause( 9337 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9338 } 9339 9340 template <typename Derived> 9341 OMPClause * 9342 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9343 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9344 if (E.isInvalid()) 9345 return nullptr; 9346 return getDerived().RebuildOMPAllocatorClause( 9347 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9348 } 9349 9350 template <typename Derived> 9351 OMPClause * 9352 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9353 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9354 if (E.isInvalid()) 9355 return nullptr; 9356 return getDerived().RebuildOMPSimdlenClause( 9357 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9358 } 9359 9360 template <typename Derived> 9361 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) { 9362 SmallVector<Expr *, 4> TransformedSizes; 9363 TransformedSizes.reserve(C->getNumSizes()); 9364 bool Changed = false; 9365 for (Expr *E : C->getSizesRefs()) { 9366 if (!E) { 9367 TransformedSizes.push_back(nullptr); 9368 continue; 9369 } 9370 9371 ExprResult T = getDerived().TransformExpr(E); 9372 if (T.isInvalid()) 9373 return nullptr; 9374 if (E != T.get()) 9375 Changed = true; 9376 TransformedSizes.push_back(T.get()); 9377 } 9378 9379 if (!Changed && !getDerived().AlwaysRebuild()) 9380 return C; 9381 return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(), 9382 C->getLParenLoc(), C->getEndLoc()); 9383 } 9384 9385 template <typename Derived> 9386 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) { 9387 if (!getDerived().AlwaysRebuild()) 9388 return C; 9389 return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc()); 9390 } 9391 9392 template <typename Derived> 9393 OMPClause * 9394 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) { 9395 ExprResult T = getDerived().TransformExpr(C->getFactor()); 9396 if (T.isInvalid()) 9397 return nullptr; 9398 Expr *Factor = T.get(); 9399 bool Changed = Factor != C->getFactor(); 9400 9401 if (!Changed && !getDerived().AlwaysRebuild()) 9402 return C; 9403 return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(), 9404 C->getEndLoc()); 9405 } 9406 9407 template <typename Derived> 9408 OMPClause * 9409 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9410 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9411 if (E.isInvalid()) 9412 return nullptr; 9413 return getDerived().RebuildOMPCollapseClause( 9414 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9415 } 9416 9417 template <typename Derived> 9418 OMPClause * 9419 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9420 return getDerived().RebuildOMPDefaultClause( 9421 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9422 C->getLParenLoc(), C->getEndLoc()); 9423 } 9424 9425 template <typename Derived> 9426 OMPClause * 9427 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9428 return getDerived().RebuildOMPProcBindClause( 9429 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9430 C->getLParenLoc(), C->getEndLoc()); 9431 } 9432 9433 template <typename Derived> 9434 OMPClause * 9435 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9436 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9437 if (E.isInvalid()) 9438 return nullptr; 9439 return getDerived().RebuildOMPScheduleClause( 9440 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9441 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9442 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9443 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9444 } 9445 9446 template <typename Derived> 9447 OMPClause * 9448 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9449 ExprResult E; 9450 if (auto *Num = C->getNumForLoops()) { 9451 E = getDerived().TransformExpr(Num); 9452 if (E.isInvalid()) 9453 return nullptr; 9454 } 9455 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9456 C->getLParenLoc(), E.get()); 9457 } 9458 9459 template <typename Derived> 9460 OMPClause * 9461 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9462 ExprResult E; 9463 if (Expr *Evt = C->getEventHandler()) { 9464 E = getDerived().TransformExpr(Evt); 9465 if (E.isInvalid()) 9466 return nullptr; 9467 } 9468 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9469 C->getLParenLoc(), C->getEndLoc()); 9470 } 9471 9472 template <typename Derived> 9473 OMPClause * 9474 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9475 // No need to rebuild this clause, no template-dependent parameters. 9476 return C; 9477 } 9478 9479 template <typename Derived> 9480 OMPClause * 9481 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9482 // No need to rebuild this clause, no template-dependent parameters. 9483 return C; 9484 } 9485 9486 template <typename Derived> 9487 OMPClause * 9488 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9489 // No need to rebuild this clause, no template-dependent parameters. 9490 return C; 9491 } 9492 9493 template <typename Derived> 9494 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9495 // No need to rebuild this clause, no template-dependent parameters. 9496 return C; 9497 } 9498 9499 template <typename Derived> 9500 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9501 // No need to rebuild this clause, no template-dependent parameters. 9502 return C; 9503 } 9504 9505 template <typename Derived> 9506 OMPClause * 9507 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9508 // No need to rebuild this clause, no template-dependent parameters. 9509 return C; 9510 } 9511 9512 template <typename Derived> 9513 OMPClause * 9514 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9515 // No need to rebuild this clause, no template-dependent parameters. 9516 return C; 9517 } 9518 9519 template <typename Derived> 9520 OMPClause * 9521 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) { 9522 // No need to rebuild this clause, no template-dependent parameters. 9523 return C; 9524 } 9525 9526 template <typename Derived> 9527 OMPClause * 9528 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9529 // No need to rebuild this clause, no template-dependent parameters. 9530 return C; 9531 } 9532 9533 template <typename Derived> 9534 OMPClause * 9535 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9536 // No need to rebuild this clause, no template-dependent parameters. 9537 return C; 9538 } 9539 9540 template <typename Derived> 9541 OMPClause * 9542 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9543 // No need to rebuild this clause, no template-dependent parameters. 9544 return C; 9545 } 9546 9547 template <typename Derived> 9548 OMPClause * 9549 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9550 // No need to rebuild this clause, no template-dependent parameters. 9551 return C; 9552 } 9553 9554 template <typename Derived> 9555 OMPClause * 9556 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9557 // No need to rebuild this clause, no template-dependent parameters. 9558 return C; 9559 } 9560 9561 template <typename Derived> 9562 OMPClause * 9563 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9564 // No need to rebuild this clause, no template-dependent parameters. 9565 return C; 9566 } 9567 9568 template <typename Derived> 9569 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9570 // No need to rebuild this clause, no template-dependent parameters. 9571 return C; 9572 } 9573 9574 template <typename Derived> 9575 OMPClause * 9576 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9577 // No need to rebuild this clause, no template-dependent parameters. 9578 return C; 9579 } 9580 9581 template <typename Derived> 9582 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) { 9583 ExprResult IVR = getDerived().TransformExpr(C->getInteropVar()); 9584 if (IVR.isInvalid()) 9585 return nullptr; 9586 9587 llvm::SmallVector<Expr *, 8> PrefExprs; 9588 PrefExprs.reserve(C->varlist_size() - 1); 9589 for (Expr *E : llvm::drop_begin(C->varlists())) { 9590 ExprResult ER = getDerived().TransformExpr(cast<Expr>(E)); 9591 if (ER.isInvalid()) 9592 return nullptr; 9593 PrefExprs.push_back(ER.get()); 9594 } 9595 return getDerived().RebuildOMPInitClause( 9596 IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(), 9597 C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc()); 9598 } 9599 9600 template <typename Derived> 9601 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) { 9602 ExprResult ER = getDerived().TransformExpr(C->getInteropVar()); 9603 if (ER.isInvalid()) 9604 return nullptr; 9605 return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(), 9606 C->getLParenLoc(), C->getVarLoc(), 9607 C->getEndLoc()); 9608 } 9609 9610 template <typename Derived> 9611 OMPClause * 9612 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9613 ExprResult ER; 9614 if (Expr *IV = C->getInteropVar()) { 9615 ER = getDerived().TransformExpr(IV); 9616 if (ER.isInvalid()) 9617 return nullptr; 9618 } 9619 return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(), 9620 C->getLParenLoc(), C->getVarLoc(), 9621 C->getEndLoc()); 9622 } 9623 9624 template <typename Derived> 9625 OMPClause * 9626 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) { 9627 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9628 if (Cond.isInvalid()) 9629 return nullptr; 9630 return getDerived().RebuildOMPNovariantsClause( 9631 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9632 } 9633 9634 template <typename Derived> 9635 OMPClause * 9636 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) { 9637 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 9638 if (Cond.isInvalid()) 9639 return nullptr; 9640 return getDerived().RebuildOMPNocontextClause( 9641 Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9642 } 9643 9644 template <typename Derived> 9645 OMPClause * 9646 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) { 9647 ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID()); 9648 if (ThreadID.isInvalid()) 9649 return nullptr; 9650 return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(), 9651 C->getLParenLoc(), C->getEndLoc()); 9652 } 9653 9654 template <typename Derived> 9655 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) { 9656 ExprResult E = getDerived().TransformExpr(C->getAlignment()); 9657 if (E.isInvalid()) 9658 return nullptr; 9659 return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(), 9660 C->getLParenLoc(), C->getEndLoc()); 9661 } 9662 9663 template <typename Derived> 9664 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9665 OMPUnifiedAddressClause *C) { 9666 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9667 } 9668 9669 template <typename Derived> 9670 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9671 OMPUnifiedSharedMemoryClause *C) { 9672 llvm_unreachable( 9673 "unified_shared_memory clause cannot appear in dependent context"); 9674 } 9675 9676 template <typename Derived> 9677 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9678 OMPReverseOffloadClause *C) { 9679 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9680 } 9681 9682 template <typename Derived> 9683 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9684 OMPDynamicAllocatorsClause *C) { 9685 llvm_unreachable( 9686 "dynamic_allocators clause cannot appear in dependent context"); 9687 } 9688 9689 template <typename Derived> 9690 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9691 OMPAtomicDefaultMemOrderClause *C) { 9692 llvm_unreachable( 9693 "atomic_default_mem_order clause cannot appear in dependent context"); 9694 } 9695 9696 template <typename Derived> 9697 OMPClause * 9698 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9699 llvm::SmallVector<Expr *, 16> Vars; 9700 Vars.reserve(C->varlist_size()); 9701 for (auto *VE : C->varlists()) { 9702 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9703 if (EVar.isInvalid()) 9704 return nullptr; 9705 Vars.push_back(EVar.get()); 9706 } 9707 return getDerived().RebuildOMPPrivateClause( 9708 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9709 } 9710 9711 template <typename Derived> 9712 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9713 OMPFirstprivateClause *C) { 9714 llvm::SmallVector<Expr *, 16> Vars; 9715 Vars.reserve(C->varlist_size()); 9716 for (auto *VE : C->varlists()) { 9717 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9718 if (EVar.isInvalid()) 9719 return nullptr; 9720 Vars.push_back(EVar.get()); 9721 } 9722 return getDerived().RebuildOMPFirstprivateClause( 9723 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9724 } 9725 9726 template <typename Derived> 9727 OMPClause * 9728 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9729 llvm::SmallVector<Expr *, 16> Vars; 9730 Vars.reserve(C->varlist_size()); 9731 for (auto *VE : C->varlists()) { 9732 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9733 if (EVar.isInvalid()) 9734 return nullptr; 9735 Vars.push_back(EVar.get()); 9736 } 9737 return getDerived().RebuildOMPLastprivateClause( 9738 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9739 C->getLParenLoc(), C->getEndLoc()); 9740 } 9741 9742 template <typename Derived> 9743 OMPClause * 9744 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9745 llvm::SmallVector<Expr *, 16> Vars; 9746 Vars.reserve(C->varlist_size()); 9747 for (auto *VE : C->varlists()) { 9748 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9749 if (EVar.isInvalid()) 9750 return nullptr; 9751 Vars.push_back(EVar.get()); 9752 } 9753 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9754 C->getLParenLoc(), C->getEndLoc()); 9755 } 9756 9757 template <typename Derived> 9758 OMPClause * 9759 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9760 llvm::SmallVector<Expr *, 16> Vars; 9761 Vars.reserve(C->varlist_size()); 9762 for (auto *VE : C->varlists()) { 9763 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9764 if (EVar.isInvalid()) 9765 return nullptr; 9766 Vars.push_back(EVar.get()); 9767 } 9768 CXXScopeSpec ReductionIdScopeSpec; 9769 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9770 9771 DeclarationNameInfo NameInfo = C->getNameInfo(); 9772 if (NameInfo.getName()) { 9773 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9774 if (!NameInfo.getName()) 9775 return nullptr; 9776 } 9777 // Build a list of all UDR decls with the same names ranged by the Scopes. 9778 // The Scope boundary is a duplication of the previous decl. 9779 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9780 for (auto *E : C->reduction_ops()) { 9781 // Transform all the decls. 9782 if (E) { 9783 auto *ULE = cast<UnresolvedLookupExpr>(E); 9784 UnresolvedSet<8> Decls; 9785 for (auto *D : ULE->decls()) { 9786 NamedDecl *InstD = 9787 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9788 Decls.addDecl(InstD, InstD->getAccess()); 9789 } 9790 UnresolvedReductions.push_back( 9791 UnresolvedLookupExpr::Create( 9792 SemaRef.Context, /*NamingClass=*/nullptr, 9793 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9794 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9795 Decls.begin(), Decls.end())); 9796 } else 9797 UnresolvedReductions.push_back(nullptr); 9798 } 9799 return getDerived().RebuildOMPReductionClause( 9800 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9801 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9802 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9803 } 9804 9805 template <typename Derived> 9806 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9807 OMPTaskReductionClause *C) { 9808 llvm::SmallVector<Expr *, 16> Vars; 9809 Vars.reserve(C->varlist_size()); 9810 for (auto *VE : C->varlists()) { 9811 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9812 if (EVar.isInvalid()) 9813 return nullptr; 9814 Vars.push_back(EVar.get()); 9815 } 9816 CXXScopeSpec ReductionIdScopeSpec; 9817 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9818 9819 DeclarationNameInfo NameInfo = C->getNameInfo(); 9820 if (NameInfo.getName()) { 9821 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9822 if (!NameInfo.getName()) 9823 return nullptr; 9824 } 9825 // Build a list of all UDR decls with the same names ranged by the Scopes. 9826 // The Scope boundary is a duplication of the previous decl. 9827 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9828 for (auto *E : C->reduction_ops()) { 9829 // Transform all the decls. 9830 if (E) { 9831 auto *ULE = cast<UnresolvedLookupExpr>(E); 9832 UnresolvedSet<8> Decls; 9833 for (auto *D : ULE->decls()) { 9834 NamedDecl *InstD = 9835 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9836 Decls.addDecl(InstD, InstD->getAccess()); 9837 } 9838 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9839 SemaRef.Context, /*NamingClass=*/nullptr, 9840 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9841 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9842 } else 9843 UnresolvedReductions.push_back(nullptr); 9844 } 9845 return getDerived().RebuildOMPTaskReductionClause( 9846 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9847 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9848 } 9849 9850 template <typename Derived> 9851 OMPClause * 9852 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9853 llvm::SmallVector<Expr *, 16> Vars; 9854 Vars.reserve(C->varlist_size()); 9855 for (auto *VE : C->varlists()) { 9856 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9857 if (EVar.isInvalid()) 9858 return nullptr; 9859 Vars.push_back(EVar.get()); 9860 } 9861 CXXScopeSpec ReductionIdScopeSpec; 9862 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9863 9864 DeclarationNameInfo NameInfo = C->getNameInfo(); 9865 if (NameInfo.getName()) { 9866 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9867 if (!NameInfo.getName()) 9868 return nullptr; 9869 } 9870 // Build a list of all UDR decls with the same names ranged by the Scopes. 9871 // The Scope boundary is a duplication of the previous decl. 9872 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9873 for (auto *E : C->reduction_ops()) { 9874 // Transform all the decls. 9875 if (E) { 9876 auto *ULE = cast<UnresolvedLookupExpr>(E); 9877 UnresolvedSet<8> Decls; 9878 for (auto *D : ULE->decls()) { 9879 NamedDecl *InstD = 9880 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9881 Decls.addDecl(InstD, InstD->getAccess()); 9882 } 9883 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9884 SemaRef.Context, /*NamingClass=*/nullptr, 9885 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9886 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9887 } else 9888 UnresolvedReductions.push_back(nullptr); 9889 } 9890 return getDerived().RebuildOMPInReductionClause( 9891 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9892 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9893 } 9894 9895 template <typename Derived> 9896 OMPClause * 9897 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9898 llvm::SmallVector<Expr *, 16> Vars; 9899 Vars.reserve(C->varlist_size()); 9900 for (auto *VE : C->varlists()) { 9901 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9902 if (EVar.isInvalid()) 9903 return nullptr; 9904 Vars.push_back(EVar.get()); 9905 } 9906 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9907 if (Step.isInvalid()) 9908 return nullptr; 9909 return getDerived().RebuildOMPLinearClause( 9910 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9911 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9912 } 9913 9914 template <typename Derived> 9915 OMPClause * 9916 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9917 llvm::SmallVector<Expr *, 16> Vars; 9918 Vars.reserve(C->varlist_size()); 9919 for (auto *VE : C->varlists()) { 9920 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9921 if (EVar.isInvalid()) 9922 return nullptr; 9923 Vars.push_back(EVar.get()); 9924 } 9925 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9926 if (Alignment.isInvalid()) 9927 return nullptr; 9928 return getDerived().RebuildOMPAlignedClause( 9929 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9930 C->getColonLoc(), C->getEndLoc()); 9931 } 9932 9933 template <typename Derived> 9934 OMPClause * 9935 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9936 llvm::SmallVector<Expr *, 16> Vars; 9937 Vars.reserve(C->varlist_size()); 9938 for (auto *VE : C->varlists()) { 9939 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9940 if (EVar.isInvalid()) 9941 return nullptr; 9942 Vars.push_back(EVar.get()); 9943 } 9944 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9945 C->getLParenLoc(), C->getEndLoc()); 9946 } 9947 9948 template <typename Derived> 9949 OMPClause * 9950 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9951 llvm::SmallVector<Expr *, 16> Vars; 9952 Vars.reserve(C->varlist_size()); 9953 for (auto *VE : C->varlists()) { 9954 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9955 if (EVar.isInvalid()) 9956 return nullptr; 9957 Vars.push_back(EVar.get()); 9958 } 9959 return getDerived().RebuildOMPCopyprivateClause( 9960 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9961 } 9962 9963 template <typename Derived> 9964 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9965 llvm::SmallVector<Expr *, 16> Vars; 9966 Vars.reserve(C->varlist_size()); 9967 for (auto *VE : C->varlists()) { 9968 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9969 if (EVar.isInvalid()) 9970 return nullptr; 9971 Vars.push_back(EVar.get()); 9972 } 9973 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9974 C->getLParenLoc(), C->getEndLoc()); 9975 } 9976 9977 template <typename Derived> 9978 OMPClause * 9979 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9980 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9981 if (E.isInvalid()) 9982 return nullptr; 9983 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9984 C->getLParenLoc(), C->getEndLoc()); 9985 } 9986 9987 template <typename Derived> 9988 OMPClause * 9989 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9990 llvm::SmallVector<Expr *, 16> Vars; 9991 Expr *DepModifier = C->getModifier(); 9992 if (DepModifier) { 9993 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9994 if (DepModRes.isInvalid()) 9995 return nullptr; 9996 DepModifier = DepModRes.get(); 9997 } 9998 Vars.reserve(C->varlist_size()); 9999 for (auto *VE : C->varlists()) { 10000 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10001 if (EVar.isInvalid()) 10002 return nullptr; 10003 Vars.push_back(EVar.get()); 10004 } 10005 return getDerived().RebuildOMPDependClause( 10006 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 10007 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 10008 C->getEndLoc()); 10009 } 10010 10011 template <typename Derived> 10012 OMPClause * 10013 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 10014 ExprResult E = getDerived().TransformExpr(C->getDevice()); 10015 if (E.isInvalid()) 10016 return nullptr; 10017 return getDerived().RebuildOMPDeviceClause( 10018 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10019 C->getModifierLoc(), C->getEndLoc()); 10020 } 10021 10022 template <typename Derived, class T> 10023 bool transformOMPMappableExprListClause( 10024 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 10025 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 10026 DeclarationNameInfo &MapperIdInfo, 10027 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 10028 // Transform expressions in the list. 10029 Vars.reserve(C->varlist_size()); 10030 for (auto *VE : C->varlists()) { 10031 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 10032 if (EVar.isInvalid()) 10033 return true; 10034 Vars.push_back(EVar.get()); 10035 } 10036 // Transform mapper scope specifier and identifier. 10037 NestedNameSpecifierLoc QualifierLoc; 10038 if (C->getMapperQualifierLoc()) { 10039 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 10040 C->getMapperQualifierLoc()); 10041 if (!QualifierLoc) 10042 return true; 10043 } 10044 MapperIdScopeSpec.Adopt(QualifierLoc); 10045 MapperIdInfo = C->getMapperIdInfo(); 10046 if (MapperIdInfo.getName()) { 10047 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 10048 if (!MapperIdInfo.getName()) 10049 return true; 10050 } 10051 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 10052 // the previous user-defined mapper lookup in dependent environment. 10053 for (auto *E : C->mapperlists()) { 10054 // Transform all the decls. 10055 if (E) { 10056 auto *ULE = cast<UnresolvedLookupExpr>(E); 10057 UnresolvedSet<8> Decls; 10058 for (auto *D : ULE->decls()) { 10059 NamedDecl *InstD = 10060 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 10061 Decls.addDecl(InstD, InstD->getAccess()); 10062 } 10063 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 10064 TT.getSema().Context, /*NamingClass=*/nullptr, 10065 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 10066 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 10067 Decls.end())); 10068 } else { 10069 UnresolvedMappers.push_back(nullptr); 10070 } 10071 } 10072 return false; 10073 } 10074 10075 template <typename Derived> 10076 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 10077 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10078 llvm::SmallVector<Expr *, 16> Vars; 10079 CXXScopeSpec MapperIdScopeSpec; 10080 DeclarationNameInfo MapperIdInfo; 10081 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10082 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 10083 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10084 return nullptr; 10085 return getDerived().RebuildOMPMapClause( 10086 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 10087 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 10088 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10089 } 10090 10091 template <typename Derived> 10092 OMPClause * 10093 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 10094 Expr *Allocator = C->getAllocator(); 10095 if (Allocator) { 10096 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 10097 if (AllocatorRes.isInvalid()) 10098 return nullptr; 10099 Allocator = AllocatorRes.get(); 10100 } 10101 llvm::SmallVector<Expr *, 16> Vars; 10102 Vars.reserve(C->varlist_size()); 10103 for (auto *VE : C->varlists()) { 10104 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10105 if (EVar.isInvalid()) 10106 return nullptr; 10107 Vars.push_back(EVar.get()); 10108 } 10109 return getDerived().RebuildOMPAllocateClause( 10110 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 10111 C->getEndLoc()); 10112 } 10113 10114 template <typename Derived> 10115 OMPClause * 10116 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 10117 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 10118 if (E.isInvalid()) 10119 return nullptr; 10120 return getDerived().RebuildOMPNumTeamsClause( 10121 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10122 } 10123 10124 template <typename Derived> 10125 OMPClause * 10126 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 10127 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 10128 if (E.isInvalid()) 10129 return nullptr; 10130 return getDerived().RebuildOMPThreadLimitClause( 10131 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10132 } 10133 10134 template <typename Derived> 10135 OMPClause * 10136 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 10137 ExprResult E = getDerived().TransformExpr(C->getPriority()); 10138 if (E.isInvalid()) 10139 return nullptr; 10140 return getDerived().RebuildOMPPriorityClause( 10141 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10142 } 10143 10144 template <typename Derived> 10145 OMPClause * 10146 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 10147 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 10148 if (E.isInvalid()) 10149 return nullptr; 10150 return getDerived().RebuildOMPGrainsizeClause( 10151 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10152 } 10153 10154 template <typename Derived> 10155 OMPClause * 10156 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 10157 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 10158 if (E.isInvalid()) 10159 return nullptr; 10160 return getDerived().RebuildOMPNumTasksClause( 10161 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10162 } 10163 10164 template <typename Derived> 10165 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 10166 ExprResult E = getDerived().TransformExpr(C->getHint()); 10167 if (E.isInvalid()) 10168 return nullptr; 10169 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 10170 C->getLParenLoc(), C->getEndLoc()); 10171 } 10172 10173 template <typename Derived> 10174 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 10175 OMPDistScheduleClause *C) { 10176 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 10177 if (E.isInvalid()) 10178 return nullptr; 10179 return getDerived().RebuildOMPDistScheduleClause( 10180 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 10181 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 10182 } 10183 10184 template <typename Derived> 10185 OMPClause * 10186 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 10187 // Rebuild Defaultmap Clause since we need to invoke the checking of 10188 // defaultmap(none:variable-category) after template initialization. 10189 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 10190 C->getDefaultmapKind(), 10191 C->getBeginLoc(), 10192 C->getLParenLoc(), 10193 C->getDefaultmapModifierLoc(), 10194 C->getDefaultmapKindLoc(), 10195 C->getEndLoc()); 10196 } 10197 10198 template <typename Derived> 10199 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 10200 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10201 llvm::SmallVector<Expr *, 16> Vars; 10202 CXXScopeSpec MapperIdScopeSpec; 10203 DeclarationNameInfo MapperIdInfo; 10204 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10205 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 10206 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10207 return nullptr; 10208 return getDerived().RebuildOMPToClause( 10209 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10210 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10211 } 10212 10213 template <typename Derived> 10214 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 10215 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10216 llvm::SmallVector<Expr *, 16> Vars; 10217 CXXScopeSpec MapperIdScopeSpec; 10218 DeclarationNameInfo MapperIdInfo; 10219 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 10220 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 10221 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 10222 return nullptr; 10223 return getDerived().RebuildOMPFromClause( 10224 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 10225 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 10226 } 10227 10228 template <typename Derived> 10229 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 10230 OMPUseDevicePtrClause *C) { 10231 llvm::SmallVector<Expr *, 16> Vars; 10232 Vars.reserve(C->varlist_size()); 10233 for (auto *VE : C->varlists()) { 10234 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10235 if (EVar.isInvalid()) 10236 return nullptr; 10237 Vars.push_back(EVar.get()); 10238 } 10239 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10240 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 10241 } 10242 10243 template <typename Derived> 10244 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 10245 OMPUseDeviceAddrClause *C) { 10246 llvm::SmallVector<Expr *, 16> Vars; 10247 Vars.reserve(C->varlist_size()); 10248 for (auto *VE : C->varlists()) { 10249 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10250 if (EVar.isInvalid()) 10251 return nullptr; 10252 Vars.push_back(EVar.get()); 10253 } 10254 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10255 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 10256 } 10257 10258 template <typename Derived> 10259 OMPClause * 10260 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 10261 llvm::SmallVector<Expr *, 16> Vars; 10262 Vars.reserve(C->varlist_size()); 10263 for (auto *VE : C->varlists()) { 10264 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10265 if (EVar.isInvalid()) 10266 return nullptr; 10267 Vars.push_back(EVar.get()); 10268 } 10269 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10270 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 10271 } 10272 10273 template <typename Derived> 10274 OMPClause * 10275 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 10276 llvm::SmallVector<Expr *, 16> Vars; 10277 Vars.reserve(C->varlist_size()); 10278 for (auto *VE : C->varlists()) { 10279 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10280 if (EVar.isInvalid()) 10281 return nullptr; 10282 Vars.push_back(EVar.get()); 10283 } 10284 return getDerived().RebuildOMPNontemporalClause( 10285 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10286 } 10287 10288 template <typename Derived> 10289 OMPClause * 10290 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 10291 llvm::SmallVector<Expr *, 16> Vars; 10292 Vars.reserve(C->varlist_size()); 10293 for (auto *VE : C->varlists()) { 10294 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10295 if (EVar.isInvalid()) 10296 return nullptr; 10297 Vars.push_back(EVar.get()); 10298 } 10299 return getDerived().RebuildOMPInclusiveClause( 10300 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10301 } 10302 10303 template <typename Derived> 10304 OMPClause * 10305 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 10306 llvm::SmallVector<Expr *, 16> Vars; 10307 Vars.reserve(C->varlist_size()); 10308 for (auto *VE : C->varlists()) { 10309 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 10310 if (EVar.isInvalid()) 10311 return nullptr; 10312 Vars.push_back(EVar.get()); 10313 } 10314 return getDerived().RebuildOMPExclusiveClause( 10315 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10316 } 10317 10318 template <typename Derived> 10319 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 10320 OMPUsesAllocatorsClause *C) { 10321 SmallVector<Sema::UsesAllocatorsData, 16> Data; 10322 Data.reserve(C->getNumberOfAllocators()); 10323 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 10324 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 10325 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 10326 if (Allocator.isInvalid()) 10327 continue; 10328 ExprResult AllocatorTraits; 10329 if (Expr *AT = D.AllocatorTraits) { 10330 AllocatorTraits = getDerived().TransformExpr(AT); 10331 if (AllocatorTraits.isInvalid()) 10332 continue; 10333 } 10334 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 10335 NewD.Allocator = Allocator.get(); 10336 NewD.AllocatorTraits = AllocatorTraits.get(); 10337 NewD.LParenLoc = D.LParenLoc; 10338 NewD.RParenLoc = D.RParenLoc; 10339 } 10340 return getDerived().RebuildOMPUsesAllocatorsClause( 10341 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 10342 } 10343 10344 template <typename Derived> 10345 OMPClause * 10346 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 10347 SmallVector<Expr *, 4> Locators; 10348 Locators.reserve(C->varlist_size()); 10349 ExprResult ModifierRes; 10350 if (Expr *Modifier = C->getModifier()) { 10351 ModifierRes = getDerived().TransformExpr(Modifier); 10352 if (ModifierRes.isInvalid()) 10353 return nullptr; 10354 } 10355 for (Expr *E : C->varlists()) { 10356 ExprResult Locator = getDerived().TransformExpr(E); 10357 if (Locator.isInvalid()) 10358 continue; 10359 Locators.push_back(Locator.get()); 10360 } 10361 return getDerived().RebuildOMPAffinityClause( 10362 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 10363 ModifierRes.get(), Locators); 10364 } 10365 10366 template <typename Derived> 10367 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 10368 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 10369 C->getBeginLoc(), C->getLParenLoc(), 10370 C->getEndLoc()); 10371 } 10372 10373 template <typename Derived> 10374 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) { 10375 return getDerived().RebuildOMPBindClause( 10376 C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(), 10377 C->getLParenLoc(), C->getEndLoc()); 10378 } 10379 10380 //===----------------------------------------------------------------------===// 10381 // Expression transformation 10382 //===----------------------------------------------------------------------===// 10383 template<typename Derived> 10384 ExprResult 10385 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 10386 return TransformExpr(E->getSubExpr()); 10387 } 10388 10389 template <typename Derived> 10390 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr( 10391 SYCLUniqueStableNameExpr *E) { 10392 if (!E->isTypeDependent()) 10393 return E; 10394 10395 TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo()); 10396 10397 if (!NewT) 10398 return ExprError(); 10399 10400 if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT) 10401 return E; 10402 10403 return getDerived().RebuildSYCLUniqueStableNameExpr( 10404 E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT); 10405 } 10406 10407 template<typename Derived> 10408 ExprResult 10409 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 10410 if (!E->isTypeDependent()) 10411 return E; 10412 10413 return getDerived().RebuildPredefinedExpr(E->getLocation(), 10414 E->getIdentKind()); 10415 } 10416 10417 template<typename Derived> 10418 ExprResult 10419 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 10420 NestedNameSpecifierLoc QualifierLoc; 10421 if (E->getQualifierLoc()) { 10422 QualifierLoc 10423 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10424 if (!QualifierLoc) 10425 return ExprError(); 10426 } 10427 10428 ValueDecl *ND 10429 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 10430 E->getDecl())); 10431 if (!ND) 10432 return ExprError(); 10433 10434 NamedDecl *Found = ND; 10435 if (E->getFoundDecl() != E->getDecl()) { 10436 Found = cast_or_null<NamedDecl>( 10437 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 10438 if (!Found) 10439 return ExprError(); 10440 } 10441 10442 DeclarationNameInfo NameInfo = E->getNameInfo(); 10443 if (NameInfo.getName()) { 10444 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 10445 if (!NameInfo.getName()) 10446 return ExprError(); 10447 } 10448 10449 if (!getDerived().AlwaysRebuild() && 10450 QualifierLoc == E->getQualifierLoc() && 10451 ND == E->getDecl() && 10452 Found == E->getFoundDecl() && 10453 NameInfo.getName() == E->getDecl()->getDeclName() && 10454 !E->hasExplicitTemplateArgs()) { 10455 10456 // Mark it referenced in the new context regardless. 10457 // FIXME: this is a bit instantiation-specific. 10458 SemaRef.MarkDeclRefReferenced(E); 10459 10460 return E; 10461 } 10462 10463 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 10464 if (E->hasExplicitTemplateArgs()) { 10465 TemplateArgs = &TransArgs; 10466 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10467 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10468 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10469 E->getNumTemplateArgs(), 10470 TransArgs)) 10471 return ExprError(); 10472 } 10473 10474 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10475 Found, TemplateArgs); 10476 } 10477 10478 template<typename Derived> 10479 ExprResult 10480 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10481 return E; 10482 } 10483 10484 template <typename Derived> 10485 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10486 FixedPointLiteral *E) { 10487 return E; 10488 } 10489 10490 template<typename Derived> 10491 ExprResult 10492 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10493 return E; 10494 } 10495 10496 template<typename Derived> 10497 ExprResult 10498 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10499 return E; 10500 } 10501 10502 template<typename Derived> 10503 ExprResult 10504 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10505 return E; 10506 } 10507 10508 template<typename Derived> 10509 ExprResult 10510 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10511 return E; 10512 } 10513 10514 template<typename Derived> 10515 ExprResult 10516 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10517 return getDerived().TransformCallExpr(E); 10518 } 10519 10520 template<typename Derived> 10521 ExprResult 10522 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10523 ExprResult ControllingExpr = 10524 getDerived().TransformExpr(E->getControllingExpr()); 10525 if (ControllingExpr.isInvalid()) 10526 return ExprError(); 10527 10528 SmallVector<Expr *, 4> AssocExprs; 10529 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10530 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10531 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10532 if (TSI) { 10533 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10534 if (!AssocType) 10535 return ExprError(); 10536 AssocTypes.push_back(AssocType); 10537 } else { 10538 AssocTypes.push_back(nullptr); 10539 } 10540 10541 ExprResult AssocExpr = 10542 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10543 if (AssocExpr.isInvalid()) 10544 return ExprError(); 10545 AssocExprs.push_back(AssocExpr.get()); 10546 } 10547 10548 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10549 E->getDefaultLoc(), 10550 E->getRParenLoc(), 10551 ControllingExpr.get(), 10552 AssocTypes, 10553 AssocExprs); 10554 } 10555 10556 template<typename Derived> 10557 ExprResult 10558 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10559 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10560 if (SubExpr.isInvalid()) 10561 return ExprError(); 10562 10563 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10564 return E; 10565 10566 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10567 E->getRParen()); 10568 } 10569 10570 /// The operand of a unary address-of operator has special rules: it's 10571 /// allowed to refer to a non-static member of a class even if there's no 'this' 10572 /// object available. 10573 template<typename Derived> 10574 ExprResult 10575 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10576 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10577 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10578 else 10579 return getDerived().TransformExpr(E); 10580 } 10581 10582 template<typename Derived> 10583 ExprResult 10584 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10585 ExprResult SubExpr; 10586 if (E->getOpcode() == UO_AddrOf) 10587 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10588 else 10589 SubExpr = TransformExpr(E->getSubExpr()); 10590 if (SubExpr.isInvalid()) 10591 return ExprError(); 10592 10593 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10594 return E; 10595 10596 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10597 E->getOpcode(), 10598 SubExpr.get()); 10599 } 10600 10601 template<typename Derived> 10602 ExprResult 10603 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10604 // Transform the type. 10605 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10606 if (!Type) 10607 return ExprError(); 10608 10609 // Transform all of the components into components similar to what the 10610 // parser uses. 10611 // FIXME: It would be slightly more efficient in the non-dependent case to 10612 // just map FieldDecls, rather than requiring the rebuilder to look for 10613 // the fields again. However, __builtin_offsetof is rare enough in 10614 // template code that we don't care. 10615 bool ExprChanged = false; 10616 typedef Sema::OffsetOfComponent Component; 10617 SmallVector<Component, 4> Components; 10618 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10619 const OffsetOfNode &ON = E->getComponent(I); 10620 Component Comp; 10621 Comp.isBrackets = true; 10622 Comp.LocStart = ON.getSourceRange().getBegin(); 10623 Comp.LocEnd = ON.getSourceRange().getEnd(); 10624 switch (ON.getKind()) { 10625 case OffsetOfNode::Array: { 10626 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10627 ExprResult Index = getDerived().TransformExpr(FromIndex); 10628 if (Index.isInvalid()) 10629 return ExprError(); 10630 10631 ExprChanged = ExprChanged || Index.get() != FromIndex; 10632 Comp.isBrackets = true; 10633 Comp.U.E = Index.get(); 10634 break; 10635 } 10636 10637 case OffsetOfNode::Field: 10638 case OffsetOfNode::Identifier: 10639 Comp.isBrackets = false; 10640 Comp.U.IdentInfo = ON.getFieldName(); 10641 if (!Comp.U.IdentInfo) 10642 continue; 10643 10644 break; 10645 10646 case OffsetOfNode::Base: 10647 // Will be recomputed during the rebuild. 10648 continue; 10649 } 10650 10651 Components.push_back(Comp); 10652 } 10653 10654 // If nothing changed, retain the existing expression. 10655 if (!getDerived().AlwaysRebuild() && 10656 Type == E->getTypeSourceInfo() && 10657 !ExprChanged) 10658 return E; 10659 10660 // Build a new offsetof expression. 10661 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10662 Components, E->getRParenLoc()); 10663 } 10664 10665 template<typename Derived> 10666 ExprResult 10667 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10668 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10669 "opaque value expression requires transformation"); 10670 return E; 10671 } 10672 10673 template<typename Derived> 10674 ExprResult 10675 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10676 return E; 10677 } 10678 10679 template <typename Derived> 10680 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10681 llvm::SmallVector<Expr *, 8> Children; 10682 bool Changed = false; 10683 for (Expr *C : E->subExpressions()) { 10684 ExprResult NewC = getDerived().TransformExpr(C); 10685 if (NewC.isInvalid()) 10686 return ExprError(); 10687 Children.push_back(NewC.get()); 10688 10689 Changed |= NewC.get() != C; 10690 } 10691 if (!getDerived().AlwaysRebuild() && !Changed) 10692 return E; 10693 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10694 Children, E->getType()); 10695 } 10696 10697 template<typename Derived> 10698 ExprResult 10699 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10700 // Rebuild the syntactic form. The original syntactic form has 10701 // opaque-value expressions in it, so strip those away and rebuild 10702 // the result. This is a really awful way of doing this, but the 10703 // better solution (rebuilding the semantic expressions and 10704 // rebinding OVEs as necessary) doesn't work; we'd need 10705 // TreeTransform to not strip away implicit conversions. 10706 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10707 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10708 if (result.isInvalid()) return ExprError(); 10709 10710 // If that gives us a pseudo-object result back, the pseudo-object 10711 // expression must have been an lvalue-to-rvalue conversion which we 10712 // should reapply. 10713 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10714 result = SemaRef.checkPseudoObjectRValue(result.get()); 10715 10716 return result; 10717 } 10718 10719 template<typename Derived> 10720 ExprResult 10721 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10722 UnaryExprOrTypeTraitExpr *E) { 10723 if (E->isArgumentType()) { 10724 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10725 10726 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10727 if (!NewT) 10728 return ExprError(); 10729 10730 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10731 return E; 10732 10733 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10734 E->getKind(), 10735 E->getSourceRange()); 10736 } 10737 10738 // C++0x [expr.sizeof]p1: 10739 // The operand is either an expression, which is an unevaluated operand 10740 // [...] 10741 EnterExpressionEvaluationContext Unevaluated( 10742 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10743 Sema::ReuseLambdaContextDecl); 10744 10745 // Try to recover if we have something like sizeof(T::X) where X is a type. 10746 // Notably, there must be *exactly* one set of parens if X is a type. 10747 TypeSourceInfo *RecoveryTSI = nullptr; 10748 ExprResult SubExpr; 10749 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10750 if (auto *DRE = 10751 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10752 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10753 PE, DRE, false, &RecoveryTSI); 10754 else 10755 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10756 10757 if (RecoveryTSI) { 10758 return getDerived().RebuildUnaryExprOrTypeTrait( 10759 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10760 } else if (SubExpr.isInvalid()) 10761 return ExprError(); 10762 10763 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10764 return E; 10765 10766 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10767 E->getOperatorLoc(), 10768 E->getKind(), 10769 E->getSourceRange()); 10770 } 10771 10772 template<typename Derived> 10773 ExprResult 10774 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10775 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10776 if (LHS.isInvalid()) 10777 return ExprError(); 10778 10779 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10780 if (RHS.isInvalid()) 10781 return ExprError(); 10782 10783 10784 if (!getDerived().AlwaysRebuild() && 10785 LHS.get() == E->getLHS() && 10786 RHS.get() == E->getRHS()) 10787 return E; 10788 10789 return getDerived().RebuildArraySubscriptExpr( 10790 LHS.get(), 10791 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10792 } 10793 10794 template <typename Derived> 10795 ExprResult 10796 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10797 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10798 if (Base.isInvalid()) 10799 return ExprError(); 10800 10801 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10802 if (RowIdx.isInvalid()) 10803 return ExprError(); 10804 10805 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10806 if (ColumnIdx.isInvalid()) 10807 return ExprError(); 10808 10809 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10810 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10811 return E; 10812 10813 return getDerived().RebuildMatrixSubscriptExpr( 10814 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10815 } 10816 10817 template <typename Derived> 10818 ExprResult 10819 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10820 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10821 if (Base.isInvalid()) 10822 return ExprError(); 10823 10824 ExprResult LowerBound; 10825 if (E->getLowerBound()) { 10826 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10827 if (LowerBound.isInvalid()) 10828 return ExprError(); 10829 } 10830 10831 ExprResult Length; 10832 if (E->getLength()) { 10833 Length = getDerived().TransformExpr(E->getLength()); 10834 if (Length.isInvalid()) 10835 return ExprError(); 10836 } 10837 10838 ExprResult Stride; 10839 if (Expr *Str = E->getStride()) { 10840 Stride = getDerived().TransformExpr(Str); 10841 if (Stride.isInvalid()) 10842 return ExprError(); 10843 } 10844 10845 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10846 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10847 return E; 10848 10849 return getDerived().RebuildOMPArraySectionExpr( 10850 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10851 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10852 E->getRBracketLoc()); 10853 } 10854 10855 template <typename Derived> 10856 ExprResult 10857 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10858 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10859 if (Base.isInvalid()) 10860 return ExprError(); 10861 10862 SmallVector<Expr *, 4> Dims; 10863 bool ErrorFound = false; 10864 for (Expr *Dim : E->getDimensions()) { 10865 ExprResult DimRes = getDerived().TransformExpr(Dim); 10866 if (DimRes.isInvalid()) { 10867 ErrorFound = true; 10868 continue; 10869 } 10870 Dims.push_back(DimRes.get()); 10871 } 10872 10873 if (ErrorFound) 10874 return ExprError(); 10875 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10876 E->getRParenLoc(), Dims, 10877 E->getBracketsRanges()); 10878 } 10879 10880 template <typename Derived> 10881 ExprResult 10882 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10883 unsigned NumIterators = E->numOfIterators(); 10884 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10885 10886 bool ErrorFound = false; 10887 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10888 for (unsigned I = 0; I < NumIterators; ++I) { 10889 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10890 Data[I].DeclIdent = D->getIdentifier(); 10891 Data[I].DeclIdentLoc = D->getLocation(); 10892 if (D->getLocation() == D->getBeginLoc()) { 10893 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10894 "Implicit type must be int."); 10895 } else { 10896 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10897 QualType DeclTy = getDerived().TransformType(D->getType()); 10898 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10899 } 10900 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10901 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10902 ExprResult End = getDerived().TransformExpr(Range.End); 10903 ExprResult Step = getDerived().TransformExpr(Range.Step); 10904 ErrorFound = ErrorFound || 10905 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10906 !Data[I].Type.get().isNull())) || 10907 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10908 if (ErrorFound) 10909 continue; 10910 Data[I].Range.Begin = Begin.get(); 10911 Data[I].Range.End = End.get(); 10912 Data[I].Range.Step = Step.get(); 10913 Data[I].AssignLoc = E->getAssignLoc(I); 10914 Data[I].ColonLoc = E->getColonLoc(I); 10915 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10916 NeedToRebuild = 10917 NeedToRebuild || 10918 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10919 D->getType().getTypePtrOrNull()) || 10920 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10921 Range.Step != Data[I].Range.Step; 10922 } 10923 if (ErrorFound) 10924 return ExprError(); 10925 if (!NeedToRebuild) 10926 return E; 10927 10928 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10929 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10930 if (!Res.isUsable()) 10931 return Res; 10932 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10933 for (unsigned I = 0; I < NumIterators; ++I) 10934 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10935 IE->getIteratorDecl(I)); 10936 return Res; 10937 } 10938 10939 template<typename Derived> 10940 ExprResult 10941 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10942 // Transform the callee. 10943 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10944 if (Callee.isInvalid()) 10945 return ExprError(); 10946 10947 // Transform arguments. 10948 bool ArgChanged = false; 10949 SmallVector<Expr*, 8> Args; 10950 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10951 &ArgChanged)) 10952 return ExprError(); 10953 10954 if (!getDerived().AlwaysRebuild() && 10955 Callee.get() == E->getCallee() && 10956 !ArgChanged) 10957 return SemaRef.MaybeBindToTemporary(E); 10958 10959 // FIXME: Wrong source location information for the '('. 10960 SourceLocation FakeLParenLoc 10961 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10962 10963 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10964 if (E->hasStoredFPFeatures()) { 10965 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10966 getSema().CurFPFeatures = 10967 NewOverrides.applyOverrides(getSema().getLangOpts()); 10968 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10969 } 10970 10971 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10972 Args, 10973 E->getRParenLoc()); 10974 } 10975 10976 template<typename Derived> 10977 ExprResult 10978 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10979 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10980 if (Base.isInvalid()) 10981 return ExprError(); 10982 10983 NestedNameSpecifierLoc QualifierLoc; 10984 if (E->hasQualifier()) { 10985 QualifierLoc 10986 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10987 10988 if (!QualifierLoc) 10989 return ExprError(); 10990 } 10991 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10992 10993 ValueDecl *Member 10994 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10995 E->getMemberDecl())); 10996 if (!Member) 10997 return ExprError(); 10998 10999 NamedDecl *FoundDecl = E->getFoundDecl(); 11000 if (FoundDecl == E->getMemberDecl()) { 11001 FoundDecl = Member; 11002 } else { 11003 FoundDecl = cast_or_null<NamedDecl>( 11004 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 11005 if (!FoundDecl) 11006 return ExprError(); 11007 } 11008 11009 if (!getDerived().AlwaysRebuild() && 11010 Base.get() == E->getBase() && 11011 QualifierLoc == E->getQualifierLoc() && 11012 Member == E->getMemberDecl() && 11013 FoundDecl == E->getFoundDecl() && 11014 !E->hasExplicitTemplateArgs()) { 11015 11016 // Mark it referenced in the new context regardless. 11017 // FIXME: this is a bit instantiation-specific. 11018 SemaRef.MarkMemberReferenced(E); 11019 11020 return E; 11021 } 11022 11023 TemplateArgumentListInfo TransArgs; 11024 if (E->hasExplicitTemplateArgs()) { 11025 TransArgs.setLAngleLoc(E->getLAngleLoc()); 11026 TransArgs.setRAngleLoc(E->getRAngleLoc()); 11027 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11028 E->getNumTemplateArgs(), 11029 TransArgs)) 11030 return ExprError(); 11031 } 11032 11033 // FIXME: Bogus source location for the operator 11034 SourceLocation FakeOperatorLoc = 11035 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 11036 11037 // FIXME: to do this check properly, we will need to preserve the 11038 // first-qualifier-in-scope here, just in case we had a dependent 11039 // base (and therefore couldn't do the check) and a 11040 // nested-name-qualifier (and therefore could do the lookup). 11041 NamedDecl *FirstQualifierInScope = nullptr; 11042 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 11043 if (MemberNameInfo.getName()) { 11044 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 11045 if (!MemberNameInfo.getName()) 11046 return ExprError(); 11047 } 11048 11049 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 11050 E->isArrow(), 11051 QualifierLoc, 11052 TemplateKWLoc, 11053 MemberNameInfo, 11054 Member, 11055 FoundDecl, 11056 (E->hasExplicitTemplateArgs() 11057 ? &TransArgs : nullptr), 11058 FirstQualifierInScope); 11059 } 11060 11061 template<typename Derived> 11062 ExprResult 11063 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 11064 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11065 if (LHS.isInvalid()) 11066 return ExprError(); 11067 11068 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11069 if (RHS.isInvalid()) 11070 return ExprError(); 11071 11072 if (!getDerived().AlwaysRebuild() && 11073 LHS.get() == E->getLHS() && 11074 RHS.get() == E->getRHS()) 11075 return E; 11076 11077 if (E->isCompoundAssignmentOp()) 11078 // FPFeatures has already been established from trailing storage 11079 return getDerived().RebuildBinaryOperator( 11080 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 11081 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11082 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11083 getSema().CurFPFeatures = 11084 NewOverrides.applyOverrides(getSema().getLangOpts()); 11085 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11086 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 11087 LHS.get(), RHS.get()); 11088 } 11089 11090 template <typename Derived> 11091 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 11092 CXXRewrittenBinaryOperator *E) { 11093 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 11094 11095 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 11096 if (LHS.isInvalid()) 11097 return ExprError(); 11098 11099 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 11100 if (RHS.isInvalid()) 11101 return ExprError(); 11102 11103 // Extract the already-resolved callee declarations so that we can restrict 11104 // ourselves to using them as the unqualified lookup results when rebuilding. 11105 UnresolvedSet<2> UnqualLookups; 11106 bool ChangedAnyLookups = false; 11107 Expr *PossibleBinOps[] = {E->getSemanticForm(), 11108 const_cast<Expr *>(Decomp.InnerBinOp)}; 11109 for (Expr *PossibleBinOp : PossibleBinOps) { 11110 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 11111 if (!Op) 11112 continue; 11113 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 11114 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 11115 continue; 11116 11117 // Transform the callee in case we built a call to a local extern 11118 // declaration. 11119 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 11120 E->getOperatorLoc(), Callee->getFoundDecl())); 11121 if (!Found) 11122 return ExprError(); 11123 if (Found != Callee->getFoundDecl()) 11124 ChangedAnyLookups = true; 11125 UnqualLookups.addDecl(Found); 11126 } 11127 11128 if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups && 11129 LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) { 11130 // Mark all functions used in the rewrite as referenced. Note that when 11131 // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be 11132 // function calls, and/or there might be a user-defined conversion sequence 11133 // applied to the operands of the <. 11134 // FIXME: this is a bit instantiation-specific. 11135 const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS}; 11136 SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt); 11137 return E; 11138 } 11139 11140 return getDerived().RebuildCXXRewrittenBinaryOperator( 11141 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 11142 } 11143 11144 template<typename Derived> 11145 ExprResult 11146 TreeTransform<Derived>::TransformCompoundAssignOperator( 11147 CompoundAssignOperator *E) { 11148 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11149 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 11150 getSema().CurFPFeatures = 11151 NewOverrides.applyOverrides(getSema().getLangOpts()); 11152 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11153 return getDerived().TransformBinaryOperator(E); 11154 } 11155 11156 template<typename Derived> 11157 ExprResult TreeTransform<Derived>:: 11158 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 11159 // Just rebuild the common and RHS expressions and see whether we 11160 // get any changes. 11161 11162 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 11163 if (commonExpr.isInvalid()) 11164 return ExprError(); 11165 11166 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 11167 if (rhs.isInvalid()) 11168 return ExprError(); 11169 11170 if (!getDerived().AlwaysRebuild() && 11171 commonExpr.get() == e->getCommon() && 11172 rhs.get() == e->getFalseExpr()) 11173 return e; 11174 11175 return getDerived().RebuildConditionalOperator(commonExpr.get(), 11176 e->getQuestionLoc(), 11177 nullptr, 11178 e->getColonLoc(), 11179 rhs.get()); 11180 } 11181 11182 template<typename Derived> 11183 ExprResult 11184 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 11185 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11186 if (Cond.isInvalid()) 11187 return ExprError(); 11188 11189 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11190 if (LHS.isInvalid()) 11191 return ExprError(); 11192 11193 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11194 if (RHS.isInvalid()) 11195 return ExprError(); 11196 11197 if (!getDerived().AlwaysRebuild() && 11198 Cond.get() == E->getCond() && 11199 LHS.get() == E->getLHS() && 11200 RHS.get() == E->getRHS()) 11201 return E; 11202 11203 return getDerived().RebuildConditionalOperator(Cond.get(), 11204 E->getQuestionLoc(), 11205 LHS.get(), 11206 E->getColonLoc(), 11207 RHS.get()); 11208 } 11209 11210 template<typename Derived> 11211 ExprResult 11212 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 11213 // Implicit casts are eliminated during transformation, since they 11214 // will be recomputed by semantic analysis after transformation. 11215 return getDerived().TransformExpr(E->getSubExprAsWritten()); 11216 } 11217 11218 template<typename Derived> 11219 ExprResult 11220 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 11221 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11222 if (!Type) 11223 return ExprError(); 11224 11225 ExprResult SubExpr 11226 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11227 if (SubExpr.isInvalid()) 11228 return ExprError(); 11229 11230 if (!getDerived().AlwaysRebuild() && 11231 Type == E->getTypeInfoAsWritten() && 11232 SubExpr.get() == E->getSubExpr()) 11233 return E; 11234 11235 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 11236 Type, 11237 E->getRParenLoc(), 11238 SubExpr.get()); 11239 } 11240 11241 template<typename Derived> 11242 ExprResult 11243 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 11244 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 11245 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 11246 if (!NewT) 11247 return ExprError(); 11248 11249 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 11250 if (Init.isInvalid()) 11251 return ExprError(); 11252 11253 if (!getDerived().AlwaysRebuild() && 11254 OldT == NewT && 11255 Init.get() == E->getInitializer()) 11256 return SemaRef.MaybeBindToTemporary(E); 11257 11258 // Note: the expression type doesn't necessarily match the 11259 // type-as-written, but that's okay, because it should always be 11260 // derivable from the initializer. 11261 11262 return getDerived().RebuildCompoundLiteralExpr( 11263 E->getLParenLoc(), NewT, 11264 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 11265 } 11266 11267 template<typename Derived> 11268 ExprResult 11269 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 11270 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11271 if (Base.isInvalid()) 11272 return ExprError(); 11273 11274 if (!getDerived().AlwaysRebuild() && 11275 Base.get() == E->getBase()) 11276 return E; 11277 11278 // FIXME: Bad source location 11279 SourceLocation FakeOperatorLoc = 11280 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 11281 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 11282 E->getAccessorLoc(), 11283 E->getAccessor()); 11284 } 11285 11286 template<typename Derived> 11287 ExprResult 11288 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 11289 if (InitListExpr *Syntactic = E->getSyntacticForm()) 11290 E = Syntactic; 11291 11292 bool InitChanged = false; 11293 11294 EnterExpressionEvaluationContext Context( 11295 getSema(), EnterExpressionEvaluationContext::InitList); 11296 11297 SmallVector<Expr*, 4> Inits; 11298 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 11299 Inits, &InitChanged)) 11300 return ExprError(); 11301 11302 if (!getDerived().AlwaysRebuild() && !InitChanged) { 11303 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 11304 // in some cases. We can't reuse it in general, because the syntactic and 11305 // semantic forms are linked, and we can't know that semantic form will 11306 // match even if the syntactic form does. 11307 } 11308 11309 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 11310 E->getRBraceLoc()); 11311 } 11312 11313 template<typename Derived> 11314 ExprResult 11315 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 11316 Designation Desig; 11317 11318 // transform the initializer value 11319 ExprResult Init = getDerived().TransformExpr(E->getInit()); 11320 if (Init.isInvalid()) 11321 return ExprError(); 11322 11323 // transform the designators. 11324 SmallVector<Expr*, 4> ArrayExprs; 11325 bool ExprChanged = false; 11326 for (const DesignatedInitExpr::Designator &D : E->designators()) { 11327 if (D.isFieldDesignator()) { 11328 Desig.AddDesignator(Designator::getField(D.getFieldName(), 11329 D.getDotLoc(), 11330 D.getFieldLoc())); 11331 if (D.getField()) { 11332 FieldDecl *Field = cast_or_null<FieldDecl>( 11333 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 11334 if (Field != D.getField()) 11335 // Rebuild the expression when the transformed FieldDecl is 11336 // different to the already assigned FieldDecl. 11337 ExprChanged = true; 11338 } else { 11339 // Ensure that the designator expression is rebuilt when there isn't 11340 // a resolved FieldDecl in the designator as we don't want to assign 11341 // a FieldDecl to a pattern designator that will be instantiated again. 11342 ExprChanged = true; 11343 } 11344 continue; 11345 } 11346 11347 if (D.isArrayDesignator()) { 11348 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 11349 if (Index.isInvalid()) 11350 return ExprError(); 11351 11352 Desig.AddDesignator( 11353 Designator::getArray(Index.get(), D.getLBracketLoc())); 11354 11355 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 11356 ArrayExprs.push_back(Index.get()); 11357 continue; 11358 } 11359 11360 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 11361 ExprResult Start 11362 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 11363 if (Start.isInvalid()) 11364 return ExprError(); 11365 11366 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 11367 if (End.isInvalid()) 11368 return ExprError(); 11369 11370 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 11371 End.get(), 11372 D.getLBracketLoc(), 11373 D.getEllipsisLoc())); 11374 11375 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 11376 End.get() != E->getArrayRangeEnd(D); 11377 11378 ArrayExprs.push_back(Start.get()); 11379 ArrayExprs.push_back(End.get()); 11380 } 11381 11382 if (!getDerived().AlwaysRebuild() && 11383 Init.get() == E->getInit() && 11384 !ExprChanged) 11385 return E; 11386 11387 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 11388 E->getEqualOrColonLoc(), 11389 E->usesGNUSyntax(), Init.get()); 11390 } 11391 11392 // Seems that if TransformInitListExpr() only works on the syntactic form of an 11393 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 11394 template<typename Derived> 11395 ExprResult 11396 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 11397 DesignatedInitUpdateExpr *E) { 11398 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 11399 "initializer"); 11400 return ExprError(); 11401 } 11402 11403 template<typename Derived> 11404 ExprResult 11405 TreeTransform<Derived>::TransformNoInitExpr( 11406 NoInitExpr *E) { 11407 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 11408 return ExprError(); 11409 } 11410 11411 template<typename Derived> 11412 ExprResult 11413 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 11414 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 11415 return ExprError(); 11416 } 11417 11418 template<typename Derived> 11419 ExprResult 11420 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 11421 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 11422 return ExprError(); 11423 } 11424 11425 template<typename Derived> 11426 ExprResult 11427 TreeTransform<Derived>::TransformImplicitValueInitExpr( 11428 ImplicitValueInitExpr *E) { 11429 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 11430 11431 // FIXME: Will we ever have proper type location here? Will we actually 11432 // need to transform the type? 11433 QualType T = getDerived().TransformType(E->getType()); 11434 if (T.isNull()) 11435 return ExprError(); 11436 11437 if (!getDerived().AlwaysRebuild() && 11438 T == E->getType()) 11439 return E; 11440 11441 return getDerived().RebuildImplicitValueInitExpr(T); 11442 } 11443 11444 template<typename Derived> 11445 ExprResult 11446 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 11447 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 11448 if (!TInfo) 11449 return ExprError(); 11450 11451 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11452 if (SubExpr.isInvalid()) 11453 return ExprError(); 11454 11455 if (!getDerived().AlwaysRebuild() && 11456 TInfo == E->getWrittenTypeInfo() && 11457 SubExpr.get() == E->getSubExpr()) 11458 return E; 11459 11460 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 11461 TInfo, E->getRParenLoc()); 11462 } 11463 11464 template<typename Derived> 11465 ExprResult 11466 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 11467 bool ArgumentChanged = false; 11468 SmallVector<Expr*, 4> Inits; 11469 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 11470 &ArgumentChanged)) 11471 return ExprError(); 11472 11473 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 11474 Inits, 11475 E->getRParenLoc()); 11476 } 11477 11478 /// Transform an address-of-label expression. 11479 /// 11480 /// By default, the transformation of an address-of-label expression always 11481 /// rebuilds the expression, so that the label identifier can be resolved to 11482 /// the corresponding label statement by semantic analysis. 11483 template<typename Derived> 11484 ExprResult 11485 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11486 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11487 E->getLabel()); 11488 if (!LD) 11489 return ExprError(); 11490 11491 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11492 cast<LabelDecl>(LD)); 11493 } 11494 11495 template<typename Derived> 11496 ExprResult 11497 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11498 SemaRef.ActOnStartStmtExpr(); 11499 StmtResult SubStmt 11500 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11501 if (SubStmt.isInvalid()) { 11502 SemaRef.ActOnStmtExprError(); 11503 return ExprError(); 11504 } 11505 11506 unsigned OldDepth = E->getTemplateDepth(); 11507 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11508 11509 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11510 SubStmt.get() == E->getSubStmt()) { 11511 // Calling this an 'error' is unintuitive, but it does the right thing. 11512 SemaRef.ActOnStmtExprError(); 11513 return SemaRef.MaybeBindToTemporary(E); 11514 } 11515 11516 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11517 E->getRParenLoc(), NewDepth); 11518 } 11519 11520 template<typename Derived> 11521 ExprResult 11522 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11523 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11524 if (Cond.isInvalid()) 11525 return ExprError(); 11526 11527 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11528 if (LHS.isInvalid()) 11529 return ExprError(); 11530 11531 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11532 if (RHS.isInvalid()) 11533 return ExprError(); 11534 11535 if (!getDerived().AlwaysRebuild() && 11536 Cond.get() == E->getCond() && 11537 LHS.get() == E->getLHS() && 11538 RHS.get() == E->getRHS()) 11539 return E; 11540 11541 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11542 Cond.get(), LHS.get(), RHS.get(), 11543 E->getRParenLoc()); 11544 } 11545 11546 template<typename Derived> 11547 ExprResult 11548 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11549 return E; 11550 } 11551 11552 template<typename Derived> 11553 ExprResult 11554 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11555 switch (E->getOperator()) { 11556 case OO_New: 11557 case OO_Delete: 11558 case OO_Array_New: 11559 case OO_Array_Delete: 11560 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11561 11562 case OO_Subscript: 11563 case OO_Call: { 11564 // This is a call to an object's operator(). 11565 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11566 11567 // Transform the object itself. 11568 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11569 if (Object.isInvalid()) 11570 return ExprError(); 11571 11572 // FIXME: Poor location information 11573 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11574 static_cast<Expr *>(Object.get())->getEndLoc()); 11575 11576 // Transform the call arguments. 11577 SmallVector<Expr*, 8> Args; 11578 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11579 Args)) 11580 return ExprError(); 11581 11582 if (E->getOperator() == OO_Subscript) 11583 return getDerived().RebuildCxxSubscriptExpr(Object.get(), FakeLParenLoc, 11584 Args, E->getEndLoc()); 11585 11586 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11587 E->getEndLoc()); 11588 } 11589 11590 #define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \ 11591 case OO_##Name: \ 11592 break; 11593 11594 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11595 #include "clang/Basic/OperatorKinds.def" 11596 11597 case OO_Conditional: 11598 llvm_unreachable("conditional operator is not actually overloadable"); 11599 11600 case OO_None: 11601 case NUM_OVERLOADED_OPERATORS: 11602 llvm_unreachable("not an overloaded operator?"); 11603 } 11604 11605 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11606 if (Callee.isInvalid()) 11607 return ExprError(); 11608 11609 ExprResult First; 11610 if (E->getOperator() == OO_Amp) 11611 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11612 else 11613 First = getDerived().TransformExpr(E->getArg(0)); 11614 if (First.isInvalid()) 11615 return ExprError(); 11616 11617 ExprResult Second; 11618 if (E->getNumArgs() == 2) { 11619 Second = getDerived().TransformExpr(E->getArg(1)); 11620 if (Second.isInvalid()) 11621 return ExprError(); 11622 } 11623 11624 if (!getDerived().AlwaysRebuild() && 11625 Callee.get() == E->getCallee() && 11626 First.get() == E->getArg(0) && 11627 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11628 return SemaRef.MaybeBindToTemporary(E); 11629 11630 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11631 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11632 getSema().CurFPFeatures = 11633 NewOverrides.applyOverrides(getSema().getLangOpts()); 11634 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11635 11636 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11637 E->getOperatorLoc(), 11638 Callee.get(), 11639 First.get(), 11640 Second.get()); 11641 } 11642 11643 template<typename Derived> 11644 ExprResult 11645 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11646 return getDerived().TransformCallExpr(E); 11647 } 11648 11649 template <typename Derived> 11650 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11651 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11652 getSema().CurContext != E->getParentContext(); 11653 11654 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11655 return E; 11656 11657 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getType(), 11658 E->getBeginLoc(), E->getEndLoc(), 11659 getSema().CurContext); 11660 } 11661 11662 template<typename Derived> 11663 ExprResult 11664 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11665 // Transform the callee. 11666 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11667 if (Callee.isInvalid()) 11668 return ExprError(); 11669 11670 // Transform exec config. 11671 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11672 if (EC.isInvalid()) 11673 return ExprError(); 11674 11675 // Transform arguments. 11676 bool ArgChanged = false; 11677 SmallVector<Expr*, 8> Args; 11678 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11679 &ArgChanged)) 11680 return ExprError(); 11681 11682 if (!getDerived().AlwaysRebuild() && 11683 Callee.get() == E->getCallee() && 11684 !ArgChanged) 11685 return SemaRef.MaybeBindToTemporary(E); 11686 11687 // FIXME: Wrong source location information for the '('. 11688 SourceLocation FakeLParenLoc 11689 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11690 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11691 Args, 11692 E->getRParenLoc(), EC.get()); 11693 } 11694 11695 template<typename Derived> 11696 ExprResult 11697 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11698 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11699 if (!Type) 11700 return ExprError(); 11701 11702 ExprResult SubExpr 11703 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11704 if (SubExpr.isInvalid()) 11705 return ExprError(); 11706 11707 if (!getDerived().AlwaysRebuild() && 11708 Type == E->getTypeInfoAsWritten() && 11709 SubExpr.get() == E->getSubExpr()) 11710 return E; 11711 return getDerived().RebuildCXXNamedCastExpr( 11712 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11713 Type, E->getAngleBrackets().getEnd(), 11714 // FIXME. this should be '(' location 11715 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11716 } 11717 11718 template<typename Derived> 11719 ExprResult 11720 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11721 TypeSourceInfo *TSI = 11722 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11723 if (!TSI) 11724 return ExprError(); 11725 11726 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11727 if (Sub.isInvalid()) 11728 return ExprError(); 11729 11730 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11731 Sub.get(), BCE->getEndLoc()); 11732 } 11733 11734 template<typename Derived> 11735 ExprResult 11736 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11737 return getDerived().TransformCXXNamedCastExpr(E); 11738 } 11739 11740 template<typename Derived> 11741 ExprResult 11742 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11743 return getDerived().TransformCXXNamedCastExpr(E); 11744 } 11745 11746 template<typename Derived> 11747 ExprResult 11748 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11749 CXXReinterpretCastExpr *E) { 11750 return getDerived().TransformCXXNamedCastExpr(E); 11751 } 11752 11753 template<typename Derived> 11754 ExprResult 11755 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11756 return getDerived().TransformCXXNamedCastExpr(E); 11757 } 11758 11759 template<typename Derived> 11760 ExprResult 11761 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11762 return getDerived().TransformCXXNamedCastExpr(E); 11763 } 11764 11765 template<typename Derived> 11766 ExprResult 11767 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11768 CXXFunctionalCastExpr *E) { 11769 TypeSourceInfo *Type = 11770 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11771 if (!Type) 11772 return ExprError(); 11773 11774 ExprResult SubExpr 11775 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11776 if (SubExpr.isInvalid()) 11777 return ExprError(); 11778 11779 if (!getDerived().AlwaysRebuild() && 11780 Type == E->getTypeInfoAsWritten() && 11781 SubExpr.get() == E->getSubExpr()) 11782 return E; 11783 11784 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11785 E->getLParenLoc(), 11786 SubExpr.get(), 11787 E->getRParenLoc(), 11788 E->isListInitialization()); 11789 } 11790 11791 template<typename Derived> 11792 ExprResult 11793 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11794 if (E->isTypeOperand()) { 11795 TypeSourceInfo *TInfo 11796 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11797 if (!TInfo) 11798 return ExprError(); 11799 11800 if (!getDerived().AlwaysRebuild() && 11801 TInfo == E->getTypeOperandSourceInfo()) 11802 return E; 11803 11804 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11805 TInfo, E->getEndLoc()); 11806 } 11807 11808 // Typeid's operand is an unevaluated context, unless it's a polymorphic 11809 // type. We must not unilaterally enter unevaluated context here, as then 11810 // semantic processing can re-transform an already transformed operand. 11811 Expr *Op = E->getExprOperand(); 11812 auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated; 11813 if (E->isGLValue()) 11814 if (auto *RecordT = Op->getType()->getAs<RecordType>()) 11815 if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic()) 11816 EvalCtx = SemaRef.ExprEvalContexts.back().Context; 11817 11818 EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx, 11819 Sema::ReuseLambdaContextDecl); 11820 11821 ExprResult SubExpr = getDerived().TransformExpr(Op); 11822 if (SubExpr.isInvalid()) 11823 return ExprError(); 11824 11825 if (!getDerived().AlwaysRebuild() && 11826 SubExpr.get() == E->getExprOperand()) 11827 return E; 11828 11829 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11830 SubExpr.get(), E->getEndLoc()); 11831 } 11832 11833 template<typename Derived> 11834 ExprResult 11835 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11836 if (E->isTypeOperand()) { 11837 TypeSourceInfo *TInfo 11838 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11839 if (!TInfo) 11840 return ExprError(); 11841 11842 if (!getDerived().AlwaysRebuild() && 11843 TInfo == E->getTypeOperandSourceInfo()) 11844 return E; 11845 11846 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11847 TInfo, E->getEndLoc()); 11848 } 11849 11850 EnterExpressionEvaluationContext Unevaluated( 11851 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11852 11853 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11854 if (SubExpr.isInvalid()) 11855 return ExprError(); 11856 11857 if (!getDerived().AlwaysRebuild() && 11858 SubExpr.get() == E->getExprOperand()) 11859 return E; 11860 11861 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11862 SubExpr.get(), E->getEndLoc()); 11863 } 11864 11865 template<typename Derived> 11866 ExprResult 11867 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11868 return E; 11869 } 11870 11871 template<typename Derived> 11872 ExprResult 11873 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11874 CXXNullPtrLiteralExpr *E) { 11875 return E; 11876 } 11877 11878 template<typename Derived> 11879 ExprResult 11880 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11881 QualType T = getSema().getCurrentThisType(); 11882 11883 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11884 // Mark it referenced in the new context regardless. 11885 // FIXME: this is a bit instantiation-specific. 11886 getSema().MarkThisReferenced(E); 11887 return E; 11888 } 11889 11890 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11891 } 11892 11893 template<typename Derived> 11894 ExprResult 11895 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11896 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11897 if (SubExpr.isInvalid()) 11898 return ExprError(); 11899 11900 if (!getDerived().AlwaysRebuild() && 11901 SubExpr.get() == E->getSubExpr()) 11902 return E; 11903 11904 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11905 E->isThrownVariableInScope()); 11906 } 11907 11908 template<typename Derived> 11909 ExprResult 11910 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11911 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11912 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11913 if (!Param) 11914 return ExprError(); 11915 11916 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11917 E->getUsedContext() == SemaRef.CurContext) 11918 return E; 11919 11920 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11921 } 11922 11923 template<typename Derived> 11924 ExprResult 11925 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11926 FieldDecl *Field = cast_or_null<FieldDecl>( 11927 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11928 if (!Field) 11929 return ExprError(); 11930 11931 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11932 E->getUsedContext() == SemaRef.CurContext) 11933 return E; 11934 11935 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11936 } 11937 11938 template<typename Derived> 11939 ExprResult 11940 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11941 CXXScalarValueInitExpr *E) { 11942 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11943 if (!T) 11944 return ExprError(); 11945 11946 if (!getDerived().AlwaysRebuild() && 11947 T == E->getTypeSourceInfo()) 11948 return E; 11949 11950 return getDerived().RebuildCXXScalarValueInitExpr(T, 11951 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11952 E->getRParenLoc()); 11953 } 11954 11955 template<typename Derived> 11956 ExprResult 11957 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11958 // Transform the type that we're allocating 11959 TypeSourceInfo *AllocTypeInfo = 11960 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11961 if (!AllocTypeInfo) 11962 return ExprError(); 11963 11964 // Transform the size of the array we're allocating (if any). 11965 Optional<Expr *> ArraySize; 11966 if (E->isArray()) { 11967 ExprResult NewArraySize; 11968 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11969 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11970 if (NewArraySize.isInvalid()) 11971 return ExprError(); 11972 } 11973 ArraySize = NewArraySize.get(); 11974 } 11975 11976 // Transform the placement arguments (if any). 11977 bool ArgumentChanged = false; 11978 SmallVector<Expr*, 8> PlacementArgs; 11979 if (getDerived().TransformExprs(E->getPlacementArgs(), 11980 E->getNumPlacementArgs(), true, 11981 PlacementArgs, &ArgumentChanged)) 11982 return ExprError(); 11983 11984 // Transform the initializer (if any). 11985 Expr *OldInit = E->getInitializer(); 11986 ExprResult NewInit; 11987 if (OldInit) 11988 NewInit = getDerived().TransformInitializer(OldInit, true); 11989 if (NewInit.isInvalid()) 11990 return ExprError(); 11991 11992 // Transform new operator and delete operator. 11993 FunctionDecl *OperatorNew = nullptr; 11994 if (E->getOperatorNew()) { 11995 OperatorNew = cast_or_null<FunctionDecl>( 11996 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11997 if (!OperatorNew) 11998 return ExprError(); 11999 } 12000 12001 FunctionDecl *OperatorDelete = nullptr; 12002 if (E->getOperatorDelete()) { 12003 OperatorDelete = cast_or_null<FunctionDecl>( 12004 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12005 if (!OperatorDelete) 12006 return ExprError(); 12007 } 12008 12009 if (!getDerived().AlwaysRebuild() && 12010 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 12011 ArraySize == E->getArraySize() && 12012 NewInit.get() == OldInit && 12013 OperatorNew == E->getOperatorNew() && 12014 OperatorDelete == E->getOperatorDelete() && 12015 !ArgumentChanged) { 12016 // Mark any declarations we need as referenced. 12017 // FIXME: instantiation-specific. 12018 if (OperatorNew) 12019 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 12020 if (OperatorDelete) 12021 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12022 12023 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 12024 QualType ElementType 12025 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 12026 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 12027 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 12028 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 12029 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 12030 } 12031 } 12032 } 12033 12034 return E; 12035 } 12036 12037 QualType AllocType = AllocTypeInfo->getType(); 12038 if (!ArraySize) { 12039 // If no array size was specified, but the new expression was 12040 // instantiated with an array type (e.g., "new T" where T is 12041 // instantiated with "int[4]"), extract the outer bound from the 12042 // array type as our array size. We do this with constant and 12043 // dependently-sized array types. 12044 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 12045 if (!ArrayT) { 12046 // Do nothing 12047 } else if (const ConstantArrayType *ConsArrayT 12048 = dyn_cast<ConstantArrayType>(ArrayT)) { 12049 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 12050 SemaRef.Context.getSizeType(), 12051 /*FIXME:*/ E->getBeginLoc()); 12052 AllocType = ConsArrayT->getElementType(); 12053 } else if (const DependentSizedArrayType *DepArrayT 12054 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 12055 if (DepArrayT->getSizeExpr()) { 12056 ArraySize = DepArrayT->getSizeExpr(); 12057 AllocType = DepArrayT->getElementType(); 12058 } 12059 } 12060 } 12061 12062 return getDerived().RebuildCXXNewExpr( 12063 E->getBeginLoc(), E->isGlobalNew(), 12064 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 12065 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 12066 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 12067 } 12068 12069 template<typename Derived> 12070 ExprResult 12071 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 12072 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 12073 if (Operand.isInvalid()) 12074 return ExprError(); 12075 12076 // Transform the delete operator, if known. 12077 FunctionDecl *OperatorDelete = nullptr; 12078 if (E->getOperatorDelete()) { 12079 OperatorDelete = cast_or_null<FunctionDecl>( 12080 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 12081 if (!OperatorDelete) 12082 return ExprError(); 12083 } 12084 12085 if (!getDerived().AlwaysRebuild() && 12086 Operand.get() == E->getArgument() && 12087 OperatorDelete == E->getOperatorDelete()) { 12088 // Mark any declarations we need as referenced. 12089 // FIXME: instantiation-specific. 12090 if (OperatorDelete) 12091 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 12092 12093 if (!E->getArgument()->isTypeDependent()) { 12094 QualType Destroyed = SemaRef.Context.getBaseElementType( 12095 E->getDestroyedType()); 12096 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 12097 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 12098 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12099 SemaRef.LookupDestructor(Record)); 12100 } 12101 } 12102 12103 return E; 12104 } 12105 12106 return getDerived().RebuildCXXDeleteExpr( 12107 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 12108 } 12109 12110 template<typename Derived> 12111 ExprResult 12112 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 12113 CXXPseudoDestructorExpr *E) { 12114 ExprResult Base = getDerived().TransformExpr(E->getBase()); 12115 if (Base.isInvalid()) 12116 return ExprError(); 12117 12118 ParsedType ObjectTypePtr; 12119 bool MayBePseudoDestructor = false; 12120 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12121 E->getOperatorLoc(), 12122 E->isArrow()? tok::arrow : tok::period, 12123 ObjectTypePtr, 12124 MayBePseudoDestructor); 12125 if (Base.isInvalid()) 12126 return ExprError(); 12127 12128 QualType ObjectType = ObjectTypePtr.get(); 12129 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 12130 if (QualifierLoc) { 12131 QualifierLoc 12132 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 12133 if (!QualifierLoc) 12134 return ExprError(); 12135 } 12136 CXXScopeSpec SS; 12137 SS.Adopt(QualifierLoc); 12138 12139 PseudoDestructorTypeStorage Destroyed; 12140 if (E->getDestroyedTypeInfo()) { 12141 TypeSourceInfo *DestroyedTypeInfo 12142 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 12143 ObjectType, nullptr, SS); 12144 if (!DestroyedTypeInfo) 12145 return ExprError(); 12146 Destroyed = DestroyedTypeInfo; 12147 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 12148 // We aren't likely to be able to resolve the identifier down to a type 12149 // now anyway, so just retain the identifier. 12150 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 12151 E->getDestroyedTypeLoc()); 12152 } else { 12153 // Look for a destructor known with the given name. 12154 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 12155 *E->getDestroyedTypeIdentifier(), 12156 E->getDestroyedTypeLoc(), 12157 /*Scope=*/nullptr, 12158 SS, ObjectTypePtr, 12159 false); 12160 if (!T) 12161 return ExprError(); 12162 12163 Destroyed 12164 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 12165 E->getDestroyedTypeLoc()); 12166 } 12167 12168 TypeSourceInfo *ScopeTypeInfo = nullptr; 12169 if (E->getScopeTypeInfo()) { 12170 CXXScopeSpec EmptySS; 12171 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 12172 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 12173 if (!ScopeTypeInfo) 12174 return ExprError(); 12175 } 12176 12177 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 12178 E->getOperatorLoc(), 12179 E->isArrow(), 12180 SS, 12181 ScopeTypeInfo, 12182 E->getColonColonLoc(), 12183 E->getTildeLoc(), 12184 Destroyed); 12185 } 12186 12187 template <typename Derived> 12188 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 12189 bool RequiresADL, 12190 LookupResult &R) { 12191 // Transform all the decls. 12192 bool AllEmptyPacks = true; 12193 for (auto *OldD : Old->decls()) { 12194 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 12195 if (!InstD) { 12196 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 12197 // This can happen because of dependent hiding. 12198 if (isa<UsingShadowDecl>(OldD)) 12199 continue; 12200 else { 12201 R.clear(); 12202 return true; 12203 } 12204 } 12205 12206 // Expand using pack declarations. 12207 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 12208 ArrayRef<NamedDecl*> Decls = SingleDecl; 12209 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 12210 Decls = UPD->expansions(); 12211 12212 // Expand using declarations. 12213 for (auto *D : Decls) { 12214 if (auto *UD = dyn_cast<UsingDecl>(D)) { 12215 for (auto *SD : UD->shadows()) 12216 R.addDecl(SD); 12217 } else { 12218 R.addDecl(D); 12219 } 12220 } 12221 12222 AllEmptyPacks &= Decls.empty(); 12223 }; 12224 12225 // C++ [temp.res]/8.4.2: 12226 // The program is ill-formed, no diagnostic required, if [...] lookup for 12227 // a name in the template definition found a using-declaration, but the 12228 // lookup in the corresponding scope in the instantiation odoes not find 12229 // any declarations because the using-declaration was a pack expansion and 12230 // the corresponding pack is empty 12231 if (AllEmptyPacks && !RequiresADL) { 12232 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 12233 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 12234 return true; 12235 } 12236 12237 // Resolve a kind, but don't do any further analysis. If it's 12238 // ambiguous, the callee needs to deal with it. 12239 R.resolveKind(); 12240 return false; 12241 } 12242 12243 template<typename Derived> 12244 ExprResult 12245 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 12246 UnresolvedLookupExpr *Old) { 12247 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 12248 Sema::LookupOrdinaryName); 12249 12250 // Transform the declaration set. 12251 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 12252 return ExprError(); 12253 12254 // Rebuild the nested-name qualifier, if present. 12255 CXXScopeSpec SS; 12256 if (Old->getQualifierLoc()) { 12257 NestedNameSpecifierLoc QualifierLoc 12258 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12259 if (!QualifierLoc) 12260 return ExprError(); 12261 12262 SS.Adopt(QualifierLoc); 12263 } 12264 12265 if (Old->getNamingClass()) { 12266 CXXRecordDecl *NamingClass 12267 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12268 Old->getNameLoc(), 12269 Old->getNamingClass())); 12270 if (!NamingClass) { 12271 R.clear(); 12272 return ExprError(); 12273 } 12274 12275 R.setNamingClass(NamingClass); 12276 } 12277 12278 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12279 12280 // If we have neither explicit template arguments, nor the template keyword, 12281 // it's a normal declaration name or member reference. 12282 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 12283 NamedDecl *D = R.getAsSingle<NamedDecl>(); 12284 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 12285 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 12286 // give a good diagnostic. 12287 if (D && D->isCXXInstanceMember()) { 12288 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 12289 /*TemplateArgs=*/nullptr, 12290 /*Scope=*/nullptr); 12291 } 12292 12293 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 12294 } 12295 12296 // If we have template arguments, rebuild them, then rebuild the 12297 // templateid expression. 12298 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 12299 if (Old->hasExplicitTemplateArgs() && 12300 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12301 Old->getNumTemplateArgs(), 12302 TransArgs)) { 12303 R.clear(); 12304 return ExprError(); 12305 } 12306 12307 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 12308 Old->requiresADL(), &TransArgs); 12309 } 12310 12311 template<typename Derived> 12312 ExprResult 12313 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 12314 bool ArgChanged = false; 12315 SmallVector<TypeSourceInfo *, 4> Args; 12316 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 12317 TypeSourceInfo *From = E->getArg(I); 12318 TypeLoc FromTL = From->getTypeLoc(); 12319 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 12320 TypeLocBuilder TLB; 12321 TLB.reserve(FromTL.getFullDataSize()); 12322 QualType To = getDerived().TransformType(TLB, FromTL); 12323 if (To.isNull()) 12324 return ExprError(); 12325 12326 if (To == From->getType()) 12327 Args.push_back(From); 12328 else { 12329 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12330 ArgChanged = true; 12331 } 12332 continue; 12333 } 12334 12335 ArgChanged = true; 12336 12337 // We have a pack expansion. Instantiate it. 12338 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 12339 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 12340 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12341 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 12342 12343 // Determine whether the set of unexpanded parameter packs can and should 12344 // be expanded. 12345 bool Expand = true; 12346 bool RetainExpansion = false; 12347 Optional<unsigned> OrigNumExpansions = 12348 ExpansionTL.getTypePtr()->getNumExpansions(); 12349 Optional<unsigned> NumExpansions = OrigNumExpansions; 12350 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 12351 PatternTL.getSourceRange(), 12352 Unexpanded, 12353 Expand, RetainExpansion, 12354 NumExpansions)) 12355 return ExprError(); 12356 12357 if (!Expand) { 12358 // The transform has determined that we should perform a simple 12359 // transformation on the pack expansion, producing another pack 12360 // expansion. 12361 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12362 12363 TypeLocBuilder TLB; 12364 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12365 12366 QualType To = getDerived().TransformType(TLB, PatternTL); 12367 if (To.isNull()) 12368 return ExprError(); 12369 12370 To = getDerived().RebuildPackExpansionType(To, 12371 PatternTL.getSourceRange(), 12372 ExpansionTL.getEllipsisLoc(), 12373 NumExpansions); 12374 if (To.isNull()) 12375 return ExprError(); 12376 12377 PackExpansionTypeLoc ToExpansionTL 12378 = TLB.push<PackExpansionTypeLoc>(To); 12379 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12380 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12381 continue; 12382 } 12383 12384 // Expand the pack expansion by substituting for each argument in the 12385 // pack(s). 12386 for (unsigned I = 0; I != *NumExpansions; ++I) { 12387 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 12388 TypeLocBuilder TLB; 12389 TLB.reserve(PatternTL.getFullDataSize()); 12390 QualType To = getDerived().TransformType(TLB, PatternTL); 12391 if (To.isNull()) 12392 return ExprError(); 12393 12394 if (To->containsUnexpandedParameterPack()) { 12395 To = getDerived().RebuildPackExpansionType(To, 12396 PatternTL.getSourceRange(), 12397 ExpansionTL.getEllipsisLoc(), 12398 NumExpansions); 12399 if (To.isNull()) 12400 return ExprError(); 12401 12402 PackExpansionTypeLoc ToExpansionTL 12403 = TLB.push<PackExpansionTypeLoc>(To); 12404 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12405 } 12406 12407 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12408 } 12409 12410 if (!RetainExpansion) 12411 continue; 12412 12413 // If we're supposed to retain a pack expansion, do so by temporarily 12414 // forgetting the partially-substituted parameter pack. 12415 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12416 12417 TypeLocBuilder TLB; 12418 TLB.reserve(From->getTypeLoc().getFullDataSize()); 12419 12420 QualType To = getDerived().TransformType(TLB, PatternTL); 12421 if (To.isNull()) 12422 return ExprError(); 12423 12424 To = getDerived().RebuildPackExpansionType(To, 12425 PatternTL.getSourceRange(), 12426 ExpansionTL.getEllipsisLoc(), 12427 NumExpansions); 12428 if (To.isNull()) 12429 return ExprError(); 12430 12431 PackExpansionTypeLoc ToExpansionTL 12432 = TLB.push<PackExpansionTypeLoc>(To); 12433 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 12434 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 12435 } 12436 12437 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12438 return E; 12439 12440 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 12441 E->getEndLoc()); 12442 } 12443 12444 template<typename Derived> 12445 ExprResult 12446 TreeTransform<Derived>::TransformConceptSpecializationExpr( 12447 ConceptSpecializationExpr *E) { 12448 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 12449 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 12450 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12451 Old->NumTemplateArgs, TransArgs)) 12452 return ExprError(); 12453 12454 return getDerived().RebuildConceptSpecializationExpr( 12455 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 12456 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 12457 &TransArgs); 12458 } 12459 12460 template<typename Derived> 12461 ExprResult 12462 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 12463 SmallVector<ParmVarDecl*, 4> TransParams; 12464 SmallVector<QualType, 4> TransParamTypes; 12465 Sema::ExtParameterInfoBuilder ExtParamInfos; 12466 12467 // C++2a [expr.prim.req]p2 12468 // Expressions appearing within a requirement-body are unevaluated operands. 12469 EnterExpressionEvaluationContext Ctx( 12470 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12471 12472 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 12473 getSema().Context, getSema().CurContext, 12474 E->getBody()->getBeginLoc()); 12475 12476 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 12477 12478 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 12479 E->getLocalParameters(), 12480 /*ParamTypes=*/nullptr, 12481 /*ParamInfos=*/nullptr, 12482 TransParamTypes, &TransParams, 12483 ExtParamInfos)) 12484 return ExprError(); 12485 12486 for (ParmVarDecl *Param : TransParams) 12487 Param->setDeclContext(Body); 12488 12489 SmallVector<concepts::Requirement *, 4> TransReqs; 12490 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12491 TransReqs)) 12492 return ExprError(); 12493 12494 for (concepts::Requirement *Req : TransReqs) { 12495 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12496 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12497 ER->getReturnTypeRequirement() 12498 .getTypeConstraintTemplateParameterList()->getParam(0) 12499 ->setDeclContext(Body); 12500 } 12501 } 12502 } 12503 12504 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12505 TransParams, TransReqs, 12506 E->getRBraceLoc()); 12507 } 12508 12509 template<typename Derived> 12510 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12511 ArrayRef<concepts::Requirement *> Reqs, 12512 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12513 for (concepts::Requirement *Req : Reqs) { 12514 concepts::Requirement *TransReq = nullptr; 12515 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12516 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12517 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12518 TransReq = getDerived().TransformExprRequirement(ExprReq); 12519 else 12520 TransReq = getDerived().TransformNestedRequirement( 12521 cast<concepts::NestedRequirement>(Req)); 12522 if (!TransReq) 12523 return true; 12524 Transformed.push_back(TransReq); 12525 } 12526 return false; 12527 } 12528 12529 template<typename Derived> 12530 concepts::TypeRequirement * 12531 TreeTransform<Derived>::TransformTypeRequirement( 12532 concepts::TypeRequirement *Req) { 12533 if (Req->isSubstitutionFailure()) { 12534 if (getDerived().AlwaysRebuild()) 12535 return getDerived().RebuildTypeRequirement( 12536 Req->getSubstitutionDiagnostic()); 12537 return Req; 12538 } 12539 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12540 if (!TransType) 12541 return nullptr; 12542 return getDerived().RebuildTypeRequirement(TransType); 12543 } 12544 12545 template<typename Derived> 12546 concepts::ExprRequirement * 12547 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12548 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12549 if (Req->isExprSubstitutionFailure()) 12550 TransExpr = Req->getExprSubstitutionDiagnostic(); 12551 else { 12552 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12553 if (TransExprRes.isUsable() && TransExprRes.get()->hasPlaceholderType()) 12554 TransExprRes = SemaRef.CheckPlaceholderExpr(TransExprRes.get()); 12555 if (TransExprRes.isInvalid()) 12556 return nullptr; 12557 TransExpr = TransExprRes.get(); 12558 } 12559 12560 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12561 const auto &RetReq = Req->getReturnTypeRequirement(); 12562 if (RetReq.isEmpty()) 12563 TransRetReq.emplace(); 12564 else if (RetReq.isSubstitutionFailure()) 12565 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12566 else if (RetReq.isTypeConstraint()) { 12567 TemplateParameterList *OrigTPL = 12568 RetReq.getTypeConstraintTemplateParameterList(); 12569 TemplateParameterList *TPL = 12570 getDerived().TransformTemplateParameterList(OrigTPL); 12571 if (!TPL) 12572 return nullptr; 12573 TransRetReq.emplace(TPL); 12574 } 12575 assert(TransRetReq.hasValue() && 12576 "All code paths leading here must set TransRetReq"); 12577 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12578 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12579 Req->getNoexceptLoc(), 12580 std::move(*TransRetReq)); 12581 return getDerived().RebuildExprRequirement( 12582 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12583 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12584 } 12585 12586 template<typename Derived> 12587 concepts::NestedRequirement * 12588 TreeTransform<Derived>::TransformNestedRequirement( 12589 concepts::NestedRequirement *Req) { 12590 if (Req->isSubstitutionFailure()) { 12591 if (getDerived().AlwaysRebuild()) 12592 return getDerived().RebuildNestedRequirement( 12593 Req->getSubstitutionDiagnostic()); 12594 return Req; 12595 } 12596 ExprResult TransConstraint = 12597 getDerived().TransformExpr(Req->getConstraintExpr()); 12598 if (TransConstraint.isInvalid()) 12599 return nullptr; 12600 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12601 } 12602 12603 template<typename Derived> 12604 ExprResult 12605 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12606 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12607 if (!T) 12608 return ExprError(); 12609 12610 if (!getDerived().AlwaysRebuild() && 12611 T == E->getQueriedTypeSourceInfo()) 12612 return E; 12613 12614 ExprResult SubExpr; 12615 { 12616 EnterExpressionEvaluationContext Unevaluated( 12617 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12618 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12619 if (SubExpr.isInvalid()) 12620 return ExprError(); 12621 12622 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12623 return E; 12624 } 12625 12626 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12627 SubExpr.get(), E->getEndLoc()); 12628 } 12629 12630 template<typename Derived> 12631 ExprResult 12632 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12633 ExprResult SubExpr; 12634 { 12635 EnterExpressionEvaluationContext Unevaluated( 12636 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12637 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12638 if (SubExpr.isInvalid()) 12639 return ExprError(); 12640 12641 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12642 return E; 12643 } 12644 12645 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12646 SubExpr.get(), E->getEndLoc()); 12647 } 12648 12649 template <typename Derived> 12650 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12651 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12652 TypeSourceInfo **RecoveryTSI) { 12653 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12654 DRE, AddrTaken, RecoveryTSI); 12655 12656 // Propagate both errors and recovered types, which return ExprEmpty. 12657 if (!NewDRE.isUsable()) 12658 return NewDRE; 12659 12660 // We got an expr, wrap it up in parens. 12661 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12662 return PE; 12663 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12664 PE->getRParen()); 12665 } 12666 12667 template <typename Derived> 12668 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12669 DependentScopeDeclRefExpr *E) { 12670 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12671 nullptr); 12672 } 12673 12674 template <typename Derived> 12675 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12676 DependentScopeDeclRefExpr *E, bool IsAddressOfOperand, 12677 TypeSourceInfo **RecoveryTSI) { 12678 assert(E->getQualifierLoc()); 12679 NestedNameSpecifierLoc QualifierLoc = 12680 getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12681 if (!QualifierLoc) 12682 return ExprError(); 12683 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12684 12685 // TODO: If this is a conversion-function-id, verify that the 12686 // destination type name (if present) resolves the same way after 12687 // instantiation as it did in the local scope. 12688 12689 DeclarationNameInfo NameInfo = 12690 getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12691 if (!NameInfo.getName()) 12692 return ExprError(); 12693 12694 if (!E->hasExplicitTemplateArgs()) { 12695 if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() && 12696 // Note: it is sufficient to compare the Name component of NameInfo: 12697 // if name has not changed, DNLoc has not changed either. 12698 NameInfo.getName() == E->getDeclName()) 12699 return E; 12700 12701 return getDerived().RebuildDependentScopeDeclRefExpr( 12702 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12703 IsAddressOfOperand, RecoveryTSI); 12704 } 12705 12706 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12707 if (getDerived().TransformTemplateArguments( 12708 E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs)) 12709 return ExprError(); 12710 12711 return getDerived().RebuildDependentScopeDeclRefExpr( 12712 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12713 RecoveryTSI); 12714 } 12715 12716 template<typename Derived> 12717 ExprResult 12718 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12719 // CXXConstructExprs other than for list-initialization and 12720 // CXXTemporaryObjectExpr are always implicit, so when we have 12721 // a 1-argument construction we just transform that argument. 12722 if (getDerived().AllowSkippingCXXConstructExpr() && 12723 ((E->getNumArgs() == 1 || 12724 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12725 (!getDerived().DropCallArgument(E->getArg(0))) && 12726 !E->isListInitialization())) 12727 return getDerived().TransformInitializer(E->getArg(0), 12728 /*DirectInit*/ false); 12729 12730 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12731 12732 QualType T = getDerived().TransformType(E->getType()); 12733 if (T.isNull()) 12734 return ExprError(); 12735 12736 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12737 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12738 if (!Constructor) 12739 return ExprError(); 12740 12741 bool ArgumentChanged = false; 12742 SmallVector<Expr*, 8> Args; 12743 { 12744 EnterExpressionEvaluationContext Context( 12745 getSema(), EnterExpressionEvaluationContext::InitList, 12746 E->isListInitialization()); 12747 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12748 &ArgumentChanged)) 12749 return ExprError(); 12750 } 12751 12752 if (!getDerived().AlwaysRebuild() && 12753 T == E->getType() && 12754 Constructor == E->getConstructor() && 12755 !ArgumentChanged) { 12756 // Mark the constructor as referenced. 12757 // FIXME: Instantiation-specific 12758 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12759 return E; 12760 } 12761 12762 return getDerived().RebuildCXXConstructExpr( 12763 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12764 E->hadMultipleCandidates(), E->isListInitialization(), 12765 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12766 E->getConstructionKind(), E->getParenOrBraceRange()); 12767 } 12768 12769 template<typename Derived> 12770 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12771 CXXInheritedCtorInitExpr *E) { 12772 QualType T = getDerived().TransformType(E->getType()); 12773 if (T.isNull()) 12774 return ExprError(); 12775 12776 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12777 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12778 if (!Constructor) 12779 return ExprError(); 12780 12781 if (!getDerived().AlwaysRebuild() && 12782 T == E->getType() && 12783 Constructor == E->getConstructor()) { 12784 // Mark the constructor as referenced. 12785 // FIXME: Instantiation-specific 12786 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12787 return E; 12788 } 12789 12790 return getDerived().RebuildCXXInheritedCtorInitExpr( 12791 T, E->getLocation(), Constructor, 12792 E->constructsVBase(), E->inheritedFromVBase()); 12793 } 12794 12795 /// Transform a C++ temporary-binding expression. 12796 /// 12797 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12798 /// transform the subexpression and return that. 12799 template<typename Derived> 12800 ExprResult 12801 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12802 if (auto *Dtor = E->getTemporary()->getDestructor()) 12803 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 12804 const_cast<CXXDestructorDecl *>(Dtor)); 12805 return getDerived().TransformExpr(E->getSubExpr()); 12806 } 12807 12808 /// Transform a C++ expression that contains cleanups that should 12809 /// be run after the expression is evaluated. 12810 /// 12811 /// Since ExprWithCleanups nodes are implicitly generated, we 12812 /// just transform the subexpression and return that. 12813 template<typename Derived> 12814 ExprResult 12815 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12816 return getDerived().TransformExpr(E->getSubExpr()); 12817 } 12818 12819 template<typename Derived> 12820 ExprResult 12821 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12822 CXXTemporaryObjectExpr *E) { 12823 TypeSourceInfo *T = 12824 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12825 if (!T) 12826 return ExprError(); 12827 12828 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12829 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12830 if (!Constructor) 12831 return ExprError(); 12832 12833 bool ArgumentChanged = false; 12834 SmallVector<Expr*, 8> Args; 12835 Args.reserve(E->getNumArgs()); 12836 { 12837 EnterExpressionEvaluationContext Context( 12838 getSema(), EnterExpressionEvaluationContext::InitList, 12839 E->isListInitialization()); 12840 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12841 &ArgumentChanged)) 12842 return ExprError(); 12843 } 12844 12845 if (!getDerived().AlwaysRebuild() && 12846 T == E->getTypeSourceInfo() && 12847 Constructor == E->getConstructor() && 12848 !ArgumentChanged) { 12849 // FIXME: Instantiation-specific 12850 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12851 return SemaRef.MaybeBindToTemporary(E); 12852 } 12853 12854 // FIXME: We should just pass E->isListInitialization(), but we're not 12855 // prepared to handle list-initialization without a child InitListExpr. 12856 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12857 return getDerived().RebuildCXXTemporaryObjectExpr( 12858 T, LParenLoc, Args, E->getEndLoc(), 12859 /*ListInitialization=*/LParenLoc.isInvalid()); 12860 } 12861 12862 template<typename Derived> 12863 ExprResult 12864 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12865 // Transform any init-capture expressions before entering the scope of the 12866 // lambda body, because they are not semantically within that scope. 12867 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12868 struct TransformedInitCapture { 12869 // The location of the ... if the result is retaining a pack expansion. 12870 SourceLocation EllipsisLoc; 12871 // Zero or more expansions of the init-capture. 12872 SmallVector<InitCaptureInfoTy, 4> Expansions; 12873 }; 12874 SmallVector<TransformedInitCapture, 4> InitCaptures; 12875 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12876 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12877 CEnd = E->capture_end(); 12878 C != CEnd; ++C) { 12879 if (!E->isInitCapture(C)) 12880 continue; 12881 12882 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12883 VarDecl *OldVD = C->getCapturedVar(); 12884 12885 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12886 Optional<unsigned> NumExpansions) { 12887 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12888 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12889 12890 if (NewExprInitResult.isInvalid()) { 12891 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12892 return; 12893 } 12894 Expr *NewExprInit = NewExprInitResult.get(); 12895 12896 QualType NewInitCaptureType = 12897 getSema().buildLambdaInitCaptureInitialization( 12898 C->getLocation(), OldVD->getType()->isReferenceType(), 12899 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12900 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12901 NewExprInit); 12902 Result.Expansions.push_back( 12903 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12904 }; 12905 12906 // If this is an init-capture pack, consider expanding the pack now. 12907 if (OldVD->isParameterPack()) { 12908 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12909 ->getTypeLoc() 12910 .castAs<PackExpansionTypeLoc>(); 12911 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12912 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12913 12914 // Determine whether the set of unexpanded parameter packs can and should 12915 // be expanded. 12916 bool Expand = true; 12917 bool RetainExpansion = false; 12918 Optional<unsigned> OrigNumExpansions = 12919 ExpansionTL.getTypePtr()->getNumExpansions(); 12920 Optional<unsigned> NumExpansions = OrigNumExpansions; 12921 if (getDerived().TryExpandParameterPacks( 12922 ExpansionTL.getEllipsisLoc(), 12923 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12924 RetainExpansion, NumExpansions)) 12925 return ExprError(); 12926 if (Expand) { 12927 for (unsigned I = 0; I != *NumExpansions; ++I) { 12928 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12929 SubstInitCapture(SourceLocation(), None); 12930 } 12931 } 12932 if (!Expand || RetainExpansion) { 12933 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12934 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12935 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12936 } 12937 } else { 12938 SubstInitCapture(SourceLocation(), None); 12939 } 12940 } 12941 12942 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12943 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12944 12945 // Transform the template parameters, and add them to the current 12946 // instantiation scope. The null case is handled correctly. 12947 auto TPL = getDerived().TransformTemplateParameterList( 12948 E->getTemplateParameterList()); 12949 LSI->GLTemplateParameterList = TPL; 12950 12951 // Transform the type of the original lambda's call operator. 12952 // The transformation MUST be done in the CurrentInstantiationScope since 12953 // it introduces a mapping of the original to the newly created 12954 // transformed parameters. 12955 TypeSourceInfo *NewCallOpTSI = nullptr; 12956 { 12957 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12958 FunctionProtoTypeLoc OldCallOpFPTL = 12959 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12960 12961 TypeLocBuilder NewCallOpTLBuilder; 12962 SmallVector<QualType, 4> ExceptionStorage; 12963 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12964 QualType NewCallOpType = TransformFunctionProtoType( 12965 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12966 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12967 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12968 ExceptionStorage, Changed); 12969 }); 12970 if (NewCallOpType.isNull()) 12971 return ExprError(); 12972 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12973 NewCallOpType); 12974 } 12975 12976 // Transform the trailing requires clause 12977 ExprResult NewTrailingRequiresClause; 12978 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12979 // FIXME: Concepts: Substitution into requires clause should only happen 12980 // when checking satisfaction. 12981 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12982 12983 // Create the local class that will describe the lambda. 12984 12985 // FIXME: DependencyKind below is wrong when substituting inside a templated 12986 // context that isn't a DeclContext (such as a variable template), or when 12987 // substituting an unevaluated lambda inside of a function's parameter's type 12988 // - as parameter types are not instantiated from within a function's DC. We 12989 // use isUnevaluatedContext() to distinguish the function parameter case. 12990 CXXRecordDecl::LambdaDependencyKind DependencyKind = 12991 CXXRecordDecl::LDK_Unknown; 12992 if (getSema().isUnevaluatedContext() && 12993 (getSema().CurContext->isFileContext() || 12994 !getSema().CurContext->getParent()->isDependentContext())) 12995 DependencyKind = CXXRecordDecl::LDK_NeverDependent; 12996 12997 CXXRecordDecl *OldClass = E->getLambdaClass(); 12998 CXXRecordDecl *Class = 12999 getSema().createLambdaClosureType(E->getIntroducerRange(), NewCallOpTSI, 13000 DependencyKind, E->getCaptureDefault()); 13001 13002 getDerived().transformedLocalDecl(OldClass, {Class}); 13003 13004 Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling; 13005 if (getDerived().ReplacingOriginal()) 13006 Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(), 13007 OldClass->getLambdaManglingNumber(), 13008 OldClass->getDeviceLambdaManglingNumber(), 13009 OldClass->getLambdaContextDecl()); 13010 13011 // Build the call operator. 13012 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 13013 Class, E->getIntroducerRange(), NewCallOpTSI, 13014 E->getCallOperator()->getEndLoc(), 13015 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 13016 E->getCallOperator()->getConstexprKind(), 13017 NewTrailingRequiresClause.get()); 13018 13019 LSI->CallOperator = NewCallOperator; 13020 13021 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 13022 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 13023 13024 // Number the lambda for linkage purposes if necessary. 13025 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 13026 13027 // Introduce the context of the call operator. 13028 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 13029 /*NewThisContext*/false); 13030 13031 // Enter the scope of the lambda. 13032 getSema().buildLambdaScope(LSI, NewCallOperator, 13033 E->getIntroducerRange(), 13034 E->getCaptureDefault(), 13035 E->getCaptureDefaultLoc(), 13036 E->hasExplicitParameters(), 13037 E->hasExplicitResultType(), 13038 E->isMutable()); 13039 13040 bool Invalid = false; 13041 13042 // Transform captures. 13043 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13044 CEnd = E->capture_end(); 13045 C != CEnd; ++C) { 13046 // When we hit the first implicit capture, tell Sema that we've finished 13047 // the list of explicit captures. 13048 if (C->isImplicit()) 13049 break; 13050 13051 // Capturing 'this' is trivial. 13052 if (C->capturesThis()) { 13053 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13054 /*BuildAndDiagnose*/ true, nullptr, 13055 C->getCaptureKind() == LCK_StarThis); 13056 continue; 13057 } 13058 // Captured expression will be recaptured during captured variables 13059 // rebuilding. 13060 if (C->capturesVLAType()) 13061 continue; 13062 13063 // Rebuild init-captures, including the implied field declaration. 13064 if (E->isInitCapture(C)) { 13065 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 13066 13067 VarDecl *OldVD = C->getCapturedVar(); 13068 llvm::SmallVector<Decl*, 4> NewVDs; 13069 13070 for (InitCaptureInfoTy &Info : NewC.Expansions) { 13071 ExprResult Init = Info.first; 13072 QualType InitQualType = Info.second; 13073 if (Init.isInvalid() || InitQualType.isNull()) { 13074 Invalid = true; 13075 break; 13076 } 13077 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 13078 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 13079 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 13080 if (!NewVD) { 13081 Invalid = true; 13082 break; 13083 } 13084 NewVDs.push_back(NewVD); 13085 getSema().addInitCapture(LSI, NewVD); 13086 } 13087 13088 if (Invalid) 13089 break; 13090 13091 getDerived().transformedLocalDecl(OldVD, NewVDs); 13092 continue; 13093 } 13094 13095 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13096 13097 // Determine the capture kind for Sema. 13098 Sema::TryCaptureKind Kind 13099 = C->isImplicit()? Sema::TryCapture_Implicit 13100 : C->getCaptureKind() == LCK_ByCopy 13101 ? Sema::TryCapture_ExplicitByVal 13102 : Sema::TryCapture_ExplicitByRef; 13103 SourceLocation EllipsisLoc; 13104 if (C->isPackExpansion()) { 13105 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 13106 bool ShouldExpand = false; 13107 bool RetainExpansion = false; 13108 Optional<unsigned> NumExpansions; 13109 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 13110 C->getLocation(), 13111 Unexpanded, 13112 ShouldExpand, RetainExpansion, 13113 NumExpansions)) { 13114 Invalid = true; 13115 continue; 13116 } 13117 13118 if (ShouldExpand) { 13119 // The transform has determined that we should perform an expansion; 13120 // transform and capture each of the arguments. 13121 // expansion of the pattern. Do so. 13122 VarDecl *Pack = C->getCapturedVar(); 13123 for (unsigned I = 0; I != *NumExpansions; ++I) { 13124 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13125 VarDecl *CapturedVar 13126 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13127 Pack)); 13128 if (!CapturedVar) { 13129 Invalid = true; 13130 continue; 13131 } 13132 13133 // Capture the transformed variable. 13134 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 13135 } 13136 13137 // FIXME: Retain a pack expansion if RetainExpansion is true. 13138 13139 continue; 13140 } 13141 13142 EllipsisLoc = C->getEllipsisLoc(); 13143 } 13144 13145 // Transform the captured variable. 13146 VarDecl *CapturedVar 13147 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 13148 C->getCapturedVar())); 13149 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 13150 Invalid = true; 13151 continue; 13152 } 13153 13154 // Capture the transformed variable. 13155 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 13156 EllipsisLoc); 13157 } 13158 getSema().finishLambdaExplicitCaptures(LSI); 13159 13160 // FIXME: Sema's lambda-building mechanism expects us to push an expression 13161 // evaluation context even if we're not transforming the function body. 13162 getSema().PushExpressionEvaluationContext( 13163 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 13164 13165 // Instantiate the body of the lambda expression. 13166 StmtResult Body = 13167 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 13168 13169 // ActOnLambda* will pop the function scope for us. 13170 FuncScopeCleanup.disable(); 13171 13172 if (Body.isInvalid()) { 13173 SavedContext.pop(); 13174 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 13175 /*IsInstantiation=*/true); 13176 return ExprError(); 13177 } 13178 13179 // Copy the LSI before ActOnFinishFunctionBody removes it. 13180 // FIXME: This is dumb. Store the lambda information somewhere that outlives 13181 // the call operator. 13182 auto LSICopy = *LSI; 13183 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 13184 /*IsInstantiation*/ true); 13185 SavedContext.pop(); 13186 13187 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 13188 &LSICopy); 13189 } 13190 13191 template<typename Derived> 13192 StmtResult 13193 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 13194 return TransformStmt(S); 13195 } 13196 13197 template<typename Derived> 13198 StmtResult 13199 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 13200 // Transform captures. 13201 for (LambdaExpr::capture_iterator C = E->capture_begin(), 13202 CEnd = E->capture_end(); 13203 C != CEnd; ++C) { 13204 // When we hit the first implicit capture, tell Sema that we've finished 13205 // the list of explicit captures. 13206 if (!C->isImplicit()) 13207 continue; 13208 13209 // Capturing 'this' is trivial. 13210 if (C->capturesThis()) { 13211 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 13212 /*BuildAndDiagnose*/ true, nullptr, 13213 C->getCaptureKind() == LCK_StarThis); 13214 continue; 13215 } 13216 // Captured expression will be recaptured during captured variables 13217 // rebuilding. 13218 if (C->capturesVLAType()) 13219 continue; 13220 13221 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 13222 assert(!E->isInitCapture(C) && "implicit init-capture?"); 13223 13224 // Transform the captured variable. 13225 VarDecl *CapturedVar = cast_or_null<VarDecl>( 13226 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 13227 if (!CapturedVar || CapturedVar->isInvalidDecl()) 13228 return StmtError(); 13229 13230 // Capture the transformed variable. 13231 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 13232 } 13233 13234 return S; 13235 } 13236 13237 template<typename Derived> 13238 ExprResult 13239 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 13240 CXXUnresolvedConstructExpr *E) { 13241 TypeSourceInfo *T = 13242 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 13243 if (!T) 13244 return ExprError(); 13245 13246 bool ArgumentChanged = false; 13247 SmallVector<Expr*, 8> Args; 13248 Args.reserve(E->getNumArgs()); 13249 { 13250 EnterExpressionEvaluationContext Context( 13251 getSema(), EnterExpressionEvaluationContext::InitList, 13252 E->isListInitialization()); 13253 if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args, 13254 &ArgumentChanged)) 13255 return ExprError(); 13256 } 13257 13258 if (!getDerived().AlwaysRebuild() && 13259 T == E->getTypeSourceInfo() && 13260 !ArgumentChanged) 13261 return E; 13262 13263 // FIXME: we're faking the locations of the commas 13264 return getDerived().RebuildCXXUnresolvedConstructExpr( 13265 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 13266 } 13267 13268 template<typename Derived> 13269 ExprResult 13270 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 13271 CXXDependentScopeMemberExpr *E) { 13272 // Transform the base of the expression. 13273 ExprResult Base((Expr*) nullptr); 13274 Expr *OldBase; 13275 QualType BaseType; 13276 QualType ObjectType; 13277 if (!E->isImplicitAccess()) { 13278 OldBase = E->getBase(); 13279 Base = getDerived().TransformExpr(OldBase); 13280 if (Base.isInvalid()) 13281 return ExprError(); 13282 13283 // Start the member reference and compute the object's type. 13284 ParsedType ObjectTy; 13285 bool MayBePseudoDestructor = false; 13286 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 13287 E->getOperatorLoc(), 13288 E->isArrow()? tok::arrow : tok::period, 13289 ObjectTy, 13290 MayBePseudoDestructor); 13291 if (Base.isInvalid()) 13292 return ExprError(); 13293 13294 ObjectType = ObjectTy.get(); 13295 BaseType = ((Expr*) Base.get())->getType(); 13296 } else { 13297 OldBase = nullptr; 13298 BaseType = getDerived().TransformType(E->getBaseType()); 13299 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 13300 } 13301 13302 // Transform the first part of the nested-name-specifier that qualifies 13303 // the member name. 13304 NamedDecl *FirstQualifierInScope 13305 = getDerived().TransformFirstQualifierInScope( 13306 E->getFirstQualifierFoundInScope(), 13307 E->getQualifierLoc().getBeginLoc()); 13308 13309 NestedNameSpecifierLoc QualifierLoc; 13310 if (E->getQualifier()) { 13311 QualifierLoc 13312 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 13313 ObjectType, 13314 FirstQualifierInScope); 13315 if (!QualifierLoc) 13316 return ExprError(); 13317 } 13318 13319 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 13320 13321 // TODO: If this is a conversion-function-id, verify that the 13322 // destination type name (if present) resolves the same way after 13323 // instantiation as it did in the local scope. 13324 13325 DeclarationNameInfo NameInfo 13326 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 13327 if (!NameInfo.getName()) 13328 return ExprError(); 13329 13330 if (!E->hasExplicitTemplateArgs()) { 13331 // This is a reference to a member without an explicitly-specified 13332 // template argument list. Optimize for this common case. 13333 if (!getDerived().AlwaysRebuild() && 13334 Base.get() == OldBase && 13335 BaseType == E->getBaseType() && 13336 QualifierLoc == E->getQualifierLoc() && 13337 NameInfo.getName() == E->getMember() && 13338 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 13339 return E; 13340 13341 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13342 BaseType, 13343 E->isArrow(), 13344 E->getOperatorLoc(), 13345 QualifierLoc, 13346 TemplateKWLoc, 13347 FirstQualifierInScope, 13348 NameInfo, 13349 /*TemplateArgs*/nullptr); 13350 } 13351 13352 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 13353 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 13354 E->getNumTemplateArgs(), 13355 TransArgs)) 13356 return ExprError(); 13357 13358 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 13359 BaseType, 13360 E->isArrow(), 13361 E->getOperatorLoc(), 13362 QualifierLoc, 13363 TemplateKWLoc, 13364 FirstQualifierInScope, 13365 NameInfo, 13366 &TransArgs); 13367 } 13368 13369 template <typename Derived> 13370 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr( 13371 UnresolvedMemberExpr *Old) { 13372 // Transform the base of the expression. 13373 ExprResult Base((Expr *)nullptr); 13374 QualType BaseType; 13375 if (!Old->isImplicitAccess()) { 13376 Base = getDerived().TransformExpr(Old->getBase()); 13377 if (Base.isInvalid()) 13378 return ExprError(); 13379 Base = 13380 getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow()); 13381 if (Base.isInvalid()) 13382 return ExprError(); 13383 BaseType = Base.get()->getType(); 13384 } else { 13385 BaseType = getDerived().TransformType(Old->getBaseType()); 13386 } 13387 13388 NestedNameSpecifierLoc QualifierLoc; 13389 if (Old->getQualifierLoc()) { 13390 QualifierLoc = 13391 getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 13392 if (!QualifierLoc) 13393 return ExprError(); 13394 } 13395 13396 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 13397 13398 LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName); 13399 13400 // Transform the declaration set. 13401 if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R)) 13402 return ExprError(); 13403 13404 // Determine the naming class. 13405 if (Old->getNamingClass()) { 13406 CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>( 13407 getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass())); 13408 if (!NamingClass) 13409 return ExprError(); 13410 13411 R.setNamingClass(NamingClass); 13412 } 13413 13414 TemplateArgumentListInfo TransArgs; 13415 if (Old->hasExplicitTemplateArgs()) { 13416 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 13417 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 13418 if (getDerived().TransformTemplateArguments( 13419 Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs)) 13420 return ExprError(); 13421 } 13422 13423 // FIXME: to do this check properly, we will need to preserve the 13424 // first-qualifier-in-scope here, just in case we had a dependent 13425 // base (and therefore couldn't do the check) and a 13426 // nested-name-qualifier (and therefore could do the lookup). 13427 NamedDecl *FirstQualifierInScope = nullptr; 13428 13429 return getDerived().RebuildUnresolvedMemberExpr( 13430 Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc, 13431 TemplateKWLoc, FirstQualifierInScope, R, 13432 (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr)); 13433 } 13434 13435 template<typename Derived> 13436 ExprResult 13437 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 13438 EnterExpressionEvaluationContext Unevaluated( 13439 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 13440 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 13441 if (SubExpr.isInvalid()) 13442 return ExprError(); 13443 13444 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 13445 return E; 13446 13447 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 13448 } 13449 13450 template<typename Derived> 13451 ExprResult 13452 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 13453 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 13454 if (Pattern.isInvalid()) 13455 return ExprError(); 13456 13457 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 13458 return E; 13459 13460 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 13461 E->getNumExpansions()); 13462 } 13463 13464 template<typename Derived> 13465 ExprResult 13466 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 13467 // If E is not value-dependent, then nothing will change when we transform it. 13468 // Note: This is an instantiation-centric view. 13469 if (!E->isValueDependent()) 13470 return E; 13471 13472 EnterExpressionEvaluationContext Unevaluated( 13473 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 13474 13475 ArrayRef<TemplateArgument> PackArgs; 13476 TemplateArgument ArgStorage; 13477 13478 // Find the argument list to transform. 13479 if (E->isPartiallySubstituted()) { 13480 PackArgs = E->getPartialArguments(); 13481 } else if (E->isValueDependent()) { 13482 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 13483 bool ShouldExpand = false; 13484 bool RetainExpansion = false; 13485 Optional<unsigned> NumExpansions; 13486 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 13487 Unexpanded, 13488 ShouldExpand, RetainExpansion, 13489 NumExpansions)) 13490 return ExprError(); 13491 13492 // If we need to expand the pack, build a template argument from it and 13493 // expand that. 13494 if (ShouldExpand) { 13495 auto *Pack = E->getPack(); 13496 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13497 ArgStorage = getSema().Context.getPackExpansionType( 13498 getSema().Context.getTypeDeclType(TTPD), None); 13499 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13500 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13501 } else { 13502 auto *VD = cast<ValueDecl>(Pack); 13503 ExprResult DRE = getSema().BuildDeclRefExpr( 13504 VD, VD->getType().getNonLValueExprType(getSema().Context), 13505 VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue, 13506 E->getPackLoc()); 13507 if (DRE.isInvalid()) 13508 return ExprError(); 13509 ArgStorage = new (getSema().Context) PackExpansionExpr( 13510 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13511 } 13512 PackArgs = ArgStorage; 13513 } 13514 } 13515 13516 // If we're not expanding the pack, just transform the decl. 13517 if (!PackArgs.size()) { 13518 auto *Pack = cast_or_null<NamedDecl>( 13519 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13520 if (!Pack) 13521 return ExprError(); 13522 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13523 E->getPackLoc(), 13524 E->getRParenLoc(), None, None); 13525 } 13526 13527 // Try to compute the result without performing a partial substitution. 13528 Optional<unsigned> Result = 0; 13529 for (const TemplateArgument &Arg : PackArgs) { 13530 if (!Arg.isPackExpansion()) { 13531 Result = *Result + 1; 13532 continue; 13533 } 13534 13535 TemplateArgumentLoc ArgLoc; 13536 InventTemplateArgumentLoc(Arg, ArgLoc); 13537 13538 // Find the pattern of the pack expansion. 13539 SourceLocation Ellipsis; 13540 Optional<unsigned> OrigNumExpansions; 13541 TemplateArgumentLoc Pattern = 13542 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13543 OrigNumExpansions); 13544 13545 // Substitute under the pack expansion. Do not expand the pack (yet). 13546 TemplateArgumentLoc OutPattern; 13547 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13548 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13549 /*Uneval*/ true)) 13550 return true; 13551 13552 // See if we can determine the number of arguments from the result. 13553 Optional<unsigned> NumExpansions = 13554 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13555 if (!NumExpansions) { 13556 // No: we must be in an alias template expansion, and we're going to need 13557 // to actually expand the packs. 13558 Result = None; 13559 break; 13560 } 13561 13562 Result = *Result + *NumExpansions; 13563 } 13564 13565 // Common case: we could determine the number of expansions without 13566 // substituting. 13567 if (Result) 13568 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13569 E->getPackLoc(), 13570 E->getRParenLoc(), *Result, None); 13571 13572 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13573 E->getPackLoc()); 13574 { 13575 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13576 typedef TemplateArgumentLocInventIterator< 13577 Derived, const TemplateArgument*> PackLocIterator; 13578 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13579 PackLocIterator(*this, PackArgs.end()), 13580 TransformedPackArgs, /*Uneval*/true)) 13581 return ExprError(); 13582 } 13583 13584 // Check whether we managed to fully-expand the pack. 13585 // FIXME: Is it possible for us to do so and not hit the early exit path? 13586 SmallVector<TemplateArgument, 8> Args; 13587 bool PartialSubstitution = false; 13588 for (auto &Loc : TransformedPackArgs.arguments()) { 13589 Args.push_back(Loc.getArgument()); 13590 if (Loc.getArgument().isPackExpansion()) 13591 PartialSubstitution = true; 13592 } 13593 13594 if (PartialSubstitution) 13595 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13596 E->getPackLoc(), 13597 E->getRParenLoc(), None, Args); 13598 13599 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13600 E->getPackLoc(), E->getRParenLoc(), 13601 Args.size(), None); 13602 } 13603 13604 template<typename Derived> 13605 ExprResult 13606 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13607 SubstNonTypeTemplateParmPackExpr *E) { 13608 // Default behavior is to do nothing with this transformation. 13609 return E; 13610 } 13611 13612 template<typename Derived> 13613 ExprResult 13614 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13615 SubstNonTypeTemplateParmExpr *E) { 13616 // Default behavior is to do nothing with this transformation. 13617 return E; 13618 } 13619 13620 template<typename Derived> 13621 ExprResult 13622 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13623 // Default behavior is to do nothing with this transformation. 13624 return E; 13625 } 13626 13627 template<typename Derived> 13628 ExprResult 13629 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13630 MaterializeTemporaryExpr *E) { 13631 return getDerived().TransformExpr(E->getSubExpr()); 13632 } 13633 13634 template<typename Derived> 13635 ExprResult 13636 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13637 UnresolvedLookupExpr *Callee = nullptr; 13638 if (Expr *OldCallee = E->getCallee()) { 13639 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13640 if (CalleeResult.isInvalid()) 13641 return ExprError(); 13642 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13643 } 13644 13645 Expr *Pattern = E->getPattern(); 13646 13647 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13648 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13649 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13650 13651 // Determine whether the set of unexpanded parameter packs can and should 13652 // be expanded. 13653 bool Expand = true; 13654 bool RetainExpansion = false; 13655 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13656 NumExpansions = OrigNumExpansions; 13657 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13658 Pattern->getSourceRange(), 13659 Unexpanded, 13660 Expand, RetainExpansion, 13661 NumExpansions)) 13662 return true; 13663 13664 if (!Expand) { 13665 // Do not expand any packs here, just transform and rebuild a fold 13666 // expression. 13667 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13668 13669 ExprResult LHS = 13670 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13671 if (LHS.isInvalid()) 13672 return true; 13673 13674 ExprResult RHS = 13675 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13676 if (RHS.isInvalid()) 13677 return true; 13678 13679 if (!getDerived().AlwaysRebuild() && 13680 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13681 return E; 13682 13683 return getDerived().RebuildCXXFoldExpr( 13684 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13685 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13686 } 13687 13688 // Formally a fold expression expands to nested parenthesized expressions. 13689 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13690 // them. 13691 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13692 SemaRef.Diag(E->getEllipsisLoc(), 13693 clang::diag::err_fold_expression_limit_exceeded) 13694 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13695 << E->getSourceRange(); 13696 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13697 return ExprError(); 13698 } 13699 13700 // The transform has determined that we should perform an elementwise 13701 // expansion of the pattern. Do so. 13702 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13703 if (Result.isInvalid()) 13704 return true; 13705 bool LeftFold = E->isLeftFold(); 13706 13707 // If we're retaining an expansion for a right fold, it is the innermost 13708 // component and takes the init (if any). 13709 if (!LeftFold && RetainExpansion) { 13710 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13711 13712 ExprResult Out = getDerived().TransformExpr(Pattern); 13713 if (Out.isInvalid()) 13714 return true; 13715 13716 Result = getDerived().RebuildCXXFoldExpr( 13717 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13718 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13719 if (Result.isInvalid()) 13720 return true; 13721 } 13722 13723 for (unsigned I = 0; I != *NumExpansions; ++I) { 13724 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13725 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13726 ExprResult Out = getDerived().TransformExpr(Pattern); 13727 if (Out.isInvalid()) 13728 return true; 13729 13730 if (Out.get()->containsUnexpandedParameterPack()) { 13731 // We still have a pack; retain a pack expansion for this slice. 13732 Result = getDerived().RebuildCXXFoldExpr( 13733 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13734 E->getOperator(), E->getEllipsisLoc(), 13735 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13736 OrigNumExpansions); 13737 } else if (Result.isUsable()) { 13738 // We've got down to a single element; build a binary operator. 13739 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13740 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13741 if (Callee) 13742 Result = getDerived().RebuildCXXOperatorCallExpr( 13743 BinaryOperator::getOverloadedOperator(E->getOperator()), 13744 E->getEllipsisLoc(), Callee, LHS, RHS); 13745 else 13746 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13747 E->getOperator(), LHS, RHS); 13748 } else 13749 Result = Out; 13750 13751 if (Result.isInvalid()) 13752 return true; 13753 } 13754 13755 // If we're retaining an expansion for a left fold, it is the outermost 13756 // component and takes the complete expansion so far as its init (if any). 13757 if (LeftFold && RetainExpansion) { 13758 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13759 13760 ExprResult Out = getDerived().TransformExpr(Pattern); 13761 if (Out.isInvalid()) 13762 return true; 13763 13764 Result = getDerived().RebuildCXXFoldExpr( 13765 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13766 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13767 if (Result.isInvalid()) 13768 return true; 13769 } 13770 13771 // If we had no init and an empty pack, and we're not retaining an expansion, 13772 // then produce a fallback value or error. 13773 if (Result.isUnset()) 13774 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13775 E->getOperator()); 13776 13777 return Result; 13778 } 13779 13780 template<typename Derived> 13781 ExprResult 13782 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13783 CXXStdInitializerListExpr *E) { 13784 return getDerived().TransformExpr(E->getSubExpr()); 13785 } 13786 13787 template<typename Derived> 13788 ExprResult 13789 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13790 return SemaRef.MaybeBindToTemporary(E); 13791 } 13792 13793 template<typename Derived> 13794 ExprResult 13795 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13796 return E; 13797 } 13798 13799 template<typename Derived> 13800 ExprResult 13801 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13802 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13803 if (SubExpr.isInvalid()) 13804 return ExprError(); 13805 13806 if (!getDerived().AlwaysRebuild() && 13807 SubExpr.get() == E->getSubExpr()) 13808 return E; 13809 13810 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13811 } 13812 13813 template<typename Derived> 13814 ExprResult 13815 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13816 // Transform each of the elements. 13817 SmallVector<Expr *, 8> Elements; 13818 bool ArgChanged = false; 13819 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13820 /*IsCall=*/false, Elements, &ArgChanged)) 13821 return ExprError(); 13822 13823 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13824 return SemaRef.MaybeBindToTemporary(E); 13825 13826 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13827 Elements.data(), 13828 Elements.size()); 13829 } 13830 13831 template<typename Derived> 13832 ExprResult 13833 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13834 ObjCDictionaryLiteral *E) { 13835 // Transform each of the elements. 13836 SmallVector<ObjCDictionaryElement, 8> Elements; 13837 bool ArgChanged = false; 13838 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13839 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13840 13841 if (OrigElement.isPackExpansion()) { 13842 // This key/value element is a pack expansion. 13843 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13844 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13845 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13846 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13847 13848 // Determine whether the set of unexpanded parameter packs can 13849 // and should be expanded. 13850 bool Expand = true; 13851 bool RetainExpansion = false; 13852 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13853 Optional<unsigned> NumExpansions = OrigNumExpansions; 13854 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13855 OrigElement.Value->getEndLoc()); 13856 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13857 PatternRange, Unexpanded, Expand, 13858 RetainExpansion, NumExpansions)) 13859 return ExprError(); 13860 13861 if (!Expand) { 13862 // The transform has determined that we should perform a simple 13863 // transformation on the pack expansion, producing another pack 13864 // expansion. 13865 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13866 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13867 if (Key.isInvalid()) 13868 return ExprError(); 13869 13870 if (Key.get() != OrigElement.Key) 13871 ArgChanged = true; 13872 13873 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13874 if (Value.isInvalid()) 13875 return ExprError(); 13876 13877 if (Value.get() != OrigElement.Value) 13878 ArgChanged = true; 13879 13880 ObjCDictionaryElement Expansion = { 13881 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13882 }; 13883 Elements.push_back(Expansion); 13884 continue; 13885 } 13886 13887 // Record right away that the argument was changed. This needs 13888 // to happen even if the array expands to nothing. 13889 ArgChanged = true; 13890 13891 // The transform has determined that we should perform an elementwise 13892 // expansion of the pattern. Do so. 13893 for (unsigned I = 0; I != *NumExpansions; ++I) { 13894 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13895 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13896 if (Key.isInvalid()) 13897 return ExprError(); 13898 13899 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13900 if (Value.isInvalid()) 13901 return ExprError(); 13902 13903 ObjCDictionaryElement Element = { 13904 Key.get(), Value.get(), SourceLocation(), NumExpansions 13905 }; 13906 13907 // If any unexpanded parameter packs remain, we still have a 13908 // pack expansion. 13909 // FIXME: Can this really happen? 13910 if (Key.get()->containsUnexpandedParameterPack() || 13911 Value.get()->containsUnexpandedParameterPack()) 13912 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13913 13914 Elements.push_back(Element); 13915 } 13916 13917 // FIXME: Retain a pack expansion if RetainExpansion is true. 13918 13919 // We've finished with this pack expansion. 13920 continue; 13921 } 13922 13923 // Transform and check key. 13924 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13925 if (Key.isInvalid()) 13926 return ExprError(); 13927 13928 if (Key.get() != OrigElement.Key) 13929 ArgChanged = true; 13930 13931 // Transform and check value. 13932 ExprResult Value 13933 = getDerived().TransformExpr(OrigElement.Value); 13934 if (Value.isInvalid()) 13935 return ExprError(); 13936 13937 if (Value.get() != OrigElement.Value) 13938 ArgChanged = true; 13939 13940 ObjCDictionaryElement Element = { 13941 Key.get(), Value.get(), SourceLocation(), None 13942 }; 13943 Elements.push_back(Element); 13944 } 13945 13946 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13947 return SemaRef.MaybeBindToTemporary(E); 13948 13949 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13950 Elements); 13951 } 13952 13953 template<typename Derived> 13954 ExprResult 13955 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13956 TypeSourceInfo *EncodedTypeInfo 13957 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13958 if (!EncodedTypeInfo) 13959 return ExprError(); 13960 13961 if (!getDerived().AlwaysRebuild() && 13962 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13963 return E; 13964 13965 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13966 EncodedTypeInfo, 13967 E->getRParenLoc()); 13968 } 13969 13970 template<typename Derived> 13971 ExprResult TreeTransform<Derived>:: 13972 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13973 // This is a kind of implicit conversion, and it needs to get dropped 13974 // and recomputed for the same general reasons that ImplicitCastExprs 13975 // do, as well a more specific one: this expression is only valid when 13976 // it appears *immediately* as an argument expression. 13977 return getDerived().TransformExpr(E->getSubExpr()); 13978 } 13979 13980 template<typename Derived> 13981 ExprResult TreeTransform<Derived>:: 13982 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13983 TypeSourceInfo *TSInfo 13984 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13985 if (!TSInfo) 13986 return ExprError(); 13987 13988 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13989 if (Result.isInvalid()) 13990 return ExprError(); 13991 13992 if (!getDerived().AlwaysRebuild() && 13993 TSInfo == E->getTypeInfoAsWritten() && 13994 Result.get() == E->getSubExpr()) 13995 return E; 13996 13997 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13998 E->getBridgeKeywordLoc(), TSInfo, 13999 Result.get()); 14000 } 14001 14002 template <typename Derived> 14003 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 14004 ObjCAvailabilityCheckExpr *E) { 14005 return E; 14006 } 14007 14008 template<typename Derived> 14009 ExprResult 14010 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 14011 // Transform arguments. 14012 bool ArgChanged = false; 14013 SmallVector<Expr*, 8> Args; 14014 Args.reserve(E->getNumArgs()); 14015 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 14016 &ArgChanged)) 14017 return ExprError(); 14018 14019 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 14020 // Class message: transform the receiver type. 14021 TypeSourceInfo *ReceiverTypeInfo 14022 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 14023 if (!ReceiverTypeInfo) 14024 return ExprError(); 14025 14026 // If nothing changed, just retain the existing message send. 14027 if (!getDerived().AlwaysRebuild() && 14028 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 14029 return SemaRef.MaybeBindToTemporary(E); 14030 14031 // Build a new class message send. 14032 SmallVector<SourceLocation, 16> SelLocs; 14033 E->getSelectorLocs(SelLocs); 14034 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 14035 E->getSelector(), 14036 SelLocs, 14037 E->getMethodDecl(), 14038 E->getLeftLoc(), 14039 Args, 14040 E->getRightLoc()); 14041 } 14042 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 14043 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 14044 if (!E->getMethodDecl()) 14045 return ExprError(); 14046 14047 // Build a new class message send to 'super'. 14048 SmallVector<SourceLocation, 16> SelLocs; 14049 E->getSelectorLocs(SelLocs); 14050 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 14051 E->getSelector(), 14052 SelLocs, 14053 E->getReceiverType(), 14054 E->getMethodDecl(), 14055 E->getLeftLoc(), 14056 Args, 14057 E->getRightLoc()); 14058 } 14059 14060 // Instance message: transform the receiver 14061 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 14062 "Only class and instance messages may be instantiated"); 14063 ExprResult Receiver 14064 = getDerived().TransformExpr(E->getInstanceReceiver()); 14065 if (Receiver.isInvalid()) 14066 return ExprError(); 14067 14068 // If nothing changed, just retain the existing message send. 14069 if (!getDerived().AlwaysRebuild() && 14070 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 14071 return SemaRef.MaybeBindToTemporary(E); 14072 14073 // Build a new instance message send. 14074 SmallVector<SourceLocation, 16> SelLocs; 14075 E->getSelectorLocs(SelLocs); 14076 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 14077 E->getSelector(), 14078 SelLocs, 14079 E->getMethodDecl(), 14080 E->getLeftLoc(), 14081 Args, 14082 E->getRightLoc()); 14083 } 14084 14085 template<typename Derived> 14086 ExprResult 14087 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 14088 return E; 14089 } 14090 14091 template<typename Derived> 14092 ExprResult 14093 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 14094 return E; 14095 } 14096 14097 template<typename Derived> 14098 ExprResult 14099 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 14100 // Transform the base expression. 14101 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14102 if (Base.isInvalid()) 14103 return ExprError(); 14104 14105 // We don't need to transform the ivar; it will never change. 14106 14107 // If nothing changed, just retain the existing expression. 14108 if (!getDerived().AlwaysRebuild() && 14109 Base.get() == E->getBase()) 14110 return E; 14111 14112 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 14113 E->getLocation(), 14114 E->isArrow(), E->isFreeIvar()); 14115 } 14116 14117 template<typename Derived> 14118 ExprResult 14119 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 14120 // 'super' and types never change. Property never changes. Just 14121 // retain the existing expression. 14122 if (!E->isObjectReceiver()) 14123 return E; 14124 14125 // Transform the base expression. 14126 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14127 if (Base.isInvalid()) 14128 return ExprError(); 14129 14130 // We don't need to transform the property; it will never change. 14131 14132 // If nothing changed, just retain the existing expression. 14133 if (!getDerived().AlwaysRebuild() && 14134 Base.get() == E->getBase()) 14135 return E; 14136 14137 if (E->isExplicitProperty()) 14138 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14139 E->getExplicitProperty(), 14140 E->getLocation()); 14141 14142 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 14143 SemaRef.Context.PseudoObjectTy, 14144 E->getImplicitPropertyGetter(), 14145 E->getImplicitPropertySetter(), 14146 E->getLocation()); 14147 } 14148 14149 template<typename Derived> 14150 ExprResult 14151 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 14152 // Transform the base expression. 14153 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 14154 if (Base.isInvalid()) 14155 return ExprError(); 14156 14157 // Transform the key expression. 14158 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 14159 if (Key.isInvalid()) 14160 return ExprError(); 14161 14162 // If nothing changed, just retain the existing expression. 14163 if (!getDerived().AlwaysRebuild() && 14164 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 14165 return E; 14166 14167 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 14168 Base.get(), Key.get(), 14169 E->getAtIndexMethodDecl(), 14170 E->setAtIndexMethodDecl()); 14171 } 14172 14173 template<typename Derived> 14174 ExprResult 14175 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 14176 // Transform the base expression. 14177 ExprResult Base = getDerived().TransformExpr(E->getBase()); 14178 if (Base.isInvalid()) 14179 return ExprError(); 14180 14181 // If nothing changed, just retain the existing expression. 14182 if (!getDerived().AlwaysRebuild() && 14183 Base.get() == E->getBase()) 14184 return E; 14185 14186 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 14187 E->getOpLoc(), 14188 E->isArrow()); 14189 } 14190 14191 template<typename Derived> 14192 ExprResult 14193 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 14194 bool ArgumentChanged = false; 14195 SmallVector<Expr*, 8> SubExprs; 14196 SubExprs.reserve(E->getNumSubExprs()); 14197 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14198 SubExprs, &ArgumentChanged)) 14199 return ExprError(); 14200 14201 if (!getDerived().AlwaysRebuild() && 14202 !ArgumentChanged) 14203 return E; 14204 14205 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 14206 SubExprs, 14207 E->getRParenLoc()); 14208 } 14209 14210 template<typename Derived> 14211 ExprResult 14212 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 14213 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14214 if (SrcExpr.isInvalid()) 14215 return ExprError(); 14216 14217 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 14218 if (!Type) 14219 return ExprError(); 14220 14221 if (!getDerived().AlwaysRebuild() && 14222 Type == E->getTypeSourceInfo() && 14223 SrcExpr.get() == E->getSrcExpr()) 14224 return E; 14225 14226 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 14227 SrcExpr.get(), Type, 14228 E->getRParenLoc()); 14229 } 14230 14231 template<typename Derived> 14232 ExprResult 14233 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 14234 BlockDecl *oldBlock = E->getBlockDecl(); 14235 14236 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 14237 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 14238 14239 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 14240 blockScope->TheDecl->setBlockMissingReturnType( 14241 oldBlock->blockMissingReturnType()); 14242 14243 SmallVector<ParmVarDecl*, 4> params; 14244 SmallVector<QualType, 4> paramTypes; 14245 14246 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 14247 14248 // Parameter substitution. 14249 Sema::ExtParameterInfoBuilder extParamInfos; 14250 if (getDerived().TransformFunctionTypeParams( 14251 E->getCaretLocation(), oldBlock->parameters(), nullptr, 14252 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 14253 extParamInfos)) { 14254 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14255 return ExprError(); 14256 } 14257 14258 QualType exprResultType = 14259 getDerived().TransformType(exprFunctionType->getReturnType()); 14260 14261 auto epi = exprFunctionType->getExtProtoInfo(); 14262 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 14263 14264 QualType functionType = 14265 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 14266 blockScope->FunctionType = functionType; 14267 14268 // Set the parameters on the block decl. 14269 if (!params.empty()) 14270 blockScope->TheDecl->setParams(params); 14271 14272 if (!oldBlock->blockMissingReturnType()) { 14273 blockScope->HasImplicitReturnType = false; 14274 blockScope->ReturnType = exprResultType; 14275 } 14276 14277 // Transform the body 14278 StmtResult body = getDerived().TransformStmt(E->getBody()); 14279 if (body.isInvalid()) { 14280 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 14281 return ExprError(); 14282 } 14283 14284 #ifndef NDEBUG 14285 // In builds with assertions, make sure that we captured everything we 14286 // captured before. 14287 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 14288 for (const auto &I : oldBlock->captures()) { 14289 VarDecl *oldCapture = I.getVariable(); 14290 14291 // Ignore parameter packs. 14292 if (oldCapture->isParameterPack()) 14293 continue; 14294 14295 VarDecl *newCapture = 14296 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 14297 oldCapture)); 14298 assert(blockScope->CaptureMap.count(newCapture)); 14299 } 14300 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 14301 } 14302 #endif 14303 14304 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 14305 /*Scope=*/nullptr); 14306 } 14307 14308 template<typename Derived> 14309 ExprResult 14310 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 14311 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 14312 if (SrcExpr.isInvalid()) 14313 return ExprError(); 14314 14315 QualType Type = getDerived().TransformType(E->getType()); 14316 14317 return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(), 14318 E->getRParenLoc()); 14319 } 14320 14321 template<typename Derived> 14322 ExprResult 14323 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 14324 bool ArgumentChanged = false; 14325 SmallVector<Expr*, 8> SubExprs; 14326 SubExprs.reserve(E->getNumSubExprs()); 14327 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 14328 SubExprs, &ArgumentChanged)) 14329 return ExprError(); 14330 14331 if (!getDerived().AlwaysRebuild() && 14332 !ArgumentChanged) 14333 return E; 14334 14335 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 14336 E->getOp(), E->getRParenLoc()); 14337 } 14338 14339 //===----------------------------------------------------------------------===// 14340 // Type reconstruction 14341 //===----------------------------------------------------------------------===// 14342 14343 template<typename Derived> 14344 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 14345 SourceLocation Star) { 14346 return SemaRef.BuildPointerType(PointeeType, Star, 14347 getDerived().getBaseEntity()); 14348 } 14349 14350 template<typename Derived> 14351 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 14352 SourceLocation Star) { 14353 return SemaRef.BuildBlockPointerType(PointeeType, Star, 14354 getDerived().getBaseEntity()); 14355 } 14356 14357 template<typename Derived> 14358 QualType 14359 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 14360 bool WrittenAsLValue, 14361 SourceLocation Sigil) { 14362 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 14363 Sigil, getDerived().getBaseEntity()); 14364 } 14365 14366 template<typename Derived> 14367 QualType 14368 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 14369 QualType ClassType, 14370 SourceLocation Sigil) { 14371 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 14372 getDerived().getBaseEntity()); 14373 } 14374 14375 template<typename Derived> 14376 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 14377 const ObjCTypeParamDecl *Decl, 14378 SourceLocation ProtocolLAngleLoc, 14379 ArrayRef<ObjCProtocolDecl *> Protocols, 14380 ArrayRef<SourceLocation> ProtocolLocs, 14381 SourceLocation ProtocolRAngleLoc) { 14382 return SemaRef.BuildObjCTypeParamType(Decl, 14383 ProtocolLAngleLoc, Protocols, 14384 ProtocolLocs, ProtocolRAngleLoc, 14385 /*FailOnError=*/true); 14386 } 14387 14388 template<typename Derived> 14389 QualType TreeTransform<Derived>::RebuildObjCObjectType( 14390 QualType BaseType, 14391 SourceLocation Loc, 14392 SourceLocation TypeArgsLAngleLoc, 14393 ArrayRef<TypeSourceInfo *> TypeArgs, 14394 SourceLocation TypeArgsRAngleLoc, 14395 SourceLocation ProtocolLAngleLoc, 14396 ArrayRef<ObjCProtocolDecl *> Protocols, 14397 ArrayRef<SourceLocation> ProtocolLocs, 14398 SourceLocation ProtocolRAngleLoc) { 14399 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 14400 TypeArgs, TypeArgsRAngleLoc, 14401 ProtocolLAngleLoc, Protocols, ProtocolLocs, 14402 ProtocolRAngleLoc, 14403 /*FailOnError=*/true); 14404 } 14405 14406 template<typename Derived> 14407 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 14408 QualType PointeeType, 14409 SourceLocation Star) { 14410 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 14411 } 14412 14413 template<typename Derived> 14414 QualType 14415 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 14416 ArrayType::ArraySizeModifier SizeMod, 14417 const llvm::APInt *Size, 14418 Expr *SizeExpr, 14419 unsigned IndexTypeQuals, 14420 SourceRange BracketsRange) { 14421 if (SizeExpr || !Size) 14422 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 14423 IndexTypeQuals, BracketsRange, 14424 getDerived().getBaseEntity()); 14425 14426 QualType Types[] = { 14427 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 14428 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 14429 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 14430 }; 14431 const unsigned NumTypes = llvm::array_lengthof(Types); 14432 QualType SizeType; 14433 for (unsigned I = 0; I != NumTypes; ++I) 14434 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 14435 SizeType = Types[I]; 14436 break; 14437 } 14438 14439 // Note that we can return a VariableArrayType here in the case where 14440 // the element type was a dependent VariableArrayType. 14441 IntegerLiteral *ArraySize 14442 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 14443 /*FIXME*/BracketsRange.getBegin()); 14444 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 14445 IndexTypeQuals, BracketsRange, 14446 getDerived().getBaseEntity()); 14447 } 14448 14449 template<typename Derived> 14450 QualType 14451 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 14452 ArrayType::ArraySizeModifier SizeMod, 14453 const llvm::APInt &Size, 14454 Expr *SizeExpr, 14455 unsigned IndexTypeQuals, 14456 SourceRange BracketsRange) { 14457 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 14458 IndexTypeQuals, BracketsRange); 14459 } 14460 14461 template<typename Derived> 14462 QualType 14463 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 14464 ArrayType::ArraySizeModifier SizeMod, 14465 unsigned IndexTypeQuals, 14466 SourceRange BracketsRange) { 14467 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 14468 IndexTypeQuals, BracketsRange); 14469 } 14470 14471 template<typename Derived> 14472 QualType 14473 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 14474 ArrayType::ArraySizeModifier SizeMod, 14475 Expr *SizeExpr, 14476 unsigned IndexTypeQuals, 14477 SourceRange BracketsRange) { 14478 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14479 SizeExpr, 14480 IndexTypeQuals, BracketsRange); 14481 } 14482 14483 template<typename Derived> 14484 QualType 14485 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 14486 ArrayType::ArraySizeModifier SizeMod, 14487 Expr *SizeExpr, 14488 unsigned IndexTypeQuals, 14489 SourceRange BracketsRange) { 14490 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 14491 SizeExpr, 14492 IndexTypeQuals, BracketsRange); 14493 } 14494 14495 template <typename Derived> 14496 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 14497 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14498 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14499 AttributeLoc); 14500 } 14501 14502 template <typename Derived> 14503 QualType 14504 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14505 unsigned NumElements, 14506 VectorType::VectorKind VecKind) { 14507 // FIXME: semantic checking! 14508 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14509 } 14510 14511 template <typename Derived> 14512 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14513 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14514 VectorType::VectorKind VecKind) { 14515 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14516 } 14517 14518 template<typename Derived> 14519 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14520 unsigned NumElements, 14521 SourceLocation AttributeLoc) { 14522 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14523 NumElements, true); 14524 IntegerLiteral *VectorSize 14525 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14526 AttributeLoc); 14527 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14528 } 14529 14530 template<typename Derived> 14531 QualType 14532 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14533 Expr *SizeExpr, 14534 SourceLocation AttributeLoc) { 14535 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14536 } 14537 14538 template <typename Derived> 14539 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14540 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14541 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14542 NumColumns); 14543 } 14544 14545 template <typename Derived> 14546 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14547 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14548 SourceLocation AttributeLoc) { 14549 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14550 AttributeLoc); 14551 } 14552 14553 template<typename Derived> 14554 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14555 QualType T, 14556 MutableArrayRef<QualType> ParamTypes, 14557 const FunctionProtoType::ExtProtoInfo &EPI) { 14558 return SemaRef.BuildFunctionType(T, ParamTypes, 14559 getDerived().getBaseLocation(), 14560 getDerived().getBaseEntity(), 14561 EPI); 14562 } 14563 14564 template<typename Derived> 14565 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14566 return SemaRef.Context.getFunctionNoProtoType(T); 14567 } 14568 14569 template<typename Derived> 14570 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14571 Decl *D) { 14572 assert(D && "no decl found"); 14573 if (D->isInvalidDecl()) return QualType(); 14574 14575 // FIXME: Doesn't account for ObjCInterfaceDecl! 14576 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14577 // A valid resolved using typename pack expansion decl can have multiple 14578 // UsingDecls, but they must each have exactly one type, and it must be 14579 // the same type in every case. But we must have at least one expansion! 14580 if (UPD->expansions().empty()) { 14581 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14582 << UPD->isCXXClassMember() << UPD; 14583 return QualType(); 14584 } 14585 14586 // We might still have some unresolved types. Try to pick a resolved type 14587 // if we can. The final instantiation will check that the remaining 14588 // unresolved types instantiate to the type we pick. 14589 QualType FallbackT; 14590 QualType T; 14591 for (auto *E : UPD->expansions()) { 14592 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14593 if (ThisT.isNull()) 14594 continue; 14595 else if (ThisT->getAs<UnresolvedUsingType>()) 14596 FallbackT = ThisT; 14597 else if (T.isNull()) 14598 T = ThisT; 14599 else 14600 assert(getSema().Context.hasSameType(ThisT, T) && 14601 "mismatched resolved types in using pack expansion"); 14602 } 14603 return T.isNull() ? FallbackT : T; 14604 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14605 assert(Using->hasTypename() && 14606 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14607 14608 // A valid resolved using typename decl points to exactly one type decl. 14609 assert(++Using->shadow_begin() == Using->shadow_end()); 14610 14611 UsingShadowDecl *Shadow = *Using->shadow_begin(); 14612 if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc)) 14613 return QualType(); 14614 return SemaRef.Context.getUsingType( 14615 Shadow, SemaRef.Context.getTypeDeclType( 14616 cast<TypeDecl>(Shadow->getTargetDecl()))); 14617 } else { 14618 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14619 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14620 return SemaRef.Context.getTypeDeclType( 14621 cast<UnresolvedUsingTypenameDecl>(D)); 14622 } 14623 } 14624 14625 template <typename Derived> 14626 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14627 SourceLocation) { 14628 return SemaRef.BuildTypeofExprType(E); 14629 } 14630 14631 template<typename Derived> 14632 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14633 return SemaRef.Context.getTypeOfType(Underlying); 14634 } 14635 14636 template <typename Derived> 14637 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) { 14638 return SemaRef.BuildDecltypeType(E); 14639 } 14640 14641 template<typename Derived> 14642 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14643 UnaryTransformType::UTTKind UKind, 14644 SourceLocation Loc) { 14645 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14646 } 14647 14648 template<typename Derived> 14649 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14650 TemplateName Template, 14651 SourceLocation TemplateNameLoc, 14652 TemplateArgumentListInfo &TemplateArgs) { 14653 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14654 } 14655 14656 template<typename Derived> 14657 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14658 SourceLocation KWLoc) { 14659 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14660 } 14661 14662 template<typename Derived> 14663 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14664 SourceLocation KWLoc, 14665 bool isReadPipe) { 14666 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14667 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14668 } 14669 14670 template <typename Derived> 14671 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned, 14672 unsigned NumBits, 14673 SourceLocation Loc) { 14674 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14675 NumBits, true); 14676 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14677 SemaRef.Context.IntTy, Loc); 14678 return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc); 14679 } 14680 14681 template <typename Derived> 14682 QualType TreeTransform<Derived>::RebuildDependentBitIntType( 14683 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14684 return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc); 14685 } 14686 14687 template<typename Derived> 14688 TemplateName 14689 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14690 bool TemplateKW, 14691 TemplateDecl *Template) { 14692 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14693 Template); 14694 } 14695 14696 template<typename Derived> 14697 TemplateName 14698 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14699 SourceLocation TemplateKWLoc, 14700 const IdentifierInfo &Name, 14701 SourceLocation NameLoc, 14702 QualType ObjectType, 14703 NamedDecl *FirstQualifierInScope, 14704 bool AllowInjectedClassName) { 14705 UnqualifiedId TemplateName; 14706 TemplateName.setIdentifier(&Name, NameLoc); 14707 Sema::TemplateTy Template; 14708 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14709 TemplateName, ParsedType::make(ObjectType), 14710 /*EnteringContext=*/false, Template, 14711 AllowInjectedClassName); 14712 return Template.get(); 14713 } 14714 14715 template<typename Derived> 14716 TemplateName 14717 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14718 SourceLocation TemplateKWLoc, 14719 OverloadedOperatorKind Operator, 14720 SourceLocation NameLoc, 14721 QualType ObjectType, 14722 bool AllowInjectedClassName) { 14723 UnqualifiedId Name; 14724 // FIXME: Bogus location information. 14725 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14726 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14727 Sema::TemplateTy Template; 14728 getSema().ActOnTemplateName( 14729 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14730 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14731 return Template.get(); 14732 } 14733 14734 template<typename Derived> 14735 ExprResult 14736 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14737 SourceLocation OpLoc, 14738 Expr *OrigCallee, 14739 Expr *First, 14740 Expr *Second) { 14741 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14742 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14743 14744 if (First->getObjectKind() == OK_ObjCProperty) { 14745 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14746 if (BinaryOperator::isAssignmentOp(Opc)) 14747 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14748 First, Second); 14749 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14750 if (Result.isInvalid()) 14751 return ExprError(); 14752 First = Result.get(); 14753 } 14754 14755 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14756 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14757 if (Result.isInvalid()) 14758 return ExprError(); 14759 Second = Result.get(); 14760 } 14761 14762 // Determine whether this should be a builtin operation. 14763 if (Op == OO_Subscript) { 14764 if (!First->getType()->isOverloadableType() && 14765 !Second->getType()->isOverloadableType()) 14766 return getSema().CreateBuiltinArraySubscriptExpr( 14767 First, Callee->getBeginLoc(), Second, OpLoc); 14768 } else if (Op == OO_Arrow) { 14769 // It is possible that the type refers to a RecoveryExpr created earlier 14770 // in the tree transformation. 14771 if (First->getType()->isDependentType()) 14772 return ExprError(); 14773 // -> is never a builtin operation. 14774 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14775 } else if (Second == nullptr || isPostIncDec) { 14776 if (!First->getType()->isOverloadableType() || 14777 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14778 // The argument is not of overloadable type, or this is an expression 14779 // of the form &Class::member, so try to create a built-in unary 14780 // operation. 14781 UnaryOperatorKind Opc 14782 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14783 14784 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14785 } 14786 } else { 14787 if (!First->getType()->isOverloadableType() && 14788 !Second->getType()->isOverloadableType()) { 14789 // Neither of the arguments is an overloadable type, so try to 14790 // create a built-in binary operation. 14791 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14792 ExprResult Result 14793 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14794 if (Result.isInvalid()) 14795 return ExprError(); 14796 14797 return Result; 14798 } 14799 } 14800 14801 // Compute the transformed set of functions (and function templates) to be 14802 // used during overload resolution. 14803 UnresolvedSet<16> Functions; 14804 bool RequiresADL; 14805 14806 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14807 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14808 // If the overload could not be resolved in the template definition 14809 // (because we had a dependent argument), ADL is performed as part of 14810 // template instantiation. 14811 RequiresADL = ULE->requiresADL(); 14812 } else { 14813 // If we've resolved this to a particular non-member function, just call 14814 // that function. If we resolved it to a member function, 14815 // CreateOverloaded* will find that function for us. 14816 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14817 if (!isa<CXXMethodDecl>(ND)) 14818 Functions.addDecl(ND); 14819 RequiresADL = false; 14820 } 14821 14822 // Add any functions found via argument-dependent lookup. 14823 Expr *Args[2] = { First, Second }; 14824 unsigned NumArgs = 1 + (Second != nullptr); 14825 14826 // Create the overloaded operator invocation for unary operators. 14827 if (NumArgs == 1 || isPostIncDec) { 14828 UnaryOperatorKind Opc 14829 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14830 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14831 RequiresADL); 14832 } 14833 14834 if (Op == OO_Subscript) { 14835 SourceLocation LBrace; 14836 SourceLocation RBrace; 14837 14838 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14839 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14840 LBrace = NameLoc.getCXXOperatorNameBeginLoc(); 14841 RBrace = NameLoc.getCXXOperatorNameEndLoc(); 14842 } else { 14843 LBrace = Callee->getBeginLoc(); 14844 RBrace = OpLoc; 14845 } 14846 14847 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14848 First, Second); 14849 } 14850 14851 // Create the overloaded operator invocation for binary operators. 14852 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14853 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14854 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14855 if (Result.isInvalid()) 14856 return ExprError(); 14857 14858 return Result; 14859 } 14860 14861 template<typename Derived> 14862 ExprResult 14863 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14864 SourceLocation OperatorLoc, 14865 bool isArrow, 14866 CXXScopeSpec &SS, 14867 TypeSourceInfo *ScopeType, 14868 SourceLocation CCLoc, 14869 SourceLocation TildeLoc, 14870 PseudoDestructorTypeStorage Destroyed) { 14871 QualType BaseType = Base->getType(); 14872 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14873 (!isArrow && !BaseType->getAs<RecordType>()) || 14874 (isArrow && BaseType->getAs<PointerType>() && 14875 !BaseType->castAs<PointerType>()->getPointeeType() 14876 ->template getAs<RecordType>())){ 14877 // This pseudo-destructor expression is still a pseudo-destructor. 14878 return SemaRef.BuildPseudoDestructorExpr( 14879 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14880 CCLoc, TildeLoc, Destroyed); 14881 } 14882 14883 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14884 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14885 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14886 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14887 NameInfo.setNamedTypeInfo(DestroyedType); 14888 14889 // The scope type is now known to be a valid nested name specifier 14890 // component. Tack it on to the end of the nested name specifier. 14891 if (ScopeType) { 14892 if (!ScopeType->getType()->getAs<TagType>()) { 14893 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14894 diag::err_expected_class_or_namespace) 14895 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14896 return ExprError(); 14897 } 14898 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14899 CCLoc); 14900 } 14901 14902 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14903 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14904 OperatorLoc, isArrow, 14905 SS, TemplateKWLoc, 14906 /*FIXME: FirstQualifier*/ nullptr, 14907 NameInfo, 14908 /*TemplateArgs*/ nullptr, 14909 /*S*/nullptr); 14910 } 14911 14912 template<typename Derived> 14913 StmtResult 14914 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14915 SourceLocation Loc = S->getBeginLoc(); 14916 CapturedDecl *CD = S->getCapturedDecl(); 14917 unsigned NumParams = CD->getNumParams(); 14918 unsigned ContextParamPos = CD->getContextParamPosition(); 14919 SmallVector<Sema::CapturedParamNameType, 4> Params; 14920 for (unsigned I = 0; I < NumParams; ++I) { 14921 if (I != ContextParamPos) { 14922 Params.push_back( 14923 std::make_pair( 14924 CD->getParam(I)->getName(), 14925 getDerived().TransformType(CD->getParam(I)->getType()))); 14926 } else { 14927 Params.push_back(std::make_pair(StringRef(), QualType())); 14928 } 14929 } 14930 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14931 S->getCapturedRegionKind(), Params); 14932 StmtResult Body; 14933 { 14934 Sema::CompoundScopeRAII CompoundScope(getSema()); 14935 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14936 } 14937 14938 if (Body.isInvalid()) { 14939 getSema().ActOnCapturedRegionError(); 14940 return StmtError(); 14941 } 14942 14943 return getSema().ActOnCapturedRegionEnd(Body.get()); 14944 } 14945 14946 } // end namespace clang 14947 14948 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14949