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/OpenMPKinds.h" 32 #include "clang/Sema/Designator.h" 33 #include "clang/Sema/Lookup.h" 34 #include "clang/Sema/Ownership.h" 35 #include "clang/Sema/ParsedTemplate.h" 36 #include "clang/Sema/ScopeInfo.h" 37 #include "clang/Sema/SemaDiagnostic.h" 38 #include "clang/Sema/SemaInternal.h" 39 #include "llvm/ADT/ArrayRef.h" 40 #include "llvm/Support/ErrorHandling.h" 41 #include <algorithm> 42 43 using namespace llvm::omp; 44 45 namespace clang { 46 using namespace sema; 47 48 /// A semantic tree transformation that allows one to transform one 49 /// abstract syntax tree into another. 50 /// 51 /// A new tree transformation is defined by creating a new subclass \c X of 52 /// \c TreeTransform<X> and then overriding certain operations to provide 53 /// behavior specific to that transformation. For example, template 54 /// instantiation is implemented as a tree transformation where the 55 /// transformation of TemplateTypeParmType nodes involves substituting the 56 /// template arguments for their corresponding template parameters; a similar 57 /// transformation is performed for non-type template parameters and 58 /// template template parameters. 59 /// 60 /// This tree-transformation template uses static polymorphism to allow 61 /// subclasses to customize any of its operations. Thus, a subclass can 62 /// override any of the transformation or rebuild operators by providing an 63 /// operation with the same signature as the default implementation. The 64 /// overriding function should not be virtual. 65 /// 66 /// Semantic tree transformations are split into two stages, either of which 67 /// can be replaced by a subclass. The "transform" step transforms an AST node 68 /// or the parts of an AST node using the various transformation functions, 69 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 70 /// node of the appropriate kind from the pieces. The default transformation 71 /// routines recursively transform the operands to composite AST nodes (e.g., 72 /// the pointee type of a PointerType node) and, if any of those operand nodes 73 /// were changed by the transformation, invokes the rebuild operation to create 74 /// a new AST node. 75 /// 76 /// Subclasses can customize the transformation at various levels. The 77 /// most coarse-grained transformations involve replacing TransformType(), 78 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 79 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 80 /// new implementations. 81 /// 82 /// For more fine-grained transformations, subclasses can replace any of the 83 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 84 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 85 /// replacing TransformTemplateTypeParmType() allows template instantiation 86 /// to substitute template arguments for their corresponding template 87 /// parameters. Additionally, subclasses can override the \c RebuildXXX 88 /// functions to control how AST nodes are rebuilt when their operands change. 89 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 90 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 91 /// be able to use more efficient rebuild steps. 92 /// 93 /// There are a handful of other functions that can be overridden, allowing one 94 /// to avoid traversing nodes that don't need any transformation 95 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 96 /// operands have not changed (\c AlwaysRebuild()), and customize the 97 /// default locations and entity names used for type-checking 98 /// (\c getBaseLocation(), \c getBaseEntity()). 99 template<typename Derived> 100 class TreeTransform { 101 /// Private RAII object that helps us forget and then re-remember 102 /// the template argument corresponding to a partially-substituted parameter 103 /// pack. 104 class ForgetPartiallySubstitutedPackRAII { 105 Derived &Self; 106 TemplateArgument Old; 107 108 public: 109 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 110 Old = Self.ForgetPartiallySubstitutedPack(); 111 } 112 113 ~ForgetPartiallySubstitutedPackRAII() { 114 Self.RememberPartiallySubstitutedPack(Old); 115 } 116 }; 117 118 protected: 119 Sema &SemaRef; 120 121 /// The set of local declarations that have been transformed, for 122 /// cases where we are forced to build new declarations within the transformer 123 /// rather than in the subclass (e.g., lambda closure types). 124 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 125 126 public: 127 /// Initializes a new tree transformer. 128 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 129 130 /// Retrieves a reference to the derived class. 131 Derived &getDerived() { return static_cast<Derived&>(*this); } 132 133 /// Retrieves a reference to the derived class. 134 const Derived &getDerived() const { 135 return static_cast<const Derived&>(*this); 136 } 137 138 static inline ExprResult Owned(Expr *E) { return E; } 139 static inline StmtResult Owned(Stmt *S) { return S; } 140 141 /// Retrieves a reference to the semantic analysis object used for 142 /// this tree transform. 143 Sema &getSema() const { return SemaRef; } 144 145 /// Whether the transformation should always rebuild AST nodes, even 146 /// if none of the children have changed. 147 /// 148 /// Subclasses may override this function to specify when the transformation 149 /// should rebuild all AST nodes. 150 /// 151 /// We must always rebuild all AST nodes when performing variadic template 152 /// pack expansion, in order to avoid violating the AST invariant that each 153 /// statement node appears at most once in its containing declaration. 154 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 155 156 /// Whether the transformation is forming an expression or statement that 157 /// replaces the original. In this case, we'll reuse mangling numbers from 158 /// existing lambdas. 159 bool ReplacingOriginal() { return false; } 160 161 /// Wether CXXConstructExpr can be skipped when they are implicit. 162 /// They will be reconstructed when used if needed. 163 /// This is usefull when the user that cause rebuilding of the 164 /// CXXConstructExpr is outside of the expression at which the TreeTransform 165 /// started. 166 bool AllowSkippingCXXConstructExpr() { return true; } 167 168 /// Returns the location of the entity being transformed, if that 169 /// information was not available elsewhere in the AST. 170 /// 171 /// By default, returns no source-location information. Subclasses can 172 /// provide an alternative implementation that provides better location 173 /// information. 174 SourceLocation getBaseLocation() { return SourceLocation(); } 175 176 /// Returns the name of the entity being transformed, if that 177 /// information was not available elsewhere in the AST. 178 /// 179 /// By default, returns an empty name. Subclasses can provide an alternative 180 /// implementation with a more precise name. 181 DeclarationName getBaseEntity() { return DeclarationName(); } 182 183 /// Sets the "base" location and entity when that 184 /// information is known based on another transformation. 185 /// 186 /// By default, the source location and entity are ignored. Subclasses can 187 /// override this function to provide a customized implementation. 188 void setBase(SourceLocation Loc, DeclarationName Entity) { } 189 190 /// RAII object that temporarily sets the base location and entity 191 /// used for reporting diagnostics in types. 192 class TemporaryBase { 193 TreeTransform &Self; 194 SourceLocation OldLocation; 195 DeclarationName OldEntity; 196 197 public: 198 TemporaryBase(TreeTransform &Self, SourceLocation Location, 199 DeclarationName Entity) : Self(Self) { 200 OldLocation = Self.getDerived().getBaseLocation(); 201 OldEntity = Self.getDerived().getBaseEntity(); 202 203 if (Location.isValid()) 204 Self.getDerived().setBase(Location, Entity); 205 } 206 207 ~TemporaryBase() { 208 Self.getDerived().setBase(OldLocation, OldEntity); 209 } 210 }; 211 212 /// Determine whether the given type \p T has already been 213 /// transformed. 214 /// 215 /// Subclasses can provide an alternative implementation of this routine 216 /// to short-circuit evaluation when it is known that a given type will 217 /// not change. For example, template instantiation need not traverse 218 /// non-dependent types. 219 bool AlreadyTransformed(QualType T) { 220 return T.isNull(); 221 } 222 223 /// Transform a template parameter depth level. 224 /// 225 /// During a transformation that transforms template parameters, this maps 226 /// an old template parameter depth to a new depth. 227 unsigned TransformTemplateDepth(unsigned Depth) { 228 return Depth; 229 } 230 231 /// Determine whether the given call argument should be dropped, e.g., 232 /// because it is a default argument. 233 /// 234 /// Subclasses can provide an alternative implementation of this routine to 235 /// determine which kinds of call arguments get dropped. By default, 236 /// CXXDefaultArgument nodes are dropped (prior to transformation). 237 bool DropCallArgument(Expr *E) { 238 return E->isDefaultArgument(); 239 } 240 241 /// Determine whether we should expand a pack expansion with the 242 /// given set of parameter packs into separate arguments by repeatedly 243 /// transforming the pattern. 244 /// 245 /// By default, the transformer never tries to expand pack expansions. 246 /// Subclasses can override this routine to provide different behavior. 247 /// 248 /// \param EllipsisLoc The location of the ellipsis that identifies the 249 /// pack expansion. 250 /// 251 /// \param PatternRange The source range that covers the entire pattern of 252 /// the pack expansion. 253 /// 254 /// \param Unexpanded The set of unexpanded parameter packs within the 255 /// pattern. 256 /// 257 /// \param ShouldExpand Will be set to \c true if the transformer should 258 /// expand the corresponding pack expansions into separate arguments. When 259 /// set, \c NumExpansions must also be set. 260 /// 261 /// \param RetainExpansion Whether the caller should add an unexpanded 262 /// pack expansion after all of the expanded arguments. This is used 263 /// when extending explicitly-specified template argument packs per 264 /// C++0x [temp.arg.explicit]p9. 265 /// 266 /// \param NumExpansions The number of separate arguments that will be in 267 /// the expanded form of the corresponding pack expansion. This is both an 268 /// input and an output parameter, which can be set by the caller if the 269 /// number of expansions is known a priori (e.g., due to a prior substitution) 270 /// and will be set by the callee when the number of expansions is known. 271 /// The callee must set this value when \c ShouldExpand is \c true; it may 272 /// set this value in other cases. 273 /// 274 /// \returns true if an error occurred (e.g., because the parameter packs 275 /// are to be instantiated with arguments of different lengths), false 276 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 277 /// must be set. 278 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 279 SourceRange PatternRange, 280 ArrayRef<UnexpandedParameterPack> Unexpanded, 281 bool &ShouldExpand, 282 bool &RetainExpansion, 283 Optional<unsigned> &NumExpansions) { 284 ShouldExpand = false; 285 return false; 286 } 287 288 /// "Forget" about the partially-substituted pack template argument, 289 /// when performing an instantiation that must preserve the parameter pack 290 /// use. 291 /// 292 /// This routine is meant to be overridden by the template instantiator. 293 TemplateArgument ForgetPartiallySubstitutedPack() { 294 return TemplateArgument(); 295 } 296 297 /// "Remember" the partially-substituted pack template argument 298 /// after performing an instantiation that must preserve the parameter pack 299 /// use. 300 /// 301 /// This routine is meant to be overridden by the template instantiator. 302 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 303 304 /// Note to the derived class when a function parameter pack is 305 /// being expanded. 306 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 307 308 /// Transforms the given type into another type. 309 /// 310 /// By default, this routine transforms a type by creating a 311 /// TypeSourceInfo for it and delegating to the appropriate 312 /// function. This is expensive, but we don't mind, because 313 /// this method is deprecated anyway; all users should be 314 /// switched to storing TypeSourceInfos. 315 /// 316 /// \returns the transformed type. 317 QualType TransformType(QualType T); 318 319 /// Transforms the given type-with-location into a new 320 /// type-with-location. 321 /// 322 /// By default, this routine transforms a type by delegating to the 323 /// appropriate TransformXXXType to build a new type. Subclasses 324 /// may override this function (to take over all type 325 /// transformations) or some set of the TransformXXXType functions 326 /// to alter the transformation. 327 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 328 329 /// Transform the given type-with-location into a new 330 /// type, collecting location information in the given builder 331 /// as necessary. 332 /// 333 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 334 335 /// Transform a type that is permitted to produce a 336 /// DeducedTemplateSpecializationType. 337 /// 338 /// This is used in the (relatively rare) contexts where it is acceptable 339 /// for transformation to produce a class template type with deduced 340 /// template arguments. 341 /// @{ 342 QualType TransformTypeWithDeducedTST(QualType T); 343 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 344 /// @} 345 346 /// The reason why the value of a statement is not discarded, if any. 347 enum StmtDiscardKind { 348 SDK_Discarded, 349 SDK_NotDiscarded, 350 SDK_StmtExprResult, 351 }; 352 353 /// Transform the given statement. 354 /// 355 /// By default, this routine transforms a statement by delegating to the 356 /// appropriate TransformXXXStmt function to transform a specific kind of 357 /// statement or the TransformExpr() function to transform an expression. 358 /// Subclasses may override this function to transform statements using some 359 /// other mechanism. 360 /// 361 /// \returns the transformed statement. 362 StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded); 363 364 /// Transform the given statement. 365 /// 366 /// By default, this routine transforms a statement by delegating to the 367 /// appropriate TransformOMPXXXClause function to transform a specific kind 368 /// of clause. Subclasses may override this function to transform statements 369 /// using some other mechanism. 370 /// 371 /// \returns the transformed OpenMP clause. 372 OMPClause *TransformOMPClause(OMPClause *S); 373 374 /// Transform the given attribute. 375 /// 376 /// By default, this routine transforms a statement by delegating to the 377 /// appropriate TransformXXXAttr function to transform a specific kind 378 /// of attribute. Subclasses may override this function to transform 379 /// attributed statements using some other mechanism. 380 /// 381 /// \returns the transformed attribute 382 const Attr *TransformAttr(const Attr *S); 383 384 /// Transform the specified attribute. 385 /// 386 /// Subclasses should override the transformation of attributes with a pragma 387 /// spelling to transform expressions stored within the attribute. 388 /// 389 /// \returns the transformed attribute. 390 #define ATTR(X) 391 #define PRAGMA_SPELLING_ATTR(X) \ 392 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 393 #include "clang/Basic/AttrList.inc" 394 395 /// Transform the given expression. 396 /// 397 /// By default, this routine transforms an expression by delegating to the 398 /// appropriate TransformXXXExpr function to build a new expression. 399 /// Subclasses may override this function to transform expressions using some 400 /// other mechanism. 401 /// 402 /// \returns the transformed expression. 403 ExprResult TransformExpr(Expr *E); 404 405 /// Transform the given initializer. 406 /// 407 /// By default, this routine transforms an initializer by stripping off the 408 /// semantic nodes added by initialization, then passing the result to 409 /// TransformExpr or TransformExprs. 410 /// 411 /// \returns the transformed initializer. 412 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 413 414 /// Transform the given list of expressions. 415 /// 416 /// This routine transforms a list of expressions by invoking 417 /// \c TransformExpr() for each subexpression. However, it also provides 418 /// support for variadic templates by expanding any pack expansions (if the 419 /// derived class permits such expansion) along the way. When pack expansions 420 /// are present, the number of outputs may not equal the number of inputs. 421 /// 422 /// \param Inputs The set of expressions to be transformed. 423 /// 424 /// \param NumInputs The number of expressions in \c Inputs. 425 /// 426 /// \param IsCall If \c true, then this transform is being performed on 427 /// function-call arguments, and any arguments that should be dropped, will 428 /// be. 429 /// 430 /// \param Outputs The transformed input expressions will be added to this 431 /// vector. 432 /// 433 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 434 /// due to transformation. 435 /// 436 /// \returns true if an error occurred, false otherwise. 437 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 438 SmallVectorImpl<Expr *> &Outputs, 439 bool *ArgChanged = nullptr); 440 441 /// Transform the given declaration, which is referenced from a type 442 /// or expression. 443 /// 444 /// By default, acts as the identity function on declarations, unless the 445 /// transformer has had to transform the declaration itself. Subclasses 446 /// may override this function to provide alternate behavior. 447 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 448 llvm::DenseMap<Decl *, Decl *>::iterator Known 449 = TransformedLocalDecls.find(D); 450 if (Known != TransformedLocalDecls.end()) 451 return Known->second; 452 453 return D; 454 } 455 456 /// Transform the specified condition. 457 /// 458 /// By default, this transforms the variable and expression and rebuilds 459 /// the condition. 460 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 461 Expr *Expr, 462 Sema::ConditionKind Kind); 463 464 /// Transform the attributes associated with the given declaration and 465 /// place them on the new declaration. 466 /// 467 /// By default, this operation does nothing. Subclasses may override this 468 /// behavior to transform attributes. 469 void transformAttrs(Decl *Old, Decl *New) { } 470 471 /// Note that a local declaration has been transformed by this 472 /// transformer. 473 /// 474 /// Local declarations are typically transformed via a call to 475 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 476 /// the transformer itself has to transform the declarations. This routine 477 /// can be overridden by a subclass that keeps track of such mappings. 478 void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) { 479 assert(New.size() == 1 && 480 "must override transformedLocalDecl if performing pack expansion"); 481 TransformedLocalDecls[Old] = New.front(); 482 } 483 484 /// Transform the definition of the given declaration. 485 /// 486 /// By default, invokes TransformDecl() to transform the declaration. 487 /// Subclasses may override this function to provide alternate behavior. 488 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 489 return getDerived().TransformDecl(Loc, D); 490 } 491 492 /// Transform the given declaration, which was the first part of a 493 /// nested-name-specifier in a member access expression. 494 /// 495 /// This specific declaration transformation only applies to the first 496 /// identifier in a nested-name-specifier of a member access expression, e.g., 497 /// the \c T in \c x->T::member 498 /// 499 /// By default, invokes TransformDecl() to transform the declaration. 500 /// Subclasses may override this function to provide alternate behavior. 501 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 502 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 503 } 504 505 /// Transform the set of declarations in an OverloadExpr. 506 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 507 LookupResult &R); 508 509 /// Transform the given nested-name-specifier with source-location 510 /// information. 511 /// 512 /// By default, transforms all of the types and declarations within the 513 /// nested-name-specifier. Subclasses may override this function to provide 514 /// alternate behavior. 515 NestedNameSpecifierLoc 516 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 517 QualType ObjectType = QualType(), 518 NamedDecl *FirstQualifierInScope = nullptr); 519 520 /// Transform the given declaration name. 521 /// 522 /// By default, transforms the types of conversion function, constructor, 523 /// and destructor names and then (if needed) rebuilds the declaration name. 524 /// Identifiers and selectors are returned unmodified. Sublcasses may 525 /// override this function to provide alternate behavior. 526 DeclarationNameInfo 527 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 528 529 bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs, 530 llvm::SmallVectorImpl<concepts::Requirement *> &Transformed); 531 concepts::TypeRequirement * 532 TransformTypeRequirement(concepts::TypeRequirement *Req); 533 concepts::ExprRequirement * 534 TransformExprRequirement(concepts::ExprRequirement *Req); 535 concepts::NestedRequirement * 536 TransformNestedRequirement(concepts::NestedRequirement *Req); 537 538 /// Transform the given template name. 539 /// 540 /// \param SS The nested-name-specifier that qualifies the template 541 /// name. This nested-name-specifier must already have been transformed. 542 /// 543 /// \param Name The template name to transform. 544 /// 545 /// \param NameLoc The source location of the template name. 546 /// 547 /// \param ObjectType If we're translating a template name within a member 548 /// access expression, this is the type of the object whose member template 549 /// is being referenced. 550 /// 551 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 552 /// also refers to a name within the current (lexical) scope, this is the 553 /// declaration it refers to. 554 /// 555 /// By default, transforms the template name by transforming the declarations 556 /// and nested-name-specifiers that occur within the template name. 557 /// Subclasses may override this function to provide alternate behavior. 558 TemplateName 559 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 560 SourceLocation NameLoc, 561 QualType ObjectType = QualType(), 562 NamedDecl *FirstQualifierInScope = nullptr, 563 bool AllowInjectedClassName = false); 564 565 /// Transform the given template argument. 566 /// 567 /// By default, this operation transforms the type, expression, or 568 /// declaration stored within the template argument and constructs a 569 /// new template argument from the transformed result. Subclasses may 570 /// override this function to provide alternate behavior. 571 /// 572 /// Returns true if there was an error. 573 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 574 TemplateArgumentLoc &Output, 575 bool Uneval = false); 576 577 /// Transform the given set of template arguments. 578 /// 579 /// By default, this operation transforms all of the template arguments 580 /// in the input set using \c TransformTemplateArgument(), and appends 581 /// the transformed arguments to the output list. 582 /// 583 /// Note that this overload of \c TransformTemplateArguments() is merely 584 /// a convenience function. Subclasses that wish to override this behavior 585 /// should override the iterator-based member template version. 586 /// 587 /// \param Inputs The set of template arguments to be transformed. 588 /// 589 /// \param NumInputs The number of template arguments in \p Inputs. 590 /// 591 /// \param Outputs The set of transformed template arguments output by this 592 /// routine. 593 /// 594 /// Returns true if an error occurred. 595 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 596 unsigned NumInputs, 597 TemplateArgumentListInfo &Outputs, 598 bool Uneval = false) { 599 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 600 Uneval); 601 } 602 603 /// Transform the given set of template arguments. 604 /// 605 /// By default, this operation transforms all of the template arguments 606 /// in the input set using \c TransformTemplateArgument(), and appends 607 /// the transformed arguments to the output list. 608 /// 609 /// \param First An iterator to the first template argument. 610 /// 611 /// \param Last An iterator one step past the last template argument. 612 /// 613 /// \param Outputs The set of transformed template arguments output by this 614 /// routine. 615 /// 616 /// Returns true if an error occurred. 617 template<typename InputIterator> 618 bool TransformTemplateArguments(InputIterator First, 619 InputIterator Last, 620 TemplateArgumentListInfo &Outputs, 621 bool Uneval = false); 622 623 /// Fakes up a TemplateArgumentLoc for a given TemplateArgument. 624 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 625 TemplateArgumentLoc &ArgLoc); 626 627 /// Fakes up a TypeSourceInfo for a type. 628 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 629 return SemaRef.Context.getTrivialTypeSourceInfo(T, 630 getDerived().getBaseLocation()); 631 } 632 633 #define ABSTRACT_TYPELOC(CLASS, PARENT) 634 #define TYPELOC(CLASS, PARENT) \ 635 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 636 #include "clang/AST/TypeLocNodes.def" 637 638 template<typename Fn> 639 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 640 FunctionProtoTypeLoc TL, 641 CXXRecordDecl *ThisContext, 642 Qualifiers ThisTypeQuals, 643 Fn TransformExceptionSpec); 644 645 bool TransformExceptionSpec(SourceLocation Loc, 646 FunctionProtoType::ExceptionSpecInfo &ESI, 647 SmallVectorImpl<QualType> &Exceptions, 648 bool &Changed); 649 650 StmtResult TransformSEHHandler(Stmt *Handler); 651 652 QualType 653 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 654 TemplateSpecializationTypeLoc TL, 655 TemplateName Template); 656 657 QualType 658 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 659 DependentTemplateSpecializationTypeLoc TL, 660 TemplateName Template, 661 CXXScopeSpec &SS); 662 663 QualType TransformDependentTemplateSpecializationType( 664 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 665 NestedNameSpecifierLoc QualifierLoc); 666 667 /// Transforms the parameters of a function type into the 668 /// given vectors. 669 /// 670 /// The result vectors should be kept in sync; null entries in the 671 /// variables vector are acceptable. 672 /// 673 /// Return true on error. 674 bool TransformFunctionTypeParams( 675 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 676 const QualType *ParamTypes, 677 const FunctionProtoType::ExtParameterInfo *ParamInfos, 678 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 679 Sema::ExtParameterInfoBuilder &PInfos); 680 681 /// Transforms a single function-type parameter. Return null 682 /// on error. 683 /// 684 /// \param indexAdjustment - A number to add to the parameter's 685 /// scope index; can be negative 686 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 687 int indexAdjustment, 688 Optional<unsigned> NumExpansions, 689 bool ExpectParameterPack); 690 691 /// Transform the body of a lambda-expression. 692 StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body); 693 /// Alternative implementation of TransformLambdaBody that skips transforming 694 /// the body. 695 StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body); 696 697 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 698 699 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 700 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 701 702 TemplateParameterList *TransformTemplateParameterList( 703 TemplateParameterList *TPL) { 704 return TPL; 705 } 706 707 ExprResult TransformAddressOfOperand(Expr *E); 708 709 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 710 bool IsAddressOfOperand, 711 TypeSourceInfo **RecoveryTSI); 712 713 ExprResult TransformParenDependentScopeDeclRefExpr( 714 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 715 TypeSourceInfo **RecoveryTSI); 716 717 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 718 719 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 720 // amount of stack usage with clang. 721 #define STMT(Node, Parent) \ 722 LLVM_ATTRIBUTE_NOINLINE \ 723 StmtResult Transform##Node(Node *S); 724 #define VALUESTMT(Node, Parent) \ 725 LLVM_ATTRIBUTE_NOINLINE \ 726 StmtResult Transform##Node(Node *S, StmtDiscardKind SDK); 727 #define EXPR(Node, Parent) \ 728 LLVM_ATTRIBUTE_NOINLINE \ 729 ExprResult Transform##Node(Node *E); 730 #define ABSTRACT_STMT(Stmt) 731 #include "clang/AST/StmtNodes.inc" 732 733 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 734 LLVM_ATTRIBUTE_NOINLINE \ 735 OMPClause *Transform ## Class(Class *S); 736 #include "llvm/Frontend/OpenMP/OMPKinds.def" 737 738 /// Build a new qualified type given its unqualified type and type location. 739 /// 740 /// By default, this routine adds type qualifiers only to types that can 741 /// have qualifiers, and silently suppresses those qualifiers that are not 742 /// permitted. Subclasses may override this routine to provide different 743 /// behavior. 744 QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL); 745 746 /// Build a new pointer type given its pointee type. 747 /// 748 /// By default, performs semantic analysis when building the pointer type. 749 /// Subclasses may override this routine to provide different behavior. 750 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 751 752 /// Build a new block pointer type given its pointee type. 753 /// 754 /// By default, performs semantic analysis when building the block pointer 755 /// type. Subclasses may override this routine to provide different behavior. 756 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 757 758 /// Build a new reference type given the type it references. 759 /// 760 /// By default, performs semantic analysis when building the 761 /// reference type. Subclasses may override this routine to provide 762 /// different behavior. 763 /// 764 /// \param LValue whether the type was written with an lvalue sigil 765 /// or an rvalue sigil. 766 QualType RebuildReferenceType(QualType ReferentType, 767 bool LValue, 768 SourceLocation Sigil); 769 770 /// Build a new member pointer type given the pointee type and the 771 /// class type it refers into. 772 /// 773 /// By default, performs semantic analysis when building the member pointer 774 /// type. Subclasses may override this routine to provide different behavior. 775 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 776 SourceLocation Sigil); 777 778 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 779 SourceLocation ProtocolLAngleLoc, 780 ArrayRef<ObjCProtocolDecl *> Protocols, 781 ArrayRef<SourceLocation> ProtocolLocs, 782 SourceLocation ProtocolRAngleLoc); 783 784 /// Build an Objective-C object type. 785 /// 786 /// By default, performs semantic analysis when building the object type. 787 /// Subclasses may override this routine to provide different behavior. 788 QualType RebuildObjCObjectType(QualType BaseType, 789 SourceLocation Loc, 790 SourceLocation TypeArgsLAngleLoc, 791 ArrayRef<TypeSourceInfo *> TypeArgs, 792 SourceLocation TypeArgsRAngleLoc, 793 SourceLocation ProtocolLAngleLoc, 794 ArrayRef<ObjCProtocolDecl *> Protocols, 795 ArrayRef<SourceLocation> ProtocolLocs, 796 SourceLocation ProtocolRAngleLoc); 797 798 /// Build a new Objective-C object pointer type given the pointee type. 799 /// 800 /// By default, directly builds the pointer type, with no additional semantic 801 /// analysis. 802 QualType RebuildObjCObjectPointerType(QualType PointeeType, 803 SourceLocation Star); 804 805 /// Build a new array type given the element type, size 806 /// modifier, size of the array (if known), size expression, and index type 807 /// qualifiers. 808 /// 809 /// By default, performs semantic analysis when building the array type. 810 /// Subclasses may override this routine to provide different behavior. 811 /// Also by default, all of the other Rebuild*Array 812 QualType RebuildArrayType(QualType ElementType, 813 ArrayType::ArraySizeModifier SizeMod, 814 const llvm::APInt *Size, 815 Expr *SizeExpr, 816 unsigned IndexTypeQuals, 817 SourceRange BracketsRange); 818 819 /// Build a new constant array type given the element type, size 820 /// modifier, (known) size of the array, and index type qualifiers. 821 /// 822 /// By default, performs semantic analysis when building the array type. 823 /// Subclasses may override this routine to provide different behavior. 824 QualType RebuildConstantArrayType(QualType ElementType, 825 ArrayType::ArraySizeModifier SizeMod, 826 const llvm::APInt &Size, 827 Expr *SizeExpr, 828 unsigned IndexTypeQuals, 829 SourceRange BracketsRange); 830 831 /// Build a new incomplete array type given the element type, size 832 /// modifier, and index type qualifiers. 833 /// 834 /// By default, performs semantic analysis when building the array type. 835 /// Subclasses may override this routine to provide different behavior. 836 QualType RebuildIncompleteArrayType(QualType ElementType, 837 ArrayType::ArraySizeModifier SizeMod, 838 unsigned IndexTypeQuals, 839 SourceRange BracketsRange); 840 841 /// Build a new variable-length array type given the element type, 842 /// size modifier, size expression, and index type qualifiers. 843 /// 844 /// By default, performs semantic analysis when building the array type. 845 /// Subclasses may override this routine to provide different behavior. 846 QualType RebuildVariableArrayType(QualType ElementType, 847 ArrayType::ArraySizeModifier SizeMod, 848 Expr *SizeExpr, 849 unsigned IndexTypeQuals, 850 SourceRange BracketsRange); 851 852 /// Build a new dependent-sized array type given the element type, 853 /// size modifier, size expression, and index type qualifiers. 854 /// 855 /// By default, performs semantic analysis when building the array type. 856 /// Subclasses may override this routine to provide different behavior. 857 QualType RebuildDependentSizedArrayType(QualType ElementType, 858 ArrayType::ArraySizeModifier SizeMod, 859 Expr *SizeExpr, 860 unsigned IndexTypeQuals, 861 SourceRange BracketsRange); 862 863 /// Build a new vector type given the element type and 864 /// number of elements. 865 /// 866 /// By default, performs semantic analysis when building the vector type. 867 /// Subclasses may override this routine to provide different behavior. 868 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 869 VectorType::VectorKind VecKind); 870 871 /// Build a new potentially dependently-sized extended vector type 872 /// given the element type and number of elements. 873 /// 874 /// By default, performs semantic analysis when building the vector type. 875 /// Subclasses may override this routine to provide different behavior. 876 QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr, 877 SourceLocation AttributeLoc, 878 VectorType::VectorKind); 879 880 /// Build a new extended vector type given the element type and 881 /// number of elements. 882 /// 883 /// By default, performs semantic analysis when building the vector type. 884 /// Subclasses may override this routine to provide different behavior. 885 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 886 SourceLocation AttributeLoc); 887 888 /// Build a new potentially dependently-sized extended vector type 889 /// given the element type and number of elements. 890 /// 891 /// By default, performs semantic analysis when building the vector type. 892 /// Subclasses may override this routine to provide different behavior. 893 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 894 Expr *SizeExpr, 895 SourceLocation AttributeLoc); 896 897 /// Build a new DependentAddressSpaceType or return the pointee 898 /// type variable with the correct address space (retrieved from 899 /// AddrSpaceExpr) applied to it. The former will be returned in cases 900 /// where the address space remains dependent. 901 /// 902 /// By default, performs semantic analysis when building the type with address 903 /// space applied. Subclasses may override this routine to provide different 904 /// behavior. 905 QualType RebuildDependentAddressSpaceType(QualType PointeeType, 906 Expr *AddrSpaceExpr, 907 SourceLocation AttributeLoc); 908 909 /// Build a new function type. 910 /// 911 /// By default, performs semantic analysis when building the function type. 912 /// Subclasses may override this routine to provide different behavior. 913 QualType RebuildFunctionProtoType(QualType T, 914 MutableArrayRef<QualType> ParamTypes, 915 const FunctionProtoType::ExtProtoInfo &EPI); 916 917 /// Build a new unprototyped function type. 918 QualType RebuildFunctionNoProtoType(QualType ResultType); 919 920 /// Rebuild an unresolved typename type, given the decl that 921 /// the UnresolvedUsingTypenameDecl was transformed to. 922 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 923 924 /// Build a new typedef type. 925 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 926 return SemaRef.Context.getTypeDeclType(Typedef); 927 } 928 929 /// Build a new MacroDefined type. 930 QualType RebuildMacroQualifiedType(QualType T, 931 const IdentifierInfo *MacroII) { 932 return SemaRef.Context.getMacroQualifiedType(T, MacroII); 933 } 934 935 /// Build a new class/struct/union type. 936 QualType RebuildRecordType(RecordDecl *Record) { 937 return SemaRef.Context.getTypeDeclType(Record); 938 } 939 940 /// Build a new Enum type. 941 QualType RebuildEnumType(EnumDecl *Enum) { 942 return SemaRef.Context.getTypeDeclType(Enum); 943 } 944 945 /// Build a new typeof(expr) type. 946 /// 947 /// By default, performs semantic analysis when building the typeof type. 948 /// Subclasses may override this routine to provide different behavior. 949 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 950 951 /// Build a new typeof(type) type. 952 /// 953 /// By default, builds a new TypeOfType with the given underlying type. 954 QualType RebuildTypeOfType(QualType Underlying); 955 956 /// Build a new unary transform type. 957 QualType RebuildUnaryTransformType(QualType BaseType, 958 UnaryTransformType::UTTKind UKind, 959 SourceLocation Loc); 960 961 /// Build a new C++11 decltype type. 962 /// 963 /// By default, performs semantic analysis when building the decltype type. 964 /// Subclasses may override this routine to provide different behavior. 965 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 966 967 /// Build a new C++11 auto type. 968 /// 969 /// By default, builds a new AutoType with the given deduced type. 970 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword, 971 ConceptDecl *TypeConstraintConcept, 972 ArrayRef<TemplateArgument> TypeConstraintArgs) { 973 // Note, IsDependent is always false here: we implicitly convert an 'auto' 974 // which has been deduced to a dependent type into an undeduced 'auto', so 975 // that we'll retry deduction after the transformation. 976 return SemaRef.Context.getAutoType(Deduced, Keyword, 977 /*IsDependent*/ false, /*IsPack=*/false, 978 TypeConstraintConcept, 979 TypeConstraintArgs); 980 } 981 982 /// By default, builds a new DeducedTemplateSpecializationType with the given 983 /// deduced type. 984 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 985 QualType Deduced) { 986 return SemaRef.Context.getDeducedTemplateSpecializationType( 987 Template, Deduced, /*IsDependent*/ false); 988 } 989 990 /// Build a new template specialization type. 991 /// 992 /// By default, performs semantic analysis when building the template 993 /// specialization type. Subclasses may override this routine to provide 994 /// different behavior. 995 QualType RebuildTemplateSpecializationType(TemplateName Template, 996 SourceLocation TemplateLoc, 997 TemplateArgumentListInfo &Args); 998 999 /// Build a new parenthesized type. 1000 /// 1001 /// By default, builds a new ParenType type from the inner type. 1002 /// Subclasses may override this routine to provide different behavior. 1003 QualType RebuildParenType(QualType InnerType) { 1004 return SemaRef.BuildParenType(InnerType); 1005 } 1006 1007 /// Build a new qualified name type. 1008 /// 1009 /// By default, builds a new ElaboratedType type from the keyword, 1010 /// the nested-name-specifier and the named type. 1011 /// Subclasses may override this routine to provide different behavior. 1012 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 1013 ElaboratedTypeKeyword Keyword, 1014 NestedNameSpecifierLoc QualifierLoc, 1015 QualType Named) { 1016 return SemaRef.Context.getElaboratedType(Keyword, 1017 QualifierLoc.getNestedNameSpecifier(), 1018 Named); 1019 } 1020 1021 /// Build a new typename type that refers to a template-id. 1022 /// 1023 /// By default, builds a new DependentNameType type from the 1024 /// nested-name-specifier and the given type. Subclasses may override 1025 /// this routine to provide different behavior. 1026 QualType RebuildDependentTemplateSpecializationType( 1027 ElaboratedTypeKeyword Keyword, 1028 NestedNameSpecifierLoc QualifierLoc, 1029 SourceLocation TemplateKWLoc, 1030 const IdentifierInfo *Name, 1031 SourceLocation NameLoc, 1032 TemplateArgumentListInfo &Args, 1033 bool AllowInjectedClassName) { 1034 // Rebuild the template name. 1035 // TODO: avoid TemplateName abstraction 1036 CXXScopeSpec SS; 1037 SS.Adopt(QualifierLoc); 1038 TemplateName InstName = getDerived().RebuildTemplateName( 1039 SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr, 1040 AllowInjectedClassName); 1041 1042 if (InstName.isNull()) 1043 return QualType(); 1044 1045 // If it's still dependent, make a dependent specialization. 1046 if (InstName.getAsDependentTemplateName()) 1047 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 1048 QualifierLoc.getNestedNameSpecifier(), 1049 Name, 1050 Args); 1051 1052 // Otherwise, make an elaborated type wrapping a non-dependent 1053 // specialization. 1054 QualType T = 1055 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 1056 if (T.isNull()) return QualType(); 1057 1058 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 1059 return T; 1060 1061 return SemaRef.Context.getElaboratedType(Keyword, 1062 QualifierLoc.getNestedNameSpecifier(), 1063 T); 1064 } 1065 1066 /// Build a new typename type that refers to an identifier. 1067 /// 1068 /// By default, performs semantic analysis when building the typename type 1069 /// (or elaborated type). Subclasses may override this routine to provide 1070 /// different behavior. 1071 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 1072 SourceLocation KeywordLoc, 1073 NestedNameSpecifierLoc QualifierLoc, 1074 const IdentifierInfo *Id, 1075 SourceLocation IdLoc, 1076 bool DeducedTSTContext) { 1077 CXXScopeSpec SS; 1078 SS.Adopt(QualifierLoc); 1079 1080 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 1081 // If the name is still dependent, just build a new dependent name type. 1082 if (!SemaRef.computeDeclContext(SS)) 1083 return SemaRef.Context.getDependentNameType(Keyword, 1084 QualifierLoc.getNestedNameSpecifier(), 1085 Id); 1086 } 1087 1088 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1089 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1090 *Id, IdLoc, DeducedTSTContext); 1091 } 1092 1093 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1094 1095 // We had a dependent elaborated-type-specifier that has been transformed 1096 // into a non-dependent elaborated-type-specifier. Find the tag we're 1097 // referring to. 1098 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1099 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1100 if (!DC) 1101 return QualType(); 1102 1103 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1104 return QualType(); 1105 1106 TagDecl *Tag = nullptr; 1107 SemaRef.LookupQualifiedName(Result, DC); 1108 switch (Result.getResultKind()) { 1109 case LookupResult::NotFound: 1110 case LookupResult::NotFoundInCurrentInstantiation: 1111 break; 1112 1113 case LookupResult::Found: 1114 Tag = Result.getAsSingle<TagDecl>(); 1115 break; 1116 1117 case LookupResult::FoundOverloaded: 1118 case LookupResult::FoundUnresolvedValue: 1119 llvm_unreachable("Tag lookup cannot find non-tags"); 1120 1121 case LookupResult::Ambiguous: 1122 // Let the LookupResult structure handle ambiguities. 1123 return QualType(); 1124 } 1125 1126 if (!Tag) { 1127 // Check where the name exists but isn't a tag type and use that to emit 1128 // better diagnostics. 1129 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1130 SemaRef.LookupQualifiedName(Result, DC); 1131 switch (Result.getResultKind()) { 1132 case LookupResult::Found: 1133 case LookupResult::FoundOverloaded: 1134 case LookupResult::FoundUnresolvedValue: { 1135 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1136 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1137 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1138 << NTK << Kind; 1139 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1140 break; 1141 } 1142 default: 1143 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1144 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1145 break; 1146 } 1147 return QualType(); 1148 } 1149 1150 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1151 IdLoc, Id)) { 1152 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1153 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1154 return QualType(); 1155 } 1156 1157 // Build the elaborated-type-specifier type. 1158 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1159 return SemaRef.Context.getElaboratedType(Keyword, 1160 QualifierLoc.getNestedNameSpecifier(), 1161 T); 1162 } 1163 1164 /// Build a new pack expansion type. 1165 /// 1166 /// By default, builds a new PackExpansionType type from the given pattern. 1167 /// Subclasses may override this routine to provide different behavior. 1168 QualType RebuildPackExpansionType(QualType Pattern, 1169 SourceRange PatternRange, 1170 SourceLocation EllipsisLoc, 1171 Optional<unsigned> NumExpansions) { 1172 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1173 NumExpansions); 1174 } 1175 1176 /// Build a new atomic type given its value type. 1177 /// 1178 /// By default, performs semantic analysis when building the atomic type. 1179 /// Subclasses may override this routine to provide different behavior. 1180 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1181 1182 /// Build a new pipe type given its value type. 1183 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1184 bool isReadPipe); 1185 1186 /// Build a new template name given a nested name specifier, a flag 1187 /// indicating whether the "template" keyword was provided, and the template 1188 /// that the template name refers to. 1189 /// 1190 /// By default, builds the new template name directly. Subclasses may override 1191 /// this routine to provide different behavior. 1192 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1193 bool TemplateKW, 1194 TemplateDecl *Template); 1195 1196 /// Build a new template name given a nested name specifier and the 1197 /// name that is referred to as a template. 1198 /// 1199 /// By default, performs semantic analysis to determine whether the name can 1200 /// be resolved to a specific template, then builds the appropriate kind of 1201 /// template name. Subclasses may override this routine to provide different 1202 /// behavior. 1203 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1204 SourceLocation TemplateKWLoc, 1205 const IdentifierInfo &Name, 1206 SourceLocation NameLoc, QualType ObjectType, 1207 NamedDecl *FirstQualifierInScope, 1208 bool AllowInjectedClassName); 1209 1210 /// Build a new template name given a nested name specifier and the 1211 /// overloaded operator name that is referred to as a template. 1212 /// 1213 /// By default, performs semantic analysis to determine whether the name can 1214 /// be resolved to a specific template, then builds the appropriate kind of 1215 /// template name. Subclasses may override this routine to provide different 1216 /// behavior. 1217 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1218 SourceLocation TemplateKWLoc, 1219 OverloadedOperatorKind Operator, 1220 SourceLocation NameLoc, QualType ObjectType, 1221 bool AllowInjectedClassName); 1222 1223 /// Build a new template name given a template template parameter pack 1224 /// and the 1225 /// 1226 /// By default, performs semantic analysis to determine whether the name can 1227 /// be resolved to a specific template, then builds the appropriate kind of 1228 /// template name. Subclasses may override this routine to provide different 1229 /// behavior. 1230 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1231 const TemplateArgument &ArgPack) { 1232 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1233 } 1234 1235 /// Build a new compound statement. 1236 /// 1237 /// By default, performs semantic analysis to build the new statement. 1238 /// Subclasses may override this routine to provide different behavior. 1239 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1240 MultiStmtArg Statements, 1241 SourceLocation RBraceLoc, 1242 bool IsStmtExpr) { 1243 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1244 IsStmtExpr); 1245 } 1246 1247 /// Build a new case statement. 1248 /// 1249 /// By default, performs semantic analysis to build the new statement. 1250 /// Subclasses may override this routine to provide different behavior. 1251 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1252 Expr *LHS, 1253 SourceLocation EllipsisLoc, 1254 Expr *RHS, 1255 SourceLocation ColonLoc) { 1256 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1257 ColonLoc); 1258 } 1259 1260 /// Attach the body to a new case statement. 1261 /// 1262 /// By default, performs semantic analysis to build the new statement. 1263 /// Subclasses may override this routine to provide different behavior. 1264 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1265 getSema().ActOnCaseStmtBody(S, Body); 1266 return S; 1267 } 1268 1269 /// Build a new default statement. 1270 /// 1271 /// By default, performs semantic analysis to build the new statement. 1272 /// Subclasses may override this routine to provide different behavior. 1273 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1274 SourceLocation ColonLoc, 1275 Stmt *SubStmt) { 1276 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1277 /*CurScope=*/nullptr); 1278 } 1279 1280 /// Build a new label statement. 1281 /// 1282 /// By default, performs semantic analysis to build the new statement. 1283 /// Subclasses may override this routine to provide different behavior. 1284 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1285 SourceLocation ColonLoc, Stmt *SubStmt) { 1286 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1287 } 1288 1289 /// Build a new label statement. 1290 /// 1291 /// By default, performs semantic analysis to build the new statement. 1292 /// Subclasses may override this routine to provide different behavior. 1293 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1294 ArrayRef<const Attr*> Attrs, 1295 Stmt *SubStmt) { 1296 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1297 } 1298 1299 /// Build a new "if" 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 RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1304 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1305 SourceLocation ElseLoc, Stmt *Else) { 1306 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1307 ElseLoc, Else); 1308 } 1309 1310 /// Start building a new switch statement. 1311 /// 1312 /// By default, performs semantic analysis to build the new statement. 1313 /// Subclasses may override this routine to provide different behavior. 1314 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1315 Sema::ConditionResult Cond) { 1316 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1317 } 1318 1319 /// Attach the body to the switch statement. 1320 /// 1321 /// By default, performs semantic analysis to build the new statement. 1322 /// Subclasses may override this routine to provide different behavior. 1323 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1324 Stmt *Switch, Stmt *Body) { 1325 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1326 } 1327 1328 /// Build a new while statement. 1329 /// 1330 /// By default, performs semantic analysis to build the new statement. 1331 /// Subclasses may override this routine to provide different behavior. 1332 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, 1333 Sema::ConditionResult Cond, Stmt *Body) { 1334 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1335 } 1336 1337 /// Build a new do-while statement. 1338 /// 1339 /// By default, performs semantic analysis to build the new statement. 1340 /// Subclasses may override this routine to provide different behavior. 1341 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1342 SourceLocation WhileLoc, SourceLocation LParenLoc, 1343 Expr *Cond, SourceLocation RParenLoc) { 1344 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1345 Cond, RParenLoc); 1346 } 1347 1348 /// Build a new for statement. 1349 /// 1350 /// By default, performs semantic analysis to build the new statement. 1351 /// Subclasses may override this routine to provide different behavior. 1352 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1353 Stmt *Init, Sema::ConditionResult Cond, 1354 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1355 Stmt *Body) { 1356 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1357 Inc, RParenLoc, Body); 1358 } 1359 1360 /// Build a new goto statement. 1361 /// 1362 /// By default, performs semantic analysis to build the new statement. 1363 /// Subclasses may override this routine to provide different behavior. 1364 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1365 LabelDecl *Label) { 1366 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1367 } 1368 1369 /// Build a new indirect goto statement. 1370 /// 1371 /// By default, performs semantic analysis to build the new statement. 1372 /// Subclasses may override this routine to provide different behavior. 1373 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1374 SourceLocation StarLoc, 1375 Expr *Target) { 1376 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1377 } 1378 1379 /// Build a new return statement. 1380 /// 1381 /// By default, performs semantic analysis to build the new statement. 1382 /// Subclasses may override this routine to provide different behavior. 1383 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1384 return getSema().BuildReturnStmt(ReturnLoc, Result); 1385 } 1386 1387 /// Build a new declaration statement. 1388 /// 1389 /// By default, performs semantic analysis to build the new statement. 1390 /// Subclasses may override this routine to provide different behavior. 1391 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1392 SourceLocation StartLoc, SourceLocation EndLoc) { 1393 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1394 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1395 } 1396 1397 /// Build a new inline asm statement. 1398 /// 1399 /// By default, performs semantic analysis to build the new statement. 1400 /// Subclasses may override this routine to provide different behavior. 1401 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1402 bool IsVolatile, unsigned NumOutputs, 1403 unsigned NumInputs, IdentifierInfo **Names, 1404 MultiExprArg Constraints, MultiExprArg Exprs, 1405 Expr *AsmString, MultiExprArg Clobbers, 1406 unsigned NumLabels, 1407 SourceLocation RParenLoc) { 1408 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1409 NumInputs, Names, Constraints, Exprs, 1410 AsmString, Clobbers, NumLabels, RParenLoc); 1411 } 1412 1413 /// Build a new MS style inline asm statement. 1414 /// 1415 /// By default, performs semantic analysis to build the new statement. 1416 /// Subclasses may override this routine to provide different behavior. 1417 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1418 ArrayRef<Token> AsmToks, 1419 StringRef AsmString, 1420 unsigned NumOutputs, unsigned NumInputs, 1421 ArrayRef<StringRef> Constraints, 1422 ArrayRef<StringRef> Clobbers, 1423 ArrayRef<Expr*> Exprs, 1424 SourceLocation EndLoc) { 1425 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1426 NumOutputs, NumInputs, 1427 Constraints, Clobbers, Exprs, EndLoc); 1428 } 1429 1430 /// Build a new co_return statement. 1431 /// 1432 /// By default, performs semantic analysis to build the new statement. 1433 /// Subclasses may override this routine to provide different behavior. 1434 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1435 bool IsImplicit) { 1436 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1437 } 1438 1439 /// Build a new co_await expression. 1440 /// 1441 /// By default, performs semantic analysis to build the new expression. 1442 /// Subclasses may override this routine to provide different behavior. 1443 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1444 bool IsImplicit) { 1445 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1446 } 1447 1448 /// Build a new co_await expression. 1449 /// 1450 /// By default, performs semantic analysis to build the new expression. 1451 /// Subclasses may override this routine to provide different behavior. 1452 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1453 Expr *Result, 1454 UnresolvedLookupExpr *Lookup) { 1455 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1456 } 1457 1458 /// Build a new co_yield expression. 1459 /// 1460 /// By default, performs semantic analysis to build the new expression. 1461 /// Subclasses may override this routine to provide different behavior. 1462 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1463 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1464 } 1465 1466 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1467 return getSema().BuildCoroutineBodyStmt(Args); 1468 } 1469 1470 /// Build a new Objective-C \@try statement. 1471 /// 1472 /// By default, performs semantic analysis to build the new statement. 1473 /// Subclasses may override this routine to provide different behavior. 1474 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1475 Stmt *TryBody, 1476 MultiStmtArg CatchStmts, 1477 Stmt *Finally) { 1478 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1479 Finally); 1480 } 1481 1482 /// Rebuild an Objective-C exception declaration. 1483 /// 1484 /// By default, performs semantic analysis to build the new declaration. 1485 /// Subclasses may override this routine to provide different behavior. 1486 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1487 TypeSourceInfo *TInfo, QualType T) { 1488 return getSema().BuildObjCExceptionDecl(TInfo, T, 1489 ExceptionDecl->getInnerLocStart(), 1490 ExceptionDecl->getLocation(), 1491 ExceptionDecl->getIdentifier()); 1492 } 1493 1494 /// Build a new Objective-C \@catch 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 RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1499 SourceLocation RParenLoc, 1500 VarDecl *Var, 1501 Stmt *Body) { 1502 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1503 Var, Body); 1504 } 1505 1506 /// Build a new Objective-C \@finally statement. 1507 /// 1508 /// By default, performs semantic analysis to build the new statement. 1509 /// Subclasses may override this routine to provide different behavior. 1510 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1511 Stmt *Body) { 1512 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1513 } 1514 1515 /// Build a new Objective-C \@throw statement. 1516 /// 1517 /// By default, performs semantic analysis to build the new statement. 1518 /// Subclasses may override this routine to provide different behavior. 1519 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1520 Expr *Operand) { 1521 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1522 } 1523 1524 /// Build a new OpenMP executable directive. 1525 /// 1526 /// By default, performs semantic analysis to build the new statement. 1527 /// Subclasses may override this routine to provide different behavior. 1528 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1529 DeclarationNameInfo DirName, 1530 OpenMPDirectiveKind CancelRegion, 1531 ArrayRef<OMPClause *> Clauses, 1532 Stmt *AStmt, SourceLocation StartLoc, 1533 SourceLocation EndLoc) { 1534 return getSema().ActOnOpenMPExecutableDirective( 1535 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1536 } 1537 1538 /// Build a new OpenMP 'if' clause. 1539 /// 1540 /// By default, performs semantic analysis to build the new OpenMP clause. 1541 /// Subclasses may override this routine to provide different behavior. 1542 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1543 Expr *Condition, SourceLocation StartLoc, 1544 SourceLocation LParenLoc, 1545 SourceLocation NameModifierLoc, 1546 SourceLocation ColonLoc, 1547 SourceLocation EndLoc) { 1548 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1549 LParenLoc, NameModifierLoc, ColonLoc, 1550 EndLoc); 1551 } 1552 1553 /// Build a new OpenMP 'final' clause. 1554 /// 1555 /// By default, performs semantic analysis to build the new OpenMP clause. 1556 /// Subclasses may override this routine to provide different behavior. 1557 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1558 SourceLocation LParenLoc, 1559 SourceLocation EndLoc) { 1560 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1561 EndLoc); 1562 } 1563 1564 /// Build a new OpenMP 'num_threads' clause. 1565 /// 1566 /// By default, performs semantic analysis to build the new OpenMP clause. 1567 /// Subclasses may override this routine to provide different behavior. 1568 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1569 SourceLocation StartLoc, 1570 SourceLocation LParenLoc, 1571 SourceLocation EndLoc) { 1572 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1573 LParenLoc, EndLoc); 1574 } 1575 1576 /// Build a new OpenMP 'safelen' clause. 1577 /// 1578 /// By default, performs semantic analysis to build the new OpenMP clause. 1579 /// Subclasses may override this routine to provide different behavior. 1580 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1581 SourceLocation LParenLoc, 1582 SourceLocation EndLoc) { 1583 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1584 } 1585 1586 /// Build a new OpenMP 'simdlen' clause. 1587 /// 1588 /// By default, performs semantic analysis to build the new OpenMP clause. 1589 /// Subclasses may override this routine to provide different behavior. 1590 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1591 SourceLocation LParenLoc, 1592 SourceLocation EndLoc) { 1593 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1594 } 1595 1596 /// Build a new OpenMP 'allocator' clause. 1597 /// 1598 /// By default, performs semantic analysis to build the new OpenMP clause. 1599 /// Subclasses may override this routine to provide different behavior. 1600 OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc, 1601 SourceLocation LParenLoc, 1602 SourceLocation EndLoc) { 1603 return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc); 1604 } 1605 1606 /// Build a new OpenMP 'collapse' clause. 1607 /// 1608 /// By default, performs semantic analysis to build the new OpenMP clause. 1609 /// Subclasses may override this routine to provide different behavior. 1610 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1611 SourceLocation LParenLoc, 1612 SourceLocation EndLoc) { 1613 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1614 EndLoc); 1615 } 1616 1617 /// Build a new OpenMP 'default' clause. 1618 /// 1619 /// By default, performs semantic analysis to build the new OpenMP clause. 1620 /// Subclasses may override this routine to provide different behavior. 1621 OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc, 1622 SourceLocation StartLoc, 1623 SourceLocation LParenLoc, 1624 SourceLocation EndLoc) { 1625 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1626 StartLoc, LParenLoc, EndLoc); 1627 } 1628 1629 /// Build a new OpenMP 'proc_bind' clause. 1630 /// 1631 /// By default, performs semantic analysis to build the new OpenMP clause. 1632 /// Subclasses may override this routine to provide different behavior. 1633 OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind, 1634 SourceLocation KindKwLoc, 1635 SourceLocation StartLoc, 1636 SourceLocation LParenLoc, 1637 SourceLocation EndLoc) { 1638 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1639 StartLoc, LParenLoc, EndLoc); 1640 } 1641 1642 /// Build a new OpenMP 'schedule' clause. 1643 /// 1644 /// By default, performs semantic analysis to build the new OpenMP clause. 1645 /// Subclasses may override this routine to provide different behavior. 1646 OMPClause *RebuildOMPScheduleClause( 1647 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1648 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1649 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1650 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1651 return getSema().ActOnOpenMPScheduleClause( 1652 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1653 CommaLoc, EndLoc); 1654 } 1655 1656 /// Build a new OpenMP 'ordered' clause. 1657 /// 1658 /// By default, performs semantic analysis to build the new OpenMP clause. 1659 /// Subclasses may override this routine to provide different behavior. 1660 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1661 SourceLocation EndLoc, 1662 SourceLocation LParenLoc, Expr *Num) { 1663 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1664 } 1665 1666 /// Build a new OpenMP 'private' 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 *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1671 SourceLocation StartLoc, 1672 SourceLocation LParenLoc, 1673 SourceLocation EndLoc) { 1674 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1675 EndLoc); 1676 } 1677 1678 /// Build a new OpenMP 'firstprivate' clause. 1679 /// 1680 /// By default, performs semantic analysis to build the new OpenMP clause. 1681 /// Subclasses may override this routine to provide different behavior. 1682 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1683 SourceLocation StartLoc, 1684 SourceLocation LParenLoc, 1685 SourceLocation EndLoc) { 1686 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1687 EndLoc); 1688 } 1689 1690 /// Build a new OpenMP 'lastprivate' 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 *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1695 OpenMPLastprivateModifier LPKind, 1696 SourceLocation LPKindLoc, 1697 SourceLocation ColonLoc, 1698 SourceLocation StartLoc, 1699 SourceLocation LParenLoc, 1700 SourceLocation EndLoc) { 1701 return getSema().ActOnOpenMPLastprivateClause( 1702 VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc); 1703 } 1704 1705 /// Build a new OpenMP 'shared' clause. 1706 /// 1707 /// By default, performs semantic analysis to build the new OpenMP clause. 1708 /// Subclasses may override this routine to provide different behavior. 1709 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1710 SourceLocation StartLoc, 1711 SourceLocation LParenLoc, 1712 SourceLocation EndLoc) { 1713 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1714 EndLoc); 1715 } 1716 1717 /// Build a new OpenMP 'reduction' clause. 1718 /// 1719 /// By default, performs semantic analysis to build the new statement. 1720 /// Subclasses may override this routine to provide different behavior. 1721 OMPClause *RebuildOMPReductionClause( 1722 ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier, 1723 SourceLocation StartLoc, SourceLocation LParenLoc, 1724 SourceLocation ModifierLoc, SourceLocation ColonLoc, 1725 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 1726 const DeclarationNameInfo &ReductionId, 1727 ArrayRef<Expr *> UnresolvedReductions) { 1728 return getSema().ActOnOpenMPReductionClause( 1729 VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc, 1730 ReductionIdScopeSpec, ReductionId, UnresolvedReductions); 1731 } 1732 1733 /// Build a new OpenMP 'task_reduction' clause. 1734 /// 1735 /// By default, performs semantic analysis to build the new statement. 1736 /// Subclasses may override this routine to provide different behavior. 1737 OMPClause *RebuildOMPTaskReductionClause( 1738 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1739 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc, 1740 CXXScopeSpec &ReductionIdScopeSpec, 1741 const DeclarationNameInfo &ReductionId, 1742 ArrayRef<Expr *> UnresolvedReductions) { 1743 return getSema().ActOnOpenMPTaskReductionClause( 1744 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1745 ReductionId, UnresolvedReductions); 1746 } 1747 1748 /// Build a new OpenMP 'in_reduction' clause. 1749 /// 1750 /// By default, performs semantic analysis to build the new statement. 1751 /// Subclasses may override this routine to provide different behavior. 1752 OMPClause * 1753 RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1754 SourceLocation LParenLoc, SourceLocation ColonLoc, 1755 SourceLocation EndLoc, 1756 CXXScopeSpec &ReductionIdScopeSpec, 1757 const DeclarationNameInfo &ReductionId, 1758 ArrayRef<Expr *> UnresolvedReductions) { 1759 return getSema().ActOnOpenMPInReductionClause( 1760 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1761 ReductionId, UnresolvedReductions); 1762 } 1763 1764 /// Build a new OpenMP 'linear' clause. 1765 /// 1766 /// By default, performs semantic analysis to build the new OpenMP clause. 1767 /// Subclasses may override this routine to provide different behavior. 1768 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1769 SourceLocation StartLoc, 1770 SourceLocation LParenLoc, 1771 OpenMPLinearClauseKind Modifier, 1772 SourceLocation ModifierLoc, 1773 SourceLocation ColonLoc, 1774 SourceLocation EndLoc) { 1775 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1776 Modifier, ModifierLoc, ColonLoc, 1777 EndLoc); 1778 } 1779 1780 /// Build a new OpenMP 'aligned' clause. 1781 /// 1782 /// By default, performs semantic analysis to build the new OpenMP clause. 1783 /// Subclasses may override this routine to provide different behavior. 1784 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1785 SourceLocation StartLoc, 1786 SourceLocation LParenLoc, 1787 SourceLocation ColonLoc, 1788 SourceLocation EndLoc) { 1789 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1790 LParenLoc, ColonLoc, EndLoc); 1791 } 1792 1793 /// Build a new OpenMP 'copyin' clause. 1794 /// 1795 /// By default, performs semantic analysis to build the new OpenMP clause. 1796 /// Subclasses may override this routine to provide different behavior. 1797 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1798 SourceLocation StartLoc, 1799 SourceLocation LParenLoc, 1800 SourceLocation EndLoc) { 1801 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1802 EndLoc); 1803 } 1804 1805 /// Build a new OpenMP 'copyprivate' clause. 1806 /// 1807 /// By default, performs semantic analysis to build the new OpenMP clause. 1808 /// Subclasses may override this routine to provide different behavior. 1809 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1810 SourceLocation StartLoc, 1811 SourceLocation LParenLoc, 1812 SourceLocation EndLoc) { 1813 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1814 EndLoc); 1815 } 1816 1817 /// Build a new OpenMP 'flush' pseudo 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 *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1822 SourceLocation StartLoc, 1823 SourceLocation LParenLoc, 1824 SourceLocation EndLoc) { 1825 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1826 EndLoc); 1827 } 1828 1829 /// Build a new OpenMP 'depobj' pseudo 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 *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc, 1834 SourceLocation LParenLoc, 1835 SourceLocation EndLoc) { 1836 return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc, 1837 EndLoc); 1838 } 1839 1840 /// Build a new OpenMP 'depend' pseudo clause. 1841 /// 1842 /// By default, performs semantic analysis to build the new OpenMP clause. 1843 /// Subclasses may override this routine to provide different behavior. 1844 OMPClause * 1845 RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind, 1846 SourceLocation DepLoc, SourceLocation ColonLoc, 1847 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1848 SourceLocation LParenLoc, SourceLocation EndLoc) { 1849 return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc, 1850 ColonLoc, VarList, StartLoc, 1851 LParenLoc, EndLoc); 1852 } 1853 1854 /// Build a new OpenMP 'device' clause. 1855 /// 1856 /// By default, performs semantic analysis to build the new statement. 1857 /// Subclasses may override this routine to provide different behavior. 1858 OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier, 1859 Expr *Device, SourceLocation StartLoc, 1860 SourceLocation LParenLoc, 1861 SourceLocation ModifierLoc, 1862 SourceLocation EndLoc) { 1863 return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc, 1864 LParenLoc, ModifierLoc, EndLoc); 1865 } 1866 1867 /// Build a new OpenMP 'map' clause. 1868 /// 1869 /// By default, performs semantic analysis to build the new OpenMP clause. 1870 /// Subclasses may override this routine to provide different behavior. 1871 OMPClause *RebuildOMPMapClause( 1872 ArrayRef<OpenMPMapModifierKind> MapTypeModifiers, 1873 ArrayRef<SourceLocation> MapTypeModifiersLoc, 1874 CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId, 1875 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1876 SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1877 const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) { 1878 return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc, 1879 MapperIdScopeSpec, MapperId, MapType, 1880 IsMapTypeImplicit, MapLoc, ColonLoc, 1881 VarList, Locs, UnresolvedMappers); 1882 } 1883 1884 /// Build a new OpenMP 'allocate' clause. 1885 /// 1886 /// By default, performs semantic analysis to build the new OpenMP clause. 1887 /// Subclasses may override this routine to provide different behavior. 1888 OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList, 1889 SourceLocation StartLoc, 1890 SourceLocation LParenLoc, 1891 SourceLocation ColonLoc, 1892 SourceLocation EndLoc) { 1893 return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc, 1894 LParenLoc, ColonLoc, EndLoc); 1895 } 1896 1897 /// Build a new OpenMP 'num_teams' clause. 1898 /// 1899 /// By default, performs semantic analysis to build the new statement. 1900 /// Subclasses may override this routine to provide different behavior. 1901 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1902 SourceLocation LParenLoc, 1903 SourceLocation EndLoc) { 1904 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1905 EndLoc); 1906 } 1907 1908 /// Build a new OpenMP 'thread_limit' clause. 1909 /// 1910 /// By default, performs semantic analysis to build the new statement. 1911 /// Subclasses may override this routine to provide different behavior. 1912 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1913 SourceLocation StartLoc, 1914 SourceLocation LParenLoc, 1915 SourceLocation EndLoc) { 1916 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1917 LParenLoc, EndLoc); 1918 } 1919 1920 /// Build a new OpenMP 'priority' clause. 1921 /// 1922 /// By default, performs semantic analysis to build the new statement. 1923 /// Subclasses may override this routine to provide different behavior. 1924 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1925 SourceLocation LParenLoc, 1926 SourceLocation EndLoc) { 1927 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1928 EndLoc); 1929 } 1930 1931 /// Build a new OpenMP 'grainsize' clause. 1932 /// 1933 /// By default, performs semantic analysis to build the new statement. 1934 /// Subclasses may override this routine to provide different behavior. 1935 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1936 SourceLocation LParenLoc, 1937 SourceLocation EndLoc) { 1938 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1939 EndLoc); 1940 } 1941 1942 /// Build a new OpenMP 'num_tasks' clause. 1943 /// 1944 /// By default, performs semantic analysis to build the new statement. 1945 /// Subclasses may override this routine to provide different behavior. 1946 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1947 SourceLocation LParenLoc, 1948 SourceLocation EndLoc) { 1949 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1950 EndLoc); 1951 } 1952 1953 /// Build a new OpenMP 'hint' clause. 1954 /// 1955 /// By default, performs semantic analysis to build the new statement. 1956 /// Subclasses may override this routine to provide different behavior. 1957 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1958 SourceLocation LParenLoc, 1959 SourceLocation EndLoc) { 1960 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1961 } 1962 1963 /// Build a new OpenMP 'detach' clause. 1964 /// 1965 /// By default, performs semantic analysis to build the new statement. 1966 /// Subclasses may override this routine to provide different behavior. 1967 OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc, 1968 SourceLocation LParenLoc, 1969 SourceLocation EndLoc) { 1970 return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc); 1971 } 1972 1973 /// Build a new OpenMP 'dist_schedule' clause. 1974 /// 1975 /// By default, performs semantic analysis to build the new OpenMP clause. 1976 /// Subclasses may override this routine to provide different behavior. 1977 OMPClause * 1978 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1979 Expr *ChunkSize, SourceLocation StartLoc, 1980 SourceLocation LParenLoc, SourceLocation KindLoc, 1981 SourceLocation CommaLoc, SourceLocation EndLoc) { 1982 return getSema().ActOnOpenMPDistScheduleClause( 1983 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1984 } 1985 1986 /// Build a new OpenMP 'to' clause. 1987 /// 1988 /// By default, performs semantic analysis to build the new statement. 1989 /// Subclasses may override this routine to provide different behavior. 1990 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 1991 CXXScopeSpec &MapperIdScopeSpec, 1992 DeclarationNameInfo &MapperId, 1993 const OMPVarListLocTy &Locs, 1994 ArrayRef<Expr *> UnresolvedMappers) { 1995 return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId, 1996 Locs, UnresolvedMappers); 1997 } 1998 1999 /// Build a new OpenMP 'from' clause. 2000 /// 2001 /// By default, performs semantic analysis to build the new statement. 2002 /// Subclasses may override this routine to provide different behavior. 2003 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 2004 CXXScopeSpec &MapperIdScopeSpec, 2005 DeclarationNameInfo &MapperId, 2006 const OMPVarListLocTy &Locs, 2007 ArrayRef<Expr *> UnresolvedMappers) { 2008 return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId, 2009 Locs, UnresolvedMappers); 2010 } 2011 2012 /// Build a new OpenMP 'use_device_ptr' clause. 2013 /// 2014 /// By default, performs semantic analysis to build the new OpenMP clause. 2015 /// Subclasses may override this routine to provide different behavior. 2016 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 2017 const OMPVarListLocTy &Locs) { 2018 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs); 2019 } 2020 2021 /// Build a new OpenMP 'is_device_ptr' clause. 2022 /// 2023 /// By default, performs semantic analysis to build the new OpenMP clause. 2024 /// Subclasses may override this routine to provide different behavior. 2025 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 2026 const OMPVarListLocTy &Locs) { 2027 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs); 2028 } 2029 2030 /// Build a new OpenMP 'defaultmap' clause. 2031 /// 2032 /// By default, performs semantic analysis to build the new OpenMP clause. 2033 /// Subclasses may override this routine to provide different behavior. 2034 OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M, 2035 OpenMPDefaultmapClauseKind Kind, 2036 SourceLocation StartLoc, 2037 SourceLocation LParenLoc, 2038 SourceLocation MLoc, 2039 SourceLocation KindLoc, 2040 SourceLocation EndLoc) { 2041 return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc, 2042 MLoc, KindLoc, EndLoc); 2043 } 2044 2045 /// Build a new OpenMP 'nontemporal' clause. 2046 /// 2047 /// By default, performs semantic analysis to build the new OpenMP clause. 2048 /// Subclasses may override this routine to provide different behavior. 2049 OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList, 2050 SourceLocation StartLoc, 2051 SourceLocation LParenLoc, 2052 SourceLocation EndLoc) { 2053 return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc, 2054 EndLoc); 2055 } 2056 2057 /// Build a new OpenMP 'inclusive' clause. 2058 /// 2059 /// By default, performs semantic analysis to build the new OpenMP clause. 2060 /// Subclasses may override this routine to provide different behavior. 2061 OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList, 2062 SourceLocation StartLoc, 2063 SourceLocation LParenLoc, 2064 SourceLocation EndLoc) { 2065 return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc, 2066 EndLoc); 2067 } 2068 2069 /// Build a new OpenMP 'exclusive' 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 *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList, 2074 SourceLocation StartLoc, 2075 SourceLocation LParenLoc, 2076 SourceLocation EndLoc) { 2077 return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc, 2078 EndLoc); 2079 } 2080 2081 /// Build a new OpenMP 'order' clause. 2082 /// 2083 /// By default, performs semantic analysis to build the new OpenMP clause. 2084 /// Subclasses may override this routine to provide different behavior. 2085 OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind, 2086 SourceLocation KindKwLoc, 2087 SourceLocation StartLoc, 2088 SourceLocation LParenLoc, 2089 SourceLocation EndLoc) { 2090 return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc, 2091 LParenLoc, EndLoc); 2092 } 2093 2094 /// Rebuild the operand to an Objective-C \@synchronized statement. 2095 /// 2096 /// By default, performs semantic analysis to build the new statement. 2097 /// Subclasses may override this routine to provide different behavior. 2098 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 2099 Expr *object) { 2100 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 2101 } 2102 2103 /// Build a new Objective-C \@synchronized statement. 2104 /// 2105 /// By default, performs semantic analysis to build the new statement. 2106 /// Subclasses may override this routine to provide different behavior. 2107 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 2108 Expr *Object, Stmt *Body) { 2109 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 2110 } 2111 2112 /// Build a new Objective-C \@autoreleasepool statement. 2113 /// 2114 /// By default, performs semantic analysis to build the new statement. 2115 /// Subclasses may override this routine to provide different behavior. 2116 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 2117 Stmt *Body) { 2118 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 2119 } 2120 2121 /// Build a new Objective-C fast enumeration statement. 2122 /// 2123 /// By default, performs semantic analysis to build the new statement. 2124 /// Subclasses may override this routine to provide different behavior. 2125 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 2126 Stmt *Element, 2127 Expr *Collection, 2128 SourceLocation RParenLoc, 2129 Stmt *Body) { 2130 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 2131 Element, 2132 Collection, 2133 RParenLoc); 2134 if (ForEachStmt.isInvalid()) 2135 return StmtError(); 2136 2137 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 2138 } 2139 2140 /// Build a new C++ exception declaration. 2141 /// 2142 /// By default, performs semantic analysis to build the new decaration. 2143 /// Subclasses may override this routine to provide different behavior. 2144 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 2145 TypeSourceInfo *Declarator, 2146 SourceLocation StartLoc, 2147 SourceLocation IdLoc, 2148 IdentifierInfo *Id) { 2149 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 2150 StartLoc, IdLoc, Id); 2151 if (Var) 2152 getSema().CurContext->addDecl(Var); 2153 return Var; 2154 } 2155 2156 /// Build a new C++ catch statement. 2157 /// 2158 /// By default, performs semantic analysis to build the new statement. 2159 /// Subclasses may override this routine to provide different behavior. 2160 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 2161 VarDecl *ExceptionDecl, 2162 Stmt *Handler) { 2163 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 2164 Handler)); 2165 } 2166 2167 /// Build a new C++ try statement. 2168 /// 2169 /// By default, performs semantic analysis to build the new statement. 2170 /// Subclasses may override this routine to provide different behavior. 2171 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 2172 ArrayRef<Stmt *> Handlers) { 2173 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 2174 } 2175 2176 /// Build a new C++0x range-based for statement. 2177 /// 2178 /// By default, performs semantic analysis to build the new statement. 2179 /// Subclasses may override this routine to provide different behavior. 2180 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 2181 SourceLocation CoawaitLoc, Stmt *Init, 2182 SourceLocation ColonLoc, Stmt *Range, 2183 Stmt *Begin, Stmt *End, Expr *Cond, 2184 Expr *Inc, Stmt *LoopVar, 2185 SourceLocation RParenLoc) { 2186 // If we've just learned that the range is actually an Objective-C 2187 // collection, treat this as an Objective-C fast enumeration loop. 2188 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 2189 if (RangeStmt->isSingleDecl()) { 2190 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 2191 if (RangeVar->isInvalidDecl()) 2192 return StmtError(); 2193 2194 Expr *RangeExpr = RangeVar->getInit(); 2195 if (!RangeExpr->isTypeDependent() && 2196 RangeExpr->getType()->isObjCObjectPointerType()) { 2197 // FIXME: Support init-statements in Objective-C++20 ranged for 2198 // statement. 2199 if (Init) { 2200 return SemaRef.Diag(Init->getBeginLoc(), 2201 diag::err_objc_for_range_init_stmt) 2202 << Init->getSourceRange(); 2203 } 2204 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, 2205 RangeExpr, RParenLoc); 2206 } 2207 } 2208 } 2209 } 2210 2211 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc, 2212 Range, Begin, End, Cond, Inc, LoopVar, 2213 RParenLoc, Sema::BFRK_Rebuild); 2214 } 2215 2216 /// Build a new C++0x range-based for statement. 2217 /// 2218 /// By default, performs semantic analysis to build the new statement. 2219 /// Subclasses may override this routine to provide different behavior. 2220 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2221 bool IsIfExists, 2222 NestedNameSpecifierLoc QualifierLoc, 2223 DeclarationNameInfo NameInfo, 2224 Stmt *Nested) { 2225 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2226 QualifierLoc, NameInfo, Nested); 2227 } 2228 2229 /// Attach body to a C++0x range-based for statement. 2230 /// 2231 /// By default, performs semantic analysis to finish the new statement. 2232 /// Subclasses may override this routine to provide different behavior. 2233 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2234 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2235 } 2236 2237 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2238 Stmt *TryBlock, Stmt *Handler) { 2239 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2240 } 2241 2242 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2243 Stmt *Block) { 2244 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2245 } 2246 2247 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2248 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2249 } 2250 2251 /// Build a new predefined expression. 2252 /// 2253 /// By default, performs semantic analysis to build the new expression. 2254 /// Subclasses may override this routine to provide different behavior. 2255 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2256 PredefinedExpr::IdentKind IK) { 2257 return getSema().BuildPredefinedExpr(Loc, IK); 2258 } 2259 2260 /// Build a new expression that references a declaration. 2261 /// 2262 /// By default, performs semantic analysis to build the new expression. 2263 /// Subclasses may override this routine to provide different behavior. 2264 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2265 LookupResult &R, 2266 bool RequiresADL) { 2267 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2268 } 2269 2270 2271 /// Build a new expression that references a declaration. 2272 /// 2273 /// By default, performs semantic analysis to build the new expression. 2274 /// Subclasses may override this routine to provide different behavior. 2275 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2276 ValueDecl *VD, 2277 const DeclarationNameInfo &NameInfo, 2278 NamedDecl *Found, 2279 TemplateArgumentListInfo *TemplateArgs) { 2280 CXXScopeSpec SS; 2281 SS.Adopt(QualifierLoc); 2282 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found, 2283 TemplateArgs); 2284 } 2285 2286 /// Build a new expression in parentheses. 2287 /// 2288 /// By default, performs semantic analysis to build the new expression. 2289 /// Subclasses may override this routine to provide different behavior. 2290 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2291 SourceLocation RParen) { 2292 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2293 } 2294 2295 /// Build a new pseudo-destructor expression. 2296 /// 2297 /// By default, performs semantic analysis to build the new expression. 2298 /// Subclasses may override this routine to provide different behavior. 2299 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2300 SourceLocation OperatorLoc, 2301 bool isArrow, 2302 CXXScopeSpec &SS, 2303 TypeSourceInfo *ScopeType, 2304 SourceLocation CCLoc, 2305 SourceLocation TildeLoc, 2306 PseudoDestructorTypeStorage Destroyed); 2307 2308 /// Build a new unary operator expression. 2309 /// 2310 /// By default, performs semantic analysis to build the new expression. 2311 /// Subclasses may override this routine to provide different behavior. 2312 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2313 UnaryOperatorKind Opc, 2314 Expr *SubExpr) { 2315 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2316 } 2317 2318 /// Build a new builtin offsetof expression. 2319 /// 2320 /// By default, performs semantic analysis to build the new expression. 2321 /// Subclasses may override this routine to provide different behavior. 2322 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2323 TypeSourceInfo *Type, 2324 ArrayRef<Sema::OffsetOfComponent> Components, 2325 SourceLocation RParenLoc) { 2326 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2327 RParenLoc); 2328 } 2329 2330 /// Build a new sizeof, alignof or vec_step expression with a 2331 /// type argument. 2332 /// 2333 /// By default, performs semantic analysis to build the new expression. 2334 /// Subclasses may override this routine to provide different behavior. 2335 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2336 SourceLocation OpLoc, 2337 UnaryExprOrTypeTrait ExprKind, 2338 SourceRange R) { 2339 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2340 } 2341 2342 /// Build a new sizeof, alignof or vec step expression with an 2343 /// expression argument. 2344 /// 2345 /// By default, performs semantic analysis to build the new expression. 2346 /// Subclasses may override this routine to provide different behavior. 2347 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2348 UnaryExprOrTypeTrait ExprKind, 2349 SourceRange R) { 2350 ExprResult Result 2351 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2352 if (Result.isInvalid()) 2353 return ExprError(); 2354 2355 return Result; 2356 } 2357 2358 /// Build a new array subscript 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 RebuildArraySubscriptExpr(Expr *LHS, 2363 SourceLocation LBracketLoc, 2364 Expr *RHS, 2365 SourceLocation RBracketLoc) { 2366 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2367 LBracketLoc, RHS, 2368 RBracketLoc); 2369 } 2370 2371 /// Build a new array section 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 RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2376 Expr *LowerBound, 2377 SourceLocation ColonLoc, Expr *Length, 2378 SourceLocation RBracketLoc) { 2379 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2380 ColonLoc, Length, RBracketLoc); 2381 } 2382 2383 /// Build a new array shaping expression. 2384 /// 2385 /// By default, performs semantic analysis to build the new expression. 2386 /// Subclasses may override this routine to provide different behavior. 2387 ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc, 2388 SourceLocation RParenLoc, 2389 ArrayRef<Expr *> Dims, 2390 ArrayRef<SourceRange> BracketsRanges) { 2391 return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims, 2392 BracketsRanges); 2393 } 2394 2395 /// Build a new iterator expression. 2396 /// 2397 /// By default, performs semantic analysis to build the new expression. 2398 /// Subclasses may override this routine to provide different behavior. 2399 ExprResult RebuildOMPIteratorExpr( 2400 SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc, 2401 ArrayRef<Sema::OMPIteratorData> Data) { 2402 return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc, 2403 LLoc, RLoc, Data); 2404 } 2405 2406 /// Build a new call expression. 2407 /// 2408 /// By default, performs semantic analysis to build the new expression. 2409 /// Subclasses may override this routine to provide different behavior. 2410 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2411 MultiExprArg Args, 2412 SourceLocation RParenLoc, 2413 Expr *ExecConfig = nullptr) { 2414 return getSema().BuildCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, Args, 2415 RParenLoc, ExecConfig); 2416 } 2417 2418 /// Build a new member access expression. 2419 /// 2420 /// By default, performs semantic analysis to build the new expression. 2421 /// Subclasses may override this routine to provide different behavior. 2422 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2423 bool isArrow, 2424 NestedNameSpecifierLoc QualifierLoc, 2425 SourceLocation TemplateKWLoc, 2426 const DeclarationNameInfo &MemberNameInfo, 2427 ValueDecl *Member, 2428 NamedDecl *FoundDecl, 2429 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2430 NamedDecl *FirstQualifierInScope) { 2431 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2432 isArrow); 2433 if (!Member->getDeclName()) { 2434 // We have a reference to an unnamed field. This is always the 2435 // base of an anonymous struct/union member access, i.e. the 2436 // field is always of record type. 2437 assert(Member->getType()->isRecordType() && 2438 "unnamed member not of record type?"); 2439 2440 BaseResult = 2441 getSema().PerformObjectMemberConversion(BaseResult.get(), 2442 QualifierLoc.getNestedNameSpecifier(), 2443 FoundDecl, Member); 2444 if (BaseResult.isInvalid()) 2445 return ExprError(); 2446 Base = BaseResult.get(); 2447 2448 CXXScopeSpec EmptySS; 2449 return getSema().BuildFieldReferenceExpr( 2450 Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member), 2451 DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo); 2452 } 2453 2454 CXXScopeSpec SS; 2455 SS.Adopt(QualifierLoc); 2456 2457 Base = BaseResult.get(); 2458 QualType BaseType = Base->getType(); 2459 2460 if (isArrow && !BaseType->isPointerType()) 2461 return ExprError(); 2462 2463 // FIXME: this involves duplicating earlier analysis in a lot of 2464 // cases; we should avoid this when possible. 2465 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2466 R.addDecl(FoundDecl); 2467 R.resolveKind(); 2468 2469 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2470 SS, TemplateKWLoc, 2471 FirstQualifierInScope, 2472 R, ExplicitTemplateArgs, 2473 /*S*/nullptr); 2474 } 2475 2476 /// Build a new binary operator expression. 2477 /// 2478 /// By default, performs semantic analysis to build the new expression. 2479 /// Subclasses may override this routine to provide different behavior. 2480 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2481 BinaryOperatorKind Opc, 2482 Expr *LHS, Expr *RHS) { 2483 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2484 } 2485 2486 /// Build a new rewritten operator expression. 2487 /// 2488 /// By default, performs semantic analysis to build the new expression. 2489 /// Subclasses may override this routine to provide different behavior. 2490 ExprResult RebuildCXXRewrittenBinaryOperator( 2491 SourceLocation OpLoc, BinaryOperatorKind Opcode, 2492 const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) { 2493 return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS, 2494 RHS, /*RequiresADL*/false); 2495 } 2496 2497 /// Build a new conditional operator expression. 2498 /// 2499 /// By default, performs semantic analysis to build the new expression. 2500 /// Subclasses may override this routine to provide different behavior. 2501 ExprResult RebuildConditionalOperator(Expr *Cond, 2502 SourceLocation QuestionLoc, 2503 Expr *LHS, 2504 SourceLocation ColonLoc, 2505 Expr *RHS) { 2506 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2507 LHS, RHS); 2508 } 2509 2510 /// Build a new C-style cast expression. 2511 /// 2512 /// By default, performs semantic analysis to build the new expression. 2513 /// Subclasses may override this routine to provide different behavior. 2514 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2515 TypeSourceInfo *TInfo, 2516 SourceLocation RParenLoc, 2517 Expr *SubExpr) { 2518 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2519 SubExpr); 2520 } 2521 2522 /// Build a new compound literal expression. 2523 /// 2524 /// By default, performs semantic analysis to build the new expression. 2525 /// Subclasses may override this routine to provide different behavior. 2526 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2527 TypeSourceInfo *TInfo, 2528 SourceLocation RParenLoc, 2529 Expr *Init) { 2530 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2531 Init); 2532 } 2533 2534 /// Build a new extended vector element access expression. 2535 /// 2536 /// By default, performs semantic analysis to build the new expression. 2537 /// Subclasses may override this routine to provide different behavior. 2538 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2539 SourceLocation OpLoc, 2540 SourceLocation AccessorLoc, 2541 IdentifierInfo &Accessor) { 2542 2543 CXXScopeSpec SS; 2544 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2545 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2546 OpLoc, /*IsArrow*/ false, 2547 SS, SourceLocation(), 2548 /*FirstQualifierInScope*/ nullptr, 2549 NameInfo, 2550 /* TemplateArgs */ nullptr, 2551 /*S*/ nullptr); 2552 } 2553 2554 /// Build a new initializer list expression. 2555 /// 2556 /// By default, performs semantic analysis to build the new expression. 2557 /// Subclasses may override this routine to provide different behavior. 2558 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2559 MultiExprArg Inits, 2560 SourceLocation RBraceLoc) { 2561 return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc); 2562 } 2563 2564 /// Build a new designated initializer expression. 2565 /// 2566 /// By default, performs semantic analysis to build the new expression. 2567 /// Subclasses may override this routine to provide different behavior. 2568 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2569 MultiExprArg ArrayExprs, 2570 SourceLocation EqualOrColonLoc, 2571 bool GNUSyntax, 2572 Expr *Init) { 2573 ExprResult Result 2574 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2575 Init); 2576 if (Result.isInvalid()) 2577 return ExprError(); 2578 2579 return Result; 2580 } 2581 2582 /// Build a new value-initialized expression. 2583 /// 2584 /// By default, builds the implicit value initialization without performing 2585 /// any semantic analysis. Subclasses may override this routine to provide 2586 /// different behavior. 2587 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2588 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2589 } 2590 2591 /// Build a new \c va_arg expression. 2592 /// 2593 /// By default, performs semantic analysis to build the new expression. 2594 /// Subclasses may override this routine to provide different behavior. 2595 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2596 Expr *SubExpr, TypeSourceInfo *TInfo, 2597 SourceLocation RParenLoc) { 2598 return getSema().BuildVAArgExpr(BuiltinLoc, 2599 SubExpr, TInfo, 2600 RParenLoc); 2601 } 2602 2603 /// Build a new expression list in parentheses. 2604 /// 2605 /// By default, performs semantic analysis to build the new expression. 2606 /// Subclasses may override this routine to provide different behavior. 2607 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2608 MultiExprArg SubExprs, 2609 SourceLocation RParenLoc) { 2610 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2611 } 2612 2613 /// Build a new address-of-label expression. 2614 /// 2615 /// By default, performs semantic analysis, using the name of the label 2616 /// rather than attempting to map the label statement itself. 2617 /// Subclasses may override this routine to provide different behavior. 2618 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2619 SourceLocation LabelLoc, LabelDecl *Label) { 2620 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2621 } 2622 2623 /// Build a new GNU statement expression. 2624 /// 2625 /// By default, performs semantic analysis to build the new expression. 2626 /// Subclasses may override this routine to provide different behavior. 2627 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt, 2628 SourceLocation RParenLoc, unsigned TemplateDepth) { 2629 return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc, 2630 TemplateDepth); 2631 } 2632 2633 /// Build a new __builtin_choose_expr expression. 2634 /// 2635 /// By default, performs semantic analysis to build the new expression. 2636 /// Subclasses may override this routine to provide different behavior. 2637 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 2638 Expr *Cond, Expr *LHS, Expr *RHS, 2639 SourceLocation RParenLoc) { 2640 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2641 Cond, LHS, RHS, 2642 RParenLoc); 2643 } 2644 2645 /// Build a new generic selection expression. 2646 /// 2647 /// By default, performs semantic analysis to build the new expression. 2648 /// Subclasses may override this routine to provide different behavior. 2649 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2650 SourceLocation DefaultLoc, 2651 SourceLocation RParenLoc, 2652 Expr *ControllingExpr, 2653 ArrayRef<TypeSourceInfo *> Types, 2654 ArrayRef<Expr *> Exprs) { 2655 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2656 ControllingExpr, Types, Exprs); 2657 } 2658 2659 /// Build a new overloaded operator call expression. 2660 /// 2661 /// By default, performs semantic analysis to build the new expression. 2662 /// The semantic analysis provides the behavior of template instantiation, 2663 /// copying with transformations that turn what looks like an overloaded 2664 /// operator call into a use of a builtin operator, performing 2665 /// argument-dependent lookup, etc. Subclasses may override this routine to 2666 /// provide different behavior. 2667 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2668 SourceLocation OpLoc, 2669 Expr *Callee, 2670 Expr *First, 2671 Expr *Second); 2672 2673 /// Build a new C++ "named" cast expression, such as static_cast or 2674 /// reinterpret_cast. 2675 /// 2676 /// By default, this routine dispatches to one of the more-specific routines 2677 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2678 /// Subclasses may override this routine to provide different behavior. 2679 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2680 Stmt::StmtClass Class, 2681 SourceLocation LAngleLoc, 2682 TypeSourceInfo *TInfo, 2683 SourceLocation RAngleLoc, 2684 SourceLocation LParenLoc, 2685 Expr *SubExpr, 2686 SourceLocation RParenLoc) { 2687 switch (Class) { 2688 case Stmt::CXXStaticCastExprClass: 2689 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2690 RAngleLoc, LParenLoc, 2691 SubExpr, RParenLoc); 2692 2693 case Stmt::CXXDynamicCastExprClass: 2694 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2695 RAngleLoc, LParenLoc, 2696 SubExpr, RParenLoc); 2697 2698 case Stmt::CXXReinterpretCastExprClass: 2699 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2700 RAngleLoc, LParenLoc, 2701 SubExpr, 2702 RParenLoc); 2703 2704 case Stmt::CXXConstCastExprClass: 2705 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2706 RAngleLoc, LParenLoc, 2707 SubExpr, RParenLoc); 2708 2709 default: 2710 llvm_unreachable("Invalid C++ named cast"); 2711 } 2712 } 2713 2714 /// Build a new C++ static_cast expression. 2715 /// 2716 /// By default, performs semantic analysis to build the new expression. 2717 /// Subclasses may override this routine to provide different behavior. 2718 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2719 SourceLocation LAngleLoc, 2720 TypeSourceInfo *TInfo, 2721 SourceLocation RAngleLoc, 2722 SourceLocation LParenLoc, 2723 Expr *SubExpr, 2724 SourceLocation RParenLoc) { 2725 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2726 TInfo, SubExpr, 2727 SourceRange(LAngleLoc, RAngleLoc), 2728 SourceRange(LParenLoc, RParenLoc)); 2729 } 2730 2731 /// Build a new C++ dynamic_cast expression. 2732 /// 2733 /// By default, performs semantic analysis to build the new expression. 2734 /// Subclasses may override this routine to provide different behavior. 2735 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2736 SourceLocation LAngleLoc, 2737 TypeSourceInfo *TInfo, 2738 SourceLocation RAngleLoc, 2739 SourceLocation LParenLoc, 2740 Expr *SubExpr, 2741 SourceLocation RParenLoc) { 2742 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2743 TInfo, SubExpr, 2744 SourceRange(LAngleLoc, RAngleLoc), 2745 SourceRange(LParenLoc, RParenLoc)); 2746 } 2747 2748 /// Build a new C++ reinterpret_cast expression. 2749 /// 2750 /// By default, performs semantic analysis to build the new expression. 2751 /// Subclasses may override this routine to provide different behavior. 2752 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2753 SourceLocation LAngleLoc, 2754 TypeSourceInfo *TInfo, 2755 SourceLocation RAngleLoc, 2756 SourceLocation LParenLoc, 2757 Expr *SubExpr, 2758 SourceLocation RParenLoc) { 2759 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2760 TInfo, SubExpr, 2761 SourceRange(LAngleLoc, RAngleLoc), 2762 SourceRange(LParenLoc, RParenLoc)); 2763 } 2764 2765 /// Build a new C++ const_cast expression. 2766 /// 2767 /// By default, performs semantic analysis to build the new expression. 2768 /// Subclasses may override this routine to provide different behavior. 2769 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2770 SourceLocation LAngleLoc, 2771 TypeSourceInfo *TInfo, 2772 SourceLocation RAngleLoc, 2773 SourceLocation LParenLoc, 2774 Expr *SubExpr, 2775 SourceLocation RParenLoc) { 2776 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2777 TInfo, SubExpr, 2778 SourceRange(LAngleLoc, RAngleLoc), 2779 SourceRange(LParenLoc, RParenLoc)); 2780 } 2781 2782 /// Build a new C++ functional-style cast expression. 2783 /// 2784 /// By default, performs semantic analysis to build the new expression. 2785 /// Subclasses may override this routine to provide different behavior. 2786 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2787 SourceLocation LParenLoc, 2788 Expr *Sub, 2789 SourceLocation RParenLoc, 2790 bool ListInitialization) { 2791 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2792 MultiExprArg(&Sub, 1), RParenLoc, 2793 ListInitialization); 2794 } 2795 2796 /// Build a new C++ __builtin_bit_cast expression. 2797 /// 2798 /// By default, performs semantic analysis to build the new expression. 2799 /// Subclasses may override this routine to provide different behavior. 2800 ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc, 2801 TypeSourceInfo *TSI, Expr *Sub, 2802 SourceLocation RParenLoc) { 2803 return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc); 2804 } 2805 2806 /// Build a new C++ typeid(type) expression. 2807 /// 2808 /// By default, performs semantic analysis to build the new expression. 2809 /// Subclasses may override this routine to provide different behavior. 2810 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2811 SourceLocation TypeidLoc, 2812 TypeSourceInfo *Operand, 2813 SourceLocation RParenLoc) { 2814 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2815 RParenLoc); 2816 } 2817 2818 2819 /// Build a new C++ typeid(expr) expression. 2820 /// 2821 /// By default, performs semantic analysis to build the new expression. 2822 /// Subclasses may override this routine to provide different behavior. 2823 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2824 SourceLocation TypeidLoc, 2825 Expr *Operand, 2826 SourceLocation RParenLoc) { 2827 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2828 RParenLoc); 2829 } 2830 2831 /// Build a new C++ __uuidof(type) expression. 2832 /// 2833 /// By default, performs semantic analysis to build the new expression. 2834 /// Subclasses may override this routine to provide different behavior. 2835 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2836 SourceLocation TypeidLoc, 2837 TypeSourceInfo *Operand, 2838 SourceLocation RParenLoc) { 2839 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2840 RParenLoc); 2841 } 2842 2843 /// Build a new C++ __uuidof(expr) expression. 2844 /// 2845 /// By default, performs semantic analysis to build the new expression. 2846 /// Subclasses may override this routine to provide different behavior. 2847 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2848 SourceLocation TypeidLoc, 2849 Expr *Operand, 2850 SourceLocation RParenLoc) { 2851 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2852 RParenLoc); 2853 } 2854 2855 /// Build a new C++ "this" expression. 2856 /// 2857 /// By default, builds a new "this" expression without performing any 2858 /// semantic analysis. Subclasses may override this routine to provide 2859 /// different behavior. 2860 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2861 QualType ThisType, 2862 bool isImplicit) { 2863 return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit); 2864 } 2865 2866 /// Build a new C++ throw expression. 2867 /// 2868 /// By default, performs semantic analysis to build the new expression. 2869 /// Subclasses may override this routine to provide different behavior. 2870 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2871 bool IsThrownVariableInScope) { 2872 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2873 } 2874 2875 /// Build a new C++ default-argument expression. 2876 /// 2877 /// By default, builds a new default-argument expression, which does not 2878 /// require any semantic analysis. Subclasses may override this routine to 2879 /// provide different behavior. 2880 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) { 2881 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param, 2882 getSema().CurContext); 2883 } 2884 2885 /// Build a new C++11 default-initialization expression. 2886 /// 2887 /// By default, builds a new default field initialization expression, which 2888 /// does not require any semantic analysis. Subclasses may override this 2889 /// routine to provide different behavior. 2890 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2891 FieldDecl *Field) { 2892 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field, 2893 getSema().CurContext); 2894 } 2895 2896 /// Build a new C++ zero-initialization expression. 2897 /// 2898 /// By default, performs semantic analysis to build the new expression. 2899 /// Subclasses may override this routine to provide different behavior. 2900 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2901 SourceLocation LParenLoc, 2902 SourceLocation RParenLoc) { 2903 return getSema().BuildCXXTypeConstructExpr( 2904 TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false); 2905 } 2906 2907 /// Build a new C++ "new" expression. 2908 /// 2909 /// By default, performs semantic analysis to build the new expression. 2910 /// Subclasses may override this routine to provide different behavior. 2911 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2912 bool UseGlobal, 2913 SourceLocation PlacementLParen, 2914 MultiExprArg PlacementArgs, 2915 SourceLocation PlacementRParen, 2916 SourceRange TypeIdParens, 2917 QualType AllocatedType, 2918 TypeSourceInfo *AllocatedTypeInfo, 2919 Optional<Expr *> ArraySize, 2920 SourceRange DirectInitRange, 2921 Expr *Initializer) { 2922 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2923 PlacementLParen, 2924 PlacementArgs, 2925 PlacementRParen, 2926 TypeIdParens, 2927 AllocatedType, 2928 AllocatedTypeInfo, 2929 ArraySize, 2930 DirectInitRange, 2931 Initializer); 2932 } 2933 2934 /// Build a new C++ "delete" expression. 2935 /// 2936 /// By default, performs semantic analysis to build the new expression. 2937 /// Subclasses may override this routine to provide different behavior. 2938 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2939 bool IsGlobalDelete, 2940 bool IsArrayForm, 2941 Expr *Operand) { 2942 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2943 Operand); 2944 } 2945 2946 /// Build a new type trait expression. 2947 /// 2948 /// By default, performs semantic analysis to build the new expression. 2949 /// Subclasses may override this routine to provide different behavior. 2950 ExprResult RebuildTypeTrait(TypeTrait Trait, 2951 SourceLocation StartLoc, 2952 ArrayRef<TypeSourceInfo *> Args, 2953 SourceLocation RParenLoc) { 2954 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2955 } 2956 2957 /// Build a new array type trait expression. 2958 /// 2959 /// By default, performs semantic analysis to build the new expression. 2960 /// Subclasses may override this routine to provide different behavior. 2961 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2962 SourceLocation StartLoc, 2963 TypeSourceInfo *TSInfo, 2964 Expr *DimExpr, 2965 SourceLocation RParenLoc) { 2966 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2967 } 2968 2969 /// Build a new expression trait expression. 2970 /// 2971 /// By default, performs semantic analysis to build the new expression. 2972 /// Subclasses may override this routine to provide different behavior. 2973 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2974 SourceLocation StartLoc, 2975 Expr *Queried, 2976 SourceLocation RParenLoc) { 2977 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2978 } 2979 2980 /// Build a new (previously unresolved) declaration reference 2981 /// expression. 2982 /// 2983 /// By default, performs semantic analysis to build the new expression. 2984 /// Subclasses may override this routine to provide different behavior. 2985 ExprResult RebuildDependentScopeDeclRefExpr( 2986 NestedNameSpecifierLoc QualifierLoc, 2987 SourceLocation TemplateKWLoc, 2988 const DeclarationNameInfo &NameInfo, 2989 const TemplateArgumentListInfo *TemplateArgs, 2990 bool IsAddressOfOperand, 2991 TypeSourceInfo **RecoveryTSI) { 2992 CXXScopeSpec SS; 2993 SS.Adopt(QualifierLoc); 2994 2995 if (TemplateArgs || TemplateKWLoc.isValid()) 2996 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2997 TemplateArgs); 2998 2999 return getSema().BuildQualifiedDeclarationNameExpr( 3000 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 3001 } 3002 3003 /// Build a new template-id expression. 3004 /// 3005 /// By default, performs semantic analysis to build the new expression. 3006 /// Subclasses may override this routine to provide different behavior. 3007 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 3008 SourceLocation TemplateKWLoc, 3009 LookupResult &R, 3010 bool RequiresADL, 3011 const TemplateArgumentListInfo *TemplateArgs) { 3012 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 3013 TemplateArgs); 3014 } 3015 3016 /// Build a new object-construction expression. 3017 /// 3018 /// By default, performs semantic analysis to build the new expression. 3019 /// Subclasses may override this routine to provide different behavior. 3020 ExprResult RebuildCXXConstructExpr(QualType T, 3021 SourceLocation Loc, 3022 CXXConstructorDecl *Constructor, 3023 bool IsElidable, 3024 MultiExprArg Args, 3025 bool HadMultipleCandidates, 3026 bool ListInitialization, 3027 bool StdInitListInitialization, 3028 bool RequiresZeroInit, 3029 CXXConstructExpr::ConstructionKind ConstructKind, 3030 SourceRange ParenRange) { 3031 SmallVector<Expr*, 8> ConvertedArgs; 3032 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 3033 ConvertedArgs)) 3034 return ExprError(); 3035 3036 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 3037 IsElidable, 3038 ConvertedArgs, 3039 HadMultipleCandidates, 3040 ListInitialization, 3041 StdInitListInitialization, 3042 RequiresZeroInit, ConstructKind, 3043 ParenRange); 3044 } 3045 3046 /// Build a new implicit construction via inherited constructor 3047 /// expression. 3048 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 3049 CXXConstructorDecl *Constructor, 3050 bool ConstructsVBase, 3051 bool InheritedFromVBase) { 3052 return new (getSema().Context) CXXInheritedCtorInitExpr( 3053 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 3054 } 3055 3056 /// Build a new object-construction expression. 3057 /// 3058 /// By default, performs semantic analysis to build the new expression. 3059 /// Subclasses may override this routine to provide different behavior. 3060 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 3061 SourceLocation LParenOrBraceLoc, 3062 MultiExprArg Args, 3063 SourceLocation RParenOrBraceLoc, 3064 bool ListInitialization) { 3065 return getSema().BuildCXXTypeConstructExpr( 3066 TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization); 3067 } 3068 3069 /// Build a new object-construction expression. 3070 /// 3071 /// By default, performs semantic analysis to build the new expression. 3072 /// Subclasses may override this routine to provide different behavior. 3073 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 3074 SourceLocation LParenLoc, 3075 MultiExprArg Args, 3076 SourceLocation RParenLoc, 3077 bool ListInitialization) { 3078 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args, 3079 RParenLoc, ListInitialization); 3080 } 3081 3082 /// Build a new member reference expression. 3083 /// 3084 /// By default, performs semantic analysis to build the new expression. 3085 /// Subclasses may override this routine to provide different behavior. 3086 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 3087 QualType BaseType, 3088 bool IsArrow, 3089 SourceLocation OperatorLoc, 3090 NestedNameSpecifierLoc QualifierLoc, 3091 SourceLocation TemplateKWLoc, 3092 NamedDecl *FirstQualifierInScope, 3093 const DeclarationNameInfo &MemberNameInfo, 3094 const TemplateArgumentListInfo *TemplateArgs) { 3095 CXXScopeSpec SS; 3096 SS.Adopt(QualifierLoc); 3097 3098 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3099 OperatorLoc, IsArrow, 3100 SS, TemplateKWLoc, 3101 FirstQualifierInScope, 3102 MemberNameInfo, 3103 TemplateArgs, /*S*/nullptr); 3104 } 3105 3106 /// Build a new member reference expression. 3107 /// 3108 /// By default, performs semantic analysis to build the new expression. 3109 /// Subclasses may override this routine to provide different behavior. 3110 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 3111 SourceLocation OperatorLoc, 3112 bool IsArrow, 3113 NestedNameSpecifierLoc QualifierLoc, 3114 SourceLocation TemplateKWLoc, 3115 NamedDecl *FirstQualifierInScope, 3116 LookupResult &R, 3117 const TemplateArgumentListInfo *TemplateArgs) { 3118 CXXScopeSpec SS; 3119 SS.Adopt(QualifierLoc); 3120 3121 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 3122 OperatorLoc, IsArrow, 3123 SS, TemplateKWLoc, 3124 FirstQualifierInScope, 3125 R, TemplateArgs, /*S*/nullptr); 3126 } 3127 3128 /// Build a new noexcept expression. 3129 /// 3130 /// By default, performs semantic analysis to build the new expression. 3131 /// Subclasses may override this routine to provide different behavior. 3132 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 3133 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 3134 } 3135 3136 /// Build a new expression to compute the length of a parameter pack. 3137 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 3138 NamedDecl *Pack, 3139 SourceLocation PackLoc, 3140 SourceLocation RParenLoc, 3141 Optional<unsigned> Length, 3142 ArrayRef<TemplateArgument> PartialArgs) { 3143 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 3144 RParenLoc, Length, PartialArgs); 3145 } 3146 3147 /// Build a new expression representing a call to a source location 3148 /// builtin. 3149 /// 3150 /// By default, performs semantic analysis to build the new expression. 3151 /// Subclasses may override this routine to provide different behavior. 3152 ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind, 3153 SourceLocation BuiltinLoc, 3154 SourceLocation RPLoc, 3155 DeclContext *ParentContext) { 3156 return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext); 3157 } 3158 3159 /// Build a new Objective-C boxed expression. 3160 /// 3161 /// By default, performs semantic analysis to build the new expression. 3162 /// Subclasses may override this routine to provide different behavior. 3163 ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS, 3164 SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo, 3165 NamedDecl *FoundDecl, ConceptDecl *NamedConcept, 3166 TemplateArgumentListInfo *TALI) { 3167 CXXScopeSpec SS; 3168 SS.Adopt(NNS); 3169 ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc, 3170 ConceptNameInfo, 3171 FoundDecl, 3172 NamedConcept, TALI); 3173 if (Result.isInvalid()) 3174 return ExprError(); 3175 return Result; 3176 } 3177 3178 /// \brief Build a new requires expression. 3179 /// 3180 /// By default, performs semantic analysis to build the new expression. 3181 /// Subclasses may override this routine to provide different behavior. 3182 ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc, 3183 RequiresExprBodyDecl *Body, 3184 ArrayRef<ParmVarDecl *> LocalParameters, 3185 ArrayRef<concepts::Requirement *> Requirements, 3186 SourceLocation ClosingBraceLoc) { 3187 return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body, 3188 LocalParameters, Requirements, ClosingBraceLoc); 3189 } 3190 3191 concepts::TypeRequirement * 3192 RebuildTypeRequirement( 3193 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3194 return SemaRef.BuildTypeRequirement(SubstDiag); 3195 } 3196 3197 concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) { 3198 return SemaRef.BuildTypeRequirement(T); 3199 } 3200 3201 concepts::ExprRequirement * 3202 RebuildExprRequirement( 3203 concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple, 3204 SourceLocation NoexceptLoc, 3205 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3206 return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc, 3207 std::move(Ret)); 3208 } 3209 3210 concepts::ExprRequirement * 3211 RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc, 3212 concepts::ExprRequirement::ReturnTypeRequirement Ret) { 3213 return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc, 3214 std::move(Ret)); 3215 } 3216 3217 concepts::NestedRequirement * 3218 RebuildNestedRequirement( 3219 concepts::Requirement::SubstitutionDiagnostic *SubstDiag) { 3220 return SemaRef.BuildNestedRequirement(SubstDiag); 3221 } 3222 3223 concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) { 3224 return SemaRef.BuildNestedRequirement(Constraint); 3225 } 3226 3227 /// \brief Build a new Objective-C boxed expression. 3228 /// 3229 /// By default, performs semantic analysis to build the new expression. 3230 /// Subclasses may override this routine to provide different behavior. 3231 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 3232 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 3233 } 3234 3235 /// Build a new Objective-C array literal. 3236 /// 3237 /// By default, performs semantic analysis to build the new expression. 3238 /// Subclasses may override this routine to provide different behavior. 3239 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 3240 Expr **Elements, unsigned NumElements) { 3241 return getSema().BuildObjCArrayLiteral(Range, 3242 MultiExprArg(Elements, NumElements)); 3243 } 3244 3245 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 3246 Expr *Base, Expr *Key, 3247 ObjCMethodDecl *getterMethod, 3248 ObjCMethodDecl *setterMethod) { 3249 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 3250 getterMethod, setterMethod); 3251 } 3252 3253 /// Build a new Objective-C dictionary literal. 3254 /// 3255 /// By default, performs semantic analysis to build the new expression. 3256 /// Subclasses may override this routine to provide different behavior. 3257 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 3258 MutableArrayRef<ObjCDictionaryElement> Elements) { 3259 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 3260 } 3261 3262 /// Build a new Objective-C \@encode expression. 3263 /// 3264 /// By default, performs semantic analysis to build the new expression. 3265 /// Subclasses may override this routine to provide different behavior. 3266 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 3267 TypeSourceInfo *EncodeTypeInfo, 3268 SourceLocation RParenLoc) { 3269 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 3270 } 3271 3272 /// Build a new Objective-C class message. 3273 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 3274 Selector Sel, 3275 ArrayRef<SourceLocation> SelectorLocs, 3276 ObjCMethodDecl *Method, 3277 SourceLocation LBracLoc, 3278 MultiExprArg Args, 3279 SourceLocation RBracLoc) { 3280 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 3281 ReceiverTypeInfo->getType(), 3282 /*SuperLoc=*/SourceLocation(), 3283 Sel, Method, LBracLoc, SelectorLocs, 3284 RBracLoc, Args); 3285 } 3286 3287 /// Build a new Objective-C instance message. 3288 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 3289 Selector Sel, 3290 ArrayRef<SourceLocation> SelectorLocs, 3291 ObjCMethodDecl *Method, 3292 SourceLocation LBracLoc, 3293 MultiExprArg Args, 3294 SourceLocation RBracLoc) { 3295 return SemaRef.BuildInstanceMessage(Receiver, 3296 Receiver->getType(), 3297 /*SuperLoc=*/SourceLocation(), 3298 Sel, Method, LBracLoc, SelectorLocs, 3299 RBracLoc, Args); 3300 } 3301 3302 /// Build a new Objective-C instance/class message to 'super'. 3303 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 3304 Selector Sel, 3305 ArrayRef<SourceLocation> SelectorLocs, 3306 QualType SuperType, 3307 ObjCMethodDecl *Method, 3308 SourceLocation LBracLoc, 3309 MultiExprArg Args, 3310 SourceLocation RBracLoc) { 3311 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 3312 SuperType, 3313 SuperLoc, 3314 Sel, Method, LBracLoc, SelectorLocs, 3315 RBracLoc, Args) 3316 : SemaRef.BuildClassMessage(nullptr, 3317 SuperType, 3318 SuperLoc, 3319 Sel, Method, LBracLoc, SelectorLocs, 3320 RBracLoc, Args); 3321 3322 3323 } 3324 3325 /// Build a new Objective-C ivar reference expression. 3326 /// 3327 /// By default, performs semantic analysis to build the new expression. 3328 /// Subclasses may override this routine to provide different behavior. 3329 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3330 SourceLocation IvarLoc, 3331 bool IsArrow, bool IsFreeIvar) { 3332 CXXScopeSpec SS; 3333 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3334 ExprResult Result = getSema().BuildMemberReferenceExpr( 3335 BaseArg, BaseArg->getType(), 3336 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3337 /*FirstQualifierInScope=*/nullptr, NameInfo, 3338 /*TemplateArgs=*/nullptr, 3339 /*S=*/nullptr); 3340 if (IsFreeIvar && Result.isUsable()) 3341 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3342 return Result; 3343 } 3344 3345 /// Build a new Objective-C property reference expression. 3346 /// 3347 /// By default, performs semantic analysis to build the new expression. 3348 /// Subclasses may override this routine to provide different behavior. 3349 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3350 ObjCPropertyDecl *Property, 3351 SourceLocation PropertyLoc) { 3352 CXXScopeSpec SS; 3353 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3354 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3355 /*FIXME:*/PropertyLoc, 3356 /*IsArrow=*/false, 3357 SS, SourceLocation(), 3358 /*FirstQualifierInScope=*/nullptr, 3359 NameInfo, 3360 /*TemplateArgs=*/nullptr, 3361 /*S=*/nullptr); 3362 } 3363 3364 /// Build a new Objective-C property reference expression. 3365 /// 3366 /// By default, performs semantic analysis to build the new expression. 3367 /// Subclasses may override this routine to provide different behavior. 3368 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3369 ObjCMethodDecl *Getter, 3370 ObjCMethodDecl *Setter, 3371 SourceLocation PropertyLoc) { 3372 // Since these expressions can only be value-dependent, we do not 3373 // need to perform semantic analysis again. 3374 return Owned( 3375 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3376 VK_LValue, OK_ObjCProperty, 3377 PropertyLoc, Base)); 3378 } 3379 3380 /// Build a new Objective-C "isa" expression. 3381 /// 3382 /// By default, performs semantic analysis to build the new expression. 3383 /// Subclasses may override this routine to provide different behavior. 3384 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3385 SourceLocation OpLoc, bool IsArrow) { 3386 CXXScopeSpec SS; 3387 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3388 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3389 OpLoc, IsArrow, 3390 SS, SourceLocation(), 3391 /*FirstQualifierInScope=*/nullptr, 3392 NameInfo, 3393 /*TemplateArgs=*/nullptr, 3394 /*S=*/nullptr); 3395 } 3396 3397 /// Build a new shuffle vector expression. 3398 /// 3399 /// By default, performs semantic analysis to build the new expression. 3400 /// Subclasses may override this routine to provide different behavior. 3401 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3402 MultiExprArg SubExprs, 3403 SourceLocation RParenLoc) { 3404 // Find the declaration for __builtin_shufflevector 3405 const IdentifierInfo &Name 3406 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3407 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3408 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3409 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3410 3411 // Build a reference to the __builtin_shufflevector builtin 3412 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3413 Expr *Callee = new (SemaRef.Context) 3414 DeclRefExpr(SemaRef.Context, Builtin, false, 3415 SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc); 3416 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3417 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3418 CK_BuiltinFnToFnPtr).get(); 3419 3420 // Build the CallExpr 3421 ExprResult TheCall = CallExpr::Create( 3422 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3423 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3424 3425 // Type-check the __builtin_shufflevector expression. 3426 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3427 } 3428 3429 /// Build a new convert vector expression. 3430 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3431 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3432 SourceLocation RParenLoc) { 3433 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3434 BuiltinLoc, RParenLoc); 3435 } 3436 3437 /// Build a new template argument pack expansion. 3438 /// 3439 /// By default, performs semantic analysis to build a new pack expansion 3440 /// for a template argument. Subclasses may override this routine to provide 3441 /// different behavior. 3442 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3443 SourceLocation EllipsisLoc, 3444 Optional<unsigned> NumExpansions) { 3445 switch (Pattern.getArgument().getKind()) { 3446 case TemplateArgument::Expression: { 3447 ExprResult Result 3448 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3449 EllipsisLoc, NumExpansions); 3450 if (Result.isInvalid()) 3451 return TemplateArgumentLoc(); 3452 3453 return TemplateArgumentLoc(Result.get(), Result.get()); 3454 } 3455 3456 case TemplateArgument::Template: 3457 return TemplateArgumentLoc(TemplateArgument( 3458 Pattern.getArgument().getAsTemplate(), 3459 NumExpansions), 3460 Pattern.getTemplateQualifierLoc(), 3461 Pattern.getTemplateNameLoc(), 3462 EllipsisLoc); 3463 3464 case TemplateArgument::Null: 3465 case TemplateArgument::Integral: 3466 case TemplateArgument::Declaration: 3467 case TemplateArgument::Pack: 3468 case TemplateArgument::TemplateExpansion: 3469 case TemplateArgument::NullPtr: 3470 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3471 3472 case TemplateArgument::Type: 3473 if (TypeSourceInfo *Expansion 3474 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3475 EllipsisLoc, 3476 NumExpansions)) 3477 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3478 Expansion); 3479 break; 3480 } 3481 3482 return TemplateArgumentLoc(); 3483 } 3484 3485 /// Build a new expression pack expansion. 3486 /// 3487 /// By default, performs semantic analysis to build a new pack expansion 3488 /// for an expression. Subclasses may override this routine to provide 3489 /// different behavior. 3490 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3491 Optional<unsigned> NumExpansions) { 3492 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3493 } 3494 3495 /// Build a new C++1z fold-expression. 3496 /// 3497 /// By default, performs semantic analysis in order to build a new fold 3498 /// expression. 3499 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3500 BinaryOperatorKind Operator, 3501 SourceLocation EllipsisLoc, Expr *RHS, 3502 SourceLocation RParenLoc, 3503 Optional<unsigned> NumExpansions) { 3504 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3505 RHS, RParenLoc, NumExpansions); 3506 } 3507 3508 /// Build an empty C++1z fold-expression with the given operator. 3509 /// 3510 /// By default, produces the fallback value for the fold-expression, or 3511 /// produce an error if there is no fallback value. 3512 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3513 BinaryOperatorKind Operator) { 3514 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3515 } 3516 3517 /// Build a new atomic operation expression. 3518 /// 3519 /// By default, performs semantic analysis to build the new expression. 3520 /// Subclasses may override this routine to provide different behavior. 3521 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs, 3522 AtomicExpr::AtomicOp Op, 3523 SourceLocation RParenLoc) { 3524 // Use this for all of the locations, since we don't know the difference 3525 // between the call and the expr at this point. 3526 SourceRange Range{BuiltinLoc, RParenLoc}; 3527 return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op, 3528 Sema::AtomicArgumentOrder::AST); 3529 } 3530 3531 ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc, 3532 ArrayRef<Expr *> SubExprs) { 3533 return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs); 3534 } 3535 3536 private: 3537 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3538 QualType ObjectType, 3539 NamedDecl *FirstQualifierInScope, 3540 CXXScopeSpec &SS); 3541 3542 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3543 QualType ObjectType, 3544 NamedDecl *FirstQualifierInScope, 3545 CXXScopeSpec &SS); 3546 3547 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3548 NamedDecl *FirstQualifierInScope, 3549 CXXScopeSpec &SS); 3550 3551 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3552 DependentNameTypeLoc TL, 3553 bool DeducibleTSTContext); 3554 }; 3555 3556 template <typename Derived> 3557 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) { 3558 if (!S) 3559 return S; 3560 3561 switch (S->getStmtClass()) { 3562 case Stmt::NoStmtClass: break; 3563 3564 // Transform individual statement nodes 3565 // Pass SDK into statements that can produce a value 3566 #define STMT(Node, Parent) \ 3567 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3568 #define VALUESTMT(Node, Parent) \ 3569 case Stmt::Node##Class: \ 3570 return getDerived().Transform##Node(cast<Node>(S), SDK); 3571 #define ABSTRACT_STMT(Node) 3572 #define EXPR(Node, Parent) 3573 #include "clang/AST/StmtNodes.inc" 3574 3575 // Transform expressions by calling TransformExpr. 3576 #define STMT(Node, Parent) 3577 #define ABSTRACT_STMT(Stmt) 3578 #define EXPR(Node, Parent) case Stmt::Node##Class: 3579 #include "clang/AST/StmtNodes.inc" 3580 { 3581 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3582 3583 if (SDK == SDK_StmtExprResult) 3584 E = getSema().ActOnStmtExprResult(E); 3585 return getSema().ActOnExprStmt(E, SDK == SDK_Discarded); 3586 } 3587 } 3588 3589 return S; 3590 } 3591 3592 template<typename Derived> 3593 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3594 if (!S) 3595 return S; 3596 3597 switch (S->getClauseKind()) { 3598 default: break; 3599 // Transform individual clause nodes 3600 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \ 3601 case Enum: \ 3602 return getDerived().Transform ## Class(cast<Class>(S)); 3603 #include "llvm/Frontend/OpenMP/OMPKinds.def" 3604 } 3605 3606 return S; 3607 } 3608 3609 3610 template<typename Derived> 3611 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3612 if (!E) 3613 return E; 3614 3615 switch (E->getStmtClass()) { 3616 case Stmt::NoStmtClass: break; 3617 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3618 #define ABSTRACT_STMT(Stmt) 3619 #define EXPR(Node, Parent) \ 3620 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3621 #include "clang/AST/StmtNodes.inc" 3622 } 3623 3624 return E; 3625 } 3626 3627 template<typename Derived> 3628 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3629 bool NotCopyInit) { 3630 // Initializers are instantiated like expressions, except that various outer 3631 // layers are stripped. 3632 if (!Init) 3633 return Init; 3634 3635 if (auto *FE = dyn_cast<FullExpr>(Init)) 3636 Init = FE->getSubExpr(); 3637 3638 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3639 Init = AIL->getCommonExpr(); 3640 3641 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3642 Init = MTE->getSubExpr(); 3643 3644 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3645 Init = Binder->getSubExpr(); 3646 3647 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3648 Init = ICE->getSubExprAsWritten(); 3649 3650 if (CXXStdInitializerListExpr *ILE = 3651 dyn_cast<CXXStdInitializerListExpr>(Init)) 3652 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3653 3654 // If this is copy-initialization, we only need to reconstruct 3655 // InitListExprs. Other forms of copy-initialization will be a no-op if 3656 // the initializer is already the right type. 3657 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3658 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3659 return getDerived().TransformExpr(Init); 3660 3661 // Revert value-initialization back to empty parens. 3662 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3663 SourceRange Parens = VIE->getSourceRange(); 3664 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3665 Parens.getEnd()); 3666 } 3667 3668 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3669 if (isa<ImplicitValueInitExpr>(Init)) 3670 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3671 SourceLocation()); 3672 3673 // Revert initialization by constructor back to a parenthesized or braced list 3674 // of expressions. Any other form of initializer can just be reused directly. 3675 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3676 return getDerived().TransformExpr(Init); 3677 3678 // If the initialization implicitly converted an initializer list to a 3679 // std::initializer_list object, unwrap the std::initializer_list too. 3680 if (Construct && Construct->isStdInitListInitialization()) 3681 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3682 3683 // Enter a list-init context if this was list initialization. 3684 EnterExpressionEvaluationContext Context( 3685 getSema(), EnterExpressionEvaluationContext::InitList, 3686 Construct->isListInitialization()); 3687 3688 SmallVector<Expr*, 8> NewArgs; 3689 bool ArgChanged = false; 3690 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3691 /*IsCall*/true, NewArgs, &ArgChanged)) 3692 return ExprError(); 3693 3694 // If this was list initialization, revert to syntactic list form. 3695 if (Construct->isListInitialization()) 3696 return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs, 3697 Construct->getEndLoc()); 3698 3699 // Build a ParenListExpr to represent anything else. 3700 SourceRange Parens = Construct->getParenOrBraceRange(); 3701 if (Parens.isInvalid()) { 3702 // This was a variable declaration's initialization for which no initializer 3703 // was specified. 3704 assert(NewArgs.empty() && 3705 "no parens or braces but have direct init with arguments?"); 3706 return ExprEmpty(); 3707 } 3708 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3709 Parens.getEnd()); 3710 } 3711 3712 template<typename Derived> 3713 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3714 unsigned NumInputs, 3715 bool IsCall, 3716 SmallVectorImpl<Expr *> &Outputs, 3717 bool *ArgChanged) { 3718 for (unsigned I = 0; I != NumInputs; ++I) { 3719 // If requested, drop call arguments that need to be dropped. 3720 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3721 if (ArgChanged) 3722 *ArgChanged = true; 3723 3724 break; 3725 } 3726 3727 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3728 Expr *Pattern = Expansion->getPattern(); 3729 3730 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3731 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3732 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3733 3734 // Determine whether the set of unexpanded parameter packs can and should 3735 // be expanded. 3736 bool Expand = true; 3737 bool RetainExpansion = false; 3738 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3739 Optional<unsigned> NumExpansions = OrigNumExpansions; 3740 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3741 Pattern->getSourceRange(), 3742 Unexpanded, 3743 Expand, RetainExpansion, 3744 NumExpansions)) 3745 return true; 3746 3747 if (!Expand) { 3748 // The transform has determined that we should perform a simple 3749 // transformation on the pack expansion, producing another pack 3750 // expansion. 3751 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3752 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3753 if (OutPattern.isInvalid()) 3754 return true; 3755 3756 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3757 Expansion->getEllipsisLoc(), 3758 NumExpansions); 3759 if (Out.isInvalid()) 3760 return true; 3761 3762 if (ArgChanged) 3763 *ArgChanged = true; 3764 Outputs.push_back(Out.get()); 3765 continue; 3766 } 3767 3768 // Record right away that the argument was changed. This needs 3769 // to happen even if the array expands to nothing. 3770 if (ArgChanged) *ArgChanged = true; 3771 3772 // The transform has determined that we should perform an elementwise 3773 // expansion of the pattern. Do so. 3774 for (unsigned I = 0; I != *NumExpansions; ++I) { 3775 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3776 ExprResult Out = getDerived().TransformExpr(Pattern); 3777 if (Out.isInvalid()) 3778 return true; 3779 3780 if (Out.get()->containsUnexpandedParameterPack()) { 3781 Out = getDerived().RebuildPackExpansion( 3782 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3783 if (Out.isInvalid()) 3784 return true; 3785 } 3786 3787 Outputs.push_back(Out.get()); 3788 } 3789 3790 // If we're supposed to retain a pack expansion, do so by temporarily 3791 // forgetting the partially-substituted parameter pack. 3792 if (RetainExpansion) { 3793 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3794 3795 ExprResult Out = getDerived().TransformExpr(Pattern); 3796 if (Out.isInvalid()) 3797 return true; 3798 3799 Out = getDerived().RebuildPackExpansion( 3800 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3801 if (Out.isInvalid()) 3802 return true; 3803 3804 Outputs.push_back(Out.get()); 3805 } 3806 3807 continue; 3808 } 3809 3810 ExprResult Result = 3811 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3812 : getDerived().TransformExpr(Inputs[I]); 3813 if (Result.isInvalid()) 3814 return true; 3815 3816 if (Result.get() != Inputs[I] && ArgChanged) 3817 *ArgChanged = true; 3818 3819 Outputs.push_back(Result.get()); 3820 } 3821 3822 return false; 3823 } 3824 3825 template <typename Derived> 3826 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3827 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3828 if (Var) { 3829 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3830 getDerived().TransformDefinition(Var->getLocation(), Var)); 3831 3832 if (!ConditionVar) 3833 return Sema::ConditionError(); 3834 3835 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3836 } 3837 3838 if (Expr) { 3839 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3840 3841 if (CondExpr.isInvalid()) 3842 return Sema::ConditionError(); 3843 3844 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3845 } 3846 3847 return Sema::ConditionResult(); 3848 } 3849 3850 template<typename Derived> 3851 NestedNameSpecifierLoc 3852 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3853 NestedNameSpecifierLoc NNS, 3854 QualType ObjectType, 3855 NamedDecl *FirstQualifierInScope) { 3856 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3857 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3858 Qualifier = Qualifier.getPrefix()) 3859 Qualifiers.push_back(Qualifier); 3860 3861 CXXScopeSpec SS; 3862 while (!Qualifiers.empty()) { 3863 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3864 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3865 3866 switch (QNNS->getKind()) { 3867 case NestedNameSpecifier::Identifier: { 3868 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3869 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3870 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3871 SS, FirstQualifierInScope, false)) 3872 return NestedNameSpecifierLoc(); 3873 } 3874 break; 3875 3876 case NestedNameSpecifier::Namespace: { 3877 NamespaceDecl *NS 3878 = cast_or_null<NamespaceDecl>( 3879 getDerived().TransformDecl( 3880 Q.getLocalBeginLoc(), 3881 QNNS->getAsNamespace())); 3882 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3883 break; 3884 } 3885 3886 case NestedNameSpecifier::NamespaceAlias: { 3887 NamespaceAliasDecl *Alias 3888 = cast_or_null<NamespaceAliasDecl>( 3889 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3890 QNNS->getAsNamespaceAlias())); 3891 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3892 Q.getLocalEndLoc()); 3893 break; 3894 } 3895 3896 case NestedNameSpecifier::Global: 3897 // There is no meaningful transformation that one could perform on the 3898 // global scope. 3899 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3900 break; 3901 3902 case NestedNameSpecifier::Super: { 3903 CXXRecordDecl *RD = 3904 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3905 SourceLocation(), QNNS->getAsRecordDecl())); 3906 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3907 break; 3908 } 3909 3910 case NestedNameSpecifier::TypeSpecWithTemplate: 3911 case NestedNameSpecifier::TypeSpec: { 3912 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3913 FirstQualifierInScope, SS); 3914 3915 if (!TL) 3916 return NestedNameSpecifierLoc(); 3917 3918 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3919 (SemaRef.getLangOpts().CPlusPlus11 && 3920 TL.getType()->isEnumeralType())) { 3921 assert(!TL.getType().hasLocalQualifiers() && 3922 "Can't get cv-qualifiers here"); 3923 if (TL.getType()->isEnumeralType()) 3924 SemaRef.Diag(TL.getBeginLoc(), 3925 diag::warn_cxx98_compat_enum_nested_name_spec); 3926 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3927 Q.getLocalEndLoc()); 3928 break; 3929 } 3930 // If the nested-name-specifier is an invalid type def, don't emit an 3931 // error because a previous error should have already been emitted. 3932 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3933 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3934 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3935 << TL.getType() << SS.getRange(); 3936 } 3937 return NestedNameSpecifierLoc(); 3938 } 3939 } 3940 3941 // The qualifier-in-scope and object type only apply to the leftmost entity. 3942 FirstQualifierInScope = nullptr; 3943 ObjectType = QualType(); 3944 } 3945 3946 // Don't rebuild the nested-name-specifier if we don't have to. 3947 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3948 !getDerived().AlwaysRebuild()) 3949 return NNS; 3950 3951 // If we can re-use the source-location data from the original 3952 // nested-name-specifier, do so. 3953 if (SS.location_size() == NNS.getDataLength() && 3954 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3955 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3956 3957 // Allocate new nested-name-specifier location information. 3958 return SS.getWithLocInContext(SemaRef.Context); 3959 } 3960 3961 template<typename Derived> 3962 DeclarationNameInfo 3963 TreeTransform<Derived> 3964 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3965 DeclarationName Name = NameInfo.getName(); 3966 if (!Name) 3967 return DeclarationNameInfo(); 3968 3969 switch (Name.getNameKind()) { 3970 case DeclarationName::Identifier: 3971 case DeclarationName::ObjCZeroArgSelector: 3972 case DeclarationName::ObjCOneArgSelector: 3973 case DeclarationName::ObjCMultiArgSelector: 3974 case DeclarationName::CXXOperatorName: 3975 case DeclarationName::CXXLiteralOperatorName: 3976 case DeclarationName::CXXUsingDirective: 3977 return NameInfo; 3978 3979 case DeclarationName::CXXDeductionGuideName: { 3980 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3981 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3982 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3983 if (!NewTemplate) 3984 return DeclarationNameInfo(); 3985 3986 DeclarationNameInfo NewNameInfo(NameInfo); 3987 NewNameInfo.setName( 3988 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3989 return NewNameInfo; 3990 } 3991 3992 case DeclarationName::CXXConstructorName: 3993 case DeclarationName::CXXDestructorName: 3994 case DeclarationName::CXXConversionFunctionName: { 3995 TypeSourceInfo *NewTInfo; 3996 CanQualType NewCanTy; 3997 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3998 NewTInfo = getDerived().TransformType(OldTInfo); 3999 if (!NewTInfo) 4000 return DeclarationNameInfo(); 4001 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 4002 } 4003 else { 4004 NewTInfo = nullptr; 4005 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 4006 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 4007 if (NewT.isNull()) 4008 return DeclarationNameInfo(); 4009 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 4010 } 4011 4012 DeclarationName NewName 4013 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 4014 NewCanTy); 4015 DeclarationNameInfo NewNameInfo(NameInfo); 4016 NewNameInfo.setName(NewName); 4017 NewNameInfo.setNamedTypeInfo(NewTInfo); 4018 return NewNameInfo; 4019 } 4020 } 4021 4022 llvm_unreachable("Unknown name kind."); 4023 } 4024 4025 template<typename Derived> 4026 TemplateName 4027 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 4028 TemplateName Name, 4029 SourceLocation NameLoc, 4030 QualType ObjectType, 4031 NamedDecl *FirstQualifierInScope, 4032 bool AllowInjectedClassName) { 4033 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 4034 TemplateDecl *Template = QTN->getTemplateDecl(); 4035 assert(Template && "qualified template name must refer to a template"); 4036 4037 TemplateDecl *TransTemplate 4038 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4039 Template)); 4040 if (!TransTemplate) 4041 return TemplateName(); 4042 4043 if (!getDerived().AlwaysRebuild() && 4044 SS.getScopeRep() == QTN->getQualifier() && 4045 TransTemplate == Template) 4046 return Name; 4047 4048 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 4049 TransTemplate); 4050 } 4051 4052 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 4053 if (SS.getScopeRep()) { 4054 // These apply to the scope specifier, not the template. 4055 ObjectType = QualType(); 4056 FirstQualifierInScope = nullptr; 4057 } 4058 4059 if (!getDerived().AlwaysRebuild() && 4060 SS.getScopeRep() == DTN->getQualifier() && 4061 ObjectType.isNull()) 4062 return Name; 4063 4064 // FIXME: Preserve the location of the "template" keyword. 4065 SourceLocation TemplateKWLoc = NameLoc; 4066 4067 if (DTN->isIdentifier()) { 4068 return getDerived().RebuildTemplateName(SS, 4069 TemplateKWLoc, 4070 *DTN->getIdentifier(), 4071 NameLoc, 4072 ObjectType, 4073 FirstQualifierInScope, 4074 AllowInjectedClassName); 4075 } 4076 4077 return getDerived().RebuildTemplateName(SS, TemplateKWLoc, 4078 DTN->getOperator(), NameLoc, 4079 ObjectType, AllowInjectedClassName); 4080 } 4081 4082 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 4083 TemplateDecl *TransTemplate 4084 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 4085 Template)); 4086 if (!TransTemplate) 4087 return TemplateName(); 4088 4089 if (!getDerived().AlwaysRebuild() && 4090 TransTemplate == Template) 4091 return Name; 4092 4093 return TemplateName(TransTemplate); 4094 } 4095 4096 if (SubstTemplateTemplateParmPackStorage *SubstPack 4097 = Name.getAsSubstTemplateTemplateParmPack()) { 4098 TemplateTemplateParmDecl *TransParam 4099 = cast_or_null<TemplateTemplateParmDecl>( 4100 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 4101 if (!TransParam) 4102 return TemplateName(); 4103 4104 if (!getDerived().AlwaysRebuild() && 4105 TransParam == SubstPack->getParameterPack()) 4106 return Name; 4107 4108 return getDerived().RebuildTemplateName(TransParam, 4109 SubstPack->getArgumentPack()); 4110 } 4111 4112 // These should be getting filtered out before they reach the AST. 4113 llvm_unreachable("overloaded function decl survived to here"); 4114 } 4115 4116 template<typename Derived> 4117 void TreeTransform<Derived>::InventTemplateArgumentLoc( 4118 const TemplateArgument &Arg, 4119 TemplateArgumentLoc &Output) { 4120 Output = getSema().getTrivialTemplateArgumentLoc( 4121 Arg, QualType(), getDerived().getBaseLocation()); 4122 } 4123 4124 template<typename Derived> 4125 bool TreeTransform<Derived>::TransformTemplateArgument( 4126 const TemplateArgumentLoc &Input, 4127 TemplateArgumentLoc &Output, bool Uneval) { 4128 const TemplateArgument &Arg = Input.getArgument(); 4129 switch (Arg.getKind()) { 4130 case TemplateArgument::Null: 4131 case TemplateArgument::Pack: 4132 llvm_unreachable("Unexpected TemplateArgument"); 4133 4134 case TemplateArgument::Integral: 4135 case TemplateArgument::NullPtr: 4136 case TemplateArgument::Declaration: { 4137 // Transform a resolved template argument straight to a resolved template 4138 // argument. We get here when substituting into an already-substituted 4139 // template type argument during concept satisfaction checking. 4140 QualType T = Arg.getNonTypeTemplateArgumentType(); 4141 QualType NewT = getDerived().TransformType(T); 4142 if (NewT.isNull()) 4143 return true; 4144 4145 ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration 4146 ? Arg.getAsDecl() 4147 : nullptr; 4148 ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl( 4149 getDerived().getBaseLocation(), D)) 4150 : nullptr; 4151 if (D && !NewD) 4152 return true; 4153 4154 if (NewT == T && D == NewD) 4155 Output = Input; 4156 else if (Arg.getKind() == TemplateArgument::Integral) 4157 Output = TemplateArgumentLoc( 4158 TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT), 4159 TemplateArgumentLocInfo()); 4160 else if (Arg.getKind() == TemplateArgument::NullPtr) 4161 Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true), 4162 TemplateArgumentLocInfo()); 4163 else 4164 Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT), 4165 TemplateArgumentLocInfo()); 4166 4167 return false; 4168 } 4169 4170 case TemplateArgument::Type: { 4171 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 4172 if (!DI) 4173 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 4174 4175 DI = getDerived().TransformType(DI); 4176 if (!DI) return true; 4177 4178 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 4179 return false; 4180 } 4181 4182 case TemplateArgument::Template: { 4183 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 4184 if (QualifierLoc) { 4185 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 4186 if (!QualifierLoc) 4187 return true; 4188 } 4189 4190 CXXScopeSpec SS; 4191 SS.Adopt(QualifierLoc); 4192 TemplateName Template 4193 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 4194 Input.getTemplateNameLoc()); 4195 if (Template.isNull()) 4196 return true; 4197 4198 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 4199 Input.getTemplateNameLoc()); 4200 return false; 4201 } 4202 4203 case TemplateArgument::TemplateExpansion: 4204 llvm_unreachable("Caller should expand pack expansions"); 4205 4206 case TemplateArgument::Expression: { 4207 // Template argument expressions are constant expressions. 4208 EnterExpressionEvaluationContext Unevaluated( 4209 getSema(), 4210 Uneval ? Sema::ExpressionEvaluationContext::Unevaluated 4211 : Sema::ExpressionEvaluationContext::ConstantEvaluated, 4212 /*LambdaContextDecl=*/nullptr, /*ExprContext=*/ 4213 Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument); 4214 4215 Expr *InputExpr = Input.getSourceExpression(); 4216 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 4217 4218 ExprResult E = getDerived().TransformExpr(InputExpr); 4219 E = SemaRef.ActOnConstantExpression(E); 4220 if (E.isInvalid()) return true; 4221 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 4222 return false; 4223 } 4224 } 4225 4226 // Work around bogus GCC warning 4227 return true; 4228 } 4229 4230 /// Iterator adaptor that invents template argument location information 4231 /// for each of the template arguments in its underlying iterator. 4232 template<typename Derived, typename InputIterator> 4233 class TemplateArgumentLocInventIterator { 4234 TreeTransform<Derived> &Self; 4235 InputIterator Iter; 4236 4237 public: 4238 typedef TemplateArgumentLoc value_type; 4239 typedef TemplateArgumentLoc reference; 4240 typedef typename std::iterator_traits<InputIterator>::difference_type 4241 difference_type; 4242 typedef std::input_iterator_tag iterator_category; 4243 4244 class pointer { 4245 TemplateArgumentLoc Arg; 4246 4247 public: 4248 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4249 4250 const TemplateArgumentLoc *operator->() const { return &Arg; } 4251 }; 4252 4253 TemplateArgumentLocInventIterator() { } 4254 4255 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 4256 InputIterator Iter) 4257 : Self(Self), Iter(Iter) { } 4258 4259 TemplateArgumentLocInventIterator &operator++() { 4260 ++Iter; 4261 return *this; 4262 } 4263 4264 TemplateArgumentLocInventIterator operator++(int) { 4265 TemplateArgumentLocInventIterator Old(*this); 4266 ++(*this); 4267 return Old; 4268 } 4269 4270 reference operator*() const { 4271 TemplateArgumentLoc Result; 4272 Self.InventTemplateArgumentLoc(*Iter, Result); 4273 return Result; 4274 } 4275 4276 pointer operator->() const { return pointer(**this); } 4277 4278 friend bool operator==(const TemplateArgumentLocInventIterator &X, 4279 const TemplateArgumentLocInventIterator &Y) { 4280 return X.Iter == Y.Iter; 4281 } 4282 4283 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 4284 const TemplateArgumentLocInventIterator &Y) { 4285 return X.Iter != Y.Iter; 4286 } 4287 }; 4288 4289 template<typename Derived> 4290 template<typename InputIterator> 4291 bool TreeTransform<Derived>::TransformTemplateArguments( 4292 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 4293 bool Uneval) { 4294 for (; First != Last; ++First) { 4295 TemplateArgumentLoc Out; 4296 TemplateArgumentLoc In = *First; 4297 4298 if (In.getArgument().getKind() == TemplateArgument::Pack) { 4299 // Unpack argument packs, which we translate them into separate 4300 // arguments. 4301 // FIXME: We could do much better if we could guarantee that the 4302 // TemplateArgumentLocInfo for the pack expansion would be usable for 4303 // all of the template arguments in the argument pack. 4304 typedef TemplateArgumentLocInventIterator<Derived, 4305 TemplateArgument::pack_iterator> 4306 PackLocIterator; 4307 if (TransformTemplateArguments(PackLocIterator(*this, 4308 In.getArgument().pack_begin()), 4309 PackLocIterator(*this, 4310 In.getArgument().pack_end()), 4311 Outputs, Uneval)) 4312 return true; 4313 4314 continue; 4315 } 4316 4317 if (In.getArgument().isPackExpansion()) { 4318 // We have a pack expansion, for which we will be substituting into 4319 // the pattern. 4320 SourceLocation Ellipsis; 4321 Optional<unsigned> OrigNumExpansions; 4322 TemplateArgumentLoc Pattern 4323 = getSema().getTemplateArgumentPackExpansionPattern( 4324 In, Ellipsis, OrigNumExpansions); 4325 4326 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4327 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4328 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 4329 4330 // Determine whether the set of unexpanded parameter packs can and should 4331 // be expanded. 4332 bool Expand = true; 4333 bool RetainExpansion = false; 4334 Optional<unsigned> NumExpansions = OrigNumExpansions; 4335 if (getDerived().TryExpandParameterPacks(Ellipsis, 4336 Pattern.getSourceRange(), 4337 Unexpanded, 4338 Expand, 4339 RetainExpansion, 4340 NumExpansions)) 4341 return true; 4342 4343 if (!Expand) { 4344 // The transform has determined that we should perform a simple 4345 // transformation on the pack expansion, producing another pack 4346 // expansion. 4347 TemplateArgumentLoc OutPattern; 4348 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4349 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4350 return true; 4351 4352 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4353 NumExpansions); 4354 if (Out.getArgument().isNull()) 4355 return true; 4356 4357 Outputs.addArgument(Out); 4358 continue; 4359 } 4360 4361 // The transform has determined that we should perform an elementwise 4362 // expansion of the pattern. Do so. 4363 for (unsigned I = 0; I != *NumExpansions; ++I) { 4364 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4365 4366 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4367 return true; 4368 4369 if (Out.getArgument().containsUnexpandedParameterPack()) { 4370 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4371 OrigNumExpansions); 4372 if (Out.getArgument().isNull()) 4373 return true; 4374 } 4375 4376 Outputs.addArgument(Out); 4377 } 4378 4379 // If we're supposed to retain a pack expansion, do so by temporarily 4380 // forgetting the partially-substituted parameter pack. 4381 if (RetainExpansion) { 4382 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4383 4384 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4385 return true; 4386 4387 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4388 OrigNumExpansions); 4389 if (Out.getArgument().isNull()) 4390 return true; 4391 4392 Outputs.addArgument(Out); 4393 } 4394 4395 continue; 4396 } 4397 4398 // The simple case: 4399 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4400 return true; 4401 4402 Outputs.addArgument(Out); 4403 } 4404 4405 return false; 4406 4407 } 4408 4409 //===----------------------------------------------------------------------===// 4410 // Type transformation 4411 //===----------------------------------------------------------------------===// 4412 4413 template<typename Derived> 4414 QualType TreeTransform<Derived>::TransformType(QualType T) { 4415 if (getDerived().AlreadyTransformed(T)) 4416 return T; 4417 4418 // Temporary workaround. All of these transformations should 4419 // eventually turn into transformations on TypeLocs. 4420 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4421 getDerived().getBaseLocation()); 4422 4423 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4424 4425 if (!NewDI) 4426 return QualType(); 4427 4428 return NewDI->getType(); 4429 } 4430 4431 template<typename Derived> 4432 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4433 // Refine the base location to the type's location. 4434 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4435 getDerived().getBaseEntity()); 4436 if (getDerived().AlreadyTransformed(DI->getType())) 4437 return DI; 4438 4439 TypeLocBuilder TLB; 4440 4441 TypeLoc TL = DI->getTypeLoc(); 4442 TLB.reserve(TL.getFullDataSize()); 4443 4444 QualType Result = getDerived().TransformType(TLB, TL); 4445 if (Result.isNull()) 4446 return nullptr; 4447 4448 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4449 } 4450 4451 template<typename Derived> 4452 QualType 4453 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4454 switch (T.getTypeLocClass()) { 4455 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4456 #define TYPELOC(CLASS, PARENT) \ 4457 case TypeLoc::CLASS: \ 4458 return getDerived().Transform##CLASS##Type(TLB, \ 4459 T.castAs<CLASS##TypeLoc>()); 4460 #include "clang/AST/TypeLocNodes.def" 4461 } 4462 4463 llvm_unreachable("unhandled type loc!"); 4464 } 4465 4466 template<typename Derived> 4467 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4468 if (!isa<DependentNameType>(T)) 4469 return TransformType(T); 4470 4471 if (getDerived().AlreadyTransformed(T)) 4472 return T; 4473 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4474 getDerived().getBaseLocation()); 4475 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4476 return NewDI ? NewDI->getType() : QualType(); 4477 } 4478 4479 template<typename Derived> 4480 TypeSourceInfo * 4481 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4482 if (!isa<DependentNameType>(DI->getType())) 4483 return TransformType(DI); 4484 4485 // Refine the base location to the type's location. 4486 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4487 getDerived().getBaseEntity()); 4488 if (getDerived().AlreadyTransformed(DI->getType())) 4489 return DI; 4490 4491 TypeLocBuilder TLB; 4492 4493 TypeLoc TL = DI->getTypeLoc(); 4494 TLB.reserve(TL.getFullDataSize()); 4495 4496 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4497 if (QTL) 4498 TL = QTL.getUnqualifiedLoc(); 4499 4500 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4501 4502 QualType Result = getDerived().TransformDependentNameType( 4503 TLB, DNTL, /*DeducedTSTContext*/true); 4504 if (Result.isNull()) 4505 return nullptr; 4506 4507 if (QTL) { 4508 Result = getDerived().RebuildQualifiedType(Result, QTL); 4509 if (Result.isNull()) 4510 return nullptr; 4511 TLB.TypeWasModifiedSafely(Result); 4512 } 4513 4514 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4515 } 4516 4517 template<typename Derived> 4518 QualType 4519 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4520 QualifiedTypeLoc T) { 4521 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4522 if (Result.isNull()) 4523 return QualType(); 4524 4525 Result = getDerived().RebuildQualifiedType(Result, T); 4526 4527 if (Result.isNull()) 4528 return QualType(); 4529 4530 // RebuildQualifiedType might have updated the type, but not in a way 4531 // that invalidates the TypeLoc. (There's no location information for 4532 // qualifiers.) 4533 TLB.TypeWasModifiedSafely(Result); 4534 4535 return Result; 4536 } 4537 4538 template <typename Derived> 4539 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4540 QualifiedTypeLoc TL) { 4541 4542 SourceLocation Loc = TL.getBeginLoc(); 4543 Qualifiers Quals = TL.getType().getLocalQualifiers(); 4544 4545 if (((T.getAddressSpace() != LangAS::Default && 4546 Quals.getAddressSpace() != LangAS::Default)) && 4547 T.getAddressSpace() != Quals.getAddressSpace()) { 4548 SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst) 4549 << TL.getType() << T; 4550 return QualType(); 4551 } 4552 4553 // C++ [dcl.fct]p7: 4554 // [When] adding cv-qualifications on top of the function type [...] the 4555 // cv-qualifiers are ignored. 4556 if (T->isFunctionType()) { 4557 T = SemaRef.getASTContext().getAddrSpaceQualType(T, 4558 Quals.getAddressSpace()); 4559 return T; 4560 } 4561 4562 // C++ [dcl.ref]p1: 4563 // when the cv-qualifiers are introduced through the use of a typedef-name 4564 // or decltype-specifier [...] the cv-qualifiers are ignored. 4565 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4566 // applied to a reference type. 4567 if (T->isReferenceType()) { 4568 // The only qualifier that applies to a reference type is restrict. 4569 if (!Quals.hasRestrict()) 4570 return T; 4571 Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict); 4572 } 4573 4574 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4575 // resulting type. 4576 if (Quals.hasObjCLifetime()) { 4577 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4578 Quals.removeObjCLifetime(); 4579 else if (T.getObjCLifetime()) { 4580 // Objective-C ARC: 4581 // A lifetime qualifier applied to a substituted template parameter 4582 // overrides the lifetime qualifier from the template argument. 4583 const AutoType *AutoTy; 4584 if (const SubstTemplateTypeParmType *SubstTypeParam 4585 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4586 QualType Replacement = SubstTypeParam->getReplacementType(); 4587 Qualifiers Qs = Replacement.getQualifiers(); 4588 Qs.removeObjCLifetime(); 4589 Replacement = SemaRef.Context.getQualifiedType( 4590 Replacement.getUnqualifiedType(), Qs); 4591 T = SemaRef.Context.getSubstTemplateTypeParmType( 4592 SubstTypeParam->getReplacedParameter(), Replacement); 4593 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4594 // 'auto' types behave the same way as template parameters. 4595 QualType Deduced = AutoTy->getDeducedType(); 4596 Qualifiers Qs = Deduced.getQualifiers(); 4597 Qs.removeObjCLifetime(); 4598 Deduced = 4599 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4600 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4601 AutoTy->isDependentType(), 4602 /*isPack=*/false, 4603 AutoTy->getTypeConstraintConcept(), 4604 AutoTy->getTypeConstraintArguments()); 4605 } else { 4606 // Otherwise, complain about the addition of a qualifier to an 4607 // already-qualified type. 4608 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4609 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4610 Quals.removeObjCLifetime(); 4611 } 4612 } 4613 } 4614 4615 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4616 } 4617 4618 template<typename Derived> 4619 TypeLoc 4620 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4621 QualType ObjectType, 4622 NamedDecl *UnqualLookup, 4623 CXXScopeSpec &SS) { 4624 if (getDerived().AlreadyTransformed(TL.getType())) 4625 return TL; 4626 4627 TypeSourceInfo *TSI = 4628 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4629 if (TSI) 4630 return TSI->getTypeLoc(); 4631 return TypeLoc(); 4632 } 4633 4634 template<typename Derived> 4635 TypeSourceInfo * 4636 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4637 QualType ObjectType, 4638 NamedDecl *UnqualLookup, 4639 CXXScopeSpec &SS) { 4640 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4641 return TSInfo; 4642 4643 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4644 UnqualLookup, SS); 4645 } 4646 4647 template <typename Derived> 4648 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4649 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4650 CXXScopeSpec &SS) { 4651 QualType T = TL.getType(); 4652 assert(!getDerived().AlreadyTransformed(T)); 4653 4654 TypeLocBuilder TLB; 4655 QualType Result; 4656 4657 if (isa<TemplateSpecializationType>(T)) { 4658 TemplateSpecializationTypeLoc SpecTL = 4659 TL.castAs<TemplateSpecializationTypeLoc>(); 4660 4661 TemplateName Template = getDerived().TransformTemplateName( 4662 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4663 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4664 if (Template.isNull()) 4665 return nullptr; 4666 4667 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4668 Template); 4669 } else if (isa<DependentTemplateSpecializationType>(T)) { 4670 DependentTemplateSpecializationTypeLoc SpecTL = 4671 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4672 4673 TemplateName Template 4674 = getDerived().RebuildTemplateName(SS, 4675 SpecTL.getTemplateKeywordLoc(), 4676 *SpecTL.getTypePtr()->getIdentifier(), 4677 SpecTL.getTemplateNameLoc(), 4678 ObjectType, UnqualLookup, 4679 /*AllowInjectedClassName*/true); 4680 if (Template.isNull()) 4681 return nullptr; 4682 4683 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4684 SpecTL, 4685 Template, 4686 SS); 4687 } else { 4688 // Nothing special needs to be done for these. 4689 Result = getDerived().TransformType(TLB, TL); 4690 } 4691 4692 if (Result.isNull()) 4693 return nullptr; 4694 4695 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4696 } 4697 4698 template <class TyLoc> static inline 4699 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4700 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4701 NewT.setNameLoc(T.getNameLoc()); 4702 return T.getType(); 4703 } 4704 4705 template<typename Derived> 4706 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4707 BuiltinTypeLoc T) { 4708 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4709 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4710 if (T.needsExtraLocalData()) 4711 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4712 return T.getType(); 4713 } 4714 4715 template<typename Derived> 4716 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4717 ComplexTypeLoc T) { 4718 // FIXME: recurse? 4719 return TransformTypeSpecType(TLB, T); 4720 } 4721 4722 template <typename Derived> 4723 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4724 AdjustedTypeLoc TL) { 4725 // Adjustments applied during transformation are handled elsewhere. 4726 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4727 } 4728 4729 template<typename Derived> 4730 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4731 DecayedTypeLoc TL) { 4732 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4733 if (OriginalType.isNull()) 4734 return QualType(); 4735 4736 QualType Result = TL.getType(); 4737 if (getDerived().AlwaysRebuild() || 4738 OriginalType != TL.getOriginalLoc().getType()) 4739 Result = SemaRef.Context.getDecayedType(OriginalType); 4740 TLB.push<DecayedTypeLoc>(Result); 4741 // Nothing to set for DecayedTypeLoc. 4742 return Result; 4743 } 4744 4745 template<typename Derived> 4746 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4747 PointerTypeLoc TL) { 4748 QualType PointeeType 4749 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4750 if (PointeeType.isNull()) 4751 return QualType(); 4752 4753 QualType Result = TL.getType(); 4754 if (PointeeType->getAs<ObjCObjectType>()) { 4755 // A dependent pointer type 'T *' has is being transformed such 4756 // that an Objective-C class type is being replaced for 'T'. The 4757 // resulting pointer type is an ObjCObjectPointerType, not a 4758 // PointerType. 4759 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4760 4761 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4762 NewT.setStarLoc(TL.getStarLoc()); 4763 return Result; 4764 } 4765 4766 if (getDerived().AlwaysRebuild() || 4767 PointeeType != TL.getPointeeLoc().getType()) { 4768 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4769 if (Result.isNull()) 4770 return QualType(); 4771 } 4772 4773 // Objective-C ARC can add lifetime qualifiers to the type that we're 4774 // pointing to. 4775 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4776 4777 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4778 NewT.setSigilLoc(TL.getSigilLoc()); 4779 return Result; 4780 } 4781 4782 template<typename Derived> 4783 QualType 4784 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4785 BlockPointerTypeLoc TL) { 4786 QualType PointeeType 4787 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4788 if (PointeeType.isNull()) 4789 return QualType(); 4790 4791 QualType Result = TL.getType(); 4792 if (getDerived().AlwaysRebuild() || 4793 PointeeType != TL.getPointeeLoc().getType()) { 4794 Result = getDerived().RebuildBlockPointerType(PointeeType, 4795 TL.getSigilLoc()); 4796 if (Result.isNull()) 4797 return QualType(); 4798 } 4799 4800 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4801 NewT.setSigilLoc(TL.getSigilLoc()); 4802 return Result; 4803 } 4804 4805 /// Transforms a reference type. Note that somewhat paradoxically we 4806 /// don't care whether the type itself is an l-value type or an r-value 4807 /// type; we only care if the type was *written* as an l-value type 4808 /// or an r-value type. 4809 template<typename Derived> 4810 QualType 4811 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4812 ReferenceTypeLoc TL) { 4813 const ReferenceType *T = TL.getTypePtr(); 4814 4815 // Note that this works with the pointee-as-written. 4816 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4817 if (PointeeType.isNull()) 4818 return QualType(); 4819 4820 QualType Result = TL.getType(); 4821 if (getDerived().AlwaysRebuild() || 4822 PointeeType != T->getPointeeTypeAsWritten()) { 4823 Result = getDerived().RebuildReferenceType(PointeeType, 4824 T->isSpelledAsLValue(), 4825 TL.getSigilLoc()); 4826 if (Result.isNull()) 4827 return QualType(); 4828 } 4829 4830 // Objective-C ARC can add lifetime qualifiers to the type that we're 4831 // referring to. 4832 TLB.TypeWasModifiedSafely( 4833 Result->castAs<ReferenceType>()->getPointeeTypeAsWritten()); 4834 4835 // r-value references can be rebuilt as l-value references. 4836 ReferenceTypeLoc NewTL; 4837 if (isa<LValueReferenceType>(Result)) 4838 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4839 else 4840 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4841 NewTL.setSigilLoc(TL.getSigilLoc()); 4842 4843 return Result; 4844 } 4845 4846 template<typename Derived> 4847 QualType 4848 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4849 LValueReferenceTypeLoc TL) { 4850 return TransformReferenceType(TLB, TL); 4851 } 4852 4853 template<typename Derived> 4854 QualType 4855 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4856 RValueReferenceTypeLoc TL) { 4857 return TransformReferenceType(TLB, TL); 4858 } 4859 4860 template<typename Derived> 4861 QualType 4862 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4863 MemberPointerTypeLoc TL) { 4864 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4865 if (PointeeType.isNull()) 4866 return QualType(); 4867 4868 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4869 TypeSourceInfo *NewClsTInfo = nullptr; 4870 if (OldClsTInfo) { 4871 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4872 if (!NewClsTInfo) 4873 return QualType(); 4874 } 4875 4876 const MemberPointerType *T = TL.getTypePtr(); 4877 QualType OldClsType = QualType(T->getClass(), 0); 4878 QualType NewClsType; 4879 if (NewClsTInfo) 4880 NewClsType = NewClsTInfo->getType(); 4881 else { 4882 NewClsType = getDerived().TransformType(OldClsType); 4883 if (NewClsType.isNull()) 4884 return QualType(); 4885 } 4886 4887 QualType Result = TL.getType(); 4888 if (getDerived().AlwaysRebuild() || 4889 PointeeType != T->getPointeeType() || 4890 NewClsType != OldClsType) { 4891 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4892 TL.getStarLoc()); 4893 if (Result.isNull()) 4894 return QualType(); 4895 } 4896 4897 // If we had to adjust the pointee type when building a member pointer, make 4898 // sure to push TypeLoc info for it. 4899 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4900 if (MPT && PointeeType != MPT->getPointeeType()) { 4901 assert(isa<AdjustedType>(MPT->getPointeeType())); 4902 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4903 } 4904 4905 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4906 NewTL.setSigilLoc(TL.getSigilLoc()); 4907 NewTL.setClassTInfo(NewClsTInfo); 4908 4909 return Result; 4910 } 4911 4912 template<typename Derived> 4913 QualType 4914 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4915 ConstantArrayTypeLoc TL) { 4916 const ConstantArrayType *T = TL.getTypePtr(); 4917 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4918 if (ElementType.isNull()) 4919 return QualType(); 4920 4921 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4922 Expr *OldSize = TL.getSizeExpr(); 4923 if (!OldSize) 4924 OldSize = const_cast<Expr*>(T->getSizeExpr()); 4925 Expr *NewSize = nullptr; 4926 if (OldSize) { 4927 EnterExpressionEvaluationContext Unevaluated( 4928 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4929 NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>(); 4930 NewSize = SemaRef.ActOnConstantExpression(NewSize).get(); 4931 } 4932 4933 QualType Result = TL.getType(); 4934 if (getDerived().AlwaysRebuild() || 4935 ElementType != T->getElementType() || 4936 (T->getSizeExpr() && NewSize != OldSize)) { 4937 Result = getDerived().RebuildConstantArrayType(ElementType, 4938 T->getSizeModifier(), 4939 T->getSize(), NewSize, 4940 T->getIndexTypeCVRQualifiers(), 4941 TL.getBracketsRange()); 4942 if (Result.isNull()) 4943 return QualType(); 4944 } 4945 4946 // We might have either a ConstantArrayType or a VariableArrayType now: 4947 // a ConstantArrayType is allowed to have an element type which is a 4948 // VariableArrayType if the type is dependent. Fortunately, all array 4949 // types have the same location layout. 4950 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4951 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4952 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4953 NewTL.setSizeExpr(NewSize); 4954 4955 return Result; 4956 } 4957 4958 template<typename Derived> 4959 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4960 TypeLocBuilder &TLB, 4961 IncompleteArrayTypeLoc TL) { 4962 const IncompleteArrayType *T = TL.getTypePtr(); 4963 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4964 if (ElementType.isNull()) 4965 return QualType(); 4966 4967 QualType Result = TL.getType(); 4968 if (getDerived().AlwaysRebuild() || 4969 ElementType != T->getElementType()) { 4970 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4971 T->getSizeModifier(), 4972 T->getIndexTypeCVRQualifiers(), 4973 TL.getBracketsRange()); 4974 if (Result.isNull()) 4975 return QualType(); 4976 } 4977 4978 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4979 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4980 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4981 NewTL.setSizeExpr(nullptr); 4982 4983 return Result; 4984 } 4985 4986 template<typename Derived> 4987 QualType 4988 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4989 VariableArrayTypeLoc TL) { 4990 const VariableArrayType *T = TL.getTypePtr(); 4991 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4992 if (ElementType.isNull()) 4993 return QualType(); 4994 4995 ExprResult SizeResult; 4996 { 4997 EnterExpressionEvaluationContext Context( 4998 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4999 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 5000 } 5001 if (SizeResult.isInvalid()) 5002 return QualType(); 5003 SizeResult = 5004 SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false); 5005 if (SizeResult.isInvalid()) 5006 return QualType(); 5007 5008 Expr *Size = SizeResult.get(); 5009 5010 QualType Result = TL.getType(); 5011 if (getDerived().AlwaysRebuild() || 5012 ElementType != T->getElementType() || 5013 Size != T->getSizeExpr()) { 5014 Result = getDerived().RebuildVariableArrayType(ElementType, 5015 T->getSizeModifier(), 5016 Size, 5017 T->getIndexTypeCVRQualifiers(), 5018 TL.getBracketsRange()); 5019 if (Result.isNull()) 5020 return QualType(); 5021 } 5022 5023 // We might have constant size array now, but fortunately it has the same 5024 // location layout. 5025 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5026 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5027 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5028 NewTL.setSizeExpr(Size); 5029 5030 return Result; 5031 } 5032 5033 template<typename Derived> 5034 QualType 5035 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 5036 DependentSizedArrayTypeLoc TL) { 5037 const DependentSizedArrayType *T = TL.getTypePtr(); 5038 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 5039 if (ElementType.isNull()) 5040 return QualType(); 5041 5042 // Array bounds are constant expressions. 5043 EnterExpressionEvaluationContext Unevaluated( 5044 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5045 5046 // Prefer the expression from the TypeLoc; the other may have been uniqued. 5047 Expr *origSize = TL.getSizeExpr(); 5048 if (!origSize) origSize = T->getSizeExpr(); 5049 5050 ExprResult sizeResult 5051 = getDerived().TransformExpr(origSize); 5052 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 5053 if (sizeResult.isInvalid()) 5054 return QualType(); 5055 5056 Expr *size = sizeResult.get(); 5057 5058 QualType Result = TL.getType(); 5059 if (getDerived().AlwaysRebuild() || 5060 ElementType != T->getElementType() || 5061 size != origSize) { 5062 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 5063 T->getSizeModifier(), 5064 size, 5065 T->getIndexTypeCVRQualifiers(), 5066 TL.getBracketsRange()); 5067 if (Result.isNull()) 5068 return QualType(); 5069 } 5070 5071 // We might have any sort of array type now, but fortunately they 5072 // all have the same location layout. 5073 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 5074 NewTL.setLBracketLoc(TL.getLBracketLoc()); 5075 NewTL.setRBracketLoc(TL.getRBracketLoc()); 5076 NewTL.setSizeExpr(size); 5077 5078 return Result; 5079 } 5080 5081 template <typename Derived> 5082 QualType TreeTransform<Derived>::TransformDependentVectorType( 5083 TypeLocBuilder &TLB, DependentVectorTypeLoc TL) { 5084 const DependentVectorType *T = TL.getTypePtr(); 5085 QualType ElementType = getDerived().TransformType(T->getElementType()); 5086 if (ElementType.isNull()) 5087 return QualType(); 5088 5089 EnterExpressionEvaluationContext Unevaluated( 5090 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5091 5092 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5093 Size = SemaRef.ActOnConstantExpression(Size); 5094 if (Size.isInvalid()) 5095 return QualType(); 5096 5097 QualType Result = TL.getType(); 5098 if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() || 5099 Size.get() != T->getSizeExpr()) { 5100 Result = getDerived().RebuildDependentVectorType( 5101 ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind()); 5102 if (Result.isNull()) 5103 return QualType(); 5104 } 5105 5106 // Result might be dependent or not. 5107 if (isa<DependentVectorType>(Result)) { 5108 DependentVectorTypeLoc NewTL = 5109 TLB.push<DependentVectorTypeLoc>(Result); 5110 NewTL.setNameLoc(TL.getNameLoc()); 5111 } else { 5112 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5113 NewTL.setNameLoc(TL.getNameLoc()); 5114 } 5115 5116 return Result; 5117 } 5118 5119 template<typename Derived> 5120 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 5121 TypeLocBuilder &TLB, 5122 DependentSizedExtVectorTypeLoc TL) { 5123 const DependentSizedExtVectorType *T = TL.getTypePtr(); 5124 5125 // FIXME: ext vector locs should be nested 5126 QualType ElementType = getDerived().TransformType(T->getElementType()); 5127 if (ElementType.isNull()) 5128 return QualType(); 5129 5130 // Vector sizes are constant expressions. 5131 EnterExpressionEvaluationContext Unevaluated( 5132 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5133 5134 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 5135 Size = SemaRef.ActOnConstantExpression(Size); 5136 if (Size.isInvalid()) 5137 return QualType(); 5138 5139 QualType Result = TL.getType(); 5140 if (getDerived().AlwaysRebuild() || 5141 ElementType != T->getElementType() || 5142 Size.get() != T->getSizeExpr()) { 5143 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 5144 Size.get(), 5145 T->getAttributeLoc()); 5146 if (Result.isNull()) 5147 return QualType(); 5148 } 5149 5150 // Result might be dependent or not. 5151 if (isa<DependentSizedExtVectorType>(Result)) { 5152 DependentSizedExtVectorTypeLoc NewTL 5153 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 5154 NewTL.setNameLoc(TL.getNameLoc()); 5155 } else { 5156 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5157 NewTL.setNameLoc(TL.getNameLoc()); 5158 } 5159 5160 return Result; 5161 } 5162 5163 template <typename Derived> 5164 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType( 5165 TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) { 5166 const DependentAddressSpaceType *T = TL.getTypePtr(); 5167 5168 QualType pointeeType = getDerived().TransformType(T->getPointeeType()); 5169 5170 if (pointeeType.isNull()) 5171 return QualType(); 5172 5173 // Address spaces are constant expressions. 5174 EnterExpressionEvaluationContext Unevaluated( 5175 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 5176 5177 ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr()); 5178 AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace); 5179 if (AddrSpace.isInvalid()) 5180 return QualType(); 5181 5182 QualType Result = TL.getType(); 5183 if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() || 5184 AddrSpace.get() != T->getAddrSpaceExpr()) { 5185 Result = getDerived().RebuildDependentAddressSpaceType( 5186 pointeeType, AddrSpace.get(), T->getAttributeLoc()); 5187 if (Result.isNull()) 5188 return QualType(); 5189 } 5190 5191 // Result might be dependent or not. 5192 if (isa<DependentAddressSpaceType>(Result)) { 5193 DependentAddressSpaceTypeLoc NewTL = 5194 TLB.push<DependentAddressSpaceTypeLoc>(Result); 5195 5196 NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5197 NewTL.setAttrExprOperand(TL.getAttrExprOperand()); 5198 NewTL.setAttrNameLoc(TL.getAttrNameLoc()); 5199 5200 } else { 5201 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo( 5202 Result, getDerived().getBaseLocation()); 5203 TransformType(TLB, DI->getTypeLoc()); 5204 } 5205 5206 return Result; 5207 } 5208 5209 template <typename Derived> 5210 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 5211 VectorTypeLoc TL) { 5212 const VectorType *T = TL.getTypePtr(); 5213 QualType ElementType = getDerived().TransformType(T->getElementType()); 5214 if (ElementType.isNull()) 5215 return QualType(); 5216 5217 QualType Result = TL.getType(); 5218 if (getDerived().AlwaysRebuild() || 5219 ElementType != T->getElementType()) { 5220 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 5221 T->getVectorKind()); 5222 if (Result.isNull()) 5223 return QualType(); 5224 } 5225 5226 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 5227 NewTL.setNameLoc(TL.getNameLoc()); 5228 5229 return Result; 5230 } 5231 5232 template<typename Derived> 5233 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 5234 ExtVectorTypeLoc TL) { 5235 const VectorType *T = TL.getTypePtr(); 5236 QualType ElementType = getDerived().TransformType(T->getElementType()); 5237 if (ElementType.isNull()) 5238 return QualType(); 5239 5240 QualType Result = TL.getType(); 5241 if (getDerived().AlwaysRebuild() || 5242 ElementType != T->getElementType()) { 5243 Result = getDerived().RebuildExtVectorType(ElementType, 5244 T->getNumElements(), 5245 /*FIXME*/ SourceLocation()); 5246 if (Result.isNull()) 5247 return QualType(); 5248 } 5249 5250 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 5251 NewTL.setNameLoc(TL.getNameLoc()); 5252 5253 return Result; 5254 } 5255 5256 template <typename Derived> 5257 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 5258 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 5259 bool ExpectParameterPack) { 5260 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 5261 TypeSourceInfo *NewDI = nullptr; 5262 5263 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 5264 // If we're substituting into a pack expansion type and we know the 5265 // length we want to expand to, just substitute for the pattern. 5266 TypeLoc OldTL = OldDI->getTypeLoc(); 5267 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 5268 5269 TypeLocBuilder TLB; 5270 TypeLoc NewTL = OldDI->getTypeLoc(); 5271 TLB.reserve(NewTL.getFullDataSize()); 5272 5273 QualType Result = getDerived().TransformType(TLB, 5274 OldExpansionTL.getPatternLoc()); 5275 if (Result.isNull()) 5276 return nullptr; 5277 5278 Result = RebuildPackExpansionType(Result, 5279 OldExpansionTL.getPatternLoc().getSourceRange(), 5280 OldExpansionTL.getEllipsisLoc(), 5281 NumExpansions); 5282 if (Result.isNull()) 5283 return nullptr; 5284 5285 PackExpansionTypeLoc NewExpansionTL 5286 = TLB.push<PackExpansionTypeLoc>(Result); 5287 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 5288 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 5289 } else 5290 NewDI = getDerived().TransformType(OldDI); 5291 if (!NewDI) 5292 return nullptr; 5293 5294 if (NewDI == OldDI && indexAdjustment == 0) 5295 return OldParm; 5296 5297 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 5298 OldParm->getDeclContext(), 5299 OldParm->getInnerLocStart(), 5300 OldParm->getLocation(), 5301 OldParm->getIdentifier(), 5302 NewDI->getType(), 5303 NewDI, 5304 OldParm->getStorageClass(), 5305 /* DefArg */ nullptr); 5306 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 5307 OldParm->getFunctionScopeIndex() + indexAdjustment); 5308 return newParm; 5309 } 5310 5311 template <typename Derived> 5312 bool TreeTransform<Derived>::TransformFunctionTypeParams( 5313 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 5314 const QualType *ParamTypes, 5315 const FunctionProtoType::ExtParameterInfo *ParamInfos, 5316 SmallVectorImpl<QualType> &OutParamTypes, 5317 SmallVectorImpl<ParmVarDecl *> *PVars, 5318 Sema::ExtParameterInfoBuilder &PInfos) { 5319 int indexAdjustment = 0; 5320 5321 unsigned NumParams = Params.size(); 5322 for (unsigned i = 0; i != NumParams; ++i) { 5323 if (ParmVarDecl *OldParm = Params[i]) { 5324 assert(OldParm->getFunctionScopeIndex() == i); 5325 5326 Optional<unsigned> NumExpansions; 5327 ParmVarDecl *NewParm = nullptr; 5328 if (OldParm->isParameterPack()) { 5329 // We have a function parameter pack that may need to be expanded. 5330 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5331 5332 // Find the parameter packs that could be expanded. 5333 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 5334 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 5335 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 5336 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 5337 5338 // Determine whether we should expand the parameter packs. 5339 bool ShouldExpand = false; 5340 bool RetainExpansion = false; 5341 Optional<unsigned> OrigNumExpansions; 5342 if (Unexpanded.size() > 0) { 5343 OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions(); 5344 NumExpansions = OrigNumExpansions; 5345 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 5346 Pattern.getSourceRange(), 5347 Unexpanded, 5348 ShouldExpand, 5349 RetainExpansion, 5350 NumExpansions)) { 5351 return true; 5352 } 5353 } else { 5354 #ifndef NDEBUG 5355 const AutoType *AT = 5356 Pattern.getType().getTypePtr()->getContainedAutoType(); 5357 assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) && 5358 "Could not find parameter packs or undeduced auto type!"); 5359 #endif 5360 } 5361 5362 if (ShouldExpand) { 5363 // Expand the function parameter pack into multiple, separate 5364 // parameters. 5365 getDerived().ExpandingFunctionParameterPack(OldParm); 5366 for (unsigned I = 0; I != *NumExpansions; ++I) { 5367 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5368 ParmVarDecl *NewParm 5369 = getDerived().TransformFunctionTypeParam(OldParm, 5370 indexAdjustment++, 5371 OrigNumExpansions, 5372 /*ExpectParameterPack=*/false); 5373 if (!NewParm) 5374 return true; 5375 5376 if (ParamInfos) 5377 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5378 OutParamTypes.push_back(NewParm->getType()); 5379 if (PVars) 5380 PVars->push_back(NewParm); 5381 } 5382 5383 // If we're supposed to retain a pack expansion, do so by temporarily 5384 // forgetting the partially-substituted parameter pack. 5385 if (RetainExpansion) { 5386 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5387 ParmVarDecl *NewParm 5388 = getDerived().TransformFunctionTypeParam(OldParm, 5389 indexAdjustment++, 5390 OrigNumExpansions, 5391 /*ExpectParameterPack=*/false); 5392 if (!NewParm) 5393 return true; 5394 5395 if (ParamInfos) 5396 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5397 OutParamTypes.push_back(NewParm->getType()); 5398 if (PVars) 5399 PVars->push_back(NewParm); 5400 } 5401 5402 // The next parameter should have the same adjustment as the 5403 // last thing we pushed, but we post-incremented indexAdjustment 5404 // on every push. Also, if we push nothing, the adjustment should 5405 // go down by one. 5406 indexAdjustment--; 5407 5408 // We're done with the pack expansion. 5409 continue; 5410 } 5411 5412 // We'll substitute the parameter now without expanding the pack 5413 // expansion. 5414 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5415 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 5416 indexAdjustment, 5417 NumExpansions, 5418 /*ExpectParameterPack=*/true); 5419 assert(NewParm->isParameterPack() && 5420 "Parameter pack no longer a parameter pack after " 5421 "transformation."); 5422 } else { 5423 NewParm = getDerived().TransformFunctionTypeParam( 5424 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 5425 } 5426 5427 if (!NewParm) 5428 return true; 5429 5430 if (ParamInfos) 5431 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5432 OutParamTypes.push_back(NewParm->getType()); 5433 if (PVars) 5434 PVars->push_back(NewParm); 5435 continue; 5436 } 5437 5438 // Deal with the possibility that we don't have a parameter 5439 // declaration for this parameter. 5440 QualType OldType = ParamTypes[i]; 5441 bool IsPackExpansion = false; 5442 Optional<unsigned> NumExpansions; 5443 QualType NewType; 5444 if (const PackExpansionType *Expansion 5445 = dyn_cast<PackExpansionType>(OldType)) { 5446 // We have a function parameter pack that may need to be expanded. 5447 QualType Pattern = Expansion->getPattern(); 5448 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5449 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 5450 5451 // Determine whether we should expand the parameter packs. 5452 bool ShouldExpand = false; 5453 bool RetainExpansion = false; 5454 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 5455 Unexpanded, 5456 ShouldExpand, 5457 RetainExpansion, 5458 NumExpansions)) { 5459 return true; 5460 } 5461 5462 if (ShouldExpand) { 5463 // Expand the function parameter pack into multiple, separate 5464 // parameters. 5465 for (unsigned I = 0; I != *NumExpansions; ++I) { 5466 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5467 QualType NewType = getDerived().TransformType(Pattern); 5468 if (NewType.isNull()) 5469 return true; 5470 5471 if (NewType->containsUnexpandedParameterPack()) { 5472 NewType = 5473 getSema().getASTContext().getPackExpansionType(NewType, None); 5474 5475 if (NewType.isNull()) 5476 return true; 5477 } 5478 5479 if (ParamInfos) 5480 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5481 OutParamTypes.push_back(NewType); 5482 if (PVars) 5483 PVars->push_back(nullptr); 5484 } 5485 5486 // We're done with the pack expansion. 5487 continue; 5488 } 5489 5490 // If we're supposed to retain a pack expansion, do so by temporarily 5491 // forgetting the partially-substituted parameter pack. 5492 if (RetainExpansion) { 5493 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5494 QualType NewType = getDerived().TransformType(Pattern); 5495 if (NewType.isNull()) 5496 return true; 5497 5498 if (ParamInfos) 5499 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5500 OutParamTypes.push_back(NewType); 5501 if (PVars) 5502 PVars->push_back(nullptr); 5503 } 5504 5505 // We'll substitute the parameter now without expanding the pack 5506 // expansion. 5507 OldType = Expansion->getPattern(); 5508 IsPackExpansion = true; 5509 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5510 NewType = getDerived().TransformType(OldType); 5511 } else { 5512 NewType = getDerived().TransformType(OldType); 5513 } 5514 5515 if (NewType.isNull()) 5516 return true; 5517 5518 if (IsPackExpansion) 5519 NewType = getSema().Context.getPackExpansionType(NewType, 5520 NumExpansions); 5521 5522 if (ParamInfos) 5523 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5524 OutParamTypes.push_back(NewType); 5525 if (PVars) 5526 PVars->push_back(nullptr); 5527 } 5528 5529 #ifndef NDEBUG 5530 if (PVars) { 5531 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5532 if (ParmVarDecl *parm = (*PVars)[i]) 5533 assert(parm->getFunctionScopeIndex() == i); 5534 } 5535 #endif 5536 5537 return false; 5538 } 5539 5540 template<typename Derived> 5541 QualType 5542 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5543 FunctionProtoTypeLoc TL) { 5544 SmallVector<QualType, 4> ExceptionStorage; 5545 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5546 return getDerived().TransformFunctionProtoType( 5547 TLB, TL, nullptr, Qualifiers(), 5548 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5549 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5550 ExceptionStorage, Changed); 5551 }); 5552 } 5553 5554 template<typename Derived> template<typename Fn> 5555 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5556 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5557 Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) { 5558 5559 // Transform the parameters and return type. 5560 // 5561 // We are required to instantiate the params and return type in source order. 5562 // When the function has a trailing return type, we instantiate the 5563 // parameters before the return type, since the return type can then refer 5564 // to the parameters themselves (via decltype, sizeof, etc.). 5565 // 5566 SmallVector<QualType, 4> ParamTypes; 5567 SmallVector<ParmVarDecl*, 4> ParamDecls; 5568 Sema::ExtParameterInfoBuilder ExtParamInfos; 5569 const FunctionProtoType *T = TL.getTypePtr(); 5570 5571 QualType ResultType; 5572 5573 if (T->hasTrailingReturn()) { 5574 if (getDerived().TransformFunctionTypeParams( 5575 TL.getBeginLoc(), TL.getParams(), 5576 TL.getTypePtr()->param_type_begin(), 5577 T->getExtParameterInfosOrNull(), 5578 ParamTypes, &ParamDecls, ExtParamInfos)) 5579 return QualType(); 5580 5581 { 5582 // C++11 [expr.prim.general]p3: 5583 // If a declaration declares a member function or member function 5584 // template of a class X, the expression this is a prvalue of type 5585 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5586 // and the end of the function-definition, member-declarator, or 5587 // declarator. 5588 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5589 5590 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5591 if (ResultType.isNull()) 5592 return QualType(); 5593 } 5594 } 5595 else { 5596 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5597 if (ResultType.isNull()) 5598 return QualType(); 5599 5600 if (getDerived().TransformFunctionTypeParams( 5601 TL.getBeginLoc(), TL.getParams(), 5602 TL.getTypePtr()->param_type_begin(), 5603 T->getExtParameterInfosOrNull(), 5604 ParamTypes, &ParamDecls, ExtParamInfos)) 5605 return QualType(); 5606 } 5607 5608 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5609 5610 bool EPIChanged = false; 5611 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5612 return QualType(); 5613 5614 // Handle extended parameter information. 5615 if (auto NewExtParamInfos = 5616 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5617 if (!EPI.ExtParameterInfos || 5618 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5619 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5620 EPIChanged = true; 5621 } 5622 EPI.ExtParameterInfos = NewExtParamInfos; 5623 } else if (EPI.ExtParameterInfos) { 5624 EPIChanged = true; 5625 EPI.ExtParameterInfos = nullptr; 5626 } 5627 5628 QualType Result = TL.getType(); 5629 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5630 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5631 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5632 if (Result.isNull()) 5633 return QualType(); 5634 } 5635 5636 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5637 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5638 NewTL.setLParenLoc(TL.getLParenLoc()); 5639 NewTL.setRParenLoc(TL.getRParenLoc()); 5640 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5641 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5642 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5643 NewTL.setParam(i, ParamDecls[i]); 5644 5645 return Result; 5646 } 5647 5648 template<typename Derived> 5649 bool TreeTransform<Derived>::TransformExceptionSpec( 5650 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5651 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5652 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5653 5654 // Instantiate a dynamic noexcept expression, if any. 5655 if (isComputedNoexcept(ESI.Type)) { 5656 EnterExpressionEvaluationContext Unevaluated( 5657 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5658 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5659 if (NoexceptExpr.isInvalid()) 5660 return true; 5661 5662 ExceptionSpecificationType EST = ESI.Type; 5663 NoexceptExpr = 5664 getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST); 5665 if (NoexceptExpr.isInvalid()) 5666 return true; 5667 5668 if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type) 5669 Changed = true; 5670 ESI.NoexceptExpr = NoexceptExpr.get(); 5671 ESI.Type = EST; 5672 } 5673 5674 if (ESI.Type != EST_Dynamic) 5675 return false; 5676 5677 // Instantiate a dynamic exception specification's type. 5678 for (QualType T : ESI.Exceptions) { 5679 if (const PackExpansionType *PackExpansion = 5680 T->getAs<PackExpansionType>()) { 5681 Changed = true; 5682 5683 // We have a pack expansion. Instantiate it. 5684 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5685 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5686 Unexpanded); 5687 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5688 5689 // Determine whether the set of unexpanded parameter packs can and 5690 // should 5691 // be expanded. 5692 bool Expand = false; 5693 bool RetainExpansion = false; 5694 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5695 // FIXME: Track the location of the ellipsis (and track source location 5696 // information for the types in the exception specification in general). 5697 if (getDerived().TryExpandParameterPacks( 5698 Loc, SourceRange(), Unexpanded, Expand, 5699 RetainExpansion, NumExpansions)) 5700 return true; 5701 5702 if (!Expand) { 5703 // We can't expand this pack expansion into separate arguments yet; 5704 // just substitute into the pattern and create a new pack expansion 5705 // type. 5706 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5707 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5708 if (U.isNull()) 5709 return true; 5710 5711 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5712 Exceptions.push_back(U); 5713 continue; 5714 } 5715 5716 // Substitute into the pack expansion pattern for each slice of the 5717 // pack. 5718 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5719 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5720 5721 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5722 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5723 return true; 5724 5725 Exceptions.push_back(U); 5726 } 5727 } else { 5728 QualType U = getDerived().TransformType(T); 5729 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5730 return true; 5731 if (T != U) 5732 Changed = true; 5733 5734 Exceptions.push_back(U); 5735 } 5736 } 5737 5738 ESI.Exceptions = Exceptions; 5739 if (ESI.Exceptions.empty()) 5740 ESI.Type = EST_DynamicNone; 5741 return false; 5742 } 5743 5744 template<typename Derived> 5745 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5746 TypeLocBuilder &TLB, 5747 FunctionNoProtoTypeLoc TL) { 5748 const FunctionNoProtoType *T = TL.getTypePtr(); 5749 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5750 if (ResultType.isNull()) 5751 return QualType(); 5752 5753 QualType Result = TL.getType(); 5754 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5755 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5756 5757 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5758 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5759 NewTL.setLParenLoc(TL.getLParenLoc()); 5760 NewTL.setRParenLoc(TL.getRParenLoc()); 5761 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5762 5763 return Result; 5764 } 5765 5766 template<typename Derived> QualType 5767 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5768 UnresolvedUsingTypeLoc TL) { 5769 const UnresolvedUsingType *T = TL.getTypePtr(); 5770 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5771 if (!D) 5772 return QualType(); 5773 5774 QualType Result = TL.getType(); 5775 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5776 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5777 if (Result.isNull()) 5778 return QualType(); 5779 } 5780 5781 // We might get an arbitrary type spec type back. We should at 5782 // least always get a type spec type, though. 5783 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5784 NewTL.setNameLoc(TL.getNameLoc()); 5785 5786 return Result; 5787 } 5788 5789 template<typename Derived> 5790 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5791 TypedefTypeLoc TL) { 5792 const TypedefType *T = TL.getTypePtr(); 5793 TypedefNameDecl *Typedef 5794 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5795 T->getDecl())); 5796 if (!Typedef) 5797 return QualType(); 5798 5799 QualType Result = TL.getType(); 5800 if (getDerived().AlwaysRebuild() || 5801 Typedef != T->getDecl()) { 5802 Result = getDerived().RebuildTypedefType(Typedef); 5803 if (Result.isNull()) 5804 return QualType(); 5805 } 5806 5807 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5808 NewTL.setNameLoc(TL.getNameLoc()); 5809 5810 return Result; 5811 } 5812 5813 template<typename Derived> 5814 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5815 TypeOfExprTypeLoc TL) { 5816 // typeof expressions are not potentially evaluated contexts 5817 EnterExpressionEvaluationContext Unevaluated( 5818 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5819 Sema::ReuseLambdaContextDecl); 5820 5821 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5822 if (E.isInvalid()) 5823 return QualType(); 5824 5825 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5826 if (E.isInvalid()) 5827 return QualType(); 5828 5829 QualType Result = TL.getType(); 5830 if (getDerived().AlwaysRebuild() || 5831 E.get() != TL.getUnderlyingExpr()) { 5832 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5833 if (Result.isNull()) 5834 return QualType(); 5835 } 5836 else E.get(); 5837 5838 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5839 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5840 NewTL.setLParenLoc(TL.getLParenLoc()); 5841 NewTL.setRParenLoc(TL.getRParenLoc()); 5842 5843 return Result; 5844 } 5845 5846 template<typename Derived> 5847 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5848 TypeOfTypeLoc TL) { 5849 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5850 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5851 if (!New_Under_TI) 5852 return QualType(); 5853 5854 QualType Result = TL.getType(); 5855 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5856 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5857 if (Result.isNull()) 5858 return QualType(); 5859 } 5860 5861 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5862 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5863 NewTL.setLParenLoc(TL.getLParenLoc()); 5864 NewTL.setRParenLoc(TL.getRParenLoc()); 5865 NewTL.setUnderlyingTInfo(New_Under_TI); 5866 5867 return Result; 5868 } 5869 5870 template<typename Derived> 5871 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5872 DecltypeTypeLoc TL) { 5873 const DecltypeType *T = TL.getTypePtr(); 5874 5875 // decltype expressions are not potentially evaluated contexts 5876 EnterExpressionEvaluationContext Unevaluated( 5877 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 5878 Sema::ExpressionEvaluationContextRecord::EK_Decltype); 5879 5880 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5881 if (E.isInvalid()) 5882 return QualType(); 5883 5884 E = getSema().ActOnDecltypeExpression(E.get()); 5885 if (E.isInvalid()) 5886 return QualType(); 5887 5888 QualType Result = TL.getType(); 5889 if (getDerived().AlwaysRebuild() || 5890 E.get() != T->getUnderlyingExpr()) { 5891 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5892 if (Result.isNull()) 5893 return QualType(); 5894 } 5895 else E.get(); 5896 5897 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5898 NewTL.setNameLoc(TL.getNameLoc()); 5899 5900 return Result; 5901 } 5902 5903 template<typename Derived> 5904 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5905 TypeLocBuilder &TLB, 5906 UnaryTransformTypeLoc TL) { 5907 QualType Result = TL.getType(); 5908 if (Result->isDependentType()) { 5909 const UnaryTransformType *T = TL.getTypePtr(); 5910 QualType NewBase = 5911 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5912 Result = getDerived().RebuildUnaryTransformType(NewBase, 5913 T->getUTTKind(), 5914 TL.getKWLoc()); 5915 if (Result.isNull()) 5916 return QualType(); 5917 } 5918 5919 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5920 NewTL.setKWLoc(TL.getKWLoc()); 5921 NewTL.setParensRange(TL.getParensRange()); 5922 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5923 return Result; 5924 } 5925 5926 template<typename Derived> 5927 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 5928 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 5929 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 5930 5931 CXXScopeSpec SS; 5932 TemplateName TemplateName = getDerived().TransformTemplateName( 5933 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 5934 if (TemplateName.isNull()) 5935 return QualType(); 5936 5937 QualType OldDeduced = T->getDeducedType(); 5938 QualType NewDeduced; 5939 if (!OldDeduced.isNull()) { 5940 NewDeduced = getDerived().TransformType(OldDeduced); 5941 if (NewDeduced.isNull()) 5942 return QualType(); 5943 } 5944 5945 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 5946 TemplateName, NewDeduced); 5947 if (Result.isNull()) 5948 return QualType(); 5949 5950 DeducedTemplateSpecializationTypeLoc NewTL = 5951 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 5952 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5953 5954 return Result; 5955 } 5956 5957 template<typename Derived> 5958 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5959 RecordTypeLoc TL) { 5960 const RecordType *T = TL.getTypePtr(); 5961 RecordDecl *Record 5962 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5963 T->getDecl())); 5964 if (!Record) 5965 return QualType(); 5966 5967 QualType Result = TL.getType(); 5968 if (getDerived().AlwaysRebuild() || 5969 Record != T->getDecl()) { 5970 Result = getDerived().RebuildRecordType(Record); 5971 if (Result.isNull()) 5972 return QualType(); 5973 } 5974 5975 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5976 NewTL.setNameLoc(TL.getNameLoc()); 5977 5978 return Result; 5979 } 5980 5981 template<typename Derived> 5982 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5983 EnumTypeLoc TL) { 5984 const EnumType *T = TL.getTypePtr(); 5985 EnumDecl *Enum 5986 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5987 T->getDecl())); 5988 if (!Enum) 5989 return QualType(); 5990 5991 QualType Result = TL.getType(); 5992 if (getDerived().AlwaysRebuild() || 5993 Enum != T->getDecl()) { 5994 Result = getDerived().RebuildEnumType(Enum); 5995 if (Result.isNull()) 5996 return QualType(); 5997 } 5998 5999 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 6000 NewTL.setNameLoc(TL.getNameLoc()); 6001 6002 return Result; 6003 } 6004 6005 template<typename Derived> 6006 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 6007 TypeLocBuilder &TLB, 6008 InjectedClassNameTypeLoc TL) { 6009 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 6010 TL.getTypePtr()->getDecl()); 6011 if (!D) return QualType(); 6012 6013 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 6014 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 6015 return T; 6016 } 6017 6018 template<typename Derived> 6019 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 6020 TypeLocBuilder &TLB, 6021 TemplateTypeParmTypeLoc TL) { 6022 return TransformTypeSpecType(TLB, TL); 6023 } 6024 6025 template<typename Derived> 6026 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 6027 TypeLocBuilder &TLB, 6028 SubstTemplateTypeParmTypeLoc TL) { 6029 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 6030 6031 // Substitute into the replacement type, which itself might involve something 6032 // that needs to be transformed. This only tends to occur with default 6033 // template arguments of template template parameters. 6034 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 6035 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 6036 if (Replacement.isNull()) 6037 return QualType(); 6038 6039 // Always canonicalize the replacement type. 6040 Replacement = SemaRef.Context.getCanonicalType(Replacement); 6041 QualType Result 6042 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 6043 Replacement); 6044 6045 // Propagate type-source information. 6046 SubstTemplateTypeParmTypeLoc NewTL 6047 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 6048 NewTL.setNameLoc(TL.getNameLoc()); 6049 return Result; 6050 6051 } 6052 6053 template<typename Derived> 6054 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 6055 TypeLocBuilder &TLB, 6056 SubstTemplateTypeParmPackTypeLoc TL) { 6057 return TransformTypeSpecType(TLB, TL); 6058 } 6059 6060 template<typename Derived> 6061 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6062 TypeLocBuilder &TLB, 6063 TemplateSpecializationTypeLoc TL) { 6064 const TemplateSpecializationType *T = TL.getTypePtr(); 6065 6066 // The nested-name-specifier never matters in a TemplateSpecializationType, 6067 // because we can't have a dependent nested-name-specifier anyway. 6068 CXXScopeSpec SS; 6069 TemplateName Template 6070 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 6071 TL.getTemplateNameLoc()); 6072 if (Template.isNull()) 6073 return QualType(); 6074 6075 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 6076 } 6077 6078 template<typename Derived> 6079 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 6080 AtomicTypeLoc TL) { 6081 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6082 if (ValueType.isNull()) 6083 return QualType(); 6084 6085 QualType Result = TL.getType(); 6086 if (getDerived().AlwaysRebuild() || 6087 ValueType != TL.getValueLoc().getType()) { 6088 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 6089 if (Result.isNull()) 6090 return QualType(); 6091 } 6092 6093 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 6094 NewTL.setKWLoc(TL.getKWLoc()); 6095 NewTL.setLParenLoc(TL.getLParenLoc()); 6096 NewTL.setRParenLoc(TL.getRParenLoc()); 6097 6098 return Result; 6099 } 6100 6101 template <typename Derived> 6102 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 6103 PipeTypeLoc TL) { 6104 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 6105 if (ValueType.isNull()) 6106 return QualType(); 6107 6108 QualType Result = TL.getType(); 6109 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 6110 const PipeType *PT = Result->castAs<PipeType>(); 6111 bool isReadPipe = PT->isReadOnly(); 6112 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 6113 if (Result.isNull()) 6114 return QualType(); 6115 } 6116 6117 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 6118 NewTL.setKWLoc(TL.getKWLoc()); 6119 6120 return Result; 6121 } 6122 6123 /// Simple iterator that traverses the template arguments in a 6124 /// container that provides a \c getArgLoc() member function. 6125 /// 6126 /// This iterator is intended to be used with the iterator form of 6127 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 6128 template<typename ArgLocContainer> 6129 class TemplateArgumentLocContainerIterator { 6130 ArgLocContainer *Container; 6131 unsigned Index; 6132 6133 public: 6134 typedef TemplateArgumentLoc value_type; 6135 typedef TemplateArgumentLoc reference; 6136 typedef int difference_type; 6137 typedef std::input_iterator_tag iterator_category; 6138 6139 class pointer { 6140 TemplateArgumentLoc Arg; 6141 6142 public: 6143 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 6144 6145 const TemplateArgumentLoc *operator->() const { 6146 return &Arg; 6147 } 6148 }; 6149 6150 6151 TemplateArgumentLocContainerIterator() {} 6152 6153 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 6154 unsigned Index) 6155 : Container(&Container), Index(Index) { } 6156 6157 TemplateArgumentLocContainerIterator &operator++() { 6158 ++Index; 6159 return *this; 6160 } 6161 6162 TemplateArgumentLocContainerIterator operator++(int) { 6163 TemplateArgumentLocContainerIterator Old(*this); 6164 ++(*this); 6165 return Old; 6166 } 6167 6168 TemplateArgumentLoc operator*() const { 6169 return Container->getArgLoc(Index); 6170 } 6171 6172 pointer operator->() const { 6173 return pointer(Container->getArgLoc(Index)); 6174 } 6175 6176 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 6177 const TemplateArgumentLocContainerIterator &Y) { 6178 return X.Container == Y.Container && X.Index == Y.Index; 6179 } 6180 6181 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 6182 const TemplateArgumentLocContainerIterator &Y) { 6183 return !(X == Y); 6184 } 6185 }; 6186 6187 template<typename Derived> 6188 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 6189 AutoTypeLoc TL) { 6190 const AutoType *T = TL.getTypePtr(); 6191 QualType OldDeduced = T->getDeducedType(); 6192 QualType NewDeduced; 6193 if (!OldDeduced.isNull()) { 6194 NewDeduced = getDerived().TransformType(OldDeduced); 6195 if (NewDeduced.isNull()) 6196 return QualType(); 6197 } 6198 6199 ConceptDecl *NewCD = nullptr; 6200 TemplateArgumentListInfo NewTemplateArgs; 6201 NestedNameSpecifierLoc NewNestedNameSpec; 6202 if (TL.getTypePtr()->isConstrained()) { 6203 NewCD = cast_or_null<ConceptDecl>( 6204 getDerived().TransformDecl( 6205 TL.getConceptNameLoc(), 6206 TL.getTypePtr()->getTypeConstraintConcept())); 6207 6208 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6209 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6210 typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator; 6211 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6212 ArgIterator(TL, 6213 TL.getNumArgs()), 6214 NewTemplateArgs)) 6215 return QualType(); 6216 6217 if (TL.getNestedNameSpecifierLoc()) { 6218 NewNestedNameSpec 6219 = getDerived().TransformNestedNameSpecifierLoc( 6220 TL.getNestedNameSpecifierLoc()); 6221 if (!NewNestedNameSpec) 6222 return QualType(); 6223 } 6224 } 6225 6226 QualType Result = TL.getType(); 6227 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 6228 T->isDependentType()) { 6229 llvm::SmallVector<TemplateArgument, 4> NewArgList; 6230 NewArgList.reserve(NewArgList.size()); 6231 for (const auto &ArgLoc : NewTemplateArgs.arguments()) 6232 NewArgList.push_back(ArgLoc.getArgument()); 6233 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD, 6234 NewArgList); 6235 if (Result.isNull()) 6236 return QualType(); 6237 } 6238 6239 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 6240 NewTL.setNameLoc(TL.getNameLoc()); 6241 NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec); 6242 NewTL.setTemplateKWLoc(TL.getTemplateKWLoc()); 6243 NewTL.setConceptNameLoc(TL.getConceptNameLoc()); 6244 NewTL.setFoundDecl(TL.getFoundDecl()); 6245 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6246 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6247 for (unsigned I = 0; I < TL.getNumArgs(); ++I) 6248 NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo()); 6249 6250 return Result; 6251 } 6252 6253 template <typename Derived> 6254 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 6255 TypeLocBuilder &TLB, 6256 TemplateSpecializationTypeLoc TL, 6257 TemplateName Template) { 6258 TemplateArgumentListInfo NewTemplateArgs; 6259 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6260 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6261 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 6262 ArgIterator; 6263 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6264 ArgIterator(TL, TL.getNumArgs()), 6265 NewTemplateArgs)) 6266 return QualType(); 6267 6268 // FIXME: maybe don't rebuild if all the template arguments are the same. 6269 6270 QualType Result = 6271 getDerived().RebuildTemplateSpecializationType(Template, 6272 TL.getTemplateNameLoc(), 6273 NewTemplateArgs); 6274 6275 if (!Result.isNull()) { 6276 // Specializations of template template parameters are represented as 6277 // TemplateSpecializationTypes, and substitution of type alias templates 6278 // within a dependent context can transform them into 6279 // DependentTemplateSpecializationTypes. 6280 if (isa<DependentTemplateSpecializationType>(Result)) { 6281 DependentTemplateSpecializationTypeLoc NewTL 6282 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6283 NewTL.setElaboratedKeywordLoc(SourceLocation()); 6284 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 6285 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6286 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6287 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6288 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6289 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6290 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6291 return Result; 6292 } 6293 6294 TemplateSpecializationTypeLoc NewTL 6295 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6296 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6297 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6298 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6299 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6300 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6301 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6302 } 6303 6304 return Result; 6305 } 6306 6307 template <typename Derived> 6308 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 6309 TypeLocBuilder &TLB, 6310 DependentTemplateSpecializationTypeLoc TL, 6311 TemplateName Template, 6312 CXXScopeSpec &SS) { 6313 TemplateArgumentListInfo NewTemplateArgs; 6314 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6315 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6316 typedef TemplateArgumentLocContainerIterator< 6317 DependentTemplateSpecializationTypeLoc> ArgIterator; 6318 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6319 ArgIterator(TL, TL.getNumArgs()), 6320 NewTemplateArgs)) 6321 return QualType(); 6322 6323 // FIXME: maybe don't rebuild if all the template arguments are the same. 6324 6325 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 6326 QualType Result 6327 = getSema().Context.getDependentTemplateSpecializationType( 6328 TL.getTypePtr()->getKeyword(), 6329 DTN->getQualifier(), 6330 DTN->getIdentifier(), 6331 NewTemplateArgs); 6332 6333 DependentTemplateSpecializationTypeLoc NewTL 6334 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6335 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6336 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 6337 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6338 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6339 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6340 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6341 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6342 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6343 return Result; 6344 } 6345 6346 QualType Result 6347 = getDerived().RebuildTemplateSpecializationType(Template, 6348 TL.getTemplateNameLoc(), 6349 NewTemplateArgs); 6350 6351 if (!Result.isNull()) { 6352 /// FIXME: Wrap this in an elaborated-type-specifier? 6353 TemplateSpecializationTypeLoc NewTL 6354 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6355 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6356 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6357 NewTL.setLAngleLoc(TL.getLAngleLoc()); 6358 NewTL.setRAngleLoc(TL.getRAngleLoc()); 6359 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 6360 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 6361 } 6362 6363 return Result; 6364 } 6365 6366 template<typename Derived> 6367 QualType 6368 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 6369 ElaboratedTypeLoc TL) { 6370 const ElaboratedType *T = TL.getTypePtr(); 6371 6372 NestedNameSpecifierLoc QualifierLoc; 6373 // NOTE: the qualifier in an ElaboratedType is optional. 6374 if (TL.getQualifierLoc()) { 6375 QualifierLoc 6376 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6377 if (!QualifierLoc) 6378 return QualType(); 6379 } 6380 6381 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 6382 if (NamedT.isNull()) 6383 return QualType(); 6384 6385 // C++0x [dcl.type.elab]p2: 6386 // If the identifier resolves to a typedef-name or the simple-template-id 6387 // resolves to an alias template specialization, the 6388 // elaborated-type-specifier is ill-formed. 6389 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 6390 if (const TemplateSpecializationType *TST = 6391 NamedT->getAs<TemplateSpecializationType>()) { 6392 TemplateName Template = TST->getTemplateName(); 6393 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 6394 Template.getAsTemplateDecl())) { 6395 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 6396 diag::err_tag_reference_non_tag) 6397 << TAT << Sema::NTK_TypeAliasTemplate 6398 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 6399 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 6400 } 6401 } 6402 } 6403 6404 QualType Result = TL.getType(); 6405 if (getDerived().AlwaysRebuild() || 6406 QualifierLoc != TL.getQualifierLoc() || 6407 NamedT != T->getNamedType()) { 6408 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 6409 T->getKeyword(), 6410 QualifierLoc, NamedT); 6411 if (Result.isNull()) 6412 return QualType(); 6413 } 6414 6415 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6416 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6417 NewTL.setQualifierLoc(QualifierLoc); 6418 return Result; 6419 } 6420 6421 template<typename Derived> 6422 QualType TreeTransform<Derived>::TransformAttributedType( 6423 TypeLocBuilder &TLB, 6424 AttributedTypeLoc TL) { 6425 const AttributedType *oldType = TL.getTypePtr(); 6426 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 6427 if (modifiedType.isNull()) 6428 return QualType(); 6429 6430 // oldAttr can be null if we started with a QualType rather than a TypeLoc. 6431 const Attr *oldAttr = TL.getAttr(); 6432 const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr; 6433 if (oldAttr && !newAttr) 6434 return QualType(); 6435 6436 QualType result = TL.getType(); 6437 6438 // FIXME: dependent operand expressions? 6439 if (getDerived().AlwaysRebuild() || 6440 modifiedType != oldType->getModifiedType()) { 6441 // TODO: this is really lame; we should really be rebuilding the 6442 // equivalent type from first principles. 6443 QualType equivalentType 6444 = getDerived().TransformType(oldType->getEquivalentType()); 6445 if (equivalentType.isNull()) 6446 return QualType(); 6447 6448 // Check whether we can add nullability; it is only represented as 6449 // type sugar, and therefore cannot be diagnosed in any other way. 6450 if (auto nullability = oldType->getImmediateNullability()) { 6451 if (!modifiedType->canHaveNullability()) { 6452 SemaRef.Diag(TL.getAttr()->getLocation(), 6453 diag::err_nullability_nonpointer) 6454 << DiagNullabilityKind(*nullability, false) << modifiedType; 6455 return QualType(); 6456 } 6457 } 6458 6459 result = SemaRef.Context.getAttributedType(TL.getAttrKind(), 6460 modifiedType, 6461 equivalentType); 6462 } 6463 6464 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 6465 newTL.setAttr(newAttr); 6466 return result; 6467 } 6468 6469 template<typename Derived> 6470 QualType 6471 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 6472 ParenTypeLoc TL) { 6473 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6474 if (Inner.isNull()) 6475 return QualType(); 6476 6477 QualType Result = TL.getType(); 6478 if (getDerived().AlwaysRebuild() || 6479 Inner != TL.getInnerLoc().getType()) { 6480 Result = getDerived().RebuildParenType(Inner); 6481 if (Result.isNull()) 6482 return QualType(); 6483 } 6484 6485 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 6486 NewTL.setLParenLoc(TL.getLParenLoc()); 6487 NewTL.setRParenLoc(TL.getRParenLoc()); 6488 return Result; 6489 } 6490 6491 template <typename Derived> 6492 QualType 6493 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB, 6494 MacroQualifiedTypeLoc TL) { 6495 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 6496 if (Inner.isNull()) 6497 return QualType(); 6498 6499 QualType Result = TL.getType(); 6500 if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) { 6501 Result = 6502 getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier()); 6503 if (Result.isNull()) 6504 return QualType(); 6505 } 6506 6507 MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result); 6508 NewTL.setExpansionLoc(TL.getExpansionLoc()); 6509 return Result; 6510 } 6511 6512 template<typename Derived> 6513 QualType TreeTransform<Derived>::TransformDependentNameType( 6514 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 6515 return TransformDependentNameType(TLB, TL, false); 6516 } 6517 6518 template<typename Derived> 6519 QualType TreeTransform<Derived>::TransformDependentNameType( 6520 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6521 const DependentNameType *T = TL.getTypePtr(); 6522 6523 NestedNameSpecifierLoc QualifierLoc 6524 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6525 if (!QualifierLoc) 6526 return QualType(); 6527 6528 QualType Result 6529 = getDerived().RebuildDependentNameType(T->getKeyword(), 6530 TL.getElaboratedKeywordLoc(), 6531 QualifierLoc, 6532 T->getIdentifier(), 6533 TL.getNameLoc(), 6534 DeducedTSTContext); 6535 if (Result.isNull()) 6536 return QualType(); 6537 6538 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6539 QualType NamedT = ElabT->getNamedType(); 6540 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6541 6542 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6543 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6544 NewTL.setQualifierLoc(QualifierLoc); 6545 } else { 6546 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6547 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6548 NewTL.setQualifierLoc(QualifierLoc); 6549 NewTL.setNameLoc(TL.getNameLoc()); 6550 } 6551 return Result; 6552 } 6553 6554 template<typename Derived> 6555 QualType TreeTransform<Derived>:: 6556 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6557 DependentTemplateSpecializationTypeLoc TL) { 6558 NestedNameSpecifierLoc QualifierLoc; 6559 if (TL.getQualifierLoc()) { 6560 QualifierLoc 6561 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6562 if (!QualifierLoc) 6563 return QualType(); 6564 } 6565 6566 return getDerived() 6567 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6568 } 6569 6570 template<typename Derived> 6571 QualType TreeTransform<Derived>:: 6572 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6573 DependentTemplateSpecializationTypeLoc TL, 6574 NestedNameSpecifierLoc QualifierLoc) { 6575 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6576 6577 TemplateArgumentListInfo NewTemplateArgs; 6578 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6579 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6580 6581 typedef TemplateArgumentLocContainerIterator< 6582 DependentTemplateSpecializationTypeLoc> ArgIterator; 6583 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6584 ArgIterator(TL, TL.getNumArgs()), 6585 NewTemplateArgs)) 6586 return QualType(); 6587 6588 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6589 T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(), 6590 T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs, 6591 /*AllowInjectedClassName*/ false); 6592 if (Result.isNull()) 6593 return QualType(); 6594 6595 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6596 QualType NamedT = ElabT->getNamedType(); 6597 6598 // Copy information relevant to the template specialization. 6599 TemplateSpecializationTypeLoc NamedTL 6600 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6601 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6602 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6603 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6604 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6605 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6606 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6607 6608 // Copy information relevant to the elaborated type. 6609 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6610 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6611 NewTL.setQualifierLoc(QualifierLoc); 6612 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6613 DependentTemplateSpecializationTypeLoc SpecTL 6614 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6615 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6616 SpecTL.setQualifierLoc(QualifierLoc); 6617 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6618 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6619 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6620 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6621 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6622 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6623 } else { 6624 TemplateSpecializationTypeLoc SpecTL 6625 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6626 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6627 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6628 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6629 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6630 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6631 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6632 } 6633 return Result; 6634 } 6635 6636 template<typename Derived> 6637 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6638 PackExpansionTypeLoc TL) { 6639 QualType Pattern 6640 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6641 if (Pattern.isNull()) 6642 return QualType(); 6643 6644 QualType Result = TL.getType(); 6645 if (getDerived().AlwaysRebuild() || 6646 Pattern != TL.getPatternLoc().getType()) { 6647 Result = getDerived().RebuildPackExpansionType(Pattern, 6648 TL.getPatternLoc().getSourceRange(), 6649 TL.getEllipsisLoc(), 6650 TL.getTypePtr()->getNumExpansions()); 6651 if (Result.isNull()) 6652 return QualType(); 6653 } 6654 6655 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6656 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6657 return Result; 6658 } 6659 6660 template<typename Derived> 6661 QualType 6662 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6663 ObjCInterfaceTypeLoc TL) { 6664 // ObjCInterfaceType is never dependent. 6665 TLB.pushFullCopy(TL); 6666 return TL.getType(); 6667 } 6668 6669 template<typename Derived> 6670 QualType 6671 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6672 ObjCTypeParamTypeLoc TL) { 6673 const ObjCTypeParamType *T = TL.getTypePtr(); 6674 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6675 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6676 if (!OTP) 6677 return QualType(); 6678 6679 QualType Result = TL.getType(); 6680 if (getDerived().AlwaysRebuild() || 6681 OTP != T->getDecl()) { 6682 Result = getDerived().RebuildObjCTypeParamType(OTP, 6683 TL.getProtocolLAngleLoc(), 6684 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6685 TL.getNumProtocols()), 6686 TL.getProtocolLocs(), 6687 TL.getProtocolRAngleLoc()); 6688 if (Result.isNull()) 6689 return QualType(); 6690 } 6691 6692 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6693 if (TL.getNumProtocols()) { 6694 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6695 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6696 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6697 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6698 } 6699 return Result; 6700 } 6701 6702 template<typename Derived> 6703 QualType 6704 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6705 ObjCObjectTypeLoc TL) { 6706 // Transform base type. 6707 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6708 if (BaseType.isNull()) 6709 return QualType(); 6710 6711 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6712 6713 // Transform type arguments. 6714 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6715 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6716 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6717 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6718 QualType TypeArg = TypeArgInfo->getType(); 6719 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6720 AnyChanged = true; 6721 6722 // We have a pack expansion. Instantiate it. 6723 const auto *PackExpansion = PackExpansionLoc.getType() 6724 ->castAs<PackExpansionType>(); 6725 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6726 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6727 Unexpanded); 6728 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6729 6730 // Determine whether the set of unexpanded parameter packs can 6731 // and should be expanded. 6732 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6733 bool Expand = false; 6734 bool RetainExpansion = false; 6735 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6736 if (getDerived().TryExpandParameterPacks( 6737 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6738 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6739 return QualType(); 6740 6741 if (!Expand) { 6742 // We can't expand this pack expansion into separate arguments yet; 6743 // just substitute into the pattern and create a new pack expansion 6744 // type. 6745 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6746 6747 TypeLocBuilder TypeArgBuilder; 6748 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6749 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6750 PatternLoc); 6751 if (NewPatternType.isNull()) 6752 return QualType(); 6753 6754 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6755 NewPatternType, NumExpansions); 6756 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6757 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6758 NewTypeArgInfos.push_back( 6759 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6760 continue; 6761 } 6762 6763 // Substitute into the pack expansion pattern for each slice of the 6764 // pack. 6765 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6766 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6767 6768 TypeLocBuilder TypeArgBuilder; 6769 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6770 6771 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6772 PatternLoc); 6773 if (NewTypeArg.isNull()) 6774 return QualType(); 6775 6776 NewTypeArgInfos.push_back( 6777 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6778 } 6779 6780 continue; 6781 } 6782 6783 TypeLocBuilder TypeArgBuilder; 6784 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6785 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6786 if (NewTypeArg.isNull()) 6787 return QualType(); 6788 6789 // If nothing changed, just keep the old TypeSourceInfo. 6790 if (NewTypeArg == TypeArg) { 6791 NewTypeArgInfos.push_back(TypeArgInfo); 6792 continue; 6793 } 6794 6795 NewTypeArgInfos.push_back( 6796 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6797 AnyChanged = true; 6798 } 6799 6800 QualType Result = TL.getType(); 6801 if (getDerived().AlwaysRebuild() || AnyChanged) { 6802 // Rebuild the type. 6803 Result = getDerived().RebuildObjCObjectType( 6804 BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos, 6805 TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(), 6806 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()), 6807 TL.getProtocolLocs(), TL.getProtocolRAngleLoc()); 6808 6809 if (Result.isNull()) 6810 return QualType(); 6811 } 6812 6813 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 6814 NewT.setHasBaseTypeAsWritten(true); 6815 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 6816 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 6817 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 6818 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 6819 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6820 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6821 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 6822 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6823 return Result; 6824 } 6825 6826 template<typename Derived> 6827 QualType 6828 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 6829 ObjCObjectPointerTypeLoc TL) { 6830 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 6831 if (PointeeType.isNull()) 6832 return QualType(); 6833 6834 QualType Result = TL.getType(); 6835 if (getDerived().AlwaysRebuild() || 6836 PointeeType != TL.getPointeeLoc().getType()) { 6837 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 6838 TL.getStarLoc()); 6839 if (Result.isNull()) 6840 return QualType(); 6841 } 6842 6843 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 6844 NewT.setStarLoc(TL.getStarLoc()); 6845 return Result; 6846 } 6847 6848 //===----------------------------------------------------------------------===// 6849 // Statement transformation 6850 //===----------------------------------------------------------------------===// 6851 template<typename Derived> 6852 StmtResult 6853 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6854 return S; 6855 } 6856 6857 template<typename Derived> 6858 StmtResult 6859 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6860 return getDerived().TransformCompoundStmt(S, false); 6861 } 6862 6863 template<typename Derived> 6864 StmtResult 6865 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6866 bool IsStmtExpr) { 6867 Sema::CompoundScopeRAII CompoundScope(getSema()); 6868 6869 const Stmt *ExprResult = S->getStmtExprResult(); 6870 bool SubStmtInvalid = false; 6871 bool SubStmtChanged = false; 6872 SmallVector<Stmt*, 8> Statements; 6873 for (auto *B : S->body()) { 6874 StmtResult Result = getDerived().TransformStmt( 6875 B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded); 6876 6877 if (Result.isInvalid()) { 6878 // Immediately fail if this was a DeclStmt, since it's very 6879 // likely that this will cause problems for future statements. 6880 if (isa<DeclStmt>(B)) 6881 return StmtError(); 6882 6883 // Otherwise, just keep processing substatements and fail later. 6884 SubStmtInvalid = true; 6885 continue; 6886 } 6887 6888 SubStmtChanged = SubStmtChanged || Result.get() != B; 6889 Statements.push_back(Result.getAs<Stmt>()); 6890 } 6891 6892 if (SubStmtInvalid) 6893 return StmtError(); 6894 6895 if (!getDerived().AlwaysRebuild() && 6896 !SubStmtChanged) 6897 return S; 6898 6899 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6900 Statements, 6901 S->getRBracLoc(), 6902 IsStmtExpr); 6903 } 6904 6905 template<typename Derived> 6906 StmtResult 6907 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6908 ExprResult LHS, RHS; 6909 { 6910 EnterExpressionEvaluationContext Unevaluated( 6911 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6912 6913 // Transform the left-hand case value. 6914 LHS = getDerived().TransformExpr(S->getLHS()); 6915 LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS); 6916 if (LHS.isInvalid()) 6917 return StmtError(); 6918 6919 // Transform the right-hand case value (for the GNU case-range extension). 6920 RHS = getDerived().TransformExpr(S->getRHS()); 6921 RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS); 6922 if (RHS.isInvalid()) 6923 return StmtError(); 6924 } 6925 6926 // Build the case statement. 6927 // Case statements are always rebuilt so that they will attached to their 6928 // transformed switch statement. 6929 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6930 LHS.get(), 6931 S->getEllipsisLoc(), 6932 RHS.get(), 6933 S->getColonLoc()); 6934 if (Case.isInvalid()) 6935 return StmtError(); 6936 6937 // Transform the statement following the case 6938 StmtResult SubStmt = 6939 getDerived().TransformStmt(S->getSubStmt()); 6940 if (SubStmt.isInvalid()) 6941 return StmtError(); 6942 6943 // Attach the body to the case statement 6944 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 6945 } 6946 6947 template <typename Derived> 6948 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 6949 // Transform the statement following the default case 6950 StmtResult SubStmt = 6951 getDerived().TransformStmt(S->getSubStmt()); 6952 if (SubStmt.isInvalid()) 6953 return StmtError(); 6954 6955 // Default statements are always rebuilt 6956 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 6957 SubStmt.get()); 6958 } 6959 6960 template<typename Derived> 6961 StmtResult 6962 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) { 6963 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 6964 if (SubStmt.isInvalid()) 6965 return StmtError(); 6966 6967 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 6968 S->getDecl()); 6969 if (!LD) 6970 return StmtError(); 6971 6972 // If we're transforming "in-place" (we're not creating new local 6973 // declarations), assume we're replacing the old label statement 6974 // and clear out the reference to it. 6975 if (LD == S->getDecl()) 6976 S->getDecl()->setStmt(nullptr); 6977 6978 // FIXME: Pass the real colon location in. 6979 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 6980 cast<LabelDecl>(LD), SourceLocation(), 6981 SubStmt.get()); 6982 } 6983 6984 template <typename Derived> 6985 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 6986 if (!R) 6987 return R; 6988 6989 switch (R->getKind()) { 6990 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 6991 #define ATTR(X) 6992 #define PRAGMA_SPELLING_ATTR(X) \ 6993 case attr::X: \ 6994 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 6995 #include "clang/Basic/AttrList.inc" 6996 default: 6997 return R; 6998 } 6999 } 7000 7001 template <typename Derived> 7002 StmtResult 7003 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S, 7004 StmtDiscardKind SDK) { 7005 bool AttrsChanged = false; 7006 SmallVector<const Attr *, 1> Attrs; 7007 7008 // Visit attributes and keep track if any are transformed. 7009 for (const auto *I : S->getAttrs()) { 7010 const Attr *R = getDerived().TransformAttr(I); 7011 AttrsChanged |= (I != R); 7012 Attrs.push_back(R); 7013 } 7014 7015 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK); 7016 if (SubStmt.isInvalid()) 7017 return StmtError(); 7018 7019 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 7020 return S; 7021 7022 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 7023 SubStmt.get()); 7024 } 7025 7026 template<typename Derived> 7027 StmtResult 7028 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 7029 // Transform the initialization statement 7030 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7031 if (Init.isInvalid()) 7032 return StmtError(); 7033 7034 // Transform the condition 7035 Sema::ConditionResult Cond = getDerived().TransformCondition( 7036 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 7037 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 7038 : Sema::ConditionKind::Boolean); 7039 if (Cond.isInvalid()) 7040 return StmtError(); 7041 7042 // If this is a constexpr if, determine which arm we should instantiate. 7043 llvm::Optional<bool> ConstexprConditionValue; 7044 if (S->isConstexpr()) 7045 ConstexprConditionValue = Cond.getKnownValue(); 7046 7047 // Transform the "then" branch. 7048 StmtResult Then; 7049 if (!ConstexprConditionValue || *ConstexprConditionValue) { 7050 Then = getDerived().TransformStmt(S->getThen()); 7051 if (Then.isInvalid()) 7052 return StmtError(); 7053 } else { 7054 Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc()); 7055 } 7056 7057 // Transform the "else" branch. 7058 StmtResult Else; 7059 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 7060 Else = getDerived().TransformStmt(S->getElse()); 7061 if (Else.isInvalid()) 7062 return StmtError(); 7063 } 7064 7065 if (!getDerived().AlwaysRebuild() && 7066 Init.get() == S->getInit() && 7067 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7068 Then.get() == S->getThen() && 7069 Else.get() == S->getElse()) 7070 return S; 7071 7072 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 7073 Init.get(), Then.get(), S->getElseLoc(), 7074 Else.get()); 7075 } 7076 7077 template<typename Derived> 7078 StmtResult 7079 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 7080 // Transform the initialization statement 7081 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7082 if (Init.isInvalid()) 7083 return StmtError(); 7084 7085 // Transform the condition. 7086 Sema::ConditionResult Cond = getDerived().TransformCondition( 7087 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 7088 Sema::ConditionKind::Switch); 7089 if (Cond.isInvalid()) 7090 return StmtError(); 7091 7092 // Rebuild the switch statement. 7093 StmtResult Switch 7094 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond); 7095 if (Switch.isInvalid()) 7096 return StmtError(); 7097 7098 // Transform the body of the switch statement. 7099 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7100 if (Body.isInvalid()) 7101 return StmtError(); 7102 7103 // Complete the switch statement. 7104 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 7105 Body.get()); 7106 } 7107 7108 template<typename Derived> 7109 StmtResult 7110 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 7111 // Transform the condition 7112 Sema::ConditionResult Cond = getDerived().TransformCondition( 7113 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 7114 Sema::ConditionKind::Boolean); 7115 if (Cond.isInvalid()) 7116 return StmtError(); 7117 7118 // Transform the body 7119 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7120 if (Body.isInvalid()) 7121 return StmtError(); 7122 7123 if (!getDerived().AlwaysRebuild() && 7124 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7125 Body.get() == S->getBody()) 7126 return Owned(S); 7127 7128 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 7129 } 7130 7131 template<typename Derived> 7132 StmtResult 7133 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 7134 // Transform the body 7135 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7136 if (Body.isInvalid()) 7137 return StmtError(); 7138 7139 // Transform the condition 7140 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7141 if (Cond.isInvalid()) 7142 return StmtError(); 7143 7144 if (!getDerived().AlwaysRebuild() && 7145 Cond.get() == S->getCond() && 7146 Body.get() == S->getBody()) 7147 return S; 7148 7149 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 7150 /*FIXME:*/S->getWhileLoc(), Cond.get(), 7151 S->getRParenLoc()); 7152 } 7153 7154 template<typename Derived> 7155 StmtResult 7156 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 7157 if (getSema().getLangOpts().OpenMP) 7158 getSema().startOpenMPLoop(); 7159 7160 // Transform the initialization statement 7161 StmtResult Init = getDerived().TransformStmt(S->getInit()); 7162 if (Init.isInvalid()) 7163 return StmtError(); 7164 7165 // In OpenMP loop region loop control variable must be captured and be 7166 // private. Perform analysis of first part (if any). 7167 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 7168 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 7169 7170 // Transform the condition 7171 Sema::ConditionResult Cond = getDerived().TransformCondition( 7172 S->getForLoc(), S->getConditionVariable(), S->getCond(), 7173 Sema::ConditionKind::Boolean); 7174 if (Cond.isInvalid()) 7175 return StmtError(); 7176 7177 // Transform the increment 7178 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7179 if (Inc.isInvalid()) 7180 return StmtError(); 7181 7182 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 7183 if (S->getInc() && !FullInc.get()) 7184 return StmtError(); 7185 7186 // Transform the body 7187 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7188 if (Body.isInvalid()) 7189 return StmtError(); 7190 7191 if (!getDerived().AlwaysRebuild() && 7192 Init.get() == S->getInit() && 7193 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 7194 Inc.get() == S->getInc() && 7195 Body.get() == S->getBody()) 7196 return S; 7197 7198 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 7199 Init.get(), Cond, FullInc, 7200 S->getRParenLoc(), Body.get()); 7201 } 7202 7203 template<typename Derived> 7204 StmtResult 7205 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 7206 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 7207 S->getLabel()); 7208 if (!LD) 7209 return StmtError(); 7210 7211 // Goto statements must always be rebuilt, to resolve the label. 7212 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 7213 cast<LabelDecl>(LD)); 7214 } 7215 7216 template<typename Derived> 7217 StmtResult 7218 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 7219 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 7220 if (Target.isInvalid()) 7221 return StmtError(); 7222 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 7223 7224 if (!getDerived().AlwaysRebuild() && 7225 Target.get() == S->getTarget()) 7226 return S; 7227 7228 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 7229 Target.get()); 7230 } 7231 7232 template<typename Derived> 7233 StmtResult 7234 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 7235 return S; 7236 } 7237 7238 template<typename Derived> 7239 StmtResult 7240 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 7241 return S; 7242 } 7243 7244 template<typename Derived> 7245 StmtResult 7246 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 7247 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 7248 /*NotCopyInit*/false); 7249 if (Result.isInvalid()) 7250 return StmtError(); 7251 7252 // FIXME: We always rebuild the return statement because there is no way 7253 // to tell whether the return type of the function has changed. 7254 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 7255 } 7256 7257 template<typename Derived> 7258 StmtResult 7259 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 7260 bool DeclChanged = false; 7261 SmallVector<Decl *, 4> Decls; 7262 for (auto *D : S->decls()) { 7263 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 7264 if (!Transformed) 7265 return StmtError(); 7266 7267 if (Transformed != D) 7268 DeclChanged = true; 7269 7270 Decls.push_back(Transformed); 7271 } 7272 7273 if (!getDerived().AlwaysRebuild() && !DeclChanged) 7274 return S; 7275 7276 return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc()); 7277 } 7278 7279 template<typename Derived> 7280 StmtResult 7281 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 7282 7283 SmallVector<Expr*, 8> Constraints; 7284 SmallVector<Expr*, 8> Exprs; 7285 SmallVector<IdentifierInfo *, 4> Names; 7286 7287 ExprResult AsmString; 7288 SmallVector<Expr*, 8> Clobbers; 7289 7290 bool ExprsChanged = false; 7291 7292 // Go through the outputs. 7293 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 7294 Names.push_back(S->getOutputIdentifier(I)); 7295 7296 // No need to transform the constraint literal. 7297 Constraints.push_back(S->getOutputConstraintLiteral(I)); 7298 7299 // Transform the output expr. 7300 Expr *OutputExpr = S->getOutputExpr(I); 7301 ExprResult Result = getDerived().TransformExpr(OutputExpr); 7302 if (Result.isInvalid()) 7303 return StmtError(); 7304 7305 ExprsChanged |= Result.get() != OutputExpr; 7306 7307 Exprs.push_back(Result.get()); 7308 } 7309 7310 // Go through the inputs. 7311 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 7312 Names.push_back(S->getInputIdentifier(I)); 7313 7314 // No need to transform the constraint literal. 7315 Constraints.push_back(S->getInputConstraintLiteral(I)); 7316 7317 // Transform the input expr. 7318 Expr *InputExpr = S->getInputExpr(I); 7319 ExprResult Result = getDerived().TransformExpr(InputExpr); 7320 if (Result.isInvalid()) 7321 return StmtError(); 7322 7323 ExprsChanged |= Result.get() != InputExpr; 7324 7325 Exprs.push_back(Result.get()); 7326 } 7327 7328 // Go through the Labels. 7329 for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) { 7330 Names.push_back(S->getLabelIdentifier(I)); 7331 7332 ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I)); 7333 if (Result.isInvalid()) 7334 return StmtError(); 7335 ExprsChanged |= Result.get() != S->getLabelExpr(I); 7336 Exprs.push_back(Result.get()); 7337 } 7338 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 7339 return S; 7340 7341 // Go through the clobbers. 7342 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 7343 Clobbers.push_back(S->getClobberStringLiteral(I)); 7344 7345 // No need to transform the asm string literal. 7346 AsmString = S->getAsmString(); 7347 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 7348 S->isVolatile(), S->getNumOutputs(), 7349 S->getNumInputs(), Names.data(), 7350 Constraints, Exprs, AsmString.get(), 7351 Clobbers, S->getNumLabels(), 7352 S->getRParenLoc()); 7353 } 7354 7355 template<typename Derived> 7356 StmtResult 7357 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 7358 ArrayRef<Token> AsmToks = 7359 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 7360 7361 bool HadError = false, HadChange = false; 7362 7363 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 7364 SmallVector<Expr*, 8> TransformedExprs; 7365 TransformedExprs.reserve(SrcExprs.size()); 7366 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 7367 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 7368 if (!Result.isUsable()) { 7369 HadError = true; 7370 } else { 7371 HadChange |= (Result.get() != SrcExprs[i]); 7372 TransformedExprs.push_back(Result.get()); 7373 } 7374 } 7375 7376 if (HadError) return StmtError(); 7377 if (!HadChange && !getDerived().AlwaysRebuild()) 7378 return Owned(S); 7379 7380 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 7381 AsmToks, S->getAsmString(), 7382 S->getNumOutputs(), S->getNumInputs(), 7383 S->getAllConstraints(), S->getClobbers(), 7384 TransformedExprs, S->getEndLoc()); 7385 } 7386 7387 // C++ Coroutines TS 7388 7389 template<typename Derived> 7390 StmtResult 7391 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 7392 auto *ScopeInfo = SemaRef.getCurFunction(); 7393 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 7394 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 7395 ScopeInfo->NeedsCoroutineSuspends && 7396 ScopeInfo->CoroutineSuspends.first == nullptr && 7397 ScopeInfo->CoroutineSuspends.second == nullptr && 7398 "expected clean scope info"); 7399 7400 // Set that we have (possibly-invalid) suspend points before we do anything 7401 // that may fail. 7402 ScopeInfo->setNeedsCoroutineSuspends(false); 7403 7404 // We re-build the coroutine promise object (and the coroutine parameters its 7405 // type and constructor depend on) based on the types used in our current 7406 // function. We must do so, and set it on the current FunctionScopeInfo, 7407 // before attempting to transform the other parts of the coroutine body 7408 // statement, such as the implicit suspend statements (because those 7409 // statements reference the FunctionScopeInfo::CoroutinePromise). 7410 if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation())) 7411 return StmtError(); 7412 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 7413 if (!Promise) 7414 return StmtError(); 7415 getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise}); 7416 ScopeInfo->CoroutinePromise = Promise; 7417 7418 // Transform the implicit coroutine statements constructed using dependent 7419 // types during the previous parse: initial and final suspensions, the return 7420 // object, and others. We also transform the coroutine function's body. 7421 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 7422 if (InitSuspend.isInvalid()) 7423 return StmtError(); 7424 StmtResult FinalSuspend = 7425 getDerived().TransformStmt(S->getFinalSuspendStmt()); 7426 if (FinalSuspend.isInvalid()) 7427 return StmtError(); 7428 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 7429 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 7430 7431 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 7432 if (BodyRes.isInvalid()) 7433 return StmtError(); 7434 7435 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 7436 if (Builder.isInvalid()) 7437 return StmtError(); 7438 7439 Expr *ReturnObject = S->getReturnValueInit(); 7440 assert(ReturnObject && "the return object is expected to be valid"); 7441 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 7442 /*NoCopyInit*/ false); 7443 if (Res.isInvalid()) 7444 return StmtError(); 7445 Builder.ReturnValue = Res.get(); 7446 7447 // If during the previous parse the coroutine still had a dependent promise 7448 // statement, we may need to build some implicit coroutine statements 7449 // (such as exception and fallthrough handlers) for the first time. 7450 if (S->hasDependentPromiseType()) { 7451 // We can only build these statements, however, if the current promise type 7452 // is not dependent. 7453 if (!Promise->getType()->isDependentType()) { 7454 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 7455 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 7456 "these nodes should not have been built yet"); 7457 if (!Builder.buildDependentStatements()) 7458 return StmtError(); 7459 } 7460 } else { 7461 if (auto *OnFallthrough = S->getFallthroughHandler()) { 7462 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 7463 if (Res.isInvalid()) 7464 return StmtError(); 7465 Builder.OnFallthrough = Res.get(); 7466 } 7467 7468 if (auto *OnException = S->getExceptionHandler()) { 7469 StmtResult Res = getDerived().TransformStmt(OnException); 7470 if (Res.isInvalid()) 7471 return StmtError(); 7472 Builder.OnException = Res.get(); 7473 } 7474 7475 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 7476 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 7477 if (Res.isInvalid()) 7478 return StmtError(); 7479 Builder.ReturnStmtOnAllocFailure = Res.get(); 7480 } 7481 7482 // Transform any additional statements we may have already built 7483 assert(S->getAllocate() && S->getDeallocate() && 7484 "allocation and deallocation calls must already be built"); 7485 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 7486 if (AllocRes.isInvalid()) 7487 return StmtError(); 7488 Builder.Allocate = AllocRes.get(); 7489 7490 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 7491 if (DeallocRes.isInvalid()) 7492 return StmtError(); 7493 Builder.Deallocate = DeallocRes.get(); 7494 7495 assert(S->getResultDecl() && "ResultDecl must already be built"); 7496 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 7497 if (ResultDecl.isInvalid()) 7498 return StmtError(); 7499 Builder.ResultDecl = ResultDecl.get(); 7500 7501 if (auto *ReturnStmt = S->getReturnStmt()) { 7502 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 7503 if (Res.isInvalid()) 7504 return StmtError(); 7505 Builder.ReturnStmt = Res.get(); 7506 } 7507 } 7508 7509 return getDerived().RebuildCoroutineBodyStmt(Builder); 7510 } 7511 7512 template<typename Derived> 7513 StmtResult 7514 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 7515 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 7516 /*NotCopyInit*/false); 7517 if (Result.isInvalid()) 7518 return StmtError(); 7519 7520 // Always rebuild; we don't know if this needs to be injected into a new 7521 // context or if the promise type has changed. 7522 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 7523 S->isImplicit()); 7524 } 7525 7526 template<typename Derived> 7527 ExprResult 7528 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 7529 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7530 /*NotCopyInit*/false); 7531 if (Result.isInvalid()) 7532 return ExprError(); 7533 7534 // Always rebuild; we don't know if this needs to be injected into a new 7535 // context or if the promise type has changed. 7536 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 7537 E->isImplicit()); 7538 } 7539 7540 template <typename Derived> 7541 ExprResult 7542 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 7543 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7544 /*NotCopyInit*/ false); 7545 if (OperandResult.isInvalid()) 7546 return ExprError(); 7547 7548 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7549 E->getOperatorCoawaitLookup()); 7550 7551 if (LookupResult.isInvalid()) 7552 return ExprError(); 7553 7554 // Always rebuild; we don't know if this needs to be injected into a new 7555 // context or if the promise type has changed. 7556 return getDerived().RebuildDependentCoawaitExpr( 7557 E->getKeywordLoc(), OperandResult.get(), 7558 cast<UnresolvedLookupExpr>(LookupResult.get())); 7559 } 7560 7561 template<typename Derived> 7562 ExprResult 7563 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7564 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7565 /*NotCopyInit*/false); 7566 if (Result.isInvalid()) 7567 return ExprError(); 7568 7569 // Always rebuild; we don't know if this needs to be injected into a new 7570 // context or if the promise type has changed. 7571 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7572 } 7573 7574 // Objective-C Statements. 7575 7576 template<typename Derived> 7577 StmtResult 7578 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7579 // Transform the body of the @try. 7580 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7581 if (TryBody.isInvalid()) 7582 return StmtError(); 7583 7584 // Transform the @catch statements (if present). 7585 bool AnyCatchChanged = false; 7586 SmallVector<Stmt*, 8> CatchStmts; 7587 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7588 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7589 if (Catch.isInvalid()) 7590 return StmtError(); 7591 if (Catch.get() != S->getCatchStmt(I)) 7592 AnyCatchChanged = true; 7593 CatchStmts.push_back(Catch.get()); 7594 } 7595 7596 // Transform the @finally statement (if present). 7597 StmtResult Finally; 7598 if (S->getFinallyStmt()) { 7599 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7600 if (Finally.isInvalid()) 7601 return StmtError(); 7602 } 7603 7604 // If nothing changed, just retain this statement. 7605 if (!getDerived().AlwaysRebuild() && 7606 TryBody.get() == S->getTryBody() && 7607 !AnyCatchChanged && 7608 Finally.get() == S->getFinallyStmt()) 7609 return S; 7610 7611 // Build a new statement. 7612 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7613 CatchStmts, Finally.get()); 7614 } 7615 7616 template<typename Derived> 7617 StmtResult 7618 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7619 // Transform the @catch parameter, if there is one. 7620 VarDecl *Var = nullptr; 7621 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7622 TypeSourceInfo *TSInfo = nullptr; 7623 if (FromVar->getTypeSourceInfo()) { 7624 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7625 if (!TSInfo) 7626 return StmtError(); 7627 } 7628 7629 QualType T; 7630 if (TSInfo) 7631 T = TSInfo->getType(); 7632 else { 7633 T = getDerived().TransformType(FromVar->getType()); 7634 if (T.isNull()) 7635 return StmtError(); 7636 } 7637 7638 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7639 if (!Var) 7640 return StmtError(); 7641 } 7642 7643 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7644 if (Body.isInvalid()) 7645 return StmtError(); 7646 7647 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7648 S->getRParenLoc(), 7649 Var, Body.get()); 7650 } 7651 7652 template<typename Derived> 7653 StmtResult 7654 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7655 // Transform the body. 7656 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7657 if (Body.isInvalid()) 7658 return StmtError(); 7659 7660 // If nothing changed, just retain this statement. 7661 if (!getDerived().AlwaysRebuild() && 7662 Body.get() == S->getFinallyBody()) 7663 return S; 7664 7665 // Build a new statement. 7666 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7667 Body.get()); 7668 } 7669 7670 template<typename Derived> 7671 StmtResult 7672 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7673 ExprResult Operand; 7674 if (S->getThrowExpr()) { 7675 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7676 if (Operand.isInvalid()) 7677 return StmtError(); 7678 } 7679 7680 if (!getDerived().AlwaysRebuild() && 7681 Operand.get() == S->getThrowExpr()) 7682 return S; 7683 7684 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7685 } 7686 7687 template<typename Derived> 7688 StmtResult 7689 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7690 ObjCAtSynchronizedStmt *S) { 7691 // Transform the object we are locking. 7692 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7693 if (Object.isInvalid()) 7694 return StmtError(); 7695 Object = 7696 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7697 Object.get()); 7698 if (Object.isInvalid()) 7699 return StmtError(); 7700 7701 // Transform the body. 7702 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7703 if (Body.isInvalid()) 7704 return StmtError(); 7705 7706 // If nothing change, just retain the current statement. 7707 if (!getDerived().AlwaysRebuild() && 7708 Object.get() == S->getSynchExpr() && 7709 Body.get() == S->getSynchBody()) 7710 return S; 7711 7712 // Build a new statement. 7713 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7714 Object.get(), Body.get()); 7715 } 7716 7717 template<typename Derived> 7718 StmtResult 7719 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7720 ObjCAutoreleasePoolStmt *S) { 7721 // Transform the body. 7722 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7723 if (Body.isInvalid()) 7724 return StmtError(); 7725 7726 // If nothing changed, just retain this statement. 7727 if (!getDerived().AlwaysRebuild() && 7728 Body.get() == S->getSubStmt()) 7729 return S; 7730 7731 // Build a new statement. 7732 return getDerived().RebuildObjCAutoreleasePoolStmt( 7733 S->getAtLoc(), Body.get()); 7734 } 7735 7736 template<typename Derived> 7737 StmtResult 7738 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7739 ObjCForCollectionStmt *S) { 7740 // Transform the element statement. 7741 StmtResult Element = 7742 getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded); 7743 if (Element.isInvalid()) 7744 return StmtError(); 7745 7746 // Transform the collection expression. 7747 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7748 if (Collection.isInvalid()) 7749 return StmtError(); 7750 7751 // Transform the body. 7752 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7753 if (Body.isInvalid()) 7754 return StmtError(); 7755 7756 // If nothing changed, just retain this statement. 7757 if (!getDerived().AlwaysRebuild() && 7758 Element.get() == S->getElement() && 7759 Collection.get() == S->getCollection() && 7760 Body.get() == S->getBody()) 7761 return S; 7762 7763 // Build a new statement. 7764 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7765 Element.get(), 7766 Collection.get(), 7767 S->getRParenLoc(), 7768 Body.get()); 7769 } 7770 7771 template <typename Derived> 7772 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7773 // Transform the exception declaration, if any. 7774 VarDecl *Var = nullptr; 7775 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7776 TypeSourceInfo *T = 7777 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7778 if (!T) 7779 return StmtError(); 7780 7781 Var = getDerived().RebuildExceptionDecl( 7782 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7783 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7784 if (!Var || Var->isInvalidDecl()) 7785 return StmtError(); 7786 } 7787 7788 // Transform the actual exception handler. 7789 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7790 if (Handler.isInvalid()) 7791 return StmtError(); 7792 7793 if (!getDerived().AlwaysRebuild() && !Var && 7794 Handler.get() == S->getHandlerBlock()) 7795 return S; 7796 7797 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7798 } 7799 7800 template <typename Derived> 7801 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7802 // Transform the try block itself. 7803 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7804 if (TryBlock.isInvalid()) 7805 return StmtError(); 7806 7807 // Transform the handlers. 7808 bool HandlerChanged = false; 7809 SmallVector<Stmt *, 8> Handlers; 7810 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7811 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7812 if (Handler.isInvalid()) 7813 return StmtError(); 7814 7815 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7816 Handlers.push_back(Handler.getAs<Stmt>()); 7817 } 7818 7819 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7820 !HandlerChanged) 7821 return S; 7822 7823 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7824 Handlers); 7825 } 7826 7827 template<typename Derived> 7828 StmtResult 7829 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7830 StmtResult Init = 7831 S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult(); 7832 if (Init.isInvalid()) 7833 return StmtError(); 7834 7835 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7836 if (Range.isInvalid()) 7837 return StmtError(); 7838 7839 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7840 if (Begin.isInvalid()) 7841 return StmtError(); 7842 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7843 if (End.isInvalid()) 7844 return StmtError(); 7845 7846 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7847 if (Cond.isInvalid()) 7848 return StmtError(); 7849 if (Cond.get()) 7850 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7851 if (Cond.isInvalid()) 7852 return StmtError(); 7853 if (Cond.get()) 7854 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7855 7856 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7857 if (Inc.isInvalid()) 7858 return StmtError(); 7859 if (Inc.get()) 7860 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7861 7862 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7863 if (LoopVar.isInvalid()) 7864 return StmtError(); 7865 7866 StmtResult NewStmt = S; 7867 if (getDerived().AlwaysRebuild() || 7868 Init.get() != S->getInit() || 7869 Range.get() != S->getRangeStmt() || 7870 Begin.get() != S->getBeginStmt() || 7871 End.get() != S->getEndStmt() || 7872 Cond.get() != S->getCond() || 7873 Inc.get() != S->getInc() || 7874 LoopVar.get() != S->getLoopVarStmt()) { 7875 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7876 S->getCoawaitLoc(), Init.get(), 7877 S->getColonLoc(), Range.get(), 7878 Begin.get(), End.get(), 7879 Cond.get(), 7880 Inc.get(), LoopVar.get(), 7881 S->getRParenLoc()); 7882 if (NewStmt.isInvalid()) 7883 return StmtError(); 7884 } 7885 7886 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7887 if (Body.isInvalid()) 7888 return StmtError(); 7889 7890 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7891 // it now so we have a new statement to attach the body to. 7892 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7893 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7894 S->getCoawaitLoc(), Init.get(), 7895 S->getColonLoc(), Range.get(), 7896 Begin.get(), End.get(), 7897 Cond.get(), 7898 Inc.get(), LoopVar.get(), 7899 S->getRParenLoc()); 7900 if (NewStmt.isInvalid()) 7901 return StmtError(); 7902 } 7903 7904 if (NewStmt.get() == S) 7905 return S; 7906 7907 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7908 } 7909 7910 template<typename Derived> 7911 StmtResult 7912 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7913 MSDependentExistsStmt *S) { 7914 // Transform the nested-name-specifier, if any. 7915 NestedNameSpecifierLoc QualifierLoc; 7916 if (S->getQualifierLoc()) { 7917 QualifierLoc 7918 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7919 if (!QualifierLoc) 7920 return StmtError(); 7921 } 7922 7923 // Transform the declaration name. 7924 DeclarationNameInfo NameInfo = S->getNameInfo(); 7925 if (NameInfo.getName()) { 7926 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7927 if (!NameInfo.getName()) 7928 return StmtError(); 7929 } 7930 7931 // Check whether anything changed. 7932 if (!getDerived().AlwaysRebuild() && 7933 QualifierLoc == S->getQualifierLoc() && 7934 NameInfo.getName() == S->getNameInfo().getName()) 7935 return S; 7936 7937 // Determine whether this name exists, if we can. 7938 CXXScopeSpec SS; 7939 SS.Adopt(QualifierLoc); 7940 bool Dependent = false; 7941 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 7942 case Sema::IER_Exists: 7943 if (S->isIfExists()) 7944 break; 7945 7946 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7947 7948 case Sema::IER_DoesNotExist: 7949 if (S->isIfNotExists()) 7950 break; 7951 7952 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7953 7954 case Sema::IER_Dependent: 7955 Dependent = true; 7956 break; 7957 7958 case Sema::IER_Error: 7959 return StmtError(); 7960 } 7961 7962 // We need to continue with the instantiation, so do so now. 7963 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7964 if (SubStmt.isInvalid()) 7965 return StmtError(); 7966 7967 // If we have resolved the name, just transform to the substatement. 7968 if (!Dependent) 7969 return SubStmt; 7970 7971 // The name is still dependent, so build a dependent expression again. 7972 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7973 S->isIfExists(), 7974 QualifierLoc, 7975 NameInfo, 7976 SubStmt.get()); 7977 } 7978 7979 template<typename Derived> 7980 ExprResult 7981 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7982 NestedNameSpecifierLoc QualifierLoc; 7983 if (E->getQualifierLoc()) { 7984 QualifierLoc 7985 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7986 if (!QualifierLoc) 7987 return ExprError(); 7988 } 7989 7990 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7991 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7992 if (!PD) 7993 return ExprError(); 7994 7995 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7996 if (Base.isInvalid()) 7997 return ExprError(); 7998 7999 return new (SemaRef.getASTContext()) 8000 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 8001 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 8002 QualifierLoc, E->getMemberLoc()); 8003 } 8004 8005 template <typename Derived> 8006 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 8007 MSPropertySubscriptExpr *E) { 8008 auto BaseRes = getDerived().TransformExpr(E->getBase()); 8009 if (BaseRes.isInvalid()) 8010 return ExprError(); 8011 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 8012 if (IdxRes.isInvalid()) 8013 return ExprError(); 8014 8015 if (!getDerived().AlwaysRebuild() && 8016 BaseRes.get() == E->getBase() && 8017 IdxRes.get() == E->getIdx()) 8018 return E; 8019 8020 return getDerived().RebuildArraySubscriptExpr( 8021 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 8022 } 8023 8024 template <typename Derived> 8025 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 8026 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 8027 if (TryBlock.isInvalid()) 8028 return StmtError(); 8029 8030 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 8031 if (Handler.isInvalid()) 8032 return StmtError(); 8033 8034 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 8035 Handler.get() == S->getHandler()) 8036 return S; 8037 8038 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 8039 TryBlock.get(), Handler.get()); 8040 } 8041 8042 template <typename Derived> 8043 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 8044 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8045 if (Block.isInvalid()) 8046 return StmtError(); 8047 8048 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 8049 } 8050 8051 template <typename Derived> 8052 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 8053 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 8054 if (FilterExpr.isInvalid()) 8055 return StmtError(); 8056 8057 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 8058 if (Block.isInvalid()) 8059 return StmtError(); 8060 8061 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 8062 Block.get()); 8063 } 8064 8065 template <typename Derived> 8066 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 8067 if (isa<SEHFinallyStmt>(Handler)) 8068 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 8069 else 8070 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 8071 } 8072 8073 template<typename Derived> 8074 StmtResult 8075 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 8076 return S; 8077 } 8078 8079 //===----------------------------------------------------------------------===// 8080 // OpenMP directive transformation 8081 //===----------------------------------------------------------------------===// 8082 template <typename Derived> 8083 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 8084 OMPExecutableDirective *D) { 8085 8086 // Transform the clauses 8087 llvm::SmallVector<OMPClause *, 16> TClauses; 8088 ArrayRef<OMPClause *> Clauses = D->clauses(); 8089 TClauses.reserve(Clauses.size()); 8090 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 8091 I != E; ++I) { 8092 if (*I) { 8093 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 8094 OMPClause *Clause = getDerived().TransformOMPClause(*I); 8095 getDerived().getSema().EndOpenMPClause(); 8096 if (Clause) 8097 TClauses.push_back(Clause); 8098 } else { 8099 TClauses.push_back(nullptr); 8100 } 8101 } 8102 StmtResult AssociatedStmt; 8103 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 8104 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 8105 /*CurScope=*/nullptr); 8106 StmtResult Body; 8107 { 8108 Sema::CompoundScopeRAII CompoundScope(getSema()); 8109 Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt(); 8110 Body = getDerived().TransformStmt(CS); 8111 } 8112 AssociatedStmt = 8113 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 8114 if (AssociatedStmt.isInvalid()) { 8115 return StmtError(); 8116 } 8117 } 8118 if (TClauses.size() != Clauses.size()) { 8119 return StmtError(); 8120 } 8121 8122 // Transform directive name for 'omp critical' directive. 8123 DeclarationNameInfo DirName; 8124 if (D->getDirectiveKind() == OMPD_critical) { 8125 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 8126 DirName = getDerived().TransformDeclarationNameInfo(DirName); 8127 } 8128 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 8129 if (D->getDirectiveKind() == OMPD_cancellation_point) { 8130 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 8131 } else if (D->getDirectiveKind() == OMPD_cancel) { 8132 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 8133 } 8134 8135 return getDerived().RebuildOMPExecutableDirective( 8136 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 8137 AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc()); 8138 } 8139 8140 template <typename Derived> 8141 StmtResult 8142 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 8143 DeclarationNameInfo DirName; 8144 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 8145 D->getBeginLoc()); 8146 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8147 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8148 return Res; 8149 } 8150 8151 template <typename Derived> 8152 StmtResult 8153 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 8154 DeclarationNameInfo DirName; 8155 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 8156 D->getBeginLoc()); 8157 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8158 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8159 return Res; 8160 } 8161 8162 template <typename Derived> 8163 StmtResult 8164 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 8165 DeclarationNameInfo DirName; 8166 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 8167 D->getBeginLoc()); 8168 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8169 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8170 return Res; 8171 } 8172 8173 template <typename Derived> 8174 StmtResult 8175 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 8176 DeclarationNameInfo DirName; 8177 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 8178 D->getBeginLoc()); 8179 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8180 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8181 return Res; 8182 } 8183 8184 template <typename Derived> 8185 StmtResult 8186 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 8187 DeclarationNameInfo DirName; 8188 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 8189 D->getBeginLoc()); 8190 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8191 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8192 return Res; 8193 } 8194 8195 template <typename Derived> 8196 StmtResult 8197 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 8198 DeclarationNameInfo DirName; 8199 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 8200 D->getBeginLoc()); 8201 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8202 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8203 return Res; 8204 } 8205 8206 template <typename Derived> 8207 StmtResult 8208 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 8209 DeclarationNameInfo DirName; 8210 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 8211 D->getBeginLoc()); 8212 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8213 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8214 return Res; 8215 } 8216 8217 template <typename Derived> 8218 StmtResult 8219 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 8220 DeclarationNameInfo DirName; 8221 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 8222 D->getBeginLoc()); 8223 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8224 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8225 return Res; 8226 } 8227 8228 template <typename Derived> 8229 StmtResult 8230 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 8231 getDerived().getSema().StartOpenMPDSABlock( 8232 OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc()); 8233 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8234 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8235 return Res; 8236 } 8237 8238 template <typename Derived> 8239 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 8240 OMPParallelForDirective *D) { 8241 DeclarationNameInfo DirName; 8242 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 8243 nullptr, D->getBeginLoc()); 8244 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8245 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8246 return Res; 8247 } 8248 8249 template <typename Derived> 8250 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 8251 OMPParallelForSimdDirective *D) { 8252 DeclarationNameInfo DirName; 8253 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 8254 nullptr, D->getBeginLoc()); 8255 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8256 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8257 return Res; 8258 } 8259 8260 template <typename Derived> 8261 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective( 8262 OMPParallelMasterDirective *D) { 8263 DeclarationNameInfo DirName; 8264 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName, 8265 nullptr, D->getBeginLoc()); 8266 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8267 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8268 return Res; 8269 } 8270 8271 template <typename Derived> 8272 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 8273 OMPParallelSectionsDirective *D) { 8274 DeclarationNameInfo DirName; 8275 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 8276 nullptr, D->getBeginLoc()); 8277 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8278 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8279 return Res; 8280 } 8281 8282 template <typename Derived> 8283 StmtResult 8284 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 8285 DeclarationNameInfo DirName; 8286 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 8287 D->getBeginLoc()); 8288 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8289 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8290 return Res; 8291 } 8292 8293 template <typename Derived> 8294 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 8295 OMPTaskyieldDirective *D) { 8296 DeclarationNameInfo DirName; 8297 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 8298 D->getBeginLoc()); 8299 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8300 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8301 return Res; 8302 } 8303 8304 template <typename Derived> 8305 StmtResult 8306 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 8307 DeclarationNameInfo DirName; 8308 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 8309 D->getBeginLoc()); 8310 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8311 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8312 return Res; 8313 } 8314 8315 template <typename Derived> 8316 StmtResult 8317 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 8318 DeclarationNameInfo DirName; 8319 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 8320 D->getBeginLoc()); 8321 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8322 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8323 return Res; 8324 } 8325 8326 template <typename Derived> 8327 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 8328 OMPTaskgroupDirective *D) { 8329 DeclarationNameInfo DirName; 8330 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 8331 D->getBeginLoc()); 8332 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8333 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8334 return Res; 8335 } 8336 8337 template <typename Derived> 8338 StmtResult 8339 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 8340 DeclarationNameInfo DirName; 8341 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 8342 D->getBeginLoc()); 8343 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8344 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8345 return Res; 8346 } 8347 8348 template <typename Derived> 8349 StmtResult 8350 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) { 8351 DeclarationNameInfo DirName; 8352 getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr, 8353 D->getBeginLoc()); 8354 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8355 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8356 return Res; 8357 } 8358 8359 template <typename Derived> 8360 StmtResult 8361 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) { 8362 DeclarationNameInfo DirName; 8363 getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr, 8364 D->getBeginLoc()); 8365 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8366 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8367 return Res; 8368 } 8369 8370 template <typename Derived> 8371 StmtResult 8372 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 8373 DeclarationNameInfo DirName; 8374 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 8375 D->getBeginLoc()); 8376 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8377 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8378 return Res; 8379 } 8380 8381 template <typename Derived> 8382 StmtResult 8383 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 8384 DeclarationNameInfo DirName; 8385 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 8386 D->getBeginLoc()); 8387 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8388 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8389 return Res; 8390 } 8391 8392 template <typename Derived> 8393 StmtResult 8394 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 8395 DeclarationNameInfo DirName; 8396 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 8397 D->getBeginLoc()); 8398 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8399 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8400 return Res; 8401 } 8402 8403 template <typename Derived> 8404 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 8405 OMPTargetDataDirective *D) { 8406 DeclarationNameInfo DirName; 8407 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 8408 D->getBeginLoc()); 8409 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8410 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8411 return Res; 8412 } 8413 8414 template <typename Derived> 8415 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 8416 OMPTargetEnterDataDirective *D) { 8417 DeclarationNameInfo DirName; 8418 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 8419 nullptr, D->getBeginLoc()); 8420 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8421 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8422 return Res; 8423 } 8424 8425 template <typename Derived> 8426 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 8427 OMPTargetExitDataDirective *D) { 8428 DeclarationNameInfo DirName; 8429 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 8430 nullptr, D->getBeginLoc()); 8431 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8432 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8433 return Res; 8434 } 8435 8436 template <typename Derived> 8437 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 8438 OMPTargetParallelDirective *D) { 8439 DeclarationNameInfo DirName; 8440 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 8441 nullptr, D->getBeginLoc()); 8442 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8443 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8444 return Res; 8445 } 8446 8447 template <typename Derived> 8448 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 8449 OMPTargetParallelForDirective *D) { 8450 DeclarationNameInfo DirName; 8451 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 8452 nullptr, D->getBeginLoc()); 8453 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8454 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8455 return Res; 8456 } 8457 8458 template <typename Derived> 8459 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 8460 OMPTargetUpdateDirective *D) { 8461 DeclarationNameInfo DirName; 8462 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 8463 nullptr, D->getBeginLoc()); 8464 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8465 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8466 return Res; 8467 } 8468 8469 template <typename Derived> 8470 StmtResult 8471 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 8472 DeclarationNameInfo DirName; 8473 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 8474 D->getBeginLoc()); 8475 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8476 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8477 return Res; 8478 } 8479 8480 template <typename Derived> 8481 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 8482 OMPCancellationPointDirective *D) { 8483 DeclarationNameInfo DirName; 8484 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 8485 nullptr, D->getBeginLoc()); 8486 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8487 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8488 return Res; 8489 } 8490 8491 template <typename Derived> 8492 StmtResult 8493 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 8494 DeclarationNameInfo DirName; 8495 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 8496 D->getBeginLoc()); 8497 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8498 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8499 return Res; 8500 } 8501 8502 template <typename Derived> 8503 StmtResult 8504 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 8505 DeclarationNameInfo DirName; 8506 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 8507 D->getBeginLoc()); 8508 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8509 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8510 return Res; 8511 } 8512 8513 template <typename Derived> 8514 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 8515 OMPTaskLoopSimdDirective *D) { 8516 DeclarationNameInfo DirName; 8517 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 8518 nullptr, D->getBeginLoc()); 8519 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8520 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8521 return Res; 8522 } 8523 8524 template <typename Derived> 8525 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective( 8526 OMPMasterTaskLoopDirective *D) { 8527 DeclarationNameInfo DirName; 8528 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName, 8529 nullptr, D->getBeginLoc()); 8530 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8531 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8532 return Res; 8533 } 8534 8535 template <typename Derived> 8536 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective( 8537 OMPMasterTaskLoopSimdDirective *D) { 8538 DeclarationNameInfo DirName; 8539 getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName, 8540 nullptr, D->getBeginLoc()); 8541 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8542 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8543 return Res; 8544 } 8545 8546 template <typename Derived> 8547 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective( 8548 OMPParallelMasterTaskLoopDirective *D) { 8549 DeclarationNameInfo DirName; 8550 getDerived().getSema().StartOpenMPDSABlock( 8551 OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc()); 8552 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8553 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8554 return Res; 8555 } 8556 8557 template <typename Derived> 8558 StmtResult 8559 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective( 8560 OMPParallelMasterTaskLoopSimdDirective *D) { 8561 DeclarationNameInfo DirName; 8562 getDerived().getSema().StartOpenMPDSABlock( 8563 OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc()); 8564 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8565 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8566 return Res; 8567 } 8568 8569 template <typename Derived> 8570 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 8571 OMPDistributeDirective *D) { 8572 DeclarationNameInfo DirName; 8573 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 8574 D->getBeginLoc()); 8575 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8576 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8577 return Res; 8578 } 8579 8580 template <typename Derived> 8581 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 8582 OMPDistributeParallelForDirective *D) { 8583 DeclarationNameInfo DirName; 8584 getDerived().getSema().StartOpenMPDSABlock( 8585 OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8586 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8587 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8588 return Res; 8589 } 8590 8591 template <typename Derived> 8592 StmtResult 8593 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 8594 OMPDistributeParallelForSimdDirective *D) { 8595 DeclarationNameInfo DirName; 8596 getDerived().getSema().StartOpenMPDSABlock( 8597 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8598 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8599 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8600 return Res; 8601 } 8602 8603 template <typename Derived> 8604 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 8605 OMPDistributeSimdDirective *D) { 8606 DeclarationNameInfo DirName; 8607 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 8608 nullptr, D->getBeginLoc()); 8609 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8610 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8611 return Res; 8612 } 8613 8614 template <typename Derived> 8615 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 8616 OMPTargetParallelForSimdDirective *D) { 8617 DeclarationNameInfo DirName; 8618 getDerived().getSema().StartOpenMPDSABlock( 8619 OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc()); 8620 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8621 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8622 return Res; 8623 } 8624 8625 template <typename Derived> 8626 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8627 OMPTargetSimdDirective *D) { 8628 DeclarationNameInfo DirName; 8629 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8630 D->getBeginLoc()); 8631 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8632 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8633 return Res; 8634 } 8635 8636 template <typename Derived> 8637 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8638 OMPTeamsDistributeDirective *D) { 8639 DeclarationNameInfo DirName; 8640 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8641 nullptr, D->getBeginLoc()); 8642 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8643 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8644 return Res; 8645 } 8646 8647 template <typename Derived> 8648 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8649 OMPTeamsDistributeSimdDirective *D) { 8650 DeclarationNameInfo DirName; 8651 getDerived().getSema().StartOpenMPDSABlock( 8652 OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8653 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8654 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8655 return Res; 8656 } 8657 8658 template <typename Derived> 8659 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8660 OMPTeamsDistributeParallelForSimdDirective *D) { 8661 DeclarationNameInfo DirName; 8662 getDerived().getSema().StartOpenMPDSABlock( 8663 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, 8664 D->getBeginLoc()); 8665 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8666 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8667 return Res; 8668 } 8669 8670 template <typename Derived> 8671 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8672 OMPTeamsDistributeParallelForDirective *D) { 8673 DeclarationNameInfo DirName; 8674 getDerived().getSema().StartOpenMPDSABlock( 8675 OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc()); 8676 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8677 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8678 return Res; 8679 } 8680 8681 template <typename Derived> 8682 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8683 OMPTargetTeamsDirective *D) { 8684 DeclarationNameInfo DirName; 8685 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8686 nullptr, D->getBeginLoc()); 8687 auto Res = getDerived().TransformOMPExecutableDirective(D); 8688 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8689 return Res; 8690 } 8691 8692 template <typename Derived> 8693 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8694 OMPTargetTeamsDistributeDirective *D) { 8695 DeclarationNameInfo DirName; 8696 getDerived().getSema().StartOpenMPDSABlock( 8697 OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc()); 8698 auto Res = getDerived().TransformOMPExecutableDirective(D); 8699 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8700 return Res; 8701 } 8702 8703 template <typename Derived> 8704 StmtResult 8705 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8706 OMPTargetTeamsDistributeParallelForDirective *D) { 8707 DeclarationNameInfo DirName; 8708 getDerived().getSema().StartOpenMPDSABlock( 8709 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8710 D->getBeginLoc()); 8711 auto Res = getDerived().TransformOMPExecutableDirective(D); 8712 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8713 return Res; 8714 } 8715 8716 template <typename Derived> 8717 StmtResult TreeTransform<Derived>:: 8718 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8719 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8720 DeclarationNameInfo DirName; 8721 getDerived().getSema().StartOpenMPDSABlock( 8722 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8723 D->getBeginLoc()); 8724 auto Res = getDerived().TransformOMPExecutableDirective(D); 8725 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8726 return Res; 8727 } 8728 8729 template <typename Derived> 8730 StmtResult 8731 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8732 OMPTargetTeamsDistributeSimdDirective *D) { 8733 DeclarationNameInfo DirName; 8734 getDerived().getSema().StartOpenMPDSABlock( 8735 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc()); 8736 auto Res = getDerived().TransformOMPExecutableDirective(D); 8737 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8738 return Res; 8739 } 8740 8741 8742 //===----------------------------------------------------------------------===// 8743 // OpenMP clause transformation 8744 //===----------------------------------------------------------------------===// 8745 template <typename Derived> 8746 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8747 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8748 if (Cond.isInvalid()) 8749 return nullptr; 8750 return getDerived().RebuildOMPIfClause( 8751 C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(), 8752 C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc()); 8753 } 8754 8755 template <typename Derived> 8756 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8757 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8758 if (Cond.isInvalid()) 8759 return nullptr; 8760 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(), 8761 C->getLParenLoc(), C->getEndLoc()); 8762 } 8763 8764 template <typename Derived> 8765 OMPClause * 8766 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8767 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8768 if (NumThreads.isInvalid()) 8769 return nullptr; 8770 return getDerived().RebuildOMPNumThreadsClause( 8771 NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8772 } 8773 8774 template <typename Derived> 8775 OMPClause * 8776 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8777 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8778 if (E.isInvalid()) 8779 return nullptr; 8780 return getDerived().RebuildOMPSafelenClause( 8781 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8782 } 8783 8784 template <typename Derived> 8785 OMPClause * 8786 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) { 8787 ExprResult E = getDerived().TransformExpr(C->getAllocator()); 8788 if (E.isInvalid()) 8789 return nullptr; 8790 return getDerived().RebuildOMPAllocatorClause( 8791 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8792 } 8793 8794 template <typename Derived> 8795 OMPClause * 8796 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8797 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8798 if (E.isInvalid()) 8799 return nullptr; 8800 return getDerived().RebuildOMPSimdlenClause( 8801 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8802 } 8803 8804 template <typename Derived> 8805 OMPClause * 8806 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8807 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8808 if (E.isInvalid()) 8809 return nullptr; 8810 return getDerived().RebuildOMPCollapseClause( 8811 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 8812 } 8813 8814 template <typename Derived> 8815 OMPClause * 8816 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8817 return getDerived().RebuildOMPDefaultClause( 8818 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(), 8819 C->getLParenLoc(), C->getEndLoc()); 8820 } 8821 8822 template <typename Derived> 8823 OMPClause * 8824 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8825 return getDerived().RebuildOMPProcBindClause( 8826 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(), 8827 C->getLParenLoc(), C->getEndLoc()); 8828 } 8829 8830 template <typename Derived> 8831 OMPClause * 8832 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8833 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8834 if (E.isInvalid()) 8835 return nullptr; 8836 return getDerived().RebuildOMPScheduleClause( 8837 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8838 C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 8839 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8840 C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 8841 } 8842 8843 template <typename Derived> 8844 OMPClause * 8845 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8846 ExprResult E; 8847 if (auto *Num = C->getNumForLoops()) { 8848 E = getDerived().TransformExpr(Num); 8849 if (E.isInvalid()) 8850 return nullptr; 8851 } 8852 return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(), 8853 C->getLParenLoc(), E.get()); 8854 } 8855 8856 template <typename Derived> 8857 OMPClause * 8858 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) { 8859 ExprResult E; 8860 if (Expr *Evt = C->getEventHandler()) { 8861 E = getDerived().TransformExpr(Evt); 8862 if (E.isInvalid()) 8863 return nullptr; 8864 } 8865 return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(), 8866 C->getLParenLoc(), C->getEndLoc()); 8867 } 8868 8869 template <typename Derived> 8870 OMPClause * 8871 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8872 // No need to rebuild this clause, no template-dependent parameters. 8873 return C; 8874 } 8875 8876 template <typename Derived> 8877 OMPClause * 8878 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8879 // No need to rebuild this clause, no template-dependent parameters. 8880 return C; 8881 } 8882 8883 template <typename Derived> 8884 OMPClause * 8885 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8886 // No need to rebuild this clause, no template-dependent parameters. 8887 return C; 8888 } 8889 8890 template <typename Derived> 8891 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8892 // No need to rebuild this clause, no template-dependent parameters. 8893 return C; 8894 } 8895 8896 template <typename Derived> 8897 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8898 // No need to rebuild this clause, no template-dependent parameters. 8899 return C; 8900 } 8901 8902 template <typename Derived> 8903 OMPClause * 8904 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8905 // No need to rebuild this clause, no template-dependent parameters. 8906 return C; 8907 } 8908 8909 template <typename Derived> 8910 OMPClause * 8911 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8912 // No need to rebuild this clause, no template-dependent parameters. 8913 return C; 8914 } 8915 8916 template <typename Derived> 8917 OMPClause * 8918 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8919 // No need to rebuild this clause, no template-dependent parameters. 8920 return C; 8921 } 8922 8923 template <typename Derived> 8924 OMPClause * 8925 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) { 8926 // No need to rebuild this clause, no template-dependent parameters. 8927 return C; 8928 } 8929 8930 template <typename Derived> 8931 OMPClause * 8932 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) { 8933 // No need to rebuild this clause, no template-dependent parameters. 8934 return C; 8935 } 8936 8937 template <typename Derived> 8938 OMPClause * 8939 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) { 8940 // No need to rebuild this clause, no template-dependent parameters. 8941 return C; 8942 } 8943 8944 template <typename Derived> 8945 OMPClause * 8946 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) { 8947 // No need to rebuild this clause, no template-dependent parameters. 8948 return C; 8949 } 8950 8951 template <typename Derived> 8952 OMPClause * 8953 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8954 // No need to rebuild this clause, no template-dependent parameters. 8955 return C; 8956 } 8957 8958 template <typename Derived> 8959 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8960 // No need to rebuild this clause, no template-dependent parameters. 8961 return C; 8962 } 8963 8964 template <typename Derived> 8965 OMPClause * 8966 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8967 // No need to rebuild this clause, no template-dependent parameters. 8968 return C; 8969 } 8970 8971 template <typename Derived> 8972 OMPClause * 8973 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) { 8974 // No need to rebuild this clause, no template-dependent parameters. 8975 return C; 8976 } 8977 8978 template <typename Derived> 8979 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause( 8980 OMPUnifiedAddressClause *C) { 8981 llvm_unreachable("unified_address clause cannot appear in dependent context"); 8982 } 8983 8984 template <typename Derived> 8985 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause( 8986 OMPUnifiedSharedMemoryClause *C) { 8987 llvm_unreachable( 8988 "unified_shared_memory clause cannot appear in dependent context"); 8989 } 8990 8991 template <typename Derived> 8992 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause( 8993 OMPReverseOffloadClause *C) { 8994 llvm_unreachable("reverse_offload clause cannot appear in dependent context"); 8995 } 8996 8997 template <typename Derived> 8998 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause( 8999 OMPDynamicAllocatorsClause *C) { 9000 llvm_unreachable( 9001 "dynamic_allocators clause cannot appear in dependent context"); 9002 } 9003 9004 template <typename Derived> 9005 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause( 9006 OMPAtomicDefaultMemOrderClause *C) { 9007 llvm_unreachable( 9008 "atomic_default_mem_order clause cannot appear in dependent context"); 9009 } 9010 9011 template <typename Derived> 9012 OMPClause * 9013 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 9014 llvm::SmallVector<Expr *, 16> Vars; 9015 Vars.reserve(C->varlist_size()); 9016 for (auto *VE : C->varlists()) { 9017 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9018 if (EVar.isInvalid()) 9019 return nullptr; 9020 Vars.push_back(EVar.get()); 9021 } 9022 return getDerived().RebuildOMPPrivateClause( 9023 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9024 } 9025 9026 template <typename Derived> 9027 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 9028 OMPFirstprivateClause *C) { 9029 llvm::SmallVector<Expr *, 16> Vars; 9030 Vars.reserve(C->varlist_size()); 9031 for (auto *VE : C->varlists()) { 9032 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9033 if (EVar.isInvalid()) 9034 return nullptr; 9035 Vars.push_back(EVar.get()); 9036 } 9037 return getDerived().RebuildOMPFirstprivateClause( 9038 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9039 } 9040 9041 template <typename Derived> 9042 OMPClause * 9043 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 9044 llvm::SmallVector<Expr *, 16> Vars; 9045 Vars.reserve(C->varlist_size()); 9046 for (auto *VE : C->varlists()) { 9047 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9048 if (EVar.isInvalid()) 9049 return nullptr; 9050 Vars.push_back(EVar.get()); 9051 } 9052 return getDerived().RebuildOMPLastprivateClause( 9053 Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(), 9054 C->getLParenLoc(), C->getEndLoc()); 9055 } 9056 9057 template <typename Derived> 9058 OMPClause * 9059 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 9060 llvm::SmallVector<Expr *, 16> Vars; 9061 Vars.reserve(C->varlist_size()); 9062 for (auto *VE : C->varlists()) { 9063 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9064 if (EVar.isInvalid()) 9065 return nullptr; 9066 Vars.push_back(EVar.get()); 9067 } 9068 return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(), 9069 C->getLParenLoc(), C->getEndLoc()); 9070 } 9071 9072 template <typename Derived> 9073 OMPClause * 9074 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 9075 llvm::SmallVector<Expr *, 16> Vars; 9076 Vars.reserve(C->varlist_size()); 9077 for (auto *VE : C->varlists()) { 9078 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9079 if (EVar.isInvalid()) 9080 return nullptr; 9081 Vars.push_back(EVar.get()); 9082 } 9083 CXXScopeSpec ReductionIdScopeSpec; 9084 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9085 9086 DeclarationNameInfo NameInfo = C->getNameInfo(); 9087 if (NameInfo.getName()) { 9088 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9089 if (!NameInfo.getName()) 9090 return nullptr; 9091 } 9092 // Build a list of all UDR decls with the same names ranged by the Scopes. 9093 // The Scope boundary is a duplication of the previous decl. 9094 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9095 for (auto *E : C->reduction_ops()) { 9096 // Transform all the decls. 9097 if (E) { 9098 auto *ULE = cast<UnresolvedLookupExpr>(E); 9099 UnresolvedSet<8> Decls; 9100 for (auto *D : ULE->decls()) { 9101 NamedDecl *InstD = 9102 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9103 Decls.addDecl(InstD, InstD->getAccess()); 9104 } 9105 UnresolvedReductions.push_back( 9106 UnresolvedLookupExpr::Create( 9107 SemaRef.Context, /*NamingClass=*/nullptr, 9108 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 9109 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 9110 Decls.begin(), Decls.end())); 9111 } else 9112 UnresolvedReductions.push_back(nullptr); 9113 } 9114 return getDerived().RebuildOMPReductionClause( 9115 Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(), 9116 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(), 9117 ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9118 } 9119 9120 template <typename Derived> 9121 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause( 9122 OMPTaskReductionClause *C) { 9123 llvm::SmallVector<Expr *, 16> Vars; 9124 Vars.reserve(C->varlist_size()); 9125 for (auto *VE : C->varlists()) { 9126 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9127 if (EVar.isInvalid()) 9128 return nullptr; 9129 Vars.push_back(EVar.get()); 9130 } 9131 CXXScopeSpec ReductionIdScopeSpec; 9132 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9133 9134 DeclarationNameInfo NameInfo = C->getNameInfo(); 9135 if (NameInfo.getName()) { 9136 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9137 if (!NameInfo.getName()) 9138 return nullptr; 9139 } 9140 // Build a list of all UDR decls with the same names ranged by the Scopes. 9141 // The Scope boundary is a duplication of the previous decl. 9142 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9143 for (auto *E : C->reduction_ops()) { 9144 // Transform all the decls. 9145 if (E) { 9146 auto *ULE = cast<UnresolvedLookupExpr>(E); 9147 UnresolvedSet<8> Decls; 9148 for (auto *D : ULE->decls()) { 9149 NamedDecl *InstD = 9150 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9151 Decls.addDecl(InstD, InstD->getAccess()); 9152 } 9153 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9154 SemaRef.Context, /*NamingClass=*/nullptr, 9155 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9156 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9157 } else 9158 UnresolvedReductions.push_back(nullptr); 9159 } 9160 return getDerived().RebuildOMPTaskReductionClause( 9161 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9162 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9163 } 9164 9165 template <typename Derived> 9166 OMPClause * 9167 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) { 9168 llvm::SmallVector<Expr *, 16> Vars; 9169 Vars.reserve(C->varlist_size()); 9170 for (auto *VE : C->varlists()) { 9171 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9172 if (EVar.isInvalid()) 9173 return nullptr; 9174 Vars.push_back(EVar.get()); 9175 } 9176 CXXScopeSpec ReductionIdScopeSpec; 9177 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 9178 9179 DeclarationNameInfo NameInfo = C->getNameInfo(); 9180 if (NameInfo.getName()) { 9181 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9182 if (!NameInfo.getName()) 9183 return nullptr; 9184 } 9185 // Build a list of all UDR decls with the same names ranged by the Scopes. 9186 // The Scope boundary is a duplication of the previous decl. 9187 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 9188 for (auto *E : C->reduction_ops()) { 9189 // Transform all the decls. 9190 if (E) { 9191 auto *ULE = cast<UnresolvedLookupExpr>(E); 9192 UnresolvedSet<8> Decls; 9193 for (auto *D : ULE->decls()) { 9194 NamedDecl *InstD = 9195 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 9196 Decls.addDecl(InstD, InstD->getAccess()); 9197 } 9198 UnresolvedReductions.push_back(UnresolvedLookupExpr::Create( 9199 SemaRef.Context, /*NamingClass=*/nullptr, 9200 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo, 9201 /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end())); 9202 } else 9203 UnresolvedReductions.push_back(nullptr); 9204 } 9205 return getDerived().RebuildOMPInReductionClause( 9206 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9207 C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 9208 } 9209 9210 template <typename Derived> 9211 OMPClause * 9212 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 9213 llvm::SmallVector<Expr *, 16> Vars; 9214 Vars.reserve(C->varlist_size()); 9215 for (auto *VE : C->varlists()) { 9216 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9217 if (EVar.isInvalid()) 9218 return nullptr; 9219 Vars.push_back(EVar.get()); 9220 } 9221 ExprResult Step = getDerived().TransformExpr(C->getStep()); 9222 if (Step.isInvalid()) 9223 return nullptr; 9224 return getDerived().RebuildOMPLinearClause( 9225 Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(), 9226 C->getModifierLoc(), C->getColonLoc(), C->getEndLoc()); 9227 } 9228 9229 template <typename Derived> 9230 OMPClause * 9231 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 9232 llvm::SmallVector<Expr *, 16> Vars; 9233 Vars.reserve(C->varlist_size()); 9234 for (auto *VE : C->varlists()) { 9235 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9236 if (EVar.isInvalid()) 9237 return nullptr; 9238 Vars.push_back(EVar.get()); 9239 } 9240 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 9241 if (Alignment.isInvalid()) 9242 return nullptr; 9243 return getDerived().RebuildOMPAlignedClause( 9244 Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(), 9245 C->getColonLoc(), C->getEndLoc()); 9246 } 9247 9248 template <typename Derived> 9249 OMPClause * 9250 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 9251 llvm::SmallVector<Expr *, 16> Vars; 9252 Vars.reserve(C->varlist_size()); 9253 for (auto *VE : C->varlists()) { 9254 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9255 if (EVar.isInvalid()) 9256 return nullptr; 9257 Vars.push_back(EVar.get()); 9258 } 9259 return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(), 9260 C->getLParenLoc(), C->getEndLoc()); 9261 } 9262 9263 template <typename Derived> 9264 OMPClause * 9265 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 9266 llvm::SmallVector<Expr *, 16> Vars; 9267 Vars.reserve(C->varlist_size()); 9268 for (auto *VE : C->varlists()) { 9269 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9270 if (EVar.isInvalid()) 9271 return nullptr; 9272 Vars.push_back(EVar.get()); 9273 } 9274 return getDerived().RebuildOMPCopyprivateClause( 9275 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9276 } 9277 9278 template <typename Derived> 9279 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 9280 llvm::SmallVector<Expr *, 16> Vars; 9281 Vars.reserve(C->varlist_size()); 9282 for (auto *VE : C->varlists()) { 9283 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9284 if (EVar.isInvalid()) 9285 return nullptr; 9286 Vars.push_back(EVar.get()); 9287 } 9288 return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(), 9289 C->getLParenLoc(), C->getEndLoc()); 9290 } 9291 9292 template <typename Derived> 9293 OMPClause * 9294 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) { 9295 ExprResult E = getDerived().TransformExpr(C->getDepobj()); 9296 if (E.isInvalid()) 9297 return nullptr; 9298 return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(), 9299 C->getLParenLoc(), C->getEndLoc()); 9300 } 9301 9302 template <typename Derived> 9303 OMPClause * 9304 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 9305 llvm::SmallVector<Expr *, 16> Vars; 9306 Expr *DepModifier = C->getModifier(); 9307 if (DepModifier) { 9308 ExprResult DepModRes = getDerived().TransformExpr(DepModifier); 9309 if (DepModRes.isInvalid()) 9310 return nullptr; 9311 DepModifier = DepModRes.get(); 9312 } 9313 Vars.reserve(C->varlist_size()); 9314 for (auto *VE : C->varlists()) { 9315 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9316 if (EVar.isInvalid()) 9317 return nullptr; 9318 Vars.push_back(EVar.get()); 9319 } 9320 return getDerived().RebuildOMPDependClause( 9321 DepModifier, C->getDependencyKind(), C->getDependencyLoc(), 9322 C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(), 9323 C->getEndLoc()); 9324 } 9325 9326 template <typename Derived> 9327 OMPClause * 9328 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 9329 ExprResult E = getDerived().TransformExpr(C->getDevice()); 9330 if (E.isInvalid()) 9331 return nullptr; 9332 return getDerived().RebuildOMPDeviceClause( 9333 C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9334 C->getModifierLoc(), C->getEndLoc()); 9335 } 9336 9337 template <typename Derived, class T> 9338 bool transformOMPMappableExprListClause( 9339 TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C, 9340 llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec, 9341 DeclarationNameInfo &MapperIdInfo, 9342 llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) { 9343 // Transform expressions in the list. 9344 Vars.reserve(C->varlist_size()); 9345 for (auto *VE : C->varlists()) { 9346 ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE)); 9347 if (EVar.isInvalid()) 9348 return true; 9349 Vars.push_back(EVar.get()); 9350 } 9351 // Transform mapper scope specifier and identifier. 9352 NestedNameSpecifierLoc QualifierLoc; 9353 if (C->getMapperQualifierLoc()) { 9354 QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc( 9355 C->getMapperQualifierLoc()); 9356 if (!QualifierLoc) 9357 return true; 9358 } 9359 MapperIdScopeSpec.Adopt(QualifierLoc); 9360 MapperIdInfo = C->getMapperIdInfo(); 9361 if (MapperIdInfo.getName()) { 9362 MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo); 9363 if (!MapperIdInfo.getName()) 9364 return true; 9365 } 9366 // Build a list of all candidate OMPDeclareMapperDecls, which is provided by 9367 // the previous user-defined mapper lookup in dependent environment. 9368 for (auto *E : C->mapperlists()) { 9369 // Transform all the decls. 9370 if (E) { 9371 auto *ULE = cast<UnresolvedLookupExpr>(E); 9372 UnresolvedSet<8> Decls; 9373 for (auto *D : ULE->decls()) { 9374 NamedDecl *InstD = 9375 cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D)); 9376 Decls.addDecl(InstD, InstD->getAccess()); 9377 } 9378 UnresolvedMappers.push_back(UnresolvedLookupExpr::Create( 9379 TT.getSema().Context, /*NamingClass=*/nullptr, 9380 MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context), 9381 MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), 9382 Decls.end())); 9383 } else { 9384 UnresolvedMappers.push_back(nullptr); 9385 } 9386 } 9387 return false; 9388 } 9389 9390 template <typename Derived> 9391 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 9392 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9393 llvm::SmallVector<Expr *, 16> Vars; 9394 CXXScopeSpec MapperIdScopeSpec; 9395 DeclarationNameInfo MapperIdInfo; 9396 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9397 if (transformOMPMappableExprListClause<Derived, OMPMapClause>( 9398 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9399 return nullptr; 9400 return getDerived().RebuildOMPMapClause( 9401 C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec, 9402 MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(), 9403 C->getColonLoc(), Vars, Locs, UnresolvedMappers); 9404 } 9405 9406 template <typename Derived> 9407 OMPClause * 9408 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) { 9409 Expr *Allocator = C->getAllocator(); 9410 if (Allocator) { 9411 ExprResult AllocatorRes = getDerived().TransformExpr(Allocator); 9412 if (AllocatorRes.isInvalid()) 9413 return nullptr; 9414 Allocator = AllocatorRes.get(); 9415 } 9416 llvm::SmallVector<Expr *, 16> Vars; 9417 Vars.reserve(C->varlist_size()); 9418 for (auto *VE : C->varlists()) { 9419 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9420 if (EVar.isInvalid()) 9421 return nullptr; 9422 Vars.push_back(EVar.get()); 9423 } 9424 return getDerived().RebuildOMPAllocateClause( 9425 Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), 9426 C->getEndLoc()); 9427 } 9428 9429 template <typename Derived> 9430 OMPClause * 9431 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 9432 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 9433 if (E.isInvalid()) 9434 return nullptr; 9435 return getDerived().RebuildOMPNumTeamsClause( 9436 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9437 } 9438 9439 template <typename Derived> 9440 OMPClause * 9441 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 9442 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 9443 if (E.isInvalid()) 9444 return nullptr; 9445 return getDerived().RebuildOMPThreadLimitClause( 9446 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9447 } 9448 9449 template <typename Derived> 9450 OMPClause * 9451 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 9452 ExprResult E = getDerived().TransformExpr(C->getPriority()); 9453 if (E.isInvalid()) 9454 return nullptr; 9455 return getDerived().RebuildOMPPriorityClause( 9456 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9457 } 9458 9459 template <typename Derived> 9460 OMPClause * 9461 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 9462 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 9463 if (E.isInvalid()) 9464 return nullptr; 9465 return getDerived().RebuildOMPGrainsizeClause( 9466 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9467 } 9468 9469 template <typename Derived> 9470 OMPClause * 9471 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 9472 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 9473 if (E.isInvalid()) 9474 return nullptr; 9475 return getDerived().RebuildOMPNumTasksClause( 9476 E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9477 } 9478 9479 template <typename Derived> 9480 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 9481 ExprResult E = getDerived().TransformExpr(C->getHint()); 9482 if (E.isInvalid()) 9483 return nullptr; 9484 return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(), 9485 C->getLParenLoc(), C->getEndLoc()); 9486 } 9487 9488 template <typename Derived> 9489 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 9490 OMPDistScheduleClause *C) { 9491 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 9492 if (E.isInvalid()) 9493 return nullptr; 9494 return getDerived().RebuildOMPDistScheduleClause( 9495 C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(), 9496 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc()); 9497 } 9498 9499 template <typename Derived> 9500 OMPClause * 9501 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 9502 // Rebuild Defaultmap Clause since we need to invoke the checking of 9503 // defaultmap(none:variable-category) after template initialization. 9504 return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(), 9505 C->getDefaultmapKind(), 9506 C->getBeginLoc(), 9507 C->getLParenLoc(), 9508 C->getDefaultmapModifierLoc(), 9509 C->getDefaultmapKindLoc(), 9510 C->getEndLoc()); 9511 } 9512 9513 template <typename Derived> 9514 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 9515 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9516 llvm::SmallVector<Expr *, 16> Vars; 9517 CXXScopeSpec MapperIdScopeSpec; 9518 DeclarationNameInfo MapperIdInfo; 9519 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9520 if (transformOMPMappableExprListClause<Derived, OMPToClause>( 9521 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9522 return nullptr; 9523 return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo, 9524 Locs, UnresolvedMappers); 9525 } 9526 9527 template <typename Derived> 9528 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 9529 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9530 llvm::SmallVector<Expr *, 16> Vars; 9531 CXXScopeSpec MapperIdScopeSpec; 9532 DeclarationNameInfo MapperIdInfo; 9533 llvm::SmallVector<Expr *, 16> UnresolvedMappers; 9534 if (transformOMPMappableExprListClause<Derived, OMPFromClause>( 9535 *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers)) 9536 return nullptr; 9537 return getDerived().RebuildOMPFromClause( 9538 Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers); 9539 } 9540 9541 template <typename Derived> 9542 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 9543 OMPUseDevicePtrClause *C) { 9544 llvm::SmallVector<Expr *, 16> Vars; 9545 Vars.reserve(C->varlist_size()); 9546 for (auto *VE : C->varlists()) { 9547 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9548 if (EVar.isInvalid()) 9549 return nullptr; 9550 Vars.push_back(EVar.get()); 9551 } 9552 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9553 return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs); 9554 } 9555 9556 template <typename Derived> 9557 OMPClause * 9558 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 9559 llvm::SmallVector<Expr *, 16> Vars; 9560 Vars.reserve(C->varlist_size()); 9561 for (auto *VE : C->varlists()) { 9562 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9563 if (EVar.isInvalid()) 9564 return nullptr; 9565 Vars.push_back(EVar.get()); 9566 } 9567 OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9568 return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs); 9569 } 9570 9571 template <typename Derived> 9572 OMPClause * 9573 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) { 9574 llvm::SmallVector<Expr *, 16> Vars; 9575 Vars.reserve(C->varlist_size()); 9576 for (auto *VE : C->varlists()) { 9577 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9578 if (EVar.isInvalid()) 9579 return nullptr; 9580 Vars.push_back(EVar.get()); 9581 } 9582 return getDerived().RebuildOMPNontemporalClause( 9583 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9584 } 9585 9586 template <typename Derived> 9587 OMPClause * 9588 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) { 9589 llvm::SmallVector<Expr *, 16> Vars; 9590 Vars.reserve(C->varlist_size()); 9591 for (auto *VE : C->varlists()) { 9592 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9593 if (EVar.isInvalid()) 9594 return nullptr; 9595 Vars.push_back(EVar.get()); 9596 } 9597 return getDerived().RebuildOMPInclusiveClause( 9598 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9599 } 9600 9601 template <typename Derived> 9602 OMPClause * 9603 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) { 9604 llvm::SmallVector<Expr *, 16> Vars; 9605 Vars.reserve(C->varlist_size()); 9606 for (auto *VE : C->varlists()) { 9607 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 9608 if (EVar.isInvalid()) 9609 return nullptr; 9610 Vars.push_back(EVar.get()); 9611 } 9612 return getDerived().RebuildOMPExclusiveClause( 9613 Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc()); 9614 } 9615 9616 template <typename Derived> 9617 OMPClause * 9618 TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) { 9619 return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(), 9620 C->getBeginLoc(), C->getLParenLoc(), 9621 C->getEndLoc()); 9622 } 9623 9624 //===----------------------------------------------------------------------===// 9625 // Expression transformation 9626 //===----------------------------------------------------------------------===// 9627 template<typename Derived> 9628 ExprResult 9629 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) { 9630 return TransformExpr(E->getSubExpr()); 9631 } 9632 9633 template<typename Derived> 9634 ExprResult 9635 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 9636 if (!E->isTypeDependent()) 9637 return E; 9638 9639 return getDerived().RebuildPredefinedExpr(E->getLocation(), 9640 E->getIdentKind()); 9641 } 9642 9643 template<typename Derived> 9644 ExprResult 9645 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 9646 NestedNameSpecifierLoc QualifierLoc; 9647 if (E->getQualifierLoc()) { 9648 QualifierLoc 9649 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9650 if (!QualifierLoc) 9651 return ExprError(); 9652 } 9653 9654 ValueDecl *ND 9655 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 9656 E->getDecl())); 9657 if (!ND) 9658 return ExprError(); 9659 9660 NamedDecl *Found = ND; 9661 if (E->getFoundDecl() != E->getDecl()) { 9662 Found = cast_or_null<NamedDecl>( 9663 getDerived().TransformDecl(E->getLocation(), E->getFoundDecl())); 9664 if (!Found) 9665 return ExprError(); 9666 } 9667 9668 DeclarationNameInfo NameInfo = E->getNameInfo(); 9669 if (NameInfo.getName()) { 9670 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 9671 if (!NameInfo.getName()) 9672 return ExprError(); 9673 } 9674 9675 if (!getDerived().AlwaysRebuild() && 9676 QualifierLoc == E->getQualifierLoc() && 9677 ND == E->getDecl() && 9678 Found == E->getFoundDecl() && 9679 NameInfo.getName() == E->getDecl()->getDeclName() && 9680 !E->hasExplicitTemplateArgs()) { 9681 9682 // Mark it referenced in the new context regardless. 9683 // FIXME: this is a bit instantiation-specific. 9684 SemaRef.MarkDeclRefReferenced(E); 9685 9686 return E; 9687 } 9688 9689 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 9690 if (E->hasExplicitTemplateArgs()) { 9691 TemplateArgs = &TransArgs; 9692 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9693 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9694 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9695 E->getNumTemplateArgs(), 9696 TransArgs)) 9697 return ExprError(); 9698 } 9699 9700 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 9701 Found, TemplateArgs); 9702 } 9703 9704 template<typename Derived> 9705 ExprResult 9706 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 9707 return E; 9708 } 9709 9710 template <typename Derived> 9711 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral( 9712 FixedPointLiteral *E) { 9713 return E; 9714 } 9715 9716 template<typename Derived> 9717 ExprResult 9718 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 9719 return E; 9720 } 9721 9722 template<typename Derived> 9723 ExprResult 9724 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 9725 return E; 9726 } 9727 9728 template<typename Derived> 9729 ExprResult 9730 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 9731 return E; 9732 } 9733 9734 template<typename Derived> 9735 ExprResult 9736 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 9737 return E; 9738 } 9739 9740 template<typename Derived> 9741 ExprResult 9742 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 9743 if (FunctionDecl *FD = E->getDirectCallee()) 9744 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD); 9745 return SemaRef.MaybeBindToTemporary(E); 9746 } 9747 9748 template<typename Derived> 9749 ExprResult 9750 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 9751 ExprResult ControllingExpr = 9752 getDerived().TransformExpr(E->getControllingExpr()); 9753 if (ControllingExpr.isInvalid()) 9754 return ExprError(); 9755 9756 SmallVector<Expr *, 4> AssocExprs; 9757 SmallVector<TypeSourceInfo *, 4> AssocTypes; 9758 for (const GenericSelectionExpr::Association Assoc : E->associations()) { 9759 TypeSourceInfo *TSI = Assoc.getTypeSourceInfo(); 9760 if (TSI) { 9761 TypeSourceInfo *AssocType = getDerived().TransformType(TSI); 9762 if (!AssocType) 9763 return ExprError(); 9764 AssocTypes.push_back(AssocType); 9765 } else { 9766 AssocTypes.push_back(nullptr); 9767 } 9768 9769 ExprResult AssocExpr = 9770 getDerived().TransformExpr(Assoc.getAssociationExpr()); 9771 if (AssocExpr.isInvalid()) 9772 return ExprError(); 9773 AssocExprs.push_back(AssocExpr.get()); 9774 } 9775 9776 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 9777 E->getDefaultLoc(), 9778 E->getRParenLoc(), 9779 ControllingExpr.get(), 9780 AssocTypes, 9781 AssocExprs); 9782 } 9783 9784 template<typename Derived> 9785 ExprResult 9786 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 9787 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9788 if (SubExpr.isInvalid()) 9789 return ExprError(); 9790 9791 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9792 return E; 9793 9794 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 9795 E->getRParen()); 9796 } 9797 9798 /// The operand of a unary address-of operator has special rules: it's 9799 /// allowed to refer to a non-static member of a class even if there's no 'this' 9800 /// object available. 9801 template<typename Derived> 9802 ExprResult 9803 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 9804 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 9805 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 9806 else 9807 return getDerived().TransformExpr(E); 9808 } 9809 9810 template<typename Derived> 9811 ExprResult 9812 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 9813 ExprResult SubExpr; 9814 if (E->getOpcode() == UO_AddrOf) 9815 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 9816 else 9817 SubExpr = TransformExpr(E->getSubExpr()); 9818 if (SubExpr.isInvalid()) 9819 return ExprError(); 9820 9821 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 9822 return E; 9823 9824 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 9825 E->getOpcode(), 9826 SubExpr.get()); 9827 } 9828 9829 template<typename Derived> 9830 ExprResult 9831 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 9832 // Transform the type. 9833 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 9834 if (!Type) 9835 return ExprError(); 9836 9837 // Transform all of the components into components similar to what the 9838 // parser uses. 9839 // FIXME: It would be slightly more efficient in the non-dependent case to 9840 // just map FieldDecls, rather than requiring the rebuilder to look for 9841 // the fields again. However, __builtin_offsetof is rare enough in 9842 // template code that we don't care. 9843 bool ExprChanged = false; 9844 typedef Sema::OffsetOfComponent Component; 9845 SmallVector<Component, 4> Components; 9846 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 9847 const OffsetOfNode &ON = E->getComponent(I); 9848 Component Comp; 9849 Comp.isBrackets = true; 9850 Comp.LocStart = ON.getSourceRange().getBegin(); 9851 Comp.LocEnd = ON.getSourceRange().getEnd(); 9852 switch (ON.getKind()) { 9853 case OffsetOfNode::Array: { 9854 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 9855 ExprResult Index = getDerived().TransformExpr(FromIndex); 9856 if (Index.isInvalid()) 9857 return ExprError(); 9858 9859 ExprChanged = ExprChanged || Index.get() != FromIndex; 9860 Comp.isBrackets = true; 9861 Comp.U.E = Index.get(); 9862 break; 9863 } 9864 9865 case OffsetOfNode::Field: 9866 case OffsetOfNode::Identifier: 9867 Comp.isBrackets = false; 9868 Comp.U.IdentInfo = ON.getFieldName(); 9869 if (!Comp.U.IdentInfo) 9870 continue; 9871 9872 break; 9873 9874 case OffsetOfNode::Base: 9875 // Will be recomputed during the rebuild. 9876 continue; 9877 } 9878 9879 Components.push_back(Comp); 9880 } 9881 9882 // If nothing changed, retain the existing expression. 9883 if (!getDerived().AlwaysRebuild() && 9884 Type == E->getTypeSourceInfo() && 9885 !ExprChanged) 9886 return E; 9887 9888 // Build a new offsetof expression. 9889 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 9890 Components, E->getRParenLoc()); 9891 } 9892 9893 template<typename Derived> 9894 ExprResult 9895 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 9896 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 9897 "opaque value expression requires transformation"); 9898 return E; 9899 } 9900 9901 template<typename Derived> 9902 ExprResult 9903 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 9904 return E; 9905 } 9906 9907 template <typename Derived> 9908 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) { 9909 llvm::SmallVector<Expr *, 8> Children; 9910 bool Changed = false; 9911 for (Expr *C : E->subExpressions()) { 9912 ExprResult NewC = getDerived().TransformExpr(C); 9913 if (NewC.isInvalid()) 9914 return ExprError(); 9915 Children.push_back(NewC.get()); 9916 9917 Changed |= NewC.get() != C; 9918 } 9919 if (!getDerived().AlwaysRebuild() && !Changed) 9920 return E; 9921 return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(), 9922 Children); 9923 } 9924 9925 template<typename Derived> 9926 ExprResult 9927 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 9928 // Rebuild the syntactic form. The original syntactic form has 9929 // opaque-value expressions in it, so strip those away and rebuild 9930 // the result. This is a really awful way of doing this, but the 9931 // better solution (rebuilding the semantic expressions and 9932 // rebinding OVEs as necessary) doesn't work; we'd need 9933 // TreeTransform to not strip away implicit conversions. 9934 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 9935 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 9936 if (result.isInvalid()) return ExprError(); 9937 9938 // If that gives us a pseudo-object result back, the pseudo-object 9939 // expression must have been an lvalue-to-rvalue conversion which we 9940 // should reapply. 9941 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 9942 result = SemaRef.checkPseudoObjectRValue(result.get()); 9943 9944 return result; 9945 } 9946 9947 template<typename Derived> 9948 ExprResult 9949 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 9950 UnaryExprOrTypeTraitExpr *E) { 9951 if (E->isArgumentType()) { 9952 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 9953 9954 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9955 if (!NewT) 9956 return ExprError(); 9957 9958 if (!getDerived().AlwaysRebuild() && OldT == NewT) 9959 return E; 9960 9961 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 9962 E->getKind(), 9963 E->getSourceRange()); 9964 } 9965 9966 // C++0x [expr.sizeof]p1: 9967 // The operand is either an expression, which is an unevaluated operand 9968 // [...] 9969 EnterExpressionEvaluationContext Unevaluated( 9970 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9971 Sema::ReuseLambdaContextDecl); 9972 9973 // Try to recover if we have something like sizeof(T::X) where X is a type. 9974 // Notably, there must be *exactly* one set of parens if X is a type. 9975 TypeSourceInfo *RecoveryTSI = nullptr; 9976 ExprResult SubExpr; 9977 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 9978 if (auto *DRE = 9979 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 9980 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 9981 PE, DRE, false, &RecoveryTSI); 9982 else 9983 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 9984 9985 if (RecoveryTSI) { 9986 return getDerived().RebuildUnaryExprOrTypeTrait( 9987 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 9988 } else if (SubExpr.isInvalid()) 9989 return ExprError(); 9990 9991 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 9992 return E; 9993 9994 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 9995 E->getOperatorLoc(), 9996 E->getKind(), 9997 E->getSourceRange()); 9998 } 9999 10000 template<typename Derived> 10001 ExprResult 10002 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 10003 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10004 if (LHS.isInvalid()) 10005 return ExprError(); 10006 10007 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10008 if (RHS.isInvalid()) 10009 return ExprError(); 10010 10011 10012 if (!getDerived().AlwaysRebuild() && 10013 LHS.get() == E->getLHS() && 10014 RHS.get() == E->getRHS()) 10015 return E; 10016 10017 return getDerived().RebuildArraySubscriptExpr( 10018 LHS.get(), 10019 /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc()); 10020 } 10021 10022 template <typename Derived> 10023 ExprResult 10024 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 10025 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10026 if (Base.isInvalid()) 10027 return ExprError(); 10028 10029 ExprResult LowerBound; 10030 if (E->getLowerBound()) { 10031 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 10032 if (LowerBound.isInvalid()) 10033 return ExprError(); 10034 } 10035 10036 ExprResult Length; 10037 if (E->getLength()) { 10038 Length = getDerived().TransformExpr(E->getLength()); 10039 if (Length.isInvalid()) 10040 return ExprError(); 10041 } 10042 10043 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 10044 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 10045 return E; 10046 10047 return getDerived().RebuildOMPArraySectionExpr( 10048 Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(), 10049 Length.get(), E->getRBracketLoc()); 10050 } 10051 10052 template <typename Derived> 10053 ExprResult 10054 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) { 10055 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10056 if (Base.isInvalid()) 10057 return ExprError(); 10058 10059 SmallVector<Expr *, 4> Dims; 10060 bool ErrorFound = false; 10061 for (Expr *Dim : E->getDimensions()) { 10062 ExprResult DimRes = getDerived().TransformExpr(Dim); 10063 if (DimRes.isInvalid()) { 10064 ErrorFound = true; 10065 continue; 10066 } 10067 Dims.push_back(DimRes.get()); 10068 } 10069 10070 if (ErrorFound) 10071 return ExprError(); 10072 return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(), 10073 E->getRParenLoc(), Dims, 10074 E->getBracketsRanges()); 10075 } 10076 10077 template <typename Derived> 10078 ExprResult 10079 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) { 10080 unsigned NumIterators = E->numOfIterators(); 10081 SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators); 10082 10083 bool ErrorFound = false; 10084 bool NeedToRebuild = getDerived().AlwaysRebuild(); 10085 for (unsigned I = 0; I < NumIterators; ++I) { 10086 auto *D = cast<VarDecl>(E->getIteratorDecl(I)); 10087 Data[I].DeclIdent = D->getIdentifier(); 10088 Data[I].DeclIdentLoc = D->getLocation(); 10089 if (D->getLocation() == D->getBeginLoc()) { 10090 assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) && 10091 "Implicit type must be int."); 10092 } else { 10093 TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo()); 10094 QualType DeclTy = getDerived().TransformType(D->getType()); 10095 Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI); 10096 } 10097 OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I); 10098 ExprResult Begin = getDerived().TransformExpr(Range.Begin); 10099 ExprResult End = getDerived().TransformExpr(Range.End); 10100 ExprResult Step = getDerived().TransformExpr(Range.Step); 10101 ErrorFound = ErrorFound || 10102 !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() && 10103 !Data[I].Type.get().isNull())) || 10104 Begin.isInvalid() || End.isInvalid() || Step.isInvalid(); 10105 if (ErrorFound) 10106 continue; 10107 Data[I].Range.Begin = Begin.get(); 10108 Data[I].Range.End = End.get(); 10109 Data[I].Range.Step = Step.get(); 10110 Data[I].AssignLoc = E->getAssignLoc(I); 10111 Data[I].ColonLoc = E->getColonLoc(I); 10112 Data[I].SecColonLoc = E->getSecondColonLoc(I); 10113 NeedToRebuild = 10114 NeedToRebuild || 10115 (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() != 10116 D->getType().getTypePtrOrNull()) || 10117 Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End || 10118 Range.Step != Data[I].Range.Step; 10119 } 10120 if (ErrorFound) 10121 return ExprError(); 10122 if (!NeedToRebuild) 10123 return E; 10124 10125 ExprResult Res = getDerived().RebuildOMPIteratorExpr( 10126 E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data); 10127 if (!Res.isUsable()) 10128 return Res; 10129 auto *IE = cast<OMPIteratorExpr>(Res.get()); 10130 for (unsigned I = 0; I < NumIterators; ++I) 10131 getDerived().transformedLocalDecl(E->getIteratorDecl(I), 10132 IE->getIteratorDecl(I)); 10133 return Res; 10134 } 10135 10136 template<typename Derived> 10137 ExprResult 10138 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 10139 // Transform the callee. 10140 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10141 if (Callee.isInvalid()) 10142 return ExprError(); 10143 10144 // Transform arguments. 10145 bool ArgChanged = false; 10146 SmallVector<Expr*, 8> Args; 10147 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10148 &ArgChanged)) 10149 return ExprError(); 10150 10151 if (!getDerived().AlwaysRebuild() && 10152 Callee.get() == E->getCallee() && 10153 !ArgChanged) 10154 return SemaRef.MaybeBindToTemporary(E); 10155 10156 // FIXME: Wrong source location information for the '('. 10157 SourceLocation FakeLParenLoc 10158 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10159 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10160 Args, 10161 E->getRParenLoc()); 10162 } 10163 10164 template<typename Derived> 10165 ExprResult 10166 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 10167 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10168 if (Base.isInvalid()) 10169 return ExprError(); 10170 10171 NestedNameSpecifierLoc QualifierLoc; 10172 if (E->hasQualifier()) { 10173 QualifierLoc 10174 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10175 10176 if (!QualifierLoc) 10177 return ExprError(); 10178 } 10179 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10180 10181 ValueDecl *Member 10182 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 10183 E->getMemberDecl())); 10184 if (!Member) 10185 return ExprError(); 10186 10187 NamedDecl *FoundDecl = E->getFoundDecl(); 10188 if (FoundDecl == E->getMemberDecl()) { 10189 FoundDecl = Member; 10190 } else { 10191 FoundDecl = cast_or_null<NamedDecl>( 10192 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 10193 if (!FoundDecl) 10194 return ExprError(); 10195 } 10196 10197 if (!getDerived().AlwaysRebuild() && 10198 Base.get() == E->getBase() && 10199 QualifierLoc == E->getQualifierLoc() && 10200 Member == E->getMemberDecl() && 10201 FoundDecl == E->getFoundDecl() && 10202 !E->hasExplicitTemplateArgs()) { 10203 10204 // Mark it referenced in the new context regardless. 10205 // FIXME: this is a bit instantiation-specific. 10206 SemaRef.MarkMemberReferenced(E); 10207 10208 return E; 10209 } 10210 10211 TemplateArgumentListInfo TransArgs; 10212 if (E->hasExplicitTemplateArgs()) { 10213 TransArgs.setLAngleLoc(E->getLAngleLoc()); 10214 TransArgs.setRAngleLoc(E->getRAngleLoc()); 10215 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10216 E->getNumTemplateArgs(), 10217 TransArgs)) 10218 return ExprError(); 10219 } 10220 10221 // FIXME: Bogus source location for the operator 10222 SourceLocation FakeOperatorLoc = 10223 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 10224 10225 // FIXME: to do this check properly, we will need to preserve the 10226 // first-qualifier-in-scope here, just in case we had a dependent 10227 // base (and therefore couldn't do the check) and a 10228 // nested-name-qualifier (and therefore could do the lookup). 10229 NamedDecl *FirstQualifierInScope = nullptr; 10230 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 10231 if (MemberNameInfo.getName()) { 10232 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 10233 if (!MemberNameInfo.getName()) 10234 return ExprError(); 10235 } 10236 10237 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 10238 E->isArrow(), 10239 QualifierLoc, 10240 TemplateKWLoc, 10241 MemberNameInfo, 10242 Member, 10243 FoundDecl, 10244 (E->hasExplicitTemplateArgs() 10245 ? &TransArgs : nullptr), 10246 FirstQualifierInScope); 10247 } 10248 10249 template<typename Derived> 10250 ExprResult 10251 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 10252 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10253 if (LHS.isInvalid()) 10254 return ExprError(); 10255 10256 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10257 if (RHS.isInvalid()) 10258 return ExprError(); 10259 10260 if (!getDerived().AlwaysRebuild() && 10261 LHS.get() == E->getLHS() && 10262 RHS.get() == E->getRHS()) 10263 return E; 10264 10265 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10266 getSema().FPFeatures = E->getFPFeatures(); 10267 10268 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 10269 LHS.get(), RHS.get()); 10270 } 10271 10272 template <typename Derived> 10273 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator( 10274 CXXRewrittenBinaryOperator *E) { 10275 CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm(); 10276 10277 ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS)); 10278 if (LHS.isInvalid()) 10279 return ExprError(); 10280 10281 ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS)); 10282 if (RHS.isInvalid()) 10283 return ExprError(); 10284 10285 if (!getDerived().AlwaysRebuild() && 10286 LHS.get() == Decomp.LHS && 10287 RHS.get() == Decomp.RHS) 10288 return E; 10289 10290 // Extract the already-resolved callee declarations so that we can restrict 10291 // ourselves to using them as the unqualified lookup results when rebuilding. 10292 UnresolvedSet<2> UnqualLookups; 10293 Expr *PossibleBinOps[] = {E->getSemanticForm(), 10294 const_cast<Expr *>(Decomp.InnerBinOp)}; 10295 for (Expr *PossibleBinOp : PossibleBinOps) { 10296 auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit()); 10297 if (!Op) 10298 continue; 10299 auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit()); 10300 if (!Callee || isa<CXXMethodDecl>(Callee->getDecl())) 10301 continue; 10302 10303 // Transform the callee in case we built a call to a local extern 10304 // declaration. 10305 NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl( 10306 E->getOperatorLoc(), Callee->getFoundDecl())); 10307 if (!Found) 10308 return ExprError(); 10309 UnqualLookups.addDecl(Found); 10310 } 10311 10312 return getDerived().RebuildCXXRewrittenBinaryOperator( 10313 E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get()); 10314 } 10315 10316 template<typename Derived> 10317 ExprResult 10318 TreeTransform<Derived>::TransformCompoundAssignOperator( 10319 CompoundAssignOperator *E) { 10320 return getDerived().TransformBinaryOperator(E); 10321 } 10322 10323 template<typename Derived> 10324 ExprResult TreeTransform<Derived>:: 10325 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 10326 // Just rebuild the common and RHS expressions and see whether we 10327 // get any changes. 10328 10329 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 10330 if (commonExpr.isInvalid()) 10331 return ExprError(); 10332 10333 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 10334 if (rhs.isInvalid()) 10335 return ExprError(); 10336 10337 if (!getDerived().AlwaysRebuild() && 10338 commonExpr.get() == e->getCommon() && 10339 rhs.get() == e->getFalseExpr()) 10340 return e; 10341 10342 return getDerived().RebuildConditionalOperator(commonExpr.get(), 10343 e->getQuestionLoc(), 10344 nullptr, 10345 e->getColonLoc(), 10346 rhs.get()); 10347 } 10348 10349 template<typename Derived> 10350 ExprResult 10351 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 10352 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10353 if (Cond.isInvalid()) 10354 return ExprError(); 10355 10356 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10357 if (LHS.isInvalid()) 10358 return ExprError(); 10359 10360 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10361 if (RHS.isInvalid()) 10362 return ExprError(); 10363 10364 if (!getDerived().AlwaysRebuild() && 10365 Cond.get() == E->getCond() && 10366 LHS.get() == E->getLHS() && 10367 RHS.get() == E->getRHS()) 10368 return E; 10369 10370 return getDerived().RebuildConditionalOperator(Cond.get(), 10371 E->getQuestionLoc(), 10372 LHS.get(), 10373 E->getColonLoc(), 10374 RHS.get()); 10375 } 10376 10377 template<typename Derived> 10378 ExprResult 10379 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 10380 // Implicit casts are eliminated during transformation, since they 10381 // will be recomputed by semantic analysis after transformation. 10382 return getDerived().TransformExpr(E->getSubExprAsWritten()); 10383 } 10384 10385 template<typename Derived> 10386 ExprResult 10387 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 10388 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10389 if (!Type) 10390 return ExprError(); 10391 10392 ExprResult SubExpr 10393 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10394 if (SubExpr.isInvalid()) 10395 return ExprError(); 10396 10397 if (!getDerived().AlwaysRebuild() && 10398 Type == E->getTypeInfoAsWritten() && 10399 SubExpr.get() == E->getSubExpr()) 10400 return E; 10401 10402 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 10403 Type, 10404 E->getRParenLoc(), 10405 SubExpr.get()); 10406 } 10407 10408 template<typename Derived> 10409 ExprResult 10410 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 10411 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 10412 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 10413 if (!NewT) 10414 return ExprError(); 10415 10416 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 10417 if (Init.isInvalid()) 10418 return ExprError(); 10419 10420 if (!getDerived().AlwaysRebuild() && 10421 OldT == NewT && 10422 Init.get() == E->getInitializer()) 10423 return SemaRef.MaybeBindToTemporary(E); 10424 10425 // Note: the expression type doesn't necessarily match the 10426 // type-as-written, but that's okay, because it should always be 10427 // derivable from the initializer. 10428 10429 return getDerived().RebuildCompoundLiteralExpr( 10430 E->getLParenLoc(), NewT, 10431 /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get()); 10432 } 10433 10434 template<typename Derived> 10435 ExprResult 10436 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 10437 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10438 if (Base.isInvalid()) 10439 return ExprError(); 10440 10441 if (!getDerived().AlwaysRebuild() && 10442 Base.get() == E->getBase()) 10443 return E; 10444 10445 // FIXME: Bad source location 10446 SourceLocation FakeOperatorLoc = 10447 SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc()); 10448 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 10449 E->getAccessorLoc(), 10450 E->getAccessor()); 10451 } 10452 10453 template<typename Derived> 10454 ExprResult 10455 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 10456 if (InitListExpr *Syntactic = E->getSyntacticForm()) 10457 E = Syntactic; 10458 10459 bool InitChanged = false; 10460 10461 EnterExpressionEvaluationContext Context( 10462 getSema(), EnterExpressionEvaluationContext::InitList); 10463 10464 SmallVector<Expr*, 4> Inits; 10465 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 10466 Inits, &InitChanged)) 10467 return ExprError(); 10468 10469 if (!getDerived().AlwaysRebuild() && !InitChanged) { 10470 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 10471 // in some cases. We can't reuse it in general, because the syntactic and 10472 // semantic forms are linked, and we can't know that semantic form will 10473 // match even if the syntactic form does. 10474 } 10475 10476 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 10477 E->getRBraceLoc()); 10478 } 10479 10480 template<typename Derived> 10481 ExprResult 10482 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 10483 Designation Desig; 10484 10485 // transform the initializer value 10486 ExprResult Init = getDerived().TransformExpr(E->getInit()); 10487 if (Init.isInvalid()) 10488 return ExprError(); 10489 10490 // transform the designators. 10491 SmallVector<Expr*, 4> ArrayExprs; 10492 bool ExprChanged = false; 10493 for (const DesignatedInitExpr::Designator &D : E->designators()) { 10494 if (D.isFieldDesignator()) { 10495 Desig.AddDesignator(Designator::getField(D.getFieldName(), 10496 D.getDotLoc(), 10497 D.getFieldLoc())); 10498 if (D.getField()) { 10499 FieldDecl *Field = cast_or_null<FieldDecl>( 10500 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 10501 if (Field != D.getField()) 10502 // Rebuild the expression when the transformed FieldDecl is 10503 // different to the already assigned FieldDecl. 10504 ExprChanged = true; 10505 } else { 10506 // Ensure that the designator expression is rebuilt when there isn't 10507 // a resolved FieldDecl in the designator as we don't want to assign 10508 // a FieldDecl to a pattern designator that will be instantiated again. 10509 ExprChanged = true; 10510 } 10511 continue; 10512 } 10513 10514 if (D.isArrayDesignator()) { 10515 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 10516 if (Index.isInvalid()) 10517 return ExprError(); 10518 10519 Desig.AddDesignator( 10520 Designator::getArray(Index.get(), D.getLBracketLoc())); 10521 10522 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 10523 ArrayExprs.push_back(Index.get()); 10524 continue; 10525 } 10526 10527 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 10528 ExprResult Start 10529 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 10530 if (Start.isInvalid()) 10531 return ExprError(); 10532 10533 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 10534 if (End.isInvalid()) 10535 return ExprError(); 10536 10537 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 10538 End.get(), 10539 D.getLBracketLoc(), 10540 D.getEllipsisLoc())); 10541 10542 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 10543 End.get() != E->getArrayRangeEnd(D); 10544 10545 ArrayExprs.push_back(Start.get()); 10546 ArrayExprs.push_back(End.get()); 10547 } 10548 10549 if (!getDerived().AlwaysRebuild() && 10550 Init.get() == E->getInit() && 10551 !ExprChanged) 10552 return E; 10553 10554 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 10555 E->getEqualOrColonLoc(), 10556 E->usesGNUSyntax(), Init.get()); 10557 } 10558 10559 // Seems that if TransformInitListExpr() only works on the syntactic form of an 10560 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 10561 template<typename Derived> 10562 ExprResult 10563 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 10564 DesignatedInitUpdateExpr *E) { 10565 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 10566 "initializer"); 10567 return ExprError(); 10568 } 10569 10570 template<typename Derived> 10571 ExprResult 10572 TreeTransform<Derived>::TransformNoInitExpr( 10573 NoInitExpr *E) { 10574 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 10575 return ExprError(); 10576 } 10577 10578 template<typename Derived> 10579 ExprResult 10580 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 10581 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 10582 return ExprError(); 10583 } 10584 10585 template<typename Derived> 10586 ExprResult 10587 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 10588 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 10589 return ExprError(); 10590 } 10591 10592 template<typename Derived> 10593 ExprResult 10594 TreeTransform<Derived>::TransformImplicitValueInitExpr( 10595 ImplicitValueInitExpr *E) { 10596 TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName()); 10597 10598 // FIXME: Will we ever have proper type location here? Will we actually 10599 // need to transform the type? 10600 QualType T = getDerived().TransformType(E->getType()); 10601 if (T.isNull()) 10602 return ExprError(); 10603 10604 if (!getDerived().AlwaysRebuild() && 10605 T == E->getType()) 10606 return E; 10607 10608 return getDerived().RebuildImplicitValueInitExpr(T); 10609 } 10610 10611 template<typename Derived> 10612 ExprResult 10613 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 10614 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 10615 if (!TInfo) 10616 return ExprError(); 10617 10618 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 10619 if (SubExpr.isInvalid()) 10620 return ExprError(); 10621 10622 if (!getDerived().AlwaysRebuild() && 10623 TInfo == E->getWrittenTypeInfo() && 10624 SubExpr.get() == E->getSubExpr()) 10625 return E; 10626 10627 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 10628 TInfo, E->getRParenLoc()); 10629 } 10630 10631 template<typename Derived> 10632 ExprResult 10633 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 10634 bool ArgumentChanged = false; 10635 SmallVector<Expr*, 4> Inits; 10636 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 10637 &ArgumentChanged)) 10638 return ExprError(); 10639 10640 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 10641 Inits, 10642 E->getRParenLoc()); 10643 } 10644 10645 /// Transform an address-of-label expression. 10646 /// 10647 /// By default, the transformation of an address-of-label expression always 10648 /// rebuilds the expression, so that the label identifier can be resolved to 10649 /// the corresponding label statement by semantic analysis. 10650 template<typename Derived> 10651 ExprResult 10652 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 10653 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 10654 E->getLabel()); 10655 if (!LD) 10656 return ExprError(); 10657 10658 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 10659 cast<LabelDecl>(LD)); 10660 } 10661 10662 template<typename Derived> 10663 ExprResult 10664 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 10665 SemaRef.ActOnStartStmtExpr(); 10666 StmtResult SubStmt 10667 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 10668 if (SubStmt.isInvalid()) { 10669 SemaRef.ActOnStmtExprError(); 10670 return ExprError(); 10671 } 10672 10673 unsigned OldDepth = E->getTemplateDepth(); 10674 unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth); 10675 10676 if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth && 10677 SubStmt.get() == E->getSubStmt()) { 10678 // Calling this an 'error' is unintuitive, but it does the right thing. 10679 SemaRef.ActOnStmtExprError(); 10680 return SemaRef.MaybeBindToTemporary(E); 10681 } 10682 10683 return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(), 10684 E->getRParenLoc(), NewDepth); 10685 } 10686 10687 template<typename Derived> 10688 ExprResult 10689 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 10690 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 10691 if (Cond.isInvalid()) 10692 return ExprError(); 10693 10694 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 10695 if (LHS.isInvalid()) 10696 return ExprError(); 10697 10698 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 10699 if (RHS.isInvalid()) 10700 return ExprError(); 10701 10702 if (!getDerived().AlwaysRebuild() && 10703 Cond.get() == E->getCond() && 10704 LHS.get() == E->getLHS() && 10705 RHS.get() == E->getRHS()) 10706 return E; 10707 10708 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 10709 Cond.get(), LHS.get(), RHS.get(), 10710 E->getRParenLoc()); 10711 } 10712 10713 template<typename Derived> 10714 ExprResult 10715 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 10716 return E; 10717 } 10718 10719 template<typename Derived> 10720 ExprResult 10721 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 10722 switch (E->getOperator()) { 10723 case OO_New: 10724 case OO_Delete: 10725 case OO_Array_New: 10726 case OO_Array_Delete: 10727 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 10728 10729 case OO_Call: { 10730 // This is a call to an object's operator(). 10731 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 10732 10733 // Transform the object itself. 10734 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 10735 if (Object.isInvalid()) 10736 return ExprError(); 10737 10738 // FIXME: Poor location information 10739 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 10740 static_cast<Expr *>(Object.get())->getEndLoc()); 10741 10742 // Transform the call arguments. 10743 SmallVector<Expr*, 8> Args; 10744 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 10745 Args)) 10746 return ExprError(); 10747 10748 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args, 10749 E->getEndLoc()); 10750 } 10751 10752 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 10753 case OO_##Name: 10754 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 10755 #include "clang/Basic/OperatorKinds.def" 10756 case OO_Subscript: 10757 // Handled below. 10758 break; 10759 10760 case OO_Conditional: 10761 llvm_unreachable("conditional operator is not actually overloadable"); 10762 10763 case OO_None: 10764 case NUM_OVERLOADED_OPERATORS: 10765 llvm_unreachable("not an overloaded operator?"); 10766 } 10767 10768 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10769 if (Callee.isInvalid()) 10770 return ExprError(); 10771 10772 ExprResult First; 10773 if (E->getOperator() == OO_Amp) 10774 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 10775 else 10776 First = getDerived().TransformExpr(E->getArg(0)); 10777 if (First.isInvalid()) 10778 return ExprError(); 10779 10780 ExprResult Second; 10781 if (E->getNumArgs() == 2) { 10782 Second = getDerived().TransformExpr(E->getArg(1)); 10783 if (Second.isInvalid()) 10784 return ExprError(); 10785 } 10786 10787 if (!getDerived().AlwaysRebuild() && 10788 Callee.get() == E->getCallee() && 10789 First.get() == E->getArg(0) && 10790 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 10791 return SemaRef.MaybeBindToTemporary(E); 10792 10793 Sema::FPFeaturesStateRAII FPFeaturesState(getSema()); 10794 getSema().FPFeatures = E->getFPFeatures(); 10795 10796 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 10797 E->getOperatorLoc(), 10798 Callee.get(), 10799 First.get(), 10800 Second.get()); 10801 } 10802 10803 template<typename Derived> 10804 ExprResult 10805 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 10806 return getDerived().TransformCallExpr(E); 10807 } 10808 10809 template <typename Derived> 10810 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) { 10811 bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function && 10812 getSema().CurContext != E->getParentContext(); 10813 10814 if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc) 10815 return E; 10816 10817 return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(), 10818 E->getEndLoc(), 10819 getSema().CurContext); 10820 } 10821 10822 template<typename Derived> 10823 ExprResult 10824 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 10825 // Transform the callee. 10826 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 10827 if (Callee.isInvalid()) 10828 return ExprError(); 10829 10830 // Transform exec config. 10831 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 10832 if (EC.isInvalid()) 10833 return ExprError(); 10834 10835 // Transform arguments. 10836 bool ArgChanged = false; 10837 SmallVector<Expr*, 8> Args; 10838 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10839 &ArgChanged)) 10840 return ExprError(); 10841 10842 if (!getDerived().AlwaysRebuild() && 10843 Callee.get() == E->getCallee() && 10844 !ArgChanged) 10845 return SemaRef.MaybeBindToTemporary(E); 10846 10847 // FIXME: Wrong source location information for the '('. 10848 SourceLocation FakeLParenLoc 10849 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 10850 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 10851 Args, 10852 E->getRParenLoc(), EC.get()); 10853 } 10854 10855 template<typename Derived> 10856 ExprResult 10857 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 10858 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 10859 if (!Type) 10860 return ExprError(); 10861 10862 ExprResult SubExpr 10863 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10864 if (SubExpr.isInvalid()) 10865 return ExprError(); 10866 10867 if (!getDerived().AlwaysRebuild() && 10868 Type == E->getTypeInfoAsWritten() && 10869 SubExpr.get() == E->getSubExpr()) 10870 return E; 10871 return getDerived().RebuildCXXNamedCastExpr( 10872 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 10873 Type, E->getAngleBrackets().getEnd(), 10874 // FIXME. this should be '(' location 10875 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 10876 } 10877 10878 template<typename Derived> 10879 ExprResult 10880 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) { 10881 TypeSourceInfo *TSI = 10882 getDerived().TransformType(BCE->getTypeInfoAsWritten()); 10883 if (!TSI) 10884 return ExprError(); 10885 10886 ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr()); 10887 if (Sub.isInvalid()) 10888 return ExprError(); 10889 10890 return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI, 10891 Sub.get(), BCE->getEndLoc()); 10892 } 10893 10894 template<typename Derived> 10895 ExprResult 10896 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 10897 return getDerived().TransformCXXNamedCastExpr(E); 10898 } 10899 10900 template<typename Derived> 10901 ExprResult 10902 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 10903 return getDerived().TransformCXXNamedCastExpr(E); 10904 } 10905 10906 template<typename Derived> 10907 ExprResult 10908 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 10909 CXXReinterpretCastExpr *E) { 10910 return getDerived().TransformCXXNamedCastExpr(E); 10911 } 10912 10913 template<typename Derived> 10914 ExprResult 10915 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 10916 return getDerived().TransformCXXNamedCastExpr(E); 10917 } 10918 10919 template<typename Derived> 10920 ExprResult 10921 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 10922 CXXFunctionalCastExpr *E) { 10923 TypeSourceInfo *Type = 10924 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 10925 if (!Type) 10926 return ExprError(); 10927 10928 ExprResult SubExpr 10929 = getDerived().TransformExpr(E->getSubExprAsWritten()); 10930 if (SubExpr.isInvalid()) 10931 return ExprError(); 10932 10933 if (!getDerived().AlwaysRebuild() && 10934 Type == E->getTypeInfoAsWritten() && 10935 SubExpr.get() == E->getSubExpr()) 10936 return E; 10937 10938 return getDerived().RebuildCXXFunctionalCastExpr(Type, 10939 E->getLParenLoc(), 10940 SubExpr.get(), 10941 E->getRParenLoc(), 10942 E->isListInitialization()); 10943 } 10944 10945 template<typename Derived> 10946 ExprResult 10947 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 10948 if (E->isTypeOperand()) { 10949 TypeSourceInfo *TInfo 10950 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10951 if (!TInfo) 10952 return ExprError(); 10953 10954 if (!getDerived().AlwaysRebuild() && 10955 TInfo == E->getTypeOperandSourceInfo()) 10956 return E; 10957 10958 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10959 TInfo, E->getEndLoc()); 10960 } 10961 10962 // We don't know whether the subexpression is potentially evaluated until 10963 // after we perform semantic analysis. We speculatively assume it is 10964 // unevaluated; it will get fixed later if the subexpression is in fact 10965 // potentially evaluated. 10966 EnterExpressionEvaluationContext Unevaluated( 10967 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 10968 Sema::ReuseLambdaContextDecl); 10969 10970 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 10971 if (SubExpr.isInvalid()) 10972 return ExprError(); 10973 10974 if (!getDerived().AlwaysRebuild() && 10975 SubExpr.get() == E->getExprOperand()) 10976 return E; 10977 10978 return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(), 10979 SubExpr.get(), E->getEndLoc()); 10980 } 10981 10982 template<typename Derived> 10983 ExprResult 10984 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 10985 if (E->isTypeOperand()) { 10986 TypeSourceInfo *TInfo 10987 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 10988 if (!TInfo) 10989 return ExprError(); 10990 10991 if (!getDerived().AlwaysRebuild() && 10992 TInfo == E->getTypeOperandSourceInfo()) 10993 return E; 10994 10995 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 10996 TInfo, E->getEndLoc()); 10997 } 10998 10999 EnterExpressionEvaluationContext Unevaluated( 11000 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11001 11002 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 11003 if (SubExpr.isInvalid()) 11004 return ExprError(); 11005 11006 if (!getDerived().AlwaysRebuild() && 11007 SubExpr.get() == E->getExprOperand()) 11008 return E; 11009 11010 return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(), 11011 SubExpr.get(), E->getEndLoc()); 11012 } 11013 11014 template<typename Derived> 11015 ExprResult 11016 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 11017 return E; 11018 } 11019 11020 template<typename Derived> 11021 ExprResult 11022 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 11023 CXXNullPtrLiteralExpr *E) { 11024 return E; 11025 } 11026 11027 template<typename Derived> 11028 ExprResult 11029 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 11030 QualType T = getSema().getCurrentThisType(); 11031 11032 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 11033 // Mark it referenced in the new context regardless. 11034 // FIXME: this is a bit instantiation-specific. 11035 getSema().MarkThisReferenced(E); 11036 return E; 11037 } 11038 11039 return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit()); 11040 } 11041 11042 template<typename Derived> 11043 ExprResult 11044 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 11045 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11046 if (SubExpr.isInvalid()) 11047 return ExprError(); 11048 11049 if (!getDerived().AlwaysRebuild() && 11050 SubExpr.get() == E->getSubExpr()) 11051 return E; 11052 11053 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 11054 E->isThrownVariableInScope()); 11055 } 11056 11057 template<typename Derived> 11058 ExprResult 11059 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 11060 ParmVarDecl *Param = cast_or_null<ParmVarDecl>( 11061 getDerived().TransformDecl(E->getBeginLoc(), E->getParam())); 11062 if (!Param) 11063 return ExprError(); 11064 11065 if (!getDerived().AlwaysRebuild() && Param == E->getParam() && 11066 E->getUsedContext() == SemaRef.CurContext) 11067 return E; 11068 11069 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 11070 } 11071 11072 template<typename Derived> 11073 ExprResult 11074 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 11075 FieldDecl *Field = cast_or_null<FieldDecl>( 11076 getDerived().TransformDecl(E->getBeginLoc(), E->getField())); 11077 if (!Field) 11078 return ExprError(); 11079 11080 if (!getDerived().AlwaysRebuild() && Field == E->getField() && 11081 E->getUsedContext() == SemaRef.CurContext) 11082 return E; 11083 11084 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 11085 } 11086 11087 template<typename Derived> 11088 ExprResult 11089 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 11090 CXXScalarValueInitExpr *E) { 11091 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 11092 if (!T) 11093 return ExprError(); 11094 11095 if (!getDerived().AlwaysRebuild() && 11096 T == E->getTypeSourceInfo()) 11097 return E; 11098 11099 return getDerived().RebuildCXXScalarValueInitExpr(T, 11100 /*FIXME:*/T->getTypeLoc().getEndLoc(), 11101 E->getRParenLoc()); 11102 } 11103 11104 template<typename Derived> 11105 ExprResult 11106 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 11107 // Transform the type that we're allocating 11108 TypeSourceInfo *AllocTypeInfo = 11109 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 11110 if (!AllocTypeInfo) 11111 return ExprError(); 11112 11113 // Transform the size of the array we're allocating (if any). 11114 Optional<Expr *> ArraySize; 11115 if (Optional<Expr *> OldArraySize = E->getArraySize()) { 11116 ExprResult NewArraySize; 11117 if (*OldArraySize) { 11118 NewArraySize = getDerived().TransformExpr(*OldArraySize); 11119 if (NewArraySize.isInvalid()) 11120 return ExprError(); 11121 } 11122 ArraySize = NewArraySize.get(); 11123 } 11124 11125 // Transform the placement arguments (if any). 11126 bool ArgumentChanged = false; 11127 SmallVector<Expr*, 8> PlacementArgs; 11128 if (getDerived().TransformExprs(E->getPlacementArgs(), 11129 E->getNumPlacementArgs(), true, 11130 PlacementArgs, &ArgumentChanged)) 11131 return ExprError(); 11132 11133 // Transform the initializer (if any). 11134 Expr *OldInit = E->getInitializer(); 11135 ExprResult NewInit; 11136 if (OldInit) 11137 NewInit = getDerived().TransformInitializer(OldInit, true); 11138 if (NewInit.isInvalid()) 11139 return ExprError(); 11140 11141 // Transform new operator and delete operator. 11142 FunctionDecl *OperatorNew = nullptr; 11143 if (E->getOperatorNew()) { 11144 OperatorNew = cast_or_null<FunctionDecl>( 11145 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew())); 11146 if (!OperatorNew) 11147 return ExprError(); 11148 } 11149 11150 FunctionDecl *OperatorDelete = nullptr; 11151 if (E->getOperatorDelete()) { 11152 OperatorDelete = cast_or_null<FunctionDecl>( 11153 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11154 if (!OperatorDelete) 11155 return ExprError(); 11156 } 11157 11158 if (!getDerived().AlwaysRebuild() && 11159 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 11160 ArraySize == E->getArraySize() && 11161 NewInit.get() == OldInit && 11162 OperatorNew == E->getOperatorNew() && 11163 OperatorDelete == E->getOperatorDelete() && 11164 !ArgumentChanged) { 11165 // Mark any declarations we need as referenced. 11166 // FIXME: instantiation-specific. 11167 if (OperatorNew) 11168 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew); 11169 if (OperatorDelete) 11170 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11171 11172 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 11173 QualType ElementType 11174 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 11175 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 11176 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 11177 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 11178 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor); 11179 } 11180 } 11181 } 11182 11183 return E; 11184 } 11185 11186 QualType AllocType = AllocTypeInfo->getType(); 11187 if (!ArraySize) { 11188 // If no array size was specified, but the new expression was 11189 // instantiated with an array type (e.g., "new T" where T is 11190 // instantiated with "int[4]"), extract the outer bound from the 11191 // array type as our array size. We do this with constant and 11192 // dependently-sized array types. 11193 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 11194 if (!ArrayT) { 11195 // Do nothing 11196 } else if (const ConstantArrayType *ConsArrayT 11197 = dyn_cast<ConstantArrayType>(ArrayT)) { 11198 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 11199 SemaRef.Context.getSizeType(), 11200 /*FIXME:*/ E->getBeginLoc()); 11201 AllocType = ConsArrayT->getElementType(); 11202 } else if (const DependentSizedArrayType *DepArrayT 11203 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 11204 if (DepArrayT->getSizeExpr()) { 11205 ArraySize = DepArrayT->getSizeExpr(); 11206 AllocType = DepArrayT->getElementType(); 11207 } 11208 } 11209 } 11210 11211 return getDerived().RebuildCXXNewExpr( 11212 E->getBeginLoc(), E->isGlobalNew(), 11213 /*FIXME:*/ E->getBeginLoc(), PlacementArgs, 11214 /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType, 11215 AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get()); 11216 } 11217 11218 template<typename Derived> 11219 ExprResult 11220 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 11221 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 11222 if (Operand.isInvalid()) 11223 return ExprError(); 11224 11225 // Transform the delete operator, if known. 11226 FunctionDecl *OperatorDelete = nullptr; 11227 if (E->getOperatorDelete()) { 11228 OperatorDelete = cast_or_null<FunctionDecl>( 11229 getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete())); 11230 if (!OperatorDelete) 11231 return ExprError(); 11232 } 11233 11234 if (!getDerived().AlwaysRebuild() && 11235 Operand.get() == E->getArgument() && 11236 OperatorDelete == E->getOperatorDelete()) { 11237 // Mark any declarations we need as referenced. 11238 // FIXME: instantiation-specific. 11239 if (OperatorDelete) 11240 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete); 11241 11242 if (!E->getArgument()->isTypeDependent()) { 11243 QualType Destroyed = SemaRef.Context.getBaseElementType( 11244 E->getDestroyedType()); 11245 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 11246 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 11247 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), 11248 SemaRef.LookupDestructor(Record)); 11249 } 11250 } 11251 11252 return E; 11253 } 11254 11255 return getDerived().RebuildCXXDeleteExpr( 11256 E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get()); 11257 } 11258 11259 template<typename Derived> 11260 ExprResult 11261 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 11262 CXXPseudoDestructorExpr *E) { 11263 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11264 if (Base.isInvalid()) 11265 return ExprError(); 11266 11267 ParsedType ObjectTypePtr; 11268 bool MayBePseudoDestructor = false; 11269 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11270 E->getOperatorLoc(), 11271 E->isArrow()? tok::arrow : tok::period, 11272 ObjectTypePtr, 11273 MayBePseudoDestructor); 11274 if (Base.isInvalid()) 11275 return ExprError(); 11276 11277 QualType ObjectType = ObjectTypePtr.get(); 11278 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 11279 if (QualifierLoc) { 11280 QualifierLoc 11281 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 11282 if (!QualifierLoc) 11283 return ExprError(); 11284 } 11285 CXXScopeSpec SS; 11286 SS.Adopt(QualifierLoc); 11287 11288 PseudoDestructorTypeStorage Destroyed; 11289 if (E->getDestroyedTypeInfo()) { 11290 TypeSourceInfo *DestroyedTypeInfo 11291 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 11292 ObjectType, nullptr, SS); 11293 if (!DestroyedTypeInfo) 11294 return ExprError(); 11295 Destroyed = DestroyedTypeInfo; 11296 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 11297 // We aren't likely to be able to resolve the identifier down to a type 11298 // now anyway, so just retain the identifier. 11299 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 11300 E->getDestroyedTypeLoc()); 11301 } else { 11302 // Look for a destructor known with the given name. 11303 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 11304 *E->getDestroyedTypeIdentifier(), 11305 E->getDestroyedTypeLoc(), 11306 /*Scope=*/nullptr, 11307 SS, ObjectTypePtr, 11308 false); 11309 if (!T) 11310 return ExprError(); 11311 11312 Destroyed 11313 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 11314 E->getDestroyedTypeLoc()); 11315 } 11316 11317 TypeSourceInfo *ScopeTypeInfo = nullptr; 11318 if (E->getScopeTypeInfo()) { 11319 CXXScopeSpec EmptySS; 11320 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 11321 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 11322 if (!ScopeTypeInfo) 11323 return ExprError(); 11324 } 11325 11326 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 11327 E->getOperatorLoc(), 11328 E->isArrow(), 11329 SS, 11330 ScopeTypeInfo, 11331 E->getColonColonLoc(), 11332 E->getTildeLoc(), 11333 Destroyed); 11334 } 11335 11336 template <typename Derived> 11337 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 11338 bool RequiresADL, 11339 LookupResult &R) { 11340 // Transform all the decls. 11341 bool AllEmptyPacks = true; 11342 for (auto *OldD : Old->decls()) { 11343 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 11344 if (!InstD) { 11345 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 11346 // This can happen because of dependent hiding. 11347 if (isa<UsingShadowDecl>(OldD)) 11348 continue; 11349 else { 11350 R.clear(); 11351 return true; 11352 } 11353 } 11354 11355 // Expand using pack declarations. 11356 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 11357 ArrayRef<NamedDecl*> Decls = SingleDecl; 11358 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 11359 Decls = UPD->expansions(); 11360 11361 // Expand using declarations. 11362 for (auto *D : Decls) { 11363 if (auto *UD = dyn_cast<UsingDecl>(D)) { 11364 for (auto *SD : UD->shadows()) 11365 R.addDecl(SD); 11366 } else { 11367 R.addDecl(D); 11368 } 11369 } 11370 11371 AllEmptyPacks &= Decls.empty(); 11372 }; 11373 11374 // C++ [temp.res]/8.4.2: 11375 // The program is ill-formed, no diagnostic required, if [...] lookup for 11376 // a name in the template definition found a using-declaration, but the 11377 // lookup in the corresponding scope in the instantiation odoes not find 11378 // any declarations because the using-declaration was a pack expansion and 11379 // the corresponding pack is empty 11380 if (AllEmptyPacks && !RequiresADL) { 11381 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 11382 << isa<UnresolvedMemberExpr>(Old) << Old->getName(); 11383 return true; 11384 } 11385 11386 // Resolve a kind, but don't do any further analysis. If it's 11387 // ambiguous, the callee needs to deal with it. 11388 R.resolveKind(); 11389 return false; 11390 } 11391 11392 template<typename Derived> 11393 ExprResult 11394 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 11395 UnresolvedLookupExpr *Old) { 11396 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 11397 Sema::LookupOrdinaryName); 11398 11399 // Transform the declaration set. 11400 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 11401 return ExprError(); 11402 11403 // Rebuild the nested-name qualifier, if present. 11404 CXXScopeSpec SS; 11405 if (Old->getQualifierLoc()) { 11406 NestedNameSpecifierLoc QualifierLoc 11407 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11408 if (!QualifierLoc) 11409 return ExprError(); 11410 11411 SS.Adopt(QualifierLoc); 11412 } 11413 11414 if (Old->getNamingClass()) { 11415 CXXRecordDecl *NamingClass 11416 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11417 Old->getNameLoc(), 11418 Old->getNamingClass())); 11419 if (!NamingClass) { 11420 R.clear(); 11421 return ExprError(); 11422 } 11423 11424 R.setNamingClass(NamingClass); 11425 } 11426 11427 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11428 11429 // If we have neither explicit template arguments, nor the template keyword, 11430 // it's a normal declaration name or member reference. 11431 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 11432 NamedDecl *D = R.getAsSingle<NamedDecl>(); 11433 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 11434 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 11435 // give a good diagnostic. 11436 if (D && D->isCXXInstanceMember()) { 11437 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 11438 /*TemplateArgs=*/nullptr, 11439 /*Scope=*/nullptr); 11440 } 11441 11442 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 11443 } 11444 11445 // If we have template arguments, rebuild them, then rebuild the 11446 // templateid expression. 11447 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 11448 if (Old->hasExplicitTemplateArgs() && 11449 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11450 Old->getNumTemplateArgs(), 11451 TransArgs)) { 11452 R.clear(); 11453 return ExprError(); 11454 } 11455 11456 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 11457 Old->requiresADL(), &TransArgs); 11458 } 11459 11460 template<typename Derived> 11461 ExprResult 11462 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 11463 bool ArgChanged = false; 11464 SmallVector<TypeSourceInfo *, 4> Args; 11465 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 11466 TypeSourceInfo *From = E->getArg(I); 11467 TypeLoc FromTL = From->getTypeLoc(); 11468 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 11469 TypeLocBuilder TLB; 11470 TLB.reserve(FromTL.getFullDataSize()); 11471 QualType To = getDerived().TransformType(TLB, FromTL); 11472 if (To.isNull()) 11473 return ExprError(); 11474 11475 if (To == From->getType()) 11476 Args.push_back(From); 11477 else { 11478 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11479 ArgChanged = true; 11480 } 11481 continue; 11482 } 11483 11484 ArgChanged = true; 11485 11486 // We have a pack expansion. Instantiate it. 11487 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 11488 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 11489 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11490 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 11491 11492 // Determine whether the set of unexpanded parameter packs can and should 11493 // be expanded. 11494 bool Expand = true; 11495 bool RetainExpansion = false; 11496 Optional<unsigned> OrigNumExpansions = 11497 ExpansionTL.getTypePtr()->getNumExpansions(); 11498 Optional<unsigned> NumExpansions = OrigNumExpansions; 11499 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 11500 PatternTL.getSourceRange(), 11501 Unexpanded, 11502 Expand, RetainExpansion, 11503 NumExpansions)) 11504 return ExprError(); 11505 11506 if (!Expand) { 11507 // The transform has determined that we should perform a simple 11508 // transformation on the pack expansion, producing another pack 11509 // expansion. 11510 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11511 11512 TypeLocBuilder TLB; 11513 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11514 11515 QualType To = getDerived().TransformType(TLB, PatternTL); 11516 if (To.isNull()) 11517 return ExprError(); 11518 11519 To = getDerived().RebuildPackExpansionType(To, 11520 PatternTL.getSourceRange(), 11521 ExpansionTL.getEllipsisLoc(), 11522 NumExpansions); 11523 if (To.isNull()) 11524 return ExprError(); 11525 11526 PackExpansionTypeLoc ToExpansionTL 11527 = TLB.push<PackExpansionTypeLoc>(To); 11528 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11529 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11530 continue; 11531 } 11532 11533 // Expand the pack expansion by substituting for each argument in the 11534 // pack(s). 11535 for (unsigned I = 0; I != *NumExpansions; ++I) { 11536 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 11537 TypeLocBuilder TLB; 11538 TLB.reserve(PatternTL.getFullDataSize()); 11539 QualType To = getDerived().TransformType(TLB, PatternTL); 11540 if (To.isNull()) 11541 return ExprError(); 11542 11543 if (To->containsUnexpandedParameterPack()) { 11544 To = getDerived().RebuildPackExpansionType(To, 11545 PatternTL.getSourceRange(), 11546 ExpansionTL.getEllipsisLoc(), 11547 NumExpansions); 11548 if (To.isNull()) 11549 return ExprError(); 11550 11551 PackExpansionTypeLoc ToExpansionTL 11552 = TLB.push<PackExpansionTypeLoc>(To); 11553 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11554 } 11555 11556 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11557 } 11558 11559 if (!RetainExpansion) 11560 continue; 11561 11562 // If we're supposed to retain a pack expansion, do so by temporarily 11563 // forgetting the partially-substituted parameter pack. 11564 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11565 11566 TypeLocBuilder TLB; 11567 TLB.reserve(From->getTypeLoc().getFullDataSize()); 11568 11569 QualType To = getDerived().TransformType(TLB, PatternTL); 11570 if (To.isNull()) 11571 return ExprError(); 11572 11573 To = getDerived().RebuildPackExpansionType(To, 11574 PatternTL.getSourceRange(), 11575 ExpansionTL.getEllipsisLoc(), 11576 NumExpansions); 11577 if (To.isNull()) 11578 return ExprError(); 11579 11580 PackExpansionTypeLoc ToExpansionTL 11581 = TLB.push<PackExpansionTypeLoc>(To); 11582 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 11583 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 11584 } 11585 11586 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11587 return E; 11588 11589 return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args, 11590 E->getEndLoc()); 11591 } 11592 11593 template<typename Derived> 11594 ExprResult 11595 TreeTransform<Derived>::TransformConceptSpecializationExpr( 11596 ConceptSpecializationExpr *E) { 11597 const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten(); 11598 TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc); 11599 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11600 Old->NumTemplateArgs, TransArgs)) 11601 return ExprError(); 11602 11603 return getDerived().RebuildConceptSpecializationExpr( 11604 E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(), 11605 E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(), 11606 &TransArgs); 11607 } 11608 11609 template<typename Derived> 11610 ExprResult 11611 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) { 11612 SmallVector<ParmVarDecl*, 4> TransParams; 11613 SmallVector<QualType, 4> TransParamTypes; 11614 Sema::ExtParameterInfoBuilder ExtParamInfos; 11615 11616 // C++2a [expr.prim.req]p2 11617 // Expressions appearing within a requirement-body are unevaluated operands. 11618 EnterExpressionEvaluationContext Ctx( 11619 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11620 11621 RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create( 11622 getSema().Context, getSema().CurContext, 11623 E->getBody()->getBeginLoc()); 11624 11625 Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false); 11626 11627 if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(), 11628 E->getLocalParameters(), 11629 /*ParamTypes=*/nullptr, 11630 /*ParamInfos=*/nullptr, 11631 TransParamTypes, &TransParams, 11632 ExtParamInfos)) 11633 return ExprError(); 11634 11635 for (ParmVarDecl *Param : TransParams) 11636 Param->setDeclContext(Body); 11637 11638 SmallVector<concepts::Requirement *, 4> TransReqs; 11639 if (getDerived().TransformRequiresExprRequirements(E->getRequirements(), 11640 TransReqs)) 11641 return ExprError(); 11642 11643 for (concepts::Requirement *Req : TransReqs) { 11644 if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) { 11645 if (ER->getReturnTypeRequirement().isTypeConstraint()) { 11646 ER->getReturnTypeRequirement() 11647 .getTypeConstraintTemplateParameterList()->getParam(0) 11648 ->setDeclContext(Body); 11649 } 11650 } 11651 } 11652 11653 return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body, 11654 TransParams, TransReqs, 11655 E->getRBraceLoc()); 11656 } 11657 11658 template<typename Derived> 11659 bool TreeTransform<Derived>::TransformRequiresExprRequirements( 11660 ArrayRef<concepts::Requirement *> Reqs, 11661 SmallVectorImpl<concepts::Requirement *> &Transformed) { 11662 for (concepts::Requirement *Req : Reqs) { 11663 concepts::Requirement *TransReq = nullptr; 11664 if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req)) 11665 TransReq = getDerived().TransformTypeRequirement(TypeReq); 11666 else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req)) 11667 TransReq = getDerived().TransformExprRequirement(ExprReq); 11668 else 11669 TransReq = getDerived().TransformNestedRequirement( 11670 cast<concepts::NestedRequirement>(Req)); 11671 if (!TransReq) 11672 return true; 11673 Transformed.push_back(TransReq); 11674 } 11675 return false; 11676 } 11677 11678 template<typename Derived> 11679 concepts::TypeRequirement * 11680 TreeTransform<Derived>::TransformTypeRequirement( 11681 concepts::TypeRequirement *Req) { 11682 if (Req->isSubstitutionFailure()) { 11683 if (getDerived().AlwaysRebuild()) 11684 return getDerived().RebuildTypeRequirement( 11685 Req->getSubstitutionDiagnostic()); 11686 return Req; 11687 } 11688 TypeSourceInfo *TransType = getDerived().TransformType(Req->getType()); 11689 if (!TransType) 11690 return nullptr; 11691 return getDerived().RebuildTypeRequirement(TransType); 11692 } 11693 11694 template<typename Derived> 11695 concepts::ExprRequirement * 11696 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) { 11697 llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr; 11698 if (Req->isExprSubstitutionFailure()) 11699 TransExpr = Req->getExprSubstitutionDiagnostic(); 11700 else { 11701 ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr()); 11702 if (TransExprRes.isInvalid()) 11703 return nullptr; 11704 TransExpr = TransExprRes.get(); 11705 } 11706 11707 llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq; 11708 const auto &RetReq = Req->getReturnTypeRequirement(); 11709 if (RetReq.isEmpty()) 11710 TransRetReq.emplace(); 11711 else if (RetReq.isSubstitutionFailure()) 11712 TransRetReq.emplace(RetReq.getSubstitutionDiagnostic()); 11713 else if (RetReq.isTypeConstraint()) { 11714 TemplateParameterList *OrigTPL = 11715 RetReq.getTypeConstraintTemplateParameterList(); 11716 TemplateParameterList *TPL = 11717 getDerived().TransformTemplateParameterList(OrigTPL); 11718 if (!TPL) 11719 return nullptr; 11720 TransRetReq.emplace(TPL); 11721 } 11722 assert(TransRetReq.hasValue() && 11723 "All code paths leading here must set TransRetReq"); 11724 if (Expr *E = TransExpr.dyn_cast<Expr *>()) 11725 return getDerived().RebuildExprRequirement(E, Req->isSimple(), 11726 Req->getNoexceptLoc(), 11727 std::move(*TransRetReq)); 11728 return getDerived().RebuildExprRequirement( 11729 TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(), 11730 Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq)); 11731 } 11732 11733 template<typename Derived> 11734 concepts::NestedRequirement * 11735 TreeTransform<Derived>::TransformNestedRequirement( 11736 concepts::NestedRequirement *Req) { 11737 if (Req->isSubstitutionFailure()) { 11738 if (getDerived().AlwaysRebuild()) 11739 return getDerived().RebuildNestedRequirement( 11740 Req->getSubstitutionDiagnostic()); 11741 return Req; 11742 } 11743 ExprResult TransConstraint = 11744 getDerived().TransformExpr(Req->getConstraintExpr()); 11745 if (TransConstraint.isInvalid()) 11746 return nullptr; 11747 return getDerived().RebuildNestedRequirement(TransConstraint.get()); 11748 } 11749 11750 template<typename Derived> 11751 ExprResult 11752 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 11753 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 11754 if (!T) 11755 return ExprError(); 11756 11757 if (!getDerived().AlwaysRebuild() && 11758 T == E->getQueriedTypeSourceInfo()) 11759 return E; 11760 11761 ExprResult SubExpr; 11762 { 11763 EnterExpressionEvaluationContext Unevaluated( 11764 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11765 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 11766 if (SubExpr.isInvalid()) 11767 return ExprError(); 11768 11769 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 11770 return E; 11771 } 11772 11773 return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T, 11774 SubExpr.get(), E->getEndLoc()); 11775 } 11776 11777 template<typename Derived> 11778 ExprResult 11779 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 11780 ExprResult SubExpr; 11781 { 11782 EnterExpressionEvaluationContext Unevaluated( 11783 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11784 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 11785 if (SubExpr.isInvalid()) 11786 return ExprError(); 11787 11788 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 11789 return E; 11790 } 11791 11792 return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(), 11793 SubExpr.get(), E->getEndLoc()); 11794 } 11795 11796 template <typename Derived> 11797 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 11798 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 11799 TypeSourceInfo **RecoveryTSI) { 11800 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 11801 DRE, AddrTaken, RecoveryTSI); 11802 11803 // Propagate both errors and recovered types, which return ExprEmpty. 11804 if (!NewDRE.isUsable()) 11805 return NewDRE; 11806 11807 // We got an expr, wrap it up in parens. 11808 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 11809 return PE; 11810 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 11811 PE->getRParen()); 11812 } 11813 11814 template <typename Derived> 11815 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 11816 DependentScopeDeclRefExpr *E) { 11817 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 11818 nullptr); 11819 } 11820 11821 template<typename Derived> 11822 ExprResult 11823 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 11824 DependentScopeDeclRefExpr *E, 11825 bool IsAddressOfOperand, 11826 TypeSourceInfo **RecoveryTSI) { 11827 assert(E->getQualifierLoc()); 11828 NestedNameSpecifierLoc QualifierLoc 11829 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 11830 if (!QualifierLoc) 11831 return ExprError(); 11832 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11833 11834 // TODO: If this is a conversion-function-id, verify that the 11835 // destination type name (if present) resolves the same way after 11836 // instantiation as it did in the local scope. 11837 11838 DeclarationNameInfo NameInfo 11839 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 11840 if (!NameInfo.getName()) 11841 return ExprError(); 11842 11843 if (!E->hasExplicitTemplateArgs()) { 11844 if (!getDerived().AlwaysRebuild() && 11845 QualifierLoc == E->getQualifierLoc() && 11846 // Note: it is sufficient to compare the Name component of NameInfo: 11847 // if name has not changed, DNLoc has not changed either. 11848 NameInfo.getName() == E->getDeclName()) 11849 return E; 11850 11851 return getDerived().RebuildDependentScopeDeclRefExpr( 11852 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 11853 IsAddressOfOperand, RecoveryTSI); 11854 } 11855 11856 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11857 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11858 E->getNumTemplateArgs(), 11859 TransArgs)) 11860 return ExprError(); 11861 11862 return getDerived().RebuildDependentScopeDeclRefExpr( 11863 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 11864 RecoveryTSI); 11865 } 11866 11867 template<typename Derived> 11868 ExprResult 11869 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 11870 // CXXConstructExprs other than for list-initialization and 11871 // CXXTemporaryObjectExpr are always implicit, so when we have 11872 // a 1-argument construction we just transform that argument. 11873 if (getDerived().AllowSkippingCXXConstructExpr() && 11874 ((E->getNumArgs() == 1 || 11875 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 11876 (!getDerived().DropCallArgument(E->getArg(0))) && 11877 !E->isListInitialization())) 11878 return getDerived().TransformExpr(E->getArg(0)); 11879 11880 TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName()); 11881 11882 QualType T = getDerived().TransformType(E->getType()); 11883 if (T.isNull()) 11884 return ExprError(); 11885 11886 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11887 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11888 if (!Constructor) 11889 return ExprError(); 11890 11891 bool ArgumentChanged = false; 11892 SmallVector<Expr*, 8> Args; 11893 { 11894 EnterExpressionEvaluationContext Context( 11895 getSema(), EnterExpressionEvaluationContext::InitList, 11896 E->isListInitialization()); 11897 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11898 &ArgumentChanged)) 11899 return ExprError(); 11900 } 11901 11902 if (!getDerived().AlwaysRebuild() && 11903 T == E->getType() && 11904 Constructor == E->getConstructor() && 11905 !ArgumentChanged) { 11906 // Mark the constructor as referenced. 11907 // FIXME: Instantiation-specific 11908 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11909 return E; 11910 } 11911 11912 return getDerived().RebuildCXXConstructExpr( 11913 T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args, 11914 E->hadMultipleCandidates(), E->isListInitialization(), 11915 E->isStdInitListInitialization(), E->requiresZeroInitialization(), 11916 E->getConstructionKind(), E->getParenOrBraceRange()); 11917 } 11918 11919 template<typename Derived> 11920 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 11921 CXXInheritedCtorInitExpr *E) { 11922 QualType T = getDerived().TransformType(E->getType()); 11923 if (T.isNull()) 11924 return ExprError(); 11925 11926 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11927 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11928 if (!Constructor) 11929 return ExprError(); 11930 11931 if (!getDerived().AlwaysRebuild() && 11932 T == E->getType() && 11933 Constructor == E->getConstructor()) { 11934 // Mark the constructor as referenced. 11935 // FIXME: Instantiation-specific 11936 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11937 return E; 11938 } 11939 11940 return getDerived().RebuildCXXInheritedCtorInitExpr( 11941 T, E->getLocation(), Constructor, 11942 E->constructsVBase(), E->inheritedFromVBase()); 11943 } 11944 11945 /// Transform a C++ temporary-binding expression. 11946 /// 11947 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 11948 /// transform the subexpression and return that. 11949 template<typename Derived> 11950 ExprResult 11951 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 11952 return getDerived().TransformExpr(E->getSubExpr()); 11953 } 11954 11955 /// Transform a C++ expression that contains cleanups that should 11956 /// be run after the expression is evaluated. 11957 /// 11958 /// Since ExprWithCleanups nodes are implicitly generated, we 11959 /// just transform the subexpression and return that. 11960 template<typename Derived> 11961 ExprResult 11962 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 11963 return getDerived().TransformExpr(E->getSubExpr()); 11964 } 11965 11966 template<typename Derived> 11967 ExprResult 11968 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 11969 CXXTemporaryObjectExpr *E) { 11970 TypeSourceInfo *T = 11971 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 11972 if (!T) 11973 return ExprError(); 11974 11975 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 11976 getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor())); 11977 if (!Constructor) 11978 return ExprError(); 11979 11980 bool ArgumentChanged = false; 11981 SmallVector<Expr*, 8> Args; 11982 Args.reserve(E->getNumArgs()); 11983 { 11984 EnterExpressionEvaluationContext Context( 11985 getSema(), EnterExpressionEvaluationContext::InitList, 11986 E->isListInitialization()); 11987 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 11988 &ArgumentChanged)) 11989 return ExprError(); 11990 } 11991 11992 if (!getDerived().AlwaysRebuild() && 11993 T == E->getTypeSourceInfo() && 11994 Constructor == E->getConstructor() && 11995 !ArgumentChanged) { 11996 // FIXME: Instantiation-specific 11997 SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor); 11998 return SemaRef.MaybeBindToTemporary(E); 11999 } 12000 12001 // FIXME: We should just pass E->isListInitialization(), but we're not 12002 // prepared to handle list-initialization without a child InitListExpr. 12003 SourceLocation LParenLoc = T->getTypeLoc().getEndLoc(); 12004 return getDerived().RebuildCXXTemporaryObjectExpr( 12005 T, LParenLoc, Args, E->getEndLoc(), 12006 /*ListInitialization=*/LParenLoc.isInvalid()); 12007 } 12008 12009 template<typename Derived> 12010 ExprResult 12011 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 12012 // Transform any init-capture expressions before entering the scope of the 12013 // lambda body, because they are not semantically within that scope. 12014 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 12015 struct TransformedInitCapture { 12016 // The location of the ... if the result is retaining a pack expansion. 12017 SourceLocation EllipsisLoc; 12018 // Zero or more expansions of the init-capture. 12019 SmallVector<InitCaptureInfoTy, 4> Expansions; 12020 }; 12021 SmallVector<TransformedInitCapture, 4> InitCaptures; 12022 InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin()); 12023 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12024 CEnd = E->capture_end(); 12025 C != CEnd; ++C) { 12026 if (!E->isInitCapture(C)) 12027 continue; 12028 12029 TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()]; 12030 VarDecl *OldVD = C->getCapturedVar(); 12031 12032 auto SubstInitCapture = [&](SourceLocation EllipsisLoc, 12033 Optional<unsigned> NumExpansions) { 12034 ExprResult NewExprInitResult = getDerived().TransformInitializer( 12035 OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit); 12036 12037 if (NewExprInitResult.isInvalid()) { 12038 Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType())); 12039 return; 12040 } 12041 Expr *NewExprInit = NewExprInitResult.get(); 12042 12043 QualType NewInitCaptureType = 12044 getSema().buildLambdaInitCaptureInitialization( 12045 C->getLocation(), OldVD->getType()->isReferenceType(), 12046 EllipsisLoc, NumExpansions, OldVD->getIdentifier(), 12047 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, 12048 NewExprInit); 12049 Result.Expansions.push_back( 12050 InitCaptureInfoTy(NewExprInit, NewInitCaptureType)); 12051 }; 12052 12053 // If this is an init-capture pack, consider expanding the pack now. 12054 if (OldVD->isParameterPack()) { 12055 PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo() 12056 ->getTypeLoc() 12057 .castAs<PackExpansionTypeLoc>(); 12058 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12059 SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded); 12060 12061 // Determine whether the set of unexpanded parameter packs can and should 12062 // be expanded. 12063 bool Expand = true; 12064 bool RetainExpansion = false; 12065 Optional<unsigned> OrigNumExpansions = 12066 ExpansionTL.getTypePtr()->getNumExpansions(); 12067 Optional<unsigned> NumExpansions = OrigNumExpansions; 12068 if (getDerived().TryExpandParameterPacks( 12069 ExpansionTL.getEllipsisLoc(), 12070 OldVD->getInit()->getSourceRange(), Unexpanded, Expand, 12071 RetainExpansion, NumExpansions)) 12072 return ExprError(); 12073 if (Expand) { 12074 for (unsigned I = 0; I != *NumExpansions; ++I) { 12075 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12076 SubstInitCapture(SourceLocation(), None); 12077 } 12078 } 12079 if (!Expand || RetainExpansion) { 12080 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12081 SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions); 12082 Result.EllipsisLoc = ExpansionTL.getEllipsisLoc(); 12083 } 12084 } else { 12085 SubstInitCapture(SourceLocation(), None); 12086 } 12087 } 12088 12089 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 12090 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 12091 12092 // Transform the template parameters, and add them to the current 12093 // instantiation scope. The null case is handled correctly. 12094 auto TPL = getDerived().TransformTemplateParameterList( 12095 E->getTemplateParameterList()); 12096 LSI->GLTemplateParameterList = TPL; 12097 12098 // Transform the type of the original lambda's call operator. 12099 // The transformation MUST be done in the CurrentInstantiationScope since 12100 // it introduces a mapping of the original to the newly created 12101 // transformed parameters. 12102 TypeSourceInfo *NewCallOpTSI = nullptr; 12103 { 12104 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 12105 FunctionProtoTypeLoc OldCallOpFPTL = 12106 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 12107 12108 TypeLocBuilder NewCallOpTLBuilder; 12109 SmallVector<QualType, 4> ExceptionStorage; 12110 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 12111 QualType NewCallOpType = TransformFunctionProtoType( 12112 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(), 12113 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 12114 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 12115 ExceptionStorage, Changed); 12116 }); 12117 if (NewCallOpType.isNull()) 12118 return ExprError(); 12119 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 12120 NewCallOpType); 12121 } 12122 12123 // Transform the trailing requires clause 12124 ExprResult NewTrailingRequiresClause; 12125 if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause()) 12126 // FIXME: Concepts: Substitution into requires clause should only happen 12127 // when checking satisfaction. 12128 NewTrailingRequiresClause = getDerived().TransformExpr(TRC); 12129 12130 // Create the local class that will describe the lambda. 12131 // FIXME: KnownDependent below is wrong when substituting inside a templated 12132 // context that isn't a DeclContext (such as a variable template). 12133 CXXRecordDecl *OldClass = E->getLambdaClass(); 12134 CXXRecordDecl *Class 12135 = getSema().createLambdaClosureType(E->getIntroducerRange(), 12136 NewCallOpTSI, 12137 /*KnownDependent=*/false, 12138 E->getCaptureDefault()); 12139 getDerived().transformedLocalDecl(OldClass, {Class}); 12140 12141 Optional<std::tuple<unsigned, bool, Decl *>> Mangling; 12142 if (getDerived().ReplacingOriginal()) 12143 Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(), 12144 OldClass->hasKnownLambdaInternalLinkage(), 12145 OldClass->getLambdaContextDecl()); 12146 12147 // Build the call operator. 12148 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 12149 Class, E->getIntroducerRange(), NewCallOpTSI, 12150 E->getCallOperator()->getEndLoc(), 12151 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 12152 E->getCallOperator()->getConstexprKind(), 12153 NewTrailingRequiresClause.get()); 12154 12155 LSI->CallOperator = NewCallOperator; 12156 12157 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 12158 I != NumParams; ++I) { 12159 auto *P = NewCallOperator->getParamDecl(I); 12160 if (P->hasUninstantiatedDefaultArg()) { 12161 EnterExpressionEvaluationContext Eval( 12162 getSema(), 12163 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 12164 ExprResult R = getDerived().TransformExpr( 12165 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 12166 P->setDefaultArg(R.get()); 12167 } 12168 } 12169 12170 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 12171 getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator}); 12172 12173 // Number the lambda for linkage purposes if necessary. 12174 getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling); 12175 12176 // Introduce the context of the call operator. 12177 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 12178 /*NewThisContext*/false); 12179 12180 // Enter the scope of the lambda. 12181 getSema().buildLambdaScope(LSI, NewCallOperator, 12182 E->getIntroducerRange(), 12183 E->getCaptureDefault(), 12184 E->getCaptureDefaultLoc(), 12185 E->hasExplicitParameters(), 12186 E->hasExplicitResultType(), 12187 E->isMutable()); 12188 12189 bool Invalid = false; 12190 12191 // Transform captures. 12192 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12193 CEnd = E->capture_end(); 12194 C != CEnd; ++C) { 12195 // When we hit the first implicit capture, tell Sema that we've finished 12196 // the list of explicit captures. 12197 if (C->isImplicit()) 12198 break; 12199 12200 // Capturing 'this' is trivial. 12201 if (C->capturesThis()) { 12202 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12203 /*BuildAndDiagnose*/ true, nullptr, 12204 C->getCaptureKind() == LCK_StarThis); 12205 continue; 12206 } 12207 // Captured expression will be recaptured during captured variables 12208 // rebuilding. 12209 if (C->capturesVLAType()) 12210 continue; 12211 12212 // Rebuild init-captures, including the implied field declaration. 12213 if (E->isInitCapture(C)) { 12214 TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()]; 12215 12216 VarDecl *OldVD = C->getCapturedVar(); 12217 llvm::SmallVector<Decl*, 4> NewVDs; 12218 12219 for (InitCaptureInfoTy &Info : NewC.Expansions) { 12220 ExprResult Init = Info.first; 12221 QualType InitQualType = Info.second; 12222 if (Init.isInvalid() || InitQualType.isNull()) { 12223 Invalid = true; 12224 break; 12225 } 12226 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 12227 OldVD->getLocation(), InitQualType, NewC.EllipsisLoc, 12228 OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get()); 12229 if (!NewVD) { 12230 Invalid = true; 12231 break; 12232 } 12233 NewVDs.push_back(NewVD); 12234 getSema().addInitCapture(LSI, NewVD); 12235 } 12236 12237 if (Invalid) 12238 break; 12239 12240 getDerived().transformedLocalDecl(OldVD, NewVDs); 12241 continue; 12242 } 12243 12244 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12245 12246 // Determine the capture kind for Sema. 12247 Sema::TryCaptureKind Kind 12248 = C->isImplicit()? Sema::TryCapture_Implicit 12249 : C->getCaptureKind() == LCK_ByCopy 12250 ? Sema::TryCapture_ExplicitByVal 12251 : Sema::TryCapture_ExplicitByRef; 12252 SourceLocation EllipsisLoc; 12253 if (C->isPackExpansion()) { 12254 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 12255 bool ShouldExpand = false; 12256 bool RetainExpansion = false; 12257 Optional<unsigned> NumExpansions; 12258 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 12259 C->getLocation(), 12260 Unexpanded, 12261 ShouldExpand, RetainExpansion, 12262 NumExpansions)) { 12263 Invalid = true; 12264 continue; 12265 } 12266 12267 if (ShouldExpand) { 12268 // The transform has determined that we should perform an expansion; 12269 // transform and capture each of the arguments. 12270 // expansion of the pattern. Do so. 12271 VarDecl *Pack = C->getCapturedVar(); 12272 for (unsigned I = 0; I != *NumExpansions; ++I) { 12273 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 12274 VarDecl *CapturedVar 12275 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12276 Pack)); 12277 if (!CapturedVar) { 12278 Invalid = true; 12279 continue; 12280 } 12281 12282 // Capture the transformed variable. 12283 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 12284 } 12285 12286 // FIXME: Retain a pack expansion if RetainExpansion is true. 12287 12288 continue; 12289 } 12290 12291 EllipsisLoc = C->getEllipsisLoc(); 12292 } 12293 12294 // Transform the captured variable. 12295 VarDecl *CapturedVar 12296 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 12297 C->getCapturedVar())); 12298 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 12299 Invalid = true; 12300 continue; 12301 } 12302 12303 // Capture the transformed variable. 12304 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 12305 EllipsisLoc); 12306 } 12307 getSema().finishLambdaExplicitCaptures(LSI); 12308 12309 // FIXME: Sema's lambda-building mechanism expects us to push an expression 12310 // evaluation context even if we're not transforming the function body. 12311 getSema().PushExpressionEvaluationContext( 12312 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 12313 12314 // Instantiate the body of the lambda expression. 12315 StmtResult Body = 12316 Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody()); 12317 12318 // ActOnLambda* will pop the function scope for us. 12319 FuncScopeCleanup.disable(); 12320 12321 if (Body.isInvalid()) { 12322 SavedContext.pop(); 12323 getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr, 12324 /*IsInstantiation=*/true); 12325 return ExprError(); 12326 } 12327 12328 // Copy the LSI before ActOnFinishFunctionBody removes it. 12329 // FIXME: This is dumb. Store the lambda information somewhere that outlives 12330 // the call operator. 12331 auto LSICopy = *LSI; 12332 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 12333 /*IsInstantiation*/ true); 12334 SavedContext.pop(); 12335 12336 return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(), 12337 &LSICopy); 12338 } 12339 12340 template<typename Derived> 12341 StmtResult 12342 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) { 12343 return TransformStmt(S); 12344 } 12345 12346 template<typename Derived> 12347 StmtResult 12348 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) { 12349 // Transform captures. 12350 for (LambdaExpr::capture_iterator C = E->capture_begin(), 12351 CEnd = E->capture_end(); 12352 C != CEnd; ++C) { 12353 // When we hit the first implicit capture, tell Sema that we've finished 12354 // the list of explicit captures. 12355 if (!C->isImplicit()) 12356 continue; 12357 12358 // Capturing 'this' is trivial. 12359 if (C->capturesThis()) { 12360 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 12361 /*BuildAndDiagnose*/ true, nullptr, 12362 C->getCaptureKind() == LCK_StarThis); 12363 continue; 12364 } 12365 // Captured expression will be recaptured during captured variables 12366 // rebuilding. 12367 if (C->capturesVLAType()) 12368 continue; 12369 12370 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 12371 assert(!E->isInitCapture(C) && "implicit init-capture?"); 12372 12373 // Transform the captured variable. 12374 VarDecl *CapturedVar = cast_or_null<VarDecl>( 12375 getDerived().TransformDecl(C->getLocation(), C->getCapturedVar())); 12376 if (!CapturedVar || CapturedVar->isInvalidDecl()) 12377 return StmtError(); 12378 12379 // Capture the transformed variable. 12380 getSema().tryCaptureVariable(CapturedVar, C->getLocation()); 12381 } 12382 12383 return S; 12384 } 12385 12386 template<typename Derived> 12387 ExprResult 12388 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 12389 CXXUnresolvedConstructExpr *E) { 12390 TypeSourceInfo *T = 12391 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 12392 if (!T) 12393 return ExprError(); 12394 12395 bool ArgumentChanged = false; 12396 SmallVector<Expr*, 8> Args; 12397 Args.reserve(E->arg_size()); 12398 { 12399 EnterExpressionEvaluationContext Context( 12400 getSema(), EnterExpressionEvaluationContext::InitList, 12401 E->isListInitialization()); 12402 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 12403 &ArgumentChanged)) 12404 return ExprError(); 12405 } 12406 12407 if (!getDerived().AlwaysRebuild() && 12408 T == E->getTypeSourceInfo() && 12409 !ArgumentChanged) 12410 return E; 12411 12412 // FIXME: we're faking the locations of the commas 12413 return getDerived().RebuildCXXUnresolvedConstructExpr( 12414 T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization()); 12415 } 12416 12417 template<typename Derived> 12418 ExprResult 12419 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 12420 CXXDependentScopeMemberExpr *E) { 12421 // Transform the base of the expression. 12422 ExprResult Base((Expr*) nullptr); 12423 Expr *OldBase; 12424 QualType BaseType; 12425 QualType ObjectType; 12426 if (!E->isImplicitAccess()) { 12427 OldBase = E->getBase(); 12428 Base = getDerived().TransformExpr(OldBase); 12429 if (Base.isInvalid()) 12430 return ExprError(); 12431 12432 // Start the member reference and compute the object's type. 12433 ParsedType ObjectTy; 12434 bool MayBePseudoDestructor = false; 12435 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 12436 E->getOperatorLoc(), 12437 E->isArrow()? tok::arrow : tok::period, 12438 ObjectTy, 12439 MayBePseudoDestructor); 12440 if (Base.isInvalid()) 12441 return ExprError(); 12442 12443 ObjectType = ObjectTy.get(); 12444 BaseType = ((Expr*) Base.get())->getType(); 12445 } else { 12446 OldBase = nullptr; 12447 BaseType = getDerived().TransformType(E->getBaseType()); 12448 ObjectType = BaseType->castAs<PointerType>()->getPointeeType(); 12449 } 12450 12451 // Transform the first part of the nested-name-specifier that qualifies 12452 // the member name. 12453 NamedDecl *FirstQualifierInScope 12454 = getDerived().TransformFirstQualifierInScope( 12455 E->getFirstQualifierFoundInScope(), 12456 E->getQualifierLoc().getBeginLoc()); 12457 12458 NestedNameSpecifierLoc QualifierLoc; 12459 if (E->getQualifier()) { 12460 QualifierLoc 12461 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 12462 ObjectType, 12463 FirstQualifierInScope); 12464 if (!QualifierLoc) 12465 return ExprError(); 12466 } 12467 12468 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 12469 12470 // TODO: If this is a conversion-function-id, verify that the 12471 // destination type name (if present) resolves the same way after 12472 // instantiation as it did in the local scope. 12473 12474 DeclarationNameInfo NameInfo 12475 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 12476 if (!NameInfo.getName()) 12477 return ExprError(); 12478 12479 if (!E->hasExplicitTemplateArgs()) { 12480 // This is a reference to a member without an explicitly-specified 12481 // template argument list. Optimize for this common case. 12482 if (!getDerived().AlwaysRebuild() && 12483 Base.get() == OldBase && 12484 BaseType == E->getBaseType() && 12485 QualifierLoc == E->getQualifierLoc() && 12486 NameInfo.getName() == E->getMember() && 12487 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 12488 return E; 12489 12490 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12491 BaseType, 12492 E->isArrow(), 12493 E->getOperatorLoc(), 12494 QualifierLoc, 12495 TemplateKWLoc, 12496 FirstQualifierInScope, 12497 NameInfo, 12498 /*TemplateArgs*/nullptr); 12499 } 12500 12501 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 12502 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 12503 E->getNumTemplateArgs(), 12504 TransArgs)) 12505 return ExprError(); 12506 12507 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 12508 BaseType, 12509 E->isArrow(), 12510 E->getOperatorLoc(), 12511 QualifierLoc, 12512 TemplateKWLoc, 12513 FirstQualifierInScope, 12514 NameInfo, 12515 &TransArgs); 12516 } 12517 12518 template<typename Derived> 12519 ExprResult 12520 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 12521 // Transform the base of the expression. 12522 ExprResult Base((Expr*) nullptr); 12523 QualType BaseType; 12524 if (!Old->isImplicitAccess()) { 12525 Base = getDerived().TransformExpr(Old->getBase()); 12526 if (Base.isInvalid()) 12527 return ExprError(); 12528 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 12529 Old->isArrow()); 12530 if (Base.isInvalid()) 12531 return ExprError(); 12532 BaseType = Base.get()->getType(); 12533 } else { 12534 BaseType = getDerived().TransformType(Old->getBaseType()); 12535 } 12536 12537 NestedNameSpecifierLoc QualifierLoc; 12538 if (Old->getQualifierLoc()) { 12539 QualifierLoc 12540 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 12541 if (!QualifierLoc) 12542 return ExprError(); 12543 } 12544 12545 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 12546 12547 LookupResult R(SemaRef, Old->getMemberNameInfo(), 12548 Sema::LookupOrdinaryName); 12549 12550 // Transform the declaration set. 12551 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 12552 return ExprError(); 12553 12554 // Determine the naming class. 12555 if (Old->getNamingClass()) { 12556 CXXRecordDecl *NamingClass 12557 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 12558 Old->getMemberLoc(), 12559 Old->getNamingClass())); 12560 if (!NamingClass) 12561 return ExprError(); 12562 12563 R.setNamingClass(NamingClass); 12564 } 12565 12566 TemplateArgumentListInfo TransArgs; 12567 if (Old->hasExplicitTemplateArgs()) { 12568 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 12569 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 12570 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 12571 Old->getNumTemplateArgs(), 12572 TransArgs)) 12573 return ExprError(); 12574 } 12575 12576 // FIXME: to do this check properly, we will need to preserve the 12577 // first-qualifier-in-scope here, just in case we had a dependent 12578 // base (and therefore couldn't do the check) and a 12579 // nested-name-qualifier (and therefore could do the lookup). 12580 NamedDecl *FirstQualifierInScope = nullptr; 12581 12582 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 12583 BaseType, 12584 Old->getOperatorLoc(), 12585 Old->isArrow(), 12586 QualifierLoc, 12587 TemplateKWLoc, 12588 FirstQualifierInScope, 12589 R, 12590 (Old->hasExplicitTemplateArgs() 12591 ? &TransArgs : nullptr)); 12592 } 12593 12594 template<typename Derived> 12595 ExprResult 12596 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 12597 EnterExpressionEvaluationContext Unevaluated( 12598 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 12599 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 12600 if (SubExpr.isInvalid()) 12601 return ExprError(); 12602 12603 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 12604 return E; 12605 12606 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 12607 } 12608 12609 template<typename Derived> 12610 ExprResult 12611 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 12612 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 12613 if (Pattern.isInvalid()) 12614 return ExprError(); 12615 12616 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 12617 return E; 12618 12619 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 12620 E->getNumExpansions()); 12621 } 12622 12623 template<typename Derived> 12624 ExprResult 12625 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 12626 // If E is not value-dependent, then nothing will change when we transform it. 12627 // Note: This is an instantiation-centric view. 12628 if (!E->isValueDependent()) 12629 return E; 12630 12631 EnterExpressionEvaluationContext Unevaluated( 12632 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 12633 12634 ArrayRef<TemplateArgument> PackArgs; 12635 TemplateArgument ArgStorage; 12636 12637 // Find the argument list to transform. 12638 if (E->isPartiallySubstituted()) { 12639 PackArgs = E->getPartialArguments(); 12640 } else if (E->isValueDependent()) { 12641 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 12642 bool ShouldExpand = false; 12643 bool RetainExpansion = false; 12644 Optional<unsigned> NumExpansions; 12645 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 12646 Unexpanded, 12647 ShouldExpand, RetainExpansion, 12648 NumExpansions)) 12649 return ExprError(); 12650 12651 // If we need to expand the pack, build a template argument from it and 12652 // expand that. 12653 if (ShouldExpand) { 12654 auto *Pack = E->getPack(); 12655 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 12656 ArgStorage = getSema().Context.getPackExpansionType( 12657 getSema().Context.getTypeDeclType(TTPD), None); 12658 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 12659 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 12660 } else { 12661 auto *VD = cast<ValueDecl>(Pack); 12662 ExprResult DRE = getSema().BuildDeclRefExpr( 12663 VD, VD->getType().getNonLValueExprType(getSema().Context), 12664 VD->getType()->isReferenceType() ? VK_LValue : VK_RValue, 12665 E->getPackLoc()); 12666 if (DRE.isInvalid()) 12667 return ExprError(); 12668 ArgStorage = new (getSema().Context) PackExpansionExpr( 12669 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 12670 } 12671 PackArgs = ArgStorage; 12672 } 12673 } 12674 12675 // If we're not expanding the pack, just transform the decl. 12676 if (!PackArgs.size()) { 12677 auto *Pack = cast_or_null<NamedDecl>( 12678 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 12679 if (!Pack) 12680 return ExprError(); 12681 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 12682 E->getPackLoc(), 12683 E->getRParenLoc(), None, None); 12684 } 12685 12686 // Try to compute the result without performing a partial substitution. 12687 Optional<unsigned> Result = 0; 12688 for (const TemplateArgument &Arg : PackArgs) { 12689 if (!Arg.isPackExpansion()) { 12690 Result = *Result + 1; 12691 continue; 12692 } 12693 12694 TemplateArgumentLoc ArgLoc; 12695 InventTemplateArgumentLoc(Arg, ArgLoc); 12696 12697 // Find the pattern of the pack expansion. 12698 SourceLocation Ellipsis; 12699 Optional<unsigned> OrigNumExpansions; 12700 TemplateArgumentLoc Pattern = 12701 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 12702 OrigNumExpansions); 12703 12704 // Substitute under the pack expansion. Do not expand the pack (yet). 12705 TemplateArgumentLoc OutPattern; 12706 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12707 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 12708 /*Uneval*/ true)) 12709 return true; 12710 12711 // See if we can determine the number of arguments from the result. 12712 Optional<unsigned> NumExpansions = 12713 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 12714 if (!NumExpansions) { 12715 // No: we must be in an alias template expansion, and we're going to need 12716 // to actually expand the packs. 12717 Result = None; 12718 break; 12719 } 12720 12721 Result = *Result + *NumExpansions; 12722 } 12723 12724 // Common case: we could determine the number of expansions without 12725 // substituting. 12726 if (Result) 12727 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12728 E->getPackLoc(), 12729 E->getRParenLoc(), *Result, None); 12730 12731 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 12732 E->getPackLoc()); 12733 { 12734 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 12735 typedef TemplateArgumentLocInventIterator< 12736 Derived, const TemplateArgument*> PackLocIterator; 12737 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 12738 PackLocIterator(*this, PackArgs.end()), 12739 TransformedPackArgs, /*Uneval*/true)) 12740 return ExprError(); 12741 } 12742 12743 // Check whether we managed to fully-expand the pack. 12744 // FIXME: Is it possible for us to do so and not hit the early exit path? 12745 SmallVector<TemplateArgument, 8> Args; 12746 bool PartialSubstitution = false; 12747 for (auto &Loc : TransformedPackArgs.arguments()) { 12748 Args.push_back(Loc.getArgument()); 12749 if (Loc.getArgument().isPackExpansion()) 12750 PartialSubstitution = true; 12751 } 12752 12753 if (PartialSubstitution) 12754 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12755 E->getPackLoc(), 12756 E->getRParenLoc(), None, Args); 12757 12758 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 12759 E->getPackLoc(), E->getRParenLoc(), 12760 Args.size(), None); 12761 } 12762 12763 template<typename Derived> 12764 ExprResult 12765 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 12766 SubstNonTypeTemplateParmPackExpr *E) { 12767 // Default behavior is to do nothing with this transformation. 12768 return E; 12769 } 12770 12771 template<typename Derived> 12772 ExprResult 12773 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 12774 SubstNonTypeTemplateParmExpr *E) { 12775 // Default behavior is to do nothing with this transformation. 12776 return E; 12777 } 12778 12779 template<typename Derived> 12780 ExprResult 12781 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 12782 // Default behavior is to do nothing with this transformation. 12783 return E; 12784 } 12785 12786 template<typename Derived> 12787 ExprResult 12788 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 12789 MaterializeTemporaryExpr *E) { 12790 return getDerived().TransformExpr(E->getSubExpr()); 12791 } 12792 12793 template<typename Derived> 12794 ExprResult 12795 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 12796 Expr *Pattern = E->getPattern(); 12797 12798 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12799 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 12800 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 12801 12802 // Determine whether the set of unexpanded parameter packs can and should 12803 // be expanded. 12804 bool Expand = true; 12805 bool RetainExpansion = false; 12806 Optional<unsigned> OrigNumExpansions = E->getNumExpansions(), 12807 NumExpansions = OrigNumExpansions; 12808 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 12809 Pattern->getSourceRange(), 12810 Unexpanded, 12811 Expand, RetainExpansion, 12812 NumExpansions)) 12813 return true; 12814 12815 if (!Expand) { 12816 // Do not expand any packs here, just transform and rebuild a fold 12817 // expression. 12818 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 12819 12820 ExprResult LHS = 12821 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 12822 if (LHS.isInvalid()) 12823 return true; 12824 12825 ExprResult RHS = 12826 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 12827 if (RHS.isInvalid()) 12828 return true; 12829 12830 if (!getDerived().AlwaysRebuild() && 12831 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 12832 return E; 12833 12834 return getDerived().RebuildCXXFoldExpr( 12835 E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 12836 RHS.get(), E->getEndLoc(), NumExpansions); 12837 } 12838 12839 // The transform has determined that we should perform an elementwise 12840 // expansion of the pattern. Do so. 12841 ExprResult Result = getDerived().TransformExpr(E->getInit()); 12842 if (Result.isInvalid()) 12843 return true; 12844 bool LeftFold = E->isLeftFold(); 12845 12846 // If we're retaining an expansion for a right fold, it is the innermost 12847 // component and takes the init (if any). 12848 if (!LeftFold && RetainExpansion) { 12849 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12850 12851 ExprResult Out = getDerived().TransformExpr(Pattern); 12852 if (Out.isInvalid()) 12853 return true; 12854 12855 Result = getDerived().RebuildCXXFoldExpr( 12856 E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 12857 Result.get(), E->getEndLoc(), OrigNumExpansions); 12858 if (Result.isInvalid()) 12859 return true; 12860 } 12861 12862 for (unsigned I = 0; I != *NumExpansions; ++I) { 12863 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 12864 getSema(), LeftFold ? I : *NumExpansions - I - 1); 12865 ExprResult Out = getDerived().TransformExpr(Pattern); 12866 if (Out.isInvalid()) 12867 return true; 12868 12869 if (Out.get()->containsUnexpandedParameterPack()) { 12870 // We still have a pack; retain a pack expansion for this slice. 12871 Result = getDerived().RebuildCXXFoldExpr( 12872 E->getBeginLoc(), LeftFold ? Result.get() : Out.get(), 12873 E->getOperator(), E->getEllipsisLoc(), 12874 LeftFold ? Out.get() : Result.get(), E->getEndLoc(), 12875 OrigNumExpansions); 12876 } else if (Result.isUsable()) { 12877 // We've got down to a single element; build a binary operator. 12878 Result = getDerived().RebuildBinaryOperator( 12879 E->getEllipsisLoc(), E->getOperator(), 12880 LeftFold ? Result.get() : Out.get(), 12881 LeftFold ? Out.get() : Result.get()); 12882 } else 12883 Result = Out; 12884 12885 if (Result.isInvalid()) 12886 return true; 12887 } 12888 12889 // If we're retaining an expansion for a left fold, it is the outermost 12890 // component and takes the complete expansion so far as its init (if any). 12891 if (LeftFold && RetainExpansion) { 12892 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 12893 12894 ExprResult Out = getDerived().TransformExpr(Pattern); 12895 if (Out.isInvalid()) 12896 return true; 12897 12898 Result = getDerived().RebuildCXXFoldExpr( 12899 E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(), 12900 Out.get(), E->getEndLoc(), OrigNumExpansions); 12901 if (Result.isInvalid()) 12902 return true; 12903 } 12904 12905 // If we had no init and an empty pack, and we're not retaining an expansion, 12906 // then produce a fallback value or error. 12907 if (Result.isUnset()) 12908 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 12909 E->getOperator()); 12910 12911 return Result; 12912 } 12913 12914 template<typename Derived> 12915 ExprResult 12916 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 12917 CXXStdInitializerListExpr *E) { 12918 return getDerived().TransformExpr(E->getSubExpr()); 12919 } 12920 12921 template<typename Derived> 12922 ExprResult 12923 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 12924 return SemaRef.MaybeBindToTemporary(E); 12925 } 12926 12927 template<typename Derived> 12928 ExprResult 12929 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 12930 return E; 12931 } 12932 12933 template<typename Derived> 12934 ExprResult 12935 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 12936 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 12937 if (SubExpr.isInvalid()) 12938 return ExprError(); 12939 12940 if (!getDerived().AlwaysRebuild() && 12941 SubExpr.get() == E->getSubExpr()) 12942 return E; 12943 12944 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 12945 } 12946 12947 template<typename Derived> 12948 ExprResult 12949 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 12950 // Transform each of the elements. 12951 SmallVector<Expr *, 8> Elements; 12952 bool ArgChanged = false; 12953 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 12954 /*IsCall=*/false, Elements, &ArgChanged)) 12955 return ExprError(); 12956 12957 if (!getDerived().AlwaysRebuild() && !ArgChanged) 12958 return SemaRef.MaybeBindToTemporary(E); 12959 12960 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 12961 Elements.data(), 12962 Elements.size()); 12963 } 12964 12965 template<typename Derived> 12966 ExprResult 12967 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 12968 ObjCDictionaryLiteral *E) { 12969 // Transform each of the elements. 12970 SmallVector<ObjCDictionaryElement, 8> Elements; 12971 bool ArgChanged = false; 12972 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 12973 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 12974 12975 if (OrigElement.isPackExpansion()) { 12976 // This key/value element is a pack expansion. 12977 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 12978 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 12979 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 12980 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 12981 12982 // Determine whether the set of unexpanded parameter packs can 12983 // and should be expanded. 12984 bool Expand = true; 12985 bool RetainExpansion = false; 12986 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 12987 Optional<unsigned> NumExpansions = OrigNumExpansions; 12988 SourceRange PatternRange(OrigElement.Key->getBeginLoc(), 12989 OrigElement.Value->getEndLoc()); 12990 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 12991 PatternRange, Unexpanded, Expand, 12992 RetainExpansion, NumExpansions)) 12993 return ExprError(); 12994 12995 if (!Expand) { 12996 // The transform has determined that we should perform a simple 12997 // transformation on the pack expansion, producing another pack 12998 // expansion. 12999 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 13000 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13001 if (Key.isInvalid()) 13002 return ExprError(); 13003 13004 if (Key.get() != OrigElement.Key) 13005 ArgChanged = true; 13006 13007 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13008 if (Value.isInvalid()) 13009 return ExprError(); 13010 13011 if (Value.get() != OrigElement.Value) 13012 ArgChanged = true; 13013 13014 ObjCDictionaryElement Expansion = { 13015 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 13016 }; 13017 Elements.push_back(Expansion); 13018 continue; 13019 } 13020 13021 // Record right away that the argument was changed. This needs 13022 // to happen even if the array expands to nothing. 13023 ArgChanged = true; 13024 13025 // The transform has determined that we should perform an elementwise 13026 // expansion of the pattern. Do so. 13027 for (unsigned I = 0; I != *NumExpansions; ++I) { 13028 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 13029 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13030 if (Key.isInvalid()) 13031 return ExprError(); 13032 13033 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 13034 if (Value.isInvalid()) 13035 return ExprError(); 13036 13037 ObjCDictionaryElement Element = { 13038 Key.get(), Value.get(), SourceLocation(), NumExpansions 13039 }; 13040 13041 // If any unexpanded parameter packs remain, we still have a 13042 // pack expansion. 13043 // FIXME: Can this really happen? 13044 if (Key.get()->containsUnexpandedParameterPack() || 13045 Value.get()->containsUnexpandedParameterPack()) 13046 Element.EllipsisLoc = OrigElement.EllipsisLoc; 13047 13048 Elements.push_back(Element); 13049 } 13050 13051 // FIXME: Retain a pack expansion if RetainExpansion is true. 13052 13053 // We've finished with this pack expansion. 13054 continue; 13055 } 13056 13057 // Transform and check key. 13058 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 13059 if (Key.isInvalid()) 13060 return ExprError(); 13061 13062 if (Key.get() != OrigElement.Key) 13063 ArgChanged = true; 13064 13065 // Transform and check value. 13066 ExprResult Value 13067 = getDerived().TransformExpr(OrigElement.Value); 13068 if (Value.isInvalid()) 13069 return ExprError(); 13070 13071 if (Value.get() != OrigElement.Value) 13072 ArgChanged = true; 13073 13074 ObjCDictionaryElement Element = { 13075 Key.get(), Value.get(), SourceLocation(), None 13076 }; 13077 Elements.push_back(Element); 13078 } 13079 13080 if (!getDerived().AlwaysRebuild() && !ArgChanged) 13081 return SemaRef.MaybeBindToTemporary(E); 13082 13083 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 13084 Elements); 13085 } 13086 13087 template<typename Derived> 13088 ExprResult 13089 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 13090 TypeSourceInfo *EncodedTypeInfo 13091 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 13092 if (!EncodedTypeInfo) 13093 return ExprError(); 13094 13095 if (!getDerived().AlwaysRebuild() && 13096 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 13097 return E; 13098 13099 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 13100 EncodedTypeInfo, 13101 E->getRParenLoc()); 13102 } 13103 13104 template<typename Derived> 13105 ExprResult TreeTransform<Derived>:: 13106 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 13107 // This is a kind of implicit conversion, and it needs to get dropped 13108 // and recomputed for the same general reasons that ImplicitCastExprs 13109 // do, as well a more specific one: this expression is only valid when 13110 // it appears *immediately* as an argument expression. 13111 return getDerived().TransformExpr(E->getSubExpr()); 13112 } 13113 13114 template<typename Derived> 13115 ExprResult TreeTransform<Derived>:: 13116 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 13117 TypeSourceInfo *TSInfo 13118 = getDerived().TransformType(E->getTypeInfoAsWritten()); 13119 if (!TSInfo) 13120 return ExprError(); 13121 13122 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 13123 if (Result.isInvalid()) 13124 return ExprError(); 13125 13126 if (!getDerived().AlwaysRebuild() && 13127 TSInfo == E->getTypeInfoAsWritten() && 13128 Result.get() == E->getSubExpr()) 13129 return E; 13130 13131 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 13132 E->getBridgeKeywordLoc(), TSInfo, 13133 Result.get()); 13134 } 13135 13136 template <typename Derived> 13137 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 13138 ObjCAvailabilityCheckExpr *E) { 13139 return E; 13140 } 13141 13142 template<typename Derived> 13143 ExprResult 13144 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 13145 // Transform arguments. 13146 bool ArgChanged = false; 13147 SmallVector<Expr*, 8> Args; 13148 Args.reserve(E->getNumArgs()); 13149 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 13150 &ArgChanged)) 13151 return ExprError(); 13152 13153 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 13154 // Class message: transform the receiver type. 13155 TypeSourceInfo *ReceiverTypeInfo 13156 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 13157 if (!ReceiverTypeInfo) 13158 return ExprError(); 13159 13160 // If nothing changed, just retain the existing message send. 13161 if (!getDerived().AlwaysRebuild() && 13162 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 13163 return SemaRef.MaybeBindToTemporary(E); 13164 13165 // Build a new class message send. 13166 SmallVector<SourceLocation, 16> SelLocs; 13167 E->getSelectorLocs(SelLocs); 13168 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 13169 E->getSelector(), 13170 SelLocs, 13171 E->getMethodDecl(), 13172 E->getLeftLoc(), 13173 Args, 13174 E->getRightLoc()); 13175 } 13176 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 13177 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 13178 if (!E->getMethodDecl()) 13179 return ExprError(); 13180 13181 // Build a new class message send to 'super'. 13182 SmallVector<SourceLocation, 16> SelLocs; 13183 E->getSelectorLocs(SelLocs); 13184 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 13185 E->getSelector(), 13186 SelLocs, 13187 E->getReceiverType(), 13188 E->getMethodDecl(), 13189 E->getLeftLoc(), 13190 Args, 13191 E->getRightLoc()); 13192 } 13193 13194 // Instance message: transform the receiver 13195 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 13196 "Only class and instance messages may be instantiated"); 13197 ExprResult Receiver 13198 = getDerived().TransformExpr(E->getInstanceReceiver()); 13199 if (Receiver.isInvalid()) 13200 return ExprError(); 13201 13202 // If nothing changed, just retain the existing message send. 13203 if (!getDerived().AlwaysRebuild() && 13204 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 13205 return SemaRef.MaybeBindToTemporary(E); 13206 13207 // Build a new instance message send. 13208 SmallVector<SourceLocation, 16> SelLocs; 13209 E->getSelectorLocs(SelLocs); 13210 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 13211 E->getSelector(), 13212 SelLocs, 13213 E->getMethodDecl(), 13214 E->getLeftLoc(), 13215 Args, 13216 E->getRightLoc()); 13217 } 13218 13219 template<typename Derived> 13220 ExprResult 13221 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 13222 return E; 13223 } 13224 13225 template<typename Derived> 13226 ExprResult 13227 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 13228 return E; 13229 } 13230 13231 template<typename Derived> 13232 ExprResult 13233 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 13234 // Transform the base expression. 13235 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13236 if (Base.isInvalid()) 13237 return ExprError(); 13238 13239 // We don't need to transform the ivar; it will never change. 13240 13241 // If nothing changed, just retain the existing expression. 13242 if (!getDerived().AlwaysRebuild() && 13243 Base.get() == E->getBase()) 13244 return E; 13245 13246 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 13247 E->getLocation(), 13248 E->isArrow(), E->isFreeIvar()); 13249 } 13250 13251 template<typename Derived> 13252 ExprResult 13253 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 13254 // 'super' and types never change. Property never changes. Just 13255 // retain the existing expression. 13256 if (!E->isObjectReceiver()) 13257 return E; 13258 13259 // Transform the base expression. 13260 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13261 if (Base.isInvalid()) 13262 return ExprError(); 13263 13264 // We don't need to transform the property; it will never change. 13265 13266 // If nothing changed, just retain the existing expression. 13267 if (!getDerived().AlwaysRebuild() && 13268 Base.get() == E->getBase()) 13269 return E; 13270 13271 if (E->isExplicitProperty()) 13272 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13273 E->getExplicitProperty(), 13274 E->getLocation()); 13275 13276 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 13277 SemaRef.Context.PseudoObjectTy, 13278 E->getImplicitPropertyGetter(), 13279 E->getImplicitPropertySetter(), 13280 E->getLocation()); 13281 } 13282 13283 template<typename Derived> 13284 ExprResult 13285 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 13286 // Transform the base expression. 13287 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 13288 if (Base.isInvalid()) 13289 return ExprError(); 13290 13291 // Transform the key expression. 13292 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 13293 if (Key.isInvalid()) 13294 return ExprError(); 13295 13296 // If nothing changed, just retain the existing expression. 13297 if (!getDerived().AlwaysRebuild() && 13298 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 13299 return E; 13300 13301 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 13302 Base.get(), Key.get(), 13303 E->getAtIndexMethodDecl(), 13304 E->setAtIndexMethodDecl()); 13305 } 13306 13307 template<typename Derived> 13308 ExprResult 13309 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 13310 // Transform the base expression. 13311 ExprResult Base = getDerived().TransformExpr(E->getBase()); 13312 if (Base.isInvalid()) 13313 return ExprError(); 13314 13315 // If nothing changed, just retain the existing expression. 13316 if (!getDerived().AlwaysRebuild() && 13317 Base.get() == E->getBase()) 13318 return E; 13319 13320 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 13321 E->getOpLoc(), 13322 E->isArrow()); 13323 } 13324 13325 template<typename Derived> 13326 ExprResult 13327 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 13328 bool ArgumentChanged = false; 13329 SmallVector<Expr*, 8> SubExprs; 13330 SubExprs.reserve(E->getNumSubExprs()); 13331 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13332 SubExprs, &ArgumentChanged)) 13333 return ExprError(); 13334 13335 if (!getDerived().AlwaysRebuild() && 13336 !ArgumentChanged) 13337 return E; 13338 13339 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 13340 SubExprs, 13341 E->getRParenLoc()); 13342 } 13343 13344 template<typename Derived> 13345 ExprResult 13346 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 13347 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 13348 if (SrcExpr.isInvalid()) 13349 return ExprError(); 13350 13351 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 13352 if (!Type) 13353 return ExprError(); 13354 13355 if (!getDerived().AlwaysRebuild() && 13356 Type == E->getTypeSourceInfo() && 13357 SrcExpr.get() == E->getSrcExpr()) 13358 return E; 13359 13360 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 13361 SrcExpr.get(), Type, 13362 E->getRParenLoc()); 13363 } 13364 13365 template<typename Derived> 13366 ExprResult 13367 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 13368 BlockDecl *oldBlock = E->getBlockDecl(); 13369 13370 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 13371 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 13372 13373 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 13374 blockScope->TheDecl->setBlockMissingReturnType( 13375 oldBlock->blockMissingReturnType()); 13376 13377 SmallVector<ParmVarDecl*, 4> params; 13378 SmallVector<QualType, 4> paramTypes; 13379 13380 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 13381 13382 // Parameter substitution. 13383 Sema::ExtParameterInfoBuilder extParamInfos; 13384 if (getDerived().TransformFunctionTypeParams( 13385 E->getCaretLocation(), oldBlock->parameters(), nullptr, 13386 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 13387 extParamInfos)) { 13388 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13389 return ExprError(); 13390 } 13391 13392 QualType exprResultType = 13393 getDerived().TransformType(exprFunctionType->getReturnType()); 13394 13395 auto epi = exprFunctionType->getExtProtoInfo(); 13396 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 13397 13398 QualType functionType = 13399 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 13400 blockScope->FunctionType = functionType; 13401 13402 // Set the parameters on the block decl. 13403 if (!params.empty()) 13404 blockScope->TheDecl->setParams(params); 13405 13406 if (!oldBlock->blockMissingReturnType()) { 13407 blockScope->HasImplicitReturnType = false; 13408 blockScope->ReturnType = exprResultType; 13409 } 13410 13411 // Transform the body 13412 StmtResult body = getDerived().TransformStmt(E->getBody()); 13413 if (body.isInvalid()) { 13414 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 13415 return ExprError(); 13416 } 13417 13418 #ifndef NDEBUG 13419 // In builds with assertions, make sure that we captured everything we 13420 // captured before. 13421 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 13422 for (const auto &I : oldBlock->captures()) { 13423 VarDecl *oldCapture = I.getVariable(); 13424 13425 // Ignore parameter packs. 13426 if (oldCapture->isParameterPack()) 13427 continue; 13428 13429 VarDecl *newCapture = 13430 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 13431 oldCapture)); 13432 assert(blockScope->CaptureMap.count(newCapture)); 13433 } 13434 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 13435 } 13436 #endif 13437 13438 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 13439 /*Scope=*/nullptr); 13440 } 13441 13442 template<typename Derived> 13443 ExprResult 13444 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 13445 llvm_unreachable("Cannot transform asType expressions yet"); 13446 } 13447 13448 template<typename Derived> 13449 ExprResult 13450 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 13451 bool ArgumentChanged = false; 13452 SmallVector<Expr*, 8> SubExprs; 13453 SubExprs.reserve(E->getNumSubExprs()); 13454 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 13455 SubExprs, &ArgumentChanged)) 13456 return ExprError(); 13457 13458 if (!getDerived().AlwaysRebuild() && 13459 !ArgumentChanged) 13460 return E; 13461 13462 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 13463 E->getOp(), E->getRParenLoc()); 13464 } 13465 13466 //===----------------------------------------------------------------------===// 13467 // Type reconstruction 13468 //===----------------------------------------------------------------------===// 13469 13470 template<typename Derived> 13471 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 13472 SourceLocation Star) { 13473 return SemaRef.BuildPointerType(PointeeType, Star, 13474 getDerived().getBaseEntity()); 13475 } 13476 13477 template<typename Derived> 13478 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 13479 SourceLocation Star) { 13480 return SemaRef.BuildBlockPointerType(PointeeType, Star, 13481 getDerived().getBaseEntity()); 13482 } 13483 13484 template<typename Derived> 13485 QualType 13486 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 13487 bool WrittenAsLValue, 13488 SourceLocation Sigil) { 13489 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 13490 Sigil, getDerived().getBaseEntity()); 13491 } 13492 13493 template<typename Derived> 13494 QualType 13495 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 13496 QualType ClassType, 13497 SourceLocation Sigil) { 13498 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 13499 getDerived().getBaseEntity()); 13500 } 13501 13502 template<typename Derived> 13503 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 13504 const ObjCTypeParamDecl *Decl, 13505 SourceLocation ProtocolLAngleLoc, 13506 ArrayRef<ObjCProtocolDecl *> Protocols, 13507 ArrayRef<SourceLocation> ProtocolLocs, 13508 SourceLocation ProtocolRAngleLoc) { 13509 return SemaRef.BuildObjCTypeParamType(Decl, 13510 ProtocolLAngleLoc, Protocols, 13511 ProtocolLocs, ProtocolRAngleLoc, 13512 /*FailOnError=*/true); 13513 } 13514 13515 template<typename Derived> 13516 QualType TreeTransform<Derived>::RebuildObjCObjectType( 13517 QualType BaseType, 13518 SourceLocation Loc, 13519 SourceLocation TypeArgsLAngleLoc, 13520 ArrayRef<TypeSourceInfo *> TypeArgs, 13521 SourceLocation TypeArgsRAngleLoc, 13522 SourceLocation ProtocolLAngleLoc, 13523 ArrayRef<ObjCProtocolDecl *> Protocols, 13524 ArrayRef<SourceLocation> ProtocolLocs, 13525 SourceLocation ProtocolRAngleLoc) { 13526 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 13527 TypeArgs, TypeArgsRAngleLoc, 13528 ProtocolLAngleLoc, Protocols, ProtocolLocs, 13529 ProtocolRAngleLoc, 13530 /*FailOnError=*/true); 13531 } 13532 13533 template<typename Derived> 13534 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 13535 QualType PointeeType, 13536 SourceLocation Star) { 13537 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 13538 } 13539 13540 template<typename Derived> 13541 QualType 13542 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 13543 ArrayType::ArraySizeModifier SizeMod, 13544 const llvm::APInt *Size, 13545 Expr *SizeExpr, 13546 unsigned IndexTypeQuals, 13547 SourceRange BracketsRange) { 13548 if (SizeExpr || !Size) 13549 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 13550 IndexTypeQuals, BracketsRange, 13551 getDerived().getBaseEntity()); 13552 13553 QualType Types[] = { 13554 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 13555 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 13556 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 13557 }; 13558 const unsigned NumTypes = llvm::array_lengthof(Types); 13559 QualType SizeType; 13560 for (unsigned I = 0; I != NumTypes; ++I) 13561 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 13562 SizeType = Types[I]; 13563 break; 13564 } 13565 13566 // Note that we can return a VariableArrayType here in the case where 13567 // the element type was a dependent VariableArrayType. 13568 IntegerLiteral *ArraySize 13569 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 13570 /*FIXME*/BracketsRange.getBegin()); 13571 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 13572 IndexTypeQuals, BracketsRange, 13573 getDerived().getBaseEntity()); 13574 } 13575 13576 template<typename Derived> 13577 QualType 13578 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 13579 ArrayType::ArraySizeModifier SizeMod, 13580 const llvm::APInt &Size, 13581 Expr *SizeExpr, 13582 unsigned IndexTypeQuals, 13583 SourceRange BracketsRange) { 13584 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 13585 IndexTypeQuals, BracketsRange); 13586 } 13587 13588 template<typename Derived> 13589 QualType 13590 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 13591 ArrayType::ArraySizeModifier SizeMod, 13592 unsigned IndexTypeQuals, 13593 SourceRange BracketsRange) { 13594 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 13595 IndexTypeQuals, BracketsRange); 13596 } 13597 13598 template<typename Derived> 13599 QualType 13600 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 13601 ArrayType::ArraySizeModifier SizeMod, 13602 Expr *SizeExpr, 13603 unsigned IndexTypeQuals, 13604 SourceRange BracketsRange) { 13605 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13606 SizeExpr, 13607 IndexTypeQuals, BracketsRange); 13608 } 13609 13610 template<typename Derived> 13611 QualType 13612 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 13613 ArrayType::ArraySizeModifier SizeMod, 13614 Expr *SizeExpr, 13615 unsigned IndexTypeQuals, 13616 SourceRange BracketsRange) { 13617 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 13618 SizeExpr, 13619 IndexTypeQuals, BracketsRange); 13620 } 13621 13622 template <typename Derived> 13623 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType( 13624 QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) { 13625 return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr, 13626 AttributeLoc); 13627 } 13628 13629 template <typename Derived> 13630 QualType 13631 TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 13632 unsigned NumElements, 13633 VectorType::VectorKind VecKind) { 13634 // FIXME: semantic checking! 13635 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 13636 } 13637 13638 template <typename Derived> 13639 QualType TreeTransform<Derived>::RebuildDependentVectorType( 13640 QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc, 13641 VectorType::VectorKind VecKind) { 13642 return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc); 13643 } 13644 13645 template<typename Derived> 13646 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 13647 unsigned NumElements, 13648 SourceLocation AttributeLoc) { 13649 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 13650 NumElements, true); 13651 IntegerLiteral *VectorSize 13652 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 13653 AttributeLoc); 13654 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 13655 } 13656 13657 template<typename Derived> 13658 QualType 13659 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 13660 Expr *SizeExpr, 13661 SourceLocation AttributeLoc) { 13662 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 13663 } 13664 13665 template<typename Derived> 13666 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 13667 QualType T, 13668 MutableArrayRef<QualType> ParamTypes, 13669 const FunctionProtoType::ExtProtoInfo &EPI) { 13670 return SemaRef.BuildFunctionType(T, ParamTypes, 13671 getDerived().getBaseLocation(), 13672 getDerived().getBaseEntity(), 13673 EPI); 13674 } 13675 13676 template<typename Derived> 13677 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 13678 return SemaRef.Context.getFunctionNoProtoType(T); 13679 } 13680 13681 template<typename Derived> 13682 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 13683 Decl *D) { 13684 assert(D && "no decl found"); 13685 if (D->isInvalidDecl()) return QualType(); 13686 13687 // FIXME: Doesn't account for ObjCInterfaceDecl! 13688 TypeDecl *Ty; 13689 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 13690 // A valid resolved using typename pack expansion decl can have multiple 13691 // UsingDecls, but they must each have exactly one type, and it must be 13692 // the same type in every case. But we must have at least one expansion! 13693 if (UPD->expansions().empty()) { 13694 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 13695 << UPD->isCXXClassMember() << UPD; 13696 return QualType(); 13697 } 13698 13699 // We might still have some unresolved types. Try to pick a resolved type 13700 // if we can. The final instantiation will check that the remaining 13701 // unresolved types instantiate to the type we pick. 13702 QualType FallbackT; 13703 QualType T; 13704 for (auto *E : UPD->expansions()) { 13705 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 13706 if (ThisT.isNull()) 13707 continue; 13708 else if (ThisT->getAs<UnresolvedUsingType>()) 13709 FallbackT = ThisT; 13710 else if (T.isNull()) 13711 T = ThisT; 13712 else 13713 assert(getSema().Context.hasSameType(ThisT, T) && 13714 "mismatched resolved types in using pack expansion"); 13715 } 13716 return T.isNull() ? FallbackT : T; 13717 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 13718 assert(Using->hasTypename() && 13719 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 13720 13721 // A valid resolved using typename decl points to exactly one type decl. 13722 assert(++Using->shadow_begin() == Using->shadow_end()); 13723 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 13724 } else { 13725 assert(isa<UnresolvedUsingTypenameDecl>(D) && 13726 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 13727 Ty = cast<UnresolvedUsingTypenameDecl>(D); 13728 } 13729 13730 return SemaRef.Context.getTypeDeclType(Ty); 13731 } 13732 13733 template<typename Derived> 13734 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 13735 SourceLocation Loc) { 13736 return SemaRef.BuildTypeofExprType(E, Loc); 13737 } 13738 13739 template<typename Derived> 13740 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 13741 return SemaRef.Context.getTypeOfType(Underlying); 13742 } 13743 13744 template<typename Derived> 13745 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 13746 SourceLocation Loc) { 13747 return SemaRef.BuildDecltypeType(E, Loc); 13748 } 13749 13750 template<typename Derived> 13751 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 13752 UnaryTransformType::UTTKind UKind, 13753 SourceLocation Loc) { 13754 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 13755 } 13756 13757 template<typename Derived> 13758 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 13759 TemplateName Template, 13760 SourceLocation TemplateNameLoc, 13761 TemplateArgumentListInfo &TemplateArgs) { 13762 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 13763 } 13764 13765 template<typename Derived> 13766 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 13767 SourceLocation KWLoc) { 13768 return SemaRef.BuildAtomicType(ValueType, KWLoc); 13769 } 13770 13771 template<typename Derived> 13772 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 13773 SourceLocation KWLoc, 13774 bool isReadPipe) { 13775 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 13776 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 13777 } 13778 13779 template<typename Derived> 13780 TemplateName 13781 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13782 bool TemplateKW, 13783 TemplateDecl *Template) { 13784 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 13785 Template); 13786 } 13787 13788 template<typename Derived> 13789 TemplateName 13790 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13791 SourceLocation TemplateKWLoc, 13792 const IdentifierInfo &Name, 13793 SourceLocation NameLoc, 13794 QualType ObjectType, 13795 NamedDecl *FirstQualifierInScope, 13796 bool AllowInjectedClassName) { 13797 UnqualifiedId TemplateName; 13798 TemplateName.setIdentifier(&Name, NameLoc); 13799 Sema::TemplateTy Template; 13800 getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc, 13801 TemplateName, ParsedType::make(ObjectType), 13802 /*EnteringContext=*/false, Template, 13803 AllowInjectedClassName); 13804 return Template.get(); 13805 } 13806 13807 template<typename Derived> 13808 TemplateName 13809 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 13810 SourceLocation TemplateKWLoc, 13811 OverloadedOperatorKind Operator, 13812 SourceLocation NameLoc, 13813 QualType ObjectType, 13814 bool AllowInjectedClassName) { 13815 UnqualifiedId Name; 13816 // FIXME: Bogus location information. 13817 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 13818 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 13819 Sema::TemplateTy Template; 13820 getSema().ActOnTemplateName( 13821 /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType), 13822 /*EnteringContext=*/false, Template, AllowInjectedClassName); 13823 return Template.get(); 13824 } 13825 13826 template<typename Derived> 13827 ExprResult 13828 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 13829 SourceLocation OpLoc, 13830 Expr *OrigCallee, 13831 Expr *First, 13832 Expr *Second) { 13833 Expr *Callee = OrigCallee->IgnoreParenCasts(); 13834 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 13835 13836 if (First->getObjectKind() == OK_ObjCProperty) { 13837 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 13838 if (BinaryOperator::isAssignmentOp(Opc)) 13839 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 13840 First, Second); 13841 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 13842 if (Result.isInvalid()) 13843 return ExprError(); 13844 First = Result.get(); 13845 } 13846 13847 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 13848 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 13849 if (Result.isInvalid()) 13850 return ExprError(); 13851 Second = Result.get(); 13852 } 13853 13854 // Determine whether this should be a builtin operation. 13855 if (Op == OO_Subscript) { 13856 if (!First->getType()->isOverloadableType() && 13857 !Second->getType()->isOverloadableType()) 13858 return getSema().CreateBuiltinArraySubscriptExpr( 13859 First, Callee->getBeginLoc(), Second, OpLoc); 13860 } else if (Op == OO_Arrow) { 13861 // -> is never a builtin operation. 13862 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 13863 } else if (Second == nullptr || isPostIncDec) { 13864 if (!First->getType()->isOverloadableType() || 13865 (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) { 13866 // The argument is not of overloadable type, or this is an expression 13867 // of the form &Class::member, so try to create a built-in unary 13868 // operation. 13869 UnaryOperatorKind Opc 13870 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 13871 13872 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 13873 } 13874 } else { 13875 if (!First->getType()->isOverloadableType() && 13876 !Second->getType()->isOverloadableType()) { 13877 // Neither of the arguments is an overloadable type, so try to 13878 // create a built-in binary operation. 13879 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 13880 ExprResult Result 13881 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 13882 if (Result.isInvalid()) 13883 return ExprError(); 13884 13885 return Result; 13886 } 13887 } 13888 13889 // Compute the transformed set of functions (and function templates) to be 13890 // used during overload resolution. 13891 UnresolvedSet<16> Functions; 13892 bool RequiresADL; 13893 13894 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 13895 Functions.append(ULE->decls_begin(), ULE->decls_end()); 13896 // If the overload could not be resolved in the template definition 13897 // (because we had a dependent argument), ADL is performed as part of 13898 // template instantiation. 13899 RequiresADL = ULE->requiresADL(); 13900 } else { 13901 // If we've resolved this to a particular non-member function, just call 13902 // that function. If we resolved it to a member function, 13903 // CreateOverloaded* will find that function for us. 13904 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 13905 if (!isa<CXXMethodDecl>(ND)) 13906 Functions.addDecl(ND); 13907 RequiresADL = false; 13908 } 13909 13910 // Add any functions found via argument-dependent lookup. 13911 Expr *Args[2] = { First, Second }; 13912 unsigned NumArgs = 1 + (Second != nullptr); 13913 13914 // Create the overloaded operator invocation for unary operators. 13915 if (NumArgs == 1 || isPostIncDec) { 13916 UnaryOperatorKind Opc 13917 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 13918 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First, 13919 RequiresADL); 13920 } 13921 13922 if (Op == OO_Subscript) { 13923 SourceLocation LBrace; 13924 SourceLocation RBrace; 13925 13926 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 13927 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 13928 LBrace = SourceLocation::getFromRawEncoding( 13929 NameLoc.CXXOperatorName.BeginOpNameLoc); 13930 RBrace = SourceLocation::getFromRawEncoding( 13931 NameLoc.CXXOperatorName.EndOpNameLoc); 13932 } else { 13933 LBrace = Callee->getBeginLoc(); 13934 RBrace = OpLoc; 13935 } 13936 13937 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 13938 First, Second); 13939 } 13940 13941 // Create the overloaded operator invocation for binary operators. 13942 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 13943 ExprResult Result = SemaRef.CreateOverloadedBinOp( 13944 OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL); 13945 if (Result.isInvalid()) 13946 return ExprError(); 13947 13948 return Result; 13949 } 13950 13951 template<typename Derived> 13952 ExprResult 13953 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 13954 SourceLocation OperatorLoc, 13955 bool isArrow, 13956 CXXScopeSpec &SS, 13957 TypeSourceInfo *ScopeType, 13958 SourceLocation CCLoc, 13959 SourceLocation TildeLoc, 13960 PseudoDestructorTypeStorage Destroyed) { 13961 QualType BaseType = Base->getType(); 13962 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 13963 (!isArrow && !BaseType->getAs<RecordType>()) || 13964 (isArrow && BaseType->getAs<PointerType>() && 13965 !BaseType->castAs<PointerType>()->getPointeeType() 13966 ->template getAs<RecordType>())){ 13967 // This pseudo-destructor expression is still a pseudo-destructor. 13968 return SemaRef.BuildPseudoDestructorExpr( 13969 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 13970 CCLoc, TildeLoc, Destroyed); 13971 } 13972 13973 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 13974 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 13975 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 13976 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 13977 NameInfo.setNamedTypeInfo(DestroyedType); 13978 13979 // The scope type is now known to be a valid nested name specifier 13980 // component. Tack it on to the end of the nested name specifier. 13981 if (ScopeType) { 13982 if (!ScopeType->getType()->getAs<TagType>()) { 13983 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 13984 diag::err_expected_class_or_namespace) 13985 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 13986 return ExprError(); 13987 } 13988 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 13989 CCLoc); 13990 } 13991 13992 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 13993 return getSema().BuildMemberReferenceExpr(Base, BaseType, 13994 OperatorLoc, isArrow, 13995 SS, TemplateKWLoc, 13996 /*FIXME: FirstQualifier*/ nullptr, 13997 NameInfo, 13998 /*TemplateArgs*/ nullptr, 13999 /*S*/nullptr); 14000 } 14001 14002 template<typename Derived> 14003 StmtResult 14004 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 14005 SourceLocation Loc = S->getBeginLoc(); 14006 CapturedDecl *CD = S->getCapturedDecl(); 14007 unsigned NumParams = CD->getNumParams(); 14008 unsigned ContextParamPos = CD->getContextParamPosition(); 14009 SmallVector<Sema::CapturedParamNameType, 4> Params; 14010 for (unsigned I = 0; I < NumParams; ++I) { 14011 if (I != ContextParamPos) { 14012 Params.push_back( 14013 std::make_pair( 14014 CD->getParam(I)->getName(), 14015 getDerived().TransformType(CD->getParam(I)->getType()))); 14016 } else { 14017 Params.push_back(std::make_pair(StringRef(), QualType())); 14018 } 14019 } 14020 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 14021 S->getCapturedRegionKind(), Params); 14022 StmtResult Body; 14023 { 14024 Sema::CompoundScopeRAII CompoundScope(getSema()); 14025 Body = getDerived().TransformStmt(S->getCapturedStmt()); 14026 } 14027 14028 if (Body.isInvalid()) { 14029 getSema().ActOnCapturedRegionError(); 14030 return StmtError(); 14031 } 14032 14033 return getSema().ActOnCapturedRegionEnd(Body.get()); 14034 } 14035 14036 } // end namespace clang 14037 14038 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 14039