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 usefull 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. Sublcasses 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 OMP_CLAUSE_CLASS(Enum, Str, Class) \ 735 LLVM_ATTRIBUTE_NOINLINE \ 736 OMPClause *Transform ## Class(Class *S); 737 #include "llvm/Frontend/OpenMP/OMPKinds.def" 738 739 /// Build a new qualified type given its unqualified type and type location. 740 /// 741 /// By default, this routine adds type qualifiers only to types that can 742 /// have qualifiers, and silently suppresses those qualifiers that are not 743 /// permitted. Subclasses may override this routine to provide different 744 /// behavior. 745 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 746 747 /// Build a new pointer type given its pointee type. 748 /// 749 /// By default, performs semantic analysis when building the pointer type. 750 /// Subclasses may override this routine to provide different behavior. 751 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 752 753 /// Build a new block pointer type given its pointee type. 754 /// 755 /// By default, performs semantic analysis when building the block pointer 756 /// type. Subclasses may override this routine to provide different behavior. 757 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 758 759 /// Build a new reference type given the type it references. 760 /// 761 /// By default, performs semantic analysis when building the 762 /// reference type. Subclasses may override this routine to provide 763 /// different behavior. 764 /// 765 /// \param LValue whether the type was written with an lvalue sigil 766 /// or an rvalue sigil. 767 QualType RebuildReferenceType(QualType ReferentType, 768 bool LValue, 769 SourceLocation Sigil); 770 771 /// Build a new member pointer type given the pointee type and the 772 /// class type it refers into. 773 /// 774 /// By default, performs semantic analysis when building the member pointer 775 /// type. Subclasses may override this routine to provide different behavior. 776 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 777 SourceLocation Sigil); 778 779 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 780 SourceLocation ProtocolLAngleLoc, 781 ArrayRef<ObjCProtocolDecl *> Protocols, 782 ArrayRef<SourceLocation> ProtocolLocs, 783 SourceLocation ProtocolRAngleLoc); 784 785 /// Build an Objective-C object type. 786 /// 787 /// By default, performs semantic analysis when building the object type. 788 /// Subclasses may override this routine to provide different behavior. 789 QualType RebuildObjCObjectType(QualType BaseType, 790 SourceLocation Loc, 791 SourceLocation TypeArgsLAngleLoc, 792 ArrayRef<TypeSourceInfo *> TypeArgs, 793 SourceLocation TypeArgsRAngleLoc, 794 SourceLocation ProtocolLAngleLoc, 795 ArrayRef<ObjCProtocolDecl *> Protocols, 796 ArrayRef<SourceLocation> ProtocolLocs, 797 SourceLocation ProtocolRAngleLoc); 798 799 /// Build a new Objective-C object pointer type given the pointee type. 800 /// 801 /// By default, directly builds the pointer type, with no additional semantic 802 /// analysis. 803 QualType RebuildObjCObjectPointerType(QualType PointeeType, 804 SourceLocation Star); 805 806 /// Build a new array type given the element type, size 807 /// modifier, size of the array (if known), size expression, and index type 808 /// qualifiers. 809 /// 810 /// By default, performs semantic analysis when building the array type. 811 /// Subclasses may override this routine to provide different behavior. 812 /// Also by default, all of the other Rebuild*Array 813 QualType RebuildArrayType(QualType ElementType, 814 ArrayType::ArraySizeModifier SizeMod, 815 const llvm::APInt *Size, 816 Expr *SizeExpr, 817 unsigned IndexTypeQuals, 818 SourceRange BracketsRange); 819 820 /// Build a new constant array type given the element type, size 821 /// modifier, (known) size of the array, and index type qualifiers. 822 /// 823 /// By default, performs semantic analysis when building the array type. 824 /// Subclasses may override this routine to provide different behavior. 825 QualType RebuildConstantArrayType(QualType ElementType, 826 ArrayType::ArraySizeModifier SizeMod, 827 const llvm::APInt &Size, 828 Expr *SizeExpr, 829 unsigned IndexTypeQuals, 830 SourceRange BracketsRange); 831 832 /// Build a new incomplete array type given the element type, size 833 /// modifier, and index type qualifiers. 834 /// 835 /// By default, performs semantic analysis when building the array type. 836 /// Subclasses may override this routine to provide different behavior. 837 QualType RebuildIncompleteArrayType(QualType ElementType, 838 ArrayType::ArraySizeModifier SizeMod, 839 unsigned IndexTypeQuals, 840 SourceRange BracketsRange); 841 842 /// Build a new variable-length array type given the element type, 843 /// size modifier, size expression, and index type qualifiers. 844 /// 845 /// By default, performs semantic analysis when building the array type. 846 /// Subclasses may override this routine to provide different behavior. 847 QualType RebuildVariableArrayType(QualType ElementType, 848 ArrayType::ArraySizeModifier SizeMod, 849 Expr *SizeExpr, 850 unsigned IndexTypeQuals, 851 SourceRange BracketsRange); 852 853 /// Build a new dependent-sized array type given the element type, 854 /// size modifier, size expression, and index type qualifiers. 855 /// 856 /// By default, performs semantic analysis when building the array type. 857 /// Subclasses may override this routine to provide different behavior. 858 QualType RebuildDependentSizedArrayType(QualType ElementType, 859 ArrayType::ArraySizeModifier SizeMod, 860 Expr *SizeExpr, 861 unsigned IndexTypeQuals, 862 SourceRange BracketsRange); 863 864 /// Build a new vector type given the element type and 865 /// number of elements. 866 /// 867 /// By default, performs semantic analysis when building the vector type. 868 /// Subclasses may override this routine to provide different behavior. 869 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 870 VectorType::VectorKind VecKind); 871 872 /// Build a new potentially dependently-sized extended vector type 873 /// given the element type and number of elements. 874 /// 875 /// By default, performs semantic analysis when building the vector type. 876 /// Subclasses may override this routine to provide different behavior. 877 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 878 SourceLocation AttributeLoc, 879 VectorType::VectorKind); 880 881 /// Build a new extended vector type given the element type and 882 /// number of elements. 883 /// 884 /// By default, performs semantic analysis when building the vector type. 885 /// Subclasses may override this routine to provide different behavior. 886 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 887 SourceLocation AttributeLoc); 888 889 /// Build a new potentially dependently-sized extended vector type 890 /// given the element type and number of elements. 891 /// 892 /// By default, performs semantic analysis when building the vector type. 893 /// Subclasses may override this routine to provide different behavior. 894 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 895 Expr *SizeExpr, 896 SourceLocation AttributeLoc); 897 898 /// Build a new matrix type given the element type and dimensions. 899 QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows, 900 unsigned NumColumns); 901 902 /// Build a new matrix type given the type and dependently-defined 903 /// dimensions. 904 QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr, 905 Expr *ColumnExpr, 906 SourceLocation AttributeLoc); 907 908 /// Build a new DependentAddressSpaceType or return the pointee 909 /// type variable with the correct address space (retrieved from 910 /// AddrSpaceExpr) applied to it. The former will be returned in cases 911 /// where the address space remains dependent. 912 /// 913 /// By default, performs semantic analysis when building the type with address 914 /// space applied. Subclasses may override this routine to provide different 915 /// behavior. 916 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 917 Expr *AddrSpaceExpr, 918 SourceLocation AttributeLoc); 919 920 /// Build a new function type. 921 /// 922 /// By default, performs semantic analysis when building the function type. 923 /// Subclasses may override this routine to provide different behavior. 924 QualType RebuildFunctionProtoType(QualType T, 925 MutableArrayRef<QualType> ParamTypes, 926 const FunctionProtoType::ExtProtoInfo &EPI); 927 928 /// Build a new unprototyped function type. 929 QualType RebuildFunctionNoProtoType(QualType ResultType); 930 931 /// Rebuild an unresolved typename type, given the decl that 932 /// the UnresolvedUsingTypenameDecl was transformed to. 933 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 934 935 /// Build a new typedef type. 936 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 937 return SemaRef.Context.getTypeDeclType(Typedef); 938 } 939 940 /// Build a new MacroDefined type. 941 QualType RebuildMacroQualifiedType(QualType T, 942 const IdentifierInfo *MacroII) { 943 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 944 } 945 946 /// Build a new class/struct/union type. 947 QualType RebuildRecordType(RecordDecl *Record) { 948 return SemaRef.Context.getTypeDeclType(Record); 949 } 950 951 /// Build a new Enum type. 952 QualType RebuildEnumType(EnumDecl *Enum) { 953 return SemaRef.Context.getTypeDeclType(Enum); 954 } 955 956 /// Build a new typeof(expr) type. 957 /// 958 /// By default, performs semantic analysis when building the typeof type. 959 /// Subclasses may override this routine to provide different behavior. 960 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 961 962 /// Build a new typeof(type) type. 963 /// 964 /// By default, builds a new TypeOfType with the given underlying type. 965 QualType RebuildTypeOfType(QualType Underlying); 966 967 /// Build a new unary transform type. 968 QualType RebuildUnaryTransformType(QualType BaseType, 969 UnaryTransformType::UTTKind UKind, 970 SourceLocation Loc); 971 972 /// Build a new C++11 decltype type. 973 /// 974 /// By default, performs semantic analysis when building the decltype type. 975 /// Subclasses may override this routine to provide different behavior. 976 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 977 978 /// Build a new C++11 auto type. 979 /// 980 /// By default, builds a new AutoType with the given deduced type. 981 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 982 ConceptDecl *TypeConstraintConcept, 983 ArrayRef<TemplateArgument> TypeConstraintArgs) { 984 // Note, IsDependent is always false here: we implicitly convert an 'auto' 985 // which has been deduced to a dependent type into an undeduced 'auto', so 986 // that we'll retry deduction after the transformation. 987 return SemaRef.Context.getAutoType(Deduced, Keyword, 988 /*IsDependent*/ false, /*IsPack=*/false, 989 TypeConstraintConcept, 990 TypeConstraintArgs); 991 } 992 993 /// By default, builds a new DeducedTemplateSpecializationType with the given 994 /// deduced type. 995 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 996 QualType Deduced) { 997 return SemaRef.Context.getDeducedTemplateSpecializationType( 998 Template, Deduced, /*IsDependent*/ false); 999 } 1000 1001 /// Build a new template specialization type. 1002 /// 1003 /// By default, performs semantic analysis when building the template 1004 /// specialization type. Subclasses may override this routine to provide 1005 /// different behavior. 1006 QualType RebuildTemplateSpecializationType(TemplateName Template, 1007 SourceLocation TemplateLoc, 1008 TemplateArgumentListInfo &Args); 1009 1010 /// Build a new parenthesized type. 1011 /// 1012 /// By default, builds a new ParenType type from the inner type. 1013 /// Subclasses may override this routine to provide different behavior. 1014 QualType RebuildParenType(QualType InnerType) { 1015 return SemaRef.BuildParenType(InnerType); 1016 } 1017 1018 /// Build a new qualified name type. 1019 /// 1020 /// By default, builds a new ElaboratedType type from the keyword, 1021 /// the nested-name-specifier and the named type. 1022 /// Subclasses may override this routine to provide different behavior. 1023 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1024 ElaboratedTypeKeyword Keyword, 1025 NestedNameSpecifierLoc QualifierLoc, 1026 QualType Named) { 1027 return SemaRef.Context.getElaboratedType(Keyword, 1028 QualifierLoc.getNestedNameSpecifier(), 1029 Named); 1030 } 1031 1032 /// Build a new typename type that refers to a template-id. 1033 /// 1034 /// By default, builds a new DependentNameType type from the 1035 /// nested-name-specifier and the given type. Subclasses may override 1036 /// this routine to provide different behavior. 1037 QualType RebuildDependentTemplateSpecializationType( 1038 ElaboratedTypeKeyword Keyword, 1039 NestedNameSpecifierLoc QualifierLoc, 1040 SourceLocation TemplateKWLoc, 1041 const IdentifierInfo *Name, 1042 SourceLocation NameLoc, 1043 TemplateArgumentListInfo &Args, 1044 bool AllowInjectedClassName) { 1045 // Rebuild the template name. 1046 // TODO: avoid TemplateName abstraction 1047 CXXScopeSpec SS; 1048 SS.Adopt(QualifierLoc); 1049 TemplateName InstName = getDerived().RebuildTemplateName( 1050 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1051 AllowInjectedClassName); 1052 1053 if (InstName.isNull()) 1054 return QualType(); 1055 1056 // If it's still dependent, make a dependent specialization. 1057 if (InstName.getAsDependentTemplateName()) 1058 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1059 QualifierLoc.getNestedNameSpecifier(), 1060 Name, 1061 Args); 1062 1063 // Otherwise, make an elaborated type wrapping a non-dependent 1064 // specialization. 1065 QualType T = 1066 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1067 if (T.isNull()) return QualType(); 1068 1069 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1070 return T; 1071 1072 return SemaRef.Context.getElaboratedType(Keyword, 1073 QualifierLoc.getNestedNameSpecifier(), 1074 T); 1075 } 1076 1077 /// Build a new typename type that refers to an identifier. 1078 /// 1079 /// By default, performs semantic analysis when building the typename type 1080 /// (or elaborated type). Subclasses may override this routine to provide 1081 /// different behavior. 1082 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1083 SourceLocation KeywordLoc, 1084 NestedNameSpecifierLoc QualifierLoc, 1085 const IdentifierInfo *Id, 1086 SourceLocation IdLoc, 1087 bool DeducedTSTContext) { 1088 CXXScopeSpec SS; 1089 SS.Adopt(QualifierLoc); 1090 1091 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1092 // If the name is still dependent, just build a new dependent name type. 1093 if (!SemaRef.computeDeclContext(SS)) 1094 return SemaRef.Context.getDependentNameType(Keyword, 1095 QualifierLoc.getNestedNameSpecifier(), 1096 Id); 1097 } 1098 1099 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1100 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1101 *Id, IdLoc, DeducedTSTContext); 1102 } 1103 1104 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1105 1106 // We had a dependent elaborated-type-specifier that has been transformed 1107 // into a non-dependent elaborated-type-specifier. Find the tag we're 1108 // referring to. 1109 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1110 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1111 if (!DC) 1112 return QualType(); 1113 1114 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1115 return QualType(); 1116 1117 TagDecl *Tag = nullptr; 1118 SemaRef.LookupQualifiedName(Result, DC); 1119 switch (Result.getResultKind()) { 1120 case LookupResult::NotFound: 1121 case LookupResult::NotFoundInCurrentInstantiation: 1122 break; 1123 1124 case LookupResult::Found: 1125 Tag = Result.getAsSingle<TagDecl>(); 1126 break; 1127 1128 case LookupResult::FoundOverloaded: 1129 case LookupResult::FoundUnresolvedValue: 1130 llvm_unreachable("Tag lookup cannot find non-tags"); 1131 1132 case LookupResult::Ambiguous: 1133 // Let the LookupResult structure handle ambiguities. 1134 return QualType(); 1135 } 1136 1137 if (!Tag) { 1138 // Check where the name exists but isn't a tag type and use that to emit 1139 // better diagnostics. 1140 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1141 SemaRef.LookupQualifiedName(Result, DC); 1142 switch (Result.getResultKind()) { 1143 case LookupResult::Found: 1144 case LookupResult::FoundOverloaded: 1145 case LookupResult::FoundUnresolvedValue: { 1146 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1147 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1148 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1149 << NTK << Kind; 1150 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1151 break; 1152 } 1153 default: 1154 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1155 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1156 break; 1157 } 1158 return QualType(); 1159 } 1160 1161 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1162 IdLoc, Id)) { 1163 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1164 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1165 return QualType(); 1166 } 1167 1168 // Build the elaborated-type-specifier type. 1169 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1170 return SemaRef.Context.getElaboratedType(Keyword, 1171 QualifierLoc.getNestedNameSpecifier(), 1172 T); 1173 } 1174 1175 /// Build a new pack expansion type. 1176 /// 1177 /// By default, builds a new PackExpansionType type from the given pattern. 1178 /// Subclasses may override this routine to provide different behavior. 1179 QualType RebuildPackExpansionType(QualType Pattern, 1180 SourceRange PatternRange, 1181 SourceLocation EllipsisLoc, 1182 Optional<unsigned> NumExpansions) { 1183 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1184 NumExpansions); 1185 } 1186 1187 /// Build a new atomic type given its value type. 1188 /// 1189 /// By default, performs semantic analysis when building the atomic type. 1190 /// Subclasses may override this routine to provide different behavior. 1191 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1192 1193 /// Build a new pipe type given its value type. 1194 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1195 bool isReadPipe); 1196 1197 /// Build an extended int given its value type. 1198 QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits, 1199 SourceLocation Loc); 1200 1201 /// Build a dependent extended int given its value type. 1202 QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr, 1203 SourceLocation Loc); 1204 1205 /// Build a new template name given a nested name specifier, a flag 1206 /// indicating whether the "template" keyword was provided, and the template 1207 /// that the template name refers to. 1208 /// 1209 /// By default, builds the new template name directly. Subclasses may override 1210 /// this routine to provide different behavior. 1211 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1212 bool TemplateKW, 1213 TemplateDecl *Template); 1214 1215 /// Build a new template name given a nested name specifier and the 1216 /// name that is referred to as a template. 1217 /// 1218 /// By default, performs semantic analysis to determine whether the name can 1219 /// be resolved to a specific template, then builds the appropriate kind of 1220 /// template name. Subclasses may override this routine to provide different 1221 /// behavior. 1222 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1223 SourceLocation TemplateKWLoc, 1224 const IdentifierInfo &Name, 1225 SourceLocation NameLoc, QualType ObjectType, 1226 NamedDecl *FirstQualifierInScope, 1227 bool AllowInjectedClassName); 1228 1229 /// Build a new template name given a nested name specifier and the 1230 /// overloaded operator name that is referred to as a template. 1231 /// 1232 /// By default, performs semantic analysis to determine whether the name can 1233 /// be resolved to a specific template, then builds the appropriate kind of 1234 /// template name. Subclasses may override this routine to provide different 1235 /// behavior. 1236 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1237 SourceLocation TemplateKWLoc, 1238 OverloadedOperatorKind Operator, 1239 SourceLocation NameLoc, QualType ObjectType, 1240 bool AllowInjectedClassName); 1241 1242 /// Build a new template name given a template template parameter pack 1243 /// and the 1244 /// 1245 /// By default, performs semantic analysis to determine whether the name can 1246 /// be resolved to a specific template, then builds the appropriate kind of 1247 /// template name. Subclasses may override this routine to provide different 1248 /// behavior. 1249 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1250 const TemplateArgument &ArgPack) { 1251 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1252 } 1253 1254 /// Build a new compound statement. 1255 /// 1256 /// By default, performs semantic analysis to build the new statement. 1257 /// Subclasses may override this routine to provide different behavior. 1258 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1259 MultiStmtArg Statements, 1260 SourceLocation RBraceLoc, 1261 bool IsStmtExpr) { 1262 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1263 IsStmtExpr); 1264 } 1265 1266 /// Build a new case statement. 1267 /// 1268 /// By default, performs semantic analysis to build the new statement. 1269 /// Subclasses may override this routine to provide different behavior. 1270 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1271 Expr *LHS, 1272 SourceLocation EllipsisLoc, 1273 Expr *RHS, 1274 SourceLocation ColonLoc) { 1275 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1276 ColonLoc); 1277 } 1278 1279 /// Attach the body to a new case statement. 1280 /// 1281 /// By default, performs semantic analysis to build the new statement. 1282 /// Subclasses may override this routine to provide different behavior. 1283 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1284 getSema().ActOnCaseStmtBody(S, Body); 1285 return S; 1286 } 1287 1288 /// Build a new default statement. 1289 /// 1290 /// By default, performs semantic analysis to build the new statement. 1291 /// Subclasses may override this routine to provide different behavior. 1292 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1293 SourceLocation ColonLoc, 1294 Stmt *SubStmt) { 1295 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1296 /*CurScope=*/nullptr); 1297 } 1298 1299 /// Build a new label statement. 1300 /// 1301 /// By default, performs semantic analysis to build the new statement. 1302 /// Subclasses may override this routine to provide different behavior. 1303 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1304 SourceLocation ColonLoc, Stmt *SubStmt) { 1305 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1306 } 1307 1308 /// Build a new label statement. 1309 /// 1310 /// By default, performs semantic analysis to build the new statement. 1311 /// Subclasses may override this routine to provide different behavior. 1312 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1313 ArrayRef<const Attr*> Attrs, 1314 Stmt *SubStmt) { 1315 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1316 } 1317 1318 /// Build a new "if" statement. 1319 /// 1320 /// By default, performs semantic analysis to build the new statement. 1321 /// Subclasses may override this routine to provide different behavior. 1322 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1323 SourceLocation LParenLoc, Sema::ConditionResult Cond, 1324 SourceLocation RParenLoc, Stmt *Init, Stmt *Then, 1325 SourceLocation ElseLoc, Stmt *Else) { 1326 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond, 1327 RParenLoc, Then, ElseLoc, Else); 1328 } 1329 1330 /// Start building a new switch statement. 1331 /// 1332 /// By default, performs semantic analysis to build the new statement. 1333 /// Subclasses may override this routine to provide different behavior. 1334 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1335 SourceLocation LParenLoc, Stmt *Init, 1336 Sema::ConditionResult Cond, 1337 SourceLocation RParenLoc) { 1338 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond, 1339 RParenLoc); 1340 } 1341 1342 /// Attach the body to the switch statement. 1343 /// 1344 /// By default, performs semantic analysis to build the new statement. 1345 /// Subclasses may override this routine to provide different behavior. 1346 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1347 Stmt *Switch, Stmt *Body) { 1348 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1349 } 1350 1351 /// Build a new while statement. 1352 /// 1353 /// By default, performs semantic analysis to build the new statement. 1354 /// Subclasses may override this routine to provide different behavior. 1355 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, 1356 Sema::ConditionResult Cond, 1357 SourceLocation RParenLoc, Stmt *Body) { 1358 return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body); 1359 } 1360 1361 /// Build a new do-while statement. 1362 /// 1363 /// By default, performs semantic analysis to build the new statement. 1364 /// Subclasses may override this routine to provide different behavior. 1365 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1366 SourceLocation WhileLoc, SourceLocation LParenLoc, 1367 Expr *Cond, SourceLocation RParenLoc) { 1368 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1369 Cond, RParenLoc); 1370 } 1371 1372 /// Build a new for statement. 1373 /// 1374 /// By default, performs semantic analysis to build the new statement. 1375 /// Subclasses may override this routine to provide different behavior. 1376 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1377 Stmt *Init, Sema::ConditionResult Cond, 1378 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1379 Stmt *Body) { 1380 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1381 Inc, RParenLoc, Body); 1382 } 1383 1384 /// Build a new goto statement. 1385 /// 1386 /// By default, performs semantic analysis to build the new statement. 1387 /// Subclasses may override this routine to provide different behavior. 1388 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1389 LabelDecl *Label) { 1390 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1391 } 1392 1393 /// Build a new indirect goto statement. 1394 /// 1395 /// By default, performs semantic analysis to build the new statement. 1396 /// Subclasses may override this routine to provide different behavior. 1397 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1398 SourceLocation StarLoc, 1399 Expr *Target) { 1400 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1401 } 1402 1403 /// Build a new return statement. 1404 /// 1405 /// By default, performs semantic analysis to build the new statement. 1406 /// Subclasses may override this routine to provide different behavior. 1407 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1408 return getSema().BuildReturnStmt(ReturnLoc, Result); 1409 } 1410 1411 /// Build a new declaration statement. 1412 /// 1413 /// By default, performs semantic analysis to build the new statement. 1414 /// Subclasses may override this routine to provide different behavior. 1415 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1416 SourceLocation StartLoc, SourceLocation EndLoc) { 1417 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1418 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1419 } 1420 1421 /// Build a new inline asm statement. 1422 /// 1423 /// By default, performs semantic analysis to build the new statement. 1424 /// Subclasses may override this routine to provide different behavior. 1425 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1426 bool IsVolatile, unsigned NumOutputs, 1427 unsigned NumInputs, IdentifierInfo **Names, 1428 MultiExprArg Constraints, MultiExprArg Exprs, 1429 Expr *AsmString, MultiExprArg Clobbers, 1430 unsigned NumLabels, 1431 SourceLocation RParenLoc) { 1432 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1433 NumInputs, Names, Constraints, Exprs, 1434 AsmString, Clobbers, NumLabels, RParenLoc); 1435 } 1436 1437 /// Build a new MS style inline asm statement. 1438 /// 1439 /// By default, performs semantic analysis to build the new statement. 1440 /// Subclasses may override this routine to provide different behavior. 1441 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1442 ArrayRef<Token> AsmToks, 1443 StringRef AsmString, 1444 unsigned NumOutputs, unsigned NumInputs, 1445 ArrayRef<StringRef> Constraints, 1446 ArrayRef<StringRef> Clobbers, 1447 ArrayRef<Expr*> Exprs, 1448 SourceLocation EndLoc) { 1449 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1450 NumOutputs, NumInputs, 1451 Constraints, Clobbers, Exprs, EndLoc); 1452 } 1453 1454 /// Build a new co_return statement. 1455 /// 1456 /// By default, performs semantic analysis to build the new statement. 1457 /// Subclasses may override this routine to provide different behavior. 1458 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1459 bool IsImplicit) { 1460 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1461 } 1462 1463 /// Build a new co_await expression. 1464 /// 1465 /// By default, performs semantic analysis to build the new expression. 1466 /// Subclasses may override this routine to provide different behavior. 1467 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1468 bool IsImplicit) { 1469 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1470 } 1471 1472 /// Build a new co_await expression. 1473 /// 1474 /// By default, performs semantic analysis to build the new expression. 1475 /// Subclasses may override this routine to provide different behavior. 1476 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1477 Expr *Result, 1478 UnresolvedLookupExpr *Lookup) { 1479 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1480 } 1481 1482 /// Build a new co_yield expression. 1483 /// 1484 /// By default, performs semantic analysis to build the new expression. 1485 /// Subclasses may override this routine to provide different behavior. 1486 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1487 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1488 } 1489 1490 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1491 return getSema().BuildCoroutineBodyStmt(Args); 1492 } 1493 1494 /// Build a new Objective-C \@try statement. 1495 /// 1496 /// By default, performs semantic analysis to build the new statement. 1497 /// Subclasses may override this routine to provide different behavior. 1498 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1499 Stmt *TryBody, 1500 MultiStmtArg CatchStmts, 1501 Stmt *Finally) { 1502 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1503 Finally); 1504 } 1505 1506 /// Rebuild an Objective-C exception declaration. 1507 /// 1508 /// By default, performs semantic analysis to build the new declaration. 1509 /// Subclasses may override this routine to provide different behavior. 1510 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1511 TypeSourceInfo *TInfo, QualType T) { 1512 return getSema().BuildObjCExceptionDecl(TInfo, T, 1513 ExceptionDecl->getInnerLocStart(), 1514 ExceptionDecl->getLocation(), 1515 ExceptionDecl->getIdentifier()); 1516 } 1517 1518 /// Build a new Objective-C \@catch statement. 1519 /// 1520 /// By default, performs semantic analysis to build the new statement. 1521 /// Subclasses may override this routine to provide different behavior. 1522 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1523 SourceLocation RParenLoc, 1524 VarDecl *Var, 1525 Stmt *Body) { 1526 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1527 Var, Body); 1528 } 1529 1530 /// Build a new Objective-C \@finally statement. 1531 /// 1532 /// By default, performs semantic analysis to build the new statement. 1533 /// Subclasses may override this routine to provide different behavior. 1534 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1535 Stmt *Body) { 1536 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1537 } 1538 1539 /// Build a new Objective-C \@throw statement. 1540 /// 1541 /// By default, performs semantic analysis to build the new statement. 1542 /// Subclasses may override this routine to provide different behavior. 1543 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1544 Expr *Operand) { 1545 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1546 } 1547 1548 /// Build a new OpenMP executable directive. 1549 /// 1550 /// By default, performs semantic analysis to build the new statement. 1551 /// Subclasses may override this routine to provide different behavior. 1552 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1553 DeclarationNameInfo DirName, 1554 OpenMPDirectiveKind CancelRegion, 1555 ArrayRef<OMPClause *> Clauses, 1556 Stmt *AStmt, SourceLocation StartLoc, 1557 SourceLocation EndLoc) { 1558 return getSema().ActOnOpenMPExecutableDirective( 1559 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1560 } 1561 1562 /// Build a new OpenMP 'if' clause. 1563 /// 1564 /// By default, performs semantic analysis to build the new OpenMP clause. 1565 /// Subclasses may override this routine to provide different behavior. 1566 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1567 Expr *Condition, SourceLocation StartLoc, 1568 SourceLocation LParenLoc, 1569 SourceLocation NameModifierLoc, 1570 SourceLocation ColonLoc, 1571 SourceLocation EndLoc) { 1572 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1573 LParenLoc, NameModifierLoc, ColonLoc, 1574 EndLoc); 1575 } 1576 1577 /// Build a new OpenMP 'final' clause. 1578 /// 1579 /// By default, performs semantic analysis to build the new OpenMP clause. 1580 /// Subclasses may override this routine to provide different behavior. 1581 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1582 SourceLocation LParenLoc, 1583 SourceLocation EndLoc) { 1584 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1585 EndLoc); 1586 } 1587 1588 /// Build a new OpenMP 'num_threads' clause. 1589 /// 1590 /// By default, performs semantic analysis to build the new OpenMP clause. 1591 /// Subclasses may override this routine to provide different behavior. 1592 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1593 SourceLocation StartLoc, 1594 SourceLocation LParenLoc, 1595 SourceLocation EndLoc) { 1596 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1597 LParenLoc, EndLoc); 1598 } 1599 1600 /// Build a new OpenMP 'safelen' clause. 1601 /// 1602 /// By default, performs semantic analysis to build the new OpenMP clause. 1603 /// Subclasses may override this routine to provide different behavior. 1604 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1605 SourceLocation LParenLoc, 1606 SourceLocation EndLoc) { 1607 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1608 } 1609 1610 /// Build a new OpenMP 'simdlen' clause. 1611 /// 1612 /// By default, performs semantic analysis to build the new OpenMP clause. 1613 /// Subclasses may override this routine to provide different behavior. 1614 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1615 SourceLocation LParenLoc, 1616 SourceLocation EndLoc) { 1617 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1618 } 1619 1620 /// Build a new OpenMP 'allocator' clause. 1621 /// 1622 /// By default, performs semantic analysis to build the new OpenMP clause. 1623 /// Subclasses may override this routine to provide different behavior. 1624 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1625 SourceLocation LParenLoc, 1626 SourceLocation EndLoc) { 1627 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1628 } 1629 1630 /// Build a new OpenMP 'collapse' clause. 1631 /// 1632 /// By default, performs semantic analysis to build the new OpenMP clause. 1633 /// Subclasses may override this routine to provide different behavior. 1634 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1635 SourceLocation LParenLoc, 1636 SourceLocation EndLoc) { 1637 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1638 EndLoc); 1639 } 1640 1641 /// Build a new OpenMP 'default' clause. 1642 /// 1643 /// By default, performs semantic analysis to build the new OpenMP clause. 1644 /// Subclasses may override this routine to provide different behavior. 1645 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1646 SourceLocation StartLoc, 1647 SourceLocation LParenLoc, 1648 SourceLocation EndLoc) { 1649 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1650 StartLoc, LParenLoc, EndLoc); 1651 } 1652 1653 /// Build a new OpenMP 'proc_bind' clause. 1654 /// 1655 /// By default, performs semantic analysis to build the new OpenMP clause. 1656 /// Subclasses may override this routine to provide different behavior. 1657 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1658 SourceLocation KindKwLoc, 1659 SourceLocation StartLoc, 1660 SourceLocation LParenLoc, 1661 SourceLocation EndLoc) { 1662 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1663 StartLoc, LParenLoc, EndLoc); 1664 } 1665 1666 /// Build a new OpenMP 'schedule' clause. 1667 /// 1668 /// By default, performs semantic analysis to build the new OpenMP clause. 1669 /// Subclasses may override this routine to provide different behavior. 1670 OMPClause *RebuildOMPScheduleClause( 1671 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1672 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1673 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1674 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1675 return getSema().ActOnOpenMPScheduleClause( 1676 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1677 CommaLoc, EndLoc); 1678 } 1679 1680 /// Build a new OpenMP 'ordered' clause. 1681 /// 1682 /// By default, performs semantic analysis to build the new OpenMP clause. 1683 /// Subclasses may override this routine to provide different behavior. 1684 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1685 SourceLocation EndLoc, 1686 SourceLocation LParenLoc, Expr *Num) { 1687 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1688 } 1689 1690 /// Build a new OpenMP 'private' clause. 1691 /// 1692 /// By default, performs semantic analysis to build the new OpenMP clause. 1693 /// Subclasses may override this routine to provide different behavior. 1694 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1695 SourceLocation StartLoc, 1696 SourceLocation LParenLoc, 1697 SourceLocation EndLoc) { 1698 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1699 EndLoc); 1700 } 1701 1702 /// Build a new OpenMP 'firstprivate' clause. 1703 /// 1704 /// By default, performs semantic analysis to build the new OpenMP clause. 1705 /// Subclasses may override this routine to provide different behavior. 1706 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1707 SourceLocation StartLoc, 1708 SourceLocation LParenLoc, 1709 SourceLocation EndLoc) { 1710 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1711 EndLoc); 1712 } 1713 1714 /// Build a new OpenMP 'lastprivate' clause. 1715 /// 1716 /// By default, performs semantic analysis to build the new OpenMP clause. 1717 /// Subclasses may override this routine to provide different behavior. 1718 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1719 OpenMPLastprivateModifier LPKind, 1720 SourceLocation LPKindLoc, 1721 SourceLocation ColonLoc, 1722 SourceLocation StartLoc, 1723 SourceLocation LParenLoc, 1724 SourceLocation EndLoc) { 1725 return getSema().ActOnOpenMPLastprivateClause( 1726 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1727 } 1728 1729 /// Build a new OpenMP 'shared' clause. 1730 /// 1731 /// By default, performs semantic analysis to build the new OpenMP clause. 1732 /// Subclasses may override this routine to provide different behavior. 1733 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1734 SourceLocation StartLoc, 1735 SourceLocation LParenLoc, 1736 SourceLocation EndLoc) { 1737 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1738 EndLoc); 1739 } 1740 1741 /// Build a new OpenMP 'reduction' clause. 1742 /// 1743 /// By default, performs semantic analysis to build the new statement. 1744 /// Subclasses may override this routine to provide different behavior. 1745 OMPClause *RebuildOMPReductionClause( 1746 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1747 SourceLocation StartLoc, SourceLocation LParenLoc, 1748 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1749 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1750 const DeclarationNameInfo &ReductionId, 1751 ArrayRef<Expr *> UnresolvedReductions) { 1752 return getSema().ActOnOpenMPReductionClause( 1753 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1754 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1755 } 1756 1757 /// Build a new OpenMP 'task_reduction' clause. 1758 /// 1759 /// By default, performs semantic analysis to build the new statement. 1760 /// Subclasses may override this routine to provide different behavior. 1761 OMPClause *RebuildOMPTaskReductionClause( 1762 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1763 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1764 CXXScopeSpec &ReductionIdScopeSpec, 1765 const DeclarationNameInfo &ReductionId, 1766 ArrayRef<Expr *> UnresolvedReductions) { 1767 return getSema().ActOnOpenMPTaskReductionClause( 1768 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1769 ReductionId, UnresolvedReductions); 1770 } 1771 1772 /// Build a new OpenMP 'in_reduction' clause. 1773 /// 1774 /// By default, performs semantic analysis to build the new statement. 1775 /// Subclasses may override this routine to provide different behavior. 1776 OMPClause * 1777 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1778 SourceLocation LParenLoc, SourceLocation ColonLoc, 1779 SourceLocation EndLoc, 1780 CXXScopeSpec &ReductionIdScopeSpec, 1781 const DeclarationNameInfo &ReductionId, 1782 ArrayRef<Expr *> UnresolvedReductions) { 1783 return getSema().ActOnOpenMPInReductionClause( 1784 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1785 ReductionId, UnresolvedReductions); 1786 } 1787 1788 /// Build a new OpenMP 'linear' clause. 1789 /// 1790 /// By default, performs semantic analysis to build the new OpenMP clause. 1791 /// Subclasses may override this routine to provide different behavior. 1792 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1793 SourceLocation StartLoc, 1794 SourceLocation LParenLoc, 1795 OpenMPLinearClauseKind Modifier, 1796 SourceLocation ModifierLoc, 1797 SourceLocation ColonLoc, 1798 SourceLocation EndLoc) { 1799 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1800 Modifier, ModifierLoc, ColonLoc, 1801 EndLoc); 1802 } 1803 1804 /// Build a new OpenMP 'aligned' clause. 1805 /// 1806 /// By default, performs semantic analysis to build the new OpenMP clause. 1807 /// Subclasses may override this routine to provide different behavior. 1808 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1809 SourceLocation StartLoc, 1810 SourceLocation LParenLoc, 1811 SourceLocation ColonLoc, 1812 SourceLocation EndLoc) { 1813 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1814 LParenLoc, ColonLoc, EndLoc); 1815 } 1816 1817 /// Build a new OpenMP 'copyin' clause. 1818 /// 1819 /// By default, performs semantic analysis to build the new OpenMP clause. 1820 /// Subclasses may override this routine to provide different behavior. 1821 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1822 SourceLocation StartLoc, 1823 SourceLocation LParenLoc, 1824 SourceLocation EndLoc) { 1825 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1826 EndLoc); 1827 } 1828 1829 /// Build a new OpenMP 'copyprivate' clause. 1830 /// 1831 /// By default, performs semantic analysis to build the new OpenMP clause. 1832 /// Subclasses may override this routine to provide different behavior. 1833 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1834 SourceLocation StartLoc, 1835 SourceLocation LParenLoc, 1836 SourceLocation EndLoc) { 1837 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1838 EndLoc); 1839 } 1840 1841 /// Build a new OpenMP 'flush' pseudo clause. 1842 /// 1843 /// By default, performs semantic analysis to build the new OpenMP clause. 1844 /// Subclasses may override this routine to provide different behavior. 1845 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1846 SourceLocation StartLoc, 1847 SourceLocation LParenLoc, 1848 SourceLocation EndLoc) { 1849 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1850 EndLoc); 1851 } 1852 1853 /// Build a new OpenMP 'depobj' pseudo clause. 1854 /// 1855 /// By default, performs semantic analysis to build the new OpenMP clause. 1856 /// Subclasses may override this routine to provide different behavior. 1857 OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1858 SourceLocation LParenLoc, 1859 SourceLocation EndLoc) { 1860 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1861 EndLoc); 1862 } 1863 1864 /// Build a new OpenMP 'depend' pseudo 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 * 1869 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1870 SourceLocation DepLoc, SourceLocation ColonLoc, 1871 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1872 SourceLocation LParenLoc, SourceLocation EndLoc) { 1873 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1874 ColonLoc, VarList, StartLoc, 1875 LParenLoc, EndLoc); 1876 } 1877 1878 /// Build a new OpenMP 'device' clause. 1879 /// 1880 /// By default, performs semantic analysis to build the new statement. 1881 /// Subclasses may override this routine to provide different behavior. 1882 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1883 Expr *Device, SourceLocation StartLoc, 1884 SourceLocation LParenLoc, 1885 SourceLocation ModifierLoc, 1886 SourceLocation EndLoc) { 1887 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1888 LParenLoc, ModifierLoc, EndLoc); 1889 } 1890 1891 /// Build a new OpenMP 'map' clause. 1892 /// 1893 /// By default, performs semantic analysis to build the new OpenMP clause. 1894 /// Subclasses may override this routine to provide different behavior. 1895 OMPClause *RebuildOMPMapClause( 1896 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1897 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1898 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1899 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1900 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1901 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1902 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1903 MapperIdScopeSpec, MapperId, MapType, 1904 IsMapTypeImplicit, MapLoc, ColonLoc, 1905 VarList, Locs, UnresolvedMappers); 1906 } 1907 1908 /// Build a new OpenMP 'allocate' clause. 1909 /// 1910 /// By default, performs semantic analysis to build the new OpenMP clause. 1911 /// Subclasses may override this routine to provide different behavior. 1912 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1913 SourceLocation StartLoc, 1914 SourceLocation LParenLoc, 1915 SourceLocation ColonLoc, 1916 SourceLocation EndLoc) { 1917 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1918 LParenLoc, ColonLoc, EndLoc); 1919 } 1920 1921 /// Build a new OpenMP 'num_teams' clause. 1922 /// 1923 /// By default, performs semantic analysis to build the new statement. 1924 /// Subclasses may override this routine to provide different behavior. 1925 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1926 SourceLocation LParenLoc, 1927 SourceLocation EndLoc) { 1928 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1929 EndLoc); 1930 } 1931 1932 /// Build a new OpenMP 'thread_limit' clause. 1933 /// 1934 /// By default, performs semantic analysis to build the new statement. 1935 /// Subclasses may override this routine to provide different behavior. 1936 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1937 SourceLocation StartLoc, 1938 SourceLocation LParenLoc, 1939 SourceLocation EndLoc) { 1940 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1941 LParenLoc, EndLoc); 1942 } 1943 1944 /// Build a new OpenMP 'priority' clause. 1945 /// 1946 /// By default, performs semantic analysis to build the new statement. 1947 /// Subclasses may override this routine to provide different behavior. 1948 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1949 SourceLocation LParenLoc, 1950 SourceLocation EndLoc) { 1951 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1952 EndLoc); 1953 } 1954 1955 /// Build a new OpenMP 'grainsize' clause. 1956 /// 1957 /// By default, performs semantic analysis to build the new statement. 1958 /// Subclasses may override this routine to provide different behavior. 1959 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1960 SourceLocation LParenLoc, 1961 SourceLocation EndLoc) { 1962 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1963 EndLoc); 1964 } 1965 1966 /// Build a new OpenMP 'num_tasks' clause. 1967 /// 1968 /// By default, performs semantic analysis to build the new statement. 1969 /// Subclasses may override this routine to provide different behavior. 1970 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1971 SourceLocation LParenLoc, 1972 SourceLocation EndLoc) { 1973 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1974 EndLoc); 1975 } 1976 1977 /// Build a new OpenMP 'hint' clause. 1978 /// 1979 /// By default, performs semantic analysis to build the new statement. 1980 /// Subclasses may override this routine to provide different behavior. 1981 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1982 SourceLocation LParenLoc, 1983 SourceLocation EndLoc) { 1984 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1985 } 1986 1987 /// Build a new OpenMP 'detach' clause. 1988 /// 1989 /// By default, performs semantic analysis to build the new statement. 1990 /// Subclasses may override this routine to provide different behavior. 1991 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 1992 SourceLocation LParenLoc, 1993 SourceLocation EndLoc) { 1994 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 1995 } 1996 1997 /// Build a new OpenMP 'dist_schedule' clause. 1998 /// 1999 /// By default, performs semantic analysis to build the new OpenMP clause. 2000 /// Subclasses may override this routine to provide different behavior. 2001 OMPClause * 2002 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 2003 Expr *ChunkSize, SourceLocation StartLoc, 2004 SourceLocation LParenLoc, SourceLocation KindLoc, 2005 SourceLocation CommaLoc, SourceLocation EndLoc) { 2006 return getSema().ActOnOpenMPDistScheduleClause( 2007 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 2008 } 2009 2010 /// Build a new OpenMP 'to' clause. 2011 /// 2012 /// By default, performs semantic analysis to build the new statement. 2013 /// Subclasses may override this routine to provide different behavior. 2014 OMPClause * 2015 RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2016 ArrayRef<SourceLocation> MotionModifiersLoc, 2017 CXXScopeSpec &MapperIdScopeSpec, 2018 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2019 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2020 ArrayRef<Expr *> UnresolvedMappers) { 2021 return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc, 2022 MapperIdScopeSpec, MapperId, ColonLoc, 2023 VarList, Locs, UnresolvedMappers); 2024 } 2025 2026 /// Build a new OpenMP 'from' clause. 2027 /// 2028 /// By default, performs semantic analysis to build the new statement. 2029 /// Subclasses may override this routine to provide different behavior. 2030 OMPClause * 2031 RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers, 2032 ArrayRef<SourceLocation> MotionModifiersLoc, 2033 CXXScopeSpec &MapperIdScopeSpec, 2034 DeclarationNameInfo &MapperId, SourceLocation ColonLoc, 2035 ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs, 2036 ArrayRef<Expr *> UnresolvedMappers) { 2037 return getSema().ActOnOpenMPFromClause( 2038 MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId, 2039 ColonLoc, VarList, Locs, UnresolvedMappers); 2040 } 2041 2042 /// Build a new OpenMP 'use_device_ptr' clause. 2043 /// 2044 /// By default, performs semantic analysis to build the new OpenMP clause. 2045 /// Subclasses may override this routine to provide different behavior. 2046 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2047 const OMPVarListLocTy &Locs) { 2048 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2049 } 2050 2051 /// Build a new OpenMP 'use_device_addr' clause. 2052 /// 2053 /// By default, performs semantic analysis to build the new OpenMP clause. 2054 /// Subclasses may override this routine to provide different behavior. 2055 OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList, 2056 const OMPVarListLocTy &Locs) { 2057 return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs); 2058 } 2059 2060 /// Build a new OpenMP 'is_device_ptr' clause. 2061 /// 2062 /// By default, performs semantic analysis to build the new OpenMP clause. 2063 /// Subclasses may override this routine to provide different behavior. 2064 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2065 const OMPVarListLocTy &Locs) { 2066 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2067 } 2068 2069 /// Build a new OpenMP 'defaultmap' clause. 2070 /// 2071 /// By default, performs semantic analysis to build the new OpenMP clause. 2072 /// Subclasses may override this routine to provide different behavior. 2073 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2074 OpenMPDefaultmapClauseKind Kind, 2075 SourceLocation StartLoc, 2076 SourceLocation LParenLoc, 2077 SourceLocation MLoc, 2078 SourceLocation KindLoc, 2079 SourceLocation EndLoc) { 2080 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2081 MLoc, KindLoc, EndLoc); 2082 } 2083 2084 /// Build a new OpenMP 'nontemporal' clause. 2085 /// 2086 /// By default, performs semantic analysis to build the new OpenMP clause. 2087 /// Subclasses may override this routine to provide different behavior. 2088 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2089 SourceLocation StartLoc, 2090 SourceLocation LParenLoc, 2091 SourceLocation EndLoc) { 2092 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2093 EndLoc); 2094 } 2095 2096 /// Build a new OpenMP 'inclusive' clause. 2097 /// 2098 /// By default, performs semantic analysis to build the new OpenMP clause. 2099 /// Subclasses may override this routine to provide different behavior. 2100 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2101 SourceLocation StartLoc, 2102 SourceLocation LParenLoc, 2103 SourceLocation EndLoc) { 2104 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2105 EndLoc); 2106 } 2107 2108 /// Build a new OpenMP 'exclusive' clause. 2109 /// 2110 /// By default, performs semantic analysis to build the new OpenMP clause. 2111 /// Subclasses may override this routine to provide different behavior. 2112 OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2113 SourceLocation StartLoc, 2114 SourceLocation LParenLoc, 2115 SourceLocation EndLoc) { 2116 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2117 EndLoc); 2118 } 2119 2120 /// Build a new OpenMP 'uses_allocators' clause. 2121 /// 2122 /// By default, performs semantic analysis to build the new OpenMP clause. 2123 /// Subclasses may override this routine to provide different behavior. 2124 OMPClause *RebuildOMPUsesAllocatorsClause( 2125 ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc, 2126 SourceLocation LParenLoc, SourceLocation EndLoc) { 2127 return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc, 2128 Data); 2129 } 2130 2131 /// Build a new OpenMP 'affinity' 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 *RebuildOMPAffinityClause(SourceLocation StartLoc, 2136 SourceLocation LParenLoc, 2137 SourceLocation ColonLoc, 2138 SourceLocation EndLoc, Expr *Modifier, 2139 ArrayRef<Expr *> Locators) { 2140 return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc, 2141 EndLoc, Modifier, Locators); 2142 } 2143 2144 /// Build a new OpenMP 'order' clause. 2145 /// 2146 /// By default, performs semantic analysis to build the new OpenMP clause. 2147 /// Subclasses may override this routine to provide different behavior. 2148 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2149 SourceLocation KindKwLoc, 2150 SourceLocation StartLoc, 2151 SourceLocation LParenLoc, 2152 SourceLocation EndLoc) { 2153 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2154 LParenLoc, EndLoc); 2155 } 2156 2157 /// Rebuild the operand to an Objective-C \@synchronized statement. 2158 /// 2159 /// By default, performs semantic analysis to build the new statement. 2160 /// Subclasses may override this routine to provide different behavior. 2161 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2162 Expr *object) { 2163 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2164 } 2165 2166 /// Build a new Objective-C \@synchronized statement. 2167 /// 2168 /// By default, performs semantic analysis to build the new statement. 2169 /// Subclasses may override this routine to provide different behavior. 2170 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2171 Expr *Object, Stmt *Body) { 2172 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2173 } 2174 2175 /// Build a new Objective-C \@autoreleasepool statement. 2176 /// 2177 /// By default, performs semantic analysis to build the new statement. 2178 /// Subclasses may override this routine to provide different behavior. 2179 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2180 Stmt *Body) { 2181 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2182 } 2183 2184 /// Build a new Objective-C fast enumeration statement. 2185 /// 2186 /// By default, performs semantic analysis to build the new statement. 2187 /// Subclasses may override this routine to provide different behavior. 2188 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2189 Stmt *Element, 2190 Expr *Collection, 2191 SourceLocation RParenLoc, 2192 Stmt *Body) { 2193 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2194 Element, 2195 Collection, 2196 RParenLoc); 2197 if (ForEachStmt.isInvalid()) 2198 return StmtError(); 2199 2200 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2201 } 2202 2203 /// Build a new C++ exception declaration. 2204 /// 2205 /// By default, performs semantic analysis to build the new decaration. 2206 /// Subclasses may override this routine to provide different behavior. 2207 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2208 TypeSourceInfo *Declarator, 2209 SourceLocation StartLoc, 2210 SourceLocation IdLoc, 2211 IdentifierInfo *Id) { 2212 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2213 StartLoc, IdLoc, Id); 2214 if (Var) 2215 getSema().CurContext->addDecl(Var); 2216 return Var; 2217 } 2218 2219 /// Build a new C++ catch statement. 2220 /// 2221 /// By default, performs semantic analysis to build the new statement. 2222 /// Subclasses may override this routine to provide different behavior. 2223 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2224 VarDecl *ExceptionDecl, 2225 Stmt *Handler) { 2226 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2227 Handler)); 2228 } 2229 2230 /// Build a new C++ try statement. 2231 /// 2232 /// By default, performs semantic analysis to build the new statement. 2233 /// Subclasses may override this routine to provide different behavior. 2234 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2235 ArrayRef<Stmt *> Handlers) { 2236 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2237 } 2238 2239 /// Build a new C++0x range-based for statement. 2240 /// 2241 /// By default, performs semantic analysis to build the new statement. 2242 /// Subclasses may override this routine to provide different behavior. 2243 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2244 SourceLocation CoawaitLoc, Stmt *Init, 2245 SourceLocation ColonLoc, Stmt *Range, 2246 Stmt *Begin, Stmt *End, Expr *Cond, 2247 Expr *Inc, Stmt *LoopVar, 2248 SourceLocation RParenLoc) { 2249 // If we've just learned that the range is actually an Objective-C 2250 // collection, treat this as an Objective-C fast enumeration loop. 2251 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2252 if (RangeStmt->isSingleDecl()) { 2253 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2254 if (RangeVar->isInvalidDecl()) 2255 return StmtError(); 2256 2257 Expr *RangeExpr = RangeVar->getInit(); 2258 if (!RangeExpr->isTypeDependent() && 2259 RangeExpr->getType()->isObjCObjectPointerType()) { 2260 // FIXME: Support init-statements in Objective-C++20 ranged for 2261 // statement. 2262 if (Init) { 2263 return SemaRef.Diag(Init->getBeginLoc(), 2264 diag::err_objc_for_range_init_stmt) 2265 << Init->getSourceRange(); 2266 } 2267 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2268 RangeExpr, RParenLoc); 2269 } 2270 } 2271 } 2272 } 2273 2274 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2275 Range, Begin, End, Cond, Inc, LoopVar, 2276 RParenLoc, Sema::BFRK_Rebuild); 2277 } 2278 2279 /// Build a new C++0x range-based for statement. 2280 /// 2281 /// By default, performs semantic analysis to build the new statement. 2282 /// Subclasses may override this routine to provide different behavior. 2283 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2284 bool IsIfExists, 2285 NestedNameSpecifierLoc QualifierLoc, 2286 DeclarationNameInfo NameInfo, 2287 Stmt *Nested) { 2288 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2289 QualifierLoc, NameInfo, Nested); 2290 } 2291 2292 /// Attach body to a C++0x range-based for statement. 2293 /// 2294 /// By default, performs semantic analysis to finish the new statement. 2295 /// Subclasses may override this routine to provide different behavior. 2296 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2297 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2298 } 2299 2300 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2301 Stmt *TryBlock, Stmt *Handler) { 2302 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2303 } 2304 2305 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2306 Stmt *Block) { 2307 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2308 } 2309 2310 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2311 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2312 } 2313 2314 /// Build a new predefined expression. 2315 /// 2316 /// By default, performs semantic analysis to build the new expression. 2317 /// Subclasses may override this routine to provide different behavior. 2318 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2319 PredefinedExpr::IdentKind IK) { 2320 return getSema().BuildPredefinedExpr(Loc, IK); 2321 } 2322 2323 /// Build a new expression that references a declaration. 2324 /// 2325 /// By default, performs semantic analysis to build the new expression. 2326 /// Subclasses may override this routine to provide different behavior. 2327 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2328 LookupResult &R, 2329 bool RequiresADL) { 2330 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2331 } 2332 2333 2334 /// Build a new expression that references a declaration. 2335 /// 2336 /// By default, performs semantic analysis to build the new expression. 2337 /// Subclasses may override this routine to provide different behavior. 2338 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2339 ValueDecl *VD, 2340 const DeclarationNameInfo &NameInfo, 2341 NamedDecl *Found, 2342 TemplateArgumentListInfo *TemplateArgs) { 2343 CXXScopeSpec SS; 2344 SS.Adopt(QualifierLoc); 2345 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2346 TemplateArgs); 2347 } 2348 2349 /// Build a new expression in parentheses. 2350 /// 2351 /// By default, performs semantic analysis to build the new expression. 2352 /// Subclasses may override this routine to provide different behavior. 2353 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2354 SourceLocation RParen) { 2355 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2356 } 2357 2358 /// Build a new pseudo-destructor expression. 2359 /// 2360 /// By default, performs semantic analysis to build the new expression. 2361 /// Subclasses may override this routine to provide different behavior. 2362 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2363 SourceLocation OperatorLoc, 2364 bool isArrow, 2365 CXXScopeSpec &SS, 2366 TypeSourceInfo *ScopeType, 2367 SourceLocation CCLoc, 2368 SourceLocation TildeLoc, 2369 PseudoDestructorTypeStorage Destroyed); 2370 2371 /// Build a new unary operator expression. 2372 /// 2373 /// By default, performs semantic analysis to build the new expression. 2374 /// Subclasses may override this routine to provide different behavior. 2375 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2376 UnaryOperatorKind Opc, 2377 Expr *SubExpr) { 2378 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2379 } 2380 2381 /// Build a new builtin offsetof expression. 2382 /// 2383 /// By default, performs semantic analysis to build the new expression. 2384 /// Subclasses may override this routine to provide different behavior. 2385 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2386 TypeSourceInfo *Type, 2387 ArrayRef<Sema::OffsetOfComponent> Components, 2388 SourceLocation RParenLoc) { 2389 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2390 RParenLoc); 2391 } 2392 2393 /// Build a new sizeof, alignof or vec_step expression with a 2394 /// type argument. 2395 /// 2396 /// By default, performs semantic analysis to build the new expression. 2397 /// Subclasses may override this routine to provide different behavior. 2398 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2399 SourceLocation OpLoc, 2400 UnaryExprOrTypeTrait ExprKind, 2401 SourceRange R) { 2402 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2403 } 2404 2405 /// Build a new sizeof, alignof or vec step expression with an 2406 /// expression argument. 2407 /// 2408 /// By default, performs semantic analysis to build the new expression. 2409 /// Subclasses may override this routine to provide different behavior. 2410 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2411 UnaryExprOrTypeTrait ExprKind, 2412 SourceRange R) { 2413 ExprResult Result 2414 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2415 if (Result.isInvalid()) 2416 return ExprError(); 2417 2418 return Result; 2419 } 2420 2421 /// Build a new array subscript expression. 2422 /// 2423 /// By default, performs semantic analysis to build the new expression. 2424 /// Subclasses may override this routine to provide different behavior. 2425 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2426 SourceLocation LBracketLoc, 2427 Expr *RHS, 2428 SourceLocation RBracketLoc) { 2429 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2430 LBracketLoc, RHS, 2431 RBracketLoc); 2432 } 2433 2434 /// Build a new matrix subscript expression. 2435 /// 2436 /// By default, performs semantic analysis to build the new expression. 2437 /// Subclasses may override this routine to provide different behavior. 2438 ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx, 2439 Expr *ColumnIdx, 2440 SourceLocation RBracketLoc) { 2441 return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx, 2442 RBracketLoc); 2443 } 2444 2445 /// Build a new array section expression. 2446 /// 2447 /// By default, performs semantic analysis to build the new expression. 2448 /// Subclasses may override this routine to provide different behavior. 2449 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2450 Expr *LowerBound, 2451 SourceLocation ColonLocFirst, 2452 SourceLocation ColonLocSecond, 2453 Expr *Length, Expr *Stride, 2454 SourceLocation RBracketLoc) { 2455 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2456 ColonLocFirst, ColonLocSecond, 2457 Length, Stride, RBracketLoc); 2458 } 2459 2460 /// Build a new array shaping expression. 2461 /// 2462 /// By default, performs semantic analysis to build the new expression. 2463 /// Subclasses may override this routine to provide different behavior. 2464 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2465 SourceLocation RParenLoc, 2466 ArrayRef<Expr *> Dims, 2467 ArrayRef<SourceRange> BracketsRanges) { 2468 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2469 BracketsRanges); 2470 } 2471 2472 /// Build a new iterator expression. 2473 /// 2474 /// By default, performs semantic analysis to build the new expression. 2475 /// Subclasses may override this routine to provide different behavior. 2476 ExprResult RebuildOMPIteratorExpr( 2477 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2478 ArrayRef<Sema::OMPIteratorData> Data) { 2479 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2480 LLoc, RLoc, Data); 2481 } 2482 2483 /// Build a new call expression. 2484 /// 2485 /// By default, performs semantic analysis to build the new expression. 2486 /// Subclasses may override this routine to provide different behavior. 2487 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2488 MultiExprArg Args, 2489 SourceLocation RParenLoc, 2490 Expr *ExecConfig = nullptr) { 2491 return getSema().ActOnCallExpr( 2492 /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig); 2493 } 2494 2495 /// Build a new member access 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 RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2500 bool isArrow, 2501 NestedNameSpecifierLoc QualifierLoc, 2502 SourceLocation TemplateKWLoc, 2503 const DeclarationNameInfo &MemberNameInfo, 2504 ValueDecl *Member, 2505 NamedDecl *FoundDecl, 2506 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2507 NamedDecl *FirstQualifierInScope) { 2508 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2509 isArrow); 2510 if (!Member->getDeclName()) { 2511 // We have a reference to an unnamed field. This is always the 2512 // base of an anonymous struct/union member access, i.e. the 2513 // field is always of record type. 2514 assert(Member->getType()->isRecordType() && 2515 "unnamed member not of record type?"); 2516 2517 BaseResult = 2518 getSema().PerformObjectMemberConversion(BaseResult.get(), 2519 QualifierLoc.getNestedNameSpecifier(), 2520 FoundDecl, Member); 2521 if (BaseResult.isInvalid()) 2522 return ExprError(); 2523 Base = BaseResult.get(); 2524 2525 CXXScopeSpec EmptySS; 2526 return getSema().BuildFieldReferenceExpr( 2527 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2528 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2529 } 2530 2531 CXXScopeSpec SS; 2532 SS.Adopt(QualifierLoc); 2533 2534 Base = BaseResult.get(); 2535 QualType BaseType = Base->getType(); 2536 2537 if (isArrow && !BaseType->isPointerType()) 2538 return ExprError(); 2539 2540 // FIXME: this involves duplicating earlier analysis in a lot of 2541 // cases; we should avoid this when possible. 2542 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2543 R.addDecl(FoundDecl); 2544 R.resolveKind(); 2545 2546 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2547 SS, TemplateKWLoc, 2548 FirstQualifierInScope, 2549 R, ExplicitTemplateArgs, 2550 /*S*/nullptr); 2551 } 2552 2553 /// Build a new binary operator expression. 2554 /// 2555 /// By default, performs semantic analysis to build the new expression. 2556 /// Subclasses may override this routine to provide different behavior. 2557 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2558 BinaryOperatorKind Opc, 2559 Expr *LHS, Expr *RHS) { 2560 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2561 } 2562 2563 /// Build a new rewritten operator expression. 2564 /// 2565 /// By default, performs semantic analysis to build the new expression. 2566 /// Subclasses may override this routine to provide different behavior. 2567 ExprResult RebuildCXXRewrittenBinaryOperator( 2568 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2569 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2570 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2571 RHS, /*RequiresADL*/false); 2572 } 2573 2574 /// Build a new conditional operator expression. 2575 /// 2576 /// By default, performs semantic analysis to build the new expression. 2577 /// Subclasses may override this routine to provide different behavior. 2578 ExprResult RebuildConditionalOperator(Expr *Cond, 2579 SourceLocation QuestionLoc, 2580 Expr *LHS, 2581 SourceLocation ColonLoc, 2582 Expr *RHS) { 2583 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2584 LHS, RHS); 2585 } 2586 2587 /// Build a new C-style cast expression. 2588 /// 2589 /// By default, performs semantic analysis to build the new expression. 2590 /// Subclasses may override this routine to provide different behavior. 2591 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2592 TypeSourceInfo *TInfo, 2593 SourceLocation RParenLoc, 2594 Expr *SubExpr) { 2595 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2596 SubExpr); 2597 } 2598 2599 /// Build a new compound literal expression. 2600 /// 2601 /// By default, performs semantic analysis to build the new expression. 2602 /// Subclasses may override this routine to provide different behavior. 2603 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2604 TypeSourceInfo *TInfo, 2605 SourceLocation RParenLoc, 2606 Expr *Init) { 2607 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2608 Init); 2609 } 2610 2611 /// Build a new extended vector element access expression. 2612 /// 2613 /// By default, performs semantic analysis to build the new expression. 2614 /// Subclasses may override this routine to provide different behavior. 2615 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2616 SourceLocation OpLoc, 2617 SourceLocation AccessorLoc, 2618 IdentifierInfo &Accessor) { 2619 2620 CXXScopeSpec SS; 2621 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2622 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2623 OpLoc, /*IsArrow*/ false, 2624 SS, SourceLocation(), 2625 /*FirstQualifierInScope*/ nullptr, 2626 NameInfo, 2627 /* TemplateArgs */ nullptr, 2628 /*S*/ nullptr); 2629 } 2630 2631 /// Build a new initializer list expression. 2632 /// 2633 /// By default, performs semantic analysis to build the new expression. 2634 /// Subclasses may override this routine to provide different behavior. 2635 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2636 MultiExprArg Inits, 2637 SourceLocation RBraceLoc) { 2638 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2639 } 2640 2641 /// Build a new designated initializer expression. 2642 /// 2643 /// By default, performs semantic analysis to build the new expression. 2644 /// Subclasses may override this routine to provide different behavior. 2645 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2646 MultiExprArg ArrayExprs, 2647 SourceLocation EqualOrColonLoc, 2648 bool GNUSyntax, 2649 Expr *Init) { 2650 ExprResult Result 2651 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2652 Init); 2653 if (Result.isInvalid()) 2654 return ExprError(); 2655 2656 return Result; 2657 } 2658 2659 /// Build a new value-initialized expression. 2660 /// 2661 /// By default, builds the implicit value initialization without performing 2662 /// any semantic analysis. Subclasses may override this routine to provide 2663 /// different behavior. 2664 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2665 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2666 } 2667 2668 /// Build a new \c va_arg expression. 2669 /// 2670 /// By default, performs semantic analysis to build the new expression. 2671 /// Subclasses may override this routine to provide different behavior. 2672 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2673 Expr *SubExpr, TypeSourceInfo *TInfo, 2674 SourceLocation RParenLoc) { 2675 return getSema().BuildVAArgExpr(BuiltinLoc, 2676 SubExpr, TInfo, 2677 RParenLoc); 2678 } 2679 2680 /// Build a new expression list in parentheses. 2681 /// 2682 /// By default, performs semantic analysis to build the new expression. 2683 /// Subclasses may override this routine to provide different behavior. 2684 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2685 MultiExprArg SubExprs, 2686 SourceLocation RParenLoc) { 2687 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2688 } 2689 2690 /// Build a new address-of-label expression. 2691 /// 2692 /// By default, performs semantic analysis, using the name of the label 2693 /// rather than attempting to map the label statement itself. 2694 /// Subclasses may override this routine to provide different behavior. 2695 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2696 SourceLocation LabelLoc, LabelDecl *Label) { 2697 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2698 } 2699 2700 /// Build a new GNU statement expression. 2701 /// 2702 /// By default, performs semantic analysis to build the new expression. 2703 /// Subclasses may override this routine to provide different behavior. 2704 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2705 SourceLocation RParenLoc, unsigned TemplateDepth) { 2706 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2707 TemplateDepth); 2708 } 2709 2710 /// Build a new __builtin_choose_expr expression. 2711 /// 2712 /// By default, performs semantic analysis to build the new expression. 2713 /// Subclasses may override this routine to provide different behavior. 2714 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2715 Expr *Cond, Expr *LHS, Expr *RHS, 2716 SourceLocation RParenLoc) { 2717 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2718 Cond, LHS, RHS, 2719 RParenLoc); 2720 } 2721 2722 /// Build a new generic selection expression. 2723 /// 2724 /// By default, performs semantic analysis to build the new expression. 2725 /// Subclasses may override this routine to provide different behavior. 2726 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2727 SourceLocation DefaultLoc, 2728 SourceLocation RParenLoc, 2729 Expr *ControllingExpr, 2730 ArrayRef<TypeSourceInfo *> Types, 2731 ArrayRef<Expr *> Exprs) { 2732 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2733 ControllingExpr, Types, Exprs); 2734 } 2735 2736 /// Build a new overloaded operator call expression. 2737 /// 2738 /// By default, performs semantic analysis to build the new expression. 2739 /// The semantic analysis provides the behavior of template instantiation, 2740 /// copying with transformations that turn what looks like an overloaded 2741 /// operator call into a use of a builtin operator, performing 2742 /// argument-dependent lookup, etc. Subclasses may override this routine to 2743 /// provide different behavior. 2744 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2745 SourceLocation OpLoc, 2746 Expr *Callee, 2747 Expr *First, 2748 Expr *Second); 2749 2750 /// Build a new C++ "named" cast expression, such as static_cast or 2751 /// reinterpret_cast. 2752 /// 2753 /// By default, this routine dispatches to one of the more-specific routines 2754 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2755 /// Subclasses may override this routine to provide different behavior. 2756 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2757 Stmt::StmtClass Class, 2758 SourceLocation LAngleLoc, 2759 TypeSourceInfo *TInfo, 2760 SourceLocation RAngleLoc, 2761 SourceLocation LParenLoc, 2762 Expr *SubExpr, 2763 SourceLocation RParenLoc) { 2764 switch (Class) { 2765 case Stmt::CXXStaticCastExprClass: 2766 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2767 RAngleLoc, LParenLoc, 2768 SubExpr, RParenLoc); 2769 2770 case Stmt::CXXDynamicCastExprClass: 2771 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2772 RAngleLoc, LParenLoc, 2773 SubExpr, RParenLoc); 2774 2775 case Stmt::CXXReinterpretCastExprClass: 2776 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2777 RAngleLoc, LParenLoc, 2778 SubExpr, 2779 RParenLoc); 2780 2781 case Stmt::CXXConstCastExprClass: 2782 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2783 RAngleLoc, LParenLoc, 2784 SubExpr, RParenLoc); 2785 2786 case Stmt::CXXAddrspaceCastExprClass: 2787 return getDerived().RebuildCXXAddrspaceCastExpr( 2788 OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc); 2789 2790 default: 2791 llvm_unreachable("Invalid C++ named cast"); 2792 } 2793 } 2794 2795 /// Build a new C++ static_cast expression. 2796 /// 2797 /// By default, performs semantic analysis to build the new expression. 2798 /// Subclasses may override this routine to provide different behavior. 2799 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2800 SourceLocation LAngleLoc, 2801 TypeSourceInfo *TInfo, 2802 SourceLocation RAngleLoc, 2803 SourceLocation LParenLoc, 2804 Expr *SubExpr, 2805 SourceLocation RParenLoc) { 2806 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2807 TInfo, SubExpr, 2808 SourceRange(LAngleLoc, RAngleLoc), 2809 SourceRange(LParenLoc, RParenLoc)); 2810 } 2811 2812 /// Build a new C++ dynamic_cast 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 RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2817 SourceLocation LAngleLoc, 2818 TypeSourceInfo *TInfo, 2819 SourceLocation RAngleLoc, 2820 SourceLocation LParenLoc, 2821 Expr *SubExpr, 2822 SourceLocation RParenLoc) { 2823 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2824 TInfo, SubExpr, 2825 SourceRange(LAngleLoc, RAngleLoc), 2826 SourceRange(LParenLoc, RParenLoc)); 2827 } 2828 2829 /// Build a new C++ reinterpret_cast expression. 2830 /// 2831 /// By default, performs semantic analysis to build the new expression. 2832 /// Subclasses may override this routine to provide different behavior. 2833 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2834 SourceLocation LAngleLoc, 2835 TypeSourceInfo *TInfo, 2836 SourceLocation RAngleLoc, 2837 SourceLocation LParenLoc, 2838 Expr *SubExpr, 2839 SourceLocation RParenLoc) { 2840 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2841 TInfo, SubExpr, 2842 SourceRange(LAngleLoc, RAngleLoc), 2843 SourceRange(LParenLoc, RParenLoc)); 2844 } 2845 2846 /// Build a new C++ const_cast expression. 2847 /// 2848 /// By default, performs semantic analysis to build the new expression. 2849 /// Subclasses may override this routine to provide different behavior. 2850 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2851 SourceLocation LAngleLoc, 2852 TypeSourceInfo *TInfo, 2853 SourceLocation RAngleLoc, 2854 SourceLocation LParenLoc, 2855 Expr *SubExpr, 2856 SourceLocation RParenLoc) { 2857 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2858 TInfo, SubExpr, 2859 SourceRange(LAngleLoc, RAngleLoc), 2860 SourceRange(LParenLoc, RParenLoc)); 2861 } 2862 2863 ExprResult 2864 RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc, 2865 TypeSourceInfo *TInfo, SourceLocation RAngleLoc, 2866 SourceLocation LParenLoc, Expr *SubExpr, 2867 SourceLocation RParenLoc) { 2868 return getSema().BuildCXXNamedCast( 2869 OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr, 2870 SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc)); 2871 } 2872 2873 /// Build a new C++ functional-style cast expression. 2874 /// 2875 /// By default, performs semantic analysis to build the new expression. 2876 /// Subclasses may override this routine to provide different behavior. 2877 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2878 SourceLocation LParenLoc, 2879 Expr *Sub, 2880 SourceLocation RParenLoc, 2881 bool ListInitialization) { 2882 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2883 MultiExprArg(&Sub, 1), RParenLoc, 2884 ListInitialization); 2885 } 2886 2887 /// Build a new C++ __builtin_bit_cast expression. 2888 /// 2889 /// By default, performs semantic analysis to build the new expression. 2890 /// Subclasses may override this routine to provide different behavior. 2891 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2892 TypeSourceInfo *TSI, Expr *Sub, 2893 SourceLocation RParenLoc) { 2894 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2895 } 2896 2897 /// Build a new C++ typeid(type) expression. 2898 /// 2899 /// By default, performs semantic analysis to build the new expression. 2900 /// Subclasses may override this routine to provide different behavior. 2901 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2902 SourceLocation TypeidLoc, 2903 TypeSourceInfo *Operand, 2904 SourceLocation RParenLoc) { 2905 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2906 RParenLoc); 2907 } 2908 2909 2910 /// Build a new C++ typeid(expr) expression. 2911 /// 2912 /// By default, performs semantic analysis to build the new expression. 2913 /// Subclasses may override this routine to provide different behavior. 2914 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2915 SourceLocation TypeidLoc, 2916 Expr *Operand, 2917 SourceLocation RParenLoc) { 2918 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2919 RParenLoc); 2920 } 2921 2922 /// Build a new C++ __uuidof(type) expression. 2923 /// 2924 /// By default, performs semantic analysis to build the new expression. 2925 /// Subclasses may override this routine to provide different behavior. 2926 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2927 TypeSourceInfo *Operand, 2928 SourceLocation RParenLoc) { 2929 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2930 } 2931 2932 /// Build a new C++ __uuidof(expr) expression. 2933 /// 2934 /// By default, performs semantic analysis to build the new expression. 2935 /// Subclasses may override this routine to provide different behavior. 2936 ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc, 2937 Expr *Operand, SourceLocation RParenLoc) { 2938 return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc); 2939 } 2940 2941 /// Build a new C++ "this" expression. 2942 /// 2943 /// By default, builds a new "this" expression without performing any 2944 /// semantic analysis. Subclasses may override this routine to provide 2945 /// different behavior. 2946 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2947 QualType ThisType, 2948 bool isImplicit) { 2949 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 2950 } 2951 2952 /// Build a new C++ throw expression. 2953 /// 2954 /// By default, performs semantic analysis to build the new expression. 2955 /// Subclasses may override this routine to provide different behavior. 2956 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2957 bool IsThrownVariableInScope) { 2958 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2959 } 2960 2961 /// Build a new C++ default-argument expression. 2962 /// 2963 /// By default, builds a new default-argument expression, which does not 2964 /// require any semantic analysis. Subclasses may override this routine to 2965 /// provide different behavior. 2966 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 2967 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 2968 getSema().CurContext); 2969 } 2970 2971 /// Build a new C++11 default-initialization expression. 2972 /// 2973 /// By default, builds a new default field initialization expression, which 2974 /// does not require any semantic analysis. Subclasses may override this 2975 /// routine to provide different behavior. 2976 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2977 FieldDecl *Field) { 2978 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 2979 getSema().CurContext); 2980 } 2981 2982 /// Build a new C++ zero-initialization expression. 2983 /// 2984 /// By default, performs semantic analysis to build the new expression. 2985 /// Subclasses may override this routine to provide different behavior. 2986 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2987 SourceLocation LParenLoc, 2988 SourceLocation RParenLoc) { 2989 return getSema().BuildCXXTypeConstructExpr( 2990 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2991 } 2992 2993 /// Build a new C++ "new" expression. 2994 /// 2995 /// By default, performs semantic analysis to build the new expression. 2996 /// Subclasses may override this routine to provide different behavior. 2997 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2998 bool UseGlobal, 2999 SourceLocation PlacementLParen, 3000 MultiExprArg PlacementArgs, 3001 SourceLocation PlacementRParen, 3002 SourceRange TypeIdParens, 3003 QualType AllocatedType, 3004 TypeSourceInfo *AllocatedTypeInfo, 3005 Optional<Expr *> ArraySize, 3006 SourceRange DirectInitRange, 3007 Expr *Initializer) { 3008 return getSema().BuildCXXNew(StartLoc, UseGlobal, 3009 PlacementLParen, 3010 PlacementArgs, 3011 PlacementRParen, 3012 TypeIdParens, 3013 AllocatedType, 3014 AllocatedTypeInfo, 3015 ArraySize, 3016 DirectInitRange, 3017 Initializer); 3018 } 3019 3020 /// Build a new C++ "delete" expression. 3021 /// 3022 /// By default, performs semantic analysis to build the new expression. 3023 /// Subclasses may override this routine to provide different behavior. 3024 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 3025 bool IsGlobalDelete, 3026 bool IsArrayForm, 3027 Expr *Operand) { 3028 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 3029 Operand); 3030 } 3031 3032 /// Build a new type trait expression. 3033 /// 3034 /// By default, performs semantic analysis to build the new expression. 3035 /// Subclasses may override this routine to provide different behavior. 3036 ExprResult RebuildTypeTrait(TypeTrait Trait, 3037 SourceLocation StartLoc, 3038 ArrayRef<TypeSourceInfo *> Args, 3039 SourceLocation RParenLoc) { 3040 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 3041 } 3042 3043 /// Build a new array type trait expression. 3044 /// 3045 /// By default, performs semantic analysis to build the new expression. 3046 /// Subclasses may override this routine to provide different behavior. 3047 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 3048 SourceLocation StartLoc, 3049 TypeSourceInfo *TSInfo, 3050 Expr *DimExpr, 3051 SourceLocation RParenLoc) { 3052 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 3053 } 3054 3055 /// Build a new expression trait expression. 3056 /// 3057 /// By default, performs semantic analysis to build the new expression. 3058 /// Subclasses may override this routine to provide different behavior. 3059 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 3060 SourceLocation StartLoc, 3061 Expr *Queried, 3062 SourceLocation RParenLoc) { 3063 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 3064 } 3065 3066 /// Build a new (previously unresolved) declaration reference 3067 /// expression. 3068 /// 3069 /// By default, performs semantic analysis to build the new expression. 3070 /// Subclasses may override this routine to provide different behavior. 3071 ExprResult RebuildDependentScopeDeclRefExpr( 3072 NestedNameSpecifierLoc QualifierLoc, 3073 SourceLocation TemplateKWLoc, 3074 const DeclarationNameInfo &NameInfo, 3075 const TemplateArgumentListInfo *TemplateArgs, 3076 bool IsAddressOfOperand, 3077 TypeSourceInfo **RecoveryTSI) { 3078 CXXScopeSpec SS; 3079 SS.Adopt(QualifierLoc); 3080 3081 if (TemplateArgs || TemplateKWLoc.isValid()) 3082 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 3083 TemplateArgs); 3084 3085 return getSema().BuildQualifiedDeclarationNameExpr( 3086 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3087 } 3088 3089 /// Build a new template-id expression. 3090 /// 3091 /// By default, performs semantic analysis to build the new expression. 3092 /// Subclasses may override this routine to provide different behavior. 3093 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3094 SourceLocation TemplateKWLoc, 3095 LookupResult &R, 3096 bool RequiresADL, 3097 const TemplateArgumentListInfo *TemplateArgs) { 3098 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3099 TemplateArgs); 3100 } 3101 3102 /// Build a new object-construction expression. 3103 /// 3104 /// By default, performs semantic analysis to build the new expression. 3105 /// Subclasses may override this routine to provide different behavior. 3106 ExprResult RebuildCXXConstructExpr(QualType T, 3107 SourceLocation Loc, 3108 CXXConstructorDecl *Constructor, 3109 bool IsElidable, 3110 MultiExprArg Args, 3111 bool HadMultipleCandidates, 3112 bool ListInitialization, 3113 bool StdInitListInitialization, 3114 bool RequiresZeroInit, 3115 CXXConstructExpr::ConstructionKind ConstructKind, 3116 SourceRange ParenRange) { 3117 // Reconstruct the constructor we originally found, which might be 3118 // different if this is a call to an inherited constructor. 3119 CXXConstructorDecl *FoundCtor = Constructor; 3120 if (Constructor->isInheritingConstructor()) 3121 FoundCtor = Constructor->getInheritedConstructor().getConstructor(); 3122 3123 SmallVector<Expr*, 8> ConvertedArgs; 3124 if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs)) 3125 return ExprError(); 3126 3127 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3128 IsElidable, 3129 ConvertedArgs, 3130 HadMultipleCandidates, 3131 ListInitialization, 3132 StdInitListInitialization, 3133 RequiresZeroInit, ConstructKind, 3134 ParenRange); 3135 } 3136 3137 /// Build a new implicit construction via inherited constructor 3138 /// expression. 3139 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3140 CXXConstructorDecl *Constructor, 3141 bool ConstructsVBase, 3142 bool InheritedFromVBase) { 3143 return new (getSema().Context) CXXInheritedCtorInitExpr( 3144 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3145 } 3146 3147 /// Build a new object-construction expression. 3148 /// 3149 /// By default, performs semantic analysis to build the new expression. 3150 /// Subclasses may override this routine to provide different behavior. 3151 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3152 SourceLocation LParenOrBraceLoc, 3153 MultiExprArg Args, 3154 SourceLocation RParenOrBraceLoc, 3155 bool ListInitialization) { 3156 return getSema().BuildCXXTypeConstructExpr( 3157 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3158 } 3159 3160 /// Build a new object-construction expression. 3161 /// 3162 /// By default, performs semantic analysis to build the new expression. 3163 /// Subclasses may override this routine to provide different behavior. 3164 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3165 SourceLocation LParenLoc, 3166 MultiExprArg Args, 3167 SourceLocation RParenLoc, 3168 bool ListInitialization) { 3169 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3170 RParenLoc, ListInitialization); 3171 } 3172 3173 /// Build a new member reference expression. 3174 /// 3175 /// By default, performs semantic analysis to build the new expression. 3176 /// Subclasses may override this routine to provide different behavior. 3177 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3178 QualType BaseType, 3179 bool IsArrow, 3180 SourceLocation OperatorLoc, 3181 NestedNameSpecifierLoc QualifierLoc, 3182 SourceLocation TemplateKWLoc, 3183 NamedDecl *FirstQualifierInScope, 3184 const DeclarationNameInfo &MemberNameInfo, 3185 const TemplateArgumentListInfo *TemplateArgs) { 3186 CXXScopeSpec SS; 3187 SS.Adopt(QualifierLoc); 3188 3189 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3190 OperatorLoc, IsArrow, 3191 SS, TemplateKWLoc, 3192 FirstQualifierInScope, 3193 MemberNameInfo, 3194 TemplateArgs, /*S*/nullptr); 3195 } 3196 3197 /// Build a new member reference expression. 3198 /// 3199 /// By default, performs semantic analysis to build the new expression. 3200 /// Subclasses may override this routine to provide different behavior. 3201 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3202 SourceLocation OperatorLoc, 3203 bool IsArrow, 3204 NestedNameSpecifierLoc QualifierLoc, 3205 SourceLocation TemplateKWLoc, 3206 NamedDecl *FirstQualifierInScope, 3207 LookupResult &R, 3208 const TemplateArgumentListInfo *TemplateArgs) { 3209 CXXScopeSpec SS; 3210 SS.Adopt(QualifierLoc); 3211 3212 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3213 OperatorLoc, IsArrow, 3214 SS, TemplateKWLoc, 3215 FirstQualifierInScope, 3216 R, TemplateArgs, /*S*/nullptr); 3217 } 3218 3219 /// Build a new noexcept expression. 3220 /// 3221 /// By default, performs semantic analysis to build the new expression. 3222 /// Subclasses may override this routine to provide different behavior. 3223 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3224 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3225 } 3226 3227 /// Build a new expression to compute the length of a parameter pack. 3228 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3229 NamedDecl *Pack, 3230 SourceLocation PackLoc, 3231 SourceLocation RParenLoc, 3232 Optional<unsigned> Length, 3233 ArrayRef<TemplateArgument> PartialArgs) { 3234 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3235 RParenLoc, Length, PartialArgs); 3236 } 3237 3238 /// Build a new expression representing a call to a source location 3239 /// builtin. 3240 /// 3241 /// By default, performs semantic analysis to build the new expression. 3242 /// Subclasses may override this routine to provide different behavior. 3243 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3244 SourceLocation BuiltinLoc, 3245 SourceLocation RPLoc, 3246 DeclContext *ParentContext) { 3247 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3248 } 3249 3250 /// Build a new Objective-C boxed expression. 3251 /// 3252 /// By default, performs semantic analysis to build the new expression. 3253 /// Subclasses may override this routine to provide different behavior. 3254 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3255 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3256 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3257 TemplateArgumentListInfo *TALI) { 3258 CXXScopeSpec SS; 3259 SS.Adopt(NNS); 3260 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3261 ConceptNameInfo, 3262 FoundDecl, 3263 NamedConcept, TALI); 3264 if (Result.isInvalid()) 3265 return ExprError(); 3266 return Result; 3267 } 3268 3269 /// \brief Build a new requires expression. 3270 /// 3271 /// By default, performs semantic analysis to build the new expression. 3272 /// Subclasses may override this routine to provide different behavior. 3273 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3274 RequiresExprBodyDecl *Body, 3275 ArrayRef<ParmVarDecl *> LocalParameters, 3276 ArrayRef<concepts::Requirement *> Requirements, 3277 SourceLocation ClosingBraceLoc) { 3278 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3279 LocalParameters, Requirements, ClosingBraceLoc); 3280 } 3281 3282 concepts::TypeRequirement * 3283 RebuildTypeRequirement( 3284 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3285 return SemaRef.BuildTypeRequirement(SubstDiag); 3286 } 3287 3288 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3289 return SemaRef.BuildTypeRequirement(T); 3290 } 3291 3292 concepts::ExprRequirement * 3293 RebuildExprRequirement( 3294 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3295 SourceLocation NoexceptLoc, 3296 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3297 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3298 std::move(Ret)); 3299 } 3300 3301 concepts::ExprRequirement * 3302 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3303 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3304 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3305 std::move(Ret)); 3306 } 3307 3308 concepts::NestedRequirement * 3309 RebuildNestedRequirement( 3310 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3311 return SemaRef.BuildNestedRequirement(SubstDiag); 3312 } 3313 3314 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3315 return SemaRef.BuildNestedRequirement(Constraint); 3316 } 3317 3318 /// \brief Build a new Objective-C boxed 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 RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3323 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3324 } 3325 3326 /// Build a new Objective-C array literal. 3327 /// 3328 /// By default, performs semantic analysis to build the new expression. 3329 /// Subclasses may override this routine to provide different behavior. 3330 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3331 Expr **Elements, unsigned NumElements) { 3332 return getSema().BuildObjCArrayLiteral(Range, 3333 MultiExprArg(Elements, NumElements)); 3334 } 3335 3336 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3337 Expr *Base, Expr *Key, 3338 ObjCMethodDecl *getterMethod, 3339 ObjCMethodDecl *setterMethod) { 3340 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3341 getterMethod, setterMethod); 3342 } 3343 3344 /// Build a new Objective-C dictionary literal. 3345 /// 3346 /// By default, performs semantic analysis to build the new expression. 3347 /// Subclasses may override this routine to provide different behavior. 3348 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3349 MutableArrayRef<ObjCDictionaryElement> Elements) { 3350 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3351 } 3352 3353 /// Build a new Objective-C \@encode expression. 3354 /// 3355 /// By default, performs semantic analysis to build the new expression. 3356 /// Subclasses may override this routine to provide different behavior. 3357 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3358 TypeSourceInfo *EncodeTypeInfo, 3359 SourceLocation RParenLoc) { 3360 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3361 } 3362 3363 /// Build a new Objective-C class message. 3364 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3365 Selector Sel, 3366 ArrayRef<SourceLocation> SelectorLocs, 3367 ObjCMethodDecl *Method, 3368 SourceLocation LBracLoc, 3369 MultiExprArg Args, 3370 SourceLocation RBracLoc) { 3371 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3372 ReceiverTypeInfo->getType(), 3373 /*SuperLoc=*/SourceLocation(), 3374 Sel, Method, LBracLoc, SelectorLocs, 3375 RBracLoc, Args); 3376 } 3377 3378 /// Build a new Objective-C instance message. 3379 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3380 Selector Sel, 3381 ArrayRef<SourceLocation> SelectorLocs, 3382 ObjCMethodDecl *Method, 3383 SourceLocation LBracLoc, 3384 MultiExprArg Args, 3385 SourceLocation RBracLoc) { 3386 return SemaRef.BuildInstanceMessage(Receiver, 3387 Receiver->getType(), 3388 /*SuperLoc=*/SourceLocation(), 3389 Sel, Method, LBracLoc, SelectorLocs, 3390 RBracLoc, Args); 3391 } 3392 3393 /// Build a new Objective-C instance/class message to 'super'. 3394 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3395 Selector Sel, 3396 ArrayRef<SourceLocation> SelectorLocs, 3397 QualType SuperType, 3398 ObjCMethodDecl *Method, 3399 SourceLocation LBracLoc, 3400 MultiExprArg Args, 3401 SourceLocation RBracLoc) { 3402 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3403 SuperType, 3404 SuperLoc, 3405 Sel, Method, LBracLoc, SelectorLocs, 3406 RBracLoc, Args) 3407 : SemaRef.BuildClassMessage(nullptr, 3408 SuperType, 3409 SuperLoc, 3410 Sel, Method, LBracLoc, SelectorLocs, 3411 RBracLoc, Args); 3412 3413 3414 } 3415 3416 /// Build a new Objective-C ivar reference expression. 3417 /// 3418 /// By default, performs semantic analysis to build the new expression. 3419 /// Subclasses may override this routine to provide different behavior. 3420 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3421 SourceLocation IvarLoc, 3422 bool IsArrow, bool IsFreeIvar) { 3423 CXXScopeSpec SS; 3424 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3425 ExprResult Result = getSema().BuildMemberReferenceExpr( 3426 BaseArg, BaseArg->getType(), 3427 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3428 /*FirstQualifierInScope=*/nullptr, NameInfo, 3429 /*TemplateArgs=*/nullptr, 3430 /*S=*/nullptr); 3431 if (IsFreeIvar && Result.isUsable()) 3432 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3433 return Result; 3434 } 3435 3436 /// Build a new Objective-C property reference expression. 3437 /// 3438 /// By default, performs semantic analysis to build the new expression. 3439 /// Subclasses may override this routine to provide different behavior. 3440 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3441 ObjCPropertyDecl *Property, 3442 SourceLocation PropertyLoc) { 3443 CXXScopeSpec SS; 3444 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3445 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3446 /*FIXME:*/PropertyLoc, 3447 /*IsArrow=*/false, 3448 SS, SourceLocation(), 3449 /*FirstQualifierInScope=*/nullptr, 3450 NameInfo, 3451 /*TemplateArgs=*/nullptr, 3452 /*S=*/nullptr); 3453 } 3454 3455 /// Build a new Objective-C property reference expression. 3456 /// 3457 /// By default, performs semantic analysis to build the new expression. 3458 /// Subclasses may override this routine to provide different behavior. 3459 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3460 ObjCMethodDecl *Getter, 3461 ObjCMethodDecl *Setter, 3462 SourceLocation PropertyLoc) { 3463 // Since these expressions can only be value-dependent, we do not 3464 // need to perform semantic analysis again. 3465 return Owned( 3466 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3467 VK_LValue, OK_ObjCProperty, 3468 PropertyLoc, Base)); 3469 } 3470 3471 /// Build a new Objective-C "isa" expression. 3472 /// 3473 /// By default, performs semantic analysis to build the new expression. 3474 /// Subclasses may override this routine to provide different behavior. 3475 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3476 SourceLocation OpLoc, bool IsArrow) { 3477 CXXScopeSpec SS; 3478 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3479 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3480 OpLoc, IsArrow, 3481 SS, SourceLocation(), 3482 /*FirstQualifierInScope=*/nullptr, 3483 NameInfo, 3484 /*TemplateArgs=*/nullptr, 3485 /*S=*/nullptr); 3486 } 3487 3488 /// Build a new shuffle vector expression. 3489 /// 3490 /// By default, performs semantic analysis to build the new expression. 3491 /// Subclasses may override this routine to provide different behavior. 3492 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3493 MultiExprArg SubExprs, 3494 SourceLocation RParenLoc) { 3495 // Find the declaration for __builtin_shufflevector 3496 const IdentifierInfo &Name 3497 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3498 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3499 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3500 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3501 3502 // Build a reference to the __builtin_shufflevector builtin 3503 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3504 Expr *Callee = new (SemaRef.Context) 3505 DeclRefExpr(SemaRef.Context, Builtin, false, 3506 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3507 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3508 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3509 CK_BuiltinFnToFnPtr).get(); 3510 3511 // Build the CallExpr 3512 ExprResult TheCall = CallExpr::Create( 3513 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3514 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc, 3515 FPOptionsOverride()); 3516 3517 // Type-check the __builtin_shufflevector expression. 3518 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3519 } 3520 3521 /// Build a new convert vector expression. 3522 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3523 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3524 SourceLocation RParenLoc) { 3525 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3526 BuiltinLoc, RParenLoc); 3527 } 3528 3529 /// Build a new template argument pack expansion. 3530 /// 3531 /// By default, performs semantic analysis to build a new pack expansion 3532 /// for a template argument. Subclasses may override this routine to provide 3533 /// different behavior. 3534 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3535 SourceLocation EllipsisLoc, 3536 Optional<unsigned> NumExpansions) { 3537 switch (Pattern.getArgument().getKind()) { 3538 case TemplateArgument::Expression: { 3539 ExprResult Result 3540 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3541 EllipsisLoc, NumExpansions); 3542 if (Result.isInvalid()) 3543 return TemplateArgumentLoc(); 3544 3545 return TemplateArgumentLoc(Result.get(), Result.get()); 3546 } 3547 3548 case TemplateArgument::Template: 3549 return TemplateArgumentLoc( 3550 SemaRef.Context, 3551 TemplateArgument(Pattern.getArgument().getAsTemplate(), 3552 NumExpansions), 3553 Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(), 3554 EllipsisLoc); 3555 3556 case TemplateArgument::Null: 3557 case TemplateArgument::Integral: 3558 case TemplateArgument::Declaration: 3559 case TemplateArgument::Pack: 3560 case TemplateArgument::TemplateExpansion: 3561 case TemplateArgument::NullPtr: 3562 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3563 3564 case TemplateArgument::Type: 3565 if (TypeSourceInfo *Expansion 3566 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3567 EllipsisLoc, 3568 NumExpansions)) 3569 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3570 Expansion); 3571 break; 3572 } 3573 3574 return TemplateArgumentLoc(); 3575 } 3576 3577 /// Build a new expression pack expansion. 3578 /// 3579 /// By default, performs semantic analysis to build a new pack expansion 3580 /// for an expression. Subclasses may override this routine to provide 3581 /// different behavior. 3582 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3583 Optional<unsigned> NumExpansions) { 3584 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3585 } 3586 3587 /// Build a new C++1z fold-expression. 3588 /// 3589 /// By default, performs semantic analysis in order to build a new fold 3590 /// expression. 3591 ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE, 3592 SourceLocation LParenLoc, Expr *LHS, 3593 BinaryOperatorKind Operator, 3594 SourceLocation EllipsisLoc, Expr *RHS, 3595 SourceLocation RParenLoc, 3596 Optional<unsigned> NumExpansions) { 3597 return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator, 3598 EllipsisLoc, RHS, RParenLoc, 3599 NumExpansions); 3600 } 3601 3602 /// Build an empty C++1z fold-expression with the given operator. 3603 /// 3604 /// By default, produces the fallback value for the fold-expression, or 3605 /// produce an error if there is no fallback value. 3606 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3607 BinaryOperatorKind Operator) { 3608 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3609 } 3610 3611 /// Build a new atomic operation expression. 3612 /// 3613 /// By default, performs semantic analysis to build the new expression. 3614 /// Subclasses may override this routine to provide different behavior. 3615 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3616 AtomicExpr::AtomicOp Op, 3617 SourceLocation RParenLoc) { 3618 // Use this for all of the locations, since we don't know the difference 3619 // between the call and the expr at this point. 3620 SourceRange Range{BuiltinLoc, RParenLoc}; 3621 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3622 Sema::AtomicArgumentOrder::AST); 3623 } 3624 3625 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3626 ArrayRef<Expr *> SubExprs, QualType Type) { 3627 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type); 3628 } 3629 3630 private: 3631 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3632 QualType ObjectType, 3633 NamedDecl *FirstQualifierInScope, 3634 CXXScopeSpec &SS); 3635 3636 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3637 QualType ObjectType, 3638 NamedDecl *FirstQualifierInScope, 3639 CXXScopeSpec &SS); 3640 3641 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3642 NamedDecl *FirstQualifierInScope, 3643 CXXScopeSpec &SS); 3644 3645 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3646 DependentNameTypeLoc TL, 3647 bool DeducibleTSTContext); 3648 }; 3649 3650 template <typename Derived> 3651 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3652 if (!S) 3653 return S; 3654 3655 switch (S->getStmtClass()) { 3656 case Stmt::NoStmtClass: break; 3657 3658 // Transform individual statement nodes 3659 // Pass SDK into statements that can produce a value 3660 #define STMT(Node, Parent) \ 3661 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3662 #define VALUESTMT(Node, Parent) \ 3663 case Stmt::Node##Class: \ 3664 return getDerived().Transform##Node(cast<Node>(S), SDK); 3665 #define ABSTRACT_STMT(Node) 3666 #define EXPR(Node, Parent) 3667 #include "clang/AST/StmtNodes.inc" 3668 3669 // Transform expressions by calling TransformExpr. 3670 #define STMT(Node, Parent) 3671 #define ABSTRACT_STMT(Stmt) 3672 #define EXPR(Node, Parent) case Stmt::Node##Class: 3673 #include "clang/AST/StmtNodes.inc" 3674 { 3675 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3676 3677 if (SDK == SDK_StmtExprResult) 3678 E = getSema().ActOnStmtExprResult(E); 3679 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3680 } 3681 } 3682 3683 return S; 3684 } 3685 3686 template<typename Derived> 3687 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3688 if (!S) 3689 return S; 3690 3691 switch (S->getClauseKind()) { 3692 default: break; 3693 // Transform individual clause nodes 3694 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 3695 case Enum: \ 3696 return getDerived().Transform ## Class(cast<Class>(S)); 3697 #include "llvm/Frontend/OpenMP/OMPKinds.def" 3698 } 3699 3700 return S; 3701 } 3702 3703 3704 template<typename Derived> 3705 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3706 if (!E) 3707 return E; 3708 3709 switch (E->getStmtClass()) { 3710 case Stmt::NoStmtClass: break; 3711 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3712 #define ABSTRACT_STMT(Stmt) 3713 #define EXPR(Node, Parent) \ 3714 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3715 #include "clang/AST/StmtNodes.inc" 3716 } 3717 3718 return E; 3719 } 3720 3721 template<typename Derived> 3722 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3723 bool NotCopyInit) { 3724 // Initializers are instantiated like expressions, except that various outer 3725 // layers are stripped. 3726 if (!Init) 3727 return Init; 3728 3729 if (auto *FE = dyn_cast<FullExpr>(Init)) 3730 Init = FE->getSubExpr(); 3731 3732 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3733 Init = AIL->getCommonExpr(); 3734 3735 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3736 Init = MTE->getSubExpr(); 3737 3738 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3739 Init = Binder->getSubExpr(); 3740 3741 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3742 Init = ICE->getSubExprAsWritten(); 3743 3744 if (CXXStdInitializerListExpr *ILE = 3745 dyn_cast<CXXStdInitializerListExpr>(Init)) 3746 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3747 3748 // If this is copy-initialization, we only need to reconstruct 3749 // InitListExprs. Other forms of copy-initialization will be a no-op if 3750 // the initializer is already the right type. 3751 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3752 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3753 return getDerived().TransformExpr(Init); 3754 3755 // Revert value-initialization back to empty parens. 3756 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3757 SourceRange Parens = VIE->getSourceRange(); 3758 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3759 Parens.getEnd()); 3760 } 3761 3762 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3763 if (isa<ImplicitValueInitExpr>(Init)) 3764 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3765 SourceLocation()); 3766 3767 // Revert initialization by constructor back to a parenthesized or braced list 3768 // of expressions. Any other form of initializer can just be reused directly. 3769 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3770 return getDerived().TransformExpr(Init); 3771 3772 // If the initialization implicitly converted an initializer list to a 3773 // std::initializer_list object, unwrap the std::initializer_list too. 3774 if (Construct && Construct->isStdInitListInitialization()) 3775 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3776 3777 // Enter a list-init context if this was list initialization. 3778 EnterExpressionEvaluationContext Context( 3779 getSema(), EnterExpressionEvaluationContext::InitList, 3780 Construct->isListInitialization()); 3781 3782 SmallVector<Expr*, 8> NewArgs; 3783 bool ArgChanged = false; 3784 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3785 /*IsCall*/true, NewArgs, &ArgChanged)) 3786 return ExprError(); 3787 3788 // If this was list initialization, revert to syntactic list form. 3789 if (Construct->isListInitialization()) 3790 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3791 Construct->getEndLoc()); 3792 3793 // Build a ParenListExpr to represent anything else. 3794 SourceRange Parens = Construct->getParenOrBraceRange(); 3795 if (Parens.isInvalid()) { 3796 // This was a variable declaration's initialization for which no initializer 3797 // was specified. 3798 assert(NewArgs.empty() && 3799 "no parens or braces but have direct init with arguments?"); 3800 return ExprEmpty(); 3801 } 3802 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3803 Parens.getEnd()); 3804 } 3805 3806 template<typename Derived> 3807 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3808 unsigned NumInputs, 3809 bool IsCall, 3810 SmallVectorImpl<Expr *> &Outputs, 3811 bool *ArgChanged) { 3812 for (unsigned I = 0; I != NumInputs; ++I) { 3813 // If requested, drop call arguments that need to be dropped. 3814 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3815 if (ArgChanged) 3816 *ArgChanged = true; 3817 3818 break; 3819 } 3820 3821 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3822 Expr *Pattern = Expansion->getPattern(); 3823 3824 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3825 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3826 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3827 3828 // Determine whether the set of unexpanded parameter packs can and should 3829 // be expanded. 3830 bool Expand = true; 3831 bool RetainExpansion = false; 3832 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3833 Optional<unsigned> NumExpansions = OrigNumExpansions; 3834 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3835 Pattern->getSourceRange(), 3836 Unexpanded, 3837 Expand, RetainExpansion, 3838 NumExpansions)) 3839 return true; 3840 3841 if (!Expand) { 3842 // The transform has determined that we should perform a simple 3843 // transformation on the pack expansion, producing another pack 3844 // expansion. 3845 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3846 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3847 if (OutPattern.isInvalid()) 3848 return true; 3849 3850 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3851 Expansion->getEllipsisLoc(), 3852 NumExpansions); 3853 if (Out.isInvalid()) 3854 return true; 3855 3856 if (ArgChanged) 3857 *ArgChanged = true; 3858 Outputs.push_back(Out.get()); 3859 continue; 3860 } 3861 3862 // Record right away that the argument was changed. This needs 3863 // to happen even if the array expands to nothing. 3864 if (ArgChanged) *ArgChanged = true; 3865 3866 // The transform has determined that we should perform an elementwise 3867 // expansion of the pattern. Do so. 3868 for (unsigned I = 0; I != *NumExpansions; ++I) { 3869 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3870 ExprResult Out = getDerived().TransformExpr(Pattern); 3871 if (Out.isInvalid()) 3872 return true; 3873 3874 if (Out.get()->containsUnexpandedParameterPack()) { 3875 Out = getDerived().RebuildPackExpansion( 3876 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3877 if (Out.isInvalid()) 3878 return true; 3879 } 3880 3881 Outputs.push_back(Out.get()); 3882 } 3883 3884 // If we're supposed to retain a pack expansion, do so by temporarily 3885 // forgetting the partially-substituted parameter pack. 3886 if (RetainExpansion) { 3887 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3888 3889 ExprResult Out = getDerived().TransformExpr(Pattern); 3890 if (Out.isInvalid()) 3891 return true; 3892 3893 Out = getDerived().RebuildPackExpansion( 3894 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3895 if (Out.isInvalid()) 3896 return true; 3897 3898 Outputs.push_back(Out.get()); 3899 } 3900 3901 continue; 3902 } 3903 3904 ExprResult Result = 3905 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3906 : getDerived().TransformExpr(Inputs[I]); 3907 if (Result.isInvalid()) 3908 return true; 3909 3910 if (Result.get() != Inputs[I] && ArgChanged) 3911 *ArgChanged = true; 3912 3913 Outputs.push_back(Result.get()); 3914 } 3915 3916 return false; 3917 } 3918 3919 template <typename Derived> 3920 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3921 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3922 if (Var) { 3923 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3924 getDerived().TransformDefinition(Var->getLocation(), Var)); 3925 3926 if (!ConditionVar) 3927 return Sema::ConditionError(); 3928 3929 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3930 } 3931 3932 if (Expr) { 3933 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3934 3935 if (CondExpr.isInvalid()) 3936 return Sema::ConditionError(); 3937 3938 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3939 } 3940 3941 return Sema::ConditionResult(); 3942 } 3943 3944 template<typename Derived> 3945 NestedNameSpecifierLoc 3946 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3947 NestedNameSpecifierLoc NNS, 3948 QualType ObjectType, 3949 NamedDecl *FirstQualifierInScope) { 3950 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3951 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3952 Qualifier = Qualifier.getPrefix()) 3953 Qualifiers.push_back(Qualifier); 3954 3955 CXXScopeSpec SS; 3956 while (!Qualifiers.empty()) { 3957 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3958 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3959 3960 switch (QNNS->getKind()) { 3961 case NestedNameSpecifier::Identifier: { 3962 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3963 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3964 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3965 SS, FirstQualifierInScope, false)) 3966 return NestedNameSpecifierLoc(); 3967 } 3968 break; 3969 3970 case NestedNameSpecifier::Namespace: { 3971 NamespaceDecl *NS 3972 = cast_or_null<NamespaceDecl>( 3973 getDerived().TransformDecl( 3974 Q.getLocalBeginLoc(), 3975 QNNS->getAsNamespace())); 3976 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3977 break; 3978 } 3979 3980 case NestedNameSpecifier::NamespaceAlias: { 3981 NamespaceAliasDecl *Alias 3982 = cast_or_null<NamespaceAliasDecl>( 3983 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3984 QNNS->getAsNamespaceAlias())); 3985 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3986 Q.getLocalEndLoc()); 3987 break; 3988 } 3989 3990 case NestedNameSpecifier::Global: 3991 // There is no meaningful transformation that one could perform on the 3992 // global scope. 3993 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3994 break; 3995 3996 case NestedNameSpecifier::Super: { 3997 CXXRecordDecl *RD = 3998 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3999 SourceLocation(), QNNS->getAsRecordDecl())); 4000 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 4001 break; 4002 } 4003 4004 case NestedNameSpecifier::TypeSpecWithTemplate: 4005 case NestedNameSpecifier::TypeSpec: { 4006 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 4007 FirstQualifierInScope, SS); 4008 4009 if (!TL) 4010 return NestedNameSpecifierLoc(); 4011 4012 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 4013 (SemaRef.getLangOpts().CPlusPlus11 && 4014 TL.getType()->isEnumeralType())) { 4015 assert(!TL.getType().hasLocalQualifiers() && 4016 "Can't get cv-qualifiers here"); 4017 if (TL.getType()->isEnumeralType()) 4018 SemaRef.Diag(TL.getBeginLoc(), 4019 diag::warn_cxx98_compat_enum_nested_name_spec); 4020 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 4021 Q.getLocalEndLoc()); 4022 break; 4023 } 4024 // If the nested-name-specifier is an invalid type def, don't emit an 4025 // error because a previous error should have already been emitted. 4026 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 4027 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 4028 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 4029 << TL.getType() << SS.getRange(); 4030 } 4031 return NestedNameSpecifierLoc(); 4032 } 4033 } 4034 4035 // The qualifier-in-scope and object type only apply to the leftmost entity. 4036 FirstQualifierInScope = nullptr; 4037 ObjectType = QualType(); 4038 } 4039 4040 // Don't rebuild the nested-name-specifier if we don't have to. 4041 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 4042 !getDerived().AlwaysRebuild()) 4043 return NNS; 4044 4045 // If we can re-use the source-location data from the original 4046 // nested-name-specifier, do so. 4047 if (SS.location_size() == NNS.getDataLength() && 4048 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 4049 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 4050 4051 // Allocate new nested-name-specifier location information. 4052 return SS.getWithLocInContext(SemaRef.Context); 4053 } 4054 4055 template<typename Derived> 4056 DeclarationNameInfo 4057 TreeTransform<Derived> 4058 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 4059 DeclarationName Name = NameInfo.getName(); 4060 if (!Name) 4061 return DeclarationNameInfo(); 4062 4063 switch (Name.getNameKind()) { 4064 case DeclarationName::Identifier: 4065 case DeclarationName::ObjCZeroArgSelector: 4066 case DeclarationName::ObjCOneArgSelector: 4067 case DeclarationName::ObjCMultiArgSelector: 4068 case DeclarationName::CXXOperatorName: 4069 case DeclarationName::CXXLiteralOperatorName: 4070 case DeclarationName::CXXUsingDirective: 4071 return NameInfo; 4072 4073 case DeclarationName::CXXDeductionGuideName: { 4074 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 4075 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 4076 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 4077 if (!NewTemplate) 4078 return DeclarationNameInfo(); 4079 4080 DeclarationNameInfo NewNameInfo(NameInfo); 4081 NewNameInfo.setName( 4082 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 4083 return NewNameInfo; 4084 } 4085 4086 case DeclarationName::CXXConstructorName: 4087 case DeclarationName::CXXDestructorName: 4088 case DeclarationName::CXXConversionFunctionName: { 4089 TypeSourceInfo *NewTInfo; 4090 CanQualType NewCanTy; 4091 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 4092 NewTInfo = getDerived().TransformType(OldTInfo); 4093 if (!NewTInfo) 4094 return DeclarationNameInfo(); 4095 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4096 } 4097 else { 4098 NewTInfo = nullptr; 4099 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4100 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4101 if (NewT.isNull()) 4102 return DeclarationNameInfo(); 4103 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4104 } 4105 4106 DeclarationName NewName 4107 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4108 NewCanTy); 4109 DeclarationNameInfo NewNameInfo(NameInfo); 4110 NewNameInfo.setName(NewName); 4111 NewNameInfo.setNamedTypeInfo(NewTInfo); 4112 return NewNameInfo; 4113 } 4114 } 4115 4116 llvm_unreachable("Unknown name kind."); 4117 } 4118 4119 template<typename Derived> 4120 TemplateName 4121 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4122 TemplateName Name, 4123 SourceLocation NameLoc, 4124 QualType ObjectType, 4125 NamedDecl *FirstQualifierInScope, 4126 bool AllowInjectedClassName) { 4127 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4128 TemplateDecl *Template = QTN->getTemplateDecl(); 4129 assert(Template && "qualified template name must refer to a template"); 4130 4131 TemplateDecl *TransTemplate 4132 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4133 Template)); 4134 if (!TransTemplate) 4135 return TemplateName(); 4136 4137 if (!getDerived().AlwaysRebuild() && 4138 SS.getScopeRep() == QTN->getQualifier() && 4139 TransTemplate == Template) 4140 return Name; 4141 4142 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4143 TransTemplate); 4144 } 4145 4146 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4147 if (SS.getScopeRep()) { 4148 // These apply to the scope specifier, not the template. 4149 ObjectType = QualType(); 4150 FirstQualifierInScope = nullptr; 4151 } 4152 4153 if (!getDerived().AlwaysRebuild() && 4154 SS.getScopeRep() == DTN->getQualifier() && 4155 ObjectType.isNull()) 4156 return Name; 4157 4158 // FIXME: Preserve the location of the "template" keyword. 4159 SourceLocation TemplateKWLoc = NameLoc; 4160 4161 if (DTN->isIdentifier()) { 4162 return getDerived().RebuildTemplateName(SS, 4163 TemplateKWLoc, 4164 *DTN->getIdentifier(), 4165 NameLoc, 4166 ObjectType, 4167 FirstQualifierInScope, 4168 AllowInjectedClassName); 4169 } 4170 4171 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4172 DTN->getOperator(), NameLoc, 4173 ObjectType, AllowInjectedClassName); 4174 } 4175 4176 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4177 TemplateDecl *TransTemplate 4178 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4179 Template)); 4180 if (!TransTemplate) 4181 return TemplateName(); 4182 4183 if (!getDerived().AlwaysRebuild() && 4184 TransTemplate == Template) 4185 return Name; 4186 4187 return TemplateName(TransTemplate); 4188 } 4189 4190 if (SubstTemplateTemplateParmPackStorage *SubstPack 4191 = Name.getAsSubstTemplateTemplateParmPack()) { 4192 TemplateTemplateParmDecl *TransParam 4193 = cast_or_null<TemplateTemplateParmDecl>( 4194 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4195 if (!TransParam) 4196 return TemplateName(); 4197 4198 if (!getDerived().AlwaysRebuild() && 4199 TransParam == SubstPack->getParameterPack()) 4200 return Name; 4201 4202 return getDerived().RebuildTemplateName(TransParam, 4203 SubstPack->getArgumentPack()); 4204 } 4205 4206 // These should be getting filtered out before they reach the AST. 4207 llvm_unreachable("overloaded function decl survived to here"); 4208 } 4209 4210 template<typename Derived> 4211 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4212 const TemplateArgument &Arg, 4213 TemplateArgumentLoc &Output) { 4214 Output = getSema().getTrivialTemplateArgumentLoc( 4215 Arg, QualType(), getDerived().getBaseLocation()); 4216 } 4217 4218 template<typename Derived> 4219 bool TreeTransform<Derived>::TransformTemplateArgument( 4220 const TemplateArgumentLoc &Input, 4221 TemplateArgumentLoc &Output, bool Uneval) { 4222 const TemplateArgument &Arg = Input.getArgument(); 4223 switch (Arg.getKind()) { 4224 case TemplateArgument::Null: 4225 case TemplateArgument::Pack: 4226 llvm_unreachable("Unexpected TemplateArgument"); 4227 4228 case TemplateArgument::Integral: 4229 case TemplateArgument::NullPtr: 4230 case TemplateArgument::Declaration: { 4231 // Transform a resolved template argument straight to a resolved template 4232 // argument. We get here when substituting into an already-substituted 4233 // template type argument during concept satisfaction checking. 4234 QualType T = Arg.getNonTypeTemplateArgumentType(); 4235 QualType NewT = getDerived().TransformType(T); 4236 if (NewT.isNull()) 4237 return true; 4238 4239 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4240 ? Arg.getAsDecl() 4241 : nullptr; 4242 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4243 getDerived().getBaseLocation(), D)) 4244 : nullptr; 4245 if (D && !NewD) 4246 return true; 4247 4248 if (NewT == T && D == NewD) 4249 Output = Input; 4250 else if (Arg.getKind() == TemplateArgument::Integral) 4251 Output = TemplateArgumentLoc( 4252 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4253 TemplateArgumentLocInfo()); 4254 else if (Arg.getKind() == TemplateArgument::NullPtr) 4255 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4256 TemplateArgumentLocInfo()); 4257 else 4258 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4259 TemplateArgumentLocInfo()); 4260 4261 return false; 4262 } 4263 4264 case TemplateArgument::Type: { 4265 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4266 if (!DI) 4267 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4268 4269 DI = getDerived().TransformType(DI); 4270 if (!DI) return true; 4271 4272 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4273 return false; 4274 } 4275 4276 case TemplateArgument::Template: { 4277 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4278 if (QualifierLoc) { 4279 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4280 if (!QualifierLoc) 4281 return true; 4282 } 4283 4284 CXXScopeSpec SS; 4285 SS.Adopt(QualifierLoc); 4286 TemplateName Template 4287 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4288 Input.getTemplateNameLoc()); 4289 if (Template.isNull()) 4290 return true; 4291 4292 Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template), 4293 QualifierLoc, Input.getTemplateNameLoc()); 4294 return false; 4295 } 4296 4297 case TemplateArgument::TemplateExpansion: 4298 llvm_unreachable("Caller should expand pack expansions"); 4299 4300 case TemplateArgument::Expression: { 4301 // Template argument expressions are constant expressions. 4302 EnterExpressionEvaluationContext Unevaluated( 4303 getSema(), 4304 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4305 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4306 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4307 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4308 4309 Expr *InputExpr = Input.getSourceExpression(); 4310 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4311 4312 ExprResult E = getDerived().TransformExpr(InputExpr); 4313 E = SemaRef.ActOnConstantExpression(E); 4314 if (E.isInvalid()) return true; 4315 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4316 return false; 4317 } 4318 } 4319 4320 // Work around bogus GCC warning 4321 return true; 4322 } 4323 4324 /// Iterator adaptor that invents template argument location information 4325 /// for each of the template arguments in its underlying iterator. 4326 template<typename Derived, typename InputIterator> 4327 class TemplateArgumentLocInventIterator { 4328 TreeTransform<Derived> &Self; 4329 InputIterator Iter; 4330 4331 public: 4332 typedef TemplateArgumentLoc value_type; 4333 typedef TemplateArgumentLoc reference; 4334 typedef typename std::iterator_traits<InputIterator>::difference_type 4335 difference_type; 4336 typedef std::input_iterator_tag iterator_category; 4337 4338 class pointer { 4339 TemplateArgumentLoc Arg; 4340 4341 public: 4342 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4343 4344 const TemplateArgumentLoc *operator->() const { return &Arg; } 4345 }; 4346 4347 TemplateArgumentLocInventIterator() { } 4348 4349 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4350 InputIterator Iter) 4351 : Self(Self), Iter(Iter) { } 4352 4353 TemplateArgumentLocInventIterator &operator++() { 4354 ++Iter; 4355 return *this; 4356 } 4357 4358 TemplateArgumentLocInventIterator operator++(int) { 4359 TemplateArgumentLocInventIterator Old(*this); 4360 ++(*this); 4361 return Old; 4362 } 4363 4364 reference operator*() const { 4365 TemplateArgumentLoc Result; 4366 Self.InventTemplateArgumentLoc(*Iter, Result); 4367 return Result; 4368 } 4369 4370 pointer operator->() const { return pointer(**this); } 4371 4372 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4373 const TemplateArgumentLocInventIterator &Y) { 4374 return X.Iter == Y.Iter; 4375 } 4376 4377 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4378 const TemplateArgumentLocInventIterator &Y) { 4379 return X.Iter != Y.Iter; 4380 } 4381 }; 4382 4383 template<typename Derived> 4384 template<typename InputIterator> 4385 bool TreeTransform<Derived>::TransformTemplateArguments( 4386 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4387 bool Uneval) { 4388 for (; First != Last; ++First) { 4389 TemplateArgumentLoc Out; 4390 TemplateArgumentLoc In = *First; 4391 4392 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4393 // Unpack argument packs, which we translate them into separate 4394 // arguments. 4395 // FIXME: We could do much better if we could guarantee that the 4396 // TemplateArgumentLocInfo for the pack expansion would be usable for 4397 // all of the template arguments in the argument pack. 4398 typedef TemplateArgumentLocInventIterator<Derived, 4399 TemplateArgument::pack_iterator> 4400 PackLocIterator; 4401 if (TransformTemplateArguments(PackLocIterator(*this, 4402 In.getArgument().pack_begin()), 4403 PackLocIterator(*this, 4404 In.getArgument().pack_end()), 4405 Outputs, Uneval)) 4406 return true; 4407 4408 continue; 4409 } 4410 4411 if (In.getArgument().isPackExpansion()) { 4412 // We have a pack expansion, for which we will be substituting into 4413 // the pattern. 4414 SourceLocation Ellipsis; 4415 Optional<unsigned> OrigNumExpansions; 4416 TemplateArgumentLoc Pattern 4417 = getSema().getTemplateArgumentPackExpansionPattern( 4418 In, Ellipsis, OrigNumExpansions); 4419 4420 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4421 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4422 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4423 4424 // Determine whether the set of unexpanded parameter packs can and should 4425 // be expanded. 4426 bool Expand = true; 4427 bool RetainExpansion = false; 4428 Optional<unsigned> NumExpansions = OrigNumExpansions; 4429 if (getDerived().TryExpandParameterPacks(Ellipsis, 4430 Pattern.getSourceRange(), 4431 Unexpanded, 4432 Expand, 4433 RetainExpansion, 4434 NumExpansions)) 4435 return true; 4436 4437 if (!Expand) { 4438 // The transform has determined that we should perform a simple 4439 // transformation on the pack expansion, producing another pack 4440 // expansion. 4441 TemplateArgumentLoc OutPattern; 4442 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4443 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4444 return true; 4445 4446 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4447 NumExpansions); 4448 if (Out.getArgument().isNull()) 4449 return true; 4450 4451 Outputs.addArgument(Out); 4452 continue; 4453 } 4454 4455 // The transform has determined that we should perform an elementwise 4456 // expansion of the pattern. Do so. 4457 for (unsigned I = 0; I != *NumExpansions; ++I) { 4458 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4459 4460 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4461 return true; 4462 4463 if (Out.getArgument().containsUnexpandedParameterPack()) { 4464 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4465 OrigNumExpansions); 4466 if (Out.getArgument().isNull()) 4467 return true; 4468 } 4469 4470 Outputs.addArgument(Out); 4471 } 4472 4473 // If we're supposed to retain a pack expansion, do so by temporarily 4474 // forgetting the partially-substituted parameter pack. 4475 if (RetainExpansion) { 4476 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4477 4478 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4479 return true; 4480 4481 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4482 OrigNumExpansions); 4483 if (Out.getArgument().isNull()) 4484 return true; 4485 4486 Outputs.addArgument(Out); 4487 } 4488 4489 continue; 4490 } 4491 4492 // The simple case: 4493 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4494 return true; 4495 4496 Outputs.addArgument(Out); 4497 } 4498 4499 return false; 4500 4501 } 4502 4503 //===----------------------------------------------------------------------===// 4504 // Type transformation 4505 //===----------------------------------------------------------------------===// 4506 4507 template<typename Derived> 4508 QualType TreeTransform<Derived>::TransformType(QualType T) { 4509 if (getDerived().AlreadyTransformed(T)) 4510 return T; 4511 4512 // Temporary workaround. All of these transformations should 4513 // eventually turn into transformations on TypeLocs. 4514 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4515 getDerived().getBaseLocation()); 4516 4517 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4518 4519 if (!NewDI) 4520 return QualType(); 4521 4522 return NewDI->getType(); 4523 } 4524 4525 template<typename Derived> 4526 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4527 // Refine the base location to the type's location. 4528 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4529 getDerived().getBaseEntity()); 4530 if (getDerived().AlreadyTransformed(DI->getType())) 4531 return DI; 4532 4533 TypeLocBuilder TLB; 4534 4535 TypeLoc TL = DI->getTypeLoc(); 4536 TLB.reserve(TL.getFullDataSize()); 4537 4538 QualType Result = getDerived().TransformType(TLB, TL); 4539 if (Result.isNull()) 4540 return nullptr; 4541 4542 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4543 } 4544 4545 template<typename Derived> 4546 QualType 4547 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4548 switch (T.getTypeLocClass()) { 4549 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4550 #define TYPELOC(CLASS, PARENT) \ 4551 case TypeLoc::CLASS: \ 4552 return getDerived().Transform##CLASS##Type(TLB, \ 4553 T.castAs<CLASS##TypeLoc>()); 4554 #include "clang/AST/TypeLocNodes.def" 4555 } 4556 4557 llvm_unreachable("unhandled type loc!"); 4558 } 4559 4560 template<typename Derived> 4561 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4562 if (!isa<DependentNameType>(T)) 4563 return TransformType(T); 4564 4565 if (getDerived().AlreadyTransformed(T)) 4566 return T; 4567 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4568 getDerived().getBaseLocation()); 4569 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4570 return NewDI ? NewDI->getType() : QualType(); 4571 } 4572 4573 template<typename Derived> 4574 TypeSourceInfo * 4575 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4576 if (!isa<DependentNameType>(DI->getType())) 4577 return TransformType(DI); 4578 4579 // Refine the base location to the type's location. 4580 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4581 getDerived().getBaseEntity()); 4582 if (getDerived().AlreadyTransformed(DI->getType())) 4583 return DI; 4584 4585 TypeLocBuilder TLB; 4586 4587 TypeLoc TL = DI->getTypeLoc(); 4588 TLB.reserve(TL.getFullDataSize()); 4589 4590 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4591 if (QTL) 4592 TL = QTL.getUnqualifiedLoc(); 4593 4594 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4595 4596 QualType Result = getDerived().TransformDependentNameType( 4597 TLB, DNTL, /*DeducedTSTContext*/true); 4598 if (Result.isNull()) 4599 return nullptr; 4600 4601 if (QTL) { 4602 Result = getDerived().RebuildQualifiedType(Result, QTL); 4603 if (Result.isNull()) 4604 return nullptr; 4605 TLB.TypeWasModifiedSafely(Result); 4606 } 4607 4608 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4609 } 4610 4611 template<typename Derived> 4612 QualType 4613 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4614 QualifiedTypeLoc T) { 4615 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4616 if (Result.isNull()) 4617 return QualType(); 4618 4619 Result = getDerived().RebuildQualifiedType(Result, T); 4620 4621 if (Result.isNull()) 4622 return QualType(); 4623 4624 // RebuildQualifiedType might have updated the type, but not in a way 4625 // that invalidates the TypeLoc. (There's no location information for 4626 // qualifiers.) 4627 TLB.TypeWasModifiedSafely(Result); 4628 4629 return Result; 4630 } 4631 4632 template <typename Derived> 4633 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4634 QualifiedTypeLoc TL) { 4635 4636 SourceLocation Loc = TL.getBeginLoc(); 4637 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4638 4639 if (((T.getAddressSpace() != LangAS::Default && 4640 Quals.getAddressSpace() != LangAS::Default)) && 4641 T.getAddressSpace() != Quals.getAddressSpace()) { 4642 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4643 << TL.getType() << T; 4644 return QualType(); 4645 } 4646 4647 // C++ [dcl.fct]p7: 4648 // [When] adding cv-qualifications on top of the function type [...] the 4649 // cv-qualifiers are ignored. 4650 if (T->isFunctionType()) { 4651 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4652 Quals.getAddressSpace()); 4653 return T; 4654 } 4655 4656 // C++ [dcl.ref]p1: 4657 // when the cv-qualifiers are introduced through the use of a typedef-name 4658 // or decltype-specifier [...] the cv-qualifiers are ignored. 4659 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4660 // applied to a reference type. 4661 if (T->isReferenceType()) { 4662 // The only qualifier that applies to a reference type is restrict. 4663 if (!Quals.hasRestrict()) 4664 return T; 4665 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4666 } 4667 4668 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4669 // resulting type. 4670 if (Quals.hasObjCLifetime()) { 4671 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4672 Quals.removeObjCLifetime(); 4673 else if (T.getObjCLifetime()) { 4674 // Objective-C ARC: 4675 // A lifetime qualifier applied to a substituted template parameter 4676 // overrides the lifetime qualifier from the template argument. 4677 const AutoType *AutoTy; 4678 if (const SubstTemplateTypeParmType *SubstTypeParam 4679 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4680 QualType Replacement = SubstTypeParam->getReplacementType(); 4681 Qualifiers Qs = Replacement.getQualifiers(); 4682 Qs.removeObjCLifetime(); 4683 Replacement = SemaRef.Context.getQualifiedType( 4684 Replacement.getUnqualifiedType(), Qs); 4685 T = SemaRef.Context.getSubstTemplateTypeParmType( 4686 SubstTypeParam->getReplacedParameter(), Replacement); 4687 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4688 // 'auto' types behave the same way as template parameters. 4689 QualType Deduced = AutoTy->getDeducedType(); 4690 Qualifiers Qs = Deduced.getQualifiers(); 4691 Qs.removeObjCLifetime(); 4692 Deduced = 4693 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4694 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4695 AutoTy->isDependentType(), 4696 /*isPack=*/false, 4697 AutoTy->getTypeConstraintConcept(), 4698 AutoTy->getTypeConstraintArguments()); 4699 } else { 4700 // Otherwise, complain about the addition of a qualifier to an 4701 // already-qualified type. 4702 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4703 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4704 Quals.removeObjCLifetime(); 4705 } 4706 } 4707 } 4708 4709 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4710 } 4711 4712 template<typename Derived> 4713 TypeLoc 4714 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4715 QualType ObjectType, 4716 NamedDecl *UnqualLookup, 4717 CXXScopeSpec &SS) { 4718 if (getDerived().AlreadyTransformed(TL.getType())) 4719 return TL; 4720 4721 TypeSourceInfo *TSI = 4722 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4723 if (TSI) 4724 return TSI->getTypeLoc(); 4725 return TypeLoc(); 4726 } 4727 4728 template<typename Derived> 4729 TypeSourceInfo * 4730 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4731 QualType ObjectType, 4732 NamedDecl *UnqualLookup, 4733 CXXScopeSpec &SS) { 4734 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4735 return TSInfo; 4736 4737 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4738 UnqualLookup, SS); 4739 } 4740 4741 template <typename Derived> 4742 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4743 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4744 CXXScopeSpec &SS) { 4745 QualType T = TL.getType(); 4746 assert(!getDerived().AlreadyTransformed(T)); 4747 4748 TypeLocBuilder TLB; 4749 QualType Result; 4750 4751 if (isa<TemplateSpecializationType>(T)) { 4752 TemplateSpecializationTypeLoc SpecTL = 4753 TL.castAs<TemplateSpecializationTypeLoc>(); 4754 4755 TemplateName Template = getDerived().TransformTemplateName( 4756 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4757 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4758 if (Template.isNull()) 4759 return nullptr; 4760 4761 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4762 Template); 4763 } else if (isa<DependentTemplateSpecializationType>(T)) { 4764 DependentTemplateSpecializationTypeLoc SpecTL = 4765 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4766 4767 TemplateName Template 4768 = getDerived().RebuildTemplateName(SS, 4769 SpecTL.getTemplateKeywordLoc(), 4770 *SpecTL.getTypePtr()->getIdentifier(), 4771 SpecTL.getTemplateNameLoc(), 4772 ObjectType, UnqualLookup, 4773 /*AllowInjectedClassName*/true); 4774 if (Template.isNull()) 4775 return nullptr; 4776 4777 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4778 SpecTL, 4779 Template, 4780 SS); 4781 } else { 4782 // Nothing special needs to be done for these. 4783 Result = getDerived().TransformType(TLB, TL); 4784 } 4785 4786 if (Result.isNull()) 4787 return nullptr; 4788 4789 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4790 } 4791 4792 template <class TyLoc> static inline 4793 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4794 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4795 NewT.setNameLoc(T.getNameLoc()); 4796 return T.getType(); 4797 } 4798 4799 template<typename Derived> 4800 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4801 BuiltinTypeLoc T) { 4802 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4803 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4804 if (T.needsExtraLocalData()) 4805 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4806 return T.getType(); 4807 } 4808 4809 template<typename Derived> 4810 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4811 ComplexTypeLoc T) { 4812 // FIXME: recurse? 4813 return TransformTypeSpecType(TLB, T); 4814 } 4815 4816 template <typename Derived> 4817 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4818 AdjustedTypeLoc TL) { 4819 // Adjustments applied during transformation are handled elsewhere. 4820 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4821 } 4822 4823 template<typename Derived> 4824 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4825 DecayedTypeLoc TL) { 4826 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4827 if (OriginalType.isNull()) 4828 return QualType(); 4829 4830 QualType Result = TL.getType(); 4831 if (getDerived().AlwaysRebuild() || 4832 OriginalType != TL.getOriginalLoc().getType()) 4833 Result = SemaRef.Context.getDecayedType(OriginalType); 4834 TLB.push<DecayedTypeLoc>(Result); 4835 // Nothing to set for DecayedTypeLoc. 4836 return Result; 4837 } 4838 4839 template<typename Derived> 4840 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4841 PointerTypeLoc TL) { 4842 QualType PointeeType 4843 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4844 if (PointeeType.isNull()) 4845 return QualType(); 4846 4847 QualType Result = TL.getType(); 4848 if (PointeeType->getAs<ObjCObjectType>()) { 4849 // A dependent pointer type 'T *' has is being transformed such 4850 // that an Objective-C class type is being replaced for 'T'. The 4851 // resulting pointer type is an ObjCObjectPointerType, not a 4852 // PointerType. 4853 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4854 4855 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4856 NewT.setStarLoc(TL.getStarLoc()); 4857 return Result; 4858 } 4859 4860 if (getDerived().AlwaysRebuild() || 4861 PointeeType != TL.getPointeeLoc().getType()) { 4862 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4863 if (Result.isNull()) 4864 return QualType(); 4865 } 4866 4867 // Objective-C ARC can add lifetime qualifiers to the type that we're 4868 // pointing to. 4869 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4870 4871 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4872 NewT.setSigilLoc(TL.getSigilLoc()); 4873 return Result; 4874 } 4875 4876 template<typename Derived> 4877 QualType 4878 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4879 BlockPointerTypeLoc TL) { 4880 QualType PointeeType 4881 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4882 if (PointeeType.isNull()) 4883 return QualType(); 4884 4885 QualType Result = TL.getType(); 4886 if (getDerived().AlwaysRebuild() || 4887 PointeeType != TL.getPointeeLoc().getType()) { 4888 Result = getDerived().RebuildBlockPointerType(PointeeType, 4889 TL.getSigilLoc()); 4890 if (Result.isNull()) 4891 return QualType(); 4892 } 4893 4894 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4895 NewT.setSigilLoc(TL.getSigilLoc()); 4896 return Result; 4897 } 4898 4899 /// Transforms a reference type. Note that somewhat paradoxically we 4900 /// don't care whether the type itself is an l-value type or an r-value 4901 /// type; we only care if the type was *written* as an l-value type 4902 /// or an r-value type. 4903 template<typename Derived> 4904 QualType 4905 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4906 ReferenceTypeLoc TL) { 4907 const ReferenceType *T = TL.getTypePtr(); 4908 4909 // Note that this works with the pointee-as-written. 4910 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4911 if (PointeeType.isNull()) 4912 return QualType(); 4913 4914 QualType Result = TL.getType(); 4915 if (getDerived().AlwaysRebuild() || 4916 PointeeType != T->getPointeeTypeAsWritten()) { 4917 Result = getDerived().RebuildReferenceType(PointeeType, 4918 T->isSpelledAsLValue(), 4919 TL.getSigilLoc()); 4920 if (Result.isNull()) 4921 return QualType(); 4922 } 4923 4924 // Objective-C ARC can add lifetime qualifiers to the type that we're 4925 // referring to. 4926 TLB.TypeWasModifiedSafely( 4927 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 4928 4929 // r-value references can be rebuilt as l-value references. 4930 ReferenceTypeLoc NewTL; 4931 if (isa<LValueReferenceType>(Result)) 4932 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4933 else 4934 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4935 NewTL.setSigilLoc(TL.getSigilLoc()); 4936 4937 return Result; 4938 } 4939 4940 template<typename Derived> 4941 QualType 4942 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4943 LValueReferenceTypeLoc TL) { 4944 return TransformReferenceType(TLB, TL); 4945 } 4946 4947 template<typename Derived> 4948 QualType 4949 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4950 RValueReferenceTypeLoc TL) { 4951 return TransformReferenceType(TLB, TL); 4952 } 4953 4954 template<typename Derived> 4955 QualType 4956 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4957 MemberPointerTypeLoc TL) { 4958 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4959 if (PointeeType.isNull()) 4960 return QualType(); 4961 4962 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4963 TypeSourceInfo *NewClsTInfo = nullptr; 4964 if (OldClsTInfo) { 4965 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4966 if (!NewClsTInfo) 4967 return QualType(); 4968 } 4969 4970 const MemberPointerType *T = TL.getTypePtr(); 4971 QualType OldClsType = QualType(T->getClass(), 0); 4972 QualType NewClsType; 4973 if (NewClsTInfo) 4974 NewClsType = NewClsTInfo->getType(); 4975 else { 4976 NewClsType = getDerived().TransformType(OldClsType); 4977 if (NewClsType.isNull()) 4978 return QualType(); 4979 } 4980 4981 QualType Result = TL.getType(); 4982 if (getDerived().AlwaysRebuild() || 4983 PointeeType != T->getPointeeType() || 4984 NewClsType != OldClsType) { 4985 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4986 TL.getStarLoc()); 4987 if (Result.isNull()) 4988 return QualType(); 4989 } 4990 4991 // If we had to adjust the pointee type when building a member pointer, make 4992 // sure to push TypeLoc info for it. 4993 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4994 if (MPT && PointeeType != MPT->getPointeeType()) { 4995 assert(isa<AdjustedType>(MPT->getPointeeType())); 4996 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4997 } 4998 4999 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 5000 NewTL.setSigilLoc(TL.getSigilLoc()); 5001 NewTL.setClassTInfo(NewClsTInfo); 5002 5003 return Result; 5004 } 5005 5006 template<typename Derived> 5007 QualType 5008 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 5009 ConstantArrayTypeLoc TL) { 5010 const ConstantArrayType *T = TL.getTypePtr(); 5011 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5012 if (ElementType.isNull()) 5013 return QualType(); 5014 5015 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5016 Expr *OldSize = TL.getSizeExpr(); 5017 if (!OldSize) 5018 OldSize = const_cast<Expr*>(T->getSizeExpr()); 5019 Expr *NewSize = nullptr; 5020 if (OldSize) { 5021 EnterExpressionEvaluationContext Unevaluated( 5022 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5023 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 5024 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 5025 } 5026 5027 QualType Result = TL.getType(); 5028 if (getDerived().AlwaysRebuild() || 5029 ElementType != T->getElementType() || 5030 (T->getSizeExpr() && NewSize != OldSize)) { 5031 Result = getDerived().RebuildConstantArrayType(ElementType, 5032 T->getSizeModifier(), 5033 T->getSize(), NewSize, 5034 T->getIndexTypeCVRQualifiers(), 5035 TL.getBracketsRange()); 5036 if (Result.isNull()) 5037 return QualType(); 5038 } 5039 5040 // We might have either a ConstantArrayType or a VariableArrayType now: 5041 // a ConstantArrayType is allowed to have an element type which is a 5042 // VariableArrayType if the type is dependent. Fortunately, all array 5043 // types have the same location layout. 5044 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5045 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5046 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5047 NewTL.setSizeExpr(NewSize); 5048 5049 return Result; 5050 } 5051 5052 template<typename Derived> 5053 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 5054 TypeLocBuilder &TLB, 5055 IncompleteArrayTypeLoc TL) { 5056 const IncompleteArrayType *T = TL.getTypePtr(); 5057 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5058 if (ElementType.isNull()) 5059 return QualType(); 5060 5061 QualType Result = TL.getType(); 5062 if (getDerived().AlwaysRebuild() || 5063 ElementType != T->getElementType()) { 5064 Result = getDerived().RebuildIncompleteArrayType(ElementType, 5065 T->getSizeModifier(), 5066 T->getIndexTypeCVRQualifiers(), 5067 TL.getBracketsRange()); 5068 if (Result.isNull()) 5069 return QualType(); 5070 } 5071 5072 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 5073 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5074 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5075 NewTL.setSizeExpr(nullptr); 5076 5077 return Result; 5078 } 5079 5080 template<typename Derived> 5081 QualType 5082 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 5083 VariableArrayTypeLoc TL) { 5084 const VariableArrayType *T = TL.getTypePtr(); 5085 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5086 if (ElementType.isNull()) 5087 return QualType(); 5088 5089 ExprResult SizeResult; 5090 { 5091 EnterExpressionEvaluationContext Context( 5092 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 5093 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5094 } 5095 if (SizeResult.isInvalid()) 5096 return QualType(); 5097 SizeResult = 5098 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5099 if (SizeResult.isInvalid()) 5100 return QualType(); 5101 5102 Expr *Size = SizeResult.get(); 5103 5104 QualType Result = TL.getType(); 5105 if (getDerived().AlwaysRebuild() || 5106 ElementType != T->getElementType() || 5107 Size != T->getSizeExpr()) { 5108 Result = getDerived().RebuildVariableArrayType(ElementType, 5109 T->getSizeModifier(), 5110 Size, 5111 T->getIndexTypeCVRQualifiers(), 5112 TL.getBracketsRange()); 5113 if (Result.isNull()) 5114 return QualType(); 5115 } 5116 5117 // We might have constant size array now, but fortunately it has the same 5118 // location layout. 5119 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5120 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5121 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5122 NewTL.setSizeExpr(Size); 5123 5124 return Result; 5125 } 5126 5127 template<typename Derived> 5128 QualType 5129 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5130 DependentSizedArrayTypeLoc TL) { 5131 const DependentSizedArrayType *T = TL.getTypePtr(); 5132 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5133 if (ElementType.isNull()) 5134 return QualType(); 5135 5136 // Array bounds are constant expressions. 5137 EnterExpressionEvaluationContext Unevaluated( 5138 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5139 5140 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5141 Expr *origSize = TL.getSizeExpr(); 5142 if (!origSize) origSize = T->getSizeExpr(); 5143 5144 ExprResult sizeResult 5145 = getDerived().TransformExpr(origSize); 5146 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5147 if (sizeResult.isInvalid()) 5148 return QualType(); 5149 5150 Expr *size = sizeResult.get(); 5151 5152 QualType Result = TL.getType(); 5153 if (getDerived().AlwaysRebuild() || 5154 ElementType != T->getElementType() || 5155 size != origSize) { 5156 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5157 T->getSizeModifier(), 5158 size, 5159 T->getIndexTypeCVRQualifiers(), 5160 TL.getBracketsRange()); 5161 if (Result.isNull()) 5162 return QualType(); 5163 } 5164 5165 // We might have any sort of array type now, but fortunately they 5166 // all have the same location layout. 5167 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5168 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5169 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5170 NewTL.setSizeExpr(size); 5171 5172 return Result; 5173 } 5174 5175 template <typename Derived> 5176 QualType TreeTransform<Derived>::TransformDependentVectorType( 5177 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5178 const DependentVectorType *T = TL.getTypePtr(); 5179 QualType ElementType = getDerived().TransformType(T->getElementType()); 5180 if (ElementType.isNull()) 5181 return QualType(); 5182 5183 EnterExpressionEvaluationContext Unevaluated( 5184 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5185 5186 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5187 Size = SemaRef.ActOnConstantExpression(Size); 5188 if (Size.isInvalid()) 5189 return QualType(); 5190 5191 QualType Result = TL.getType(); 5192 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5193 Size.get() != T->getSizeExpr()) { 5194 Result = getDerived().RebuildDependentVectorType( 5195 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5196 if (Result.isNull()) 5197 return QualType(); 5198 } 5199 5200 // Result might be dependent or not. 5201 if (isa<DependentVectorType>(Result)) { 5202 DependentVectorTypeLoc NewTL = 5203 TLB.push<DependentVectorTypeLoc>(Result); 5204 NewTL.setNameLoc(TL.getNameLoc()); 5205 } else { 5206 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5207 NewTL.setNameLoc(TL.getNameLoc()); 5208 } 5209 5210 return Result; 5211 } 5212 5213 template<typename Derived> 5214 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5215 TypeLocBuilder &TLB, 5216 DependentSizedExtVectorTypeLoc TL) { 5217 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5218 5219 // FIXME: ext vector locs should be nested 5220 QualType ElementType = getDerived().TransformType(T->getElementType()); 5221 if (ElementType.isNull()) 5222 return QualType(); 5223 5224 // Vector sizes are constant expressions. 5225 EnterExpressionEvaluationContext Unevaluated( 5226 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5227 5228 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5229 Size = SemaRef.ActOnConstantExpression(Size); 5230 if (Size.isInvalid()) 5231 return QualType(); 5232 5233 QualType Result = TL.getType(); 5234 if (getDerived().AlwaysRebuild() || 5235 ElementType != T->getElementType() || 5236 Size.get() != T->getSizeExpr()) { 5237 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5238 Size.get(), 5239 T->getAttributeLoc()); 5240 if (Result.isNull()) 5241 return QualType(); 5242 } 5243 5244 // Result might be dependent or not. 5245 if (isa<DependentSizedExtVectorType>(Result)) { 5246 DependentSizedExtVectorTypeLoc NewTL 5247 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5248 NewTL.setNameLoc(TL.getNameLoc()); 5249 } else { 5250 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5251 NewTL.setNameLoc(TL.getNameLoc()); 5252 } 5253 5254 return Result; 5255 } 5256 5257 template <typename Derived> 5258 QualType 5259 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB, 5260 ConstantMatrixTypeLoc TL) { 5261 const ConstantMatrixType *T = TL.getTypePtr(); 5262 QualType ElementType = getDerived().TransformType(T->getElementType()); 5263 if (ElementType.isNull()) 5264 return QualType(); 5265 5266 QualType Result = TL.getType(); 5267 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) { 5268 Result = getDerived().RebuildConstantMatrixType( 5269 ElementType, T->getNumRows(), T->getNumColumns()); 5270 if (Result.isNull()) 5271 return QualType(); 5272 } 5273 5274 ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result); 5275 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5276 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5277 NewTL.setAttrRowOperand(TL.getAttrRowOperand()); 5278 NewTL.setAttrColumnOperand(TL.getAttrColumnOperand()); 5279 5280 return Result; 5281 } 5282 5283 template <typename Derived> 5284 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType( 5285 TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) { 5286 const DependentSizedMatrixType *T = TL.getTypePtr(); 5287 5288 QualType ElementType = getDerived().TransformType(T->getElementType()); 5289 if (ElementType.isNull()) { 5290 return QualType(); 5291 } 5292 5293 // Matrix dimensions are constant expressions. 5294 EnterExpressionEvaluationContext Unevaluated( 5295 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5296 5297 Expr *origRows = TL.getAttrRowOperand(); 5298 if (!origRows) 5299 origRows = T->getRowExpr(); 5300 Expr *origColumns = TL.getAttrColumnOperand(); 5301 if (!origColumns) 5302 origColumns = T->getColumnExpr(); 5303 5304 ExprResult rowResult = getDerived().TransformExpr(origRows); 5305 rowResult = SemaRef.ActOnConstantExpression(rowResult); 5306 if (rowResult.isInvalid()) 5307 return QualType(); 5308 5309 ExprResult columnResult = getDerived().TransformExpr(origColumns); 5310 columnResult = SemaRef.ActOnConstantExpression(columnResult); 5311 if (columnResult.isInvalid()) 5312 return QualType(); 5313 5314 Expr *rows = rowResult.get(); 5315 Expr *columns = columnResult.get(); 5316 5317 QualType Result = TL.getType(); 5318 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5319 rows != origRows || columns != origColumns) { 5320 Result = getDerived().RebuildDependentSizedMatrixType( 5321 ElementType, rows, columns, T->getAttributeLoc()); 5322 5323 if (Result.isNull()) 5324 return QualType(); 5325 } 5326 5327 // We might have any sort of matrix type now, but fortunately they 5328 // all have the same location layout. 5329 MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result); 5330 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5331 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5332 NewTL.setAttrRowOperand(rows); 5333 NewTL.setAttrColumnOperand(columns); 5334 return Result; 5335 } 5336 5337 template <typename Derived> 5338 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5339 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5340 const DependentAddressSpaceType *T = TL.getTypePtr(); 5341 5342 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5343 5344 if (pointeeType.isNull()) 5345 return QualType(); 5346 5347 // Address spaces are constant expressions. 5348 EnterExpressionEvaluationContext Unevaluated( 5349 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5350 5351 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5352 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5353 if (AddrSpace.isInvalid()) 5354 return QualType(); 5355 5356 QualType Result = TL.getType(); 5357 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5358 AddrSpace.get() != T->getAddrSpaceExpr()) { 5359 Result = getDerived().RebuildDependentAddressSpaceType( 5360 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5361 if (Result.isNull()) 5362 return QualType(); 5363 } 5364 5365 // Result might be dependent or not. 5366 if (isa<DependentAddressSpaceType>(Result)) { 5367 DependentAddressSpaceTypeLoc NewTL = 5368 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5369 5370 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5371 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5372 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5373 5374 } else { 5375 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5376 Result, getDerived().getBaseLocation()); 5377 TransformType(TLB, DI->getTypeLoc()); 5378 } 5379 5380 return Result; 5381 } 5382 5383 template <typename Derived> 5384 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5385 VectorTypeLoc TL) { 5386 const VectorType *T = TL.getTypePtr(); 5387 QualType ElementType = getDerived().TransformType(T->getElementType()); 5388 if (ElementType.isNull()) 5389 return QualType(); 5390 5391 QualType Result = TL.getType(); 5392 if (getDerived().AlwaysRebuild() || 5393 ElementType != T->getElementType()) { 5394 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5395 T->getVectorKind()); 5396 if (Result.isNull()) 5397 return QualType(); 5398 } 5399 5400 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5401 NewTL.setNameLoc(TL.getNameLoc()); 5402 5403 return Result; 5404 } 5405 5406 template<typename Derived> 5407 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5408 ExtVectorTypeLoc TL) { 5409 const VectorType *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() || 5416 ElementType != T->getElementType()) { 5417 Result = getDerived().RebuildExtVectorType(ElementType, 5418 T->getNumElements(), 5419 /*FIXME*/ SourceLocation()); 5420 if (Result.isNull()) 5421 return QualType(); 5422 } 5423 5424 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5425 NewTL.setNameLoc(TL.getNameLoc()); 5426 5427 return Result; 5428 } 5429 5430 template <typename Derived> 5431 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5432 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5433 bool ExpectParameterPack) { 5434 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5435 TypeSourceInfo *NewDI = nullptr; 5436 5437 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5438 // If we're substituting into a pack expansion type and we know the 5439 // length we want to expand to, just substitute for the pattern. 5440 TypeLoc OldTL = OldDI->getTypeLoc(); 5441 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5442 5443 TypeLocBuilder TLB; 5444 TypeLoc NewTL = OldDI->getTypeLoc(); 5445 TLB.reserve(NewTL.getFullDataSize()); 5446 5447 QualType Result = getDerived().TransformType(TLB, 5448 OldExpansionTL.getPatternLoc()); 5449 if (Result.isNull()) 5450 return nullptr; 5451 5452 Result = RebuildPackExpansionType(Result, 5453 OldExpansionTL.getPatternLoc().getSourceRange(), 5454 OldExpansionTL.getEllipsisLoc(), 5455 NumExpansions); 5456 if (Result.isNull()) 5457 return nullptr; 5458 5459 PackExpansionTypeLoc NewExpansionTL 5460 = TLB.push<PackExpansionTypeLoc>(Result); 5461 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5462 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5463 } else 5464 NewDI = getDerived().TransformType(OldDI); 5465 if (!NewDI) 5466 return nullptr; 5467 5468 if (NewDI == OldDI && indexAdjustment == 0) 5469 return OldParm; 5470 5471 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5472 OldParm->getDeclContext(), 5473 OldParm->getInnerLocStart(), 5474 OldParm->getLocation(), 5475 OldParm->getIdentifier(), 5476 NewDI->getType(), 5477 NewDI, 5478 OldParm->getStorageClass(), 5479 /* DefArg */ nullptr); 5480 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5481 OldParm->getFunctionScopeIndex() + indexAdjustment); 5482 return newParm; 5483 } 5484 5485 template <typename Derived> 5486 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5487 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5488 const QualType *ParamTypes, 5489 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5490 SmallVectorImpl<QualType> &OutParamTypes, 5491 SmallVectorImpl<ParmVarDecl *> *PVars, 5492 Sema::ExtParameterInfoBuilder &PInfos) { 5493 int indexAdjustment = 0; 5494 5495 unsigned NumParams = Params.size(); 5496 for (unsigned i = 0; i != NumParams; ++i) { 5497 if (ParmVarDecl *OldParm = Params[i]) { 5498 assert(OldParm->getFunctionScopeIndex() == i); 5499 5500 Optional<unsigned> NumExpansions; 5501 ParmVarDecl *NewParm = nullptr; 5502 if (OldParm->isParameterPack()) { 5503 // We have a function parameter pack that may need to be expanded. 5504 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5505 5506 // Find the parameter packs that could be expanded. 5507 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5508 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5509 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5510 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5511 5512 // Determine whether we should expand the parameter packs. 5513 bool ShouldExpand = false; 5514 bool RetainExpansion = false; 5515 Optional<unsigned> OrigNumExpansions; 5516 if (Unexpanded.size() > 0) { 5517 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5518 NumExpansions = OrigNumExpansions; 5519 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5520 Pattern.getSourceRange(), 5521 Unexpanded, 5522 ShouldExpand, 5523 RetainExpansion, 5524 NumExpansions)) { 5525 return true; 5526 } 5527 } else { 5528 #ifndef NDEBUG 5529 const AutoType *AT = 5530 Pattern.getType().getTypePtr()->getContainedAutoType(); 5531 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5532 "Could not find parameter packs or undeduced auto type!"); 5533 #endif 5534 } 5535 5536 if (ShouldExpand) { 5537 // Expand the function parameter pack into multiple, separate 5538 // parameters. 5539 getDerived().ExpandingFunctionParameterPack(OldParm); 5540 for (unsigned I = 0; I != *NumExpansions; ++I) { 5541 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5542 ParmVarDecl *NewParm 5543 = getDerived().TransformFunctionTypeParam(OldParm, 5544 indexAdjustment++, 5545 OrigNumExpansions, 5546 /*ExpectParameterPack=*/false); 5547 if (!NewParm) 5548 return true; 5549 5550 if (ParamInfos) 5551 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5552 OutParamTypes.push_back(NewParm->getType()); 5553 if (PVars) 5554 PVars->push_back(NewParm); 5555 } 5556 5557 // If we're supposed to retain a pack expansion, do so by temporarily 5558 // forgetting the partially-substituted parameter pack. 5559 if (RetainExpansion) { 5560 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5561 ParmVarDecl *NewParm 5562 = getDerived().TransformFunctionTypeParam(OldParm, 5563 indexAdjustment++, 5564 OrigNumExpansions, 5565 /*ExpectParameterPack=*/false); 5566 if (!NewParm) 5567 return true; 5568 5569 if (ParamInfos) 5570 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5571 OutParamTypes.push_back(NewParm->getType()); 5572 if (PVars) 5573 PVars->push_back(NewParm); 5574 } 5575 5576 // The next parameter should have the same adjustment as the 5577 // last thing we pushed, but we post-incremented indexAdjustment 5578 // on every push. Also, if we push nothing, the adjustment should 5579 // go down by one. 5580 indexAdjustment--; 5581 5582 // We're done with the pack expansion. 5583 continue; 5584 } 5585 5586 // We'll substitute the parameter now without expanding the pack 5587 // expansion. 5588 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5589 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5590 indexAdjustment, 5591 NumExpansions, 5592 /*ExpectParameterPack=*/true); 5593 assert(NewParm->isParameterPack() && 5594 "Parameter pack no longer a parameter pack after " 5595 "transformation."); 5596 } else { 5597 NewParm = getDerived().TransformFunctionTypeParam( 5598 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5599 } 5600 5601 if (!NewParm) 5602 return true; 5603 5604 if (ParamInfos) 5605 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5606 OutParamTypes.push_back(NewParm->getType()); 5607 if (PVars) 5608 PVars->push_back(NewParm); 5609 continue; 5610 } 5611 5612 // Deal with the possibility that we don't have a parameter 5613 // declaration for this parameter. 5614 QualType OldType = ParamTypes[i]; 5615 bool IsPackExpansion = false; 5616 Optional<unsigned> NumExpansions; 5617 QualType NewType; 5618 if (const PackExpansionType *Expansion 5619 = dyn_cast<PackExpansionType>(OldType)) { 5620 // We have a function parameter pack that may need to be expanded. 5621 QualType Pattern = Expansion->getPattern(); 5622 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5623 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5624 5625 // Determine whether we should expand the parameter packs. 5626 bool ShouldExpand = false; 5627 bool RetainExpansion = false; 5628 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5629 Unexpanded, 5630 ShouldExpand, 5631 RetainExpansion, 5632 NumExpansions)) { 5633 return true; 5634 } 5635 5636 if (ShouldExpand) { 5637 // Expand the function parameter pack into multiple, separate 5638 // parameters. 5639 for (unsigned I = 0; I != *NumExpansions; ++I) { 5640 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5641 QualType NewType = getDerived().TransformType(Pattern); 5642 if (NewType.isNull()) 5643 return true; 5644 5645 if (NewType->containsUnexpandedParameterPack()) { 5646 NewType = 5647 getSema().getASTContext().getPackExpansionType(NewType, None); 5648 5649 if (NewType.isNull()) 5650 return true; 5651 } 5652 5653 if (ParamInfos) 5654 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5655 OutParamTypes.push_back(NewType); 5656 if (PVars) 5657 PVars->push_back(nullptr); 5658 } 5659 5660 // We're done with the pack expansion. 5661 continue; 5662 } 5663 5664 // If we're supposed to retain a pack expansion, do so by temporarily 5665 // forgetting the partially-substituted parameter pack. 5666 if (RetainExpansion) { 5667 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5668 QualType NewType = getDerived().TransformType(Pattern); 5669 if (NewType.isNull()) 5670 return true; 5671 5672 if (ParamInfos) 5673 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5674 OutParamTypes.push_back(NewType); 5675 if (PVars) 5676 PVars->push_back(nullptr); 5677 } 5678 5679 // We'll substitute the parameter now without expanding the pack 5680 // expansion. 5681 OldType = Expansion->getPattern(); 5682 IsPackExpansion = true; 5683 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5684 NewType = getDerived().TransformType(OldType); 5685 } else { 5686 NewType = getDerived().TransformType(OldType); 5687 } 5688 5689 if (NewType.isNull()) 5690 return true; 5691 5692 if (IsPackExpansion) 5693 NewType = getSema().Context.getPackExpansionType(NewType, 5694 NumExpansions); 5695 5696 if (ParamInfos) 5697 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5698 OutParamTypes.push_back(NewType); 5699 if (PVars) 5700 PVars->push_back(nullptr); 5701 } 5702 5703 #ifndef NDEBUG 5704 if (PVars) { 5705 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5706 if (ParmVarDecl *parm = (*PVars)[i]) 5707 assert(parm->getFunctionScopeIndex() == i); 5708 } 5709 #endif 5710 5711 return false; 5712 } 5713 5714 template<typename Derived> 5715 QualType 5716 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5717 FunctionProtoTypeLoc TL) { 5718 SmallVector<QualType, 4> ExceptionStorage; 5719 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5720 return getDerived().TransformFunctionProtoType( 5721 TLB, TL, nullptr, Qualifiers(), 5722 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5723 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5724 ExceptionStorage, Changed); 5725 }); 5726 } 5727 5728 template<typename Derived> template<typename Fn> 5729 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5730 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5731 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5732 5733 // Transform the parameters and return type. 5734 // 5735 // We are required to instantiate the params and return type in source order. 5736 // When the function has a trailing return type, we instantiate the 5737 // parameters before the return type, since the return type can then refer 5738 // to the parameters themselves (via decltype, sizeof, etc.). 5739 // 5740 SmallVector<QualType, 4> ParamTypes; 5741 SmallVector<ParmVarDecl*, 4> ParamDecls; 5742 Sema::ExtParameterInfoBuilder ExtParamInfos; 5743 const FunctionProtoType *T = TL.getTypePtr(); 5744 5745 QualType ResultType; 5746 5747 if (T->hasTrailingReturn()) { 5748 if (getDerived().TransformFunctionTypeParams( 5749 TL.getBeginLoc(), TL.getParams(), 5750 TL.getTypePtr()->param_type_begin(), 5751 T->getExtParameterInfosOrNull(), 5752 ParamTypes, &ParamDecls, ExtParamInfos)) 5753 return QualType(); 5754 5755 { 5756 // C++11 [expr.prim.general]p3: 5757 // If a declaration declares a member function or member function 5758 // template of a class X, the expression this is a prvalue of type 5759 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5760 // and the end of the function-definition, member-declarator, or 5761 // declarator. 5762 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5763 5764 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5765 if (ResultType.isNull()) 5766 return QualType(); 5767 } 5768 } 5769 else { 5770 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5771 if (ResultType.isNull()) 5772 return QualType(); 5773 5774 if (getDerived().TransformFunctionTypeParams( 5775 TL.getBeginLoc(), TL.getParams(), 5776 TL.getTypePtr()->param_type_begin(), 5777 T->getExtParameterInfosOrNull(), 5778 ParamTypes, &ParamDecls, ExtParamInfos)) 5779 return QualType(); 5780 } 5781 5782 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5783 5784 bool EPIChanged = false; 5785 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5786 return QualType(); 5787 5788 // Handle extended parameter information. 5789 if (auto NewExtParamInfos = 5790 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5791 if (!EPI.ExtParameterInfos || 5792 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5793 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5794 EPIChanged = true; 5795 } 5796 EPI.ExtParameterInfos = NewExtParamInfos; 5797 } else if (EPI.ExtParameterInfos) { 5798 EPIChanged = true; 5799 EPI.ExtParameterInfos = nullptr; 5800 } 5801 5802 QualType Result = TL.getType(); 5803 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5804 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5805 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5806 if (Result.isNull()) 5807 return QualType(); 5808 } 5809 5810 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5811 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5812 NewTL.setLParenLoc(TL.getLParenLoc()); 5813 NewTL.setRParenLoc(TL.getRParenLoc()); 5814 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5815 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5816 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5817 NewTL.setParam(i, ParamDecls[i]); 5818 5819 return Result; 5820 } 5821 5822 template<typename Derived> 5823 bool TreeTransform<Derived>::TransformExceptionSpec( 5824 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5825 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5826 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5827 5828 // Instantiate a dynamic noexcept expression, if any. 5829 if (isComputedNoexcept(ESI.Type)) { 5830 EnterExpressionEvaluationContext Unevaluated( 5831 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5832 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5833 if (NoexceptExpr.isInvalid()) 5834 return true; 5835 5836 ExceptionSpecificationType EST = ESI.Type; 5837 NoexceptExpr = 5838 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5839 if (NoexceptExpr.isInvalid()) 5840 return true; 5841 5842 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5843 Changed = true; 5844 ESI.NoexceptExpr = NoexceptExpr.get(); 5845 ESI.Type = EST; 5846 } 5847 5848 if (ESI.Type != EST_Dynamic) 5849 return false; 5850 5851 // Instantiate a dynamic exception specification's type. 5852 for (QualType T : ESI.Exceptions) { 5853 if (const PackExpansionType *PackExpansion = 5854 T->getAs<PackExpansionType>()) { 5855 Changed = true; 5856 5857 // We have a pack expansion. Instantiate it. 5858 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5859 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5860 Unexpanded); 5861 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5862 5863 // Determine whether the set of unexpanded parameter packs can and 5864 // should 5865 // be expanded. 5866 bool Expand = false; 5867 bool RetainExpansion = false; 5868 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5869 // FIXME: Track the location of the ellipsis (and track source location 5870 // information for the types in the exception specification in general). 5871 if (getDerived().TryExpandParameterPacks( 5872 Loc, SourceRange(), Unexpanded, Expand, 5873 RetainExpansion, NumExpansions)) 5874 return true; 5875 5876 if (!Expand) { 5877 // We can't expand this pack expansion into separate arguments yet; 5878 // just substitute into the pattern and create a new pack expansion 5879 // type. 5880 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5881 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5882 if (U.isNull()) 5883 return true; 5884 5885 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5886 Exceptions.push_back(U); 5887 continue; 5888 } 5889 5890 // Substitute into the pack expansion pattern for each slice of the 5891 // pack. 5892 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5893 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5894 5895 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5896 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5897 return true; 5898 5899 Exceptions.push_back(U); 5900 } 5901 } else { 5902 QualType U = getDerived().TransformType(T); 5903 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5904 return true; 5905 if (T != U) 5906 Changed = true; 5907 5908 Exceptions.push_back(U); 5909 } 5910 } 5911 5912 ESI.Exceptions = Exceptions; 5913 if (ESI.Exceptions.empty()) 5914 ESI.Type = EST_DynamicNone; 5915 return false; 5916 } 5917 5918 template<typename Derived> 5919 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5920 TypeLocBuilder &TLB, 5921 FunctionNoProtoTypeLoc TL) { 5922 const FunctionNoProtoType *T = TL.getTypePtr(); 5923 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5924 if (ResultType.isNull()) 5925 return QualType(); 5926 5927 QualType Result = TL.getType(); 5928 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5929 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5930 5931 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5932 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5933 NewTL.setLParenLoc(TL.getLParenLoc()); 5934 NewTL.setRParenLoc(TL.getRParenLoc()); 5935 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5936 5937 return Result; 5938 } 5939 5940 template<typename Derived> QualType 5941 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5942 UnresolvedUsingTypeLoc TL) { 5943 const UnresolvedUsingType *T = TL.getTypePtr(); 5944 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5945 if (!D) 5946 return QualType(); 5947 5948 QualType Result = TL.getType(); 5949 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5950 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5951 if (Result.isNull()) 5952 return QualType(); 5953 } 5954 5955 // We might get an arbitrary type spec type back. We should at 5956 // least always get a type spec type, though. 5957 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5958 NewTL.setNameLoc(TL.getNameLoc()); 5959 5960 return Result; 5961 } 5962 5963 template<typename Derived> 5964 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5965 TypedefTypeLoc TL) { 5966 const TypedefType *T = TL.getTypePtr(); 5967 TypedefNameDecl *Typedef 5968 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5969 T->getDecl())); 5970 if (!Typedef) 5971 return QualType(); 5972 5973 QualType Result = TL.getType(); 5974 if (getDerived().AlwaysRebuild() || 5975 Typedef != T->getDecl()) { 5976 Result = getDerived().RebuildTypedefType(Typedef); 5977 if (Result.isNull()) 5978 return QualType(); 5979 } 5980 5981 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5982 NewTL.setNameLoc(TL.getNameLoc()); 5983 5984 return Result; 5985 } 5986 5987 template<typename Derived> 5988 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5989 TypeOfExprTypeLoc TL) { 5990 // typeof expressions are not potentially evaluated contexts 5991 EnterExpressionEvaluationContext Unevaluated( 5992 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5993 Sema::ReuseLambdaContextDecl); 5994 5995 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5996 if (E.isInvalid()) 5997 return QualType(); 5998 5999 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 6000 if (E.isInvalid()) 6001 return QualType(); 6002 6003 QualType Result = TL.getType(); 6004 if (getDerived().AlwaysRebuild() || 6005 E.get() != TL.getUnderlyingExpr()) { 6006 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 6007 if (Result.isNull()) 6008 return QualType(); 6009 } 6010 else E.get(); 6011 6012 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 6013 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6014 NewTL.setLParenLoc(TL.getLParenLoc()); 6015 NewTL.setRParenLoc(TL.getRParenLoc()); 6016 6017 return Result; 6018 } 6019 6020 template<typename Derived> 6021 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 6022 TypeOfTypeLoc TL) { 6023 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 6024 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 6025 if (!New_Under_TI) 6026 return QualType(); 6027 6028 QualType Result = TL.getType(); 6029 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 6030 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 6031 if (Result.isNull()) 6032 return QualType(); 6033 } 6034 6035 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 6036 NewTL.setTypeofLoc(TL.getTypeofLoc()); 6037 NewTL.setLParenLoc(TL.getLParenLoc()); 6038 NewTL.setRParenLoc(TL.getRParenLoc()); 6039 NewTL.setUnderlyingTInfo(New_Under_TI); 6040 6041 return Result; 6042 } 6043 6044 template<typename Derived> 6045 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 6046 DecltypeTypeLoc TL) { 6047 const DecltypeType *T = TL.getTypePtr(); 6048 6049 // decltype expressions are not potentially evaluated contexts 6050 EnterExpressionEvaluationContext Unevaluated( 6051 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 6052 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 6053 6054 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 6055 if (E.isInvalid()) 6056 return QualType(); 6057 6058 E = getSema().ActOnDecltypeExpression(E.get()); 6059 if (E.isInvalid()) 6060 return QualType(); 6061 6062 QualType Result = TL.getType(); 6063 if (getDerived().AlwaysRebuild() || 6064 E.get() != T->getUnderlyingExpr()) { 6065 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 6066 if (Result.isNull()) 6067 return QualType(); 6068 } 6069 else E.get(); 6070 6071 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 6072 NewTL.setNameLoc(TL.getNameLoc()); 6073 6074 return Result; 6075 } 6076 6077 template<typename Derived> 6078 QualType TreeTransform<Derived>::TransformUnaryTransformType( 6079 TypeLocBuilder &TLB, 6080 UnaryTransformTypeLoc TL) { 6081 QualType Result = TL.getType(); 6082 if (Result->isDependentType()) { 6083 const UnaryTransformType *T = TL.getTypePtr(); 6084 QualType NewBase = 6085 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 6086 Result = getDerived().RebuildUnaryTransformType(NewBase, 6087 T->getUTTKind(), 6088 TL.getKWLoc()); 6089 if (Result.isNull()) 6090 return QualType(); 6091 } 6092 6093 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 6094 NewTL.setKWLoc(TL.getKWLoc()); 6095 NewTL.setParensRange(TL.getParensRange()); 6096 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 6097 return Result; 6098 } 6099 6100 template<typename Derived> 6101 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 6102 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 6103 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 6104 6105 CXXScopeSpec SS; 6106 TemplateName TemplateName = getDerived().TransformTemplateName( 6107 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 6108 if (TemplateName.isNull()) 6109 return QualType(); 6110 6111 QualType OldDeduced = T->getDeducedType(); 6112 QualType NewDeduced; 6113 if (!OldDeduced.isNull()) { 6114 NewDeduced = getDerived().TransformType(OldDeduced); 6115 if (NewDeduced.isNull()) 6116 return QualType(); 6117 } 6118 6119 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 6120 TemplateName, NewDeduced); 6121 if (Result.isNull()) 6122 return QualType(); 6123 6124 DeducedTemplateSpecializationTypeLoc NewTL = 6125 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 6126 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6127 6128 return Result; 6129 } 6130 6131 template<typename Derived> 6132 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 6133 RecordTypeLoc TL) { 6134 const RecordType *T = TL.getTypePtr(); 6135 RecordDecl *Record 6136 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6137 T->getDecl())); 6138 if (!Record) 6139 return QualType(); 6140 6141 QualType Result = TL.getType(); 6142 if (getDerived().AlwaysRebuild() || 6143 Record != T->getDecl()) { 6144 Result = getDerived().RebuildRecordType(Record); 6145 if (Result.isNull()) 6146 return QualType(); 6147 } 6148 6149 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 6150 NewTL.setNameLoc(TL.getNameLoc()); 6151 6152 return Result; 6153 } 6154 6155 template<typename Derived> 6156 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 6157 EnumTypeLoc TL) { 6158 const EnumType *T = TL.getTypePtr(); 6159 EnumDecl *Enum 6160 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 6161 T->getDecl())); 6162 if (!Enum) 6163 return QualType(); 6164 6165 QualType Result = TL.getType(); 6166 if (getDerived().AlwaysRebuild() || 6167 Enum != T->getDecl()) { 6168 Result = getDerived().RebuildEnumType(Enum); 6169 if (Result.isNull()) 6170 return QualType(); 6171 } 6172 6173 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6174 NewTL.setNameLoc(TL.getNameLoc()); 6175 6176 return Result; 6177 } 6178 6179 template<typename Derived> 6180 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6181 TypeLocBuilder &TLB, 6182 InjectedClassNameTypeLoc TL) { 6183 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6184 TL.getTypePtr()->getDecl()); 6185 if (!D) return QualType(); 6186 6187 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6188 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6189 return T; 6190 } 6191 6192 template<typename Derived> 6193 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6194 TypeLocBuilder &TLB, 6195 TemplateTypeParmTypeLoc TL) { 6196 return TransformTypeSpecType(TLB, TL); 6197 } 6198 6199 template<typename Derived> 6200 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6201 TypeLocBuilder &TLB, 6202 SubstTemplateTypeParmTypeLoc TL) { 6203 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6204 6205 // Substitute into the replacement type, which itself might involve something 6206 // that needs to be transformed. This only tends to occur with default 6207 // template arguments of template template parameters. 6208 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6209 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6210 if (Replacement.isNull()) 6211 return QualType(); 6212 6213 // Always canonicalize the replacement type. 6214 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6215 QualType Result 6216 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6217 Replacement); 6218 6219 // Propagate type-source information. 6220 SubstTemplateTypeParmTypeLoc NewTL 6221 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6222 NewTL.setNameLoc(TL.getNameLoc()); 6223 return Result; 6224 6225 } 6226 6227 template<typename Derived> 6228 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6229 TypeLocBuilder &TLB, 6230 SubstTemplateTypeParmPackTypeLoc TL) { 6231 return TransformTypeSpecType(TLB, TL); 6232 } 6233 6234 template<typename Derived> 6235 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6236 TypeLocBuilder &TLB, 6237 TemplateSpecializationTypeLoc TL) { 6238 const TemplateSpecializationType *T = TL.getTypePtr(); 6239 6240 // The nested-name-specifier never matters in a TemplateSpecializationType, 6241 // because we can't have a dependent nested-name-specifier anyway. 6242 CXXScopeSpec SS; 6243 TemplateName Template 6244 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6245 TL.getTemplateNameLoc()); 6246 if (Template.isNull()) 6247 return QualType(); 6248 6249 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6250 } 6251 6252 template<typename Derived> 6253 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6254 AtomicTypeLoc TL) { 6255 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6256 if (ValueType.isNull()) 6257 return QualType(); 6258 6259 QualType Result = TL.getType(); 6260 if (getDerived().AlwaysRebuild() || 6261 ValueType != TL.getValueLoc().getType()) { 6262 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6263 if (Result.isNull()) 6264 return QualType(); 6265 } 6266 6267 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6268 NewTL.setKWLoc(TL.getKWLoc()); 6269 NewTL.setLParenLoc(TL.getLParenLoc()); 6270 NewTL.setRParenLoc(TL.getRParenLoc()); 6271 6272 return Result; 6273 } 6274 6275 template <typename Derived> 6276 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6277 PipeTypeLoc TL) { 6278 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6279 if (ValueType.isNull()) 6280 return QualType(); 6281 6282 QualType Result = TL.getType(); 6283 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6284 const PipeType *PT = Result->castAs<PipeType>(); 6285 bool isReadPipe = PT->isReadOnly(); 6286 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6287 if (Result.isNull()) 6288 return QualType(); 6289 } 6290 6291 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6292 NewTL.setKWLoc(TL.getKWLoc()); 6293 6294 return Result; 6295 } 6296 6297 template <typename Derived> 6298 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB, 6299 ExtIntTypeLoc TL) { 6300 const ExtIntType *EIT = TL.getTypePtr(); 6301 QualType Result = TL.getType(); 6302 6303 if (getDerived().AlwaysRebuild()) { 6304 Result = getDerived().RebuildExtIntType(EIT->isUnsigned(), 6305 EIT->getNumBits(), TL.getNameLoc()); 6306 if (Result.isNull()) 6307 return QualType(); 6308 } 6309 6310 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6311 NewTL.setNameLoc(TL.getNameLoc()); 6312 return Result; 6313 } 6314 6315 template <typename Derived> 6316 QualType TreeTransform<Derived>::TransformDependentExtIntType( 6317 TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) { 6318 const DependentExtIntType *EIT = TL.getTypePtr(); 6319 6320 EnterExpressionEvaluationContext Unevaluated( 6321 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6322 ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr()); 6323 BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr); 6324 6325 if (BitsExpr.isInvalid()) 6326 return QualType(); 6327 6328 QualType Result = TL.getType(); 6329 6330 if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) { 6331 Result = getDerived().RebuildDependentExtIntType( 6332 EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc()); 6333 6334 if (Result.isNull()) 6335 return QualType(); 6336 } 6337 6338 if (isa<DependentExtIntType>(Result)) { 6339 DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result); 6340 NewTL.setNameLoc(TL.getNameLoc()); 6341 } else { 6342 ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result); 6343 NewTL.setNameLoc(TL.getNameLoc()); 6344 } 6345 return Result; 6346 } 6347 6348 /// Simple iterator that traverses the template arguments in a 6349 /// container that provides a \c getArgLoc() member function. 6350 /// 6351 /// This iterator is intended to be used with the iterator form of 6352 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6353 template<typename ArgLocContainer> 6354 class TemplateArgumentLocContainerIterator { 6355 ArgLocContainer *Container; 6356 unsigned Index; 6357 6358 public: 6359 typedef TemplateArgumentLoc value_type; 6360 typedef TemplateArgumentLoc reference; 6361 typedef int difference_type; 6362 typedef std::input_iterator_tag iterator_category; 6363 6364 class pointer { 6365 TemplateArgumentLoc Arg; 6366 6367 public: 6368 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6369 6370 const TemplateArgumentLoc *operator->() const { 6371 return &Arg; 6372 } 6373 }; 6374 6375 6376 TemplateArgumentLocContainerIterator() {} 6377 6378 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6379 unsigned Index) 6380 : Container(&Container), Index(Index) { } 6381 6382 TemplateArgumentLocContainerIterator &operator++() { 6383 ++Index; 6384 return *this; 6385 } 6386 6387 TemplateArgumentLocContainerIterator operator++(int) { 6388 TemplateArgumentLocContainerIterator Old(*this); 6389 ++(*this); 6390 return Old; 6391 } 6392 6393 TemplateArgumentLoc operator*() const { 6394 return Container->getArgLoc(Index); 6395 } 6396 6397 pointer operator->() const { 6398 return pointer(Container->getArgLoc(Index)); 6399 } 6400 6401 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6402 const TemplateArgumentLocContainerIterator &Y) { 6403 return X.Container == Y.Container && X.Index == Y.Index; 6404 } 6405 6406 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6407 const TemplateArgumentLocContainerIterator &Y) { 6408 return !(X == Y); 6409 } 6410 }; 6411 6412 template<typename Derived> 6413 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6414 AutoTypeLoc TL) { 6415 const AutoType *T = TL.getTypePtr(); 6416 QualType OldDeduced = T->getDeducedType(); 6417 QualType NewDeduced; 6418 if (!OldDeduced.isNull()) { 6419 NewDeduced = getDerived().TransformType(OldDeduced); 6420 if (NewDeduced.isNull()) 6421 return QualType(); 6422 } 6423 6424 ConceptDecl *NewCD = nullptr; 6425 TemplateArgumentListInfo NewTemplateArgs; 6426 NestedNameSpecifierLoc NewNestedNameSpec; 6427 if (TL.getTypePtr()->isConstrained()) { 6428 NewCD = cast_or_null<ConceptDecl>( 6429 getDerived().TransformDecl( 6430 TL.getConceptNameLoc(), 6431 TL.getTypePtr()->getTypeConstraintConcept())); 6432 6433 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6434 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6435 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6436 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6437 ArgIterator(TL, 6438 TL.getNumArgs()), 6439 NewTemplateArgs)) 6440 return QualType(); 6441 6442 if (TL.getNestedNameSpecifierLoc()) { 6443 NewNestedNameSpec 6444 = getDerived().TransformNestedNameSpecifierLoc( 6445 TL.getNestedNameSpecifierLoc()); 6446 if (!NewNestedNameSpec) 6447 return QualType(); 6448 } 6449 } 6450 6451 QualType Result = TL.getType(); 6452 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6453 T->isDependentType()) { 6454 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6455 NewArgList.reserve(NewArgList.size()); 6456 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6457 NewArgList.push_back(ArgLoc.getArgument()); 6458 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6459 NewArgList); 6460 if (Result.isNull()) 6461 return QualType(); 6462 } 6463 6464 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6465 NewTL.setNameLoc(TL.getNameLoc()); 6466 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6467 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6468 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6469 NewTL.setFoundDecl(TL.getFoundDecl()); 6470 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6471 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6472 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6473 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6474 6475 return Result; 6476 } 6477 6478 template <typename Derived> 6479 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6480 TypeLocBuilder &TLB, 6481 TemplateSpecializationTypeLoc TL, 6482 TemplateName Template) { 6483 TemplateArgumentListInfo NewTemplateArgs; 6484 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6485 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6486 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6487 ArgIterator; 6488 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6489 ArgIterator(TL, TL.getNumArgs()), 6490 NewTemplateArgs)) 6491 return QualType(); 6492 6493 // FIXME: maybe don't rebuild if all the template arguments are the same. 6494 6495 QualType Result = 6496 getDerived().RebuildTemplateSpecializationType(Template, 6497 TL.getTemplateNameLoc(), 6498 NewTemplateArgs); 6499 6500 if (!Result.isNull()) { 6501 // Specializations of template template parameters are represented as 6502 // TemplateSpecializationTypes, and substitution of type alias templates 6503 // within a dependent context can transform them into 6504 // DependentTemplateSpecializationTypes. 6505 if (isa<DependentTemplateSpecializationType>(Result)) { 6506 DependentTemplateSpecializationTypeLoc NewTL 6507 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6508 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6509 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6510 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6511 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6512 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6513 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6514 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6515 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6516 return Result; 6517 } 6518 6519 TemplateSpecializationTypeLoc NewTL 6520 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6521 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6522 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6523 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6524 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6525 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6526 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6527 } 6528 6529 return Result; 6530 } 6531 6532 template <typename Derived> 6533 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6534 TypeLocBuilder &TLB, 6535 DependentTemplateSpecializationTypeLoc TL, 6536 TemplateName Template, 6537 CXXScopeSpec &SS) { 6538 TemplateArgumentListInfo NewTemplateArgs; 6539 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6540 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6541 typedef TemplateArgumentLocContainerIterator< 6542 DependentTemplateSpecializationTypeLoc> ArgIterator; 6543 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6544 ArgIterator(TL, TL.getNumArgs()), 6545 NewTemplateArgs)) 6546 return QualType(); 6547 6548 // FIXME: maybe don't rebuild if all the template arguments are the same. 6549 6550 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6551 QualType Result 6552 = getSema().Context.getDependentTemplateSpecializationType( 6553 TL.getTypePtr()->getKeyword(), 6554 DTN->getQualifier(), 6555 DTN->getIdentifier(), 6556 NewTemplateArgs); 6557 6558 DependentTemplateSpecializationTypeLoc NewTL 6559 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6560 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6561 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6562 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6563 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6564 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6565 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6566 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6567 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6568 return Result; 6569 } 6570 6571 QualType Result 6572 = getDerived().RebuildTemplateSpecializationType(Template, 6573 TL.getTemplateNameLoc(), 6574 NewTemplateArgs); 6575 6576 if (!Result.isNull()) { 6577 /// FIXME: Wrap this in an elaborated-type-specifier? 6578 TemplateSpecializationTypeLoc NewTL 6579 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6580 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6581 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6582 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6583 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6584 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6585 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6586 } 6587 6588 return Result; 6589 } 6590 6591 template<typename Derived> 6592 QualType 6593 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6594 ElaboratedTypeLoc TL) { 6595 const ElaboratedType *T = TL.getTypePtr(); 6596 6597 NestedNameSpecifierLoc QualifierLoc; 6598 // NOTE: the qualifier in an ElaboratedType is optional. 6599 if (TL.getQualifierLoc()) { 6600 QualifierLoc 6601 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6602 if (!QualifierLoc) 6603 return QualType(); 6604 } 6605 6606 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6607 if (NamedT.isNull()) 6608 return QualType(); 6609 6610 // C++0x [dcl.type.elab]p2: 6611 // If the identifier resolves to a typedef-name or the simple-template-id 6612 // resolves to an alias template specialization, the 6613 // elaborated-type-specifier is ill-formed. 6614 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6615 if (const TemplateSpecializationType *TST = 6616 NamedT->getAs<TemplateSpecializationType>()) { 6617 TemplateName Template = TST->getTemplateName(); 6618 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6619 Template.getAsTemplateDecl())) { 6620 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6621 diag::err_tag_reference_non_tag) 6622 << TAT << Sema::NTK_TypeAliasTemplate 6623 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6624 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6625 } 6626 } 6627 } 6628 6629 QualType Result = TL.getType(); 6630 if (getDerived().AlwaysRebuild() || 6631 QualifierLoc != TL.getQualifierLoc() || 6632 NamedT != T->getNamedType()) { 6633 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6634 T->getKeyword(), 6635 QualifierLoc, NamedT); 6636 if (Result.isNull()) 6637 return QualType(); 6638 } 6639 6640 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6641 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6642 NewTL.setQualifierLoc(QualifierLoc); 6643 return Result; 6644 } 6645 6646 template<typename Derived> 6647 QualType TreeTransform<Derived>::TransformAttributedType( 6648 TypeLocBuilder &TLB, 6649 AttributedTypeLoc TL) { 6650 const AttributedType *oldType = TL.getTypePtr(); 6651 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6652 if (modifiedType.isNull()) 6653 return QualType(); 6654 6655 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6656 const Attr *oldAttr = TL.getAttr(); 6657 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6658 if (oldAttr && !newAttr) 6659 return QualType(); 6660 6661 QualType result = TL.getType(); 6662 6663 // FIXME: dependent operand expressions? 6664 if (getDerived().AlwaysRebuild() || 6665 modifiedType != oldType->getModifiedType()) { 6666 // TODO: this is really lame; we should really be rebuilding the 6667 // equivalent type from first principles. 6668 QualType equivalentType 6669 = getDerived().TransformType(oldType->getEquivalentType()); 6670 if (equivalentType.isNull()) 6671 return QualType(); 6672 6673 // Check whether we can add nullability; it is only represented as 6674 // type sugar, and therefore cannot be diagnosed in any other way. 6675 if (auto nullability = oldType->getImmediateNullability()) { 6676 if (!modifiedType->canHaveNullability()) { 6677 SemaRef.Diag(TL.getAttr()->getLocation(), 6678 diag::err_nullability_nonpointer) 6679 << DiagNullabilityKind(*nullability, false) << modifiedType; 6680 return QualType(); 6681 } 6682 } 6683 6684 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6685 modifiedType, 6686 equivalentType); 6687 } 6688 6689 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6690 newTL.setAttr(newAttr); 6691 return result; 6692 } 6693 6694 template<typename Derived> 6695 QualType 6696 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6697 ParenTypeLoc TL) { 6698 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6699 if (Inner.isNull()) 6700 return QualType(); 6701 6702 QualType Result = TL.getType(); 6703 if (getDerived().AlwaysRebuild() || 6704 Inner != TL.getInnerLoc().getType()) { 6705 Result = getDerived().RebuildParenType(Inner); 6706 if (Result.isNull()) 6707 return QualType(); 6708 } 6709 6710 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6711 NewTL.setLParenLoc(TL.getLParenLoc()); 6712 NewTL.setRParenLoc(TL.getRParenLoc()); 6713 return Result; 6714 } 6715 6716 template <typename Derived> 6717 QualType 6718 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6719 MacroQualifiedTypeLoc TL) { 6720 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6721 if (Inner.isNull()) 6722 return QualType(); 6723 6724 QualType Result = TL.getType(); 6725 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6726 Result = 6727 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6728 if (Result.isNull()) 6729 return QualType(); 6730 } 6731 6732 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6733 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6734 return Result; 6735 } 6736 6737 template<typename Derived> 6738 QualType TreeTransform<Derived>::TransformDependentNameType( 6739 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6740 return TransformDependentNameType(TLB, TL, false); 6741 } 6742 6743 template<typename Derived> 6744 QualType TreeTransform<Derived>::TransformDependentNameType( 6745 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6746 const DependentNameType *T = TL.getTypePtr(); 6747 6748 NestedNameSpecifierLoc QualifierLoc 6749 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6750 if (!QualifierLoc) 6751 return QualType(); 6752 6753 QualType Result 6754 = getDerived().RebuildDependentNameType(T->getKeyword(), 6755 TL.getElaboratedKeywordLoc(), 6756 QualifierLoc, 6757 T->getIdentifier(), 6758 TL.getNameLoc(), 6759 DeducedTSTContext); 6760 if (Result.isNull()) 6761 return QualType(); 6762 6763 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6764 QualType NamedT = ElabT->getNamedType(); 6765 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6766 6767 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6768 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6769 NewTL.setQualifierLoc(QualifierLoc); 6770 } else { 6771 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6772 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6773 NewTL.setQualifierLoc(QualifierLoc); 6774 NewTL.setNameLoc(TL.getNameLoc()); 6775 } 6776 return Result; 6777 } 6778 6779 template<typename Derived> 6780 QualType TreeTransform<Derived>:: 6781 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6782 DependentTemplateSpecializationTypeLoc TL) { 6783 NestedNameSpecifierLoc QualifierLoc; 6784 if (TL.getQualifierLoc()) { 6785 QualifierLoc 6786 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6787 if (!QualifierLoc) 6788 return QualType(); 6789 } 6790 6791 return getDerived() 6792 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6793 } 6794 6795 template<typename Derived> 6796 QualType TreeTransform<Derived>:: 6797 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6798 DependentTemplateSpecializationTypeLoc TL, 6799 NestedNameSpecifierLoc QualifierLoc) { 6800 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6801 6802 TemplateArgumentListInfo NewTemplateArgs; 6803 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6804 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6805 6806 typedef TemplateArgumentLocContainerIterator< 6807 DependentTemplateSpecializationTypeLoc> ArgIterator; 6808 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6809 ArgIterator(TL, TL.getNumArgs()), 6810 NewTemplateArgs)) 6811 return QualType(); 6812 6813 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6814 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6815 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6816 /*AllowInjectedClassName*/ false); 6817 if (Result.isNull()) 6818 return QualType(); 6819 6820 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6821 QualType NamedT = ElabT->getNamedType(); 6822 6823 // Copy information relevant to the template specialization. 6824 TemplateSpecializationTypeLoc NamedTL 6825 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6826 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6827 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6828 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6829 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6830 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6831 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6832 6833 // Copy information relevant to the elaborated type. 6834 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6835 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6836 NewTL.setQualifierLoc(QualifierLoc); 6837 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6838 DependentTemplateSpecializationTypeLoc SpecTL 6839 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6840 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6841 SpecTL.setQualifierLoc(QualifierLoc); 6842 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6843 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6844 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6845 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6846 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6847 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6848 } else { 6849 TemplateSpecializationTypeLoc SpecTL 6850 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6851 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6852 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6853 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6854 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6855 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6856 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6857 } 6858 return Result; 6859 } 6860 6861 template<typename Derived> 6862 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6863 PackExpansionTypeLoc TL) { 6864 QualType Pattern 6865 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6866 if (Pattern.isNull()) 6867 return QualType(); 6868 6869 QualType Result = TL.getType(); 6870 if (getDerived().AlwaysRebuild() || 6871 Pattern != TL.getPatternLoc().getType()) { 6872 Result = getDerived().RebuildPackExpansionType(Pattern, 6873 TL.getPatternLoc().getSourceRange(), 6874 TL.getEllipsisLoc(), 6875 TL.getTypePtr()->getNumExpansions()); 6876 if (Result.isNull()) 6877 return QualType(); 6878 } 6879 6880 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6881 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6882 return Result; 6883 } 6884 6885 template<typename Derived> 6886 QualType 6887 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6888 ObjCInterfaceTypeLoc TL) { 6889 // ObjCInterfaceType is never dependent. 6890 TLB.pushFullCopy(TL); 6891 return TL.getType(); 6892 } 6893 6894 template<typename Derived> 6895 QualType 6896 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6897 ObjCTypeParamTypeLoc TL) { 6898 const ObjCTypeParamType *T = TL.getTypePtr(); 6899 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6900 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6901 if (!OTP) 6902 return QualType(); 6903 6904 QualType Result = TL.getType(); 6905 if (getDerived().AlwaysRebuild() || 6906 OTP != T->getDecl()) { 6907 Result = getDerived().RebuildObjCTypeParamType(OTP, 6908 TL.getProtocolLAngleLoc(), 6909 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6910 TL.getNumProtocols()), 6911 TL.getProtocolLocs(), 6912 TL.getProtocolRAngleLoc()); 6913 if (Result.isNull()) 6914 return QualType(); 6915 } 6916 6917 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6918 if (TL.getNumProtocols()) { 6919 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6920 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6921 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6922 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6923 } 6924 return Result; 6925 } 6926 6927 template<typename Derived> 6928 QualType 6929 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6930 ObjCObjectTypeLoc TL) { 6931 // Transform base type. 6932 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6933 if (BaseType.isNull()) 6934 return QualType(); 6935 6936 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6937 6938 // Transform type arguments. 6939 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6940 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6941 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6942 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6943 QualType TypeArg = TypeArgInfo->getType(); 6944 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6945 AnyChanged = true; 6946 6947 // We have a pack expansion. Instantiate it. 6948 const auto *PackExpansion = PackExpansionLoc.getType() 6949 ->castAs<PackExpansionType>(); 6950 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6951 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6952 Unexpanded); 6953 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6954 6955 // Determine whether the set of unexpanded parameter packs can 6956 // and should be expanded. 6957 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6958 bool Expand = false; 6959 bool RetainExpansion = false; 6960 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6961 if (getDerived().TryExpandParameterPacks( 6962 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6963 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6964 return QualType(); 6965 6966 if (!Expand) { 6967 // We can't expand this pack expansion into separate arguments yet; 6968 // just substitute into the pattern and create a new pack expansion 6969 // type. 6970 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6971 6972 TypeLocBuilder TypeArgBuilder; 6973 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6974 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6975 PatternLoc); 6976 if (NewPatternType.isNull()) 6977 return QualType(); 6978 6979 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6980 NewPatternType, NumExpansions); 6981 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6982 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6983 NewTypeArgInfos.push_back( 6984 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6985 continue; 6986 } 6987 6988 // Substitute into the pack expansion pattern for each slice of the 6989 // pack. 6990 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6991 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6992 6993 TypeLocBuilder TypeArgBuilder; 6994 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6995 6996 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6997 PatternLoc); 6998 if (NewTypeArg.isNull()) 6999 return QualType(); 7000 7001 NewTypeArgInfos.push_back( 7002 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7003 } 7004 7005 continue; 7006 } 7007 7008 TypeLocBuilder TypeArgBuilder; 7009 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 7010 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 7011 if (NewTypeArg.isNull()) 7012 return QualType(); 7013 7014 // If nothing changed, just keep the old TypeSourceInfo. 7015 if (NewTypeArg == TypeArg) { 7016 NewTypeArgInfos.push_back(TypeArgInfo); 7017 continue; 7018 } 7019 7020 NewTypeArgInfos.push_back( 7021 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 7022 AnyChanged = true; 7023 } 7024 7025 QualType Result = TL.getType(); 7026 if (getDerived().AlwaysRebuild() || AnyChanged) { 7027 // Rebuild the type. 7028 Result = getDerived().RebuildObjCObjectType( 7029 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 7030 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 7031 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 7032 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 7033 7034 if (Result.isNull()) 7035 return QualType(); 7036 } 7037 7038 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 7039 NewT.setHasBaseTypeAsWritten(true); 7040 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 7041 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 7042 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 7043 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 7044 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 7045 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 7046 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 7047 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 7048 return Result; 7049 } 7050 7051 template<typename Derived> 7052 QualType 7053 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 7054 ObjCObjectPointerTypeLoc TL) { 7055 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 7056 if (PointeeType.isNull()) 7057 return QualType(); 7058 7059 QualType Result = TL.getType(); 7060 if (getDerived().AlwaysRebuild() || 7061 PointeeType != TL.getPointeeLoc().getType()) { 7062 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 7063 TL.getStarLoc()); 7064 if (Result.isNull()) 7065 return QualType(); 7066 } 7067 7068 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 7069 NewT.setStarLoc(TL.getStarLoc()); 7070 return Result; 7071 } 7072 7073 //===----------------------------------------------------------------------===// 7074 // Statement transformation 7075 //===----------------------------------------------------------------------===// 7076 template<typename Derived> 7077 StmtResult 7078 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 7079 return S; 7080 } 7081 7082 template<typename Derived> 7083 StmtResult 7084 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 7085 return getDerived().TransformCompoundStmt(S, false); 7086 } 7087 7088 template<typename Derived> 7089 StmtResult 7090 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 7091 bool IsStmtExpr) { 7092 Sema::CompoundScopeRAII CompoundScope(getSema()); 7093 7094 const Stmt *ExprResult = S->getStmtExprResult(); 7095 bool SubStmtInvalid = false; 7096 bool SubStmtChanged = false; 7097 SmallVector<Stmt*, 8> Statements; 7098 for (auto *B : S->body()) { 7099 StmtResult Result = getDerived().TransformStmt( 7100 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 7101 7102 if (Result.isInvalid()) { 7103 // Immediately fail if this was a DeclStmt, since it's very 7104 // likely that this will cause problems for future statements. 7105 if (isa<DeclStmt>(B)) 7106 return StmtError(); 7107 7108 // Otherwise, just keep processing substatements and fail later. 7109 SubStmtInvalid = true; 7110 continue; 7111 } 7112 7113 SubStmtChanged = SubStmtChanged || Result.get() != B; 7114 Statements.push_back(Result.getAs<Stmt>()); 7115 } 7116 7117 if (SubStmtInvalid) 7118 return StmtError(); 7119 7120 if (!getDerived().AlwaysRebuild() && 7121 !SubStmtChanged) 7122 return S; 7123 7124 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 7125 Statements, 7126 S->getRBracLoc(), 7127 IsStmtExpr); 7128 } 7129 7130 template<typename Derived> 7131 StmtResult 7132 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 7133 ExprResult LHS, RHS; 7134 { 7135 EnterExpressionEvaluationContext Unevaluated( 7136 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 7137 7138 // Transform the left-hand case value. 7139 LHS = getDerived().TransformExpr(S->getLHS()); 7140 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 7141 if (LHS.isInvalid()) 7142 return StmtError(); 7143 7144 // Transform the right-hand case value (for the GNU case-range extension). 7145 RHS = getDerived().TransformExpr(S->getRHS()); 7146 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 7147 if (RHS.isInvalid()) 7148 return StmtError(); 7149 } 7150 7151 // Build the case statement. 7152 // Case statements are always rebuilt so that they will attached to their 7153 // transformed switch statement. 7154 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 7155 LHS.get(), 7156 S->getEllipsisLoc(), 7157 RHS.get(), 7158 S->getColonLoc()); 7159 if (Case.isInvalid()) 7160 return StmtError(); 7161 7162 // Transform the statement following the case 7163 StmtResult SubStmt = 7164 getDerived().TransformStmt(S->getSubStmt()); 7165 if (SubStmt.isInvalid()) 7166 return StmtError(); 7167 7168 // Attach the body to the case statement 7169 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 7170 } 7171 7172 template <typename Derived> 7173 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 7174 // Transform the statement following the default case 7175 StmtResult SubStmt = 7176 getDerived().TransformStmt(S->getSubStmt()); 7177 if (SubStmt.isInvalid()) 7178 return StmtError(); 7179 7180 // Default statements are always rebuilt 7181 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 7182 SubStmt.get()); 7183 } 7184 7185 template<typename Derived> 7186 StmtResult 7187 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 7188 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7189 if (SubStmt.isInvalid()) 7190 return StmtError(); 7191 7192 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 7193 S->getDecl()); 7194 if (!LD) 7195 return StmtError(); 7196 7197 // If we're transforming "in-place" (we're not creating new local 7198 // declarations), assume we're replacing the old label statement 7199 // and clear out the reference to it. 7200 if (LD == S->getDecl()) 7201 S->getDecl()->setStmt(nullptr); 7202 7203 // FIXME: Pass the real colon location in. 7204 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 7205 cast<LabelDecl>(LD), SourceLocation(), 7206 SubStmt.get()); 7207 } 7208 7209 template <typename Derived> 7210 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 7211 if (!R) 7212 return R; 7213 7214 switch (R->getKind()) { 7215 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 7216 #define ATTR(X) 7217 #define PRAGMA_SPELLING_ATTR(X) \ 7218 case attr::X: \ 7219 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 7220 #include "clang/Basic/AttrList.inc" 7221 default: 7222 return R; 7223 } 7224 } 7225 7226 template <typename Derived> 7227 StmtResult 7228 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7229 StmtDiscardKind SDK) { 7230 bool AttrsChanged = false; 7231 SmallVector<const Attr *, 1> Attrs; 7232 7233 // Visit attributes and keep track if any are transformed. 7234 for (const auto *I : S->getAttrs()) { 7235 const Attr *R = getDerived().TransformAttr(I); 7236 AttrsChanged |= (I != R); 7237 Attrs.push_back(R); 7238 } 7239 7240 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7241 if (SubStmt.isInvalid()) 7242 return StmtError(); 7243 7244 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7245 return S; 7246 7247 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7248 SubStmt.get()); 7249 } 7250 7251 template<typename Derived> 7252 StmtResult 7253 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7254 // Transform the initialization statement 7255 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7256 if (Init.isInvalid()) 7257 return StmtError(); 7258 7259 // Transform the condition 7260 Sema::ConditionResult Cond = getDerived().TransformCondition( 7261 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7262 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7263 : Sema::ConditionKind::Boolean); 7264 if (Cond.isInvalid()) 7265 return StmtError(); 7266 7267 // If this is a constexpr if, determine which arm we should instantiate. 7268 llvm::Optional<bool> ConstexprConditionValue; 7269 if (S->isConstexpr()) 7270 ConstexprConditionValue = Cond.getKnownValue(); 7271 7272 // Transform the "then" branch. 7273 StmtResult Then; 7274 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7275 Then = getDerived().TransformStmt(S->getThen()); 7276 if (Then.isInvalid()) 7277 return StmtError(); 7278 } else { 7279 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7280 } 7281 7282 // Transform the "else" branch. 7283 StmtResult Else; 7284 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7285 Else = getDerived().TransformStmt(S->getElse()); 7286 if (Else.isInvalid()) 7287 return StmtError(); 7288 } 7289 7290 if (!getDerived().AlwaysRebuild() && 7291 Init.get() == S->getInit() && 7292 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7293 Then.get() == S->getThen() && 7294 Else.get() == S->getElse()) 7295 return S; 7296 7297 return getDerived().RebuildIfStmt( 7298 S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond, 7299 S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get()); 7300 } 7301 7302 template<typename Derived> 7303 StmtResult 7304 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7305 // Transform the initialization statement 7306 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7307 if (Init.isInvalid()) 7308 return StmtError(); 7309 7310 // Transform the condition. 7311 Sema::ConditionResult Cond = getDerived().TransformCondition( 7312 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7313 Sema::ConditionKind::Switch); 7314 if (Cond.isInvalid()) 7315 return StmtError(); 7316 7317 // Rebuild the switch statement. 7318 StmtResult Switch = 7319 getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(), 7320 Init.get(), Cond, S->getRParenLoc()); 7321 if (Switch.isInvalid()) 7322 return StmtError(); 7323 7324 // Transform the body of the switch statement. 7325 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7326 if (Body.isInvalid()) 7327 return StmtError(); 7328 7329 // Complete the switch statement. 7330 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7331 Body.get()); 7332 } 7333 7334 template<typename Derived> 7335 StmtResult 7336 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7337 // Transform the condition 7338 Sema::ConditionResult Cond = getDerived().TransformCondition( 7339 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7340 Sema::ConditionKind::Boolean); 7341 if (Cond.isInvalid()) 7342 return StmtError(); 7343 7344 // Transform the body 7345 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7346 if (Body.isInvalid()) 7347 return StmtError(); 7348 7349 if (!getDerived().AlwaysRebuild() && 7350 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7351 Body.get() == S->getBody()) 7352 return Owned(S); 7353 7354 return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(), 7355 Cond, S->getRParenLoc(), Body.get()); 7356 } 7357 7358 template<typename Derived> 7359 StmtResult 7360 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7361 // Transform the body 7362 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7363 if (Body.isInvalid()) 7364 return StmtError(); 7365 7366 // Transform the condition 7367 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7368 if (Cond.isInvalid()) 7369 return StmtError(); 7370 7371 if (!getDerived().AlwaysRebuild() && 7372 Cond.get() == S->getCond() && 7373 Body.get() == S->getBody()) 7374 return S; 7375 7376 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7377 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7378 S->getRParenLoc()); 7379 } 7380 7381 template<typename Derived> 7382 StmtResult 7383 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7384 if (getSema().getLangOpts().OpenMP) 7385 getSema().startOpenMPLoop(); 7386 7387 // Transform the initialization statement 7388 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7389 if (Init.isInvalid()) 7390 return StmtError(); 7391 7392 // In OpenMP loop region loop control variable must be captured and be 7393 // private. Perform analysis of first part (if any). 7394 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7395 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7396 7397 // Transform the condition 7398 Sema::ConditionResult Cond = getDerived().TransformCondition( 7399 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7400 Sema::ConditionKind::Boolean); 7401 if (Cond.isInvalid()) 7402 return StmtError(); 7403 7404 // Transform the increment 7405 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7406 if (Inc.isInvalid()) 7407 return StmtError(); 7408 7409 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7410 if (S->getInc() && !FullInc.get()) 7411 return StmtError(); 7412 7413 // Transform the body 7414 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7415 if (Body.isInvalid()) 7416 return StmtError(); 7417 7418 if (!getDerived().AlwaysRebuild() && 7419 Init.get() == S->getInit() && 7420 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7421 Inc.get() == S->getInc() && 7422 Body.get() == S->getBody()) 7423 return S; 7424 7425 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7426 Init.get(), Cond, FullInc, 7427 S->getRParenLoc(), Body.get()); 7428 } 7429 7430 template<typename Derived> 7431 StmtResult 7432 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7433 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7434 S->getLabel()); 7435 if (!LD) 7436 return StmtError(); 7437 7438 // Goto statements must always be rebuilt, to resolve the label. 7439 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7440 cast<LabelDecl>(LD)); 7441 } 7442 7443 template<typename Derived> 7444 StmtResult 7445 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7446 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7447 if (Target.isInvalid()) 7448 return StmtError(); 7449 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7450 7451 if (!getDerived().AlwaysRebuild() && 7452 Target.get() == S->getTarget()) 7453 return S; 7454 7455 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7456 Target.get()); 7457 } 7458 7459 template<typename Derived> 7460 StmtResult 7461 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7462 return S; 7463 } 7464 7465 template<typename Derived> 7466 StmtResult 7467 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7468 return S; 7469 } 7470 7471 template<typename Derived> 7472 StmtResult 7473 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7474 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7475 /*NotCopyInit*/false); 7476 if (Result.isInvalid()) 7477 return StmtError(); 7478 7479 // FIXME: We always rebuild the return statement because there is no way 7480 // to tell whether the return type of the function has changed. 7481 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7482 } 7483 7484 template<typename Derived> 7485 StmtResult 7486 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7487 bool DeclChanged = false; 7488 SmallVector<Decl *, 4> Decls; 7489 for (auto *D : S->decls()) { 7490 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7491 if (!Transformed) 7492 return StmtError(); 7493 7494 if (Transformed != D) 7495 DeclChanged = true; 7496 7497 Decls.push_back(Transformed); 7498 } 7499 7500 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7501 return S; 7502 7503 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7504 } 7505 7506 template<typename Derived> 7507 StmtResult 7508 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7509 7510 SmallVector<Expr*, 8> Constraints; 7511 SmallVector<Expr*, 8> Exprs; 7512 SmallVector<IdentifierInfo *, 4> Names; 7513 7514 ExprResult AsmString; 7515 SmallVector<Expr*, 8> Clobbers; 7516 7517 bool ExprsChanged = false; 7518 7519 // Go through the outputs. 7520 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7521 Names.push_back(S->getOutputIdentifier(I)); 7522 7523 // No need to transform the constraint literal. 7524 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7525 7526 // Transform the output expr. 7527 Expr *OutputExpr = S->getOutputExpr(I); 7528 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7529 if (Result.isInvalid()) 7530 return StmtError(); 7531 7532 ExprsChanged |= Result.get() != OutputExpr; 7533 7534 Exprs.push_back(Result.get()); 7535 } 7536 7537 // Go through the inputs. 7538 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7539 Names.push_back(S->getInputIdentifier(I)); 7540 7541 // No need to transform the constraint literal. 7542 Constraints.push_back(S->getInputConstraintLiteral(I)); 7543 7544 // Transform the input expr. 7545 Expr *InputExpr = S->getInputExpr(I); 7546 ExprResult Result = getDerived().TransformExpr(InputExpr); 7547 if (Result.isInvalid()) 7548 return StmtError(); 7549 7550 ExprsChanged |= Result.get() != InputExpr; 7551 7552 Exprs.push_back(Result.get()); 7553 } 7554 7555 // Go through the Labels. 7556 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7557 Names.push_back(S->getLabelIdentifier(I)); 7558 7559 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7560 if (Result.isInvalid()) 7561 return StmtError(); 7562 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7563 Exprs.push_back(Result.get()); 7564 } 7565 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7566 return S; 7567 7568 // Go through the clobbers. 7569 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7570 Clobbers.push_back(S->getClobberStringLiteral(I)); 7571 7572 // No need to transform the asm string literal. 7573 AsmString = S->getAsmString(); 7574 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7575 S->isVolatile(), S->getNumOutputs(), 7576 S->getNumInputs(), Names.data(), 7577 Constraints, Exprs, AsmString.get(), 7578 Clobbers, S->getNumLabels(), 7579 S->getRParenLoc()); 7580 } 7581 7582 template<typename Derived> 7583 StmtResult 7584 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7585 ArrayRef<Token> AsmToks = 7586 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7587 7588 bool HadError = false, HadChange = false; 7589 7590 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7591 SmallVector<Expr*, 8> TransformedExprs; 7592 TransformedExprs.reserve(SrcExprs.size()); 7593 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7594 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7595 if (!Result.isUsable()) { 7596 HadError = true; 7597 } else { 7598 HadChange |= (Result.get() != SrcExprs[i]); 7599 TransformedExprs.push_back(Result.get()); 7600 } 7601 } 7602 7603 if (HadError) return StmtError(); 7604 if (!HadChange && !getDerived().AlwaysRebuild()) 7605 return Owned(S); 7606 7607 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7608 AsmToks, S->getAsmString(), 7609 S->getNumOutputs(), S->getNumInputs(), 7610 S->getAllConstraints(), S->getClobbers(), 7611 TransformedExprs, S->getEndLoc()); 7612 } 7613 7614 // C++ Coroutines TS 7615 7616 template<typename Derived> 7617 StmtResult 7618 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7619 auto *ScopeInfo = SemaRef.getCurFunction(); 7620 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7621 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7622 ScopeInfo->NeedsCoroutineSuspends && 7623 ScopeInfo->CoroutineSuspends.first == nullptr && 7624 ScopeInfo->CoroutineSuspends.second == nullptr && 7625 "expected clean scope info"); 7626 7627 // Set that we have (possibly-invalid) suspend points before we do anything 7628 // that may fail. 7629 ScopeInfo->setNeedsCoroutineSuspends(false); 7630 7631 // We re-build the coroutine promise object (and the coroutine parameters its 7632 // type and constructor depend on) based on the types used in our current 7633 // function. We must do so, and set it on the current FunctionScopeInfo, 7634 // before attempting to transform the other parts of the coroutine body 7635 // statement, such as the implicit suspend statements (because those 7636 // statements reference the FunctionScopeInfo::CoroutinePromise). 7637 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7638 return StmtError(); 7639 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7640 if (!Promise) 7641 return StmtError(); 7642 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7643 ScopeInfo->CoroutinePromise = Promise; 7644 7645 // Transform the implicit coroutine statements constructed using dependent 7646 // types during the previous parse: initial and final suspensions, the return 7647 // object, and others. We also transform the coroutine function's body. 7648 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7649 if (InitSuspend.isInvalid()) 7650 return StmtError(); 7651 StmtResult FinalSuspend = 7652 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7653 if (FinalSuspend.isInvalid() || 7654 !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get())) 7655 return StmtError(); 7656 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7657 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7658 7659 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7660 if (BodyRes.isInvalid()) 7661 return StmtError(); 7662 7663 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7664 if (Builder.isInvalid()) 7665 return StmtError(); 7666 7667 Expr *ReturnObject = S->getReturnValueInit(); 7668 assert(ReturnObject && "the return object is expected to be valid"); 7669 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7670 /*NoCopyInit*/ false); 7671 if (Res.isInvalid()) 7672 return StmtError(); 7673 Builder.ReturnValue = Res.get(); 7674 7675 // If during the previous parse the coroutine still had a dependent promise 7676 // statement, we may need to build some implicit coroutine statements 7677 // (such as exception and fallthrough handlers) for the first time. 7678 if (S->hasDependentPromiseType()) { 7679 // We can only build these statements, however, if the current promise type 7680 // is not dependent. 7681 if (!Promise->getType()->isDependentType()) { 7682 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7683 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7684 "these nodes should not have been built yet"); 7685 if (!Builder.buildDependentStatements()) 7686 return StmtError(); 7687 } 7688 } else { 7689 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7690 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7691 if (Res.isInvalid()) 7692 return StmtError(); 7693 Builder.OnFallthrough = Res.get(); 7694 } 7695 7696 if (auto *OnException = S->getExceptionHandler()) { 7697 StmtResult Res = getDerived().TransformStmt(OnException); 7698 if (Res.isInvalid()) 7699 return StmtError(); 7700 Builder.OnException = Res.get(); 7701 } 7702 7703 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7704 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7705 if (Res.isInvalid()) 7706 return StmtError(); 7707 Builder.ReturnStmtOnAllocFailure = Res.get(); 7708 } 7709 7710 // Transform any additional statements we may have already built 7711 assert(S->getAllocate() && S->getDeallocate() && 7712 "allocation and deallocation calls must already be built"); 7713 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7714 if (AllocRes.isInvalid()) 7715 return StmtError(); 7716 Builder.Allocate = AllocRes.get(); 7717 7718 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7719 if (DeallocRes.isInvalid()) 7720 return StmtError(); 7721 Builder.Deallocate = DeallocRes.get(); 7722 7723 assert(S->getResultDecl() && "ResultDecl must already be built"); 7724 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7725 if (ResultDecl.isInvalid()) 7726 return StmtError(); 7727 Builder.ResultDecl = ResultDecl.get(); 7728 7729 if (auto *ReturnStmt = S->getReturnStmt()) { 7730 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7731 if (Res.isInvalid()) 7732 return StmtError(); 7733 Builder.ReturnStmt = Res.get(); 7734 } 7735 } 7736 7737 return getDerived().RebuildCoroutineBodyStmt(Builder); 7738 } 7739 7740 template<typename Derived> 7741 StmtResult 7742 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7743 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7744 /*NotCopyInit*/false); 7745 if (Result.isInvalid()) 7746 return StmtError(); 7747 7748 // Always rebuild; we don't know if this needs to be injected into a new 7749 // context or if the promise type has changed. 7750 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7751 S->isImplicit()); 7752 } 7753 7754 template<typename Derived> 7755 ExprResult 7756 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7757 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7758 /*NotCopyInit*/false); 7759 if (Result.isInvalid()) 7760 return ExprError(); 7761 7762 // Always rebuild; we don't know if this needs to be injected into a new 7763 // context or if the promise type has changed. 7764 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7765 E->isImplicit()); 7766 } 7767 7768 template <typename Derived> 7769 ExprResult 7770 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7771 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7772 /*NotCopyInit*/ false); 7773 if (OperandResult.isInvalid()) 7774 return ExprError(); 7775 7776 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7777 E->getOperatorCoawaitLookup()); 7778 7779 if (LookupResult.isInvalid()) 7780 return ExprError(); 7781 7782 // Always rebuild; we don't know if this needs to be injected into a new 7783 // context or if the promise type has changed. 7784 return getDerived().RebuildDependentCoawaitExpr( 7785 E->getKeywordLoc(), OperandResult.get(), 7786 cast<UnresolvedLookupExpr>(LookupResult.get())); 7787 } 7788 7789 template<typename Derived> 7790 ExprResult 7791 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7792 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7793 /*NotCopyInit*/false); 7794 if (Result.isInvalid()) 7795 return ExprError(); 7796 7797 // Always rebuild; we don't know if this needs to be injected into a new 7798 // context or if the promise type has changed. 7799 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7800 } 7801 7802 // Objective-C Statements. 7803 7804 template<typename Derived> 7805 StmtResult 7806 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7807 // Transform the body of the @try. 7808 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7809 if (TryBody.isInvalid()) 7810 return StmtError(); 7811 7812 // Transform the @catch statements (if present). 7813 bool AnyCatchChanged = false; 7814 SmallVector<Stmt*, 8> CatchStmts; 7815 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7816 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7817 if (Catch.isInvalid()) 7818 return StmtError(); 7819 if (Catch.get() != S->getCatchStmt(I)) 7820 AnyCatchChanged = true; 7821 CatchStmts.push_back(Catch.get()); 7822 } 7823 7824 // Transform the @finally statement (if present). 7825 StmtResult Finally; 7826 if (S->getFinallyStmt()) { 7827 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7828 if (Finally.isInvalid()) 7829 return StmtError(); 7830 } 7831 7832 // If nothing changed, just retain this statement. 7833 if (!getDerived().AlwaysRebuild() && 7834 TryBody.get() == S->getTryBody() && 7835 !AnyCatchChanged && 7836 Finally.get() == S->getFinallyStmt()) 7837 return S; 7838 7839 // Build a new statement. 7840 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7841 CatchStmts, Finally.get()); 7842 } 7843 7844 template<typename Derived> 7845 StmtResult 7846 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7847 // Transform the @catch parameter, if there is one. 7848 VarDecl *Var = nullptr; 7849 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7850 TypeSourceInfo *TSInfo = nullptr; 7851 if (FromVar->getTypeSourceInfo()) { 7852 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7853 if (!TSInfo) 7854 return StmtError(); 7855 } 7856 7857 QualType T; 7858 if (TSInfo) 7859 T = TSInfo->getType(); 7860 else { 7861 T = getDerived().TransformType(FromVar->getType()); 7862 if (T.isNull()) 7863 return StmtError(); 7864 } 7865 7866 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7867 if (!Var) 7868 return StmtError(); 7869 } 7870 7871 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7872 if (Body.isInvalid()) 7873 return StmtError(); 7874 7875 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7876 S->getRParenLoc(), 7877 Var, Body.get()); 7878 } 7879 7880 template<typename Derived> 7881 StmtResult 7882 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7883 // Transform the body. 7884 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7885 if (Body.isInvalid()) 7886 return StmtError(); 7887 7888 // If nothing changed, just retain this statement. 7889 if (!getDerived().AlwaysRebuild() && 7890 Body.get() == S->getFinallyBody()) 7891 return S; 7892 7893 // Build a new statement. 7894 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7895 Body.get()); 7896 } 7897 7898 template<typename Derived> 7899 StmtResult 7900 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7901 ExprResult Operand; 7902 if (S->getThrowExpr()) { 7903 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7904 if (Operand.isInvalid()) 7905 return StmtError(); 7906 } 7907 7908 if (!getDerived().AlwaysRebuild() && 7909 Operand.get() == S->getThrowExpr()) 7910 return S; 7911 7912 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7913 } 7914 7915 template<typename Derived> 7916 StmtResult 7917 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7918 ObjCAtSynchronizedStmt *S) { 7919 // Transform the object we are locking. 7920 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7921 if (Object.isInvalid()) 7922 return StmtError(); 7923 Object = 7924 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7925 Object.get()); 7926 if (Object.isInvalid()) 7927 return StmtError(); 7928 7929 // Transform the body. 7930 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7931 if (Body.isInvalid()) 7932 return StmtError(); 7933 7934 // If nothing change, just retain the current statement. 7935 if (!getDerived().AlwaysRebuild() && 7936 Object.get() == S->getSynchExpr() && 7937 Body.get() == S->getSynchBody()) 7938 return S; 7939 7940 // Build a new statement. 7941 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7942 Object.get(), Body.get()); 7943 } 7944 7945 template<typename Derived> 7946 StmtResult 7947 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7948 ObjCAutoreleasePoolStmt *S) { 7949 // Transform the body. 7950 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7951 if (Body.isInvalid()) 7952 return StmtError(); 7953 7954 // If nothing changed, just retain this statement. 7955 if (!getDerived().AlwaysRebuild() && 7956 Body.get() == S->getSubStmt()) 7957 return S; 7958 7959 // Build a new statement. 7960 return getDerived().RebuildObjCAutoreleasePoolStmt( 7961 S->getAtLoc(), Body.get()); 7962 } 7963 7964 template<typename Derived> 7965 StmtResult 7966 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7967 ObjCForCollectionStmt *S) { 7968 // Transform the element statement. 7969 StmtResult Element = 7970 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7971 if (Element.isInvalid()) 7972 return StmtError(); 7973 7974 // Transform the collection expression. 7975 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7976 if (Collection.isInvalid()) 7977 return StmtError(); 7978 7979 // Transform the body. 7980 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7981 if (Body.isInvalid()) 7982 return StmtError(); 7983 7984 // If nothing changed, just retain this statement. 7985 if (!getDerived().AlwaysRebuild() && 7986 Element.get() == S->getElement() && 7987 Collection.get() == S->getCollection() && 7988 Body.get() == S->getBody()) 7989 return S; 7990 7991 // Build a new statement. 7992 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7993 Element.get(), 7994 Collection.get(), 7995 S->getRParenLoc(), 7996 Body.get()); 7997 } 7998 7999 template <typename Derived> 8000 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 8001 // Transform the exception declaration, if any. 8002 VarDecl *Var = nullptr; 8003 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 8004 TypeSourceInfo *T = 8005 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 8006 if (!T) 8007 return StmtError(); 8008 8009 Var = getDerived().RebuildExceptionDecl( 8010 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 8011 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 8012 if (!Var || Var->isInvalidDecl()) 8013 return StmtError(); 8014 } 8015 8016 // Transform the actual exception handler. 8017 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 8018 if (Handler.isInvalid()) 8019 return StmtError(); 8020 8021 if (!getDerived().AlwaysRebuild() && !Var && 8022 Handler.get() == S->getHandlerBlock()) 8023 return S; 8024 8025 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 8026 } 8027 8028 template <typename Derived> 8029 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 8030 // Transform the try block itself. 8031 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8032 if (TryBlock.isInvalid()) 8033 return StmtError(); 8034 8035 // Transform the handlers. 8036 bool HandlerChanged = false; 8037 SmallVector<Stmt *, 8> Handlers; 8038 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 8039 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 8040 if (Handler.isInvalid()) 8041 return StmtError(); 8042 8043 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 8044 Handlers.push_back(Handler.getAs<Stmt>()); 8045 } 8046 8047 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8048 !HandlerChanged) 8049 return S; 8050 8051 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 8052 Handlers); 8053 } 8054 8055 template<typename Derived> 8056 StmtResult 8057 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 8058 StmtResult Init = 8059 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 8060 if (Init.isInvalid()) 8061 return StmtError(); 8062 8063 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 8064 if (Range.isInvalid()) 8065 return StmtError(); 8066 8067 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 8068 if (Begin.isInvalid()) 8069 return StmtError(); 8070 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 8071 if (End.isInvalid()) 8072 return StmtError(); 8073 8074 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 8075 if (Cond.isInvalid()) 8076 return StmtError(); 8077 if (Cond.get()) 8078 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 8079 if (Cond.isInvalid()) 8080 return StmtError(); 8081 if (Cond.get()) 8082 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 8083 8084 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 8085 if (Inc.isInvalid()) 8086 return StmtError(); 8087 if (Inc.get()) 8088 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 8089 8090 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 8091 if (LoopVar.isInvalid()) 8092 return StmtError(); 8093 8094 StmtResult NewStmt = S; 8095 if (getDerived().AlwaysRebuild() || 8096 Init.get() != S->getInit() || 8097 Range.get() != S->getRangeStmt() || 8098 Begin.get() != S->getBeginStmt() || 8099 End.get() != S->getEndStmt() || 8100 Cond.get() != S->getCond() || 8101 Inc.get() != S->getInc() || 8102 LoopVar.get() != S->getLoopVarStmt()) { 8103 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8104 S->getCoawaitLoc(), Init.get(), 8105 S->getColonLoc(), Range.get(), 8106 Begin.get(), End.get(), 8107 Cond.get(), 8108 Inc.get(), LoopVar.get(), 8109 S->getRParenLoc()); 8110 if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) { 8111 // Might not have attached any initializer to the loop variable. 8112 getSema().ActOnInitializerError( 8113 cast<DeclStmt>(LoopVar.get())->getSingleDecl()); 8114 return StmtError(); 8115 } 8116 } 8117 8118 StmtResult Body = getDerived().TransformStmt(S->getBody()); 8119 if (Body.isInvalid()) 8120 return StmtError(); 8121 8122 // Body has changed but we didn't rebuild the for-range statement. Rebuild 8123 // it now so we have a new statement to attach the body to. 8124 if (Body.get() != S->getBody() && NewStmt.get() == S) { 8125 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 8126 S->getCoawaitLoc(), Init.get(), 8127 S->getColonLoc(), Range.get(), 8128 Begin.get(), End.get(), 8129 Cond.get(), 8130 Inc.get(), LoopVar.get(), 8131 S->getRParenLoc()); 8132 if (NewStmt.isInvalid()) 8133 return StmtError(); 8134 } 8135 8136 if (NewStmt.get() == S) 8137 return S; 8138 8139 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 8140 } 8141 8142 template<typename Derived> 8143 StmtResult 8144 TreeTransform<Derived>::TransformMSDependentExistsStmt( 8145 MSDependentExistsStmt *S) { 8146 // Transform the nested-name-specifier, if any. 8147 NestedNameSpecifierLoc QualifierLoc; 8148 if (S->getQualifierLoc()) { 8149 QualifierLoc 8150 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 8151 if (!QualifierLoc) 8152 return StmtError(); 8153 } 8154 8155 // Transform the declaration name. 8156 DeclarationNameInfo NameInfo = S->getNameInfo(); 8157 if (NameInfo.getName()) { 8158 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8159 if (!NameInfo.getName()) 8160 return StmtError(); 8161 } 8162 8163 // Check whether anything changed. 8164 if (!getDerived().AlwaysRebuild() && 8165 QualifierLoc == S->getQualifierLoc() && 8166 NameInfo.getName() == S->getNameInfo().getName()) 8167 return S; 8168 8169 // Determine whether this name exists, if we can. 8170 CXXScopeSpec SS; 8171 SS.Adopt(QualifierLoc); 8172 bool Dependent = false; 8173 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 8174 case Sema::IER_Exists: 8175 if (S->isIfExists()) 8176 break; 8177 8178 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8179 8180 case Sema::IER_DoesNotExist: 8181 if (S->isIfNotExists()) 8182 break; 8183 8184 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 8185 8186 case Sema::IER_Dependent: 8187 Dependent = true; 8188 break; 8189 8190 case Sema::IER_Error: 8191 return StmtError(); 8192 } 8193 8194 // We need to continue with the instantiation, so do so now. 8195 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 8196 if (SubStmt.isInvalid()) 8197 return StmtError(); 8198 8199 // If we have resolved the name, just transform to the substatement. 8200 if (!Dependent) 8201 return SubStmt; 8202 8203 // The name is still dependent, so build a dependent expression again. 8204 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 8205 S->isIfExists(), 8206 QualifierLoc, 8207 NameInfo, 8208 SubStmt.get()); 8209 } 8210 8211 template<typename Derived> 8212 ExprResult 8213 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 8214 NestedNameSpecifierLoc QualifierLoc; 8215 if (E->getQualifierLoc()) { 8216 QualifierLoc 8217 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8218 if (!QualifierLoc) 8219 return ExprError(); 8220 } 8221 8222 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 8223 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 8224 if (!PD) 8225 return ExprError(); 8226 8227 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8228 if (Base.isInvalid()) 8229 return ExprError(); 8230 8231 return new (SemaRef.getASTContext()) 8232 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8233 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8234 QualifierLoc, E->getMemberLoc()); 8235 } 8236 8237 template <typename Derived> 8238 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8239 MSPropertySubscriptExpr *E) { 8240 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8241 if (BaseRes.isInvalid()) 8242 return ExprError(); 8243 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8244 if (IdxRes.isInvalid()) 8245 return ExprError(); 8246 8247 if (!getDerived().AlwaysRebuild() && 8248 BaseRes.get() == E->getBase() && 8249 IdxRes.get() == E->getIdx()) 8250 return E; 8251 8252 return getDerived().RebuildArraySubscriptExpr( 8253 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8254 } 8255 8256 template <typename Derived> 8257 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8258 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8259 if (TryBlock.isInvalid()) 8260 return StmtError(); 8261 8262 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8263 if (Handler.isInvalid()) 8264 return StmtError(); 8265 8266 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8267 Handler.get() == S->getHandler()) 8268 return S; 8269 8270 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8271 TryBlock.get(), Handler.get()); 8272 } 8273 8274 template <typename Derived> 8275 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8276 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8277 if (Block.isInvalid()) 8278 return StmtError(); 8279 8280 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8281 } 8282 8283 template <typename Derived> 8284 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8285 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8286 if (FilterExpr.isInvalid()) 8287 return StmtError(); 8288 8289 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8290 if (Block.isInvalid()) 8291 return StmtError(); 8292 8293 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8294 Block.get()); 8295 } 8296 8297 template <typename Derived> 8298 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8299 if (isa<SEHFinallyStmt>(Handler)) 8300 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8301 else 8302 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8303 } 8304 8305 template<typename Derived> 8306 StmtResult 8307 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8308 return S; 8309 } 8310 8311 //===----------------------------------------------------------------------===// 8312 // OpenMP directive transformation 8313 //===----------------------------------------------------------------------===// 8314 template <typename Derived> 8315 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8316 OMPExecutableDirective *D) { 8317 8318 // Transform the clauses 8319 llvm::SmallVector<OMPClause *, 16> TClauses; 8320 ArrayRef<OMPClause *> Clauses = D->clauses(); 8321 TClauses.reserve(Clauses.size()); 8322 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8323 I != E; ++I) { 8324 if (*I) { 8325 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8326 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8327 getDerived().getSema().EndOpenMPClause(); 8328 if (Clause) 8329 TClauses.push_back(Clause); 8330 } else { 8331 TClauses.push_back(nullptr); 8332 } 8333 } 8334 StmtResult AssociatedStmt; 8335 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8336 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8337 /*CurScope=*/nullptr); 8338 StmtResult Body; 8339 { 8340 Sema::CompoundScopeRAII CompoundScope(getSema()); 8341 Stmt *CS; 8342 if (D->getDirectiveKind() == OMPD_atomic || 8343 D->getDirectiveKind() == OMPD_critical || 8344 D->getDirectiveKind() == OMPD_section || 8345 D->getDirectiveKind() == OMPD_master) 8346 CS = D->getAssociatedStmt(); 8347 else 8348 CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 8349 Body = getDerived().TransformStmt(CS); 8350 } 8351 AssociatedStmt = 8352 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8353 if (AssociatedStmt.isInvalid()) { 8354 return StmtError(); 8355 } 8356 } 8357 if (TClauses.size() != Clauses.size()) { 8358 return StmtError(); 8359 } 8360 8361 // Transform directive name for 'omp critical' directive. 8362 DeclarationNameInfo DirName; 8363 if (D->getDirectiveKind() == OMPD_critical) { 8364 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8365 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8366 } 8367 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8368 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8369 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8370 } else if (D->getDirectiveKind() == OMPD_cancel) { 8371 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8372 } 8373 8374 return getDerived().RebuildOMPExecutableDirective( 8375 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8376 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8377 } 8378 8379 template <typename Derived> 8380 StmtResult 8381 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8382 DeclarationNameInfo DirName; 8383 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8384 D->getBeginLoc()); 8385 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8386 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8387 return Res; 8388 } 8389 8390 template <typename Derived> 8391 StmtResult 8392 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8393 DeclarationNameInfo DirName; 8394 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8395 D->getBeginLoc()); 8396 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8397 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8398 return Res; 8399 } 8400 8401 template <typename Derived> 8402 StmtResult 8403 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8404 DeclarationNameInfo DirName; 8405 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8406 D->getBeginLoc()); 8407 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8408 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8409 return Res; 8410 } 8411 8412 template <typename Derived> 8413 StmtResult 8414 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8415 DeclarationNameInfo DirName; 8416 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8417 D->getBeginLoc()); 8418 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8419 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8420 return Res; 8421 } 8422 8423 template <typename Derived> 8424 StmtResult 8425 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8426 DeclarationNameInfo DirName; 8427 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8428 D->getBeginLoc()); 8429 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8430 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8431 return Res; 8432 } 8433 8434 template <typename Derived> 8435 StmtResult 8436 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8437 DeclarationNameInfo DirName; 8438 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8439 D->getBeginLoc()); 8440 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8441 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8442 return Res; 8443 } 8444 8445 template <typename Derived> 8446 StmtResult 8447 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8448 DeclarationNameInfo DirName; 8449 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8450 D->getBeginLoc()); 8451 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8452 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8453 return Res; 8454 } 8455 8456 template <typename Derived> 8457 StmtResult 8458 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8459 DeclarationNameInfo DirName; 8460 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8461 D->getBeginLoc()); 8462 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8463 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8464 return Res; 8465 } 8466 8467 template <typename Derived> 8468 StmtResult 8469 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8470 getDerived().getSema().StartOpenMPDSABlock( 8471 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8472 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8473 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8474 return Res; 8475 } 8476 8477 template <typename Derived> 8478 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8479 OMPParallelForDirective *D) { 8480 DeclarationNameInfo DirName; 8481 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8482 nullptr, D->getBeginLoc()); 8483 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8484 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8485 return Res; 8486 } 8487 8488 template <typename Derived> 8489 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8490 OMPParallelForSimdDirective *D) { 8491 DeclarationNameInfo DirName; 8492 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8493 nullptr, D->getBeginLoc()); 8494 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8495 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8496 return Res; 8497 } 8498 8499 template <typename Derived> 8500 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8501 OMPParallelMasterDirective *D) { 8502 DeclarationNameInfo DirName; 8503 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8504 nullptr, D->getBeginLoc()); 8505 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8506 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8507 return Res; 8508 } 8509 8510 template <typename Derived> 8511 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8512 OMPParallelSectionsDirective *D) { 8513 DeclarationNameInfo DirName; 8514 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8515 nullptr, D->getBeginLoc()); 8516 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8517 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8518 return Res; 8519 } 8520 8521 template <typename Derived> 8522 StmtResult 8523 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8524 DeclarationNameInfo DirName; 8525 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8526 D->getBeginLoc()); 8527 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8528 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8529 return Res; 8530 } 8531 8532 template <typename Derived> 8533 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8534 OMPTaskyieldDirective *D) { 8535 DeclarationNameInfo DirName; 8536 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8537 D->getBeginLoc()); 8538 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8539 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8540 return Res; 8541 } 8542 8543 template <typename Derived> 8544 StmtResult 8545 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8546 DeclarationNameInfo DirName; 8547 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8548 D->getBeginLoc()); 8549 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8550 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8551 return Res; 8552 } 8553 8554 template <typename Derived> 8555 StmtResult 8556 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8557 DeclarationNameInfo DirName; 8558 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8559 D->getBeginLoc()); 8560 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8561 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8562 return Res; 8563 } 8564 8565 template <typename Derived> 8566 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8567 OMPTaskgroupDirective *D) { 8568 DeclarationNameInfo DirName; 8569 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8570 D->getBeginLoc()); 8571 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8572 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8573 return Res; 8574 } 8575 8576 template <typename Derived> 8577 StmtResult 8578 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8579 DeclarationNameInfo DirName; 8580 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8581 D->getBeginLoc()); 8582 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8583 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8584 return Res; 8585 } 8586 8587 template <typename Derived> 8588 StmtResult 8589 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8590 DeclarationNameInfo DirName; 8591 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8592 D->getBeginLoc()); 8593 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8594 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8595 return Res; 8596 } 8597 8598 template <typename Derived> 8599 StmtResult 8600 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8601 DeclarationNameInfo DirName; 8602 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8603 D->getBeginLoc()); 8604 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8605 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8606 return Res; 8607 } 8608 8609 template <typename Derived> 8610 StmtResult 8611 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8612 DeclarationNameInfo DirName; 8613 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8614 D->getBeginLoc()); 8615 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8616 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8617 return Res; 8618 } 8619 8620 template <typename Derived> 8621 StmtResult 8622 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8623 DeclarationNameInfo DirName; 8624 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8625 D->getBeginLoc()); 8626 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8627 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8628 return Res; 8629 } 8630 8631 template <typename Derived> 8632 StmtResult 8633 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8634 DeclarationNameInfo DirName; 8635 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8636 D->getBeginLoc()); 8637 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8638 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8639 return Res; 8640 } 8641 8642 template <typename Derived> 8643 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8644 OMPTargetDataDirective *D) { 8645 DeclarationNameInfo DirName; 8646 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8647 D->getBeginLoc()); 8648 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8649 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8650 return Res; 8651 } 8652 8653 template <typename Derived> 8654 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8655 OMPTargetEnterDataDirective *D) { 8656 DeclarationNameInfo DirName; 8657 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8658 nullptr, D->getBeginLoc()); 8659 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8660 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8661 return Res; 8662 } 8663 8664 template <typename Derived> 8665 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8666 OMPTargetExitDataDirective *D) { 8667 DeclarationNameInfo DirName; 8668 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8669 nullptr, D->getBeginLoc()); 8670 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8671 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8672 return Res; 8673 } 8674 8675 template <typename Derived> 8676 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8677 OMPTargetParallelDirective *D) { 8678 DeclarationNameInfo DirName; 8679 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8680 nullptr, D->getBeginLoc()); 8681 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8682 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8683 return Res; 8684 } 8685 8686 template <typename Derived> 8687 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8688 OMPTargetParallelForDirective *D) { 8689 DeclarationNameInfo DirName; 8690 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8691 nullptr, D->getBeginLoc()); 8692 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8693 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8694 return Res; 8695 } 8696 8697 template <typename Derived> 8698 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8699 OMPTargetUpdateDirective *D) { 8700 DeclarationNameInfo DirName; 8701 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8702 nullptr, D->getBeginLoc()); 8703 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8704 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8705 return Res; 8706 } 8707 8708 template <typename Derived> 8709 StmtResult 8710 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8711 DeclarationNameInfo DirName; 8712 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8713 D->getBeginLoc()); 8714 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8715 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8716 return Res; 8717 } 8718 8719 template <typename Derived> 8720 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8721 OMPCancellationPointDirective *D) { 8722 DeclarationNameInfo DirName; 8723 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8724 nullptr, D->getBeginLoc()); 8725 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8726 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8727 return Res; 8728 } 8729 8730 template <typename Derived> 8731 StmtResult 8732 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8733 DeclarationNameInfo DirName; 8734 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8735 D->getBeginLoc()); 8736 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8737 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8738 return Res; 8739 } 8740 8741 template <typename Derived> 8742 StmtResult 8743 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8744 DeclarationNameInfo DirName; 8745 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8746 D->getBeginLoc()); 8747 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8748 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8749 return Res; 8750 } 8751 8752 template <typename Derived> 8753 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8754 OMPTaskLoopSimdDirective *D) { 8755 DeclarationNameInfo DirName; 8756 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8757 nullptr, D->getBeginLoc()); 8758 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8759 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8760 return Res; 8761 } 8762 8763 template <typename Derived> 8764 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8765 OMPMasterTaskLoopDirective *D) { 8766 DeclarationNameInfo DirName; 8767 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8768 nullptr, D->getBeginLoc()); 8769 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8770 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8771 return Res; 8772 } 8773 8774 template <typename Derived> 8775 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8776 OMPMasterTaskLoopSimdDirective *D) { 8777 DeclarationNameInfo DirName; 8778 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8779 nullptr, D->getBeginLoc()); 8780 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8781 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8782 return Res; 8783 } 8784 8785 template <typename Derived> 8786 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8787 OMPParallelMasterTaskLoopDirective *D) { 8788 DeclarationNameInfo DirName; 8789 getDerived().getSema().StartOpenMPDSABlock( 8790 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8791 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8792 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8793 return Res; 8794 } 8795 8796 template <typename Derived> 8797 StmtResult 8798 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8799 OMPParallelMasterTaskLoopSimdDirective *D) { 8800 DeclarationNameInfo DirName; 8801 getDerived().getSema().StartOpenMPDSABlock( 8802 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8803 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8804 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8805 return Res; 8806 } 8807 8808 template <typename Derived> 8809 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8810 OMPDistributeDirective *D) { 8811 DeclarationNameInfo DirName; 8812 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8813 D->getBeginLoc()); 8814 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8815 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8816 return Res; 8817 } 8818 8819 template <typename Derived> 8820 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8821 OMPDistributeParallelForDirective *D) { 8822 DeclarationNameInfo DirName; 8823 getDerived().getSema().StartOpenMPDSABlock( 8824 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8825 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8826 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8827 return Res; 8828 } 8829 8830 template <typename Derived> 8831 StmtResult 8832 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8833 OMPDistributeParallelForSimdDirective *D) { 8834 DeclarationNameInfo DirName; 8835 getDerived().getSema().StartOpenMPDSABlock( 8836 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8837 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8838 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8839 return Res; 8840 } 8841 8842 template <typename Derived> 8843 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8844 OMPDistributeSimdDirective *D) { 8845 DeclarationNameInfo DirName; 8846 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8847 nullptr, D->getBeginLoc()); 8848 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8849 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8850 return Res; 8851 } 8852 8853 template <typename Derived> 8854 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8855 OMPTargetParallelForSimdDirective *D) { 8856 DeclarationNameInfo DirName; 8857 getDerived().getSema().StartOpenMPDSABlock( 8858 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8859 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8860 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8861 return Res; 8862 } 8863 8864 template <typename Derived> 8865 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8866 OMPTargetSimdDirective *D) { 8867 DeclarationNameInfo DirName; 8868 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8869 D->getBeginLoc()); 8870 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8871 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8872 return Res; 8873 } 8874 8875 template <typename Derived> 8876 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8877 OMPTeamsDistributeDirective *D) { 8878 DeclarationNameInfo DirName; 8879 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8880 nullptr, D->getBeginLoc()); 8881 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8882 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8883 return Res; 8884 } 8885 8886 template <typename Derived> 8887 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8888 OMPTeamsDistributeSimdDirective *D) { 8889 DeclarationNameInfo DirName; 8890 getDerived().getSema().StartOpenMPDSABlock( 8891 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8892 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8893 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8894 return Res; 8895 } 8896 8897 template <typename Derived> 8898 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8899 OMPTeamsDistributeParallelForSimdDirective *D) { 8900 DeclarationNameInfo DirName; 8901 getDerived().getSema().StartOpenMPDSABlock( 8902 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8903 D->getBeginLoc()); 8904 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8905 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8906 return Res; 8907 } 8908 8909 template <typename Derived> 8910 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8911 OMPTeamsDistributeParallelForDirective *D) { 8912 DeclarationNameInfo DirName; 8913 getDerived().getSema().StartOpenMPDSABlock( 8914 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8915 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8916 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8917 return Res; 8918 } 8919 8920 template <typename Derived> 8921 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8922 OMPTargetTeamsDirective *D) { 8923 DeclarationNameInfo DirName; 8924 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8925 nullptr, D->getBeginLoc()); 8926 auto Res = getDerived().TransformOMPExecutableDirective(D); 8927 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8928 return Res; 8929 } 8930 8931 template <typename Derived> 8932 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8933 OMPTargetTeamsDistributeDirective *D) { 8934 DeclarationNameInfo DirName; 8935 getDerived().getSema().StartOpenMPDSABlock( 8936 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8937 auto Res = getDerived().TransformOMPExecutableDirective(D); 8938 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8939 return Res; 8940 } 8941 8942 template <typename Derived> 8943 StmtResult 8944 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8945 OMPTargetTeamsDistributeParallelForDirective *D) { 8946 DeclarationNameInfo DirName; 8947 getDerived().getSema().StartOpenMPDSABlock( 8948 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8949 D->getBeginLoc()); 8950 auto Res = getDerived().TransformOMPExecutableDirective(D); 8951 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8952 return Res; 8953 } 8954 8955 template <typename Derived> 8956 StmtResult TreeTransform<Derived>:: 8957 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8958 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8959 DeclarationNameInfo DirName; 8960 getDerived().getSema().StartOpenMPDSABlock( 8961 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8962 D->getBeginLoc()); 8963 auto Res = getDerived().TransformOMPExecutableDirective(D); 8964 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8965 return Res; 8966 } 8967 8968 template <typename Derived> 8969 StmtResult 8970 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8971 OMPTargetTeamsDistributeSimdDirective *D) { 8972 DeclarationNameInfo DirName; 8973 getDerived().getSema().StartOpenMPDSABlock( 8974 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8975 auto Res = getDerived().TransformOMPExecutableDirective(D); 8976 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8977 return Res; 8978 } 8979 8980 8981 //===----------------------------------------------------------------------===// 8982 // OpenMP clause transformation 8983 //===----------------------------------------------------------------------===// 8984 template <typename Derived> 8985 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8986 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8987 if (Cond.isInvalid()) 8988 return nullptr; 8989 return getDerived().RebuildOMPIfClause( 8990 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8991 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8992 } 8993 8994 template <typename Derived> 8995 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8996 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8997 if (Cond.isInvalid()) 8998 return nullptr; 8999 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 9000 C->getLParenLoc(), C->getEndLoc()); 9001 } 9002 9003 template <typename Derived> 9004 OMPClause * 9005 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 9006 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 9007 if (NumThreads.isInvalid()) 9008 return nullptr; 9009 return getDerived().RebuildOMPNumThreadsClause( 9010 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9011 } 9012 9013 template <typename Derived> 9014 OMPClause * 9015 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 9016 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 9017 if (E.isInvalid()) 9018 return nullptr; 9019 return getDerived().RebuildOMPSafelenClause( 9020 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9021 } 9022 9023 template <typename Derived> 9024 OMPClause * 9025 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 9026 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 9027 if (E.isInvalid()) 9028 return nullptr; 9029 return getDerived().RebuildOMPAllocatorClause( 9030 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9031 } 9032 9033 template <typename Derived> 9034 OMPClause * 9035 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 9036 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 9037 if (E.isInvalid()) 9038 return nullptr; 9039 return getDerived().RebuildOMPSimdlenClause( 9040 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9041 } 9042 9043 template <typename Derived> 9044 OMPClause * 9045 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 9046 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 9047 if (E.isInvalid()) 9048 return nullptr; 9049 return getDerived().RebuildOMPCollapseClause( 9050 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9051 } 9052 9053 template <typename Derived> 9054 OMPClause * 9055 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 9056 return getDerived().RebuildOMPDefaultClause( 9057 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 9058 C->getLParenLoc(), C->getEndLoc()); 9059 } 9060 9061 template <typename Derived> 9062 OMPClause * 9063 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 9064 return getDerived().RebuildOMPProcBindClause( 9065 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 9066 C->getLParenLoc(), C->getEndLoc()); 9067 } 9068 9069 template <typename Derived> 9070 OMPClause * 9071 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 9072 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9073 if (E.isInvalid()) 9074 return nullptr; 9075 return getDerived().RebuildOMPScheduleClause( 9076 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 9077 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9078 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 9079 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9080 } 9081 9082 template <typename Derived> 9083 OMPClause * 9084 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 9085 ExprResult E; 9086 if (auto *Num = C->getNumForLoops()) { 9087 E = getDerived().TransformExpr(Num); 9088 if (E.isInvalid()) 9089 return nullptr; 9090 } 9091 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 9092 C->getLParenLoc(), E.get()); 9093 } 9094 9095 template <typename Derived> 9096 OMPClause * 9097 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 9098 ExprResult E; 9099 if (Expr *Evt = C->getEventHandler()) { 9100 E = getDerived().TransformExpr(Evt); 9101 if (E.isInvalid()) 9102 return nullptr; 9103 } 9104 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 9105 C->getLParenLoc(), C->getEndLoc()); 9106 } 9107 9108 template <typename Derived> 9109 OMPClause * 9110 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 9111 // No need to rebuild this clause, no template-dependent parameters. 9112 return C; 9113 } 9114 9115 template <typename Derived> 9116 OMPClause * 9117 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 9118 // No need to rebuild this clause, no template-dependent parameters. 9119 return C; 9120 } 9121 9122 template <typename Derived> 9123 OMPClause * 9124 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 9125 // No need to rebuild this clause, no template-dependent parameters. 9126 return C; 9127 } 9128 9129 template <typename Derived> 9130 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 9131 // No need to rebuild this clause, no template-dependent parameters. 9132 return C; 9133 } 9134 9135 template <typename Derived> 9136 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 9137 // No need to rebuild this clause, no template-dependent parameters. 9138 return C; 9139 } 9140 9141 template <typename Derived> 9142 OMPClause * 9143 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 9144 // No need to rebuild this clause, no template-dependent parameters. 9145 return C; 9146 } 9147 9148 template <typename Derived> 9149 OMPClause * 9150 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 9151 // No need to rebuild this clause, no template-dependent parameters. 9152 return C; 9153 } 9154 9155 template <typename Derived> 9156 OMPClause * 9157 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 9158 // No need to rebuild this clause, no template-dependent parameters. 9159 return C; 9160 } 9161 9162 template <typename Derived> 9163 OMPClause * 9164 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 9165 // No need to rebuild this clause, no template-dependent parameters. 9166 return C; 9167 } 9168 9169 template <typename Derived> 9170 OMPClause * 9171 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 9172 // No need to rebuild this clause, no template-dependent parameters. 9173 return C; 9174 } 9175 9176 template <typename Derived> 9177 OMPClause * 9178 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 9179 // No need to rebuild this clause, no template-dependent parameters. 9180 return C; 9181 } 9182 9183 template <typename Derived> 9184 OMPClause * 9185 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 9186 // No need to rebuild this clause, no template-dependent parameters. 9187 return C; 9188 } 9189 9190 template <typename Derived> 9191 OMPClause * 9192 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 9193 // No need to rebuild this clause, no template-dependent parameters. 9194 return C; 9195 } 9196 9197 template <typename Derived> 9198 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 9199 // No need to rebuild this clause, no template-dependent parameters. 9200 return C; 9201 } 9202 9203 template <typename Derived> 9204 OMPClause * 9205 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 9206 // No need to rebuild this clause, no template-dependent parameters. 9207 return C; 9208 } 9209 9210 template <typename Derived> 9211 OMPClause * 9212 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 9213 // No need to rebuild this clause, no template-dependent parameters. 9214 return C; 9215 } 9216 9217 template <typename Derived> 9218 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 9219 OMPUnifiedAddressClause *C) { 9220 llvm_unreachable("unified_address clause cannot appear in dependent context"); 9221 } 9222 9223 template <typename Derived> 9224 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 9225 OMPUnifiedSharedMemoryClause *C) { 9226 llvm_unreachable( 9227 "unified_shared_memory clause cannot appear in dependent context"); 9228 } 9229 9230 template <typename Derived> 9231 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 9232 OMPReverseOffloadClause *C) { 9233 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 9234 } 9235 9236 template <typename Derived> 9237 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 9238 OMPDynamicAllocatorsClause *C) { 9239 llvm_unreachable( 9240 "dynamic_allocators clause cannot appear in dependent context"); 9241 } 9242 9243 template <typename Derived> 9244 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9245 OMPAtomicDefaultMemOrderClause *C) { 9246 llvm_unreachable( 9247 "atomic_default_mem_order clause cannot appear in dependent context"); 9248 } 9249 9250 template <typename Derived> 9251 OMPClause * 9252 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9253 llvm::SmallVector<Expr *, 16> Vars; 9254 Vars.reserve(C->varlist_size()); 9255 for (auto *VE : C->varlists()) { 9256 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9257 if (EVar.isInvalid()) 9258 return nullptr; 9259 Vars.push_back(EVar.get()); 9260 } 9261 return getDerived().RebuildOMPPrivateClause( 9262 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9263 } 9264 9265 template <typename Derived> 9266 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9267 OMPFirstprivateClause *C) { 9268 llvm::SmallVector<Expr *, 16> Vars; 9269 Vars.reserve(C->varlist_size()); 9270 for (auto *VE : C->varlists()) { 9271 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9272 if (EVar.isInvalid()) 9273 return nullptr; 9274 Vars.push_back(EVar.get()); 9275 } 9276 return getDerived().RebuildOMPFirstprivateClause( 9277 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9278 } 9279 9280 template <typename Derived> 9281 OMPClause * 9282 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9283 llvm::SmallVector<Expr *, 16> Vars; 9284 Vars.reserve(C->varlist_size()); 9285 for (auto *VE : C->varlists()) { 9286 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9287 if (EVar.isInvalid()) 9288 return nullptr; 9289 Vars.push_back(EVar.get()); 9290 } 9291 return getDerived().RebuildOMPLastprivateClause( 9292 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9293 C->getLParenLoc(), C->getEndLoc()); 9294 } 9295 9296 template <typename Derived> 9297 OMPClause * 9298 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9299 llvm::SmallVector<Expr *, 16> Vars; 9300 Vars.reserve(C->varlist_size()); 9301 for (auto *VE : C->varlists()) { 9302 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9303 if (EVar.isInvalid()) 9304 return nullptr; 9305 Vars.push_back(EVar.get()); 9306 } 9307 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9308 C->getLParenLoc(), C->getEndLoc()); 9309 } 9310 9311 template <typename Derived> 9312 OMPClause * 9313 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9314 llvm::SmallVector<Expr *, 16> Vars; 9315 Vars.reserve(C->varlist_size()); 9316 for (auto *VE : C->varlists()) { 9317 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9318 if (EVar.isInvalid()) 9319 return nullptr; 9320 Vars.push_back(EVar.get()); 9321 } 9322 CXXScopeSpec ReductionIdScopeSpec; 9323 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9324 9325 DeclarationNameInfo NameInfo = C->getNameInfo(); 9326 if (NameInfo.getName()) { 9327 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9328 if (!NameInfo.getName()) 9329 return nullptr; 9330 } 9331 // Build a list of all UDR decls with the same names ranged by the Scopes. 9332 // The Scope boundary is a duplication of the previous decl. 9333 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9334 for (auto *E : C->reduction_ops()) { 9335 // Transform all the decls. 9336 if (E) { 9337 auto *ULE = cast<UnresolvedLookupExpr>(E); 9338 UnresolvedSet<8> Decls; 9339 for (auto *D : ULE->decls()) { 9340 NamedDecl *InstD = 9341 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9342 Decls.addDecl(InstD, InstD->getAccess()); 9343 } 9344 UnresolvedReductions.push_back( 9345 UnresolvedLookupExpr::Create( 9346 SemaRef.Context, /*NamingClass=*/nullptr, 9347 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9348 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9349 Decls.begin(), Decls.end())); 9350 } else 9351 UnresolvedReductions.push_back(nullptr); 9352 } 9353 return getDerived().RebuildOMPReductionClause( 9354 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9355 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9356 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9357 } 9358 9359 template <typename Derived> 9360 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9361 OMPTaskReductionClause *C) { 9362 llvm::SmallVector<Expr *, 16> Vars; 9363 Vars.reserve(C->varlist_size()); 9364 for (auto *VE : C->varlists()) { 9365 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9366 if (EVar.isInvalid()) 9367 return nullptr; 9368 Vars.push_back(EVar.get()); 9369 } 9370 CXXScopeSpec ReductionIdScopeSpec; 9371 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9372 9373 DeclarationNameInfo NameInfo = C->getNameInfo(); 9374 if (NameInfo.getName()) { 9375 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9376 if (!NameInfo.getName()) 9377 return nullptr; 9378 } 9379 // Build a list of all UDR decls with the same names ranged by the Scopes. 9380 // The Scope boundary is a duplication of the previous decl. 9381 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9382 for (auto *E : C->reduction_ops()) { 9383 // Transform all the decls. 9384 if (E) { 9385 auto *ULE = cast<UnresolvedLookupExpr>(E); 9386 UnresolvedSet<8> Decls; 9387 for (auto *D : ULE->decls()) { 9388 NamedDecl *InstD = 9389 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9390 Decls.addDecl(InstD, InstD->getAccess()); 9391 } 9392 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9393 SemaRef.Context, /*NamingClass=*/nullptr, 9394 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9395 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9396 } else 9397 UnresolvedReductions.push_back(nullptr); 9398 } 9399 return getDerived().RebuildOMPTaskReductionClause( 9400 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9401 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9402 } 9403 9404 template <typename Derived> 9405 OMPClause * 9406 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9407 llvm::SmallVector<Expr *, 16> Vars; 9408 Vars.reserve(C->varlist_size()); 9409 for (auto *VE : C->varlists()) { 9410 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9411 if (EVar.isInvalid()) 9412 return nullptr; 9413 Vars.push_back(EVar.get()); 9414 } 9415 CXXScopeSpec ReductionIdScopeSpec; 9416 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9417 9418 DeclarationNameInfo NameInfo = C->getNameInfo(); 9419 if (NameInfo.getName()) { 9420 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9421 if (!NameInfo.getName()) 9422 return nullptr; 9423 } 9424 // Build a list of all UDR decls with the same names ranged by the Scopes. 9425 // The Scope boundary is a duplication of the previous decl. 9426 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9427 for (auto *E : C->reduction_ops()) { 9428 // Transform all the decls. 9429 if (E) { 9430 auto *ULE = cast<UnresolvedLookupExpr>(E); 9431 UnresolvedSet<8> Decls; 9432 for (auto *D : ULE->decls()) { 9433 NamedDecl *InstD = 9434 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9435 Decls.addDecl(InstD, InstD->getAccess()); 9436 } 9437 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9438 SemaRef.Context, /*NamingClass=*/nullptr, 9439 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9440 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9441 } else 9442 UnresolvedReductions.push_back(nullptr); 9443 } 9444 return getDerived().RebuildOMPInReductionClause( 9445 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9446 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9447 } 9448 9449 template <typename Derived> 9450 OMPClause * 9451 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9452 llvm::SmallVector<Expr *, 16> Vars; 9453 Vars.reserve(C->varlist_size()); 9454 for (auto *VE : C->varlists()) { 9455 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9456 if (EVar.isInvalid()) 9457 return nullptr; 9458 Vars.push_back(EVar.get()); 9459 } 9460 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9461 if (Step.isInvalid()) 9462 return nullptr; 9463 return getDerived().RebuildOMPLinearClause( 9464 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9465 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9466 } 9467 9468 template <typename Derived> 9469 OMPClause * 9470 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9471 llvm::SmallVector<Expr *, 16> Vars; 9472 Vars.reserve(C->varlist_size()); 9473 for (auto *VE : C->varlists()) { 9474 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9475 if (EVar.isInvalid()) 9476 return nullptr; 9477 Vars.push_back(EVar.get()); 9478 } 9479 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9480 if (Alignment.isInvalid()) 9481 return nullptr; 9482 return getDerived().RebuildOMPAlignedClause( 9483 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9484 C->getColonLoc(), C->getEndLoc()); 9485 } 9486 9487 template <typename Derived> 9488 OMPClause * 9489 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9490 llvm::SmallVector<Expr *, 16> Vars; 9491 Vars.reserve(C->varlist_size()); 9492 for (auto *VE : C->varlists()) { 9493 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9494 if (EVar.isInvalid()) 9495 return nullptr; 9496 Vars.push_back(EVar.get()); 9497 } 9498 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9499 C->getLParenLoc(), C->getEndLoc()); 9500 } 9501 9502 template <typename Derived> 9503 OMPClause * 9504 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9505 llvm::SmallVector<Expr *, 16> Vars; 9506 Vars.reserve(C->varlist_size()); 9507 for (auto *VE : C->varlists()) { 9508 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9509 if (EVar.isInvalid()) 9510 return nullptr; 9511 Vars.push_back(EVar.get()); 9512 } 9513 return getDerived().RebuildOMPCopyprivateClause( 9514 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9515 } 9516 9517 template <typename Derived> 9518 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9519 llvm::SmallVector<Expr *, 16> Vars; 9520 Vars.reserve(C->varlist_size()); 9521 for (auto *VE : C->varlists()) { 9522 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9523 if (EVar.isInvalid()) 9524 return nullptr; 9525 Vars.push_back(EVar.get()); 9526 } 9527 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9528 C->getLParenLoc(), C->getEndLoc()); 9529 } 9530 9531 template <typename Derived> 9532 OMPClause * 9533 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9534 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9535 if (E.isInvalid()) 9536 return nullptr; 9537 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9538 C->getLParenLoc(), C->getEndLoc()); 9539 } 9540 9541 template <typename Derived> 9542 OMPClause * 9543 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9544 llvm::SmallVector<Expr *, 16> Vars; 9545 Expr *DepModifier = C->getModifier(); 9546 if (DepModifier) { 9547 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9548 if (DepModRes.isInvalid()) 9549 return nullptr; 9550 DepModifier = DepModRes.get(); 9551 } 9552 Vars.reserve(C->varlist_size()); 9553 for (auto *VE : C->varlists()) { 9554 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9555 if (EVar.isInvalid()) 9556 return nullptr; 9557 Vars.push_back(EVar.get()); 9558 } 9559 return getDerived().RebuildOMPDependClause( 9560 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9561 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9562 C->getEndLoc()); 9563 } 9564 9565 template <typename Derived> 9566 OMPClause * 9567 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9568 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9569 if (E.isInvalid()) 9570 return nullptr; 9571 return getDerived().RebuildOMPDeviceClause( 9572 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9573 C->getModifierLoc(), C->getEndLoc()); 9574 } 9575 9576 template <typename Derived, class T> 9577 bool transformOMPMappableExprListClause( 9578 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9579 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9580 DeclarationNameInfo &MapperIdInfo, 9581 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9582 // Transform expressions in the list. 9583 Vars.reserve(C->varlist_size()); 9584 for (auto *VE : C->varlists()) { 9585 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9586 if (EVar.isInvalid()) 9587 return true; 9588 Vars.push_back(EVar.get()); 9589 } 9590 // Transform mapper scope specifier and identifier. 9591 NestedNameSpecifierLoc QualifierLoc; 9592 if (C->getMapperQualifierLoc()) { 9593 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9594 C->getMapperQualifierLoc()); 9595 if (!QualifierLoc) 9596 return true; 9597 } 9598 MapperIdScopeSpec.Adopt(QualifierLoc); 9599 MapperIdInfo = C->getMapperIdInfo(); 9600 if (MapperIdInfo.getName()) { 9601 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9602 if (!MapperIdInfo.getName()) 9603 return true; 9604 } 9605 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9606 // the previous user-defined mapper lookup in dependent environment. 9607 for (auto *E : C->mapperlists()) { 9608 // Transform all the decls. 9609 if (E) { 9610 auto *ULE = cast<UnresolvedLookupExpr>(E); 9611 UnresolvedSet<8> Decls; 9612 for (auto *D : ULE->decls()) { 9613 NamedDecl *InstD = 9614 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9615 Decls.addDecl(InstD, InstD->getAccess()); 9616 } 9617 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9618 TT.getSema().Context, /*NamingClass=*/nullptr, 9619 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9620 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9621 Decls.end())); 9622 } else { 9623 UnresolvedMappers.push_back(nullptr); 9624 } 9625 } 9626 return false; 9627 } 9628 9629 template <typename Derived> 9630 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9631 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9632 llvm::SmallVector<Expr *, 16> Vars; 9633 CXXScopeSpec MapperIdScopeSpec; 9634 DeclarationNameInfo MapperIdInfo; 9635 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9636 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9637 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9638 return nullptr; 9639 return getDerived().RebuildOMPMapClause( 9640 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9641 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9642 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9643 } 9644 9645 template <typename Derived> 9646 OMPClause * 9647 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9648 Expr *Allocator = C->getAllocator(); 9649 if (Allocator) { 9650 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9651 if (AllocatorRes.isInvalid()) 9652 return nullptr; 9653 Allocator = AllocatorRes.get(); 9654 } 9655 llvm::SmallVector<Expr *, 16> Vars; 9656 Vars.reserve(C->varlist_size()); 9657 for (auto *VE : C->varlists()) { 9658 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9659 if (EVar.isInvalid()) 9660 return nullptr; 9661 Vars.push_back(EVar.get()); 9662 } 9663 return getDerived().RebuildOMPAllocateClause( 9664 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9665 C->getEndLoc()); 9666 } 9667 9668 template <typename Derived> 9669 OMPClause * 9670 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9671 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9672 if (E.isInvalid()) 9673 return nullptr; 9674 return getDerived().RebuildOMPNumTeamsClause( 9675 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9676 } 9677 9678 template <typename Derived> 9679 OMPClause * 9680 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9681 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9682 if (E.isInvalid()) 9683 return nullptr; 9684 return getDerived().RebuildOMPThreadLimitClause( 9685 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9686 } 9687 9688 template <typename Derived> 9689 OMPClause * 9690 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9691 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9692 if (E.isInvalid()) 9693 return nullptr; 9694 return getDerived().RebuildOMPPriorityClause( 9695 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9696 } 9697 9698 template <typename Derived> 9699 OMPClause * 9700 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9701 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9702 if (E.isInvalid()) 9703 return nullptr; 9704 return getDerived().RebuildOMPGrainsizeClause( 9705 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9706 } 9707 9708 template <typename Derived> 9709 OMPClause * 9710 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9711 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9712 if (E.isInvalid()) 9713 return nullptr; 9714 return getDerived().RebuildOMPNumTasksClause( 9715 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9716 } 9717 9718 template <typename Derived> 9719 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9720 ExprResult E = getDerived().TransformExpr(C->getHint()); 9721 if (E.isInvalid()) 9722 return nullptr; 9723 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9724 C->getLParenLoc(), C->getEndLoc()); 9725 } 9726 9727 template <typename Derived> 9728 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9729 OMPDistScheduleClause *C) { 9730 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9731 if (E.isInvalid()) 9732 return nullptr; 9733 return getDerived().RebuildOMPDistScheduleClause( 9734 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9735 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9736 } 9737 9738 template <typename Derived> 9739 OMPClause * 9740 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9741 // Rebuild Defaultmap Clause since we need to invoke the checking of 9742 // defaultmap(none:variable-category) after template initialization. 9743 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9744 C->getDefaultmapKind(), 9745 C->getBeginLoc(), 9746 C->getLParenLoc(), 9747 C->getDefaultmapModifierLoc(), 9748 C->getDefaultmapKindLoc(), 9749 C->getEndLoc()); 9750 } 9751 9752 template <typename Derived> 9753 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9754 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9755 llvm::SmallVector<Expr *, 16> Vars; 9756 CXXScopeSpec MapperIdScopeSpec; 9757 DeclarationNameInfo MapperIdInfo; 9758 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9759 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9760 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9761 return nullptr; 9762 return getDerived().RebuildOMPToClause( 9763 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9764 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9765 } 9766 9767 template <typename Derived> 9768 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9769 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9770 llvm::SmallVector<Expr *, 16> Vars; 9771 CXXScopeSpec MapperIdScopeSpec; 9772 DeclarationNameInfo MapperIdInfo; 9773 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9774 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9775 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9776 return nullptr; 9777 return getDerived().RebuildOMPFromClause( 9778 C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec, 9779 MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9780 } 9781 9782 template <typename Derived> 9783 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9784 OMPUseDevicePtrClause *C) { 9785 llvm::SmallVector<Expr *, 16> Vars; 9786 Vars.reserve(C->varlist_size()); 9787 for (auto *VE : C->varlists()) { 9788 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9789 if (EVar.isInvalid()) 9790 return nullptr; 9791 Vars.push_back(EVar.get()); 9792 } 9793 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9794 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9795 } 9796 9797 template <typename Derived> 9798 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause( 9799 OMPUseDeviceAddrClause *C) { 9800 llvm::SmallVector<Expr *, 16> Vars; 9801 Vars.reserve(C->varlist_size()); 9802 for (auto *VE : C->varlists()) { 9803 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9804 if (EVar.isInvalid()) 9805 return nullptr; 9806 Vars.push_back(EVar.get()); 9807 } 9808 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9809 return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs); 9810 } 9811 9812 template <typename Derived> 9813 OMPClause * 9814 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9815 llvm::SmallVector<Expr *, 16> Vars; 9816 Vars.reserve(C->varlist_size()); 9817 for (auto *VE : C->varlists()) { 9818 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9819 if (EVar.isInvalid()) 9820 return nullptr; 9821 Vars.push_back(EVar.get()); 9822 } 9823 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9824 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9825 } 9826 9827 template <typename Derived> 9828 OMPClause * 9829 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 9830 llvm::SmallVector<Expr *, 16> Vars; 9831 Vars.reserve(C->varlist_size()); 9832 for (auto *VE : C->varlists()) { 9833 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9834 if (EVar.isInvalid()) 9835 return nullptr; 9836 Vars.push_back(EVar.get()); 9837 } 9838 return getDerived().RebuildOMPNontemporalClause( 9839 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9840 } 9841 9842 template <typename Derived> 9843 OMPClause * 9844 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 9845 llvm::SmallVector<Expr *, 16> Vars; 9846 Vars.reserve(C->varlist_size()); 9847 for (auto *VE : C->varlists()) { 9848 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9849 if (EVar.isInvalid()) 9850 return nullptr; 9851 Vars.push_back(EVar.get()); 9852 } 9853 return getDerived().RebuildOMPInclusiveClause( 9854 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9855 } 9856 9857 template <typename Derived> 9858 OMPClause * 9859 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 9860 llvm::SmallVector<Expr *, 16> Vars; 9861 Vars.reserve(C->varlist_size()); 9862 for (auto *VE : C->varlists()) { 9863 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9864 if (EVar.isInvalid()) 9865 return nullptr; 9866 Vars.push_back(EVar.get()); 9867 } 9868 return getDerived().RebuildOMPExclusiveClause( 9869 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9870 } 9871 9872 template <typename Derived> 9873 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause( 9874 OMPUsesAllocatorsClause *C) { 9875 SmallVector<Sema::UsesAllocatorsData, 16> Data; 9876 Data.reserve(C->getNumberOfAllocators()); 9877 for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) { 9878 OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I); 9879 ExprResult Allocator = getDerived().TransformExpr(D.Allocator); 9880 if (Allocator.isInvalid()) 9881 continue; 9882 ExprResult AllocatorTraits; 9883 if (Expr *AT = D.AllocatorTraits) { 9884 AllocatorTraits = getDerived().TransformExpr(AT); 9885 if (AllocatorTraits.isInvalid()) 9886 continue; 9887 } 9888 Sema::UsesAllocatorsData &NewD = Data.emplace_back(); 9889 NewD.Allocator = Allocator.get(); 9890 NewD.AllocatorTraits = AllocatorTraits.get(); 9891 NewD.LParenLoc = D.LParenLoc; 9892 NewD.RParenLoc = D.RParenLoc; 9893 } 9894 return getDerived().RebuildOMPUsesAllocatorsClause( 9895 Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9896 } 9897 9898 template <typename Derived> 9899 OMPClause * 9900 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) { 9901 SmallVector<Expr *, 4> Locators; 9902 Locators.reserve(C->varlist_size()); 9903 ExprResult ModifierRes; 9904 if (Expr *Modifier = C->getModifier()) { 9905 ModifierRes = getDerived().TransformExpr(Modifier); 9906 if (ModifierRes.isInvalid()) 9907 return nullptr; 9908 } 9909 for (Expr *E : C->varlists()) { 9910 ExprResult Locator = getDerived().TransformExpr(E); 9911 if (Locator.isInvalid()) 9912 continue; 9913 Locators.push_back(Locator.get()); 9914 } 9915 return getDerived().RebuildOMPAffinityClause( 9916 C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(), 9917 ModifierRes.get(), Locators); 9918 } 9919 9920 template <typename Derived> 9921 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 9922 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 9923 C->getBeginLoc(), C->getLParenLoc(), 9924 C->getEndLoc()); 9925 } 9926 9927 //===----------------------------------------------------------------------===// 9928 // Expression transformation 9929 //===----------------------------------------------------------------------===// 9930 template<typename Derived> 9931 ExprResult 9932 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9933 return TransformExpr(E->getSubExpr()); 9934 } 9935 9936 template<typename Derived> 9937 ExprResult 9938 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9939 if (!E->isTypeDependent()) 9940 return E; 9941 9942 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9943 E->getIdentKind()); 9944 } 9945 9946 template<typename Derived> 9947 ExprResult 9948 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9949 NestedNameSpecifierLoc QualifierLoc; 9950 if (E->getQualifierLoc()) { 9951 QualifierLoc 9952 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9953 if (!QualifierLoc) 9954 return ExprError(); 9955 } 9956 9957 ValueDecl *ND 9958 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9959 E->getDecl())); 9960 if (!ND) 9961 return ExprError(); 9962 9963 NamedDecl *Found = ND; 9964 if (E->getFoundDecl() != E->getDecl()) { 9965 Found = cast_or_null<NamedDecl>( 9966 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 9967 if (!Found) 9968 return ExprError(); 9969 } 9970 9971 DeclarationNameInfo NameInfo = E->getNameInfo(); 9972 if (NameInfo.getName()) { 9973 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9974 if (!NameInfo.getName()) 9975 return ExprError(); 9976 } 9977 9978 if (!getDerived().AlwaysRebuild() && 9979 QualifierLoc == E->getQualifierLoc() && 9980 ND == E->getDecl() && 9981 Found == E->getFoundDecl() && 9982 NameInfo.getName() == E->getDecl()->getDeclName() && 9983 !E->hasExplicitTemplateArgs()) { 9984 9985 // Mark it referenced in the new context regardless. 9986 // FIXME: this is a bit instantiation-specific. 9987 SemaRef.MarkDeclRefReferenced(E); 9988 9989 return E; 9990 } 9991 9992 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9993 if (E->hasExplicitTemplateArgs()) { 9994 TemplateArgs = &TransArgs; 9995 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9996 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9997 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9998 E->getNumTemplateArgs(), 9999 TransArgs)) 10000 return ExprError(); 10001 } 10002 10003 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 10004 Found, TemplateArgs); 10005 } 10006 10007 template<typename Derived> 10008 ExprResult 10009 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 10010 return E; 10011 } 10012 10013 template <typename Derived> 10014 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 10015 FixedPointLiteral *E) { 10016 return E; 10017 } 10018 10019 template<typename Derived> 10020 ExprResult 10021 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 10022 return E; 10023 } 10024 10025 template<typename Derived> 10026 ExprResult 10027 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 10028 return E; 10029 } 10030 10031 template<typename Derived> 10032 ExprResult 10033 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 10034 return E; 10035 } 10036 10037 template<typename Derived> 10038 ExprResult 10039 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 10040 return E; 10041 } 10042 10043 template<typename Derived> 10044 ExprResult 10045 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 10046 if (FunctionDecl *FD = E->getDirectCallee()) 10047 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 10048 return SemaRef.MaybeBindToTemporary(E); 10049 } 10050 10051 template<typename Derived> 10052 ExprResult 10053 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 10054 ExprResult ControllingExpr = 10055 getDerived().TransformExpr(E->getControllingExpr()); 10056 if (ControllingExpr.isInvalid()) 10057 return ExprError(); 10058 10059 SmallVector<Expr *, 4> AssocExprs; 10060 SmallVector<TypeSourceInfo *, 4> AssocTypes; 10061 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 10062 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 10063 if (TSI) { 10064 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 10065 if (!AssocType) 10066 return ExprError(); 10067 AssocTypes.push_back(AssocType); 10068 } else { 10069 AssocTypes.push_back(nullptr); 10070 } 10071 10072 ExprResult AssocExpr = 10073 getDerived().TransformExpr(Assoc.getAssociationExpr()); 10074 if (AssocExpr.isInvalid()) 10075 return ExprError(); 10076 AssocExprs.push_back(AssocExpr.get()); 10077 } 10078 10079 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 10080 E->getDefaultLoc(), 10081 E->getRParenLoc(), 10082 ControllingExpr.get(), 10083 AssocTypes, 10084 AssocExprs); 10085 } 10086 10087 template<typename Derived> 10088 ExprResult 10089 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 10090 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10091 if (SubExpr.isInvalid()) 10092 return ExprError(); 10093 10094 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10095 return E; 10096 10097 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 10098 E->getRParen()); 10099 } 10100 10101 /// The operand of a unary address-of operator has special rules: it's 10102 /// allowed to refer to a non-static member of a class even if there's no 'this' 10103 /// object available. 10104 template<typename Derived> 10105 ExprResult 10106 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 10107 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 10108 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 10109 else 10110 return getDerived().TransformExpr(E); 10111 } 10112 10113 template<typename Derived> 10114 ExprResult 10115 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 10116 ExprResult SubExpr; 10117 if (E->getOpcode() == UO_AddrOf) 10118 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 10119 else 10120 SubExpr = TransformExpr(E->getSubExpr()); 10121 if (SubExpr.isInvalid()) 10122 return ExprError(); 10123 10124 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 10125 return E; 10126 10127 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 10128 E->getOpcode(), 10129 SubExpr.get()); 10130 } 10131 10132 template<typename Derived> 10133 ExprResult 10134 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 10135 // Transform the type. 10136 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 10137 if (!Type) 10138 return ExprError(); 10139 10140 // Transform all of the components into components similar to what the 10141 // parser uses. 10142 // FIXME: It would be slightly more efficient in the non-dependent case to 10143 // just map FieldDecls, rather than requiring the rebuilder to look for 10144 // the fields again. However, __builtin_offsetof is rare enough in 10145 // template code that we don't care. 10146 bool ExprChanged = false; 10147 typedef Sema::OffsetOfComponent Component; 10148 SmallVector<Component, 4> Components; 10149 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 10150 const OffsetOfNode &ON = E->getComponent(I); 10151 Component Comp; 10152 Comp.isBrackets = true; 10153 Comp.LocStart = ON.getSourceRange().getBegin(); 10154 Comp.LocEnd = ON.getSourceRange().getEnd(); 10155 switch (ON.getKind()) { 10156 case OffsetOfNode::Array: { 10157 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 10158 ExprResult Index = getDerived().TransformExpr(FromIndex); 10159 if (Index.isInvalid()) 10160 return ExprError(); 10161 10162 ExprChanged = ExprChanged || Index.get() != FromIndex; 10163 Comp.isBrackets = true; 10164 Comp.U.E = Index.get(); 10165 break; 10166 } 10167 10168 case OffsetOfNode::Field: 10169 case OffsetOfNode::Identifier: 10170 Comp.isBrackets = false; 10171 Comp.U.IdentInfo = ON.getFieldName(); 10172 if (!Comp.U.IdentInfo) 10173 continue; 10174 10175 break; 10176 10177 case OffsetOfNode::Base: 10178 // Will be recomputed during the rebuild. 10179 continue; 10180 } 10181 10182 Components.push_back(Comp); 10183 } 10184 10185 // If nothing changed, retain the existing expression. 10186 if (!getDerived().AlwaysRebuild() && 10187 Type == E->getTypeSourceInfo() && 10188 !ExprChanged) 10189 return E; 10190 10191 // Build a new offsetof expression. 10192 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 10193 Components, E->getRParenLoc()); 10194 } 10195 10196 template<typename Derived> 10197 ExprResult 10198 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 10199 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 10200 "opaque value expression requires transformation"); 10201 return E; 10202 } 10203 10204 template<typename Derived> 10205 ExprResult 10206 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 10207 return E; 10208 } 10209 10210 template <typename Derived> 10211 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 10212 llvm::SmallVector<Expr *, 8> Children; 10213 bool Changed = false; 10214 for (Expr *C : E->subExpressions()) { 10215 ExprResult NewC = getDerived().TransformExpr(C); 10216 if (NewC.isInvalid()) 10217 return ExprError(); 10218 Children.push_back(NewC.get()); 10219 10220 Changed |= NewC.get() != C; 10221 } 10222 if (!getDerived().AlwaysRebuild() && !Changed) 10223 return E; 10224 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 10225 Children, E->getType()); 10226 } 10227 10228 template<typename Derived> 10229 ExprResult 10230 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 10231 // Rebuild the syntactic form. The original syntactic form has 10232 // opaque-value expressions in it, so strip those away and rebuild 10233 // the result. This is a really awful way of doing this, but the 10234 // better solution (rebuilding the semantic expressions and 10235 // rebinding OVEs as necessary) doesn't work; we'd need 10236 // TreeTransform to not strip away implicit conversions. 10237 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 10238 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 10239 if (result.isInvalid()) return ExprError(); 10240 10241 // If that gives us a pseudo-object result back, the pseudo-object 10242 // expression must have been an lvalue-to-rvalue conversion which we 10243 // should reapply. 10244 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 10245 result = SemaRef.checkPseudoObjectRValue(result.get()); 10246 10247 return result; 10248 } 10249 10250 template<typename Derived> 10251 ExprResult 10252 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 10253 UnaryExprOrTypeTraitExpr *E) { 10254 if (E->isArgumentType()) { 10255 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 10256 10257 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10258 if (!NewT) 10259 return ExprError(); 10260 10261 if (!getDerived().AlwaysRebuild() && OldT == NewT) 10262 return E; 10263 10264 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 10265 E->getKind(), 10266 E->getSourceRange()); 10267 } 10268 10269 // C++0x [expr.sizeof]p1: 10270 // The operand is either an expression, which is an unevaluated operand 10271 // [...] 10272 EnterExpressionEvaluationContext Unevaluated( 10273 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10274 Sema::ReuseLambdaContextDecl); 10275 10276 // Try to recover if we have something like sizeof(T::X) where X is a type. 10277 // Notably, there must be *exactly* one set of parens if X is a type. 10278 TypeSourceInfo *RecoveryTSI = nullptr; 10279 ExprResult SubExpr; 10280 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 10281 if (auto *DRE = 10282 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 10283 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 10284 PE, DRE, false, &RecoveryTSI); 10285 else 10286 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 10287 10288 if (RecoveryTSI) { 10289 return getDerived().RebuildUnaryExprOrTypeTrait( 10290 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 10291 } else if (SubExpr.isInvalid()) 10292 return ExprError(); 10293 10294 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 10295 return E; 10296 10297 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 10298 E->getOperatorLoc(), 10299 E->getKind(), 10300 E->getSourceRange()); 10301 } 10302 10303 template<typename Derived> 10304 ExprResult 10305 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10306 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10307 if (LHS.isInvalid()) 10308 return ExprError(); 10309 10310 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10311 if (RHS.isInvalid()) 10312 return ExprError(); 10313 10314 10315 if (!getDerived().AlwaysRebuild() && 10316 LHS.get() == E->getLHS() && 10317 RHS.get() == E->getRHS()) 10318 return E; 10319 10320 return getDerived().RebuildArraySubscriptExpr( 10321 LHS.get(), 10322 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10323 } 10324 10325 template <typename Derived> 10326 ExprResult 10327 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) { 10328 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10329 if (Base.isInvalid()) 10330 return ExprError(); 10331 10332 ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx()); 10333 if (RowIdx.isInvalid()) 10334 return ExprError(); 10335 10336 ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx()); 10337 if (ColumnIdx.isInvalid()) 10338 return ExprError(); 10339 10340 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10341 RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx()) 10342 return E; 10343 10344 return getDerived().RebuildMatrixSubscriptExpr( 10345 Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc()); 10346 } 10347 10348 template <typename Derived> 10349 ExprResult 10350 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10351 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10352 if (Base.isInvalid()) 10353 return ExprError(); 10354 10355 ExprResult LowerBound; 10356 if (E->getLowerBound()) { 10357 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10358 if (LowerBound.isInvalid()) 10359 return ExprError(); 10360 } 10361 10362 ExprResult Length; 10363 if (E->getLength()) { 10364 Length = getDerived().TransformExpr(E->getLength()); 10365 if (Length.isInvalid()) 10366 return ExprError(); 10367 } 10368 10369 ExprResult Stride; 10370 if (Expr *Str = E->getStride()) { 10371 Stride = getDerived().TransformExpr(Str); 10372 if (Stride.isInvalid()) 10373 return ExprError(); 10374 } 10375 10376 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10377 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10378 return E; 10379 10380 return getDerived().RebuildOMPArraySectionExpr( 10381 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), 10382 E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(), 10383 E->getRBracketLoc()); 10384 } 10385 10386 template <typename Derived> 10387 ExprResult 10388 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10389 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10390 if (Base.isInvalid()) 10391 return ExprError(); 10392 10393 SmallVector<Expr *, 4> Dims; 10394 bool ErrorFound = false; 10395 for (Expr *Dim : E->getDimensions()) { 10396 ExprResult DimRes = getDerived().TransformExpr(Dim); 10397 if (DimRes.isInvalid()) { 10398 ErrorFound = true; 10399 continue; 10400 } 10401 Dims.push_back(DimRes.get()); 10402 } 10403 10404 if (ErrorFound) 10405 return ExprError(); 10406 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10407 E->getRParenLoc(), Dims, 10408 E->getBracketsRanges()); 10409 } 10410 10411 template <typename Derived> 10412 ExprResult 10413 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10414 unsigned NumIterators = E->numOfIterators(); 10415 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10416 10417 bool ErrorFound = false; 10418 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10419 for (unsigned I = 0; I < NumIterators; ++I) { 10420 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10421 Data[I].DeclIdent = D->getIdentifier(); 10422 Data[I].DeclIdentLoc = D->getLocation(); 10423 if (D->getLocation() == D->getBeginLoc()) { 10424 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10425 "Implicit type must be int."); 10426 } else { 10427 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10428 QualType DeclTy = getDerived().TransformType(D->getType()); 10429 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10430 } 10431 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10432 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10433 ExprResult End = getDerived().TransformExpr(Range.End); 10434 ExprResult Step = getDerived().TransformExpr(Range.Step); 10435 ErrorFound = ErrorFound || 10436 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10437 !Data[I].Type.get().isNull())) || 10438 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10439 if (ErrorFound) 10440 continue; 10441 Data[I].Range.Begin = Begin.get(); 10442 Data[I].Range.End = End.get(); 10443 Data[I].Range.Step = Step.get(); 10444 Data[I].AssignLoc = E->getAssignLoc(I); 10445 Data[I].ColonLoc = E->getColonLoc(I); 10446 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10447 NeedToRebuild = 10448 NeedToRebuild || 10449 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10450 D->getType().getTypePtrOrNull()) || 10451 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10452 Range.Step != Data[I].Range.Step; 10453 } 10454 if (ErrorFound) 10455 return ExprError(); 10456 if (!NeedToRebuild) 10457 return E; 10458 10459 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10460 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10461 if (!Res.isUsable()) 10462 return Res; 10463 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10464 for (unsigned I = 0; I < NumIterators; ++I) 10465 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10466 IE->getIteratorDecl(I)); 10467 return Res; 10468 } 10469 10470 template<typename Derived> 10471 ExprResult 10472 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10473 // Transform the callee. 10474 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10475 if (Callee.isInvalid()) 10476 return ExprError(); 10477 10478 // Transform arguments. 10479 bool ArgChanged = false; 10480 SmallVector<Expr*, 8> Args; 10481 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10482 &ArgChanged)) 10483 return ExprError(); 10484 10485 if (!getDerived().AlwaysRebuild() && 10486 Callee.get() == E->getCallee() && 10487 !ArgChanged) 10488 return SemaRef.MaybeBindToTemporary(E); 10489 10490 // FIXME: Wrong source location information for the '('. 10491 SourceLocation FakeLParenLoc 10492 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10493 10494 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10495 if (E->hasStoredFPFeatures()) { 10496 FPOptionsOverride NewOverrides = E->getFPFeatures(); 10497 getSema().CurFPFeatures = 10498 NewOverrides.applyOverrides(getSema().getLangOpts()); 10499 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10500 } 10501 10502 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10503 Args, 10504 E->getRParenLoc()); 10505 } 10506 10507 template<typename Derived> 10508 ExprResult 10509 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10510 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10511 if (Base.isInvalid()) 10512 return ExprError(); 10513 10514 NestedNameSpecifierLoc QualifierLoc; 10515 if (E->hasQualifier()) { 10516 QualifierLoc 10517 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10518 10519 if (!QualifierLoc) 10520 return ExprError(); 10521 } 10522 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10523 10524 ValueDecl *Member 10525 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10526 E->getMemberDecl())); 10527 if (!Member) 10528 return ExprError(); 10529 10530 NamedDecl *FoundDecl = E->getFoundDecl(); 10531 if (FoundDecl == E->getMemberDecl()) { 10532 FoundDecl = Member; 10533 } else { 10534 FoundDecl = cast_or_null<NamedDecl>( 10535 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10536 if (!FoundDecl) 10537 return ExprError(); 10538 } 10539 10540 if (!getDerived().AlwaysRebuild() && 10541 Base.get() == E->getBase() && 10542 QualifierLoc == E->getQualifierLoc() && 10543 Member == E->getMemberDecl() && 10544 FoundDecl == E->getFoundDecl() && 10545 !E->hasExplicitTemplateArgs()) { 10546 10547 // Mark it referenced in the new context regardless. 10548 // FIXME: this is a bit instantiation-specific. 10549 SemaRef.MarkMemberReferenced(E); 10550 10551 return E; 10552 } 10553 10554 TemplateArgumentListInfo TransArgs; 10555 if (E->hasExplicitTemplateArgs()) { 10556 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10557 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10558 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10559 E->getNumTemplateArgs(), 10560 TransArgs)) 10561 return ExprError(); 10562 } 10563 10564 // FIXME: Bogus source location for the operator 10565 SourceLocation FakeOperatorLoc = 10566 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10567 10568 // FIXME: to do this check properly, we will need to preserve the 10569 // first-qualifier-in-scope here, just in case we had a dependent 10570 // base (and therefore couldn't do the check) and a 10571 // nested-name-qualifier (and therefore could do the lookup). 10572 NamedDecl *FirstQualifierInScope = nullptr; 10573 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10574 if (MemberNameInfo.getName()) { 10575 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10576 if (!MemberNameInfo.getName()) 10577 return ExprError(); 10578 } 10579 10580 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10581 E->isArrow(), 10582 QualifierLoc, 10583 TemplateKWLoc, 10584 MemberNameInfo, 10585 Member, 10586 FoundDecl, 10587 (E->hasExplicitTemplateArgs() 10588 ? &TransArgs : nullptr), 10589 FirstQualifierInScope); 10590 } 10591 10592 template<typename Derived> 10593 ExprResult 10594 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10595 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10596 if (LHS.isInvalid()) 10597 return ExprError(); 10598 10599 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10600 if (RHS.isInvalid()) 10601 return ExprError(); 10602 10603 if (!getDerived().AlwaysRebuild() && 10604 LHS.get() == E->getLHS() && 10605 RHS.get() == E->getRHS()) 10606 return E; 10607 10608 if (E->isCompoundAssignmentOp()) 10609 // FPFeatures has already been established from trailing storage 10610 return getDerived().RebuildBinaryOperator( 10611 E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get()); 10612 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10613 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10614 getSema().CurFPFeatures = 10615 NewOverrides.applyOverrides(getSema().getLangOpts()); 10616 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10617 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10618 LHS.get(), RHS.get()); 10619 } 10620 10621 template <typename Derived> 10622 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10623 CXXRewrittenBinaryOperator *E) { 10624 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10625 10626 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10627 if (LHS.isInvalid()) 10628 return ExprError(); 10629 10630 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10631 if (RHS.isInvalid()) 10632 return ExprError(); 10633 10634 if (!getDerived().AlwaysRebuild() && 10635 LHS.get() == Decomp.LHS && 10636 RHS.get() == Decomp.RHS) 10637 return E; 10638 10639 // Extract the already-resolved callee declarations so that we can restrict 10640 // ourselves to using them as the unqualified lookup results when rebuilding. 10641 UnresolvedSet<2> UnqualLookups; 10642 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10643 const_cast<Expr *>(Decomp.InnerBinOp)}; 10644 for (Expr *PossibleBinOp : PossibleBinOps) { 10645 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10646 if (!Op) 10647 continue; 10648 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10649 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10650 continue; 10651 10652 // Transform the callee in case we built a call to a local extern 10653 // declaration. 10654 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10655 E->getOperatorLoc(), Callee->getFoundDecl())); 10656 if (!Found) 10657 return ExprError(); 10658 UnqualLookups.addDecl(Found); 10659 } 10660 10661 return getDerived().RebuildCXXRewrittenBinaryOperator( 10662 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10663 } 10664 10665 template<typename Derived> 10666 ExprResult 10667 TreeTransform<Derived>::TransformCompoundAssignOperator( 10668 CompoundAssignOperator *E) { 10669 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10670 FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts())); 10671 getSema().CurFPFeatures = 10672 NewOverrides.applyOverrides(getSema().getLangOpts()); 10673 getSema().FpPragmaStack.CurrentValue = NewOverrides; 10674 return getDerived().TransformBinaryOperator(E); 10675 } 10676 10677 template<typename Derived> 10678 ExprResult TreeTransform<Derived>:: 10679 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10680 // Just rebuild the common and RHS expressions and see whether we 10681 // get any changes. 10682 10683 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10684 if (commonExpr.isInvalid()) 10685 return ExprError(); 10686 10687 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10688 if (rhs.isInvalid()) 10689 return ExprError(); 10690 10691 if (!getDerived().AlwaysRebuild() && 10692 commonExpr.get() == e->getCommon() && 10693 rhs.get() == e->getFalseExpr()) 10694 return e; 10695 10696 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10697 e->getQuestionLoc(), 10698 nullptr, 10699 e->getColonLoc(), 10700 rhs.get()); 10701 } 10702 10703 template<typename Derived> 10704 ExprResult 10705 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10706 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10707 if (Cond.isInvalid()) 10708 return ExprError(); 10709 10710 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10711 if (LHS.isInvalid()) 10712 return ExprError(); 10713 10714 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10715 if (RHS.isInvalid()) 10716 return ExprError(); 10717 10718 if (!getDerived().AlwaysRebuild() && 10719 Cond.get() == E->getCond() && 10720 LHS.get() == E->getLHS() && 10721 RHS.get() == E->getRHS()) 10722 return E; 10723 10724 return getDerived().RebuildConditionalOperator(Cond.get(), 10725 E->getQuestionLoc(), 10726 LHS.get(), 10727 E->getColonLoc(), 10728 RHS.get()); 10729 } 10730 10731 template<typename Derived> 10732 ExprResult 10733 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10734 // Implicit casts are eliminated during transformation, since they 10735 // will be recomputed by semantic analysis after transformation. 10736 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10737 } 10738 10739 template<typename Derived> 10740 ExprResult 10741 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10742 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10743 if (!Type) 10744 return ExprError(); 10745 10746 ExprResult SubExpr 10747 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10748 if (SubExpr.isInvalid()) 10749 return ExprError(); 10750 10751 if (!getDerived().AlwaysRebuild() && 10752 Type == E->getTypeInfoAsWritten() && 10753 SubExpr.get() == E->getSubExpr()) 10754 return E; 10755 10756 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10757 Type, 10758 E->getRParenLoc(), 10759 SubExpr.get()); 10760 } 10761 10762 template<typename Derived> 10763 ExprResult 10764 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10765 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10766 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10767 if (!NewT) 10768 return ExprError(); 10769 10770 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10771 if (Init.isInvalid()) 10772 return ExprError(); 10773 10774 if (!getDerived().AlwaysRebuild() && 10775 OldT == NewT && 10776 Init.get() == E->getInitializer()) 10777 return SemaRef.MaybeBindToTemporary(E); 10778 10779 // Note: the expression type doesn't necessarily match the 10780 // type-as-written, but that's okay, because it should always be 10781 // derivable from the initializer. 10782 10783 return getDerived().RebuildCompoundLiteralExpr( 10784 E->getLParenLoc(), NewT, 10785 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10786 } 10787 10788 template<typename Derived> 10789 ExprResult 10790 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10791 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10792 if (Base.isInvalid()) 10793 return ExprError(); 10794 10795 if (!getDerived().AlwaysRebuild() && 10796 Base.get() == E->getBase()) 10797 return E; 10798 10799 // FIXME: Bad source location 10800 SourceLocation FakeOperatorLoc = 10801 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10802 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10803 E->getAccessorLoc(), 10804 E->getAccessor()); 10805 } 10806 10807 template<typename Derived> 10808 ExprResult 10809 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10810 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10811 E = Syntactic; 10812 10813 bool InitChanged = false; 10814 10815 EnterExpressionEvaluationContext Context( 10816 getSema(), EnterExpressionEvaluationContext::InitList); 10817 10818 SmallVector<Expr*, 4> Inits; 10819 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 10820 Inits, &InitChanged)) 10821 return ExprError(); 10822 10823 if (!getDerived().AlwaysRebuild() && !InitChanged) { 10824 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 10825 // in some cases. We can't reuse it in general, because the syntactic and 10826 // semantic forms are linked, and we can't know that semantic form will 10827 // match even if the syntactic form does. 10828 } 10829 10830 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 10831 E->getRBraceLoc()); 10832 } 10833 10834 template<typename Derived> 10835 ExprResult 10836 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 10837 Designation Desig; 10838 10839 // transform the initializer value 10840 ExprResult Init = getDerived().TransformExpr(E->getInit()); 10841 if (Init.isInvalid()) 10842 return ExprError(); 10843 10844 // transform the designators. 10845 SmallVector<Expr*, 4> ArrayExprs; 10846 bool ExprChanged = false; 10847 for (const DesignatedInitExpr::Designator &D : E->designators()) { 10848 if (D.isFieldDesignator()) { 10849 Desig.AddDesignator(Designator::getField(D.getFieldName(), 10850 D.getDotLoc(), 10851 D.getFieldLoc())); 10852 if (D.getField()) { 10853 FieldDecl *Field = cast_or_null<FieldDecl>( 10854 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 10855 if (Field != D.getField()) 10856 // Rebuild the expression when the transformed FieldDecl is 10857 // different to the already assigned FieldDecl. 10858 ExprChanged = true; 10859 } else { 10860 // Ensure that the designator expression is rebuilt when there isn't 10861 // a resolved FieldDecl in the designator as we don't want to assign 10862 // a FieldDecl to a pattern designator that will be instantiated again. 10863 ExprChanged = true; 10864 } 10865 continue; 10866 } 10867 10868 if (D.isArrayDesignator()) { 10869 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 10870 if (Index.isInvalid()) 10871 return ExprError(); 10872 10873 Desig.AddDesignator( 10874 Designator::getArray(Index.get(), D.getLBracketLoc())); 10875 10876 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 10877 ArrayExprs.push_back(Index.get()); 10878 continue; 10879 } 10880 10881 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 10882 ExprResult Start 10883 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 10884 if (Start.isInvalid()) 10885 return ExprError(); 10886 10887 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 10888 if (End.isInvalid()) 10889 return ExprError(); 10890 10891 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 10892 End.get(), 10893 D.getLBracketLoc(), 10894 D.getEllipsisLoc())); 10895 10896 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 10897 End.get() != E->getArrayRangeEnd(D); 10898 10899 ArrayExprs.push_back(Start.get()); 10900 ArrayExprs.push_back(End.get()); 10901 } 10902 10903 if (!getDerived().AlwaysRebuild() && 10904 Init.get() == E->getInit() && 10905 !ExprChanged) 10906 return E; 10907 10908 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 10909 E->getEqualOrColonLoc(), 10910 E->usesGNUSyntax(), Init.get()); 10911 } 10912 10913 // Seems that if TransformInitListExpr() only works on the syntactic form of an 10914 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 10915 template<typename Derived> 10916 ExprResult 10917 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 10918 DesignatedInitUpdateExpr *E) { 10919 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 10920 "initializer"); 10921 return ExprError(); 10922 } 10923 10924 template<typename Derived> 10925 ExprResult 10926 TreeTransform<Derived>::TransformNoInitExpr( 10927 NoInitExpr *E) { 10928 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 10929 return ExprError(); 10930 } 10931 10932 template<typename Derived> 10933 ExprResult 10934 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 10935 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 10936 return ExprError(); 10937 } 10938 10939 template<typename Derived> 10940 ExprResult 10941 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 10942 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 10943 return ExprError(); 10944 } 10945 10946 template<typename Derived> 10947 ExprResult 10948 TreeTransform<Derived>::TransformImplicitValueInitExpr( 10949 ImplicitValueInitExpr *E) { 10950 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 10951 10952 // FIXME: Will we ever have proper type location here? Will we actually 10953 // need to transform the type? 10954 QualType T = getDerived().TransformType(E->getType()); 10955 if (T.isNull()) 10956 return ExprError(); 10957 10958 if (!getDerived().AlwaysRebuild() && 10959 T == E->getType()) 10960 return E; 10961 10962 return getDerived().RebuildImplicitValueInitExpr(T); 10963 } 10964 10965 template<typename Derived> 10966 ExprResult 10967 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 10968 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 10969 if (!TInfo) 10970 return ExprError(); 10971 10972 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10973 if (SubExpr.isInvalid()) 10974 return ExprError(); 10975 10976 if (!getDerived().AlwaysRebuild() && 10977 TInfo == E->getWrittenTypeInfo() && 10978 SubExpr.get() == E->getSubExpr()) 10979 return E; 10980 10981 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 10982 TInfo, E->getRParenLoc()); 10983 } 10984 10985 template<typename Derived> 10986 ExprResult 10987 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 10988 bool ArgumentChanged = false; 10989 SmallVector<Expr*, 4> Inits; 10990 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 10991 &ArgumentChanged)) 10992 return ExprError(); 10993 10994 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 10995 Inits, 10996 E->getRParenLoc()); 10997 } 10998 10999 /// Transform an address-of-label expression. 11000 /// 11001 /// By default, the transformation of an address-of-label expression always 11002 /// rebuilds the expression, so that the label identifier can be resolved to 11003 /// the corresponding label statement by semantic analysis. 11004 template<typename Derived> 11005 ExprResult 11006 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 11007 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 11008 E->getLabel()); 11009 if (!LD) 11010 return ExprError(); 11011 11012 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 11013 cast<LabelDecl>(LD)); 11014 } 11015 11016 template<typename Derived> 11017 ExprResult 11018 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 11019 SemaRef.ActOnStartStmtExpr(); 11020 StmtResult SubStmt 11021 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 11022 if (SubStmt.isInvalid()) { 11023 SemaRef.ActOnStmtExprError(); 11024 return ExprError(); 11025 } 11026 11027 unsigned OldDepth = E->getTemplateDepth(); 11028 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 11029 11030 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 11031 SubStmt.get() == E->getSubStmt()) { 11032 // Calling this an 'error' is unintuitive, but it does the right thing. 11033 SemaRef.ActOnStmtExprError(); 11034 return SemaRef.MaybeBindToTemporary(E); 11035 } 11036 11037 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 11038 E->getRParenLoc(), NewDepth); 11039 } 11040 11041 template<typename Derived> 11042 ExprResult 11043 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 11044 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 11045 if (Cond.isInvalid()) 11046 return ExprError(); 11047 11048 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 11049 if (LHS.isInvalid()) 11050 return ExprError(); 11051 11052 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 11053 if (RHS.isInvalid()) 11054 return ExprError(); 11055 11056 if (!getDerived().AlwaysRebuild() && 11057 Cond.get() == E->getCond() && 11058 LHS.get() == E->getLHS() && 11059 RHS.get() == E->getRHS()) 11060 return E; 11061 11062 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 11063 Cond.get(), LHS.get(), RHS.get(), 11064 E->getRParenLoc()); 11065 } 11066 11067 template<typename Derived> 11068 ExprResult 11069 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 11070 return E; 11071 } 11072 11073 template<typename Derived> 11074 ExprResult 11075 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 11076 switch (E->getOperator()) { 11077 case OO_New: 11078 case OO_Delete: 11079 case OO_Array_New: 11080 case OO_Array_Delete: 11081 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 11082 11083 case OO_Call: { 11084 // This is a call to an object's operator(). 11085 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 11086 11087 // Transform the object itself. 11088 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 11089 if (Object.isInvalid()) 11090 return ExprError(); 11091 11092 // FIXME: Poor location information 11093 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 11094 static_cast<Expr *>(Object.get())->getEndLoc()); 11095 11096 // Transform the call arguments. 11097 SmallVector<Expr*, 8> Args; 11098 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 11099 Args)) 11100 return ExprError(); 11101 11102 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 11103 E->getEndLoc()); 11104 } 11105 11106 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 11107 case OO_##Name: 11108 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 11109 #include "clang/Basic/OperatorKinds.def" 11110 case OO_Subscript: 11111 // Handled below. 11112 break; 11113 11114 case OO_Conditional: 11115 llvm_unreachable("conditional operator is not actually overloadable"); 11116 11117 case OO_None: 11118 case NUM_OVERLOADED_OPERATORS: 11119 llvm_unreachable("not an overloaded operator?"); 11120 } 11121 11122 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11123 if (Callee.isInvalid()) 11124 return ExprError(); 11125 11126 ExprResult First; 11127 if (E->getOperator() == OO_Amp) 11128 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 11129 else 11130 First = getDerived().TransformExpr(E->getArg(0)); 11131 if (First.isInvalid()) 11132 return ExprError(); 11133 11134 ExprResult Second; 11135 if (E->getNumArgs() == 2) { 11136 Second = getDerived().TransformExpr(E->getArg(1)); 11137 if (Second.isInvalid()) 11138 return ExprError(); 11139 } 11140 11141 if (!getDerived().AlwaysRebuild() && 11142 Callee.get() == E->getCallee() && 11143 First.get() == E->getArg(0) && 11144 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 11145 return SemaRef.MaybeBindToTemporary(E); 11146 11147 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 11148 FPOptionsOverride NewOverrides(E->getFPFeatures()); 11149 getSema().CurFPFeatures = 11150 NewOverrides.applyOverrides(getSema().getLangOpts()); 11151 getSema().FpPragmaStack.CurrentValue = NewOverrides; 11152 11153 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 11154 E->getOperatorLoc(), 11155 Callee.get(), 11156 First.get(), 11157 Second.get()); 11158 } 11159 11160 template<typename Derived> 11161 ExprResult 11162 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 11163 return getDerived().TransformCallExpr(E); 11164 } 11165 11166 template <typename Derived> 11167 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 11168 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 11169 getSema().CurContext != E->getParentContext(); 11170 11171 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 11172 return E; 11173 11174 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 11175 E->getEndLoc(), 11176 getSema().CurContext); 11177 } 11178 11179 template<typename Derived> 11180 ExprResult 11181 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 11182 // Transform the callee. 11183 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 11184 if (Callee.isInvalid()) 11185 return ExprError(); 11186 11187 // Transform exec config. 11188 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 11189 if (EC.isInvalid()) 11190 return ExprError(); 11191 11192 // Transform arguments. 11193 bool ArgChanged = false; 11194 SmallVector<Expr*, 8> Args; 11195 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11196 &ArgChanged)) 11197 return ExprError(); 11198 11199 if (!getDerived().AlwaysRebuild() && 11200 Callee.get() == E->getCallee() && 11201 !ArgChanged) 11202 return SemaRef.MaybeBindToTemporary(E); 11203 11204 // FIXME: Wrong source location information for the '('. 11205 SourceLocation FakeLParenLoc 11206 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 11207 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 11208 Args, 11209 E->getRParenLoc(), EC.get()); 11210 } 11211 11212 template<typename Derived> 11213 ExprResult 11214 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 11215 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 11216 if (!Type) 11217 return ExprError(); 11218 11219 ExprResult SubExpr 11220 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11221 if (SubExpr.isInvalid()) 11222 return ExprError(); 11223 11224 if (!getDerived().AlwaysRebuild() && 11225 Type == E->getTypeInfoAsWritten() && 11226 SubExpr.get() == E->getSubExpr()) 11227 return E; 11228 return getDerived().RebuildCXXNamedCastExpr( 11229 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 11230 Type, E->getAngleBrackets().getEnd(), 11231 // FIXME. this should be '(' location 11232 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 11233 } 11234 11235 template<typename Derived> 11236 ExprResult 11237 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 11238 TypeSourceInfo *TSI = 11239 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 11240 if (!TSI) 11241 return ExprError(); 11242 11243 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 11244 if (Sub.isInvalid()) 11245 return ExprError(); 11246 11247 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 11248 Sub.get(), BCE->getEndLoc()); 11249 } 11250 11251 template<typename Derived> 11252 ExprResult 11253 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 11254 return getDerived().TransformCXXNamedCastExpr(E); 11255 } 11256 11257 template<typename Derived> 11258 ExprResult 11259 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 11260 return getDerived().TransformCXXNamedCastExpr(E); 11261 } 11262 11263 template<typename Derived> 11264 ExprResult 11265 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 11266 CXXReinterpretCastExpr *E) { 11267 return getDerived().TransformCXXNamedCastExpr(E); 11268 } 11269 11270 template<typename Derived> 11271 ExprResult 11272 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 11273 return getDerived().TransformCXXNamedCastExpr(E); 11274 } 11275 11276 template<typename Derived> 11277 ExprResult 11278 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) { 11279 return getDerived().TransformCXXNamedCastExpr(E); 11280 } 11281 11282 template<typename Derived> 11283 ExprResult 11284 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 11285 CXXFunctionalCastExpr *E) { 11286 TypeSourceInfo *Type = 11287 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 11288 if (!Type) 11289 return ExprError(); 11290 11291 ExprResult SubExpr 11292 = getDerived().TransformExpr(E->getSubExprAsWritten()); 11293 if (SubExpr.isInvalid()) 11294 return ExprError(); 11295 11296 if (!getDerived().AlwaysRebuild() && 11297 Type == E->getTypeInfoAsWritten() && 11298 SubExpr.get() == E->getSubExpr()) 11299 return E; 11300 11301 return getDerived().RebuildCXXFunctionalCastExpr(Type, 11302 E->getLParenLoc(), 11303 SubExpr.get(), 11304 E->getRParenLoc(), 11305 E->isListInitialization()); 11306 } 11307 11308 template<typename Derived> 11309 ExprResult 11310 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 11311 if (E->isTypeOperand()) { 11312 TypeSourceInfo *TInfo 11313 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11314 if (!TInfo) 11315 return ExprError(); 11316 11317 if (!getDerived().AlwaysRebuild() && 11318 TInfo == E->getTypeOperandSourceInfo()) 11319 return E; 11320 11321 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11322 TInfo, E->getEndLoc()); 11323 } 11324 11325 // We don't know whether the subexpression is potentially evaluated until 11326 // after we perform semantic analysis. We speculatively assume it is 11327 // unevaluated; it will get fixed later if the subexpression is in fact 11328 // potentially evaluated. 11329 EnterExpressionEvaluationContext Unevaluated( 11330 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 11331 Sema::ReuseLambdaContextDecl); 11332 11333 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11334 if (SubExpr.isInvalid()) 11335 return ExprError(); 11336 11337 if (!getDerived().AlwaysRebuild() && 11338 SubExpr.get() == E->getExprOperand()) 11339 return E; 11340 11341 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 11342 SubExpr.get(), E->getEndLoc()); 11343 } 11344 11345 template<typename Derived> 11346 ExprResult 11347 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 11348 if (E->isTypeOperand()) { 11349 TypeSourceInfo *TInfo 11350 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 11351 if (!TInfo) 11352 return ExprError(); 11353 11354 if (!getDerived().AlwaysRebuild() && 11355 TInfo == E->getTypeOperandSourceInfo()) 11356 return E; 11357 11358 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11359 TInfo, E->getEndLoc()); 11360 } 11361 11362 EnterExpressionEvaluationContext Unevaluated( 11363 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11364 11365 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11366 if (SubExpr.isInvalid()) 11367 return ExprError(); 11368 11369 if (!getDerived().AlwaysRebuild() && 11370 SubExpr.get() == E->getExprOperand()) 11371 return E; 11372 11373 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11374 SubExpr.get(), E->getEndLoc()); 11375 } 11376 11377 template<typename Derived> 11378 ExprResult 11379 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11380 return E; 11381 } 11382 11383 template<typename Derived> 11384 ExprResult 11385 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11386 CXXNullPtrLiteralExpr *E) { 11387 return E; 11388 } 11389 11390 template<typename Derived> 11391 ExprResult 11392 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11393 QualType T = getSema().getCurrentThisType(); 11394 11395 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11396 // Mark it referenced in the new context regardless. 11397 // FIXME: this is a bit instantiation-specific. 11398 getSema().MarkThisReferenced(E); 11399 return E; 11400 } 11401 11402 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11403 } 11404 11405 template<typename Derived> 11406 ExprResult 11407 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11408 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11409 if (SubExpr.isInvalid()) 11410 return ExprError(); 11411 11412 if (!getDerived().AlwaysRebuild() && 11413 SubExpr.get() == E->getSubExpr()) 11414 return E; 11415 11416 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11417 E->isThrownVariableInScope()); 11418 } 11419 11420 template<typename Derived> 11421 ExprResult 11422 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11423 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11424 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11425 if (!Param) 11426 return ExprError(); 11427 11428 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11429 E->getUsedContext() == SemaRef.CurContext) 11430 return E; 11431 11432 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11433 } 11434 11435 template<typename Derived> 11436 ExprResult 11437 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11438 FieldDecl *Field = cast_or_null<FieldDecl>( 11439 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11440 if (!Field) 11441 return ExprError(); 11442 11443 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11444 E->getUsedContext() == SemaRef.CurContext) 11445 return E; 11446 11447 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11448 } 11449 11450 template<typename Derived> 11451 ExprResult 11452 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11453 CXXScalarValueInitExpr *E) { 11454 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11455 if (!T) 11456 return ExprError(); 11457 11458 if (!getDerived().AlwaysRebuild() && 11459 T == E->getTypeSourceInfo()) 11460 return E; 11461 11462 return getDerived().RebuildCXXScalarValueInitExpr(T, 11463 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11464 E->getRParenLoc()); 11465 } 11466 11467 template<typename Derived> 11468 ExprResult 11469 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11470 // Transform the type that we're allocating 11471 TypeSourceInfo *AllocTypeInfo = 11472 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11473 if (!AllocTypeInfo) 11474 return ExprError(); 11475 11476 // Transform the size of the array we're allocating (if any). 11477 Optional<Expr *> ArraySize; 11478 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11479 ExprResult NewArraySize; 11480 if (*OldArraySize) { 11481 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11482 if (NewArraySize.isInvalid()) 11483 return ExprError(); 11484 } 11485 ArraySize = NewArraySize.get(); 11486 } 11487 11488 // Transform the placement arguments (if any). 11489 bool ArgumentChanged = false; 11490 SmallVector<Expr*, 8> PlacementArgs; 11491 if (getDerived().TransformExprs(E->getPlacementArgs(), 11492 E->getNumPlacementArgs(), true, 11493 PlacementArgs, &ArgumentChanged)) 11494 return ExprError(); 11495 11496 // Transform the initializer (if any). 11497 Expr *OldInit = E->getInitializer(); 11498 ExprResult NewInit; 11499 if (OldInit) 11500 NewInit = getDerived().TransformInitializer(OldInit, true); 11501 if (NewInit.isInvalid()) 11502 return ExprError(); 11503 11504 // Transform new operator and delete operator. 11505 FunctionDecl *OperatorNew = nullptr; 11506 if (E->getOperatorNew()) { 11507 OperatorNew = cast_or_null<FunctionDecl>( 11508 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11509 if (!OperatorNew) 11510 return ExprError(); 11511 } 11512 11513 FunctionDecl *OperatorDelete = nullptr; 11514 if (E->getOperatorDelete()) { 11515 OperatorDelete = cast_or_null<FunctionDecl>( 11516 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11517 if (!OperatorDelete) 11518 return ExprError(); 11519 } 11520 11521 if (!getDerived().AlwaysRebuild() && 11522 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11523 ArraySize == E->getArraySize() && 11524 NewInit.get() == OldInit && 11525 OperatorNew == E->getOperatorNew() && 11526 OperatorDelete == E->getOperatorDelete() && 11527 !ArgumentChanged) { 11528 // Mark any declarations we need as referenced. 11529 // FIXME: instantiation-specific. 11530 if (OperatorNew) 11531 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11532 if (OperatorDelete) 11533 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11534 11535 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11536 QualType ElementType 11537 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11538 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11539 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11540 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11541 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11542 } 11543 } 11544 } 11545 11546 return E; 11547 } 11548 11549 QualType AllocType = AllocTypeInfo->getType(); 11550 if (!ArraySize) { 11551 // If no array size was specified, but the new expression was 11552 // instantiated with an array type (e.g., "new T" where T is 11553 // instantiated with "int[4]"), extract the outer bound from the 11554 // array type as our array size. We do this with constant and 11555 // dependently-sized array types. 11556 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11557 if (!ArrayT) { 11558 // Do nothing 11559 } else if (const ConstantArrayType *ConsArrayT 11560 = dyn_cast<ConstantArrayType>(ArrayT)) { 11561 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11562 SemaRef.Context.getSizeType(), 11563 /*FIXME:*/ E->getBeginLoc()); 11564 AllocType = ConsArrayT->getElementType(); 11565 } else if (const DependentSizedArrayType *DepArrayT 11566 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11567 if (DepArrayT->getSizeExpr()) { 11568 ArraySize = DepArrayT->getSizeExpr(); 11569 AllocType = DepArrayT->getElementType(); 11570 } 11571 } 11572 } 11573 11574 return getDerived().RebuildCXXNewExpr( 11575 E->getBeginLoc(), E->isGlobalNew(), 11576 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11577 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11578 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11579 } 11580 11581 template<typename Derived> 11582 ExprResult 11583 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11584 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11585 if (Operand.isInvalid()) 11586 return ExprError(); 11587 11588 // Transform the delete operator, if known. 11589 FunctionDecl *OperatorDelete = nullptr; 11590 if (E->getOperatorDelete()) { 11591 OperatorDelete = cast_or_null<FunctionDecl>( 11592 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11593 if (!OperatorDelete) 11594 return ExprError(); 11595 } 11596 11597 if (!getDerived().AlwaysRebuild() && 11598 Operand.get() == E->getArgument() && 11599 OperatorDelete == E->getOperatorDelete()) { 11600 // Mark any declarations we need as referenced. 11601 // FIXME: instantiation-specific. 11602 if (OperatorDelete) 11603 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11604 11605 if (!E->getArgument()->isTypeDependent()) { 11606 QualType Destroyed = SemaRef.Context.getBaseElementType( 11607 E->getDestroyedType()); 11608 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11609 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11610 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11611 SemaRef.LookupDestructor(Record)); 11612 } 11613 } 11614 11615 return E; 11616 } 11617 11618 return getDerived().RebuildCXXDeleteExpr( 11619 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11620 } 11621 11622 template<typename Derived> 11623 ExprResult 11624 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11625 CXXPseudoDestructorExpr *E) { 11626 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11627 if (Base.isInvalid()) 11628 return ExprError(); 11629 11630 ParsedType ObjectTypePtr; 11631 bool MayBePseudoDestructor = false; 11632 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11633 E->getOperatorLoc(), 11634 E->isArrow()? tok::arrow : tok::period, 11635 ObjectTypePtr, 11636 MayBePseudoDestructor); 11637 if (Base.isInvalid()) 11638 return ExprError(); 11639 11640 QualType ObjectType = ObjectTypePtr.get(); 11641 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11642 if (QualifierLoc) { 11643 QualifierLoc 11644 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11645 if (!QualifierLoc) 11646 return ExprError(); 11647 } 11648 CXXScopeSpec SS; 11649 SS.Adopt(QualifierLoc); 11650 11651 PseudoDestructorTypeStorage Destroyed; 11652 if (E->getDestroyedTypeInfo()) { 11653 TypeSourceInfo *DestroyedTypeInfo 11654 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11655 ObjectType, nullptr, SS); 11656 if (!DestroyedTypeInfo) 11657 return ExprError(); 11658 Destroyed = DestroyedTypeInfo; 11659 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11660 // We aren't likely to be able to resolve the identifier down to a type 11661 // now anyway, so just retain the identifier. 11662 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11663 E->getDestroyedTypeLoc()); 11664 } else { 11665 // Look for a destructor known with the given name. 11666 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11667 *E->getDestroyedTypeIdentifier(), 11668 E->getDestroyedTypeLoc(), 11669 /*Scope=*/nullptr, 11670 SS, ObjectTypePtr, 11671 false); 11672 if (!T) 11673 return ExprError(); 11674 11675 Destroyed 11676 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11677 E->getDestroyedTypeLoc()); 11678 } 11679 11680 TypeSourceInfo *ScopeTypeInfo = nullptr; 11681 if (E->getScopeTypeInfo()) { 11682 CXXScopeSpec EmptySS; 11683 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11684 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11685 if (!ScopeTypeInfo) 11686 return ExprError(); 11687 } 11688 11689 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11690 E->getOperatorLoc(), 11691 E->isArrow(), 11692 SS, 11693 ScopeTypeInfo, 11694 E->getColonColonLoc(), 11695 E->getTildeLoc(), 11696 Destroyed); 11697 } 11698 11699 template <typename Derived> 11700 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11701 bool RequiresADL, 11702 LookupResult &R) { 11703 // Transform all the decls. 11704 bool AllEmptyPacks = true; 11705 for (auto *OldD : Old->decls()) { 11706 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11707 if (!InstD) { 11708 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11709 // This can happen because of dependent hiding. 11710 if (isa<UsingShadowDecl>(OldD)) 11711 continue; 11712 else { 11713 R.clear(); 11714 return true; 11715 } 11716 } 11717 11718 // Expand using pack declarations. 11719 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11720 ArrayRef<NamedDecl*> Decls = SingleDecl; 11721 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11722 Decls = UPD->expansions(); 11723 11724 // Expand using declarations. 11725 for (auto *D : Decls) { 11726 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11727 for (auto *SD : UD->shadows()) 11728 R.addDecl(SD); 11729 } else { 11730 R.addDecl(D); 11731 } 11732 } 11733 11734 AllEmptyPacks &= Decls.empty(); 11735 }; 11736 11737 // C++ [temp.res]/8.4.2: 11738 // The program is ill-formed, no diagnostic required, if [...] lookup for 11739 // a name in the template definition found a using-declaration, but the 11740 // lookup in the corresponding scope in the instantiation odoes not find 11741 // any declarations because the using-declaration was a pack expansion and 11742 // the corresponding pack is empty 11743 if (AllEmptyPacks && !RequiresADL) { 11744 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11745 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11746 return true; 11747 } 11748 11749 // Resolve a kind, but don't do any further analysis. If it's 11750 // ambiguous, the callee needs to deal with it. 11751 R.resolveKind(); 11752 return false; 11753 } 11754 11755 template<typename Derived> 11756 ExprResult 11757 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11758 UnresolvedLookupExpr *Old) { 11759 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11760 Sema::LookupOrdinaryName); 11761 11762 // Transform the declaration set. 11763 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11764 return ExprError(); 11765 11766 // Rebuild the nested-name qualifier, if present. 11767 CXXScopeSpec SS; 11768 if (Old->getQualifierLoc()) { 11769 NestedNameSpecifierLoc QualifierLoc 11770 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11771 if (!QualifierLoc) 11772 return ExprError(); 11773 11774 SS.Adopt(QualifierLoc); 11775 } 11776 11777 if (Old->getNamingClass()) { 11778 CXXRecordDecl *NamingClass 11779 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11780 Old->getNameLoc(), 11781 Old->getNamingClass())); 11782 if (!NamingClass) { 11783 R.clear(); 11784 return ExprError(); 11785 } 11786 11787 R.setNamingClass(NamingClass); 11788 } 11789 11790 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11791 11792 // If we have neither explicit template arguments, nor the template keyword, 11793 // it's a normal declaration name or member reference. 11794 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11795 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11796 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11797 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11798 // give a good diagnostic. 11799 if (D && D->isCXXInstanceMember()) { 11800 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11801 /*TemplateArgs=*/nullptr, 11802 /*Scope=*/nullptr); 11803 } 11804 11805 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11806 } 11807 11808 // If we have template arguments, rebuild them, then rebuild the 11809 // templateid expression. 11810 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11811 if (Old->hasExplicitTemplateArgs() && 11812 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11813 Old->getNumTemplateArgs(), 11814 TransArgs)) { 11815 R.clear(); 11816 return ExprError(); 11817 } 11818 11819 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 11820 Old->requiresADL(), &TransArgs); 11821 } 11822 11823 template<typename Derived> 11824 ExprResult 11825 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 11826 bool ArgChanged = false; 11827 SmallVector<TypeSourceInfo *, 4> Args; 11828 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 11829 TypeSourceInfo *From = E->getArg(I); 11830 TypeLoc FromTL = From->getTypeLoc(); 11831 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 11832 TypeLocBuilder TLB; 11833 TLB.reserve(FromTL.getFullDataSize()); 11834 QualType To = getDerived().TransformType(TLB, FromTL); 11835 if (To.isNull()) 11836 return ExprError(); 11837 11838 if (To == From->getType()) 11839 Args.push_back(From); 11840 else { 11841 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11842 ArgChanged = true; 11843 } 11844 continue; 11845 } 11846 11847 ArgChanged = true; 11848 11849 // We have a pack expansion. Instantiate it. 11850 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 11851 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 11852 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11853 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 11854 11855 // Determine whether the set of unexpanded parameter packs can and should 11856 // be expanded. 11857 bool Expand = true; 11858 bool RetainExpansion = false; 11859 Optional<unsigned> OrigNumExpansions = 11860 ExpansionTL.getTypePtr()->getNumExpansions(); 11861 Optional<unsigned> NumExpansions = OrigNumExpansions; 11862 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 11863 PatternTL.getSourceRange(), 11864 Unexpanded, 11865 Expand, RetainExpansion, 11866 NumExpansions)) 11867 return ExprError(); 11868 11869 if (!Expand) { 11870 // The transform has determined that we should perform a simple 11871 // transformation on the pack expansion, producing another pack 11872 // expansion. 11873 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11874 11875 TypeLocBuilder TLB; 11876 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11877 11878 QualType To = getDerived().TransformType(TLB, PatternTL); 11879 if (To.isNull()) 11880 return ExprError(); 11881 11882 To = getDerived().RebuildPackExpansionType(To, 11883 PatternTL.getSourceRange(), 11884 ExpansionTL.getEllipsisLoc(), 11885 NumExpansions); 11886 if (To.isNull()) 11887 return ExprError(); 11888 11889 PackExpansionTypeLoc ToExpansionTL 11890 = TLB.push<PackExpansionTypeLoc>(To); 11891 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11892 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11893 continue; 11894 } 11895 11896 // Expand the pack expansion by substituting for each argument in the 11897 // pack(s). 11898 for (unsigned I = 0; I != *NumExpansions; ++I) { 11899 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 11900 TypeLocBuilder TLB; 11901 TLB.reserve(PatternTL.getFullDataSize()); 11902 QualType To = getDerived().TransformType(TLB, PatternTL); 11903 if (To.isNull()) 11904 return ExprError(); 11905 11906 if (To->containsUnexpandedParameterPack()) { 11907 To = getDerived().RebuildPackExpansionType(To, 11908 PatternTL.getSourceRange(), 11909 ExpansionTL.getEllipsisLoc(), 11910 NumExpansions); 11911 if (To.isNull()) 11912 return ExprError(); 11913 11914 PackExpansionTypeLoc ToExpansionTL 11915 = TLB.push<PackExpansionTypeLoc>(To); 11916 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11917 } 11918 11919 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11920 } 11921 11922 if (!RetainExpansion) 11923 continue; 11924 11925 // If we're supposed to retain a pack expansion, do so by temporarily 11926 // forgetting the partially-substituted parameter pack. 11927 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11928 11929 TypeLocBuilder TLB; 11930 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11931 11932 QualType To = getDerived().TransformType(TLB, PatternTL); 11933 if (To.isNull()) 11934 return ExprError(); 11935 11936 To = getDerived().RebuildPackExpansionType(To, 11937 PatternTL.getSourceRange(), 11938 ExpansionTL.getEllipsisLoc(), 11939 NumExpansions); 11940 if (To.isNull()) 11941 return ExprError(); 11942 11943 PackExpansionTypeLoc ToExpansionTL 11944 = TLB.push<PackExpansionTypeLoc>(To); 11945 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11946 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11947 } 11948 11949 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11950 return E; 11951 11952 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 11953 E->getEndLoc()); 11954 } 11955 11956 template<typename Derived> 11957 ExprResult 11958 TreeTransform<Derived>::TransformConceptSpecializationExpr( 11959 ConceptSpecializationExpr *E) { 11960 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 11961 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 11962 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11963 Old->NumTemplateArgs, TransArgs)) 11964 return ExprError(); 11965 11966 return getDerived().RebuildConceptSpecializationExpr( 11967 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 11968 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 11969 &TransArgs); 11970 } 11971 11972 template<typename Derived> 11973 ExprResult 11974 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 11975 SmallVector<ParmVarDecl*, 4> TransParams; 11976 SmallVector<QualType, 4> TransParamTypes; 11977 Sema::ExtParameterInfoBuilder ExtParamInfos; 11978 11979 // C++2a [expr.prim.req]p2 11980 // Expressions appearing within a requirement-body are unevaluated operands. 11981 EnterExpressionEvaluationContext Ctx( 11982 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11983 11984 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 11985 getSema().Context, getSema().CurContext, 11986 E->getBody()->getBeginLoc()); 11987 11988 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 11989 11990 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 11991 E->getLocalParameters(), 11992 /*ParamTypes=*/nullptr, 11993 /*ParamInfos=*/nullptr, 11994 TransParamTypes, &TransParams, 11995 ExtParamInfos)) 11996 return ExprError(); 11997 11998 for (ParmVarDecl *Param : TransParams) 11999 Param->setDeclContext(Body); 12000 12001 SmallVector<concepts::Requirement *, 4> TransReqs; 12002 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 12003 TransReqs)) 12004 return ExprError(); 12005 12006 for (concepts::Requirement *Req : TransReqs) { 12007 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 12008 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 12009 ER->getReturnTypeRequirement() 12010 .getTypeConstraintTemplateParameterList()->getParam(0) 12011 ->setDeclContext(Body); 12012 } 12013 } 12014 } 12015 12016 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 12017 TransParams, TransReqs, 12018 E->getRBraceLoc()); 12019 } 12020 12021 template<typename Derived> 12022 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 12023 ArrayRef<concepts::Requirement *> Reqs, 12024 SmallVectorImpl<concepts::Requirement *> &Transformed) { 12025 for (concepts::Requirement *Req : Reqs) { 12026 concepts::Requirement *TransReq = nullptr; 12027 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 12028 TransReq = getDerived().TransformTypeRequirement(TypeReq); 12029 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 12030 TransReq = getDerived().TransformExprRequirement(ExprReq); 12031 else 12032 TransReq = getDerived().TransformNestedRequirement( 12033 cast<concepts::NestedRequirement>(Req)); 12034 if (!TransReq) 12035 return true; 12036 Transformed.push_back(TransReq); 12037 } 12038 return false; 12039 } 12040 12041 template<typename Derived> 12042 concepts::TypeRequirement * 12043 TreeTransform<Derived>::TransformTypeRequirement( 12044 concepts::TypeRequirement *Req) { 12045 if (Req->isSubstitutionFailure()) { 12046 if (getDerived().AlwaysRebuild()) 12047 return getDerived().RebuildTypeRequirement( 12048 Req->getSubstitutionDiagnostic()); 12049 return Req; 12050 } 12051 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 12052 if (!TransType) 12053 return nullptr; 12054 return getDerived().RebuildTypeRequirement(TransType); 12055 } 12056 12057 template<typename Derived> 12058 concepts::ExprRequirement * 12059 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 12060 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 12061 if (Req->isExprSubstitutionFailure()) 12062 TransExpr = Req->getExprSubstitutionDiagnostic(); 12063 else { 12064 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 12065 if (TransExprRes.isInvalid()) 12066 return nullptr; 12067 TransExpr = TransExprRes.get(); 12068 } 12069 12070 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 12071 const auto &RetReq = Req->getReturnTypeRequirement(); 12072 if (RetReq.isEmpty()) 12073 TransRetReq.emplace(); 12074 else if (RetReq.isSubstitutionFailure()) 12075 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 12076 else if (RetReq.isTypeConstraint()) { 12077 TemplateParameterList *OrigTPL = 12078 RetReq.getTypeConstraintTemplateParameterList(); 12079 TemplateParameterList *TPL = 12080 getDerived().TransformTemplateParameterList(OrigTPL); 12081 if (!TPL) 12082 return nullptr; 12083 TransRetReq.emplace(TPL); 12084 } 12085 assert(TransRetReq.hasValue() && 12086 "All code paths leading here must set TransRetReq"); 12087 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 12088 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 12089 Req->getNoexceptLoc(), 12090 std::move(*TransRetReq)); 12091 return getDerived().RebuildExprRequirement( 12092 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 12093 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 12094 } 12095 12096 template<typename Derived> 12097 concepts::NestedRequirement * 12098 TreeTransform<Derived>::TransformNestedRequirement( 12099 concepts::NestedRequirement *Req) { 12100 if (Req->isSubstitutionFailure()) { 12101 if (getDerived().AlwaysRebuild()) 12102 return getDerived().RebuildNestedRequirement( 12103 Req->getSubstitutionDiagnostic()); 12104 return Req; 12105 } 12106 ExprResult TransConstraint = 12107 getDerived().TransformExpr(Req->getConstraintExpr()); 12108 if (TransConstraint.isInvalid()) 12109 return nullptr; 12110 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 12111 } 12112 12113 template<typename Derived> 12114 ExprResult 12115 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 12116 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 12117 if (!T) 12118 return ExprError(); 12119 12120 if (!getDerived().AlwaysRebuild() && 12121 T == E->getQueriedTypeSourceInfo()) 12122 return E; 12123 12124 ExprResult SubExpr; 12125 { 12126 EnterExpressionEvaluationContext Unevaluated( 12127 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12128 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 12129 if (SubExpr.isInvalid()) 12130 return ExprError(); 12131 12132 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 12133 return E; 12134 } 12135 12136 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 12137 SubExpr.get(), E->getEndLoc()); 12138 } 12139 12140 template<typename Derived> 12141 ExprResult 12142 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 12143 ExprResult SubExpr; 12144 { 12145 EnterExpressionEvaluationContext Unevaluated( 12146 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12147 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 12148 if (SubExpr.isInvalid()) 12149 return ExprError(); 12150 12151 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 12152 return E; 12153 } 12154 12155 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 12156 SubExpr.get(), E->getEndLoc()); 12157 } 12158 12159 template <typename Derived> 12160 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 12161 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 12162 TypeSourceInfo **RecoveryTSI) { 12163 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 12164 DRE, AddrTaken, RecoveryTSI); 12165 12166 // Propagate both errors and recovered types, which return ExprEmpty. 12167 if (!NewDRE.isUsable()) 12168 return NewDRE; 12169 12170 // We got an expr, wrap it up in parens. 12171 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 12172 return PE; 12173 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 12174 PE->getRParen()); 12175 } 12176 12177 template <typename Derived> 12178 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12179 DependentScopeDeclRefExpr *E) { 12180 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 12181 nullptr); 12182 } 12183 12184 template<typename Derived> 12185 ExprResult 12186 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 12187 DependentScopeDeclRefExpr *E, 12188 bool IsAddressOfOperand, 12189 TypeSourceInfo **RecoveryTSI) { 12190 assert(E->getQualifierLoc()); 12191 NestedNameSpecifierLoc QualifierLoc 12192 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 12193 if (!QualifierLoc) 12194 return ExprError(); 12195 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12196 12197 // TODO: If this is a conversion-function-id, verify that the 12198 // destination type name (if present) resolves the same way after 12199 // instantiation as it did in the local scope. 12200 12201 DeclarationNameInfo NameInfo 12202 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 12203 if (!NameInfo.getName()) 12204 return ExprError(); 12205 12206 if (!E->hasExplicitTemplateArgs()) { 12207 if (!getDerived().AlwaysRebuild() && 12208 QualifierLoc == E->getQualifierLoc() && 12209 // Note: it is sufficient to compare the Name component of NameInfo: 12210 // if name has not changed, DNLoc has not changed either. 12211 NameInfo.getName() == E->getDeclName()) 12212 return E; 12213 12214 return getDerived().RebuildDependentScopeDeclRefExpr( 12215 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 12216 IsAddressOfOperand, RecoveryTSI); 12217 } 12218 12219 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12220 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12221 E->getNumTemplateArgs(), 12222 TransArgs)) 12223 return ExprError(); 12224 12225 return getDerived().RebuildDependentScopeDeclRefExpr( 12226 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 12227 RecoveryTSI); 12228 } 12229 12230 template<typename Derived> 12231 ExprResult 12232 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 12233 // CXXConstructExprs other than for list-initialization and 12234 // CXXTemporaryObjectExpr are always implicit, so when we have 12235 // a 1-argument construction we just transform that argument. 12236 if (getDerived().AllowSkippingCXXConstructExpr() && 12237 ((E->getNumArgs() == 1 || 12238 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 12239 (!getDerived().DropCallArgument(E->getArg(0))) && 12240 !E->isListInitialization())) 12241 return getDerived().TransformExpr(E->getArg(0)); 12242 12243 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 12244 12245 QualType T = getDerived().TransformType(E->getType()); 12246 if (T.isNull()) 12247 return ExprError(); 12248 12249 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12250 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12251 if (!Constructor) 12252 return ExprError(); 12253 12254 bool ArgumentChanged = false; 12255 SmallVector<Expr*, 8> Args; 12256 { 12257 EnterExpressionEvaluationContext Context( 12258 getSema(), EnterExpressionEvaluationContext::InitList, 12259 E->isListInitialization()); 12260 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12261 &ArgumentChanged)) 12262 return ExprError(); 12263 } 12264 12265 if (!getDerived().AlwaysRebuild() && 12266 T == E->getType() && 12267 Constructor == E->getConstructor() && 12268 !ArgumentChanged) { 12269 // Mark the constructor as referenced. 12270 // FIXME: Instantiation-specific 12271 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12272 return E; 12273 } 12274 12275 return getDerived().RebuildCXXConstructExpr( 12276 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 12277 E->hadMultipleCandidates(), E->isListInitialization(), 12278 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 12279 E->getConstructionKind(), E->getParenOrBraceRange()); 12280 } 12281 12282 template<typename Derived> 12283 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 12284 CXXInheritedCtorInitExpr *E) { 12285 QualType T = getDerived().TransformType(E->getType()); 12286 if (T.isNull()) 12287 return ExprError(); 12288 12289 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12290 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12291 if (!Constructor) 12292 return ExprError(); 12293 12294 if (!getDerived().AlwaysRebuild() && 12295 T == E->getType() && 12296 Constructor == E->getConstructor()) { 12297 // Mark the constructor as referenced. 12298 // FIXME: Instantiation-specific 12299 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12300 return E; 12301 } 12302 12303 return getDerived().RebuildCXXInheritedCtorInitExpr( 12304 T, E->getLocation(), Constructor, 12305 E->constructsVBase(), E->inheritedFromVBase()); 12306 } 12307 12308 /// Transform a C++ temporary-binding expression. 12309 /// 12310 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 12311 /// transform the subexpression and return that. 12312 template<typename Derived> 12313 ExprResult 12314 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 12315 return getDerived().TransformExpr(E->getSubExpr()); 12316 } 12317 12318 /// Transform a C++ expression that contains cleanups that should 12319 /// be run after the expression is evaluated. 12320 /// 12321 /// Since ExprWithCleanups nodes are implicitly generated, we 12322 /// just transform the subexpression and return that. 12323 template<typename Derived> 12324 ExprResult 12325 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 12326 return getDerived().TransformExpr(E->getSubExpr()); 12327 } 12328 12329 template<typename Derived> 12330 ExprResult 12331 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 12332 CXXTemporaryObjectExpr *E) { 12333 TypeSourceInfo *T = 12334 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12335 if (!T) 12336 return ExprError(); 12337 12338 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 12339 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 12340 if (!Constructor) 12341 return ExprError(); 12342 12343 bool ArgumentChanged = false; 12344 SmallVector<Expr*, 8> Args; 12345 Args.reserve(E->getNumArgs()); 12346 { 12347 EnterExpressionEvaluationContext Context( 12348 getSema(), EnterExpressionEvaluationContext::InitList, 12349 E->isListInitialization()); 12350 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 12351 &ArgumentChanged)) 12352 return ExprError(); 12353 } 12354 12355 if (!getDerived().AlwaysRebuild() && 12356 T == E->getTypeSourceInfo() && 12357 Constructor == E->getConstructor() && 12358 !ArgumentChanged) { 12359 // FIXME: Instantiation-specific 12360 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 12361 return SemaRef.MaybeBindToTemporary(E); 12362 } 12363 12364 // FIXME: We should just pass E->isListInitialization(), but we're not 12365 // prepared to handle list-initialization without a child InitListExpr. 12366 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12367 return getDerived().RebuildCXXTemporaryObjectExpr( 12368 T, LParenLoc, Args, E->getEndLoc(), 12369 /*ListInitialization=*/LParenLoc.isInvalid()); 12370 } 12371 12372 template<typename Derived> 12373 ExprResult 12374 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12375 // Transform any init-capture expressions before entering the scope of the 12376 // lambda body, because they are not semantically within that scope. 12377 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12378 struct TransformedInitCapture { 12379 // The location of the ... if the result is retaining a pack expansion. 12380 SourceLocation EllipsisLoc; 12381 // Zero or more expansions of the init-capture. 12382 SmallVector<InitCaptureInfoTy, 4> Expansions; 12383 }; 12384 SmallVector<TransformedInitCapture, 4> InitCaptures; 12385 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12386 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12387 CEnd = E->capture_end(); 12388 C != CEnd; ++C) { 12389 if (!E->isInitCapture(C)) 12390 continue; 12391 12392 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12393 VarDecl *OldVD = C->getCapturedVar(); 12394 12395 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12396 Optional<unsigned> NumExpansions) { 12397 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12398 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12399 12400 if (NewExprInitResult.isInvalid()) { 12401 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12402 return; 12403 } 12404 Expr *NewExprInit = NewExprInitResult.get(); 12405 12406 QualType NewInitCaptureType = 12407 getSema().buildLambdaInitCaptureInitialization( 12408 C->getLocation(), OldVD->getType()->isReferenceType(), 12409 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12410 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12411 NewExprInit); 12412 Result.Expansions.push_back( 12413 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12414 }; 12415 12416 // If this is an init-capture pack, consider expanding the pack now. 12417 if (OldVD->isParameterPack()) { 12418 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12419 ->getTypeLoc() 12420 .castAs<PackExpansionTypeLoc>(); 12421 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12422 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12423 12424 // Determine whether the set of unexpanded parameter packs can and should 12425 // be expanded. 12426 bool Expand = true; 12427 bool RetainExpansion = false; 12428 Optional<unsigned> OrigNumExpansions = 12429 ExpansionTL.getTypePtr()->getNumExpansions(); 12430 Optional<unsigned> NumExpansions = OrigNumExpansions; 12431 if (getDerived().TryExpandParameterPacks( 12432 ExpansionTL.getEllipsisLoc(), 12433 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12434 RetainExpansion, NumExpansions)) 12435 return ExprError(); 12436 if (Expand) { 12437 for (unsigned I = 0; I != *NumExpansions; ++I) { 12438 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12439 SubstInitCapture(SourceLocation(), None); 12440 } 12441 } 12442 if (!Expand || RetainExpansion) { 12443 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12444 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12445 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12446 } 12447 } else { 12448 SubstInitCapture(SourceLocation(), None); 12449 } 12450 } 12451 12452 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12453 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12454 12455 // Transform the template parameters, and add them to the current 12456 // instantiation scope. The null case is handled correctly. 12457 auto TPL = getDerived().TransformTemplateParameterList( 12458 E->getTemplateParameterList()); 12459 LSI->GLTemplateParameterList = TPL; 12460 12461 // Transform the type of the original lambda's call operator. 12462 // The transformation MUST be done in the CurrentInstantiationScope since 12463 // it introduces a mapping of the original to the newly created 12464 // transformed parameters. 12465 TypeSourceInfo *NewCallOpTSI = nullptr; 12466 { 12467 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12468 FunctionProtoTypeLoc OldCallOpFPTL = 12469 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12470 12471 TypeLocBuilder NewCallOpTLBuilder; 12472 SmallVector<QualType, 4> ExceptionStorage; 12473 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12474 QualType NewCallOpType = TransformFunctionProtoType( 12475 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12476 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12477 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12478 ExceptionStorage, Changed); 12479 }); 12480 if (NewCallOpType.isNull()) 12481 return ExprError(); 12482 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12483 NewCallOpType); 12484 } 12485 12486 // Transform the trailing requires clause 12487 ExprResult NewTrailingRequiresClause; 12488 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12489 // FIXME: Concepts: Substitution into requires clause should only happen 12490 // when checking satisfaction. 12491 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12492 12493 // Create the local class that will describe the lambda. 12494 // FIXME: KnownDependent below is wrong when substituting inside a templated 12495 // context that isn't a DeclContext (such as a variable template). 12496 CXXRecordDecl *OldClass = E->getLambdaClass(); 12497 CXXRecordDecl *Class 12498 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12499 NewCallOpTSI, 12500 /*KnownDependent=*/false, 12501 E->getCaptureDefault()); 12502 getDerived().transformedLocalDecl(OldClass, {Class}); 12503 12504 Optional<std::tuple<unsigned, bool, Decl *>> Mangling; 12505 if (getDerived().ReplacingOriginal()) 12506 Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(), 12507 OldClass->hasKnownLambdaInternalLinkage(), 12508 OldClass->getLambdaContextDecl()); 12509 12510 // Build the call operator. 12511 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12512 Class, E->getIntroducerRange(), NewCallOpTSI, 12513 E->getCallOperator()->getEndLoc(), 12514 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12515 E->getCallOperator()->getConstexprKind(), 12516 NewTrailingRequiresClause.get()); 12517 12518 LSI->CallOperator = NewCallOperator; 12519 12520 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12521 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12522 12523 // Number the lambda for linkage purposes if necessary. 12524 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12525 12526 // Introduce the context of the call operator. 12527 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12528 /*NewThisContext*/false); 12529 12530 // Enter the scope of the lambda. 12531 getSema().buildLambdaScope(LSI, NewCallOperator, 12532 E->getIntroducerRange(), 12533 E->getCaptureDefault(), 12534 E->getCaptureDefaultLoc(), 12535 E->hasExplicitParameters(), 12536 E->hasExplicitResultType(), 12537 E->isMutable()); 12538 12539 bool Invalid = false; 12540 12541 // Transform captures. 12542 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12543 CEnd = E->capture_end(); 12544 C != CEnd; ++C) { 12545 // When we hit the first implicit capture, tell Sema that we've finished 12546 // the list of explicit captures. 12547 if (C->isImplicit()) 12548 break; 12549 12550 // Capturing 'this' is trivial. 12551 if (C->capturesThis()) { 12552 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12553 /*BuildAndDiagnose*/ true, nullptr, 12554 C->getCaptureKind() == LCK_StarThis); 12555 continue; 12556 } 12557 // Captured expression will be recaptured during captured variables 12558 // rebuilding. 12559 if (C->capturesVLAType()) 12560 continue; 12561 12562 // Rebuild init-captures, including the implied field declaration. 12563 if (E->isInitCapture(C)) { 12564 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12565 12566 VarDecl *OldVD = C->getCapturedVar(); 12567 llvm::SmallVector<Decl*, 4> NewVDs; 12568 12569 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12570 ExprResult Init = Info.first; 12571 QualType InitQualType = Info.second; 12572 if (Init.isInvalid() || InitQualType.isNull()) { 12573 Invalid = true; 12574 break; 12575 } 12576 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12577 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12578 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12579 if (!NewVD) { 12580 Invalid = true; 12581 break; 12582 } 12583 NewVDs.push_back(NewVD); 12584 getSema().addInitCapture(LSI, NewVD); 12585 } 12586 12587 if (Invalid) 12588 break; 12589 12590 getDerived().transformedLocalDecl(OldVD, NewVDs); 12591 continue; 12592 } 12593 12594 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12595 12596 // Determine the capture kind for Sema. 12597 Sema::TryCaptureKind Kind 12598 = C->isImplicit()? Sema::TryCapture_Implicit 12599 : C->getCaptureKind() == LCK_ByCopy 12600 ? Sema::TryCapture_ExplicitByVal 12601 : Sema::TryCapture_ExplicitByRef; 12602 SourceLocation EllipsisLoc; 12603 if (C->isPackExpansion()) { 12604 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12605 bool ShouldExpand = false; 12606 bool RetainExpansion = false; 12607 Optional<unsigned> NumExpansions; 12608 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12609 C->getLocation(), 12610 Unexpanded, 12611 ShouldExpand, RetainExpansion, 12612 NumExpansions)) { 12613 Invalid = true; 12614 continue; 12615 } 12616 12617 if (ShouldExpand) { 12618 // The transform has determined that we should perform an expansion; 12619 // transform and capture each of the arguments. 12620 // expansion of the pattern. Do so. 12621 VarDecl *Pack = C->getCapturedVar(); 12622 for (unsigned I = 0; I != *NumExpansions; ++I) { 12623 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12624 VarDecl *CapturedVar 12625 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12626 Pack)); 12627 if (!CapturedVar) { 12628 Invalid = true; 12629 continue; 12630 } 12631 12632 // Capture the transformed variable. 12633 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12634 } 12635 12636 // FIXME: Retain a pack expansion if RetainExpansion is true. 12637 12638 continue; 12639 } 12640 12641 EllipsisLoc = C->getEllipsisLoc(); 12642 } 12643 12644 // Transform the captured variable. 12645 VarDecl *CapturedVar 12646 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12647 C->getCapturedVar())); 12648 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12649 Invalid = true; 12650 continue; 12651 } 12652 12653 // Capture the transformed variable. 12654 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12655 EllipsisLoc); 12656 } 12657 getSema().finishLambdaExplicitCaptures(LSI); 12658 12659 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12660 // evaluation context even if we're not transforming the function body. 12661 getSema().PushExpressionEvaluationContext( 12662 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12663 12664 // Instantiate the body of the lambda expression. 12665 StmtResult Body = 12666 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12667 12668 // ActOnLambda* will pop the function scope for us. 12669 FuncScopeCleanup.disable(); 12670 12671 if (Body.isInvalid()) { 12672 SavedContext.pop(); 12673 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12674 /*IsInstantiation=*/true); 12675 return ExprError(); 12676 } 12677 12678 // Copy the LSI before ActOnFinishFunctionBody removes it. 12679 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12680 // the call operator. 12681 auto LSICopy = *LSI; 12682 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12683 /*IsInstantiation*/ true); 12684 SavedContext.pop(); 12685 12686 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12687 &LSICopy); 12688 } 12689 12690 template<typename Derived> 12691 StmtResult 12692 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12693 return TransformStmt(S); 12694 } 12695 12696 template<typename Derived> 12697 StmtResult 12698 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12699 // Transform captures. 12700 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12701 CEnd = E->capture_end(); 12702 C != CEnd; ++C) { 12703 // When we hit the first implicit capture, tell Sema that we've finished 12704 // the list of explicit captures. 12705 if (!C->isImplicit()) 12706 continue; 12707 12708 // Capturing 'this' is trivial. 12709 if (C->capturesThis()) { 12710 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12711 /*BuildAndDiagnose*/ true, nullptr, 12712 C->getCaptureKind() == LCK_StarThis); 12713 continue; 12714 } 12715 // Captured expression will be recaptured during captured variables 12716 // rebuilding. 12717 if (C->capturesVLAType()) 12718 continue; 12719 12720 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12721 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12722 12723 // Transform the captured variable. 12724 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12725 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12726 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12727 return StmtError(); 12728 12729 // Capture the transformed variable. 12730 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12731 } 12732 12733 return S; 12734 } 12735 12736 template<typename Derived> 12737 ExprResult 12738 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12739 CXXUnresolvedConstructExpr *E) { 12740 TypeSourceInfo *T = 12741 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12742 if (!T) 12743 return ExprError(); 12744 12745 bool ArgumentChanged = false; 12746 SmallVector<Expr*, 8> Args; 12747 Args.reserve(E->arg_size()); 12748 { 12749 EnterExpressionEvaluationContext Context( 12750 getSema(), EnterExpressionEvaluationContext::InitList, 12751 E->isListInitialization()); 12752 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 12753 &ArgumentChanged)) 12754 return ExprError(); 12755 } 12756 12757 if (!getDerived().AlwaysRebuild() && 12758 T == E->getTypeSourceInfo() && 12759 !ArgumentChanged) 12760 return E; 12761 12762 // FIXME: we're faking the locations of the commas 12763 return getDerived().RebuildCXXUnresolvedConstructExpr( 12764 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12765 } 12766 12767 template<typename Derived> 12768 ExprResult 12769 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12770 CXXDependentScopeMemberExpr *E) { 12771 // Transform the base of the expression. 12772 ExprResult Base((Expr*) nullptr); 12773 Expr *OldBase; 12774 QualType BaseType; 12775 QualType ObjectType; 12776 if (!E->isImplicitAccess()) { 12777 OldBase = E->getBase(); 12778 Base = getDerived().TransformExpr(OldBase); 12779 if (Base.isInvalid()) 12780 return ExprError(); 12781 12782 // Start the member reference and compute the object's type. 12783 ParsedType ObjectTy; 12784 bool MayBePseudoDestructor = false; 12785 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12786 E->getOperatorLoc(), 12787 E->isArrow()? tok::arrow : tok::period, 12788 ObjectTy, 12789 MayBePseudoDestructor); 12790 if (Base.isInvalid()) 12791 return ExprError(); 12792 12793 ObjectType = ObjectTy.get(); 12794 BaseType = ((Expr*) Base.get())->getType(); 12795 } else { 12796 OldBase = nullptr; 12797 BaseType = getDerived().TransformType(E->getBaseType()); 12798 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12799 } 12800 12801 // Transform the first part of the nested-name-specifier that qualifies 12802 // the member name. 12803 NamedDecl *FirstQualifierInScope 12804 = getDerived().TransformFirstQualifierInScope( 12805 E->getFirstQualifierFoundInScope(), 12806 E->getQualifierLoc().getBeginLoc()); 12807 12808 NestedNameSpecifierLoc QualifierLoc; 12809 if (E->getQualifier()) { 12810 QualifierLoc 12811 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12812 ObjectType, 12813 FirstQualifierInScope); 12814 if (!QualifierLoc) 12815 return ExprError(); 12816 } 12817 12818 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12819 12820 // TODO: If this is a conversion-function-id, verify that the 12821 // destination type name (if present) resolves the same way after 12822 // instantiation as it did in the local scope. 12823 12824 DeclarationNameInfo NameInfo 12825 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 12826 if (!NameInfo.getName()) 12827 return ExprError(); 12828 12829 if (!E->hasExplicitTemplateArgs()) { 12830 // This is a reference to a member without an explicitly-specified 12831 // template argument list. Optimize for this common case. 12832 if (!getDerived().AlwaysRebuild() && 12833 Base.get() == OldBase && 12834 BaseType == E->getBaseType() && 12835 QualifierLoc == E->getQualifierLoc() && 12836 NameInfo.getName() == E->getMember() && 12837 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 12838 return E; 12839 12840 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12841 BaseType, 12842 E->isArrow(), 12843 E->getOperatorLoc(), 12844 QualifierLoc, 12845 TemplateKWLoc, 12846 FirstQualifierInScope, 12847 NameInfo, 12848 /*TemplateArgs*/nullptr); 12849 } 12850 12851 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12852 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12853 E->getNumTemplateArgs(), 12854 TransArgs)) 12855 return ExprError(); 12856 12857 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12858 BaseType, 12859 E->isArrow(), 12860 E->getOperatorLoc(), 12861 QualifierLoc, 12862 TemplateKWLoc, 12863 FirstQualifierInScope, 12864 NameInfo, 12865 &TransArgs); 12866 } 12867 12868 template<typename Derived> 12869 ExprResult 12870 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 12871 // Transform the base of the expression. 12872 ExprResult Base((Expr*) nullptr); 12873 QualType BaseType; 12874 if (!Old->isImplicitAccess()) { 12875 Base = getDerived().TransformExpr(Old->getBase()); 12876 if (Base.isInvalid()) 12877 return ExprError(); 12878 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 12879 Old->isArrow()); 12880 if (Base.isInvalid()) 12881 return ExprError(); 12882 BaseType = Base.get()->getType(); 12883 } else { 12884 BaseType = getDerived().TransformType(Old->getBaseType()); 12885 } 12886 12887 NestedNameSpecifierLoc QualifierLoc; 12888 if (Old->getQualifierLoc()) { 12889 QualifierLoc 12890 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12891 if (!QualifierLoc) 12892 return ExprError(); 12893 } 12894 12895 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12896 12897 LookupResult R(SemaRef, Old->getMemberNameInfo(), 12898 Sema::LookupOrdinaryName); 12899 12900 // Transform the declaration set. 12901 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 12902 return ExprError(); 12903 12904 // Determine the naming class. 12905 if (Old->getNamingClass()) { 12906 CXXRecordDecl *NamingClass 12907 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12908 Old->getMemberLoc(), 12909 Old->getNamingClass())); 12910 if (!NamingClass) 12911 return ExprError(); 12912 12913 R.setNamingClass(NamingClass); 12914 } 12915 12916 TemplateArgumentListInfo TransArgs; 12917 if (Old->hasExplicitTemplateArgs()) { 12918 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 12919 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 12920 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12921 Old->getNumTemplateArgs(), 12922 TransArgs)) 12923 return ExprError(); 12924 } 12925 12926 // FIXME: to do this check properly, we will need to preserve the 12927 // first-qualifier-in-scope here, just in case we had a dependent 12928 // base (and therefore couldn't do the check) and a 12929 // nested-name-qualifier (and therefore could do the lookup). 12930 NamedDecl *FirstQualifierInScope = nullptr; 12931 12932 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 12933 BaseType, 12934 Old->getOperatorLoc(), 12935 Old->isArrow(), 12936 QualifierLoc, 12937 TemplateKWLoc, 12938 FirstQualifierInScope, 12939 R, 12940 (Old->hasExplicitTemplateArgs() 12941 ? &TransArgs : nullptr)); 12942 } 12943 12944 template<typename Derived> 12945 ExprResult 12946 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 12947 EnterExpressionEvaluationContext Unevaluated( 12948 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12949 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 12950 if (SubExpr.isInvalid()) 12951 return ExprError(); 12952 12953 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 12954 return E; 12955 12956 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 12957 } 12958 12959 template<typename Derived> 12960 ExprResult 12961 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 12962 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 12963 if (Pattern.isInvalid()) 12964 return ExprError(); 12965 12966 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 12967 return E; 12968 12969 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 12970 E->getNumExpansions()); 12971 } 12972 12973 template<typename Derived> 12974 ExprResult 12975 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 12976 // If E is not value-dependent, then nothing will change when we transform it. 12977 // Note: This is an instantiation-centric view. 12978 if (!E->isValueDependent()) 12979 return E; 12980 12981 EnterExpressionEvaluationContext Unevaluated( 12982 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 12983 12984 ArrayRef<TemplateArgument> PackArgs; 12985 TemplateArgument ArgStorage; 12986 12987 // Find the argument list to transform. 12988 if (E->isPartiallySubstituted()) { 12989 PackArgs = E->getPartialArguments(); 12990 } else if (E->isValueDependent()) { 12991 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 12992 bool ShouldExpand = false; 12993 bool RetainExpansion = false; 12994 Optional<unsigned> NumExpansions; 12995 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 12996 Unexpanded, 12997 ShouldExpand, RetainExpansion, 12998 NumExpansions)) 12999 return ExprError(); 13000 13001 // If we need to expand the pack, build a template argument from it and 13002 // expand that. 13003 if (ShouldExpand) { 13004 auto *Pack = E->getPack(); 13005 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 13006 ArgStorage = getSema().Context.getPackExpansionType( 13007 getSema().Context.getTypeDeclType(TTPD), None); 13008 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 13009 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 13010 } else { 13011 auto *VD = cast<ValueDecl>(Pack); 13012 ExprResult DRE = getSema().BuildDeclRefExpr( 13013 VD, VD->getType().getNonLValueExprType(getSema().Context), 13014 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 13015 E->getPackLoc()); 13016 if (DRE.isInvalid()) 13017 return ExprError(); 13018 ArgStorage = new (getSema().Context) PackExpansionExpr( 13019 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 13020 } 13021 PackArgs = ArgStorage; 13022 } 13023 } 13024 13025 // If we're not expanding the pack, just transform the decl. 13026 if (!PackArgs.size()) { 13027 auto *Pack = cast_or_null<NamedDecl>( 13028 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 13029 if (!Pack) 13030 return ExprError(); 13031 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 13032 E->getPackLoc(), 13033 E->getRParenLoc(), None, None); 13034 } 13035 13036 // Try to compute the result without performing a partial substitution. 13037 Optional<unsigned> Result = 0; 13038 for (const TemplateArgument &Arg : PackArgs) { 13039 if (!Arg.isPackExpansion()) { 13040 Result = *Result + 1; 13041 continue; 13042 } 13043 13044 TemplateArgumentLoc ArgLoc; 13045 InventTemplateArgumentLoc(Arg, ArgLoc); 13046 13047 // Find the pattern of the pack expansion. 13048 SourceLocation Ellipsis; 13049 Optional<unsigned> OrigNumExpansions; 13050 TemplateArgumentLoc Pattern = 13051 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 13052 OrigNumExpansions); 13053 13054 // Substitute under the pack expansion. Do not expand the pack (yet). 13055 TemplateArgumentLoc OutPattern; 13056 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13057 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 13058 /*Uneval*/ true)) 13059 return true; 13060 13061 // See if we can determine the number of arguments from the result. 13062 Optional<unsigned> NumExpansions = 13063 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 13064 if (!NumExpansions) { 13065 // No: we must be in an alias template expansion, and we're going to need 13066 // to actually expand the packs. 13067 Result = None; 13068 break; 13069 } 13070 13071 Result = *Result + *NumExpansions; 13072 } 13073 13074 // Common case: we could determine the number of expansions without 13075 // substituting. 13076 if (Result) 13077 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13078 E->getPackLoc(), 13079 E->getRParenLoc(), *Result, None); 13080 13081 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 13082 E->getPackLoc()); 13083 { 13084 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 13085 typedef TemplateArgumentLocInventIterator< 13086 Derived, const TemplateArgument*> PackLocIterator; 13087 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 13088 PackLocIterator(*this, PackArgs.end()), 13089 TransformedPackArgs, /*Uneval*/true)) 13090 return ExprError(); 13091 } 13092 13093 // Check whether we managed to fully-expand the pack. 13094 // FIXME: Is it possible for us to do so and not hit the early exit path? 13095 SmallVector<TemplateArgument, 8> Args; 13096 bool PartialSubstitution = false; 13097 for (auto &Loc : TransformedPackArgs.arguments()) { 13098 Args.push_back(Loc.getArgument()); 13099 if (Loc.getArgument().isPackExpansion()) 13100 PartialSubstitution = true; 13101 } 13102 13103 if (PartialSubstitution) 13104 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13105 E->getPackLoc(), 13106 E->getRParenLoc(), None, Args); 13107 13108 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 13109 E->getPackLoc(), E->getRParenLoc(), 13110 Args.size(), None); 13111 } 13112 13113 template<typename Derived> 13114 ExprResult 13115 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 13116 SubstNonTypeTemplateParmPackExpr *E) { 13117 // Default behavior is to do nothing with this transformation. 13118 return E; 13119 } 13120 13121 template<typename Derived> 13122 ExprResult 13123 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 13124 SubstNonTypeTemplateParmExpr *E) { 13125 // Default behavior is to do nothing with this transformation. 13126 return E; 13127 } 13128 13129 template<typename Derived> 13130 ExprResult 13131 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 13132 // Default behavior is to do nothing with this transformation. 13133 return E; 13134 } 13135 13136 template<typename Derived> 13137 ExprResult 13138 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 13139 MaterializeTemporaryExpr *E) { 13140 return getDerived().TransformExpr(E->getSubExpr()); 13141 } 13142 13143 template<typename Derived> 13144 ExprResult 13145 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 13146 UnresolvedLookupExpr *Callee = nullptr; 13147 if (Expr *OldCallee = E->getCallee()) { 13148 ExprResult CalleeResult = getDerived().TransformExpr(OldCallee); 13149 if (CalleeResult.isInvalid()) 13150 return ExprError(); 13151 Callee = cast<UnresolvedLookupExpr>(CalleeResult.get()); 13152 } 13153 13154 Expr *Pattern = E->getPattern(); 13155 13156 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13157 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 13158 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13159 13160 // Determine whether the set of unexpanded parameter packs can and should 13161 // be expanded. 13162 bool Expand = true; 13163 bool RetainExpansion = false; 13164 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 13165 NumExpansions = OrigNumExpansions; 13166 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 13167 Pattern->getSourceRange(), 13168 Unexpanded, 13169 Expand, RetainExpansion, 13170 NumExpansions)) 13171 return true; 13172 13173 if (!Expand) { 13174 // Do not expand any packs here, just transform and rebuild a fold 13175 // expression. 13176 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13177 13178 ExprResult LHS = 13179 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 13180 if (LHS.isInvalid()) 13181 return true; 13182 13183 ExprResult RHS = 13184 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 13185 if (RHS.isInvalid()) 13186 return true; 13187 13188 if (!getDerived().AlwaysRebuild() && 13189 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 13190 return E; 13191 13192 return getDerived().RebuildCXXFoldExpr( 13193 Callee, E->getBeginLoc(), LHS.get(), E->getOperator(), 13194 E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions); 13195 } 13196 13197 // Formally a fold expression expands to nested parenthesized expressions. 13198 // Enforce this limit to avoid creating trees so deep we can't safely traverse 13199 // them. 13200 if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) { 13201 SemaRef.Diag(E->getEllipsisLoc(), 13202 clang::diag::err_fold_expression_limit_exceeded) 13203 << *NumExpansions << SemaRef.getLangOpts().BracketDepth 13204 << E->getSourceRange(); 13205 SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth); 13206 return ExprError(); 13207 } 13208 13209 // The transform has determined that we should perform an elementwise 13210 // expansion of the pattern. Do so. 13211 ExprResult Result = getDerived().TransformExpr(E->getInit()); 13212 if (Result.isInvalid()) 13213 return true; 13214 bool LeftFold = E->isLeftFold(); 13215 13216 // If we're retaining an expansion for a right fold, it is the innermost 13217 // component and takes the init (if any). 13218 if (!LeftFold && RetainExpansion) { 13219 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13220 13221 ExprResult Out = getDerived().TransformExpr(Pattern); 13222 if (Out.isInvalid()) 13223 return true; 13224 13225 Result = getDerived().RebuildCXXFoldExpr( 13226 Callee, E->getBeginLoc(), Out.get(), E->getOperator(), 13227 E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions); 13228 if (Result.isInvalid()) 13229 return true; 13230 } 13231 13232 for (unsigned I = 0; I != *NumExpansions; ++I) { 13233 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 13234 getSema(), LeftFold ? I : *NumExpansions - I - 1); 13235 ExprResult Out = getDerived().TransformExpr(Pattern); 13236 if (Out.isInvalid()) 13237 return true; 13238 13239 if (Out.get()->containsUnexpandedParameterPack()) { 13240 // We still have a pack; retain a pack expansion for this slice. 13241 Result = getDerived().RebuildCXXFoldExpr( 13242 Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 13243 E->getOperator(), E->getEllipsisLoc(), 13244 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 13245 OrigNumExpansions); 13246 } else if (Result.isUsable()) { 13247 // We've got down to a single element; build a binary operator. 13248 Expr *LHS = LeftFold ? Result.get() : Out.get(); 13249 Expr *RHS = LeftFold ? Out.get() : Result.get(); 13250 if (Callee) 13251 Result = getDerived().RebuildCXXOperatorCallExpr( 13252 BinaryOperator::getOverloadedOperator(E->getOperator()), 13253 E->getEllipsisLoc(), Callee, LHS, RHS); 13254 else 13255 Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(), 13256 E->getOperator(), LHS, RHS); 13257 } else 13258 Result = Out; 13259 13260 if (Result.isInvalid()) 13261 return true; 13262 } 13263 13264 // If we're retaining an expansion for a left fold, it is the outermost 13265 // component and takes the complete expansion so far as its init (if any). 13266 if (LeftFold && RetainExpansion) { 13267 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 13268 13269 ExprResult Out = getDerived().TransformExpr(Pattern); 13270 if (Out.isInvalid()) 13271 return true; 13272 13273 Result = getDerived().RebuildCXXFoldExpr( 13274 Callee, E->getBeginLoc(), Result.get(), E->getOperator(), 13275 E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions); 13276 if (Result.isInvalid()) 13277 return true; 13278 } 13279 13280 // If we had no init and an empty pack, and we're not retaining an expansion, 13281 // then produce a fallback value or error. 13282 if (Result.isUnset()) 13283 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 13284 E->getOperator()); 13285 13286 return Result; 13287 } 13288 13289 template<typename Derived> 13290 ExprResult 13291 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 13292 CXXStdInitializerListExpr *E) { 13293 return getDerived().TransformExpr(E->getSubExpr()); 13294 } 13295 13296 template<typename Derived> 13297 ExprResult 13298 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 13299 return SemaRef.MaybeBindToTemporary(E); 13300 } 13301 13302 template<typename Derived> 13303 ExprResult 13304 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 13305 return E; 13306 } 13307 13308 template<typename Derived> 13309 ExprResult 13310 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 13311 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 13312 if (SubExpr.isInvalid()) 13313 return ExprError(); 13314 13315 if (!getDerived().AlwaysRebuild() && 13316 SubExpr.get() == E->getSubExpr()) 13317 return E; 13318 13319 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 13320 } 13321 13322 template<typename Derived> 13323 ExprResult 13324 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 13325 // Transform each of the elements. 13326 SmallVector<Expr *, 8> Elements; 13327 bool ArgChanged = false; 13328 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 13329 /*IsCall=*/false, Elements, &ArgChanged)) 13330 return ExprError(); 13331 13332 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13333 return SemaRef.MaybeBindToTemporary(E); 13334 13335 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 13336 Elements.data(), 13337 Elements.size()); 13338 } 13339 13340 template<typename Derived> 13341 ExprResult 13342 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 13343 ObjCDictionaryLiteral *E) { 13344 // Transform each of the elements. 13345 SmallVector<ObjCDictionaryElement, 8> Elements; 13346 bool ArgChanged = false; 13347 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 13348 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 13349 13350 if (OrigElement.isPackExpansion()) { 13351 // This key/value element is a pack expansion. 13352 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 13353 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 13354 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 13355 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 13356 13357 // Determine whether the set of unexpanded parameter packs can 13358 // and should be expanded. 13359 bool Expand = true; 13360 bool RetainExpansion = false; 13361 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 13362 Optional<unsigned> NumExpansions = OrigNumExpansions; 13363 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 13364 OrigElement.Value->getEndLoc()); 13365 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 13366 PatternRange, Unexpanded, Expand, 13367 RetainExpansion, NumExpansions)) 13368 return ExprError(); 13369 13370 if (!Expand) { 13371 // The transform has determined that we should perform a simple 13372 // transformation on the pack expansion, producing another pack 13373 // expansion. 13374 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13375 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13376 if (Key.isInvalid()) 13377 return ExprError(); 13378 13379 if (Key.get() != OrigElement.Key) 13380 ArgChanged = true; 13381 13382 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13383 if (Value.isInvalid()) 13384 return ExprError(); 13385 13386 if (Value.get() != OrigElement.Value) 13387 ArgChanged = true; 13388 13389 ObjCDictionaryElement Expansion = { 13390 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13391 }; 13392 Elements.push_back(Expansion); 13393 continue; 13394 } 13395 13396 // Record right away that the argument was changed. This needs 13397 // to happen even if the array expands to nothing. 13398 ArgChanged = true; 13399 13400 // The transform has determined that we should perform an elementwise 13401 // expansion of the pattern. Do so. 13402 for (unsigned I = 0; I != *NumExpansions; ++I) { 13403 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13404 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13405 if (Key.isInvalid()) 13406 return ExprError(); 13407 13408 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13409 if (Value.isInvalid()) 13410 return ExprError(); 13411 13412 ObjCDictionaryElement Element = { 13413 Key.get(), Value.get(), SourceLocation(), NumExpansions 13414 }; 13415 13416 // If any unexpanded parameter packs remain, we still have a 13417 // pack expansion. 13418 // FIXME: Can this really happen? 13419 if (Key.get()->containsUnexpandedParameterPack() || 13420 Value.get()->containsUnexpandedParameterPack()) 13421 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13422 13423 Elements.push_back(Element); 13424 } 13425 13426 // FIXME: Retain a pack expansion if RetainExpansion is true. 13427 13428 // We've finished with this pack expansion. 13429 continue; 13430 } 13431 13432 // Transform and check key. 13433 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13434 if (Key.isInvalid()) 13435 return ExprError(); 13436 13437 if (Key.get() != OrigElement.Key) 13438 ArgChanged = true; 13439 13440 // Transform and check value. 13441 ExprResult Value 13442 = getDerived().TransformExpr(OrigElement.Value); 13443 if (Value.isInvalid()) 13444 return ExprError(); 13445 13446 if (Value.get() != OrigElement.Value) 13447 ArgChanged = true; 13448 13449 ObjCDictionaryElement Element = { 13450 Key.get(), Value.get(), SourceLocation(), None 13451 }; 13452 Elements.push_back(Element); 13453 } 13454 13455 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13456 return SemaRef.MaybeBindToTemporary(E); 13457 13458 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13459 Elements); 13460 } 13461 13462 template<typename Derived> 13463 ExprResult 13464 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13465 TypeSourceInfo *EncodedTypeInfo 13466 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13467 if (!EncodedTypeInfo) 13468 return ExprError(); 13469 13470 if (!getDerived().AlwaysRebuild() && 13471 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13472 return E; 13473 13474 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13475 EncodedTypeInfo, 13476 E->getRParenLoc()); 13477 } 13478 13479 template<typename Derived> 13480 ExprResult TreeTransform<Derived>:: 13481 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13482 // This is a kind of implicit conversion, and it needs to get dropped 13483 // and recomputed for the same general reasons that ImplicitCastExprs 13484 // do, as well a more specific one: this expression is only valid when 13485 // it appears *immediately* as an argument expression. 13486 return getDerived().TransformExpr(E->getSubExpr()); 13487 } 13488 13489 template<typename Derived> 13490 ExprResult TreeTransform<Derived>:: 13491 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13492 TypeSourceInfo *TSInfo 13493 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13494 if (!TSInfo) 13495 return ExprError(); 13496 13497 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13498 if (Result.isInvalid()) 13499 return ExprError(); 13500 13501 if (!getDerived().AlwaysRebuild() && 13502 TSInfo == E->getTypeInfoAsWritten() && 13503 Result.get() == E->getSubExpr()) 13504 return E; 13505 13506 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13507 E->getBridgeKeywordLoc(), TSInfo, 13508 Result.get()); 13509 } 13510 13511 template <typename Derived> 13512 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13513 ObjCAvailabilityCheckExpr *E) { 13514 return E; 13515 } 13516 13517 template<typename Derived> 13518 ExprResult 13519 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13520 // Transform arguments. 13521 bool ArgChanged = false; 13522 SmallVector<Expr*, 8> Args; 13523 Args.reserve(E->getNumArgs()); 13524 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13525 &ArgChanged)) 13526 return ExprError(); 13527 13528 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13529 // Class message: transform the receiver type. 13530 TypeSourceInfo *ReceiverTypeInfo 13531 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13532 if (!ReceiverTypeInfo) 13533 return ExprError(); 13534 13535 // If nothing changed, just retain the existing message send. 13536 if (!getDerived().AlwaysRebuild() && 13537 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13538 return SemaRef.MaybeBindToTemporary(E); 13539 13540 // Build a new class message send. 13541 SmallVector<SourceLocation, 16> SelLocs; 13542 E->getSelectorLocs(SelLocs); 13543 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13544 E->getSelector(), 13545 SelLocs, 13546 E->getMethodDecl(), 13547 E->getLeftLoc(), 13548 Args, 13549 E->getRightLoc()); 13550 } 13551 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13552 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13553 if (!E->getMethodDecl()) 13554 return ExprError(); 13555 13556 // Build a new class message send to 'super'. 13557 SmallVector<SourceLocation, 16> SelLocs; 13558 E->getSelectorLocs(SelLocs); 13559 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13560 E->getSelector(), 13561 SelLocs, 13562 E->getReceiverType(), 13563 E->getMethodDecl(), 13564 E->getLeftLoc(), 13565 Args, 13566 E->getRightLoc()); 13567 } 13568 13569 // Instance message: transform the receiver 13570 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13571 "Only class and instance messages may be instantiated"); 13572 ExprResult Receiver 13573 = getDerived().TransformExpr(E->getInstanceReceiver()); 13574 if (Receiver.isInvalid()) 13575 return ExprError(); 13576 13577 // If nothing changed, just retain the existing message send. 13578 if (!getDerived().AlwaysRebuild() && 13579 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13580 return SemaRef.MaybeBindToTemporary(E); 13581 13582 // Build a new instance message send. 13583 SmallVector<SourceLocation, 16> SelLocs; 13584 E->getSelectorLocs(SelLocs); 13585 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13586 E->getSelector(), 13587 SelLocs, 13588 E->getMethodDecl(), 13589 E->getLeftLoc(), 13590 Args, 13591 E->getRightLoc()); 13592 } 13593 13594 template<typename Derived> 13595 ExprResult 13596 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13597 return E; 13598 } 13599 13600 template<typename Derived> 13601 ExprResult 13602 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13603 return E; 13604 } 13605 13606 template<typename Derived> 13607 ExprResult 13608 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13609 // Transform the base expression. 13610 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13611 if (Base.isInvalid()) 13612 return ExprError(); 13613 13614 // We don't need to transform the ivar; it will never change. 13615 13616 // If nothing changed, just retain the existing expression. 13617 if (!getDerived().AlwaysRebuild() && 13618 Base.get() == E->getBase()) 13619 return E; 13620 13621 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13622 E->getLocation(), 13623 E->isArrow(), E->isFreeIvar()); 13624 } 13625 13626 template<typename Derived> 13627 ExprResult 13628 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13629 // 'super' and types never change. Property never changes. Just 13630 // retain the existing expression. 13631 if (!E->isObjectReceiver()) 13632 return E; 13633 13634 // Transform the base expression. 13635 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13636 if (Base.isInvalid()) 13637 return ExprError(); 13638 13639 // We don't need to transform the property; it will never change. 13640 13641 // If nothing changed, just retain the existing expression. 13642 if (!getDerived().AlwaysRebuild() && 13643 Base.get() == E->getBase()) 13644 return E; 13645 13646 if (E->isExplicitProperty()) 13647 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13648 E->getExplicitProperty(), 13649 E->getLocation()); 13650 13651 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13652 SemaRef.Context.PseudoObjectTy, 13653 E->getImplicitPropertyGetter(), 13654 E->getImplicitPropertySetter(), 13655 E->getLocation()); 13656 } 13657 13658 template<typename Derived> 13659 ExprResult 13660 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13661 // Transform the base expression. 13662 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13663 if (Base.isInvalid()) 13664 return ExprError(); 13665 13666 // Transform the key expression. 13667 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13668 if (Key.isInvalid()) 13669 return ExprError(); 13670 13671 // If nothing changed, just retain the existing expression. 13672 if (!getDerived().AlwaysRebuild() && 13673 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13674 return E; 13675 13676 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13677 Base.get(), Key.get(), 13678 E->getAtIndexMethodDecl(), 13679 E->setAtIndexMethodDecl()); 13680 } 13681 13682 template<typename Derived> 13683 ExprResult 13684 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13685 // Transform the base expression. 13686 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13687 if (Base.isInvalid()) 13688 return ExprError(); 13689 13690 // If nothing changed, just retain the existing expression. 13691 if (!getDerived().AlwaysRebuild() && 13692 Base.get() == E->getBase()) 13693 return E; 13694 13695 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13696 E->getOpLoc(), 13697 E->isArrow()); 13698 } 13699 13700 template<typename Derived> 13701 ExprResult 13702 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13703 bool ArgumentChanged = false; 13704 SmallVector<Expr*, 8> SubExprs; 13705 SubExprs.reserve(E->getNumSubExprs()); 13706 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13707 SubExprs, &ArgumentChanged)) 13708 return ExprError(); 13709 13710 if (!getDerived().AlwaysRebuild() && 13711 !ArgumentChanged) 13712 return E; 13713 13714 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13715 SubExprs, 13716 E->getRParenLoc()); 13717 } 13718 13719 template<typename Derived> 13720 ExprResult 13721 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13722 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13723 if (SrcExpr.isInvalid()) 13724 return ExprError(); 13725 13726 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13727 if (!Type) 13728 return ExprError(); 13729 13730 if (!getDerived().AlwaysRebuild() && 13731 Type == E->getTypeSourceInfo() && 13732 SrcExpr.get() == E->getSrcExpr()) 13733 return E; 13734 13735 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13736 SrcExpr.get(), Type, 13737 E->getRParenLoc()); 13738 } 13739 13740 template<typename Derived> 13741 ExprResult 13742 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13743 BlockDecl *oldBlock = E->getBlockDecl(); 13744 13745 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13746 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13747 13748 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13749 blockScope->TheDecl->setBlockMissingReturnType( 13750 oldBlock->blockMissingReturnType()); 13751 13752 SmallVector<ParmVarDecl*, 4> params; 13753 SmallVector<QualType, 4> paramTypes; 13754 13755 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13756 13757 // Parameter substitution. 13758 Sema::ExtParameterInfoBuilder extParamInfos; 13759 if (getDerived().TransformFunctionTypeParams( 13760 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13761 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13762 extParamInfos)) { 13763 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13764 return ExprError(); 13765 } 13766 13767 QualType exprResultType = 13768 getDerived().TransformType(exprFunctionType->getReturnType()); 13769 13770 auto epi = exprFunctionType->getExtProtoInfo(); 13771 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13772 13773 QualType functionType = 13774 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13775 blockScope->FunctionType = functionType; 13776 13777 // Set the parameters on the block decl. 13778 if (!params.empty()) 13779 blockScope->TheDecl->setParams(params); 13780 13781 if (!oldBlock->blockMissingReturnType()) { 13782 blockScope->HasImplicitReturnType = false; 13783 blockScope->ReturnType = exprResultType; 13784 } 13785 13786 // Transform the body 13787 StmtResult body = getDerived().TransformStmt(E->getBody()); 13788 if (body.isInvalid()) { 13789 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13790 return ExprError(); 13791 } 13792 13793 #ifndef NDEBUG 13794 // In builds with assertions, make sure that we captured everything we 13795 // captured before. 13796 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13797 for (const auto &I : oldBlock->captures()) { 13798 VarDecl *oldCapture = I.getVariable(); 13799 13800 // Ignore parameter packs. 13801 if (oldCapture->isParameterPack()) 13802 continue; 13803 13804 VarDecl *newCapture = 13805 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13806 oldCapture)); 13807 assert(blockScope->CaptureMap.count(newCapture)); 13808 } 13809 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13810 } 13811 #endif 13812 13813 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 13814 /*Scope=*/nullptr); 13815 } 13816 13817 template<typename Derived> 13818 ExprResult 13819 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 13820 llvm_unreachable("Cannot transform asType expressions yet"); 13821 } 13822 13823 template<typename Derived> 13824 ExprResult 13825 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 13826 bool ArgumentChanged = false; 13827 SmallVector<Expr*, 8> SubExprs; 13828 SubExprs.reserve(E->getNumSubExprs()); 13829 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13830 SubExprs, &ArgumentChanged)) 13831 return ExprError(); 13832 13833 if (!getDerived().AlwaysRebuild() && 13834 !ArgumentChanged) 13835 return E; 13836 13837 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 13838 E->getOp(), E->getRParenLoc()); 13839 } 13840 13841 //===----------------------------------------------------------------------===// 13842 // Type reconstruction 13843 //===----------------------------------------------------------------------===// 13844 13845 template<typename Derived> 13846 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 13847 SourceLocation Star) { 13848 return SemaRef.BuildPointerType(PointeeType, Star, 13849 getDerived().getBaseEntity()); 13850 } 13851 13852 template<typename Derived> 13853 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 13854 SourceLocation Star) { 13855 return SemaRef.BuildBlockPointerType(PointeeType, Star, 13856 getDerived().getBaseEntity()); 13857 } 13858 13859 template<typename Derived> 13860 QualType 13861 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 13862 bool WrittenAsLValue, 13863 SourceLocation Sigil) { 13864 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 13865 Sigil, getDerived().getBaseEntity()); 13866 } 13867 13868 template<typename Derived> 13869 QualType 13870 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 13871 QualType ClassType, 13872 SourceLocation Sigil) { 13873 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 13874 getDerived().getBaseEntity()); 13875 } 13876 13877 template<typename Derived> 13878 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 13879 const ObjCTypeParamDecl *Decl, 13880 SourceLocation ProtocolLAngleLoc, 13881 ArrayRef<ObjCProtocolDecl *> Protocols, 13882 ArrayRef<SourceLocation> ProtocolLocs, 13883 SourceLocation ProtocolRAngleLoc) { 13884 return SemaRef.BuildObjCTypeParamType(Decl, 13885 ProtocolLAngleLoc, Protocols, 13886 ProtocolLocs, ProtocolRAngleLoc, 13887 /*FailOnError=*/true); 13888 } 13889 13890 template<typename Derived> 13891 QualType TreeTransform<Derived>::RebuildObjCObjectType( 13892 QualType BaseType, 13893 SourceLocation Loc, 13894 SourceLocation TypeArgsLAngleLoc, 13895 ArrayRef<TypeSourceInfo *> TypeArgs, 13896 SourceLocation TypeArgsRAngleLoc, 13897 SourceLocation ProtocolLAngleLoc, 13898 ArrayRef<ObjCProtocolDecl *> Protocols, 13899 ArrayRef<SourceLocation> ProtocolLocs, 13900 SourceLocation ProtocolRAngleLoc) { 13901 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 13902 TypeArgs, TypeArgsRAngleLoc, 13903 ProtocolLAngleLoc, Protocols, ProtocolLocs, 13904 ProtocolRAngleLoc, 13905 /*FailOnError=*/true); 13906 } 13907 13908 template<typename Derived> 13909 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 13910 QualType PointeeType, 13911 SourceLocation Star) { 13912 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 13913 } 13914 13915 template<typename Derived> 13916 QualType 13917 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 13918 ArrayType::ArraySizeModifier SizeMod, 13919 const llvm::APInt *Size, 13920 Expr *SizeExpr, 13921 unsigned IndexTypeQuals, 13922 SourceRange BracketsRange) { 13923 if (SizeExpr || !Size) 13924 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 13925 IndexTypeQuals, BracketsRange, 13926 getDerived().getBaseEntity()); 13927 13928 QualType Types[] = { 13929 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 13930 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 13931 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 13932 }; 13933 const unsigned NumTypes = llvm::array_lengthof(Types); 13934 QualType SizeType; 13935 for (unsigned I = 0; I != NumTypes; ++I) 13936 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 13937 SizeType = Types[I]; 13938 break; 13939 } 13940 13941 // Note that we can return a VariableArrayType here in the case where 13942 // the element type was a dependent VariableArrayType. 13943 IntegerLiteral *ArraySize 13944 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 13945 /*FIXME*/BracketsRange.getBegin()); 13946 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 13947 IndexTypeQuals, BracketsRange, 13948 getDerived().getBaseEntity()); 13949 } 13950 13951 template<typename Derived> 13952 QualType 13953 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 13954 ArrayType::ArraySizeModifier SizeMod, 13955 const llvm::APInt &Size, 13956 Expr *SizeExpr, 13957 unsigned IndexTypeQuals, 13958 SourceRange BracketsRange) { 13959 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 13960 IndexTypeQuals, BracketsRange); 13961 } 13962 13963 template<typename Derived> 13964 QualType 13965 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 13966 ArrayType::ArraySizeModifier SizeMod, 13967 unsigned IndexTypeQuals, 13968 SourceRange BracketsRange) { 13969 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 13970 IndexTypeQuals, BracketsRange); 13971 } 13972 13973 template<typename Derived> 13974 QualType 13975 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 13976 ArrayType::ArraySizeModifier SizeMod, 13977 Expr *SizeExpr, 13978 unsigned IndexTypeQuals, 13979 SourceRange BracketsRange) { 13980 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13981 SizeExpr, 13982 IndexTypeQuals, BracketsRange); 13983 } 13984 13985 template<typename Derived> 13986 QualType 13987 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 13988 ArrayType::ArraySizeModifier SizeMod, 13989 Expr *SizeExpr, 13990 unsigned IndexTypeQuals, 13991 SourceRange BracketsRange) { 13992 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13993 SizeExpr, 13994 IndexTypeQuals, BracketsRange); 13995 } 13996 13997 template <typename Derived> 13998 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 13999 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 14000 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 14001 AttributeLoc); 14002 } 14003 14004 template <typename Derived> 14005 QualType 14006 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 14007 unsigned NumElements, 14008 VectorType::VectorKind VecKind) { 14009 // FIXME: semantic checking! 14010 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 14011 } 14012 14013 template <typename Derived> 14014 QualType TreeTransform<Derived>::RebuildDependentVectorType( 14015 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 14016 VectorType::VectorKind VecKind) { 14017 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 14018 } 14019 14020 template<typename Derived> 14021 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 14022 unsigned NumElements, 14023 SourceLocation AttributeLoc) { 14024 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14025 NumElements, true); 14026 IntegerLiteral *VectorSize 14027 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 14028 AttributeLoc); 14029 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 14030 } 14031 14032 template<typename Derived> 14033 QualType 14034 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 14035 Expr *SizeExpr, 14036 SourceLocation AttributeLoc) { 14037 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 14038 } 14039 14040 template <typename Derived> 14041 QualType TreeTransform<Derived>::RebuildConstantMatrixType( 14042 QualType ElementType, unsigned NumRows, unsigned NumColumns) { 14043 return SemaRef.Context.getConstantMatrixType(ElementType, NumRows, 14044 NumColumns); 14045 } 14046 14047 template <typename Derived> 14048 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType( 14049 QualType ElementType, Expr *RowExpr, Expr *ColumnExpr, 14050 SourceLocation AttributeLoc) { 14051 return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr, 14052 AttributeLoc); 14053 } 14054 14055 template<typename Derived> 14056 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 14057 QualType T, 14058 MutableArrayRef<QualType> ParamTypes, 14059 const FunctionProtoType::ExtProtoInfo &EPI) { 14060 return SemaRef.BuildFunctionType(T, ParamTypes, 14061 getDerived().getBaseLocation(), 14062 getDerived().getBaseEntity(), 14063 EPI); 14064 } 14065 14066 template<typename Derived> 14067 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 14068 return SemaRef.Context.getFunctionNoProtoType(T); 14069 } 14070 14071 template<typename Derived> 14072 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 14073 Decl *D) { 14074 assert(D && "no decl found"); 14075 if (D->isInvalidDecl()) return QualType(); 14076 14077 // FIXME: Doesn't account for ObjCInterfaceDecl! 14078 TypeDecl *Ty; 14079 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 14080 // A valid resolved using typename pack expansion decl can have multiple 14081 // UsingDecls, but they must each have exactly one type, and it must be 14082 // the same type in every case. But we must have at least one expansion! 14083 if (UPD->expansions().empty()) { 14084 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 14085 << UPD->isCXXClassMember() << UPD; 14086 return QualType(); 14087 } 14088 14089 // We might still have some unresolved types. Try to pick a resolved type 14090 // if we can. The final instantiation will check that the remaining 14091 // unresolved types instantiate to the type we pick. 14092 QualType FallbackT; 14093 QualType T; 14094 for (auto *E : UPD->expansions()) { 14095 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 14096 if (ThisT.isNull()) 14097 continue; 14098 else if (ThisT->getAs<UnresolvedUsingType>()) 14099 FallbackT = ThisT; 14100 else if (T.isNull()) 14101 T = ThisT; 14102 else 14103 assert(getSema().Context.hasSameType(ThisT, T) && 14104 "mismatched resolved types in using pack expansion"); 14105 } 14106 return T.isNull() ? FallbackT : T; 14107 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 14108 assert(Using->hasTypename() && 14109 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 14110 14111 // A valid resolved using typename decl points to exactly one type decl. 14112 assert(++Using->shadow_begin() == Using->shadow_end()); 14113 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 14114 } else { 14115 assert(isa<UnresolvedUsingTypenameDecl>(D) && 14116 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 14117 Ty = cast<UnresolvedUsingTypenameDecl>(D); 14118 } 14119 14120 return SemaRef.Context.getTypeDeclType(Ty); 14121 } 14122 14123 template<typename Derived> 14124 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 14125 SourceLocation Loc) { 14126 return SemaRef.BuildTypeofExprType(E, Loc); 14127 } 14128 14129 template<typename Derived> 14130 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 14131 return SemaRef.Context.getTypeOfType(Underlying); 14132 } 14133 14134 template<typename Derived> 14135 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 14136 SourceLocation Loc) { 14137 return SemaRef.BuildDecltypeType(E, Loc); 14138 } 14139 14140 template<typename Derived> 14141 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 14142 UnaryTransformType::UTTKind UKind, 14143 SourceLocation Loc) { 14144 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 14145 } 14146 14147 template<typename Derived> 14148 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 14149 TemplateName Template, 14150 SourceLocation TemplateNameLoc, 14151 TemplateArgumentListInfo &TemplateArgs) { 14152 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 14153 } 14154 14155 template<typename Derived> 14156 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 14157 SourceLocation KWLoc) { 14158 return SemaRef.BuildAtomicType(ValueType, KWLoc); 14159 } 14160 14161 template<typename Derived> 14162 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 14163 SourceLocation KWLoc, 14164 bool isReadPipe) { 14165 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 14166 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 14167 } 14168 14169 template <typename Derived> 14170 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned, 14171 unsigned NumBits, 14172 SourceLocation Loc) { 14173 llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 14174 NumBits, true); 14175 IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP, 14176 SemaRef.Context.IntTy, Loc); 14177 return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc); 14178 } 14179 14180 template <typename Derived> 14181 QualType TreeTransform<Derived>::RebuildDependentExtIntType( 14182 bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) { 14183 return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc); 14184 } 14185 14186 template<typename Derived> 14187 TemplateName 14188 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14189 bool TemplateKW, 14190 TemplateDecl *Template) { 14191 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 14192 Template); 14193 } 14194 14195 template<typename Derived> 14196 TemplateName 14197 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14198 SourceLocation TemplateKWLoc, 14199 const IdentifierInfo &Name, 14200 SourceLocation NameLoc, 14201 QualType ObjectType, 14202 NamedDecl *FirstQualifierInScope, 14203 bool AllowInjectedClassName) { 14204 UnqualifiedId TemplateName; 14205 TemplateName.setIdentifier(&Name, NameLoc); 14206 Sema::TemplateTy Template; 14207 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 14208 TemplateName, ParsedType::make(ObjectType), 14209 /*EnteringContext=*/false, Template, 14210 AllowInjectedClassName); 14211 return Template.get(); 14212 } 14213 14214 template<typename Derived> 14215 TemplateName 14216 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 14217 SourceLocation TemplateKWLoc, 14218 OverloadedOperatorKind Operator, 14219 SourceLocation NameLoc, 14220 QualType ObjectType, 14221 bool AllowInjectedClassName) { 14222 UnqualifiedId Name; 14223 // FIXME: Bogus location information. 14224 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 14225 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 14226 Sema::TemplateTy Template; 14227 getSema().ActOnTemplateName( 14228 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 14229 /*EnteringContext=*/false, Template, AllowInjectedClassName); 14230 return Template.get(); 14231 } 14232 14233 template<typename Derived> 14234 ExprResult 14235 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 14236 SourceLocation OpLoc, 14237 Expr *OrigCallee, 14238 Expr *First, 14239 Expr *Second) { 14240 Expr *Callee = OrigCallee->IgnoreParenCasts(); 14241 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 14242 14243 if (First->getObjectKind() == OK_ObjCProperty) { 14244 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14245 if (BinaryOperator::isAssignmentOp(Opc)) 14246 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 14247 First, Second); 14248 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 14249 if (Result.isInvalid()) 14250 return ExprError(); 14251 First = Result.get(); 14252 } 14253 14254 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 14255 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 14256 if (Result.isInvalid()) 14257 return ExprError(); 14258 Second = Result.get(); 14259 } 14260 14261 // Determine whether this should be a builtin operation. 14262 if (Op == OO_Subscript) { 14263 if (!First->getType()->isOverloadableType() && 14264 !Second->getType()->isOverloadableType()) 14265 return getSema().CreateBuiltinArraySubscriptExpr( 14266 First, Callee->getBeginLoc(), Second, OpLoc); 14267 } else if (Op == OO_Arrow) { 14268 // -> is never a builtin operation. 14269 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 14270 } else if (Second == nullptr || isPostIncDec) { 14271 if (!First->getType()->isOverloadableType() || 14272 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 14273 // The argument is not of overloadable type, or this is an expression 14274 // of the form &Class::member, so try to create a built-in unary 14275 // operation. 14276 UnaryOperatorKind Opc 14277 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14278 14279 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 14280 } 14281 } else { 14282 if (!First->getType()->isOverloadableType() && 14283 !Second->getType()->isOverloadableType()) { 14284 // Neither of the arguments is an overloadable type, so try to 14285 // create a built-in binary operation. 14286 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14287 ExprResult Result 14288 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 14289 if (Result.isInvalid()) 14290 return ExprError(); 14291 14292 return Result; 14293 } 14294 } 14295 14296 // Compute the transformed set of functions (and function templates) to be 14297 // used during overload resolution. 14298 UnresolvedSet<16> Functions; 14299 bool RequiresADL; 14300 14301 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 14302 Functions.append(ULE->decls_begin(), ULE->decls_end()); 14303 // If the overload could not be resolved in the template definition 14304 // (because we had a dependent argument), ADL is performed as part of 14305 // template instantiation. 14306 RequiresADL = ULE->requiresADL(); 14307 } else { 14308 // If we've resolved this to a particular non-member function, just call 14309 // that function. If we resolved it to a member function, 14310 // CreateOverloaded* will find that function for us. 14311 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 14312 if (!isa<CXXMethodDecl>(ND)) 14313 Functions.addDecl(ND); 14314 RequiresADL = false; 14315 } 14316 14317 // Add any functions found via argument-dependent lookup. 14318 Expr *Args[2] = { First, Second }; 14319 unsigned NumArgs = 1 + (Second != nullptr); 14320 14321 // Create the overloaded operator invocation for unary operators. 14322 if (NumArgs == 1 || isPostIncDec) { 14323 UnaryOperatorKind Opc 14324 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 14325 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 14326 RequiresADL); 14327 } 14328 14329 if (Op == OO_Subscript) { 14330 SourceLocation LBrace; 14331 SourceLocation RBrace; 14332 14333 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 14334 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 14335 LBrace = SourceLocation::getFromRawEncoding( 14336 NameLoc.CXXOperatorName.BeginOpNameLoc); 14337 RBrace = SourceLocation::getFromRawEncoding( 14338 NameLoc.CXXOperatorName.EndOpNameLoc); 14339 } else { 14340 LBrace = Callee->getBeginLoc(); 14341 RBrace = OpLoc; 14342 } 14343 14344 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 14345 First, Second); 14346 } 14347 14348 // Create the overloaded operator invocation for binary operators. 14349 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 14350 ExprResult Result = SemaRef.CreateOverloadedBinOp( 14351 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 14352 if (Result.isInvalid()) 14353 return ExprError(); 14354 14355 return Result; 14356 } 14357 14358 template<typename Derived> 14359 ExprResult 14360 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 14361 SourceLocation OperatorLoc, 14362 bool isArrow, 14363 CXXScopeSpec &SS, 14364 TypeSourceInfo *ScopeType, 14365 SourceLocation CCLoc, 14366 SourceLocation TildeLoc, 14367 PseudoDestructorTypeStorage Destroyed) { 14368 QualType BaseType = Base->getType(); 14369 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 14370 (!isArrow && !BaseType->getAs<RecordType>()) || 14371 (isArrow && BaseType->getAs<PointerType>() && 14372 !BaseType->castAs<PointerType>()->getPointeeType() 14373 ->template getAs<RecordType>())){ 14374 // This pseudo-destructor expression is still a pseudo-destructor. 14375 return SemaRef.BuildPseudoDestructorExpr( 14376 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 14377 CCLoc, TildeLoc, Destroyed); 14378 } 14379 14380 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 14381 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 14382 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 14383 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 14384 NameInfo.setNamedTypeInfo(DestroyedType); 14385 14386 // The scope type is now known to be a valid nested name specifier 14387 // component. Tack it on to the end of the nested name specifier. 14388 if (ScopeType) { 14389 if (!ScopeType->getType()->getAs<TagType>()) { 14390 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 14391 diag::err_expected_class_or_namespace) 14392 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 14393 return ExprError(); 14394 } 14395 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 14396 CCLoc); 14397 } 14398 14399 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 14400 return getSema().BuildMemberReferenceExpr(Base, BaseType, 14401 OperatorLoc, isArrow, 14402 SS, TemplateKWLoc, 14403 /*FIXME: FirstQualifier*/ nullptr, 14404 NameInfo, 14405 /*TemplateArgs*/ nullptr, 14406 /*S*/nullptr); 14407 } 14408 14409 template<typename Derived> 14410 StmtResult 14411 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14412 SourceLocation Loc = S->getBeginLoc(); 14413 CapturedDecl *CD = S->getCapturedDecl(); 14414 unsigned NumParams = CD->getNumParams(); 14415 unsigned ContextParamPos = CD->getContextParamPosition(); 14416 SmallVector<Sema::CapturedParamNameType, 4> Params; 14417 for (unsigned I = 0; I < NumParams; ++I) { 14418 if (I != ContextParamPos) { 14419 Params.push_back( 14420 std::make_pair( 14421 CD->getParam(I)->getName(), 14422 getDerived().TransformType(CD->getParam(I)->getType()))); 14423 } else { 14424 Params.push_back(std::make_pair(StringRef(), QualType())); 14425 } 14426 } 14427 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14428 S->getCapturedRegionKind(), Params); 14429 StmtResult Body; 14430 { 14431 Sema::CompoundScopeRAII CompoundScope(getSema()); 14432 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14433 } 14434 14435 if (Body.isInvalid()) { 14436 getSema().ActOnCapturedRegionError(); 14437 return StmtError(); 14438 } 14439 14440 return getSema().ActOnCapturedRegionEnd(Body.get()); 14441 } 14442 14443 } // end namespace clang 14444 14445 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14446