1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements a semantic tree transformation that takes a given 10 // AST and rebuilds it, possibly transforming some nodes in the process. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 15 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 16 17 #include "CoroutineStmtBuilder.h" 18 #include "TypeLocBuilder.h" 19 #include "clang/AST/Decl.h" 20 #include "clang/AST/DeclObjC.h" 21 #include "clang/AST/DeclTemplate.h" 22 #include "clang/AST/Expr.h" 23 #include "clang/AST/ExprCXX.h" 24 #include "clang/AST/ExprObjC.h" 25 #include "clang/AST/ExprOpenMP.h" 26 #include "clang/AST/Stmt.h" 27 #include "clang/AST/StmtCXX.h" 28 #include "clang/AST/StmtObjC.h" 29 #include "clang/AST/StmtOpenMP.h" 30 #include "clang/Sema/Designator.h" 31 #include "clang/Sema/Lookup.h" 32 #include "clang/Sema/Ownership.h" 33 #include "clang/Sema/ParsedTemplate.h" 34 #include "clang/Sema/ScopeInfo.h" 35 #include "clang/Sema/SemaDiagnostic.h" 36 #include "clang/Sema/SemaInternal.h" 37 #include "llvm/ADT/ArrayRef.h" 38 #include "llvm/Support/ErrorHandling.h" 39 #include <algorithm> 40 41 namespace clang { 42 using namespace sema; 43 44 /// \brief A semantic tree transformation that allows one to transform one 45 /// abstract syntax tree into another. 46 /// 47 /// A new tree transformation is defined by creating a new subclass \c X of 48 /// \c TreeTransform<X> and then overriding certain operations to provide 49 /// behavior specific to that transformation. For example, template 50 /// instantiation is implemented as a tree transformation where the 51 /// transformation of TemplateTypeParmType nodes involves substituting the 52 /// template arguments for their corresponding template parameters; a similar 53 /// transformation is performed for non-type template parameters and 54 /// template template parameters. 55 /// 56 /// This tree-transformation template uses static polymorphism to allow 57 /// subclasses to customize any of its operations. Thus, a subclass can 58 /// override any of the transformation or rebuild operators by providing an 59 /// operation with the same signature as the default implementation. The 60 /// overridding function should not be virtual. 61 /// 62 /// Semantic tree transformations are split into two stages, either of which 63 /// can be replaced by a subclass. The "transform" step transforms an AST node 64 /// or the parts of an AST node using the various transformation functions, 65 /// then passes the pieces on to the "rebuild" step, which constructs a new AST 66 /// node of the appropriate kind from the pieces. The default transformation 67 /// routines recursively transform the operands to composite AST nodes (e.g., 68 /// the pointee type of a PointerType node) and, if any of those operand nodes 69 /// were changed by the transformation, invokes the rebuild operation to create 70 /// a new AST node. 71 /// 72 /// Subclasses can customize the transformation at various levels. The 73 /// most coarse-grained transformations involve replacing TransformType(), 74 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 75 /// TransformTemplateName(), or TransformTemplateArgument() with entirely 76 /// new implementations. 77 /// 78 /// For more fine-grained transformations, subclasses can replace any of the 79 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 80 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 81 /// replacing TransformTemplateTypeParmType() allows template instantiation 82 /// to substitute template arguments for their corresponding template 83 /// parameters. Additionally, subclasses can override the \c RebuildXXX 84 /// functions to control how AST nodes are rebuilt when their operands change. 85 /// By default, \c TreeTransform will invoke semantic analysis to rebuild 86 /// AST nodes. However, certain other tree transformations (e.g, cloning) may 87 /// be able to use more efficient rebuild steps. 88 /// 89 /// There are a handful of other functions that can be overridden, allowing one 90 /// to avoid traversing nodes that don't need any transformation 91 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 92 /// operands have not changed (\c AlwaysRebuild()), and customize the 93 /// default locations and entity names used for type-checking 94 /// (\c getBaseLocation(), \c getBaseEntity()). 95 template<typename Derived> 96 class TreeTransform { 97 /// \brief Private RAII object that helps us forget and then re-remember 98 /// the template argument corresponding to a partially-substituted parameter 99 /// pack. 100 class ForgetPartiallySubstitutedPackRAII { 101 Derived &Self; 102 TemplateArgument Old; 103 104 public: 105 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 106 Old = Self.ForgetPartiallySubstitutedPack(); 107 } 108 109 ~ForgetPartiallySubstitutedPackRAII() { 110 Self.RememberPartiallySubstitutedPack(Old); 111 } 112 }; 113 114 protected: 115 Sema &SemaRef; 116 117 /// \brief The set of local declarations that have been transformed, for 118 /// cases where we are forced to build new declarations within the transformer 119 /// rather than in the subclass (e.g., lambda closure types). 120 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 121 122 public: 123 /// \brief Initializes a new tree transformer. 124 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 125 126 /// \brief Retrieves a reference to the derived class. 127 Derived &getDerived() { return static_cast<Derived&>(*this); } 128 129 /// \brief Retrieves a reference to the derived class. 130 const Derived &getDerived() const { 131 return static_cast<const Derived&>(*this); 132 } 133 134 static inline ExprResult Owned(Expr *E) { return E; } 135 static inline StmtResult Owned(Stmt *S) { return S; } 136 137 /// \brief Retrieves a reference to the semantic analysis object used for 138 /// this tree transform. 139 Sema &getSema() const { return SemaRef; } 140 141 /// \brief Whether the transformation should always rebuild AST nodes, even 142 /// if none of the children have changed. 143 /// 144 /// Subclasses may override this function to specify when the transformation 145 /// should rebuild all AST nodes. 146 /// 147 /// We must always rebuild all AST nodes when performing variadic template 148 /// pack expansion, in order to avoid violating the AST invariant that each 149 /// statement node appears at most once in its containing declaration. 150 bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; } 151 152 /// \brief Returns the location of the entity being transformed, if that 153 /// information was not available elsewhere in the AST. 154 /// 155 /// By default, returns no source-location information. Subclasses can 156 /// provide an alternative implementation that provides better location 157 /// information. 158 SourceLocation getBaseLocation() { return SourceLocation(); } 159 160 /// \brief Returns the name of the entity being transformed, if that 161 /// information was not available elsewhere in the AST. 162 /// 163 /// By default, returns an empty name. Subclasses can provide an alternative 164 /// implementation with a more precise name. 165 DeclarationName getBaseEntity() { return DeclarationName(); } 166 167 /// \brief Sets the "base" location and entity when that 168 /// information is known based on another transformation. 169 /// 170 /// By default, the source location and entity are ignored. Subclasses can 171 /// override this function to provide a customized implementation. 172 void setBase(SourceLocation Loc, DeclarationName Entity) { } 173 174 /// \brief RAII object that temporarily sets the base location and entity 175 /// used for reporting diagnostics in types. 176 class TemporaryBase { 177 TreeTransform &Self; 178 SourceLocation OldLocation; 179 DeclarationName OldEntity; 180 181 public: 182 TemporaryBase(TreeTransform &Self, SourceLocation Location, 183 DeclarationName Entity) : Self(Self) { 184 OldLocation = Self.getDerived().getBaseLocation(); 185 OldEntity = Self.getDerived().getBaseEntity(); 186 187 if (Location.isValid()) 188 Self.getDerived().setBase(Location, Entity); 189 } 190 191 ~TemporaryBase() { 192 Self.getDerived().setBase(OldLocation, OldEntity); 193 } 194 }; 195 196 /// \brief Determine whether the given type \p T has already been 197 /// transformed. 198 /// 199 /// Subclasses can provide an alternative implementation of this routine 200 /// to short-circuit evaluation when it is known that a given type will 201 /// not change. For example, template instantiation need not traverse 202 /// non-dependent types. 203 bool AlreadyTransformed(QualType T) { 204 return T.isNull(); 205 } 206 207 /// \brief Determine whether the given call argument should be dropped, e.g., 208 /// because it is a default argument. 209 /// 210 /// Subclasses can provide an alternative implementation of this routine to 211 /// determine which kinds of call arguments get dropped. By default, 212 /// CXXDefaultArgument nodes are dropped (prior to transformation). 213 bool DropCallArgument(Expr *E) { 214 return E->isDefaultArgument(); 215 } 216 217 /// \brief Determine whether we should expand a pack expansion with the 218 /// given set of parameter packs into separate arguments by repeatedly 219 /// transforming the pattern. 220 /// 221 /// By default, the transformer never tries to expand pack expansions. 222 /// Subclasses can override this routine to provide different behavior. 223 /// 224 /// \param EllipsisLoc The location of the ellipsis that identifies the 225 /// pack expansion. 226 /// 227 /// \param PatternRange The source range that covers the entire pattern of 228 /// the pack expansion. 229 /// 230 /// \param Unexpanded The set of unexpanded parameter packs within the 231 /// pattern. 232 /// 233 /// \param ShouldExpand Will be set to \c true if the transformer should 234 /// expand the corresponding pack expansions into separate arguments. When 235 /// set, \c NumExpansions must also be set. 236 /// 237 /// \param RetainExpansion Whether the caller should add an unexpanded 238 /// pack expansion after all of the expanded arguments. This is used 239 /// when extending explicitly-specified template argument packs per 240 /// C++0x [temp.arg.explicit]p9. 241 /// 242 /// \param NumExpansions The number of separate arguments that will be in 243 /// the expanded form of the corresponding pack expansion. This is both an 244 /// input and an output parameter, which can be set by the caller if the 245 /// number of expansions is known a priori (e.g., due to a prior substitution) 246 /// and will be set by the callee when the number of expansions is known. 247 /// The callee must set this value when \c ShouldExpand is \c true; it may 248 /// set this value in other cases. 249 /// 250 /// \returns true if an error occurred (e.g., because the parameter packs 251 /// are to be instantiated with arguments of different lengths), false 252 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 253 /// must be set. 254 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 255 SourceRange PatternRange, 256 ArrayRef<UnexpandedParameterPack> Unexpanded, 257 bool &ShouldExpand, 258 bool &RetainExpansion, 259 Optional<unsigned> &NumExpansions) { 260 ShouldExpand = false; 261 return false; 262 } 263 264 /// \brief "Forget" about the partially-substituted pack template argument, 265 /// when performing an instantiation that must preserve the parameter pack 266 /// use. 267 /// 268 /// This routine is meant to be overridden by the template instantiator. 269 TemplateArgument ForgetPartiallySubstitutedPack() { 270 return TemplateArgument(); 271 } 272 273 /// \brief "Remember" the partially-substituted pack template argument 274 /// after performing an instantiation that must preserve the parameter pack 275 /// use. 276 /// 277 /// This routine is meant to be overridden by the template instantiator. 278 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 279 280 /// \brief Note to the derived class when a function parameter pack is 281 /// being expanded. 282 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 283 284 /// \brief Transforms the given type into another type. 285 /// 286 /// By default, this routine transforms a type by creating a 287 /// TypeSourceInfo for it and delegating to the appropriate 288 /// function. This is expensive, but we don't mind, because 289 /// this method is deprecated anyway; all users should be 290 /// switched to storing TypeSourceInfos. 291 /// 292 /// \returns the transformed type. 293 QualType TransformType(QualType T); 294 295 /// \brief Transforms the given type-with-location into a new 296 /// type-with-location. 297 /// 298 /// By default, this routine transforms a type by delegating to the 299 /// appropriate TransformXXXType to build a new type. Subclasses 300 /// may override this function (to take over all type 301 /// transformations) or some set of the TransformXXXType functions 302 /// to alter the transformation. 303 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 304 305 /// \brief Transform the given type-with-location into a new 306 /// type, collecting location information in the given builder 307 /// as necessary. 308 /// 309 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 310 311 /// \brief Transform a type that is permitted to produce a 312 /// DeducedTemplateSpecializationType. 313 /// 314 /// This is used in the (relatively rare) contexts where it is acceptable 315 /// for transformation to produce a class template type with deduced 316 /// template arguments. 317 /// @{ 318 QualType TransformTypeWithDeducedTST(QualType T); 319 TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI); 320 /// @} 321 322 /// \brief Transform the given statement. 323 /// 324 /// By default, this routine transforms a statement by delegating to the 325 /// appropriate TransformXXXStmt function to transform a specific kind of 326 /// statement or the TransformExpr() function to transform an expression. 327 /// Subclasses may override this function to transform statements using some 328 /// other mechanism. 329 /// 330 /// \returns the transformed statement. 331 StmtResult TransformStmt(Stmt *S); 332 333 /// \brief Transform the given statement. 334 /// 335 /// By default, this routine transforms a statement by delegating to the 336 /// appropriate TransformOMPXXXClause function to transform a specific kind 337 /// of clause. Subclasses may override this function to transform statements 338 /// using some other mechanism. 339 /// 340 /// \returns the transformed OpenMP clause. 341 OMPClause *TransformOMPClause(OMPClause *S); 342 343 /// \brief Transform the given attribute. 344 /// 345 /// By default, this routine transforms a statement by delegating to the 346 /// appropriate TransformXXXAttr function to transform a specific kind 347 /// of attribute. Subclasses may override this function to transform 348 /// attributed statements using some other mechanism. 349 /// 350 /// \returns the transformed attribute 351 const Attr *TransformAttr(const Attr *S); 352 353 /// \brief Transform the specified attribute. 354 /// 355 /// Subclasses should override the transformation of attributes with a pragma 356 /// spelling to transform expressions stored within the attribute. 357 /// 358 /// \returns the transformed attribute. 359 #define ATTR(X) 360 #define PRAGMA_SPELLING_ATTR(X) \ 361 const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; } 362 #include "clang/Basic/AttrList.inc" 363 364 /// \brief Transform the given expression. 365 /// 366 /// By default, this routine transforms an expression by delegating to the 367 /// appropriate TransformXXXExpr function to build a new expression. 368 /// Subclasses may override this function to transform expressions using some 369 /// other mechanism. 370 /// 371 /// \returns the transformed expression. 372 ExprResult TransformExpr(Expr *E); 373 374 /// \brief Transform the given initializer. 375 /// 376 /// By default, this routine transforms an initializer by stripping off the 377 /// semantic nodes added by initialization, then passing the result to 378 /// TransformExpr or TransformExprs. 379 /// 380 /// \returns the transformed initializer. 381 ExprResult TransformInitializer(Expr *Init, bool NotCopyInit); 382 383 /// \brief Transform the given list of expressions. 384 /// 385 /// This routine transforms a list of expressions by invoking 386 /// \c TransformExpr() for each subexpression. However, it also provides 387 /// support for variadic templates by expanding any pack expansions (if the 388 /// derived class permits such expansion) along the way. When pack expansions 389 /// are present, the number of outputs may not equal the number of inputs. 390 /// 391 /// \param Inputs The set of expressions to be transformed. 392 /// 393 /// \param NumInputs The number of expressions in \c Inputs. 394 /// 395 /// \param IsCall If \c true, then this transform is being performed on 396 /// function-call arguments, and any arguments that should be dropped, will 397 /// be. 398 /// 399 /// \param Outputs The transformed input expressions will be added to this 400 /// vector. 401 /// 402 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 403 /// due to transformation. 404 /// 405 /// \returns true if an error occurred, false otherwise. 406 bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall, 407 SmallVectorImpl<Expr *> &Outputs, 408 bool *ArgChanged = nullptr); 409 410 /// \brief Transform the given declaration, which is referenced from a type 411 /// or expression. 412 /// 413 /// By default, acts as the identity function on declarations, unless the 414 /// transformer has had to transform the declaration itself. Subclasses 415 /// may override this function to provide alternate behavior. 416 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 417 llvm::DenseMap<Decl *, Decl *>::iterator Known 418 = TransformedLocalDecls.find(D); 419 if (Known != TransformedLocalDecls.end()) 420 return Known->second; 421 422 return D; 423 } 424 425 /// \brief Transform the specified condition. 426 /// 427 /// By default, this transforms the variable and expression and rebuilds 428 /// the condition. 429 Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var, 430 Expr *Expr, 431 Sema::ConditionKind Kind); 432 433 /// \brief Transform the attributes associated with the given declaration and 434 /// place them on the new declaration. 435 /// 436 /// By default, this operation does nothing. Subclasses may override this 437 /// behavior to transform attributes. 438 void transformAttrs(Decl *Old, Decl *New) { } 439 440 /// \brief Note that a local declaration has been transformed by this 441 /// transformer. 442 /// 443 /// Local declarations are typically transformed via a call to 444 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 445 /// the transformer itself has to transform the declarations. This routine 446 /// can be overridden by a subclass that keeps track of such mappings. 447 void transformedLocalDecl(Decl *Old, Decl *New) { 448 TransformedLocalDecls[Old] = New; 449 } 450 451 /// \brief Transform the definition of the given declaration. 452 /// 453 /// By default, invokes TransformDecl() to transform the declaration. 454 /// Subclasses may override this function to provide alternate behavior. 455 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 456 return getDerived().TransformDecl(Loc, D); 457 } 458 459 /// \brief Transform the given declaration, which was the first part of a 460 /// nested-name-specifier in a member access expression. 461 /// 462 /// This specific declaration transformation only applies to the first 463 /// identifier in a nested-name-specifier of a member access expression, e.g., 464 /// the \c T in \c x->T::member 465 /// 466 /// By default, invokes TransformDecl() to transform the declaration. 467 /// Subclasses may override this function to provide alternate behavior. 468 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 469 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 470 } 471 472 /// Transform the set of declarations in an OverloadExpr. 473 bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL, 474 LookupResult &R); 475 476 /// \brief Transform the given nested-name-specifier with source-location 477 /// information. 478 /// 479 /// By default, transforms all of the types and declarations within the 480 /// nested-name-specifier. Subclasses may override this function to provide 481 /// alternate behavior. 482 NestedNameSpecifierLoc 483 TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS, 484 QualType ObjectType = QualType(), 485 NamedDecl *FirstQualifierInScope = nullptr); 486 487 /// \brief Transform the given declaration name. 488 /// 489 /// By default, transforms the types of conversion function, constructor, 490 /// and destructor names and then (if needed) rebuilds the declaration name. 491 /// Identifiers and selectors are returned unmodified. Sublcasses may 492 /// override this function to provide alternate behavior. 493 DeclarationNameInfo 494 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 495 496 /// \brief Transform the given template name. 497 /// 498 /// \param SS The nested-name-specifier that qualifies the template 499 /// name. This nested-name-specifier must already have been transformed. 500 /// 501 /// \param Name The template name to transform. 502 /// 503 /// \param NameLoc The source location of the template name. 504 /// 505 /// \param ObjectType If we're translating a template name within a member 506 /// access expression, this is the type of the object whose member template 507 /// is being referenced. 508 /// 509 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 510 /// also refers to a name within the current (lexical) scope, this is the 511 /// declaration it refers to. 512 /// 513 /// By default, transforms the template name by transforming the declarations 514 /// and nested-name-specifiers that occur within the template name. 515 /// Subclasses may override this function to provide alternate behavior. 516 TemplateName 517 TransformTemplateName(CXXScopeSpec &SS, TemplateName Name, 518 SourceLocation NameLoc, 519 QualType ObjectType = QualType(), 520 NamedDecl *FirstQualifierInScope = nullptr, 521 bool AllowInjectedClassName = false); 522 523 /// \brief Transform the given template argument. 524 /// 525 /// By default, this operation transforms the type, expression, or 526 /// declaration stored within the template argument and constructs a 527 /// new template argument from the transformed result. Subclasses may 528 /// override this function to provide alternate behavior. 529 /// 530 /// Returns true if there was an error. 531 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 532 TemplateArgumentLoc &Output, 533 bool Uneval = false); 534 535 /// \brief Transform the given set of template arguments. 536 /// 537 /// By default, this operation transforms all of the template arguments 538 /// in the input set using \c TransformTemplateArgument(), and appends 539 /// the transformed arguments to the output list. 540 /// 541 /// Note that this overload of \c TransformTemplateArguments() is merely 542 /// a convenience function. Subclasses that wish to override this behavior 543 /// should override the iterator-based member template version. 544 /// 545 /// \param Inputs The set of template arguments to be transformed. 546 /// 547 /// \param NumInputs The number of template arguments in \p Inputs. 548 /// 549 /// \param Outputs The set of transformed template arguments output by this 550 /// routine. 551 /// 552 /// Returns true if an error occurred. 553 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 554 unsigned NumInputs, 555 TemplateArgumentListInfo &Outputs, 556 bool Uneval = false) { 557 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs, 558 Uneval); 559 } 560 561 /// \brief Transform the given set of template arguments. 562 /// 563 /// By default, this operation transforms all of the template arguments 564 /// in the input set using \c TransformTemplateArgument(), and appends 565 /// the transformed arguments to the output list. 566 /// 567 /// \param First An iterator to the first template argument. 568 /// 569 /// \param Last An iterator one step past the last template argument. 570 /// 571 /// \param Outputs The set of transformed template arguments output by this 572 /// routine. 573 /// 574 /// Returns true if an error occurred. 575 template<typename InputIterator> 576 bool TransformTemplateArguments(InputIterator First, 577 InputIterator Last, 578 TemplateArgumentListInfo &Outputs, 579 bool Uneval = false); 580 581 /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 582 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 583 TemplateArgumentLoc &ArgLoc); 584 585 /// \brief Fakes up a TypeSourceInfo for a type. 586 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 587 return SemaRef.Context.getTrivialTypeSourceInfo(T, 588 getDerived().getBaseLocation()); 589 } 590 591 #define ABSTRACT_TYPELOC(CLASS, PARENT) 592 #define TYPELOC(CLASS, PARENT) \ 593 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 594 #include "clang/AST/TypeLocNodes.def" 595 596 template<typename Fn> 597 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 598 FunctionProtoTypeLoc TL, 599 CXXRecordDecl *ThisContext, 600 unsigned ThisTypeQuals, 601 Fn TransformExceptionSpec); 602 603 bool TransformExceptionSpec(SourceLocation Loc, 604 FunctionProtoType::ExceptionSpecInfo &ESI, 605 SmallVectorImpl<QualType> &Exceptions, 606 bool &Changed); 607 608 StmtResult TransformSEHHandler(Stmt *Handler); 609 610 QualType 611 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 612 TemplateSpecializationTypeLoc TL, 613 TemplateName Template); 614 615 QualType 616 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 617 DependentTemplateSpecializationTypeLoc TL, 618 TemplateName Template, 619 CXXScopeSpec &SS); 620 621 QualType TransformDependentTemplateSpecializationType( 622 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL, 623 NestedNameSpecifierLoc QualifierLoc); 624 625 /// \brief Transforms the parameters of a function type into the 626 /// given vectors. 627 /// 628 /// The result vectors should be kept in sync; null entries in the 629 /// variables vector are acceptable. 630 /// 631 /// Return true on error. 632 bool TransformFunctionTypeParams( 633 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 634 const QualType *ParamTypes, 635 const FunctionProtoType::ExtParameterInfo *ParamInfos, 636 SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars, 637 Sema::ExtParameterInfoBuilder &PInfos); 638 639 /// \brief Transforms a single function-type parameter. Return null 640 /// on error. 641 /// 642 /// \param indexAdjustment - A number to add to the parameter's 643 /// scope index; can be negative 644 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 645 int indexAdjustment, 646 Optional<unsigned> NumExpansions, 647 bool ExpectParameterPack); 648 649 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 650 651 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 652 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 653 654 TemplateParameterList *TransformTemplateParameterList( 655 TemplateParameterList *TPL) { 656 return TPL; 657 } 658 659 ExprResult TransformAddressOfOperand(Expr *E); 660 661 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 662 bool IsAddressOfOperand, 663 TypeSourceInfo **RecoveryTSI); 664 665 ExprResult TransformParenDependentScopeDeclRefExpr( 666 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand, 667 TypeSourceInfo **RecoveryTSI); 668 669 StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S); 670 671 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous 672 // amount of stack usage with clang. 673 #define STMT(Node, Parent) \ 674 LLVM_ATTRIBUTE_NOINLINE \ 675 StmtResult Transform##Node(Node *S); 676 #define EXPR(Node, Parent) \ 677 LLVM_ATTRIBUTE_NOINLINE \ 678 ExprResult Transform##Node(Node *E); 679 #define ABSTRACT_STMT(Stmt) 680 #include "clang/AST/StmtNodes.inc" 681 682 #define OPENMP_CLAUSE(Name, Class) \ 683 LLVM_ATTRIBUTE_NOINLINE \ 684 OMPClause *Transform ## Class(Class *S); 685 #include "clang/Basic/OpenMPKinds.def" 686 687 /// \brief Build a new qualified type given its unqualified type and type 688 /// qualifiers. 689 /// 690 /// By default, this routine adds type qualifiers only to types that can 691 /// have qualifiers, and silently suppresses those qualifiers that are not 692 /// permitted. Subclasses may override this routine to provide different 693 /// behavior. 694 QualType RebuildQualifiedType(QualType T, SourceLocation Loc, 695 Qualifiers Quals); 696 697 /// \brief Build a new pointer type given its pointee type. 698 /// 699 /// By default, performs semantic analysis when building the pointer type. 700 /// Subclasses may override this routine to provide different behavior. 701 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 702 703 /// \brief Build a new block pointer type given its pointee type. 704 /// 705 /// By default, performs semantic analysis when building the block pointer 706 /// type. Subclasses may override this routine to provide different behavior. 707 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 708 709 /// \brief Build a new reference type given the type it references. 710 /// 711 /// By default, performs semantic analysis when building the 712 /// reference type. Subclasses may override this routine to provide 713 /// different behavior. 714 /// 715 /// \param LValue whether the type was written with an lvalue sigil 716 /// or an rvalue sigil. 717 QualType RebuildReferenceType(QualType ReferentType, 718 bool LValue, 719 SourceLocation Sigil); 720 721 /// \brief Build a new member pointer type given the pointee type and the 722 /// class type it refers into. 723 /// 724 /// By default, performs semantic analysis when building the member pointer 725 /// type. Subclasses may override this routine to provide different behavior. 726 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 727 SourceLocation Sigil); 728 729 QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl, 730 SourceLocation ProtocolLAngleLoc, 731 ArrayRef<ObjCProtocolDecl *> Protocols, 732 ArrayRef<SourceLocation> ProtocolLocs, 733 SourceLocation ProtocolRAngleLoc); 734 735 /// \brief Build an Objective-C object type. 736 /// 737 /// By default, performs semantic analysis when building the object type. 738 /// Subclasses may override this routine to provide different behavior. 739 QualType RebuildObjCObjectType(QualType BaseType, 740 SourceLocation Loc, 741 SourceLocation TypeArgsLAngleLoc, 742 ArrayRef<TypeSourceInfo *> TypeArgs, 743 SourceLocation TypeArgsRAngleLoc, 744 SourceLocation ProtocolLAngleLoc, 745 ArrayRef<ObjCProtocolDecl *> Protocols, 746 ArrayRef<SourceLocation> ProtocolLocs, 747 SourceLocation ProtocolRAngleLoc); 748 749 /// \brief Build a new Objective-C object pointer type given the pointee type. 750 /// 751 /// By default, directly builds the pointer type, with no additional semantic 752 /// analysis. 753 QualType RebuildObjCObjectPointerType(QualType PointeeType, 754 SourceLocation Star); 755 756 /// \brief Build a new array type given the element type, size 757 /// modifier, size of the array (if known), size expression, and index type 758 /// qualifiers. 759 /// 760 /// By default, performs semantic analysis when building the array type. 761 /// Subclasses may override this routine to provide different behavior. 762 /// Also by default, all of the other Rebuild*Array 763 QualType RebuildArrayType(QualType ElementType, 764 ArrayType::ArraySizeModifier SizeMod, 765 const llvm::APInt *Size, 766 Expr *SizeExpr, 767 unsigned IndexTypeQuals, 768 SourceRange BracketsRange); 769 770 /// \brief Build a new constant array type given the element type, size 771 /// modifier, (known) size of the array, and index type qualifiers. 772 /// 773 /// By default, performs semantic analysis when building the array type. 774 /// Subclasses may override this routine to provide different behavior. 775 QualType RebuildConstantArrayType(QualType ElementType, 776 ArrayType::ArraySizeModifier SizeMod, 777 const llvm::APInt &Size, 778 unsigned IndexTypeQuals, 779 SourceRange BracketsRange); 780 781 /// \brief Build a new incomplete array type given the element type, size 782 /// modifier, and index type qualifiers. 783 /// 784 /// By default, performs semantic analysis when building the array type. 785 /// Subclasses may override this routine to provide different behavior. 786 QualType RebuildIncompleteArrayType(QualType ElementType, 787 ArrayType::ArraySizeModifier SizeMod, 788 unsigned IndexTypeQuals, 789 SourceRange BracketsRange); 790 791 /// \brief Build a new variable-length array type given the element type, 792 /// size modifier, size expression, and index type qualifiers. 793 /// 794 /// By default, performs semantic analysis when building the array type. 795 /// Subclasses may override this routine to provide different behavior. 796 QualType RebuildVariableArrayType(QualType ElementType, 797 ArrayType::ArraySizeModifier SizeMod, 798 Expr *SizeExpr, 799 unsigned IndexTypeQuals, 800 SourceRange BracketsRange); 801 802 /// \brief Build a new dependent-sized array type given the element type, 803 /// size modifier, size expression, and index type qualifiers. 804 /// 805 /// By default, performs semantic analysis when building the array type. 806 /// Subclasses may override this routine to provide different behavior. 807 QualType RebuildDependentSizedArrayType(QualType ElementType, 808 ArrayType::ArraySizeModifier SizeMod, 809 Expr *SizeExpr, 810 unsigned IndexTypeQuals, 811 SourceRange BracketsRange); 812 813 /// \brief Build a new vector type given the element type and 814 /// number of elements. 815 /// 816 /// By default, performs semantic analysis when building the vector type. 817 /// Subclasses may override this routine to provide different behavior. 818 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 819 VectorType::VectorKind VecKind); 820 821 /// \brief Build a new extended vector type given the element type and 822 /// number of elements. 823 /// 824 /// By default, performs semantic analysis when building the vector type. 825 /// Subclasses may override this routine to provide different behavior. 826 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 827 SourceLocation AttributeLoc); 828 829 /// \brief Build a new potentially dependently-sized extended vector type 830 /// given the element type and number of elements. 831 /// 832 /// By default, performs semantic analysis when building the vector type. 833 /// Subclasses may override this routine to provide different behavior. 834 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 835 Expr *SizeExpr, 836 SourceLocation AttributeLoc); 837 838 /// \brief Build a new function type. 839 /// 840 /// By default, performs semantic analysis when building the function type. 841 /// Subclasses may override this routine to provide different behavior. 842 QualType RebuildFunctionProtoType(QualType T, 843 MutableArrayRef<QualType> ParamTypes, 844 const FunctionProtoType::ExtProtoInfo &EPI); 845 846 /// \brief Build a new unprototyped function type. 847 QualType RebuildFunctionNoProtoType(QualType ResultType); 848 849 /// \brief Rebuild an unresolved typename type, given the decl that 850 /// the UnresolvedUsingTypenameDecl was transformed to. 851 QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D); 852 853 /// \brief Build a new typedef type. 854 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 855 return SemaRef.Context.getTypeDeclType(Typedef); 856 } 857 858 /// \brief Build a new class/struct/union type. 859 QualType RebuildRecordType(RecordDecl *Record) { 860 return SemaRef.Context.getTypeDeclType(Record); 861 } 862 863 /// \brief Build a new Enum type. 864 QualType RebuildEnumType(EnumDecl *Enum) { 865 return SemaRef.Context.getTypeDeclType(Enum); 866 } 867 868 /// \brief Build a new typeof(expr) type. 869 /// 870 /// By default, performs semantic analysis when building the typeof type. 871 /// Subclasses may override this routine to provide different behavior. 872 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 873 874 /// \brief Build a new typeof(type) type. 875 /// 876 /// By default, builds a new TypeOfType with the given underlying type. 877 QualType RebuildTypeOfType(QualType Underlying); 878 879 /// \brief Build a new unary transform type. 880 QualType RebuildUnaryTransformType(QualType BaseType, 881 UnaryTransformType::UTTKind UKind, 882 SourceLocation Loc); 883 884 /// \brief Build a new C++11 decltype type. 885 /// 886 /// By default, performs semantic analysis when building the decltype type. 887 /// Subclasses may override this routine to provide different behavior. 888 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 889 890 /// \brief Build a new C++11 auto type. 891 /// 892 /// By default, builds a new AutoType with the given deduced type. 893 QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) { 894 // Note, IsDependent is always false here: we implicitly convert an 'auto' 895 // which has been deduced to a dependent type into an undeduced 'auto', so 896 // that we'll retry deduction after the transformation. 897 return SemaRef.Context.getAutoType(Deduced, Keyword, 898 /*IsDependent*/ false); 899 } 900 901 /// By default, builds a new DeducedTemplateSpecializationType with the given 902 /// deduced type. 903 QualType RebuildDeducedTemplateSpecializationType(TemplateName Template, 904 QualType Deduced) { 905 return SemaRef.Context.getDeducedTemplateSpecializationType( 906 Template, Deduced, /*IsDependent*/ false); 907 } 908 909 /// \brief Build a new template specialization type. 910 /// 911 /// By default, performs semantic analysis when building the template 912 /// specialization type. Subclasses may override this routine to provide 913 /// different behavior. 914 QualType RebuildTemplateSpecializationType(TemplateName Template, 915 SourceLocation TemplateLoc, 916 TemplateArgumentListInfo &Args); 917 918 /// \brief Build a new parenthesized type. 919 /// 920 /// By default, builds a new ParenType type from the inner type. 921 /// Subclasses may override this routine to provide different behavior. 922 QualType RebuildParenType(QualType InnerType) { 923 return SemaRef.BuildParenType(InnerType); 924 } 925 926 /// \brief Build a new qualified name type. 927 /// 928 /// By default, builds a new ElaboratedType type from the keyword, 929 /// the nested-name-specifier and the named type. 930 /// Subclasses may override this routine to provide different behavior. 931 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 932 ElaboratedTypeKeyword Keyword, 933 NestedNameSpecifierLoc QualifierLoc, 934 QualType Named) { 935 return SemaRef.Context.getElaboratedType(Keyword, 936 QualifierLoc.getNestedNameSpecifier(), 937 Named); 938 } 939 940 /// \brief Build a new typename type that refers to a template-id. 941 /// 942 /// By default, builds a new DependentNameType type from the 943 /// nested-name-specifier and the given type. Subclasses may override 944 /// this routine to provide different behavior. 945 QualType RebuildDependentTemplateSpecializationType( 946 ElaboratedTypeKeyword Keyword, 947 NestedNameSpecifierLoc QualifierLoc, 948 const IdentifierInfo *Name, 949 SourceLocation NameLoc, 950 TemplateArgumentListInfo &Args, 951 bool AllowInjectedClassName) { 952 // Rebuild the template name. 953 // TODO: avoid TemplateName abstraction 954 CXXScopeSpec SS; 955 SS.Adopt(QualifierLoc); 956 TemplateName InstName 957 = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 958 nullptr, AllowInjectedClassName); 959 960 if (InstName.isNull()) 961 return QualType(); 962 963 // If it's still dependent, make a dependent specialization. 964 if (InstName.getAsDependentTemplateName()) 965 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 966 QualifierLoc.getNestedNameSpecifier(), 967 Name, 968 Args); 969 970 // Otherwise, make an elaborated type wrapping a non-dependent 971 // specialization. 972 QualType T = 973 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 974 if (T.isNull()) return QualType(); 975 976 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr) 977 return T; 978 979 return SemaRef.Context.getElaboratedType(Keyword, 980 QualifierLoc.getNestedNameSpecifier(), 981 T); 982 } 983 984 /// \brief Build a new typename type that refers to an identifier. 985 /// 986 /// By default, performs semantic analysis when building the typename type 987 /// (or elaborated type). Subclasses may override this routine to provide 988 /// different behavior. 989 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 990 SourceLocation KeywordLoc, 991 NestedNameSpecifierLoc QualifierLoc, 992 const IdentifierInfo *Id, 993 SourceLocation IdLoc, 994 bool DeducedTSTContext) { 995 CXXScopeSpec SS; 996 SS.Adopt(QualifierLoc); 997 998 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 999 // If the name is still dependent, just build a new dependent name type. 1000 if (!SemaRef.computeDeclContext(SS)) 1001 return SemaRef.Context.getDependentNameType(Keyword, 1002 QualifierLoc.getNestedNameSpecifier(), 1003 Id); 1004 } 1005 1006 if (Keyword == ETK_None || Keyword == ETK_Typename) { 1007 QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 1008 *Id, IdLoc); 1009 // If a dependent name resolves to a deduced template specialization type, 1010 // check that we're in one of the syntactic contexts permitting it. 1011 if (!DeducedTSTContext) { 1012 if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>( 1013 T.isNull() ? nullptr : T->getContainedDeducedType())) { 1014 SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst) 1015 << (int)SemaRef.getTemplateNameKindForDiagnostics( 1016 Deduced->getTemplateName()) 1017 << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0); 1018 if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl()) 1019 SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here); 1020 return QualType(); 1021 } 1022 } 1023 return T; 1024 } 1025 1026 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 1027 1028 // We had a dependent elaborated-type-specifier that has been transformed 1029 // into a non-dependent elaborated-type-specifier. Find the tag we're 1030 // referring to. 1031 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1032 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 1033 if (!DC) 1034 return QualType(); 1035 1036 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 1037 return QualType(); 1038 1039 TagDecl *Tag = nullptr; 1040 SemaRef.LookupQualifiedName(Result, DC); 1041 switch (Result.getResultKind()) { 1042 case LookupResult::NotFound: 1043 case LookupResult::NotFoundInCurrentInstantiation: 1044 break; 1045 1046 case LookupResult::Found: 1047 Tag = Result.getAsSingle<TagDecl>(); 1048 break; 1049 1050 case LookupResult::FoundOverloaded: 1051 case LookupResult::FoundUnresolvedValue: 1052 llvm_unreachable("Tag lookup cannot find non-tags"); 1053 1054 case LookupResult::Ambiguous: 1055 // Let the LookupResult structure handle ambiguities. 1056 return QualType(); 1057 } 1058 1059 if (!Tag) { 1060 // Check where the name exists but isn't a tag type and use that to emit 1061 // better diagnostics. 1062 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 1063 SemaRef.LookupQualifiedName(Result, DC); 1064 switch (Result.getResultKind()) { 1065 case LookupResult::Found: 1066 case LookupResult::FoundOverloaded: 1067 case LookupResult::FoundUnresolvedValue: { 1068 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 1069 Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind); 1070 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl 1071 << NTK << Kind; 1072 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 1073 break; 1074 } 1075 default: 1076 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 1077 << Kind << Id << DC << QualifierLoc.getSourceRange(); 1078 break; 1079 } 1080 return QualType(); 1081 } 1082 1083 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 1084 IdLoc, Id)) { 1085 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 1086 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 1087 return QualType(); 1088 } 1089 1090 // Build the elaborated-type-specifier type. 1091 QualType T = SemaRef.Context.getTypeDeclType(Tag); 1092 return SemaRef.Context.getElaboratedType(Keyword, 1093 QualifierLoc.getNestedNameSpecifier(), 1094 T); 1095 } 1096 1097 /// \brief Build a new pack expansion type. 1098 /// 1099 /// By default, builds a new PackExpansionType type from the given pattern. 1100 /// Subclasses may override this routine to provide different behavior. 1101 QualType RebuildPackExpansionType(QualType Pattern, 1102 SourceRange PatternRange, 1103 SourceLocation EllipsisLoc, 1104 Optional<unsigned> NumExpansions) { 1105 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 1106 NumExpansions); 1107 } 1108 1109 /// \brief Build a new atomic type given its value type. 1110 /// 1111 /// By default, performs semantic analysis when building the atomic type. 1112 /// Subclasses may override this routine to provide different behavior. 1113 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 1114 1115 /// \brief Build a new pipe type given its value type. 1116 QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc, 1117 bool isReadPipe); 1118 1119 /// \brief Build a new template name given a nested name specifier, a flag 1120 /// indicating whether the "template" keyword was provided, and the template 1121 /// that the template name refers to. 1122 /// 1123 /// By default, builds the new template name directly. Subclasses may override 1124 /// this routine to provide different behavior. 1125 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1126 bool TemplateKW, 1127 TemplateDecl *Template); 1128 1129 /// \brief Build a new template name given a nested name specifier and the 1130 /// name that is referred to as a template. 1131 /// 1132 /// By default, performs semantic analysis to determine whether the name can 1133 /// be resolved to a specific template, then builds the appropriate kind of 1134 /// template name. Subclasses may override this routine to provide different 1135 /// behavior. 1136 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1137 const IdentifierInfo &Name, 1138 SourceLocation NameLoc, 1139 QualType ObjectType, 1140 NamedDecl *FirstQualifierInScope, 1141 bool AllowInjectedClassName); 1142 1143 /// \brief Build a new template name given a nested name specifier and the 1144 /// overloaded operator name that is referred to as a template. 1145 /// 1146 /// By default, performs semantic analysis to determine whether the name can 1147 /// be resolved to a specific template, then builds the appropriate kind of 1148 /// template name. Subclasses may override this routine to provide different 1149 /// behavior. 1150 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1151 OverloadedOperatorKind Operator, 1152 SourceLocation NameLoc, 1153 QualType ObjectType, 1154 bool AllowInjectedClassName); 1155 1156 /// \brief Build a new template name given a template template parameter pack 1157 /// and the 1158 /// 1159 /// By default, performs semantic analysis to determine whether the name can 1160 /// be resolved to a specific template, then builds the appropriate kind of 1161 /// template name. Subclasses may override this routine to provide different 1162 /// behavior. 1163 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1164 const TemplateArgument &ArgPack) { 1165 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1166 } 1167 1168 /// \brief Build a new compound statement. 1169 /// 1170 /// By default, performs semantic analysis to build the new statement. 1171 /// Subclasses may override this routine to provide different behavior. 1172 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1173 MultiStmtArg Statements, 1174 SourceLocation RBraceLoc, 1175 bool IsStmtExpr) { 1176 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1177 IsStmtExpr); 1178 } 1179 1180 /// \brief Build a new case statement. 1181 /// 1182 /// By default, performs semantic analysis to build the new statement. 1183 /// Subclasses may override this routine to provide different behavior. 1184 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1185 Expr *LHS, 1186 SourceLocation EllipsisLoc, 1187 Expr *RHS, 1188 SourceLocation ColonLoc) { 1189 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1190 ColonLoc); 1191 } 1192 1193 /// \brief Attach the body to a new case statement. 1194 /// 1195 /// By default, performs semantic analysis to build the new statement. 1196 /// Subclasses may override this routine to provide different behavior. 1197 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1198 getSema().ActOnCaseStmtBody(S, Body); 1199 return S; 1200 } 1201 1202 /// \brief Build a new default statement. 1203 /// 1204 /// By default, performs semantic analysis to build the new statement. 1205 /// Subclasses may override this routine to provide different behavior. 1206 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1207 SourceLocation ColonLoc, 1208 Stmt *SubStmt) { 1209 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1210 /*CurScope=*/nullptr); 1211 } 1212 1213 /// \brief Build a new label statement. 1214 /// 1215 /// By default, performs semantic analysis to build the new statement. 1216 /// Subclasses may override this routine to provide different behavior. 1217 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1218 SourceLocation ColonLoc, Stmt *SubStmt) { 1219 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1220 } 1221 1222 /// \brief Build a new label statement. 1223 /// 1224 /// By default, performs semantic analysis to build the new statement. 1225 /// Subclasses may override this routine to provide different behavior. 1226 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1227 ArrayRef<const Attr*> Attrs, 1228 Stmt *SubStmt) { 1229 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1230 } 1231 1232 /// \brief Build a new "if" statement. 1233 /// 1234 /// By default, performs semantic analysis to build the new statement. 1235 /// Subclasses may override this routine to provide different behavior. 1236 StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr, 1237 Sema::ConditionResult Cond, Stmt *Init, Stmt *Then, 1238 SourceLocation ElseLoc, Stmt *Else) { 1239 return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then, 1240 ElseLoc, Else); 1241 } 1242 1243 /// \brief Start building a new switch statement. 1244 /// 1245 /// By default, performs semantic analysis to build the new statement. 1246 /// Subclasses may override this routine to provide different behavior. 1247 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init, 1248 Sema::ConditionResult Cond) { 1249 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond); 1250 } 1251 1252 /// \brief Attach the body to the switch statement. 1253 /// 1254 /// By default, performs semantic analysis to build the new statement. 1255 /// Subclasses may override this routine to provide different behavior. 1256 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1257 Stmt *Switch, Stmt *Body) { 1258 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1259 } 1260 1261 /// \brief Build a new while statement. 1262 /// 1263 /// By default, performs semantic analysis to build the new statement. 1264 /// Subclasses may override this routine to provide different behavior. 1265 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, 1266 Sema::ConditionResult Cond, Stmt *Body) { 1267 return getSema().ActOnWhileStmt(WhileLoc, Cond, Body); 1268 } 1269 1270 /// \brief Build a new do-while statement. 1271 /// 1272 /// By default, performs semantic analysis to build the new statement. 1273 /// Subclasses may override this routine to provide different behavior. 1274 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1275 SourceLocation WhileLoc, SourceLocation LParenLoc, 1276 Expr *Cond, SourceLocation RParenLoc) { 1277 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1278 Cond, RParenLoc); 1279 } 1280 1281 /// \brief Build a new for statement. 1282 /// 1283 /// By default, performs semantic analysis to build the new statement. 1284 /// Subclasses may override this routine to provide different behavior. 1285 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1286 Stmt *Init, Sema::ConditionResult Cond, 1287 Sema::FullExprArg Inc, SourceLocation RParenLoc, 1288 Stmt *Body) { 1289 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1290 Inc, RParenLoc, Body); 1291 } 1292 1293 /// \brief Build a new goto statement. 1294 /// 1295 /// By default, performs semantic analysis to build the new statement. 1296 /// Subclasses may override this routine to provide different behavior. 1297 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1298 LabelDecl *Label) { 1299 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1300 } 1301 1302 /// \brief Build a new indirect goto statement. 1303 /// 1304 /// By default, performs semantic analysis to build the new statement. 1305 /// Subclasses may override this routine to provide different behavior. 1306 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1307 SourceLocation StarLoc, 1308 Expr *Target) { 1309 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1310 } 1311 1312 /// \brief Build a new return statement. 1313 /// 1314 /// By default, performs semantic analysis to build the new statement. 1315 /// Subclasses may override this routine to provide different behavior. 1316 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1317 return getSema().BuildReturnStmt(ReturnLoc, Result); 1318 } 1319 1320 /// \brief Build a new declaration statement. 1321 /// 1322 /// By default, performs semantic analysis to build the new statement. 1323 /// Subclasses may override this routine to provide different behavior. 1324 StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls, 1325 SourceLocation StartLoc, SourceLocation EndLoc) { 1326 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1327 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1328 } 1329 1330 /// \brief Build a new inline asm statement. 1331 /// 1332 /// By default, performs semantic analysis to build the new statement. 1333 /// Subclasses may override this routine to provide different behavior. 1334 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1335 bool IsVolatile, unsigned NumOutputs, 1336 unsigned NumInputs, IdentifierInfo **Names, 1337 MultiExprArg Constraints, MultiExprArg Exprs, 1338 Expr *AsmString, MultiExprArg Clobbers, 1339 SourceLocation RParenLoc) { 1340 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1341 NumInputs, Names, Constraints, Exprs, 1342 AsmString, Clobbers, RParenLoc); 1343 } 1344 1345 /// \brief Build a new MS style inline asm statement. 1346 /// 1347 /// By default, performs semantic analysis to build the new statement. 1348 /// Subclasses may override this routine to provide different behavior. 1349 StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1350 ArrayRef<Token> AsmToks, 1351 StringRef AsmString, 1352 unsigned NumOutputs, unsigned NumInputs, 1353 ArrayRef<StringRef> Constraints, 1354 ArrayRef<StringRef> Clobbers, 1355 ArrayRef<Expr*> Exprs, 1356 SourceLocation EndLoc) { 1357 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1358 NumOutputs, NumInputs, 1359 Constraints, Clobbers, Exprs, EndLoc); 1360 } 1361 1362 /// \brief Build a new co_return statement. 1363 /// 1364 /// By default, performs semantic analysis to build the new statement. 1365 /// Subclasses may override this routine to provide different behavior. 1366 StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result, 1367 bool IsImplicit) { 1368 return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit); 1369 } 1370 1371 /// \brief Build a new co_await expression. 1372 /// 1373 /// By default, performs semantic analysis to build the new expression. 1374 /// Subclasses may override this routine to provide different behavior. 1375 ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result, 1376 bool IsImplicit) { 1377 return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit); 1378 } 1379 1380 /// \brief Build a new co_await expression. 1381 /// 1382 /// By default, performs semantic analysis to build the new expression. 1383 /// Subclasses may override this routine to provide different behavior. 1384 ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc, 1385 Expr *Result, 1386 UnresolvedLookupExpr *Lookup) { 1387 return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup); 1388 } 1389 1390 /// \brief Build a new co_yield expression. 1391 /// 1392 /// By default, performs semantic analysis to build the new expression. 1393 /// Subclasses may override this routine to provide different behavior. 1394 ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) { 1395 return getSema().BuildCoyieldExpr(CoyieldLoc, Result); 1396 } 1397 1398 StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) { 1399 return getSema().BuildCoroutineBodyStmt(Args); 1400 } 1401 1402 /// \brief Build a new Objective-C \@try statement. 1403 /// 1404 /// By default, performs semantic analysis to build the new statement. 1405 /// Subclasses may override this routine to provide different behavior. 1406 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1407 Stmt *TryBody, 1408 MultiStmtArg CatchStmts, 1409 Stmt *Finally) { 1410 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1411 Finally); 1412 } 1413 1414 /// \brief Rebuild an Objective-C exception declaration. 1415 /// 1416 /// By default, performs semantic analysis to build the new declaration. 1417 /// Subclasses may override this routine to provide different behavior. 1418 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1419 TypeSourceInfo *TInfo, QualType T) { 1420 return getSema().BuildObjCExceptionDecl(TInfo, T, 1421 ExceptionDecl->getInnerLocStart(), 1422 ExceptionDecl->getLocation(), 1423 ExceptionDecl->getIdentifier()); 1424 } 1425 1426 /// \brief Build a new Objective-C \@catch statement. 1427 /// 1428 /// By default, performs semantic analysis to build the new statement. 1429 /// Subclasses may override this routine to provide different behavior. 1430 StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1431 SourceLocation RParenLoc, 1432 VarDecl *Var, 1433 Stmt *Body) { 1434 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1435 Var, Body); 1436 } 1437 1438 /// \brief Build a new Objective-C \@finally statement. 1439 /// 1440 /// By default, performs semantic analysis to build the new statement. 1441 /// Subclasses may override this routine to provide different behavior. 1442 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1443 Stmt *Body) { 1444 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1445 } 1446 1447 /// \brief Build a new Objective-C \@throw statement. 1448 /// 1449 /// By default, performs semantic analysis to build the new statement. 1450 /// Subclasses may override this routine to provide different behavior. 1451 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1452 Expr *Operand) { 1453 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1454 } 1455 1456 /// \brief Build a new OpenMP executable directive. 1457 /// 1458 /// By default, performs semantic analysis to build the new statement. 1459 /// Subclasses may override this routine to provide different behavior. 1460 StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind, 1461 DeclarationNameInfo DirName, 1462 OpenMPDirectiveKind CancelRegion, 1463 ArrayRef<OMPClause *> Clauses, 1464 Stmt *AStmt, SourceLocation StartLoc, 1465 SourceLocation EndLoc) { 1466 return getSema().ActOnOpenMPExecutableDirective( 1467 Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc); 1468 } 1469 1470 /// \brief Build a new OpenMP 'if' clause. 1471 /// 1472 /// By default, performs semantic analysis to build the new OpenMP clause. 1473 /// Subclasses may override this routine to provide different behavior. 1474 OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier, 1475 Expr *Condition, SourceLocation StartLoc, 1476 SourceLocation LParenLoc, 1477 SourceLocation NameModifierLoc, 1478 SourceLocation ColonLoc, 1479 SourceLocation EndLoc) { 1480 return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc, 1481 LParenLoc, NameModifierLoc, ColonLoc, 1482 EndLoc); 1483 } 1484 1485 /// \brief Build a new OpenMP 'final' clause. 1486 /// 1487 /// By default, performs semantic analysis to build the new OpenMP clause. 1488 /// Subclasses may override this routine to provide different behavior. 1489 OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc, 1490 SourceLocation LParenLoc, 1491 SourceLocation EndLoc) { 1492 return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc, 1493 EndLoc); 1494 } 1495 1496 /// \brief Build a new OpenMP 'num_threads' clause. 1497 /// 1498 /// By default, performs semantic analysis to build the new OpenMP clause. 1499 /// Subclasses may override this routine to provide different behavior. 1500 OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads, 1501 SourceLocation StartLoc, 1502 SourceLocation LParenLoc, 1503 SourceLocation EndLoc) { 1504 return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc, 1505 LParenLoc, EndLoc); 1506 } 1507 1508 /// \brief Build a new OpenMP 'safelen' clause. 1509 /// 1510 /// By default, performs semantic analysis to build the new OpenMP clause. 1511 /// Subclasses may override this routine to provide different behavior. 1512 OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc, 1513 SourceLocation LParenLoc, 1514 SourceLocation EndLoc) { 1515 return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc); 1516 } 1517 1518 /// \brief Build a new OpenMP 'simdlen' clause. 1519 /// 1520 /// By default, performs semantic analysis to build the new OpenMP clause. 1521 /// Subclasses may override this routine to provide different behavior. 1522 OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc, 1523 SourceLocation LParenLoc, 1524 SourceLocation EndLoc) { 1525 return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc); 1526 } 1527 1528 /// \brief Build a new OpenMP 'collapse' clause. 1529 /// 1530 /// By default, performs semantic analysis to build the new OpenMP clause. 1531 /// Subclasses may override this routine to provide different behavior. 1532 OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc, 1533 SourceLocation LParenLoc, 1534 SourceLocation EndLoc) { 1535 return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc, 1536 EndLoc); 1537 } 1538 1539 /// \brief Build a new OpenMP 'default' clause. 1540 /// 1541 /// By default, performs semantic analysis to build the new OpenMP clause. 1542 /// Subclasses may override this routine to provide different behavior. 1543 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1544 SourceLocation KindKwLoc, 1545 SourceLocation StartLoc, 1546 SourceLocation LParenLoc, 1547 SourceLocation EndLoc) { 1548 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1549 StartLoc, LParenLoc, EndLoc); 1550 } 1551 1552 /// \brief Build a new OpenMP 'proc_bind' clause. 1553 /// 1554 /// By default, performs semantic analysis to build the new OpenMP clause. 1555 /// Subclasses may override this routine to provide different behavior. 1556 OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind, 1557 SourceLocation KindKwLoc, 1558 SourceLocation StartLoc, 1559 SourceLocation LParenLoc, 1560 SourceLocation EndLoc) { 1561 return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc, 1562 StartLoc, LParenLoc, EndLoc); 1563 } 1564 1565 /// \brief Build a new OpenMP 'schedule' clause. 1566 /// 1567 /// By default, performs semantic analysis to build the new OpenMP clause. 1568 /// Subclasses may override this routine to provide different behavior. 1569 OMPClause *RebuildOMPScheduleClause( 1570 OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2, 1571 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 1572 SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc, 1573 SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) { 1574 return getSema().ActOnOpenMPScheduleClause( 1575 M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc, 1576 CommaLoc, EndLoc); 1577 } 1578 1579 /// \brief Build a new OpenMP 'ordered' clause. 1580 /// 1581 /// By default, performs semantic analysis to build the new OpenMP clause. 1582 /// Subclasses may override this routine to provide different behavior. 1583 OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc, 1584 SourceLocation EndLoc, 1585 SourceLocation LParenLoc, Expr *Num) { 1586 return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num); 1587 } 1588 1589 /// \brief Build a new OpenMP 'private' clause. 1590 /// 1591 /// By default, performs semantic analysis to build the new OpenMP clause. 1592 /// Subclasses may override this routine to provide different behavior. 1593 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1594 SourceLocation StartLoc, 1595 SourceLocation LParenLoc, 1596 SourceLocation EndLoc) { 1597 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1598 EndLoc); 1599 } 1600 1601 /// \brief Build a new OpenMP 'firstprivate' clause. 1602 /// 1603 /// By default, performs semantic analysis to build the new OpenMP clause. 1604 /// Subclasses may override this routine to provide different behavior. 1605 OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList, 1606 SourceLocation StartLoc, 1607 SourceLocation LParenLoc, 1608 SourceLocation EndLoc) { 1609 return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, 1610 EndLoc); 1611 } 1612 1613 /// \brief Build a new OpenMP 'lastprivate' clause. 1614 /// 1615 /// By default, performs semantic analysis to build the new OpenMP clause. 1616 /// Subclasses may override this routine to provide different behavior. 1617 OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList, 1618 SourceLocation StartLoc, 1619 SourceLocation LParenLoc, 1620 SourceLocation EndLoc) { 1621 return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, 1622 EndLoc); 1623 } 1624 1625 /// \brief Build a new OpenMP 'shared' clause. 1626 /// 1627 /// By default, performs semantic analysis to build the new OpenMP clause. 1628 /// Subclasses may override this routine to provide different behavior. 1629 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1630 SourceLocation StartLoc, 1631 SourceLocation LParenLoc, 1632 SourceLocation EndLoc) { 1633 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1634 EndLoc); 1635 } 1636 1637 /// \brief Build a new OpenMP 'reduction' clause. 1638 /// 1639 /// By default, performs semantic analysis to build the new statement. 1640 /// Subclasses may override this routine to provide different behavior. 1641 OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList, 1642 SourceLocation StartLoc, 1643 SourceLocation LParenLoc, 1644 SourceLocation ColonLoc, 1645 SourceLocation EndLoc, 1646 CXXScopeSpec &ReductionIdScopeSpec, 1647 const DeclarationNameInfo &ReductionId, 1648 ArrayRef<Expr *> UnresolvedReductions) { 1649 return getSema().ActOnOpenMPReductionClause( 1650 VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec, 1651 ReductionId, UnresolvedReductions); 1652 } 1653 1654 /// \brief Build a new OpenMP 'linear' clause. 1655 /// 1656 /// By default, performs semantic analysis to build the new OpenMP clause. 1657 /// Subclasses may override this routine to provide different behavior. 1658 OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 1659 SourceLocation StartLoc, 1660 SourceLocation LParenLoc, 1661 OpenMPLinearClauseKind Modifier, 1662 SourceLocation ModifierLoc, 1663 SourceLocation ColonLoc, 1664 SourceLocation EndLoc) { 1665 return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc, 1666 Modifier, ModifierLoc, ColonLoc, 1667 EndLoc); 1668 } 1669 1670 /// \brief Build a new OpenMP 'aligned' clause. 1671 /// 1672 /// By default, performs semantic analysis to build the new OpenMP clause. 1673 /// Subclasses may override this routine to provide different behavior. 1674 OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment, 1675 SourceLocation StartLoc, 1676 SourceLocation LParenLoc, 1677 SourceLocation ColonLoc, 1678 SourceLocation EndLoc) { 1679 return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc, 1680 LParenLoc, ColonLoc, EndLoc); 1681 } 1682 1683 /// \brief Build a new OpenMP 'copyin' clause. 1684 /// 1685 /// By default, performs semantic analysis to build the new OpenMP clause. 1686 /// Subclasses may override this routine to provide different behavior. 1687 OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList, 1688 SourceLocation StartLoc, 1689 SourceLocation LParenLoc, 1690 SourceLocation EndLoc) { 1691 return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, 1692 EndLoc); 1693 } 1694 1695 /// \brief Build a new OpenMP 'copyprivate' clause. 1696 /// 1697 /// By default, performs semantic analysis to build the new OpenMP clause. 1698 /// Subclasses may override this routine to provide different behavior. 1699 OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList, 1700 SourceLocation StartLoc, 1701 SourceLocation LParenLoc, 1702 SourceLocation EndLoc) { 1703 return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, 1704 EndLoc); 1705 } 1706 1707 /// \brief Build a new OpenMP 'flush' pseudo clause. 1708 /// 1709 /// By default, performs semantic analysis to build the new OpenMP clause. 1710 /// Subclasses may override this routine to provide different behavior. 1711 OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList, 1712 SourceLocation StartLoc, 1713 SourceLocation LParenLoc, 1714 SourceLocation EndLoc) { 1715 return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, 1716 EndLoc); 1717 } 1718 1719 /// \brief Build a new OpenMP 'depend' pseudo clause. 1720 /// 1721 /// By default, performs semantic analysis to build the new OpenMP clause. 1722 /// Subclasses may override this routine to provide different behavior. 1723 OMPClause * 1724 RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc, 1725 SourceLocation ColonLoc, ArrayRef<Expr *> VarList, 1726 SourceLocation StartLoc, SourceLocation LParenLoc, 1727 SourceLocation EndLoc) { 1728 return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList, 1729 StartLoc, LParenLoc, EndLoc); 1730 } 1731 1732 /// \brief Build a new OpenMP 'device' clause. 1733 /// 1734 /// By default, performs semantic analysis to build the new statement. 1735 /// Subclasses may override this routine to provide different behavior. 1736 OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc, 1737 SourceLocation LParenLoc, 1738 SourceLocation EndLoc) { 1739 return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc, 1740 EndLoc); 1741 } 1742 1743 /// \brief Build a new OpenMP 'map' clause. 1744 /// 1745 /// By default, performs semantic analysis to build the new OpenMP clause. 1746 /// Subclasses may override this routine to provide different behavior. 1747 OMPClause * 1748 RebuildOMPMapClause(OpenMPMapClauseKind MapTypeModifier, 1749 OpenMPMapClauseKind MapType, bool IsMapTypeImplicit, 1750 SourceLocation MapLoc, SourceLocation ColonLoc, 1751 ArrayRef<Expr *> VarList, SourceLocation StartLoc, 1752 SourceLocation LParenLoc, SourceLocation EndLoc) { 1753 return getSema().ActOnOpenMPMapClause(MapTypeModifier, MapType, 1754 IsMapTypeImplicit, MapLoc, ColonLoc, 1755 VarList, StartLoc, LParenLoc, EndLoc); 1756 } 1757 1758 /// \brief Build a new OpenMP 'num_teams' clause. 1759 /// 1760 /// By default, performs semantic analysis to build the new statement. 1761 /// Subclasses may override this routine to provide different behavior. 1762 OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc, 1763 SourceLocation LParenLoc, 1764 SourceLocation EndLoc) { 1765 return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc, 1766 EndLoc); 1767 } 1768 1769 /// \brief Build a new OpenMP 'thread_limit' clause. 1770 /// 1771 /// By default, performs semantic analysis to build the new statement. 1772 /// Subclasses may override this routine to provide different behavior. 1773 OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit, 1774 SourceLocation StartLoc, 1775 SourceLocation LParenLoc, 1776 SourceLocation EndLoc) { 1777 return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc, 1778 LParenLoc, EndLoc); 1779 } 1780 1781 /// \brief Build a new OpenMP 'priority' clause. 1782 /// 1783 /// By default, performs semantic analysis to build the new statement. 1784 /// Subclasses may override this routine to provide different behavior. 1785 OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc, 1786 SourceLocation LParenLoc, 1787 SourceLocation EndLoc) { 1788 return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc, 1789 EndLoc); 1790 } 1791 1792 /// \brief Build a new OpenMP 'grainsize' clause. 1793 /// 1794 /// By default, performs semantic analysis to build the new statement. 1795 /// Subclasses may override this routine to provide different behavior. 1796 OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc, 1797 SourceLocation LParenLoc, 1798 SourceLocation EndLoc) { 1799 return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc, 1800 EndLoc); 1801 } 1802 1803 /// \brief Build a new OpenMP 'num_tasks' clause. 1804 /// 1805 /// By default, performs semantic analysis to build the new statement. 1806 /// Subclasses may override this routine to provide different behavior. 1807 OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc, 1808 SourceLocation LParenLoc, 1809 SourceLocation EndLoc) { 1810 return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc, 1811 EndLoc); 1812 } 1813 1814 /// \brief Build a new OpenMP 'hint' clause. 1815 /// 1816 /// By default, performs semantic analysis to build the new statement. 1817 /// Subclasses may override this routine to provide different behavior. 1818 OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc, 1819 SourceLocation LParenLoc, 1820 SourceLocation EndLoc) { 1821 return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc); 1822 } 1823 1824 /// \brief Build a new OpenMP 'dist_schedule' clause. 1825 /// 1826 /// By default, performs semantic analysis to build the new OpenMP clause. 1827 /// Subclasses may override this routine to provide different behavior. 1828 OMPClause * 1829 RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind, 1830 Expr *ChunkSize, SourceLocation StartLoc, 1831 SourceLocation LParenLoc, SourceLocation KindLoc, 1832 SourceLocation CommaLoc, SourceLocation EndLoc) { 1833 return getSema().ActOnOpenMPDistScheduleClause( 1834 Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc); 1835 } 1836 1837 /// \brief Build a new OpenMP 'to' clause. 1838 /// 1839 /// By default, performs semantic analysis to build the new statement. 1840 /// Subclasses may override this routine to provide different behavior. 1841 OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList, 1842 SourceLocation StartLoc, 1843 SourceLocation LParenLoc, 1844 SourceLocation EndLoc) { 1845 return getSema().ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc); 1846 } 1847 1848 /// \brief Build a new OpenMP 'from' clause. 1849 /// 1850 /// By default, performs semantic analysis to build the new statement. 1851 /// Subclasses may override this routine to provide different behavior. 1852 OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList, 1853 SourceLocation StartLoc, 1854 SourceLocation LParenLoc, 1855 SourceLocation EndLoc) { 1856 return getSema().ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc, 1857 EndLoc); 1858 } 1859 1860 /// Build a new OpenMP 'use_device_ptr' clause. 1861 /// 1862 /// By default, performs semantic analysis to build the new OpenMP clause. 1863 /// Subclasses may override this routine to provide different behavior. 1864 OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList, 1865 SourceLocation StartLoc, 1866 SourceLocation LParenLoc, 1867 SourceLocation EndLoc) { 1868 return getSema().ActOnOpenMPUseDevicePtrClause(VarList, StartLoc, LParenLoc, 1869 EndLoc); 1870 } 1871 1872 /// Build a new OpenMP 'is_device_ptr' clause. 1873 /// 1874 /// By default, performs semantic analysis to build the new OpenMP clause. 1875 /// Subclasses may override this routine to provide different behavior. 1876 OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList, 1877 SourceLocation StartLoc, 1878 SourceLocation LParenLoc, 1879 SourceLocation EndLoc) { 1880 return getSema().ActOnOpenMPIsDevicePtrClause(VarList, StartLoc, LParenLoc, 1881 EndLoc); 1882 } 1883 1884 /// \brief Rebuild the operand to an Objective-C \@synchronized statement. 1885 /// 1886 /// By default, performs semantic analysis to build the new statement. 1887 /// Subclasses may override this routine to provide different behavior. 1888 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 1889 Expr *object) { 1890 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 1891 } 1892 1893 /// \brief Build a new Objective-C \@synchronized statement. 1894 /// 1895 /// By default, performs semantic analysis to build the new statement. 1896 /// Subclasses may override this routine to provide different behavior. 1897 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 1898 Expr *Object, Stmt *Body) { 1899 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 1900 } 1901 1902 /// \brief Build a new Objective-C \@autoreleasepool statement. 1903 /// 1904 /// By default, performs semantic analysis to build the new statement. 1905 /// Subclasses may override this routine to provide different behavior. 1906 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 1907 Stmt *Body) { 1908 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 1909 } 1910 1911 /// \brief Build a new Objective-C fast enumeration statement. 1912 /// 1913 /// By default, performs semantic analysis to build the new statement. 1914 /// Subclasses may override this routine to provide different behavior. 1915 StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1916 Stmt *Element, 1917 Expr *Collection, 1918 SourceLocation RParenLoc, 1919 Stmt *Body) { 1920 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 1921 Element, 1922 Collection, 1923 RParenLoc); 1924 if (ForEachStmt.isInvalid()) 1925 return StmtError(); 1926 1927 return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body); 1928 } 1929 1930 /// \brief Build a new C++ exception declaration. 1931 /// 1932 /// By default, performs semantic analysis to build the new decaration. 1933 /// Subclasses may override this routine to provide different behavior. 1934 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1935 TypeSourceInfo *Declarator, 1936 SourceLocation StartLoc, 1937 SourceLocation IdLoc, 1938 IdentifierInfo *Id) { 1939 VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator, 1940 StartLoc, IdLoc, Id); 1941 if (Var) 1942 getSema().CurContext->addDecl(Var); 1943 return Var; 1944 } 1945 1946 /// \brief Build a new C++ catch statement. 1947 /// 1948 /// By default, performs semantic analysis to build the new statement. 1949 /// Subclasses may override this routine to provide different behavior. 1950 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 1951 VarDecl *ExceptionDecl, 1952 Stmt *Handler) { 1953 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 1954 Handler)); 1955 } 1956 1957 /// \brief Build a new C++ try statement. 1958 /// 1959 /// By default, performs semantic analysis to build the new statement. 1960 /// Subclasses may override this routine to provide different behavior. 1961 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 1962 ArrayRef<Stmt *> Handlers) { 1963 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 1964 } 1965 1966 /// \brief Build a new C++0x range-based for statement. 1967 /// 1968 /// By default, performs semantic analysis to build the new statement. 1969 /// Subclasses may override this routine to provide different behavior. 1970 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 1971 SourceLocation CoawaitLoc, 1972 SourceLocation ColonLoc, 1973 Stmt *Range, Stmt *Begin, Stmt *End, 1974 Expr *Cond, Expr *Inc, 1975 Stmt *LoopVar, 1976 SourceLocation RParenLoc) { 1977 // If we've just learned that the range is actually an Objective-C 1978 // collection, treat this as an Objective-C fast enumeration loop. 1979 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 1980 if (RangeStmt->isSingleDecl()) { 1981 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 1982 if (RangeVar->isInvalidDecl()) 1983 return StmtError(); 1984 1985 Expr *RangeExpr = RangeVar->getInit(); 1986 if (!RangeExpr->isTypeDependent() && 1987 RangeExpr->getType()->isObjCObjectPointerType()) 1988 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr, 1989 RParenLoc); 1990 } 1991 } 1992 } 1993 1994 return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, ColonLoc, 1995 Range, Begin, End, 1996 Cond, Inc, LoopVar, RParenLoc, 1997 Sema::BFRK_Rebuild); 1998 } 1999 2000 /// \brief Build a new C++0x range-based for statement. 2001 /// 2002 /// By default, performs semantic analysis to build the new statement. 2003 /// Subclasses may override this routine to provide different behavior. 2004 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 2005 bool IsIfExists, 2006 NestedNameSpecifierLoc QualifierLoc, 2007 DeclarationNameInfo NameInfo, 2008 Stmt *Nested) { 2009 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 2010 QualifierLoc, NameInfo, Nested); 2011 } 2012 2013 /// \brief Attach body to a C++0x range-based for statement. 2014 /// 2015 /// By default, performs semantic analysis to finish the new statement. 2016 /// Subclasses may override this routine to provide different behavior. 2017 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 2018 return getSema().FinishCXXForRangeStmt(ForRange, Body); 2019 } 2020 2021 StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc, 2022 Stmt *TryBlock, Stmt *Handler) { 2023 return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler); 2024 } 2025 2026 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr, 2027 Stmt *Block) { 2028 return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block); 2029 } 2030 2031 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) { 2032 return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block); 2033 } 2034 2035 /// \brief Build a new predefined expression. 2036 /// 2037 /// By default, performs semantic analysis to build the new expression. 2038 /// Subclasses may override this routine to provide different behavior. 2039 ExprResult RebuildPredefinedExpr(SourceLocation Loc, 2040 PredefinedExpr::IdentType IT) { 2041 return getSema().BuildPredefinedExpr(Loc, IT); 2042 } 2043 2044 /// \brief Build a new expression that references a declaration. 2045 /// 2046 /// By default, performs semantic analysis to build the new expression. 2047 /// Subclasses may override this routine to provide different behavior. 2048 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 2049 LookupResult &R, 2050 bool RequiresADL) { 2051 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 2052 } 2053 2054 2055 /// \brief Build a new expression that references a declaration. 2056 /// 2057 /// By default, performs semantic analysis to build the new expression. 2058 /// Subclasses may override this routine to provide different behavior. 2059 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 2060 ValueDecl *VD, 2061 const DeclarationNameInfo &NameInfo, 2062 TemplateArgumentListInfo *TemplateArgs) { 2063 CXXScopeSpec SS; 2064 SS.Adopt(QualifierLoc); 2065 2066 // FIXME: loses template args. 2067 2068 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 2069 } 2070 2071 /// \brief Build a new expression in parentheses. 2072 /// 2073 /// By default, performs semantic analysis to build the new expression. 2074 /// Subclasses may override this routine to provide different behavior. 2075 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 2076 SourceLocation RParen) { 2077 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 2078 } 2079 2080 /// \brief Build a new pseudo-destructor expression. 2081 /// 2082 /// By default, performs semantic analysis to build the new expression. 2083 /// Subclasses may override this routine to provide different behavior. 2084 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 2085 SourceLocation OperatorLoc, 2086 bool isArrow, 2087 CXXScopeSpec &SS, 2088 TypeSourceInfo *ScopeType, 2089 SourceLocation CCLoc, 2090 SourceLocation TildeLoc, 2091 PseudoDestructorTypeStorage Destroyed); 2092 2093 /// \brief Build a new unary operator expression. 2094 /// 2095 /// By default, performs semantic analysis to build the new expression. 2096 /// Subclasses may override this routine to provide different behavior. 2097 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 2098 UnaryOperatorKind Opc, 2099 Expr *SubExpr) { 2100 return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr); 2101 } 2102 2103 /// \brief Build a new builtin offsetof expression. 2104 /// 2105 /// By default, performs semantic analysis to build the new expression. 2106 /// Subclasses may override this routine to provide different behavior. 2107 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 2108 TypeSourceInfo *Type, 2109 ArrayRef<Sema::OffsetOfComponent> Components, 2110 SourceLocation RParenLoc) { 2111 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 2112 RParenLoc); 2113 } 2114 2115 /// \brief Build a new sizeof, alignof or vec_step expression with a 2116 /// type argument. 2117 /// 2118 /// By default, performs semantic analysis to build the new expression. 2119 /// Subclasses may override this routine to provide different behavior. 2120 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 2121 SourceLocation OpLoc, 2122 UnaryExprOrTypeTrait ExprKind, 2123 SourceRange R) { 2124 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 2125 } 2126 2127 /// \brief Build a new sizeof, alignof or vec step expression with an 2128 /// expression argument. 2129 /// 2130 /// By default, performs semantic analysis to build the new expression. 2131 /// Subclasses may override this routine to provide different behavior. 2132 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 2133 UnaryExprOrTypeTrait ExprKind, 2134 SourceRange R) { 2135 ExprResult Result 2136 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 2137 if (Result.isInvalid()) 2138 return ExprError(); 2139 2140 return Result; 2141 } 2142 2143 /// \brief Build a new array subscript expression. 2144 /// 2145 /// By default, performs semantic analysis to build the new expression. 2146 /// Subclasses may override this routine to provide different behavior. 2147 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 2148 SourceLocation LBracketLoc, 2149 Expr *RHS, 2150 SourceLocation RBracketLoc) { 2151 return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS, 2152 LBracketLoc, RHS, 2153 RBracketLoc); 2154 } 2155 2156 /// \brief Build a new array section expression. 2157 /// 2158 /// By default, performs semantic analysis to build the new expression. 2159 /// Subclasses may override this routine to provide different behavior. 2160 ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc, 2161 Expr *LowerBound, 2162 SourceLocation ColonLoc, Expr *Length, 2163 SourceLocation RBracketLoc) { 2164 return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound, 2165 ColonLoc, Length, RBracketLoc); 2166 } 2167 2168 /// \brief Build a new call expression. 2169 /// 2170 /// By default, performs semantic analysis to build the new expression. 2171 /// Subclasses may override this routine to provide different behavior. 2172 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 2173 MultiExprArg Args, 2174 SourceLocation RParenLoc, 2175 Expr *ExecConfig = nullptr) { 2176 return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc, 2177 Args, RParenLoc, ExecConfig); 2178 } 2179 2180 /// \brief Build a new member access expression. 2181 /// 2182 /// By default, performs semantic analysis to build the new expression. 2183 /// Subclasses may override this routine to provide different behavior. 2184 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 2185 bool isArrow, 2186 NestedNameSpecifierLoc QualifierLoc, 2187 SourceLocation TemplateKWLoc, 2188 const DeclarationNameInfo &MemberNameInfo, 2189 ValueDecl *Member, 2190 NamedDecl *FoundDecl, 2191 const TemplateArgumentListInfo *ExplicitTemplateArgs, 2192 NamedDecl *FirstQualifierInScope) { 2193 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 2194 isArrow); 2195 if (!Member->getDeclName()) { 2196 // We have a reference to an unnamed field. This is always the 2197 // base of an anonymous struct/union member access, i.e. the 2198 // field is always of record type. 2199 assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!"); 2200 assert(Member->getType()->isRecordType() && 2201 "unnamed member not of record type?"); 2202 2203 BaseResult = 2204 getSema().PerformObjectMemberConversion(BaseResult.get(), 2205 QualifierLoc.getNestedNameSpecifier(), 2206 FoundDecl, Member); 2207 if (BaseResult.isInvalid()) 2208 return ExprError(); 2209 Base = BaseResult.get(); 2210 ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind(); 2211 MemberExpr *ME = new (getSema().Context) 2212 MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo, 2213 cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary); 2214 return ME; 2215 } 2216 2217 CXXScopeSpec SS; 2218 SS.Adopt(QualifierLoc); 2219 2220 Base = BaseResult.get(); 2221 QualType BaseType = Base->getType(); 2222 2223 if (isArrow && !BaseType->isPointerType()) 2224 return ExprError(); 2225 2226 // FIXME: this involves duplicating earlier analysis in a lot of 2227 // cases; we should avoid this when possible. 2228 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 2229 R.addDecl(FoundDecl); 2230 R.resolveKind(); 2231 2232 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 2233 SS, TemplateKWLoc, 2234 FirstQualifierInScope, 2235 R, ExplicitTemplateArgs, 2236 /*S*/nullptr); 2237 } 2238 2239 /// \brief Build a new binary operator expression. 2240 /// 2241 /// By default, performs semantic analysis to build the new expression. 2242 /// Subclasses may override this routine to provide different behavior. 2243 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 2244 BinaryOperatorKind Opc, 2245 Expr *LHS, Expr *RHS) { 2246 return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS); 2247 } 2248 2249 /// \brief Build a new conditional operator expression. 2250 /// 2251 /// By default, performs semantic analysis to build the new expression. 2252 /// Subclasses may override this routine to provide different behavior. 2253 ExprResult RebuildConditionalOperator(Expr *Cond, 2254 SourceLocation QuestionLoc, 2255 Expr *LHS, 2256 SourceLocation ColonLoc, 2257 Expr *RHS) { 2258 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 2259 LHS, RHS); 2260 } 2261 2262 /// \brief Build a new C-style cast expression. 2263 /// 2264 /// By default, performs semantic analysis to build the new expression. 2265 /// Subclasses may override this routine to provide different behavior. 2266 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 2267 TypeSourceInfo *TInfo, 2268 SourceLocation RParenLoc, 2269 Expr *SubExpr) { 2270 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 2271 SubExpr); 2272 } 2273 2274 /// \brief Build a new compound literal expression. 2275 /// 2276 /// By default, performs semantic analysis to build the new expression. 2277 /// Subclasses may override this routine to provide different behavior. 2278 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 2279 TypeSourceInfo *TInfo, 2280 SourceLocation RParenLoc, 2281 Expr *Init) { 2282 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 2283 Init); 2284 } 2285 2286 /// \brief Build a new extended vector element access expression. 2287 /// 2288 /// By default, performs semantic analysis to build the new expression. 2289 /// Subclasses may override this routine to provide different behavior. 2290 ExprResult RebuildExtVectorElementExpr(Expr *Base, 2291 SourceLocation OpLoc, 2292 SourceLocation AccessorLoc, 2293 IdentifierInfo &Accessor) { 2294 2295 CXXScopeSpec SS; 2296 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 2297 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 2298 OpLoc, /*IsArrow*/ false, 2299 SS, SourceLocation(), 2300 /*FirstQualifierInScope*/ nullptr, 2301 NameInfo, 2302 /* TemplateArgs */ nullptr, 2303 /*S*/ nullptr); 2304 } 2305 2306 /// \brief Build a new initializer list expression. 2307 /// 2308 /// By default, performs semantic analysis to build the new expression. 2309 /// Subclasses may override this routine to provide different behavior. 2310 ExprResult RebuildInitList(SourceLocation LBraceLoc, 2311 MultiExprArg Inits, 2312 SourceLocation RBraceLoc, 2313 QualType ResultTy) { 2314 ExprResult Result 2315 = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 2316 if (Result.isInvalid() || ResultTy->isDependentType()) 2317 return Result; 2318 2319 // Patch in the result type we were given, which may have been computed 2320 // when the initial InitListExpr was built. 2321 InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 2322 ILE->setType(ResultTy); 2323 return Result; 2324 } 2325 2326 /// \brief Build a new designated initializer expression. 2327 /// 2328 /// By default, performs semantic analysis to build the new expression. 2329 /// Subclasses may override this routine to provide different behavior. 2330 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 2331 MultiExprArg ArrayExprs, 2332 SourceLocation EqualOrColonLoc, 2333 bool GNUSyntax, 2334 Expr *Init) { 2335 ExprResult Result 2336 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 2337 Init); 2338 if (Result.isInvalid()) 2339 return ExprError(); 2340 2341 return Result; 2342 } 2343 2344 /// \brief Build a new value-initialized expression. 2345 /// 2346 /// By default, builds the implicit value initialization without performing 2347 /// any semantic analysis. Subclasses may override this routine to provide 2348 /// different behavior. 2349 ExprResult RebuildImplicitValueInitExpr(QualType T) { 2350 return new (SemaRef.Context) ImplicitValueInitExpr(T); 2351 } 2352 2353 /// \brief Build a new \c va_arg expression. 2354 /// 2355 /// By default, performs semantic analysis to build the new expression. 2356 /// Subclasses may override this routine to provide different behavior. 2357 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 2358 Expr *SubExpr, TypeSourceInfo *TInfo, 2359 SourceLocation RParenLoc) { 2360 return getSema().BuildVAArgExpr(BuiltinLoc, 2361 SubExpr, TInfo, 2362 RParenLoc); 2363 } 2364 2365 /// \brief Build a new expression list in parentheses. 2366 /// 2367 /// By default, performs semantic analysis to build the new expression. 2368 /// Subclasses may override this routine to provide different behavior. 2369 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 2370 MultiExprArg SubExprs, 2371 SourceLocation RParenLoc) { 2372 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 2373 } 2374 2375 /// \brief Build a new address-of-label expression. 2376 /// 2377 /// By default, performs semantic analysis, using the name of the label 2378 /// rather than attempting to map the label statement itself. 2379 /// Subclasses may override this routine to provide different behavior. 2380 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 2381 SourceLocation LabelLoc, LabelDecl *Label) { 2382 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 2383 } 2384 2385 /// \brief Build a new GNU statement expression. 2386 /// 2387 /// By default, performs semantic analysis to build the new expression. 2388 /// Subclasses may override this routine to provide different behavior. 2389 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 2390 Stmt *SubStmt, 2391 SourceLocation RParenLoc) { 2392 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 2393 } 2394 2395 /// \brief Build a new __builtin_choose_expr 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 RebuildChooseExpr(SourceLocation BuiltinLoc, 2400 Expr *Cond, Expr *LHS, Expr *RHS, 2401 SourceLocation RParenLoc) { 2402 return SemaRef.ActOnChooseExpr(BuiltinLoc, 2403 Cond, LHS, RHS, 2404 RParenLoc); 2405 } 2406 2407 /// \brief Build a new generic selection expression. 2408 /// 2409 /// By default, performs semantic analysis to build the new expression. 2410 /// Subclasses may override this routine to provide different behavior. 2411 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 2412 SourceLocation DefaultLoc, 2413 SourceLocation RParenLoc, 2414 Expr *ControllingExpr, 2415 ArrayRef<TypeSourceInfo *> Types, 2416 ArrayRef<Expr *> Exprs) { 2417 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 2418 ControllingExpr, Types, Exprs); 2419 } 2420 2421 /// \brief Build a new overloaded operator call expression. 2422 /// 2423 /// By default, performs semantic analysis to build the new expression. 2424 /// The semantic analysis provides the behavior of template instantiation, 2425 /// copying with transformations that turn what looks like an overloaded 2426 /// operator call into a use of a builtin operator, performing 2427 /// argument-dependent lookup, etc. Subclasses may override this routine to 2428 /// provide different behavior. 2429 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 2430 SourceLocation OpLoc, 2431 Expr *Callee, 2432 Expr *First, 2433 Expr *Second); 2434 2435 /// \brief Build a new C++ "named" cast expression, such as static_cast or 2436 /// reinterpret_cast. 2437 /// 2438 /// By default, this routine dispatches to one of the more-specific routines 2439 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 2440 /// Subclasses may override this routine to provide different behavior. 2441 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 2442 Stmt::StmtClass Class, 2443 SourceLocation LAngleLoc, 2444 TypeSourceInfo *TInfo, 2445 SourceLocation RAngleLoc, 2446 SourceLocation LParenLoc, 2447 Expr *SubExpr, 2448 SourceLocation RParenLoc) { 2449 switch (Class) { 2450 case Stmt::CXXStaticCastExprClass: 2451 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 2452 RAngleLoc, LParenLoc, 2453 SubExpr, RParenLoc); 2454 2455 case Stmt::CXXDynamicCastExprClass: 2456 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 2457 RAngleLoc, LParenLoc, 2458 SubExpr, RParenLoc); 2459 2460 case Stmt::CXXReinterpretCastExprClass: 2461 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 2462 RAngleLoc, LParenLoc, 2463 SubExpr, 2464 RParenLoc); 2465 2466 case Stmt::CXXConstCastExprClass: 2467 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 2468 RAngleLoc, LParenLoc, 2469 SubExpr, RParenLoc); 2470 2471 default: 2472 llvm_unreachable("Invalid C++ named cast"); 2473 } 2474 } 2475 2476 /// \brief Build a new C++ static_cast 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 RebuildCXXStaticCastExpr(SourceLocation OpLoc, 2481 SourceLocation LAngleLoc, 2482 TypeSourceInfo *TInfo, 2483 SourceLocation RAngleLoc, 2484 SourceLocation LParenLoc, 2485 Expr *SubExpr, 2486 SourceLocation RParenLoc) { 2487 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 2488 TInfo, SubExpr, 2489 SourceRange(LAngleLoc, RAngleLoc), 2490 SourceRange(LParenLoc, RParenLoc)); 2491 } 2492 2493 /// \brief Build a new C++ dynamic_cast expression. 2494 /// 2495 /// By default, performs semantic analysis to build the new expression. 2496 /// Subclasses may override this routine to provide different behavior. 2497 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 2498 SourceLocation LAngleLoc, 2499 TypeSourceInfo *TInfo, 2500 SourceLocation RAngleLoc, 2501 SourceLocation LParenLoc, 2502 Expr *SubExpr, 2503 SourceLocation RParenLoc) { 2504 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 2505 TInfo, SubExpr, 2506 SourceRange(LAngleLoc, RAngleLoc), 2507 SourceRange(LParenLoc, RParenLoc)); 2508 } 2509 2510 /// \brief Build a new C++ reinterpret_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 RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 2515 SourceLocation LAngleLoc, 2516 TypeSourceInfo *TInfo, 2517 SourceLocation RAngleLoc, 2518 SourceLocation LParenLoc, 2519 Expr *SubExpr, 2520 SourceLocation RParenLoc) { 2521 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 2522 TInfo, SubExpr, 2523 SourceRange(LAngleLoc, RAngleLoc), 2524 SourceRange(LParenLoc, RParenLoc)); 2525 } 2526 2527 /// \brief Build a new C++ const_cast expression. 2528 /// 2529 /// By default, performs semantic analysis to build the new expression. 2530 /// Subclasses may override this routine to provide different behavior. 2531 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 2532 SourceLocation LAngleLoc, 2533 TypeSourceInfo *TInfo, 2534 SourceLocation RAngleLoc, 2535 SourceLocation LParenLoc, 2536 Expr *SubExpr, 2537 SourceLocation RParenLoc) { 2538 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 2539 TInfo, SubExpr, 2540 SourceRange(LAngleLoc, RAngleLoc), 2541 SourceRange(LParenLoc, RParenLoc)); 2542 } 2543 2544 /// \brief Build a new C++ functional-style cast expression. 2545 /// 2546 /// By default, performs semantic analysis to build the new expression. 2547 /// Subclasses may override this routine to provide different behavior. 2548 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 2549 SourceLocation LParenLoc, 2550 Expr *Sub, 2551 SourceLocation RParenLoc) { 2552 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 2553 MultiExprArg(&Sub, 1), 2554 RParenLoc); 2555 } 2556 2557 /// \brief Build a new C++ typeid(type) expression. 2558 /// 2559 /// By default, performs semantic analysis to build the new expression. 2560 /// Subclasses may override this routine to provide different behavior. 2561 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2562 SourceLocation TypeidLoc, 2563 TypeSourceInfo *Operand, 2564 SourceLocation RParenLoc) { 2565 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2566 RParenLoc); 2567 } 2568 2569 2570 /// \brief Build a new C++ typeid(expr) expression. 2571 /// 2572 /// By default, performs semantic analysis to build the new expression. 2573 /// Subclasses may override this routine to provide different behavior. 2574 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 2575 SourceLocation TypeidLoc, 2576 Expr *Operand, 2577 SourceLocation RParenLoc) { 2578 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 2579 RParenLoc); 2580 } 2581 2582 /// \brief Build a new C++ __uuidof(type) expression. 2583 /// 2584 /// By default, performs semantic analysis to build the new expression. 2585 /// Subclasses may override this routine to provide different behavior. 2586 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2587 SourceLocation TypeidLoc, 2588 TypeSourceInfo *Operand, 2589 SourceLocation RParenLoc) { 2590 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2591 RParenLoc); 2592 } 2593 2594 /// \brief Build a new C++ __uuidof(expr) expression. 2595 /// 2596 /// By default, performs semantic analysis to build the new expression. 2597 /// Subclasses may override this routine to provide different behavior. 2598 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2599 SourceLocation TypeidLoc, 2600 Expr *Operand, 2601 SourceLocation RParenLoc) { 2602 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2603 RParenLoc); 2604 } 2605 2606 /// \brief Build a new C++ "this" expression. 2607 /// 2608 /// By default, builds a new "this" expression without performing any 2609 /// semantic analysis. Subclasses may override this routine to provide 2610 /// different behavior. 2611 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2612 QualType ThisType, 2613 bool isImplicit) { 2614 getSema().CheckCXXThisCapture(ThisLoc); 2615 return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit); 2616 } 2617 2618 /// \brief Build a new C++ throw expression. 2619 /// 2620 /// By default, performs semantic analysis to build the new expression. 2621 /// Subclasses may override this routine to provide different behavior. 2622 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2623 bool IsThrownVariableInScope) { 2624 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2625 } 2626 2627 /// \brief Build a new C++ default-argument expression. 2628 /// 2629 /// By default, builds a new default-argument expression, which does not 2630 /// require any semantic analysis. Subclasses may override this routine to 2631 /// provide different behavior. 2632 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2633 ParmVarDecl *Param) { 2634 return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param); 2635 } 2636 2637 /// \brief Build a new C++11 default-initialization expression. 2638 /// 2639 /// By default, builds a new default field initialization expression, which 2640 /// does not require any semantic analysis. Subclasses may override this 2641 /// routine to provide different behavior. 2642 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2643 FieldDecl *Field) { 2644 return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field); 2645 } 2646 2647 /// \brief Build a new C++ zero-initialization expression. 2648 /// 2649 /// By default, performs semantic analysis to build the new expression. 2650 /// Subclasses may override this routine to provide different behavior. 2651 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2652 SourceLocation LParenLoc, 2653 SourceLocation RParenLoc) { 2654 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, 2655 None, RParenLoc); 2656 } 2657 2658 /// \brief Build a new C++ "new" expression. 2659 /// 2660 /// By default, performs semantic analysis to build the new expression. 2661 /// Subclasses may override this routine to provide different behavior. 2662 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2663 bool UseGlobal, 2664 SourceLocation PlacementLParen, 2665 MultiExprArg PlacementArgs, 2666 SourceLocation PlacementRParen, 2667 SourceRange TypeIdParens, 2668 QualType AllocatedType, 2669 TypeSourceInfo *AllocatedTypeInfo, 2670 Expr *ArraySize, 2671 SourceRange DirectInitRange, 2672 Expr *Initializer) { 2673 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2674 PlacementLParen, 2675 PlacementArgs, 2676 PlacementRParen, 2677 TypeIdParens, 2678 AllocatedType, 2679 AllocatedTypeInfo, 2680 ArraySize, 2681 DirectInitRange, 2682 Initializer); 2683 } 2684 2685 /// \brief Build a new C++ "delete" expression. 2686 /// 2687 /// By default, performs semantic analysis to build the new expression. 2688 /// Subclasses may override this routine to provide different behavior. 2689 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2690 bool IsGlobalDelete, 2691 bool IsArrayForm, 2692 Expr *Operand) { 2693 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2694 Operand); 2695 } 2696 2697 /// \brief Build a new type trait expression. 2698 /// 2699 /// By default, performs semantic analysis to build the new expression. 2700 /// Subclasses may override this routine to provide different behavior. 2701 ExprResult RebuildTypeTrait(TypeTrait Trait, 2702 SourceLocation StartLoc, 2703 ArrayRef<TypeSourceInfo *> Args, 2704 SourceLocation RParenLoc) { 2705 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2706 } 2707 2708 /// \brief Build a new array type trait expression. 2709 /// 2710 /// By default, performs semantic analysis to build the new expression. 2711 /// Subclasses may override this routine to provide different behavior. 2712 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2713 SourceLocation StartLoc, 2714 TypeSourceInfo *TSInfo, 2715 Expr *DimExpr, 2716 SourceLocation RParenLoc) { 2717 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2718 } 2719 2720 /// \brief Build a new expression trait expression. 2721 /// 2722 /// By default, performs semantic analysis to build the new expression. 2723 /// Subclasses may override this routine to provide different behavior. 2724 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2725 SourceLocation StartLoc, 2726 Expr *Queried, 2727 SourceLocation RParenLoc) { 2728 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2729 } 2730 2731 /// \brief Build a new (previously unresolved) declaration reference 2732 /// expression. 2733 /// 2734 /// By default, performs semantic analysis to build the new expression. 2735 /// Subclasses may override this routine to provide different behavior. 2736 ExprResult RebuildDependentScopeDeclRefExpr( 2737 NestedNameSpecifierLoc QualifierLoc, 2738 SourceLocation TemplateKWLoc, 2739 const DeclarationNameInfo &NameInfo, 2740 const TemplateArgumentListInfo *TemplateArgs, 2741 bool IsAddressOfOperand, 2742 TypeSourceInfo **RecoveryTSI) { 2743 CXXScopeSpec SS; 2744 SS.Adopt(QualifierLoc); 2745 2746 if (TemplateArgs || TemplateKWLoc.isValid()) 2747 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo, 2748 TemplateArgs); 2749 2750 return getSema().BuildQualifiedDeclarationNameExpr( 2751 SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI); 2752 } 2753 2754 /// \brief Build a new template-id expression. 2755 /// 2756 /// By default, performs semantic analysis to build the new expression. 2757 /// Subclasses may override this routine to provide different behavior. 2758 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2759 SourceLocation TemplateKWLoc, 2760 LookupResult &R, 2761 bool RequiresADL, 2762 const TemplateArgumentListInfo *TemplateArgs) { 2763 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2764 TemplateArgs); 2765 } 2766 2767 /// \brief Build a new object-construction expression. 2768 /// 2769 /// By default, performs semantic analysis to build the new expression. 2770 /// Subclasses may override this routine to provide different behavior. 2771 ExprResult RebuildCXXConstructExpr(QualType T, 2772 SourceLocation Loc, 2773 CXXConstructorDecl *Constructor, 2774 bool IsElidable, 2775 MultiExprArg Args, 2776 bool HadMultipleCandidates, 2777 bool ListInitialization, 2778 bool StdInitListInitialization, 2779 bool RequiresZeroInit, 2780 CXXConstructExpr::ConstructionKind ConstructKind, 2781 SourceRange ParenRange) { 2782 SmallVector<Expr*, 8> ConvertedArgs; 2783 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2784 ConvertedArgs)) 2785 return ExprError(); 2786 2787 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, 2788 IsElidable, 2789 ConvertedArgs, 2790 HadMultipleCandidates, 2791 ListInitialization, 2792 StdInitListInitialization, 2793 RequiresZeroInit, ConstructKind, 2794 ParenRange); 2795 } 2796 2797 /// \brief Build a new implicit construction via inherited constructor 2798 /// expression. 2799 ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc, 2800 CXXConstructorDecl *Constructor, 2801 bool ConstructsVBase, 2802 bool InheritedFromVBase) { 2803 return new (getSema().Context) CXXInheritedCtorInitExpr( 2804 Loc, T, Constructor, ConstructsVBase, InheritedFromVBase); 2805 } 2806 2807 /// \brief Build a new object-construction expression. 2808 /// 2809 /// By default, performs semantic analysis to build the new expression. 2810 /// Subclasses may override this routine to provide different behavior. 2811 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2812 SourceLocation LParenLoc, 2813 MultiExprArg Args, 2814 SourceLocation RParenLoc) { 2815 return getSema().BuildCXXTypeConstructExpr(TSInfo, 2816 LParenLoc, 2817 Args, 2818 RParenLoc); 2819 } 2820 2821 /// \brief Build a new object-construction expression. 2822 /// 2823 /// By default, performs semantic analysis to build the new expression. 2824 /// Subclasses may override this routine to provide different behavior. 2825 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2826 SourceLocation LParenLoc, 2827 MultiExprArg Args, 2828 SourceLocation RParenLoc) { 2829 return getSema().BuildCXXTypeConstructExpr(TSInfo, 2830 LParenLoc, 2831 Args, 2832 RParenLoc); 2833 } 2834 2835 /// \brief Build a new member reference expression. 2836 /// 2837 /// By default, performs semantic analysis to build the new expression. 2838 /// Subclasses may override this routine to provide different behavior. 2839 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2840 QualType BaseType, 2841 bool IsArrow, 2842 SourceLocation OperatorLoc, 2843 NestedNameSpecifierLoc QualifierLoc, 2844 SourceLocation TemplateKWLoc, 2845 NamedDecl *FirstQualifierInScope, 2846 const DeclarationNameInfo &MemberNameInfo, 2847 const TemplateArgumentListInfo *TemplateArgs) { 2848 CXXScopeSpec SS; 2849 SS.Adopt(QualifierLoc); 2850 2851 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2852 OperatorLoc, IsArrow, 2853 SS, TemplateKWLoc, 2854 FirstQualifierInScope, 2855 MemberNameInfo, 2856 TemplateArgs, /*S*/nullptr); 2857 } 2858 2859 /// \brief Build a new member reference expression. 2860 /// 2861 /// By default, performs semantic analysis to build the new expression. 2862 /// Subclasses may override this routine to provide different behavior. 2863 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2864 SourceLocation OperatorLoc, 2865 bool IsArrow, 2866 NestedNameSpecifierLoc QualifierLoc, 2867 SourceLocation TemplateKWLoc, 2868 NamedDecl *FirstQualifierInScope, 2869 LookupResult &R, 2870 const TemplateArgumentListInfo *TemplateArgs) { 2871 CXXScopeSpec SS; 2872 SS.Adopt(QualifierLoc); 2873 2874 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2875 OperatorLoc, IsArrow, 2876 SS, TemplateKWLoc, 2877 FirstQualifierInScope, 2878 R, TemplateArgs, /*S*/nullptr); 2879 } 2880 2881 /// \brief Build a new noexcept expression. 2882 /// 2883 /// By default, performs semantic analysis to build the new expression. 2884 /// Subclasses may override this routine to provide different behavior. 2885 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2886 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2887 } 2888 2889 /// \brief Build a new expression to compute the length of a parameter pack. 2890 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, 2891 NamedDecl *Pack, 2892 SourceLocation PackLoc, 2893 SourceLocation RParenLoc, 2894 Optional<unsigned> Length, 2895 ArrayRef<TemplateArgument> PartialArgs) { 2896 return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc, 2897 RParenLoc, Length, PartialArgs); 2898 } 2899 2900 /// \brief Build a new Objective-C boxed expression. 2901 /// 2902 /// By default, performs semantic analysis to build the new expression. 2903 /// Subclasses may override this routine to provide different behavior. 2904 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2905 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2906 } 2907 2908 /// \brief Build a new Objective-C array literal. 2909 /// 2910 /// By default, performs semantic analysis to build the new expression. 2911 /// Subclasses may override this routine to provide different behavior. 2912 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2913 Expr **Elements, unsigned NumElements) { 2914 return getSema().BuildObjCArrayLiteral(Range, 2915 MultiExprArg(Elements, NumElements)); 2916 } 2917 2918 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2919 Expr *Base, Expr *Key, 2920 ObjCMethodDecl *getterMethod, 2921 ObjCMethodDecl *setterMethod) { 2922 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2923 getterMethod, setterMethod); 2924 } 2925 2926 /// \brief Build a new Objective-C dictionary literal. 2927 /// 2928 /// By default, performs semantic analysis to build the new expression. 2929 /// Subclasses may override this routine to provide different behavior. 2930 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 2931 MutableArrayRef<ObjCDictionaryElement> Elements) { 2932 return getSema().BuildObjCDictionaryLiteral(Range, Elements); 2933 } 2934 2935 /// \brief Build a new Objective-C \@encode expression. 2936 /// 2937 /// By default, performs semantic analysis to build the new expression. 2938 /// Subclasses may override this routine to provide different behavior. 2939 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 2940 TypeSourceInfo *EncodeTypeInfo, 2941 SourceLocation RParenLoc) { 2942 return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc); 2943 } 2944 2945 /// \brief Build a new Objective-C class message. 2946 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 2947 Selector Sel, 2948 ArrayRef<SourceLocation> SelectorLocs, 2949 ObjCMethodDecl *Method, 2950 SourceLocation LBracLoc, 2951 MultiExprArg Args, 2952 SourceLocation RBracLoc) { 2953 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 2954 ReceiverTypeInfo->getType(), 2955 /*SuperLoc=*/SourceLocation(), 2956 Sel, Method, LBracLoc, SelectorLocs, 2957 RBracLoc, Args); 2958 } 2959 2960 /// \brief Build a new Objective-C instance message. 2961 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 2962 Selector Sel, 2963 ArrayRef<SourceLocation> SelectorLocs, 2964 ObjCMethodDecl *Method, 2965 SourceLocation LBracLoc, 2966 MultiExprArg Args, 2967 SourceLocation RBracLoc) { 2968 return SemaRef.BuildInstanceMessage(Receiver, 2969 Receiver->getType(), 2970 /*SuperLoc=*/SourceLocation(), 2971 Sel, Method, LBracLoc, SelectorLocs, 2972 RBracLoc, Args); 2973 } 2974 2975 /// \brief Build a new Objective-C instance/class message to 'super'. 2976 ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc, 2977 Selector Sel, 2978 ArrayRef<SourceLocation> SelectorLocs, 2979 QualType SuperType, 2980 ObjCMethodDecl *Method, 2981 SourceLocation LBracLoc, 2982 MultiExprArg Args, 2983 SourceLocation RBracLoc) { 2984 return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr, 2985 SuperType, 2986 SuperLoc, 2987 Sel, Method, LBracLoc, SelectorLocs, 2988 RBracLoc, Args) 2989 : SemaRef.BuildClassMessage(nullptr, 2990 SuperType, 2991 SuperLoc, 2992 Sel, Method, LBracLoc, SelectorLocs, 2993 RBracLoc, Args); 2994 2995 2996 } 2997 2998 /// \brief Build a new Objective-C ivar reference expression. 2999 /// 3000 /// By default, performs semantic analysis to build the new expression. 3001 /// Subclasses may override this routine to provide different behavior. 3002 ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 3003 SourceLocation IvarLoc, 3004 bool IsArrow, bool IsFreeIvar) { 3005 CXXScopeSpec SS; 3006 DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc); 3007 ExprResult Result = getSema().BuildMemberReferenceExpr( 3008 BaseArg, BaseArg->getType(), 3009 /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(), 3010 /*FirstQualifierInScope=*/nullptr, NameInfo, 3011 /*TemplateArgs=*/nullptr, 3012 /*S=*/nullptr); 3013 if (IsFreeIvar && Result.isUsable()) 3014 cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar); 3015 return Result; 3016 } 3017 3018 /// \brief Build a new Objective-C property reference expression. 3019 /// 3020 /// By default, performs semantic analysis to build the new expression. 3021 /// Subclasses may override this routine to provide different behavior. 3022 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 3023 ObjCPropertyDecl *Property, 3024 SourceLocation PropertyLoc) { 3025 CXXScopeSpec SS; 3026 DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc); 3027 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3028 /*FIXME:*/PropertyLoc, 3029 /*IsArrow=*/false, 3030 SS, SourceLocation(), 3031 /*FirstQualifierInScope=*/nullptr, 3032 NameInfo, 3033 /*TemplateArgs=*/nullptr, 3034 /*S=*/nullptr); 3035 } 3036 3037 /// \brief Build a new Objective-C property reference expression. 3038 /// 3039 /// By default, performs semantic analysis to build the new expression. 3040 /// Subclasses may override this routine to provide different behavior. 3041 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 3042 ObjCMethodDecl *Getter, 3043 ObjCMethodDecl *Setter, 3044 SourceLocation PropertyLoc) { 3045 // Since these expressions can only be value-dependent, we do not 3046 // need to perform semantic analysis again. 3047 return Owned( 3048 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 3049 VK_LValue, OK_ObjCProperty, 3050 PropertyLoc, Base)); 3051 } 3052 3053 /// \brief Build a new Objective-C "isa" expression. 3054 /// 3055 /// By default, performs semantic analysis to build the new expression. 3056 /// Subclasses may override this routine to provide different behavior. 3057 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 3058 SourceLocation OpLoc, bool IsArrow) { 3059 CXXScopeSpec SS; 3060 DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc); 3061 return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(), 3062 OpLoc, IsArrow, 3063 SS, SourceLocation(), 3064 /*FirstQualifierInScope=*/nullptr, 3065 NameInfo, 3066 /*TemplateArgs=*/nullptr, 3067 /*S=*/nullptr); 3068 } 3069 3070 /// \brief Build a new shuffle vector expression. 3071 /// 3072 /// By default, performs semantic analysis to build the new expression. 3073 /// Subclasses may override this routine to provide different behavior. 3074 ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 3075 MultiExprArg SubExprs, 3076 SourceLocation RParenLoc) { 3077 // Find the declaration for __builtin_shufflevector 3078 const IdentifierInfo &Name 3079 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 3080 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 3081 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 3082 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 3083 3084 // Build a reference to the __builtin_shufflevector builtin 3085 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 3086 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false, 3087 SemaRef.Context.BuiltinFnTy, 3088 VK_RValue, BuiltinLoc); 3089 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 3090 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 3091 CK_BuiltinFnToFnPtr).get(); 3092 3093 // Build the CallExpr 3094 ExprResult TheCall = new (SemaRef.Context) CallExpr( 3095 SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(), 3096 Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc); 3097 3098 // Type-check the __builtin_shufflevector expression. 3099 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get())); 3100 } 3101 3102 /// \brief Build a new convert vector expression. 3103 ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc, 3104 Expr *SrcExpr, TypeSourceInfo *DstTInfo, 3105 SourceLocation RParenLoc) { 3106 return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo, 3107 BuiltinLoc, RParenLoc); 3108 } 3109 3110 /// \brief Build a new template argument pack expansion. 3111 /// 3112 /// By default, performs semantic analysis to build a new pack expansion 3113 /// for a template argument. Subclasses may override this routine to provide 3114 /// different behavior. 3115 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 3116 SourceLocation EllipsisLoc, 3117 Optional<unsigned> NumExpansions) { 3118 switch (Pattern.getArgument().getKind()) { 3119 case TemplateArgument::Expression: { 3120 ExprResult Result 3121 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 3122 EllipsisLoc, NumExpansions); 3123 if (Result.isInvalid()) 3124 return TemplateArgumentLoc(); 3125 3126 return TemplateArgumentLoc(Result.get(), Result.get()); 3127 } 3128 3129 case TemplateArgument::Template: 3130 return TemplateArgumentLoc(TemplateArgument( 3131 Pattern.getArgument().getAsTemplate(), 3132 NumExpansions), 3133 Pattern.getTemplateQualifierLoc(), 3134 Pattern.getTemplateNameLoc(), 3135 EllipsisLoc); 3136 3137 case TemplateArgument::Null: 3138 case TemplateArgument::Integral: 3139 case TemplateArgument::Declaration: 3140 case TemplateArgument::Pack: 3141 case TemplateArgument::TemplateExpansion: 3142 case TemplateArgument::NullPtr: 3143 llvm_unreachable("Pack expansion pattern has no parameter packs"); 3144 3145 case TemplateArgument::Type: 3146 if (TypeSourceInfo *Expansion 3147 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 3148 EllipsisLoc, 3149 NumExpansions)) 3150 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 3151 Expansion); 3152 break; 3153 } 3154 3155 return TemplateArgumentLoc(); 3156 } 3157 3158 /// \brief Build a new expression pack expansion. 3159 /// 3160 /// By default, performs semantic analysis to build a new pack expansion 3161 /// for an expression. Subclasses may override this routine to provide 3162 /// different behavior. 3163 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 3164 Optional<unsigned> NumExpansions) { 3165 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 3166 } 3167 3168 /// \brief Build a new C++1z fold-expression. 3169 /// 3170 /// By default, performs semantic analysis in order to build a new fold 3171 /// expression. 3172 ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS, 3173 BinaryOperatorKind Operator, 3174 SourceLocation EllipsisLoc, Expr *RHS, 3175 SourceLocation RParenLoc) { 3176 return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc, 3177 RHS, RParenLoc); 3178 } 3179 3180 /// \brief Build an empty C++1z fold-expression with the given operator. 3181 /// 3182 /// By default, produces the fallback value for the fold-expression, or 3183 /// produce an error if there is no fallback value. 3184 ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, 3185 BinaryOperatorKind Operator) { 3186 return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator); 3187 } 3188 3189 /// \brief Build a new atomic operation expression. 3190 /// 3191 /// By default, performs semantic analysis to build the new expression. 3192 /// Subclasses may override this routine to provide different behavior. 3193 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 3194 MultiExprArg SubExprs, 3195 QualType RetTy, 3196 AtomicExpr::AtomicOp Op, 3197 SourceLocation RParenLoc) { 3198 // Just create the expression; there is not any interesting semantic 3199 // analysis here because we can't actually build an AtomicExpr until 3200 // we are sure it is semantically sound. 3201 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 3202 RParenLoc); 3203 } 3204 3205 private: 3206 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 3207 QualType ObjectType, 3208 NamedDecl *FirstQualifierInScope, 3209 CXXScopeSpec &SS); 3210 3211 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3212 QualType ObjectType, 3213 NamedDecl *FirstQualifierInScope, 3214 CXXScopeSpec &SS); 3215 3216 TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType, 3217 NamedDecl *FirstQualifierInScope, 3218 CXXScopeSpec &SS); 3219 3220 QualType TransformDependentNameType(TypeLocBuilder &TLB, 3221 DependentNameTypeLoc TL, 3222 bool DeducibleTSTContext); 3223 }; 3224 3225 template<typename Derived> 3226 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 3227 if (!S) 3228 return S; 3229 3230 switch (S->getStmtClass()) { 3231 case Stmt::NoStmtClass: break; 3232 3233 // Transform individual statement nodes 3234 #define STMT(Node, Parent) \ 3235 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 3236 #define ABSTRACT_STMT(Node) 3237 #define EXPR(Node, Parent) 3238 #include "clang/AST/StmtNodes.inc" 3239 3240 // Transform expressions by calling TransformExpr. 3241 #define STMT(Node, Parent) 3242 #define ABSTRACT_STMT(Stmt) 3243 #define EXPR(Node, Parent) case Stmt::Node##Class: 3244 #include "clang/AST/StmtNodes.inc" 3245 { 3246 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 3247 if (E.isInvalid()) 3248 return StmtError(); 3249 3250 return getSema().ActOnExprStmt(E); 3251 } 3252 } 3253 3254 return S; 3255 } 3256 3257 template<typename Derived> 3258 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 3259 if (!S) 3260 return S; 3261 3262 switch (S->getClauseKind()) { 3263 default: break; 3264 // Transform individual clause nodes 3265 #define OPENMP_CLAUSE(Name, Class) \ 3266 case OMPC_ ## Name : \ 3267 return getDerived().Transform ## Class(cast<Class>(S)); 3268 #include "clang/Basic/OpenMPKinds.def" 3269 } 3270 3271 return S; 3272 } 3273 3274 3275 template<typename Derived> 3276 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 3277 if (!E) 3278 return E; 3279 3280 switch (E->getStmtClass()) { 3281 case Stmt::NoStmtClass: break; 3282 #define STMT(Node, Parent) case Stmt::Node##Class: break; 3283 #define ABSTRACT_STMT(Stmt) 3284 #define EXPR(Node, Parent) \ 3285 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 3286 #include "clang/AST/StmtNodes.inc" 3287 } 3288 3289 return E; 3290 } 3291 3292 template<typename Derived> 3293 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 3294 bool NotCopyInit) { 3295 // Initializers are instantiated like expressions, except that various outer 3296 // layers are stripped. 3297 if (!Init) 3298 return Init; 3299 3300 if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init)) 3301 Init = ExprTemp->getSubExpr(); 3302 3303 if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) 3304 Init = AIL->getCommonExpr(); 3305 3306 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 3307 Init = MTE->GetTemporaryExpr(); 3308 3309 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 3310 Init = Binder->getSubExpr(); 3311 3312 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 3313 Init = ICE->getSubExprAsWritten(); 3314 3315 if (CXXStdInitializerListExpr *ILE = 3316 dyn_cast<CXXStdInitializerListExpr>(Init)) 3317 return TransformInitializer(ILE->getSubExpr(), NotCopyInit); 3318 3319 // If this is copy-initialization, we only need to reconstruct 3320 // InitListExprs. Other forms of copy-initialization will be a no-op if 3321 // the initializer is already the right type. 3322 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 3323 if (!NotCopyInit && !(Construct && Construct->isListInitialization())) 3324 return getDerived().TransformExpr(Init); 3325 3326 // Revert value-initialization back to empty parens. 3327 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 3328 SourceRange Parens = VIE->getSourceRange(); 3329 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 3330 Parens.getEnd()); 3331 } 3332 3333 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 3334 if (isa<ImplicitValueInitExpr>(Init)) 3335 return getDerived().RebuildParenListExpr(SourceLocation(), None, 3336 SourceLocation()); 3337 3338 // Revert initialization by constructor back to a parenthesized or braced list 3339 // of expressions. Any other form of initializer can just be reused directly. 3340 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 3341 return getDerived().TransformExpr(Init); 3342 3343 // If the initialization implicitly converted an initializer list to a 3344 // std::initializer_list object, unwrap the std::initializer_list too. 3345 if (Construct && Construct->isStdInitListInitialization()) 3346 return TransformInitializer(Construct->getArg(0), NotCopyInit); 3347 3348 SmallVector<Expr*, 8> NewArgs; 3349 bool ArgChanged = false; 3350 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 3351 /*IsCall*/true, NewArgs, &ArgChanged)) 3352 return ExprError(); 3353 3354 // If this was list initialization, revert to list form. 3355 if (Construct->isListInitialization()) 3356 return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs, 3357 Construct->getLocEnd(), 3358 Construct->getType()); 3359 3360 // Build a ParenListExpr to represent anything else. 3361 SourceRange Parens = Construct->getParenOrBraceRange(); 3362 if (Parens.isInvalid()) { 3363 // This was a variable declaration's initialization for which no initializer 3364 // was specified. 3365 assert(NewArgs.empty() && 3366 "no parens or braces but have direct init with arguments?"); 3367 return ExprEmpty(); 3368 } 3369 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 3370 Parens.getEnd()); 3371 } 3372 3373 template<typename Derived> 3374 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs, 3375 unsigned NumInputs, 3376 bool IsCall, 3377 SmallVectorImpl<Expr *> &Outputs, 3378 bool *ArgChanged) { 3379 for (unsigned I = 0; I != NumInputs; ++I) { 3380 // If requested, drop call arguments that need to be dropped. 3381 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 3382 if (ArgChanged) 3383 *ArgChanged = true; 3384 3385 break; 3386 } 3387 3388 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 3389 Expr *Pattern = Expansion->getPattern(); 3390 3391 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3392 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3393 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3394 3395 // Determine whether the set of unexpanded parameter packs can and should 3396 // be expanded. 3397 bool Expand = true; 3398 bool RetainExpansion = false; 3399 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 3400 Optional<unsigned> NumExpansions = OrigNumExpansions; 3401 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 3402 Pattern->getSourceRange(), 3403 Unexpanded, 3404 Expand, RetainExpansion, 3405 NumExpansions)) 3406 return true; 3407 3408 if (!Expand) { 3409 // The transform has determined that we should perform a simple 3410 // transformation on the pack expansion, producing another pack 3411 // expansion. 3412 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3413 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 3414 if (OutPattern.isInvalid()) 3415 return true; 3416 3417 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 3418 Expansion->getEllipsisLoc(), 3419 NumExpansions); 3420 if (Out.isInvalid()) 3421 return true; 3422 3423 if (ArgChanged) 3424 *ArgChanged = true; 3425 Outputs.push_back(Out.get()); 3426 continue; 3427 } 3428 3429 // Record right away that the argument was changed. This needs 3430 // to happen even if the array expands to nothing. 3431 if (ArgChanged) *ArgChanged = true; 3432 3433 // The transform has determined that we should perform an elementwise 3434 // expansion of the pattern. Do so. 3435 for (unsigned I = 0; I != *NumExpansions; ++I) { 3436 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3437 ExprResult Out = getDerived().TransformExpr(Pattern); 3438 if (Out.isInvalid()) 3439 return true; 3440 3441 if (Out.get()->containsUnexpandedParameterPack()) { 3442 Out = getDerived().RebuildPackExpansion( 3443 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3444 if (Out.isInvalid()) 3445 return true; 3446 } 3447 3448 Outputs.push_back(Out.get()); 3449 } 3450 3451 // If we're supposed to retain a pack expansion, do so by temporarily 3452 // forgetting the partially-substituted parameter pack. 3453 if (RetainExpansion) { 3454 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3455 3456 ExprResult Out = getDerived().TransformExpr(Pattern); 3457 if (Out.isInvalid()) 3458 return true; 3459 3460 Out = getDerived().RebuildPackExpansion( 3461 Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions); 3462 if (Out.isInvalid()) 3463 return true; 3464 3465 Outputs.push_back(Out.get()); 3466 } 3467 3468 continue; 3469 } 3470 3471 ExprResult Result = 3472 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 3473 : getDerived().TransformExpr(Inputs[I]); 3474 if (Result.isInvalid()) 3475 return true; 3476 3477 if (Result.get() != Inputs[I] && ArgChanged) 3478 *ArgChanged = true; 3479 3480 Outputs.push_back(Result.get()); 3481 } 3482 3483 return false; 3484 } 3485 3486 template <typename Derived> 3487 Sema::ConditionResult TreeTransform<Derived>::TransformCondition( 3488 SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) { 3489 if (Var) { 3490 VarDecl *ConditionVar = cast_or_null<VarDecl>( 3491 getDerived().TransformDefinition(Var->getLocation(), Var)); 3492 3493 if (!ConditionVar) 3494 return Sema::ConditionError(); 3495 3496 return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind); 3497 } 3498 3499 if (Expr) { 3500 ExprResult CondExpr = getDerived().TransformExpr(Expr); 3501 3502 if (CondExpr.isInvalid()) 3503 return Sema::ConditionError(); 3504 3505 return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind); 3506 } 3507 3508 return Sema::ConditionResult(); 3509 } 3510 3511 template<typename Derived> 3512 NestedNameSpecifierLoc 3513 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 3514 NestedNameSpecifierLoc NNS, 3515 QualType ObjectType, 3516 NamedDecl *FirstQualifierInScope) { 3517 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 3518 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 3519 Qualifier = Qualifier.getPrefix()) 3520 Qualifiers.push_back(Qualifier); 3521 3522 CXXScopeSpec SS; 3523 while (!Qualifiers.empty()) { 3524 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 3525 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 3526 3527 switch (QNNS->getKind()) { 3528 case NestedNameSpecifier::Identifier: { 3529 Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(), 3530 Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType); 3531 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false, 3532 SS, FirstQualifierInScope, false)) 3533 return NestedNameSpecifierLoc(); 3534 } 3535 break; 3536 3537 case NestedNameSpecifier::Namespace: { 3538 NamespaceDecl *NS 3539 = cast_or_null<NamespaceDecl>( 3540 getDerived().TransformDecl( 3541 Q.getLocalBeginLoc(), 3542 QNNS->getAsNamespace())); 3543 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 3544 break; 3545 } 3546 3547 case NestedNameSpecifier::NamespaceAlias: { 3548 NamespaceAliasDecl *Alias 3549 = cast_or_null<NamespaceAliasDecl>( 3550 getDerived().TransformDecl(Q.getLocalBeginLoc(), 3551 QNNS->getAsNamespaceAlias())); 3552 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 3553 Q.getLocalEndLoc()); 3554 break; 3555 } 3556 3557 case NestedNameSpecifier::Global: 3558 // There is no meaningful transformation that one could perform on the 3559 // global scope. 3560 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 3561 break; 3562 3563 case NestedNameSpecifier::Super: { 3564 CXXRecordDecl *RD = 3565 cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 3566 SourceLocation(), QNNS->getAsRecordDecl())); 3567 SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc()); 3568 break; 3569 } 3570 3571 case NestedNameSpecifier::TypeSpecWithTemplate: 3572 case NestedNameSpecifier::TypeSpec: { 3573 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 3574 FirstQualifierInScope, SS); 3575 3576 if (!TL) 3577 return NestedNameSpecifierLoc(); 3578 3579 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 3580 (SemaRef.getLangOpts().CPlusPlus11 && 3581 TL.getType()->isEnumeralType())) { 3582 assert(!TL.getType().hasLocalQualifiers() && 3583 "Can't get cv-qualifiers here"); 3584 if (TL.getType()->isEnumeralType()) 3585 SemaRef.Diag(TL.getBeginLoc(), 3586 diag::warn_cxx98_compat_enum_nested_name_spec); 3587 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 3588 Q.getLocalEndLoc()); 3589 break; 3590 } 3591 // If the nested-name-specifier is an invalid type def, don't emit an 3592 // error because a previous error should have already been emitted. 3593 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 3594 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 3595 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 3596 << TL.getType() << SS.getRange(); 3597 } 3598 return NestedNameSpecifierLoc(); 3599 } 3600 } 3601 3602 // The qualifier-in-scope and object type only apply to the leftmost entity. 3603 FirstQualifierInScope = nullptr; 3604 ObjectType = QualType(); 3605 } 3606 3607 // Don't rebuild the nested-name-specifier if we don't have to. 3608 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 3609 !getDerived().AlwaysRebuild()) 3610 return NNS; 3611 3612 // If we can re-use the source-location data from the original 3613 // nested-name-specifier, do so. 3614 if (SS.location_size() == NNS.getDataLength() && 3615 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 3616 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 3617 3618 // Allocate new nested-name-specifier location information. 3619 return SS.getWithLocInContext(SemaRef.Context); 3620 } 3621 3622 template<typename Derived> 3623 DeclarationNameInfo 3624 TreeTransform<Derived> 3625 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 3626 DeclarationName Name = NameInfo.getName(); 3627 if (!Name) 3628 return DeclarationNameInfo(); 3629 3630 switch (Name.getNameKind()) { 3631 case DeclarationName::Identifier: 3632 case DeclarationName::ObjCZeroArgSelector: 3633 case DeclarationName::ObjCOneArgSelector: 3634 case DeclarationName::ObjCMultiArgSelector: 3635 case DeclarationName::CXXOperatorName: 3636 case DeclarationName::CXXLiteralOperatorName: 3637 case DeclarationName::CXXUsingDirective: 3638 return NameInfo; 3639 3640 case DeclarationName::CXXDeductionGuideName: { 3641 TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate(); 3642 TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>( 3643 getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate)); 3644 if (!NewTemplate) 3645 return DeclarationNameInfo(); 3646 3647 DeclarationNameInfo NewNameInfo(NameInfo); 3648 NewNameInfo.setName( 3649 SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate)); 3650 return NewNameInfo; 3651 } 3652 3653 case DeclarationName::CXXConstructorName: 3654 case DeclarationName::CXXDestructorName: 3655 case DeclarationName::CXXConversionFunctionName: { 3656 TypeSourceInfo *NewTInfo; 3657 CanQualType NewCanTy; 3658 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 3659 NewTInfo = getDerived().TransformType(OldTInfo); 3660 if (!NewTInfo) 3661 return DeclarationNameInfo(); 3662 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 3663 } 3664 else { 3665 NewTInfo = nullptr; 3666 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 3667 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 3668 if (NewT.isNull()) 3669 return DeclarationNameInfo(); 3670 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3671 } 3672 3673 DeclarationName NewName 3674 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3675 NewCanTy); 3676 DeclarationNameInfo NewNameInfo(NameInfo); 3677 NewNameInfo.setName(NewName); 3678 NewNameInfo.setNamedTypeInfo(NewTInfo); 3679 return NewNameInfo; 3680 } 3681 } 3682 3683 llvm_unreachable("Unknown name kind."); 3684 } 3685 3686 template<typename Derived> 3687 TemplateName 3688 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3689 TemplateName Name, 3690 SourceLocation NameLoc, 3691 QualType ObjectType, 3692 NamedDecl *FirstQualifierInScope, 3693 bool AllowInjectedClassName) { 3694 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3695 TemplateDecl *Template = QTN->getTemplateDecl(); 3696 assert(Template && "qualified template name must refer to a template"); 3697 3698 TemplateDecl *TransTemplate 3699 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3700 Template)); 3701 if (!TransTemplate) 3702 return TemplateName(); 3703 3704 if (!getDerived().AlwaysRebuild() && 3705 SS.getScopeRep() == QTN->getQualifier() && 3706 TransTemplate == Template) 3707 return Name; 3708 3709 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3710 TransTemplate); 3711 } 3712 3713 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3714 if (SS.getScopeRep()) { 3715 // These apply to the scope specifier, not the template. 3716 ObjectType = QualType(); 3717 FirstQualifierInScope = nullptr; 3718 } 3719 3720 if (!getDerived().AlwaysRebuild() && 3721 SS.getScopeRep() == DTN->getQualifier() && 3722 ObjectType.isNull()) 3723 return Name; 3724 3725 if (DTN->isIdentifier()) { 3726 return getDerived().RebuildTemplateName(SS, 3727 *DTN->getIdentifier(), 3728 NameLoc, 3729 ObjectType, 3730 FirstQualifierInScope, 3731 AllowInjectedClassName); 3732 } 3733 3734 return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc, 3735 ObjectType, AllowInjectedClassName); 3736 } 3737 3738 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3739 TemplateDecl *TransTemplate 3740 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3741 Template)); 3742 if (!TransTemplate) 3743 return TemplateName(); 3744 3745 if (!getDerived().AlwaysRebuild() && 3746 TransTemplate == Template) 3747 return Name; 3748 3749 return TemplateName(TransTemplate); 3750 } 3751 3752 if (SubstTemplateTemplateParmPackStorage *SubstPack 3753 = Name.getAsSubstTemplateTemplateParmPack()) { 3754 TemplateTemplateParmDecl *TransParam 3755 = cast_or_null<TemplateTemplateParmDecl>( 3756 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3757 if (!TransParam) 3758 return TemplateName(); 3759 3760 if (!getDerived().AlwaysRebuild() && 3761 TransParam == SubstPack->getParameterPack()) 3762 return Name; 3763 3764 return getDerived().RebuildTemplateName(TransParam, 3765 SubstPack->getArgumentPack()); 3766 } 3767 3768 // These should be getting filtered out before they reach the AST. 3769 llvm_unreachable("overloaded function decl survived to here"); 3770 } 3771 3772 template<typename Derived> 3773 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3774 const TemplateArgument &Arg, 3775 TemplateArgumentLoc &Output) { 3776 SourceLocation Loc = getDerived().getBaseLocation(); 3777 switch (Arg.getKind()) { 3778 case TemplateArgument::Null: 3779 llvm_unreachable("null template argument in TreeTransform"); 3780 break; 3781 3782 case TemplateArgument::Type: 3783 Output = TemplateArgumentLoc(Arg, 3784 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3785 3786 break; 3787 3788 case TemplateArgument::Template: 3789 case TemplateArgument::TemplateExpansion: { 3790 NestedNameSpecifierLocBuilder Builder; 3791 TemplateName Template = Arg.getAsTemplateOrTemplatePattern(); 3792 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3793 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3794 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3795 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3796 3797 if (Arg.getKind() == TemplateArgument::Template) 3798 Output = TemplateArgumentLoc(Arg, 3799 Builder.getWithLocInContext(SemaRef.Context), 3800 Loc); 3801 else 3802 Output = TemplateArgumentLoc(Arg, 3803 Builder.getWithLocInContext(SemaRef.Context), 3804 Loc, Loc); 3805 3806 break; 3807 } 3808 3809 case TemplateArgument::Expression: 3810 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3811 break; 3812 3813 case TemplateArgument::Declaration: 3814 case TemplateArgument::Integral: 3815 case TemplateArgument::Pack: 3816 case TemplateArgument::NullPtr: 3817 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3818 break; 3819 } 3820 } 3821 3822 template<typename Derived> 3823 bool TreeTransform<Derived>::TransformTemplateArgument( 3824 const TemplateArgumentLoc &Input, 3825 TemplateArgumentLoc &Output, bool Uneval) { 3826 const TemplateArgument &Arg = Input.getArgument(); 3827 switch (Arg.getKind()) { 3828 case TemplateArgument::Null: 3829 case TemplateArgument::Integral: 3830 case TemplateArgument::Pack: 3831 case TemplateArgument::Declaration: 3832 case TemplateArgument::NullPtr: 3833 llvm_unreachable("Unexpected TemplateArgument"); 3834 3835 case TemplateArgument::Type: { 3836 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3837 if (!DI) 3838 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3839 3840 DI = getDerived().TransformType(DI); 3841 if (!DI) return true; 3842 3843 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3844 return false; 3845 } 3846 3847 case TemplateArgument::Template: { 3848 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3849 if (QualifierLoc) { 3850 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3851 if (!QualifierLoc) 3852 return true; 3853 } 3854 3855 CXXScopeSpec SS; 3856 SS.Adopt(QualifierLoc); 3857 TemplateName Template 3858 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3859 Input.getTemplateNameLoc()); 3860 if (Template.isNull()) 3861 return true; 3862 3863 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3864 Input.getTemplateNameLoc()); 3865 return false; 3866 } 3867 3868 case TemplateArgument::TemplateExpansion: 3869 llvm_unreachable("Caller should expand pack expansions"); 3870 3871 case TemplateArgument::Expression: { 3872 // Template argument expressions are constant expressions. 3873 EnterExpressionEvaluationContext Unevaluated( 3874 getSema(), Uneval 3875 ? Sema::ExpressionEvaluationContext::Unevaluated 3876 : Sema::ExpressionEvaluationContext::ConstantEvaluated); 3877 3878 Expr *InputExpr = Input.getSourceExpression(); 3879 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3880 3881 ExprResult E = getDerived().TransformExpr(InputExpr); 3882 E = SemaRef.ActOnConstantExpression(E); 3883 if (E.isInvalid()) return true; 3884 Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get()); 3885 return false; 3886 } 3887 } 3888 3889 // Work around bogus GCC warning 3890 return true; 3891 } 3892 3893 /// \brief Iterator adaptor that invents template argument location information 3894 /// for each of the template arguments in its underlying iterator. 3895 template<typename Derived, typename InputIterator> 3896 class TemplateArgumentLocInventIterator { 3897 TreeTransform<Derived> &Self; 3898 InputIterator Iter; 3899 3900 public: 3901 typedef TemplateArgumentLoc value_type; 3902 typedef TemplateArgumentLoc reference; 3903 typedef typename std::iterator_traits<InputIterator>::difference_type 3904 difference_type; 3905 typedef std::input_iterator_tag iterator_category; 3906 3907 class pointer { 3908 TemplateArgumentLoc Arg; 3909 3910 public: 3911 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3912 3913 const TemplateArgumentLoc *operator->() const { return &Arg; } 3914 }; 3915 3916 TemplateArgumentLocInventIterator() { } 3917 3918 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3919 InputIterator Iter) 3920 : Self(Self), Iter(Iter) { } 3921 3922 TemplateArgumentLocInventIterator &operator++() { 3923 ++Iter; 3924 return *this; 3925 } 3926 3927 TemplateArgumentLocInventIterator operator++(int) { 3928 TemplateArgumentLocInventIterator Old(*this); 3929 ++(*this); 3930 return Old; 3931 } 3932 3933 reference operator*() const { 3934 TemplateArgumentLoc Result; 3935 Self.InventTemplateArgumentLoc(*Iter, Result); 3936 return Result; 3937 } 3938 3939 pointer operator->() const { return pointer(**this); } 3940 3941 friend bool operator==(const TemplateArgumentLocInventIterator &X, 3942 const TemplateArgumentLocInventIterator &Y) { 3943 return X.Iter == Y.Iter; 3944 } 3945 3946 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 3947 const TemplateArgumentLocInventIterator &Y) { 3948 return X.Iter != Y.Iter; 3949 } 3950 }; 3951 3952 template<typename Derived> 3953 template<typename InputIterator> 3954 bool TreeTransform<Derived>::TransformTemplateArguments( 3955 InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs, 3956 bool Uneval) { 3957 for (; First != Last; ++First) { 3958 TemplateArgumentLoc Out; 3959 TemplateArgumentLoc In = *First; 3960 3961 if (In.getArgument().getKind() == TemplateArgument::Pack) { 3962 // Unpack argument packs, which we translate them into separate 3963 // arguments. 3964 // FIXME: We could do much better if we could guarantee that the 3965 // TemplateArgumentLocInfo for the pack expansion would be usable for 3966 // all of the template arguments in the argument pack. 3967 typedef TemplateArgumentLocInventIterator<Derived, 3968 TemplateArgument::pack_iterator> 3969 PackLocIterator; 3970 if (TransformTemplateArguments(PackLocIterator(*this, 3971 In.getArgument().pack_begin()), 3972 PackLocIterator(*this, 3973 In.getArgument().pack_end()), 3974 Outputs, Uneval)) 3975 return true; 3976 3977 continue; 3978 } 3979 3980 if (In.getArgument().isPackExpansion()) { 3981 // We have a pack expansion, for which we will be substituting into 3982 // the pattern. 3983 SourceLocation Ellipsis; 3984 Optional<unsigned> OrigNumExpansions; 3985 TemplateArgumentLoc Pattern 3986 = getSema().getTemplateArgumentPackExpansionPattern( 3987 In, Ellipsis, OrigNumExpansions); 3988 3989 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3990 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3991 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3992 3993 // Determine whether the set of unexpanded parameter packs can and should 3994 // be expanded. 3995 bool Expand = true; 3996 bool RetainExpansion = false; 3997 Optional<unsigned> NumExpansions = OrigNumExpansions; 3998 if (getDerived().TryExpandParameterPacks(Ellipsis, 3999 Pattern.getSourceRange(), 4000 Unexpanded, 4001 Expand, 4002 RetainExpansion, 4003 NumExpansions)) 4004 return true; 4005 4006 if (!Expand) { 4007 // The transform has determined that we should perform a simple 4008 // transformation on the pack expansion, producing another pack 4009 // expansion. 4010 TemplateArgumentLoc OutPattern; 4011 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4012 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval)) 4013 return true; 4014 4015 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 4016 NumExpansions); 4017 if (Out.getArgument().isNull()) 4018 return true; 4019 4020 Outputs.addArgument(Out); 4021 continue; 4022 } 4023 4024 // The transform has determined that we should perform an elementwise 4025 // expansion of the pattern. Do so. 4026 for (unsigned I = 0; I != *NumExpansions; ++I) { 4027 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4028 4029 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4030 return true; 4031 4032 if (Out.getArgument().containsUnexpandedParameterPack()) { 4033 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4034 OrigNumExpansions); 4035 if (Out.getArgument().isNull()) 4036 return true; 4037 } 4038 4039 Outputs.addArgument(Out); 4040 } 4041 4042 // If we're supposed to retain a pack expansion, do so by temporarily 4043 // forgetting the partially-substituted parameter pack. 4044 if (RetainExpansion) { 4045 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4046 4047 if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval)) 4048 return true; 4049 4050 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 4051 OrigNumExpansions); 4052 if (Out.getArgument().isNull()) 4053 return true; 4054 4055 Outputs.addArgument(Out); 4056 } 4057 4058 continue; 4059 } 4060 4061 // The simple case: 4062 if (getDerived().TransformTemplateArgument(In, Out, Uneval)) 4063 return true; 4064 4065 Outputs.addArgument(Out); 4066 } 4067 4068 return false; 4069 4070 } 4071 4072 //===----------------------------------------------------------------------===// 4073 // Type transformation 4074 //===----------------------------------------------------------------------===// 4075 4076 template<typename Derived> 4077 QualType TreeTransform<Derived>::TransformType(QualType T) { 4078 if (getDerived().AlreadyTransformed(T)) 4079 return T; 4080 4081 // Temporary workaround. All of these transformations should 4082 // eventually turn into transformations on TypeLocs. 4083 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4084 getDerived().getBaseLocation()); 4085 4086 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 4087 4088 if (!NewDI) 4089 return QualType(); 4090 4091 return NewDI->getType(); 4092 } 4093 4094 template<typename Derived> 4095 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 4096 // Refine the base location to the type's location. 4097 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4098 getDerived().getBaseEntity()); 4099 if (getDerived().AlreadyTransformed(DI->getType())) 4100 return DI; 4101 4102 TypeLocBuilder TLB; 4103 4104 TypeLoc TL = DI->getTypeLoc(); 4105 TLB.reserve(TL.getFullDataSize()); 4106 4107 QualType Result = getDerived().TransformType(TLB, TL); 4108 if (Result.isNull()) 4109 return nullptr; 4110 4111 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4112 } 4113 4114 template<typename Derived> 4115 QualType 4116 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 4117 switch (T.getTypeLocClass()) { 4118 #define ABSTRACT_TYPELOC(CLASS, PARENT) 4119 #define TYPELOC(CLASS, PARENT) \ 4120 case TypeLoc::CLASS: \ 4121 return getDerived().Transform##CLASS##Type(TLB, \ 4122 T.castAs<CLASS##TypeLoc>()); 4123 #include "clang/AST/TypeLocNodes.def" 4124 } 4125 4126 llvm_unreachable("unhandled type loc!"); 4127 } 4128 4129 template<typename Derived> 4130 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) { 4131 if (!isa<DependentNameType>(T)) 4132 return TransformType(T); 4133 4134 if (getDerived().AlreadyTransformed(T)) 4135 return T; 4136 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 4137 getDerived().getBaseLocation()); 4138 TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI); 4139 return NewDI ? NewDI->getType() : QualType(); 4140 } 4141 4142 template<typename Derived> 4143 TypeSourceInfo * 4144 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) { 4145 if (!isa<DependentNameType>(DI->getType())) 4146 return TransformType(DI); 4147 4148 // Refine the base location to the type's location. 4149 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 4150 getDerived().getBaseEntity()); 4151 if (getDerived().AlreadyTransformed(DI->getType())) 4152 return DI; 4153 4154 TypeLocBuilder TLB; 4155 4156 TypeLoc TL = DI->getTypeLoc(); 4157 TLB.reserve(TL.getFullDataSize()); 4158 4159 Qualifiers Quals; 4160 auto QTL = TL.getAs<QualifiedTypeLoc>(); 4161 if (QTL) 4162 TL = QTL.getUnqualifiedLoc(); 4163 4164 auto DNTL = TL.castAs<DependentNameTypeLoc>(); 4165 4166 QualType Result = getDerived().TransformDependentNameType( 4167 TLB, DNTL, /*DeducedTSTContext*/true); 4168 if (Result.isNull()) 4169 return nullptr; 4170 4171 if (QTL) { 4172 Result = getDerived().RebuildQualifiedType( 4173 Result, QTL.getBeginLoc(), QTL.getType().getLocalQualifiers()); 4174 TLB.TypeWasModifiedSafely(Result); 4175 } 4176 4177 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4178 } 4179 4180 template<typename Derived> 4181 QualType 4182 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 4183 QualifiedTypeLoc T) { 4184 Qualifiers Quals = T.getType().getLocalQualifiers(); 4185 4186 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 4187 if (Result.isNull()) 4188 return QualType(); 4189 4190 Result = getDerived().RebuildQualifiedType(Result, T.getBeginLoc(), Quals); 4191 4192 // RebuildQualifiedType might have updated the type, but not in a way 4193 // that invalidates the TypeLoc. (There's no location information for 4194 // qualifiers.) 4195 TLB.TypeWasModifiedSafely(Result); 4196 4197 return Result; 4198 } 4199 4200 template<typename Derived> 4201 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T, 4202 SourceLocation Loc, 4203 Qualifiers Quals) { 4204 // C++ [dcl.fct]p7: 4205 // [When] adding cv-qualifications on top of the function type [...] the 4206 // cv-qualifiers are ignored. 4207 // C++ [dcl.ref]p1: 4208 // when the cv-qualifiers are introduced through the use of a typedef-name 4209 // or decltype-specifier [...] the cv-qualifiers are ignored. 4210 // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be 4211 // applied to a reference type. 4212 // FIXME: This removes all qualifiers, not just cv-qualifiers! 4213 if (T->isFunctionType() || T->isReferenceType()) 4214 return T; 4215 4216 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 4217 // resulting type. 4218 if (Quals.hasObjCLifetime()) { 4219 if (!T->isObjCLifetimeType() && !T->isDependentType()) 4220 Quals.removeObjCLifetime(); 4221 else if (T.getObjCLifetime()) { 4222 // Objective-C ARC: 4223 // A lifetime qualifier applied to a substituted template parameter 4224 // overrides the lifetime qualifier from the template argument. 4225 const AutoType *AutoTy; 4226 if (const SubstTemplateTypeParmType *SubstTypeParam 4227 = dyn_cast<SubstTemplateTypeParmType>(T)) { 4228 QualType Replacement = SubstTypeParam->getReplacementType(); 4229 Qualifiers Qs = Replacement.getQualifiers(); 4230 Qs.removeObjCLifetime(); 4231 Replacement = SemaRef.Context.getQualifiedType( 4232 Replacement.getUnqualifiedType(), Qs); 4233 T = SemaRef.Context.getSubstTemplateTypeParmType( 4234 SubstTypeParam->getReplacedParameter(), Replacement); 4235 } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) { 4236 // 'auto' types behave the same way as template parameters. 4237 QualType Deduced = AutoTy->getDeducedType(); 4238 Qualifiers Qs = Deduced.getQualifiers(); 4239 Qs.removeObjCLifetime(); 4240 Deduced = 4241 SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs); 4242 T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(), 4243 AutoTy->isDependentType()); 4244 } else { 4245 // Otherwise, complain about the addition of a qualifier to an 4246 // already-qualified type. 4247 // FIXME: Why is this check not in Sema::BuildQualifiedType? 4248 SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T; 4249 Quals.removeObjCLifetime(); 4250 } 4251 } 4252 } 4253 4254 return SemaRef.BuildQualifiedType(T, Loc, Quals); 4255 } 4256 4257 template<typename Derived> 4258 TypeLoc 4259 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 4260 QualType ObjectType, 4261 NamedDecl *UnqualLookup, 4262 CXXScopeSpec &SS) { 4263 if (getDerived().AlreadyTransformed(TL.getType())) 4264 return TL; 4265 4266 TypeSourceInfo *TSI = 4267 TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS); 4268 if (TSI) 4269 return TSI->getTypeLoc(); 4270 return TypeLoc(); 4271 } 4272 4273 template<typename Derived> 4274 TypeSourceInfo * 4275 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 4276 QualType ObjectType, 4277 NamedDecl *UnqualLookup, 4278 CXXScopeSpec &SS) { 4279 if (getDerived().AlreadyTransformed(TSInfo->getType())) 4280 return TSInfo; 4281 4282 return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType, 4283 UnqualLookup, SS); 4284 } 4285 4286 template <typename Derived> 4287 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope( 4288 TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup, 4289 CXXScopeSpec &SS) { 4290 QualType T = TL.getType(); 4291 assert(!getDerived().AlreadyTransformed(T)); 4292 4293 TypeLocBuilder TLB; 4294 QualType Result; 4295 4296 if (isa<TemplateSpecializationType>(T)) { 4297 TemplateSpecializationTypeLoc SpecTL = 4298 TL.castAs<TemplateSpecializationTypeLoc>(); 4299 4300 TemplateName Template = getDerived().TransformTemplateName( 4301 SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(), 4302 ObjectType, UnqualLookup, /*AllowInjectedClassName*/true); 4303 if (Template.isNull()) 4304 return nullptr; 4305 4306 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 4307 Template); 4308 } else if (isa<DependentTemplateSpecializationType>(T)) { 4309 DependentTemplateSpecializationTypeLoc SpecTL = 4310 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 4311 4312 TemplateName Template 4313 = getDerived().RebuildTemplateName(SS, 4314 *SpecTL.getTypePtr()->getIdentifier(), 4315 SpecTL.getTemplateNameLoc(), 4316 ObjectType, UnqualLookup, 4317 /*AllowInjectedClassName*/true); 4318 if (Template.isNull()) 4319 return nullptr; 4320 4321 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 4322 SpecTL, 4323 Template, 4324 SS); 4325 } else { 4326 // Nothing special needs to be done for these. 4327 Result = getDerived().TransformType(TLB, TL); 4328 } 4329 4330 if (Result.isNull()) 4331 return nullptr; 4332 4333 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 4334 } 4335 4336 template <class TyLoc> static inline 4337 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 4338 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 4339 NewT.setNameLoc(T.getNameLoc()); 4340 return T.getType(); 4341 } 4342 4343 template<typename Derived> 4344 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 4345 BuiltinTypeLoc T) { 4346 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 4347 NewT.setBuiltinLoc(T.getBuiltinLoc()); 4348 if (T.needsExtraLocalData()) 4349 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 4350 return T.getType(); 4351 } 4352 4353 template<typename Derived> 4354 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 4355 ComplexTypeLoc T) { 4356 // FIXME: recurse? 4357 return TransformTypeSpecType(TLB, T); 4358 } 4359 4360 template <typename Derived> 4361 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB, 4362 AdjustedTypeLoc TL) { 4363 // Adjustments applied during transformation are handled elsewhere. 4364 return getDerived().TransformType(TLB, TL.getOriginalLoc()); 4365 } 4366 4367 template<typename Derived> 4368 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 4369 DecayedTypeLoc TL) { 4370 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 4371 if (OriginalType.isNull()) 4372 return QualType(); 4373 4374 QualType Result = TL.getType(); 4375 if (getDerived().AlwaysRebuild() || 4376 OriginalType != TL.getOriginalLoc().getType()) 4377 Result = SemaRef.Context.getDecayedType(OriginalType); 4378 TLB.push<DecayedTypeLoc>(Result); 4379 // Nothing to set for DecayedTypeLoc. 4380 return Result; 4381 } 4382 4383 template<typename Derived> 4384 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 4385 PointerTypeLoc TL) { 4386 QualType PointeeType 4387 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4388 if (PointeeType.isNull()) 4389 return QualType(); 4390 4391 QualType Result = TL.getType(); 4392 if (PointeeType->getAs<ObjCObjectType>()) { 4393 // A dependent pointer type 'T *' has is being transformed such 4394 // that an Objective-C class type is being replaced for 'T'. The 4395 // resulting pointer type is an ObjCObjectPointerType, not a 4396 // PointerType. 4397 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 4398 4399 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 4400 NewT.setStarLoc(TL.getStarLoc()); 4401 return Result; 4402 } 4403 4404 if (getDerived().AlwaysRebuild() || 4405 PointeeType != TL.getPointeeLoc().getType()) { 4406 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 4407 if (Result.isNull()) 4408 return QualType(); 4409 } 4410 4411 // Objective-C ARC can add lifetime qualifiers to the type that we're 4412 // pointing to. 4413 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 4414 4415 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 4416 NewT.setSigilLoc(TL.getSigilLoc()); 4417 return Result; 4418 } 4419 4420 template<typename Derived> 4421 QualType 4422 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 4423 BlockPointerTypeLoc TL) { 4424 QualType PointeeType 4425 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4426 if (PointeeType.isNull()) 4427 return QualType(); 4428 4429 QualType Result = TL.getType(); 4430 if (getDerived().AlwaysRebuild() || 4431 PointeeType != TL.getPointeeLoc().getType()) { 4432 Result = getDerived().RebuildBlockPointerType(PointeeType, 4433 TL.getSigilLoc()); 4434 if (Result.isNull()) 4435 return QualType(); 4436 } 4437 4438 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 4439 NewT.setSigilLoc(TL.getSigilLoc()); 4440 return Result; 4441 } 4442 4443 /// Transforms a reference type. Note that somewhat paradoxically we 4444 /// don't care whether the type itself is an l-value type or an r-value 4445 /// type; we only care if the type was *written* as an l-value type 4446 /// or an r-value type. 4447 template<typename Derived> 4448 QualType 4449 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 4450 ReferenceTypeLoc TL) { 4451 const ReferenceType *T = TL.getTypePtr(); 4452 4453 // Note that this works with the pointee-as-written. 4454 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4455 if (PointeeType.isNull()) 4456 return QualType(); 4457 4458 QualType Result = TL.getType(); 4459 if (getDerived().AlwaysRebuild() || 4460 PointeeType != T->getPointeeTypeAsWritten()) { 4461 Result = getDerived().RebuildReferenceType(PointeeType, 4462 T->isSpelledAsLValue(), 4463 TL.getSigilLoc()); 4464 if (Result.isNull()) 4465 return QualType(); 4466 } 4467 4468 // Objective-C ARC can add lifetime qualifiers to the type that we're 4469 // referring to. 4470 TLB.TypeWasModifiedSafely( 4471 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 4472 4473 // r-value references can be rebuilt as l-value references. 4474 ReferenceTypeLoc NewTL; 4475 if (isa<LValueReferenceType>(Result)) 4476 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 4477 else 4478 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 4479 NewTL.setSigilLoc(TL.getSigilLoc()); 4480 4481 return Result; 4482 } 4483 4484 template<typename Derived> 4485 QualType 4486 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 4487 LValueReferenceTypeLoc TL) { 4488 return TransformReferenceType(TLB, TL); 4489 } 4490 4491 template<typename Derived> 4492 QualType 4493 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 4494 RValueReferenceTypeLoc TL) { 4495 return TransformReferenceType(TLB, TL); 4496 } 4497 4498 template<typename Derived> 4499 QualType 4500 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 4501 MemberPointerTypeLoc TL) { 4502 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 4503 if (PointeeType.isNull()) 4504 return QualType(); 4505 4506 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 4507 TypeSourceInfo *NewClsTInfo = nullptr; 4508 if (OldClsTInfo) { 4509 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 4510 if (!NewClsTInfo) 4511 return QualType(); 4512 } 4513 4514 const MemberPointerType *T = TL.getTypePtr(); 4515 QualType OldClsType = QualType(T->getClass(), 0); 4516 QualType NewClsType; 4517 if (NewClsTInfo) 4518 NewClsType = NewClsTInfo->getType(); 4519 else { 4520 NewClsType = getDerived().TransformType(OldClsType); 4521 if (NewClsType.isNull()) 4522 return QualType(); 4523 } 4524 4525 QualType Result = TL.getType(); 4526 if (getDerived().AlwaysRebuild() || 4527 PointeeType != T->getPointeeType() || 4528 NewClsType != OldClsType) { 4529 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 4530 TL.getStarLoc()); 4531 if (Result.isNull()) 4532 return QualType(); 4533 } 4534 4535 // If we had to adjust the pointee type when building a member pointer, make 4536 // sure to push TypeLoc info for it. 4537 const MemberPointerType *MPT = Result->getAs<MemberPointerType>(); 4538 if (MPT && PointeeType != MPT->getPointeeType()) { 4539 assert(isa<AdjustedType>(MPT->getPointeeType())); 4540 TLB.push<AdjustedTypeLoc>(MPT->getPointeeType()); 4541 } 4542 4543 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 4544 NewTL.setSigilLoc(TL.getSigilLoc()); 4545 NewTL.setClassTInfo(NewClsTInfo); 4546 4547 return Result; 4548 } 4549 4550 template<typename Derived> 4551 QualType 4552 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 4553 ConstantArrayTypeLoc TL) { 4554 const ConstantArrayType *T = TL.getTypePtr(); 4555 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4556 if (ElementType.isNull()) 4557 return QualType(); 4558 4559 QualType Result = TL.getType(); 4560 if (getDerived().AlwaysRebuild() || 4561 ElementType != T->getElementType()) { 4562 Result = getDerived().RebuildConstantArrayType(ElementType, 4563 T->getSizeModifier(), 4564 T->getSize(), 4565 T->getIndexTypeCVRQualifiers(), 4566 TL.getBracketsRange()); 4567 if (Result.isNull()) 4568 return QualType(); 4569 } 4570 4571 // We might have either a ConstantArrayType or a VariableArrayType now: 4572 // a ConstantArrayType is allowed to have an element type which is a 4573 // VariableArrayType if the type is dependent. Fortunately, all array 4574 // types have the same location layout. 4575 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4576 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4577 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4578 4579 Expr *Size = TL.getSizeExpr(); 4580 if (Size) { 4581 EnterExpressionEvaluationContext Unevaluated( 4582 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4583 Size = getDerived().TransformExpr(Size).template getAs<Expr>(); 4584 Size = SemaRef.ActOnConstantExpression(Size).get(); 4585 } 4586 NewTL.setSizeExpr(Size); 4587 4588 return Result; 4589 } 4590 4591 template<typename Derived> 4592 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 4593 TypeLocBuilder &TLB, 4594 IncompleteArrayTypeLoc TL) { 4595 const IncompleteArrayType *T = TL.getTypePtr(); 4596 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4597 if (ElementType.isNull()) 4598 return QualType(); 4599 4600 QualType Result = TL.getType(); 4601 if (getDerived().AlwaysRebuild() || 4602 ElementType != T->getElementType()) { 4603 Result = getDerived().RebuildIncompleteArrayType(ElementType, 4604 T->getSizeModifier(), 4605 T->getIndexTypeCVRQualifiers(), 4606 TL.getBracketsRange()); 4607 if (Result.isNull()) 4608 return QualType(); 4609 } 4610 4611 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 4612 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4613 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4614 NewTL.setSizeExpr(nullptr); 4615 4616 return Result; 4617 } 4618 4619 template<typename Derived> 4620 QualType 4621 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 4622 VariableArrayTypeLoc TL) { 4623 const VariableArrayType *T = TL.getTypePtr(); 4624 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4625 if (ElementType.isNull()) 4626 return QualType(); 4627 4628 ExprResult SizeResult; 4629 { 4630 EnterExpressionEvaluationContext Context( 4631 SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 4632 SizeResult = getDerived().TransformExpr(T->getSizeExpr()); 4633 } 4634 if (SizeResult.isInvalid()) 4635 return QualType(); 4636 SizeResult = SemaRef.ActOnFinishFullExpr(SizeResult.get()); 4637 if (SizeResult.isInvalid()) 4638 return QualType(); 4639 4640 Expr *Size = SizeResult.get(); 4641 4642 QualType Result = TL.getType(); 4643 if (getDerived().AlwaysRebuild() || 4644 ElementType != T->getElementType() || 4645 Size != T->getSizeExpr()) { 4646 Result = getDerived().RebuildVariableArrayType(ElementType, 4647 T->getSizeModifier(), 4648 Size, 4649 T->getIndexTypeCVRQualifiers(), 4650 TL.getBracketsRange()); 4651 if (Result.isNull()) 4652 return QualType(); 4653 } 4654 4655 // We might have constant size array now, but fortunately it has the same 4656 // location layout. 4657 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4658 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4659 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4660 NewTL.setSizeExpr(Size); 4661 4662 return Result; 4663 } 4664 4665 template<typename Derived> 4666 QualType 4667 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 4668 DependentSizedArrayTypeLoc TL) { 4669 const DependentSizedArrayType *T = TL.getTypePtr(); 4670 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 4671 if (ElementType.isNull()) 4672 return QualType(); 4673 4674 // Array bounds are constant expressions. 4675 EnterExpressionEvaluationContext Unevaluated( 4676 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4677 4678 // Prefer the expression from the TypeLoc; the other may have been uniqued. 4679 Expr *origSize = TL.getSizeExpr(); 4680 if (!origSize) origSize = T->getSizeExpr(); 4681 4682 ExprResult sizeResult 4683 = getDerived().TransformExpr(origSize); 4684 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 4685 if (sizeResult.isInvalid()) 4686 return QualType(); 4687 4688 Expr *size = sizeResult.get(); 4689 4690 QualType Result = TL.getType(); 4691 if (getDerived().AlwaysRebuild() || 4692 ElementType != T->getElementType() || 4693 size != origSize) { 4694 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 4695 T->getSizeModifier(), 4696 size, 4697 T->getIndexTypeCVRQualifiers(), 4698 TL.getBracketsRange()); 4699 if (Result.isNull()) 4700 return QualType(); 4701 } 4702 4703 // We might have any sort of array type now, but fortunately they 4704 // all have the same location layout. 4705 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 4706 NewTL.setLBracketLoc(TL.getLBracketLoc()); 4707 NewTL.setRBracketLoc(TL.getRBracketLoc()); 4708 NewTL.setSizeExpr(size); 4709 4710 return Result; 4711 } 4712 4713 template<typename Derived> 4714 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 4715 TypeLocBuilder &TLB, 4716 DependentSizedExtVectorTypeLoc TL) { 4717 const DependentSizedExtVectorType *T = TL.getTypePtr(); 4718 4719 // FIXME: ext vector locs should be nested 4720 QualType ElementType = getDerived().TransformType(T->getElementType()); 4721 if (ElementType.isNull()) 4722 return QualType(); 4723 4724 // Vector sizes are constant expressions. 4725 EnterExpressionEvaluationContext Unevaluated( 4726 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 4727 4728 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4729 Size = SemaRef.ActOnConstantExpression(Size); 4730 if (Size.isInvalid()) 4731 return QualType(); 4732 4733 QualType Result = TL.getType(); 4734 if (getDerived().AlwaysRebuild() || 4735 ElementType != T->getElementType() || 4736 Size.get() != T->getSizeExpr()) { 4737 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4738 Size.get(), 4739 T->getAttributeLoc()); 4740 if (Result.isNull()) 4741 return QualType(); 4742 } 4743 4744 // Result might be dependent or not. 4745 if (isa<DependentSizedExtVectorType>(Result)) { 4746 DependentSizedExtVectorTypeLoc NewTL 4747 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4748 NewTL.setNameLoc(TL.getNameLoc()); 4749 } else { 4750 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4751 NewTL.setNameLoc(TL.getNameLoc()); 4752 } 4753 4754 return Result; 4755 } 4756 4757 template<typename Derived> 4758 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4759 VectorTypeLoc TL) { 4760 const VectorType *T = TL.getTypePtr(); 4761 QualType ElementType = getDerived().TransformType(T->getElementType()); 4762 if (ElementType.isNull()) 4763 return QualType(); 4764 4765 QualType Result = TL.getType(); 4766 if (getDerived().AlwaysRebuild() || 4767 ElementType != T->getElementType()) { 4768 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4769 T->getVectorKind()); 4770 if (Result.isNull()) 4771 return QualType(); 4772 } 4773 4774 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4775 NewTL.setNameLoc(TL.getNameLoc()); 4776 4777 return Result; 4778 } 4779 4780 template<typename Derived> 4781 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4782 ExtVectorTypeLoc TL) { 4783 const VectorType *T = TL.getTypePtr(); 4784 QualType ElementType = getDerived().TransformType(T->getElementType()); 4785 if (ElementType.isNull()) 4786 return QualType(); 4787 4788 QualType Result = TL.getType(); 4789 if (getDerived().AlwaysRebuild() || 4790 ElementType != T->getElementType()) { 4791 Result = getDerived().RebuildExtVectorType(ElementType, 4792 T->getNumElements(), 4793 /*FIXME*/ SourceLocation()); 4794 if (Result.isNull()) 4795 return QualType(); 4796 } 4797 4798 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4799 NewTL.setNameLoc(TL.getNameLoc()); 4800 4801 return Result; 4802 } 4803 4804 template <typename Derived> 4805 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 4806 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 4807 bool ExpectParameterPack) { 4808 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 4809 TypeSourceInfo *NewDI = nullptr; 4810 4811 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 4812 // If we're substituting into a pack expansion type and we know the 4813 // length we want to expand to, just substitute for the pattern. 4814 TypeLoc OldTL = OldDI->getTypeLoc(); 4815 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 4816 4817 TypeLocBuilder TLB; 4818 TypeLoc NewTL = OldDI->getTypeLoc(); 4819 TLB.reserve(NewTL.getFullDataSize()); 4820 4821 QualType Result = getDerived().TransformType(TLB, 4822 OldExpansionTL.getPatternLoc()); 4823 if (Result.isNull()) 4824 return nullptr; 4825 4826 Result = RebuildPackExpansionType(Result, 4827 OldExpansionTL.getPatternLoc().getSourceRange(), 4828 OldExpansionTL.getEllipsisLoc(), 4829 NumExpansions); 4830 if (Result.isNull()) 4831 return nullptr; 4832 4833 PackExpansionTypeLoc NewExpansionTL 4834 = TLB.push<PackExpansionTypeLoc>(Result); 4835 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 4836 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 4837 } else 4838 NewDI = getDerived().TransformType(OldDI); 4839 if (!NewDI) 4840 return nullptr; 4841 4842 if (NewDI == OldDI && indexAdjustment == 0) 4843 return OldParm; 4844 4845 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 4846 OldParm->getDeclContext(), 4847 OldParm->getInnerLocStart(), 4848 OldParm->getLocation(), 4849 OldParm->getIdentifier(), 4850 NewDI->getType(), 4851 NewDI, 4852 OldParm->getStorageClass(), 4853 /* DefArg */ nullptr); 4854 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 4855 OldParm->getFunctionScopeIndex() + indexAdjustment); 4856 return newParm; 4857 } 4858 4859 template <typename Derived> 4860 bool TreeTransform<Derived>::TransformFunctionTypeParams( 4861 SourceLocation Loc, ArrayRef<ParmVarDecl *> Params, 4862 const QualType *ParamTypes, 4863 const FunctionProtoType::ExtParameterInfo *ParamInfos, 4864 SmallVectorImpl<QualType> &OutParamTypes, 4865 SmallVectorImpl<ParmVarDecl *> *PVars, 4866 Sema::ExtParameterInfoBuilder &PInfos) { 4867 int indexAdjustment = 0; 4868 4869 unsigned NumParams = Params.size(); 4870 for (unsigned i = 0; i != NumParams; ++i) { 4871 if (ParmVarDecl *OldParm = Params[i]) { 4872 assert(OldParm->getFunctionScopeIndex() == i); 4873 4874 Optional<unsigned> NumExpansions; 4875 ParmVarDecl *NewParm = nullptr; 4876 if (OldParm->isParameterPack()) { 4877 // We have a function parameter pack that may need to be expanded. 4878 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4879 4880 // Find the parameter packs that could be expanded. 4881 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 4882 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 4883 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 4884 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 4885 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 4886 4887 // Determine whether we should expand the parameter packs. 4888 bool ShouldExpand = false; 4889 bool RetainExpansion = false; 4890 Optional<unsigned> OrigNumExpansions = 4891 ExpansionTL.getTypePtr()->getNumExpansions(); 4892 NumExpansions = OrigNumExpansions; 4893 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 4894 Pattern.getSourceRange(), 4895 Unexpanded, 4896 ShouldExpand, 4897 RetainExpansion, 4898 NumExpansions)) { 4899 return true; 4900 } 4901 4902 if (ShouldExpand) { 4903 // Expand the function parameter pack into multiple, separate 4904 // parameters. 4905 getDerived().ExpandingFunctionParameterPack(OldParm); 4906 for (unsigned I = 0; I != *NumExpansions; ++I) { 4907 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4908 ParmVarDecl *NewParm 4909 = getDerived().TransformFunctionTypeParam(OldParm, 4910 indexAdjustment++, 4911 OrigNumExpansions, 4912 /*ExpectParameterPack=*/false); 4913 if (!NewParm) 4914 return true; 4915 4916 if (ParamInfos) 4917 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 4918 OutParamTypes.push_back(NewParm->getType()); 4919 if (PVars) 4920 PVars->push_back(NewParm); 4921 } 4922 4923 // If we're supposed to retain a pack expansion, do so by temporarily 4924 // forgetting the partially-substituted parameter pack. 4925 if (RetainExpansion) { 4926 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4927 ParmVarDecl *NewParm 4928 = getDerived().TransformFunctionTypeParam(OldParm, 4929 indexAdjustment++, 4930 OrigNumExpansions, 4931 /*ExpectParameterPack=*/false); 4932 if (!NewParm) 4933 return true; 4934 4935 if (ParamInfos) 4936 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 4937 OutParamTypes.push_back(NewParm->getType()); 4938 if (PVars) 4939 PVars->push_back(NewParm); 4940 } 4941 4942 // The next parameter should have the same adjustment as the 4943 // last thing we pushed, but we post-incremented indexAdjustment 4944 // on every push. Also, if we push nothing, the adjustment should 4945 // go down by one. 4946 indexAdjustment--; 4947 4948 // We're done with the pack expansion. 4949 continue; 4950 } 4951 4952 // We'll substitute the parameter now without expanding the pack 4953 // expansion. 4954 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4955 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 4956 indexAdjustment, 4957 NumExpansions, 4958 /*ExpectParameterPack=*/true); 4959 } else { 4960 NewParm = getDerived().TransformFunctionTypeParam( 4961 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 4962 } 4963 4964 if (!NewParm) 4965 return true; 4966 4967 if (ParamInfos) 4968 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 4969 OutParamTypes.push_back(NewParm->getType()); 4970 if (PVars) 4971 PVars->push_back(NewParm); 4972 continue; 4973 } 4974 4975 // Deal with the possibility that we don't have a parameter 4976 // declaration for this parameter. 4977 QualType OldType = ParamTypes[i]; 4978 bool IsPackExpansion = false; 4979 Optional<unsigned> NumExpansions; 4980 QualType NewType; 4981 if (const PackExpansionType *Expansion 4982 = dyn_cast<PackExpansionType>(OldType)) { 4983 // We have a function parameter pack that may need to be expanded. 4984 QualType Pattern = Expansion->getPattern(); 4985 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4986 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4987 4988 // Determine whether we should expand the parameter packs. 4989 bool ShouldExpand = false; 4990 bool RetainExpansion = false; 4991 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 4992 Unexpanded, 4993 ShouldExpand, 4994 RetainExpansion, 4995 NumExpansions)) { 4996 return true; 4997 } 4998 4999 if (ShouldExpand) { 5000 // Expand the function parameter pack into multiple, separate 5001 // parameters. 5002 for (unsigned I = 0; I != *NumExpansions; ++I) { 5003 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 5004 QualType NewType = getDerived().TransformType(Pattern); 5005 if (NewType.isNull()) 5006 return true; 5007 5008 if (NewType->containsUnexpandedParameterPack()) { 5009 NewType = 5010 getSema().getASTContext().getPackExpansionType(NewType, None); 5011 5012 if (NewType.isNull()) 5013 return true; 5014 } 5015 5016 if (ParamInfos) 5017 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5018 OutParamTypes.push_back(NewType); 5019 if (PVars) 5020 PVars->push_back(nullptr); 5021 } 5022 5023 // We're done with the pack expansion. 5024 continue; 5025 } 5026 5027 // If we're supposed to retain a pack expansion, do so by temporarily 5028 // forgetting the partially-substituted parameter pack. 5029 if (RetainExpansion) { 5030 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 5031 QualType NewType = getDerived().TransformType(Pattern); 5032 if (NewType.isNull()) 5033 return true; 5034 5035 if (ParamInfos) 5036 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5037 OutParamTypes.push_back(NewType); 5038 if (PVars) 5039 PVars->push_back(nullptr); 5040 } 5041 5042 // We'll substitute the parameter now without expanding the pack 5043 // expansion. 5044 OldType = Expansion->getPattern(); 5045 IsPackExpansion = true; 5046 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5047 NewType = getDerived().TransformType(OldType); 5048 } else { 5049 NewType = getDerived().TransformType(OldType); 5050 } 5051 5052 if (NewType.isNull()) 5053 return true; 5054 5055 if (IsPackExpansion) 5056 NewType = getSema().Context.getPackExpansionType(NewType, 5057 NumExpansions); 5058 5059 if (ParamInfos) 5060 PInfos.set(OutParamTypes.size(), ParamInfos[i]); 5061 OutParamTypes.push_back(NewType); 5062 if (PVars) 5063 PVars->push_back(nullptr); 5064 } 5065 5066 #ifndef NDEBUG 5067 if (PVars) { 5068 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 5069 if (ParmVarDecl *parm = (*PVars)[i]) 5070 assert(parm->getFunctionScopeIndex() == i); 5071 } 5072 #endif 5073 5074 return false; 5075 } 5076 5077 template<typename Derived> 5078 QualType 5079 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 5080 FunctionProtoTypeLoc TL) { 5081 SmallVector<QualType, 4> ExceptionStorage; 5082 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 5083 return getDerived().TransformFunctionProtoType( 5084 TLB, TL, nullptr, 0, 5085 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 5086 return This->TransformExceptionSpec(TL.getBeginLoc(), ESI, 5087 ExceptionStorage, Changed); 5088 }); 5089 } 5090 5091 template<typename Derived> template<typename Fn> 5092 QualType TreeTransform<Derived>::TransformFunctionProtoType( 5093 TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext, 5094 unsigned ThisTypeQuals, Fn TransformExceptionSpec) { 5095 5096 // Transform the parameters and return type. 5097 // 5098 // We are required to instantiate the params and return type in source order. 5099 // When the function has a trailing return type, we instantiate the 5100 // parameters before the return type, since the return type can then refer 5101 // to the parameters themselves (via decltype, sizeof, etc.). 5102 // 5103 SmallVector<QualType, 4> ParamTypes; 5104 SmallVector<ParmVarDecl*, 4> ParamDecls; 5105 Sema::ExtParameterInfoBuilder ExtParamInfos; 5106 const FunctionProtoType *T = TL.getTypePtr(); 5107 5108 QualType ResultType; 5109 5110 if (T->hasTrailingReturn()) { 5111 if (getDerived().TransformFunctionTypeParams( 5112 TL.getBeginLoc(), TL.getParams(), 5113 TL.getTypePtr()->param_type_begin(), 5114 T->getExtParameterInfosOrNull(), 5115 ParamTypes, &ParamDecls, ExtParamInfos)) 5116 return QualType(); 5117 5118 { 5119 // C++11 [expr.prim.general]p3: 5120 // If a declaration declares a member function or member function 5121 // template of a class X, the expression this is a prvalue of type 5122 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 5123 // and the end of the function-definition, member-declarator, or 5124 // declarator. 5125 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 5126 5127 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5128 if (ResultType.isNull()) 5129 return QualType(); 5130 } 5131 } 5132 else { 5133 ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5134 if (ResultType.isNull()) 5135 return QualType(); 5136 5137 if (getDerived().TransformFunctionTypeParams( 5138 TL.getBeginLoc(), TL.getParams(), 5139 TL.getTypePtr()->param_type_begin(), 5140 T->getExtParameterInfosOrNull(), 5141 ParamTypes, &ParamDecls, ExtParamInfos)) 5142 return QualType(); 5143 } 5144 5145 FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo(); 5146 5147 bool EPIChanged = false; 5148 if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged)) 5149 return QualType(); 5150 5151 // Handle extended parameter information. 5152 if (auto NewExtParamInfos = 5153 ExtParamInfos.getPointerOrNull(ParamTypes.size())) { 5154 if (!EPI.ExtParameterInfos || 5155 llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams()) 5156 != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) { 5157 EPIChanged = true; 5158 } 5159 EPI.ExtParameterInfos = NewExtParamInfos; 5160 } else if (EPI.ExtParameterInfos) { 5161 EPIChanged = true; 5162 EPI.ExtParameterInfos = nullptr; 5163 } 5164 5165 QualType Result = TL.getType(); 5166 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() || 5167 T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) { 5168 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI); 5169 if (Result.isNull()) 5170 return QualType(); 5171 } 5172 5173 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 5174 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5175 NewTL.setLParenLoc(TL.getLParenLoc()); 5176 NewTL.setRParenLoc(TL.getRParenLoc()); 5177 NewTL.setExceptionSpecRange(TL.getExceptionSpecRange()); 5178 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5179 for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i) 5180 NewTL.setParam(i, ParamDecls[i]); 5181 5182 return Result; 5183 } 5184 5185 template<typename Derived> 5186 bool TreeTransform<Derived>::TransformExceptionSpec( 5187 SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI, 5188 SmallVectorImpl<QualType> &Exceptions, bool &Changed) { 5189 assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated); 5190 5191 // Instantiate a dynamic noexcept expression, if any. 5192 if (ESI.Type == EST_ComputedNoexcept) { 5193 EnterExpressionEvaluationContext Unevaluated( 5194 getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated); 5195 ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr); 5196 if (NoexceptExpr.isInvalid()) 5197 return true; 5198 5199 // FIXME: This is bogus, a noexcept expression is not a condition. 5200 NoexceptExpr = getSema().CheckBooleanCondition(Loc, NoexceptExpr.get()); 5201 if (NoexceptExpr.isInvalid()) 5202 return true; 5203 5204 if (!NoexceptExpr.get()->isValueDependent()) { 5205 NoexceptExpr = getSema().VerifyIntegerConstantExpression( 5206 NoexceptExpr.get(), nullptr, 5207 diag::err_noexcept_needs_constant_expression, 5208 /*AllowFold*/false); 5209 if (NoexceptExpr.isInvalid()) 5210 return true; 5211 } 5212 5213 if (ESI.NoexceptExpr != NoexceptExpr.get()) 5214 Changed = true; 5215 ESI.NoexceptExpr = NoexceptExpr.get(); 5216 } 5217 5218 if (ESI.Type != EST_Dynamic) 5219 return false; 5220 5221 // Instantiate a dynamic exception specification's type. 5222 for (QualType T : ESI.Exceptions) { 5223 if (const PackExpansionType *PackExpansion = 5224 T->getAs<PackExpansionType>()) { 5225 Changed = true; 5226 5227 // We have a pack expansion. Instantiate it. 5228 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 5229 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 5230 Unexpanded); 5231 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 5232 5233 // Determine whether the set of unexpanded parameter packs can and 5234 // should 5235 // be expanded. 5236 bool Expand = false; 5237 bool RetainExpansion = false; 5238 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 5239 // FIXME: Track the location of the ellipsis (and track source location 5240 // information for the types in the exception specification in general). 5241 if (getDerived().TryExpandParameterPacks( 5242 Loc, SourceRange(), Unexpanded, Expand, 5243 RetainExpansion, NumExpansions)) 5244 return true; 5245 5246 if (!Expand) { 5247 // We can't expand this pack expansion into separate arguments yet; 5248 // just substitute into the pattern and create a new pack expansion 5249 // type. 5250 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 5251 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5252 if (U.isNull()) 5253 return true; 5254 5255 U = SemaRef.Context.getPackExpansionType(U, NumExpansions); 5256 Exceptions.push_back(U); 5257 continue; 5258 } 5259 5260 // Substitute into the pack expansion pattern for each slice of the 5261 // pack. 5262 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 5263 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 5264 5265 QualType U = getDerived().TransformType(PackExpansion->getPattern()); 5266 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5267 return true; 5268 5269 Exceptions.push_back(U); 5270 } 5271 } else { 5272 QualType U = getDerived().TransformType(T); 5273 if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc)) 5274 return true; 5275 if (T != U) 5276 Changed = true; 5277 5278 Exceptions.push_back(U); 5279 } 5280 } 5281 5282 ESI.Exceptions = Exceptions; 5283 if (ESI.Exceptions.empty()) 5284 ESI.Type = EST_DynamicNone; 5285 return false; 5286 } 5287 5288 template<typename Derived> 5289 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 5290 TypeLocBuilder &TLB, 5291 FunctionNoProtoTypeLoc TL) { 5292 const FunctionNoProtoType *T = TL.getTypePtr(); 5293 QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc()); 5294 if (ResultType.isNull()) 5295 return QualType(); 5296 5297 QualType Result = TL.getType(); 5298 if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType()) 5299 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 5300 5301 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 5302 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 5303 NewTL.setLParenLoc(TL.getLParenLoc()); 5304 NewTL.setRParenLoc(TL.getRParenLoc()); 5305 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 5306 5307 return Result; 5308 } 5309 5310 template<typename Derived> QualType 5311 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 5312 UnresolvedUsingTypeLoc TL) { 5313 const UnresolvedUsingType *T = TL.getTypePtr(); 5314 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 5315 if (!D) 5316 return QualType(); 5317 5318 QualType Result = TL.getType(); 5319 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 5320 Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D); 5321 if (Result.isNull()) 5322 return QualType(); 5323 } 5324 5325 // We might get an arbitrary type spec type back. We should at 5326 // least always get a type spec type, though. 5327 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 5328 NewTL.setNameLoc(TL.getNameLoc()); 5329 5330 return Result; 5331 } 5332 5333 template<typename Derived> 5334 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 5335 TypedefTypeLoc TL) { 5336 const TypedefType *T = TL.getTypePtr(); 5337 TypedefNameDecl *Typedef 5338 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5339 T->getDecl())); 5340 if (!Typedef) 5341 return QualType(); 5342 5343 QualType Result = TL.getType(); 5344 if (getDerived().AlwaysRebuild() || 5345 Typedef != T->getDecl()) { 5346 Result = getDerived().RebuildTypedefType(Typedef); 5347 if (Result.isNull()) 5348 return QualType(); 5349 } 5350 5351 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 5352 NewTL.setNameLoc(TL.getNameLoc()); 5353 5354 return Result; 5355 } 5356 5357 template<typename Derived> 5358 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 5359 TypeOfExprTypeLoc TL) { 5360 // typeof expressions are not potentially evaluated contexts 5361 EnterExpressionEvaluationContext Unevaluated( 5362 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 5363 Sema::ReuseLambdaContextDecl); 5364 5365 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 5366 if (E.isInvalid()) 5367 return QualType(); 5368 5369 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 5370 if (E.isInvalid()) 5371 return QualType(); 5372 5373 QualType Result = TL.getType(); 5374 if (getDerived().AlwaysRebuild() || 5375 E.get() != TL.getUnderlyingExpr()) { 5376 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 5377 if (Result.isNull()) 5378 return QualType(); 5379 } 5380 else E.get(); 5381 5382 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 5383 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5384 NewTL.setLParenLoc(TL.getLParenLoc()); 5385 NewTL.setRParenLoc(TL.getRParenLoc()); 5386 5387 return Result; 5388 } 5389 5390 template<typename Derived> 5391 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 5392 TypeOfTypeLoc TL) { 5393 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 5394 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 5395 if (!New_Under_TI) 5396 return QualType(); 5397 5398 QualType Result = TL.getType(); 5399 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 5400 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 5401 if (Result.isNull()) 5402 return QualType(); 5403 } 5404 5405 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 5406 NewTL.setTypeofLoc(TL.getTypeofLoc()); 5407 NewTL.setLParenLoc(TL.getLParenLoc()); 5408 NewTL.setRParenLoc(TL.getRParenLoc()); 5409 NewTL.setUnderlyingTInfo(New_Under_TI); 5410 5411 return Result; 5412 } 5413 5414 template<typename Derived> 5415 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 5416 DecltypeTypeLoc TL) { 5417 const DecltypeType *T = TL.getTypePtr(); 5418 5419 // decltype expressions are not potentially evaluated contexts 5420 EnterExpressionEvaluationContext Unevaluated( 5421 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr, 5422 /*IsDecltype=*/true); 5423 5424 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 5425 if (E.isInvalid()) 5426 return QualType(); 5427 5428 E = getSema().ActOnDecltypeExpression(E.get()); 5429 if (E.isInvalid()) 5430 return QualType(); 5431 5432 QualType Result = TL.getType(); 5433 if (getDerived().AlwaysRebuild() || 5434 E.get() != T->getUnderlyingExpr()) { 5435 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 5436 if (Result.isNull()) 5437 return QualType(); 5438 } 5439 else E.get(); 5440 5441 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 5442 NewTL.setNameLoc(TL.getNameLoc()); 5443 5444 return Result; 5445 } 5446 5447 template<typename Derived> 5448 QualType TreeTransform<Derived>::TransformUnaryTransformType( 5449 TypeLocBuilder &TLB, 5450 UnaryTransformTypeLoc TL) { 5451 QualType Result = TL.getType(); 5452 if (Result->isDependentType()) { 5453 const UnaryTransformType *T = TL.getTypePtr(); 5454 QualType NewBase = 5455 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 5456 Result = getDerived().RebuildUnaryTransformType(NewBase, 5457 T->getUTTKind(), 5458 TL.getKWLoc()); 5459 if (Result.isNull()) 5460 return QualType(); 5461 } 5462 5463 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 5464 NewTL.setKWLoc(TL.getKWLoc()); 5465 NewTL.setParensRange(TL.getParensRange()); 5466 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 5467 return Result; 5468 } 5469 5470 template<typename Derived> 5471 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 5472 AutoTypeLoc TL) { 5473 const AutoType *T = TL.getTypePtr(); 5474 QualType OldDeduced = T->getDeducedType(); 5475 QualType NewDeduced; 5476 if (!OldDeduced.isNull()) { 5477 NewDeduced = getDerived().TransformType(OldDeduced); 5478 if (NewDeduced.isNull()) 5479 return QualType(); 5480 } 5481 5482 QualType Result = TL.getType(); 5483 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 5484 T->isDependentType()) { 5485 Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword()); 5486 if (Result.isNull()) 5487 return QualType(); 5488 } 5489 5490 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 5491 NewTL.setNameLoc(TL.getNameLoc()); 5492 5493 return Result; 5494 } 5495 5496 template<typename Derived> 5497 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType( 5498 TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) { 5499 const DeducedTemplateSpecializationType *T = TL.getTypePtr(); 5500 5501 CXXScopeSpec SS; 5502 TemplateName TemplateName = getDerived().TransformTemplateName( 5503 SS, T->getTemplateName(), TL.getTemplateNameLoc()); 5504 if (TemplateName.isNull()) 5505 return QualType(); 5506 5507 QualType OldDeduced = T->getDeducedType(); 5508 QualType NewDeduced; 5509 if (!OldDeduced.isNull()) { 5510 NewDeduced = getDerived().TransformType(OldDeduced); 5511 if (NewDeduced.isNull()) 5512 return QualType(); 5513 } 5514 5515 QualType Result = getDerived().RebuildDeducedTemplateSpecializationType( 5516 TemplateName, NewDeduced); 5517 if (Result.isNull()) 5518 return QualType(); 5519 5520 DeducedTemplateSpecializationTypeLoc NewTL = 5521 TLB.push<DeducedTemplateSpecializationTypeLoc>(Result); 5522 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5523 5524 return Result; 5525 } 5526 5527 template<typename Derived> 5528 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 5529 RecordTypeLoc TL) { 5530 const RecordType *T = TL.getTypePtr(); 5531 RecordDecl *Record 5532 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5533 T->getDecl())); 5534 if (!Record) 5535 return QualType(); 5536 5537 QualType Result = TL.getType(); 5538 if (getDerived().AlwaysRebuild() || 5539 Record != T->getDecl()) { 5540 Result = getDerived().RebuildRecordType(Record); 5541 if (Result.isNull()) 5542 return QualType(); 5543 } 5544 5545 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 5546 NewTL.setNameLoc(TL.getNameLoc()); 5547 5548 return Result; 5549 } 5550 5551 template<typename Derived> 5552 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 5553 EnumTypeLoc TL) { 5554 const EnumType *T = TL.getTypePtr(); 5555 EnumDecl *Enum 5556 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 5557 T->getDecl())); 5558 if (!Enum) 5559 return QualType(); 5560 5561 QualType Result = TL.getType(); 5562 if (getDerived().AlwaysRebuild() || 5563 Enum != T->getDecl()) { 5564 Result = getDerived().RebuildEnumType(Enum); 5565 if (Result.isNull()) 5566 return QualType(); 5567 } 5568 5569 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 5570 NewTL.setNameLoc(TL.getNameLoc()); 5571 5572 return Result; 5573 } 5574 5575 template<typename Derived> 5576 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 5577 TypeLocBuilder &TLB, 5578 InjectedClassNameTypeLoc TL) { 5579 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 5580 TL.getTypePtr()->getDecl()); 5581 if (!D) return QualType(); 5582 5583 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 5584 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 5585 return T; 5586 } 5587 5588 template<typename Derived> 5589 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 5590 TypeLocBuilder &TLB, 5591 TemplateTypeParmTypeLoc TL) { 5592 return TransformTypeSpecType(TLB, TL); 5593 } 5594 5595 template<typename Derived> 5596 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 5597 TypeLocBuilder &TLB, 5598 SubstTemplateTypeParmTypeLoc TL) { 5599 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 5600 5601 // Substitute into the replacement type, which itself might involve something 5602 // that needs to be transformed. This only tends to occur with default 5603 // template arguments of template template parameters. 5604 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 5605 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 5606 if (Replacement.isNull()) 5607 return QualType(); 5608 5609 // Always canonicalize the replacement type. 5610 Replacement = SemaRef.Context.getCanonicalType(Replacement); 5611 QualType Result 5612 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 5613 Replacement); 5614 5615 // Propagate type-source information. 5616 SubstTemplateTypeParmTypeLoc NewTL 5617 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 5618 NewTL.setNameLoc(TL.getNameLoc()); 5619 return Result; 5620 5621 } 5622 5623 template<typename Derived> 5624 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 5625 TypeLocBuilder &TLB, 5626 SubstTemplateTypeParmPackTypeLoc TL) { 5627 return TransformTypeSpecType(TLB, TL); 5628 } 5629 5630 template<typename Derived> 5631 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5632 TypeLocBuilder &TLB, 5633 TemplateSpecializationTypeLoc TL) { 5634 const TemplateSpecializationType *T = TL.getTypePtr(); 5635 5636 // The nested-name-specifier never matters in a TemplateSpecializationType, 5637 // because we can't have a dependent nested-name-specifier anyway. 5638 CXXScopeSpec SS; 5639 TemplateName Template 5640 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 5641 TL.getTemplateNameLoc()); 5642 if (Template.isNull()) 5643 return QualType(); 5644 5645 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 5646 } 5647 5648 template<typename Derived> 5649 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 5650 AtomicTypeLoc TL) { 5651 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5652 if (ValueType.isNull()) 5653 return QualType(); 5654 5655 QualType Result = TL.getType(); 5656 if (getDerived().AlwaysRebuild() || 5657 ValueType != TL.getValueLoc().getType()) { 5658 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 5659 if (Result.isNull()) 5660 return QualType(); 5661 } 5662 5663 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 5664 NewTL.setKWLoc(TL.getKWLoc()); 5665 NewTL.setLParenLoc(TL.getLParenLoc()); 5666 NewTL.setRParenLoc(TL.getRParenLoc()); 5667 5668 return Result; 5669 } 5670 5671 template <typename Derived> 5672 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB, 5673 PipeTypeLoc TL) { 5674 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 5675 if (ValueType.isNull()) 5676 return QualType(); 5677 5678 QualType Result = TL.getType(); 5679 if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) { 5680 const PipeType *PT = Result->getAs<PipeType>(); 5681 bool isReadPipe = PT->isReadOnly(); 5682 Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe); 5683 if (Result.isNull()) 5684 return QualType(); 5685 } 5686 5687 PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result); 5688 NewTL.setKWLoc(TL.getKWLoc()); 5689 5690 return Result; 5691 } 5692 5693 /// \brief Simple iterator that traverses the template arguments in a 5694 /// container that provides a \c getArgLoc() member function. 5695 /// 5696 /// This iterator is intended to be used with the iterator form of 5697 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 5698 template<typename ArgLocContainer> 5699 class TemplateArgumentLocContainerIterator { 5700 ArgLocContainer *Container; 5701 unsigned Index; 5702 5703 public: 5704 typedef TemplateArgumentLoc value_type; 5705 typedef TemplateArgumentLoc reference; 5706 typedef int difference_type; 5707 typedef std::input_iterator_tag iterator_category; 5708 5709 class pointer { 5710 TemplateArgumentLoc Arg; 5711 5712 public: 5713 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 5714 5715 const TemplateArgumentLoc *operator->() const { 5716 return &Arg; 5717 } 5718 }; 5719 5720 5721 TemplateArgumentLocContainerIterator() {} 5722 5723 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 5724 unsigned Index) 5725 : Container(&Container), Index(Index) { } 5726 5727 TemplateArgumentLocContainerIterator &operator++() { 5728 ++Index; 5729 return *this; 5730 } 5731 5732 TemplateArgumentLocContainerIterator operator++(int) { 5733 TemplateArgumentLocContainerIterator Old(*this); 5734 ++(*this); 5735 return Old; 5736 } 5737 5738 TemplateArgumentLoc operator*() const { 5739 return Container->getArgLoc(Index); 5740 } 5741 5742 pointer operator->() const { 5743 return pointer(Container->getArgLoc(Index)); 5744 } 5745 5746 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 5747 const TemplateArgumentLocContainerIterator &Y) { 5748 return X.Container == Y.Container && X.Index == Y.Index; 5749 } 5750 5751 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 5752 const TemplateArgumentLocContainerIterator &Y) { 5753 return !(X == Y); 5754 } 5755 }; 5756 5757 5758 template <typename Derived> 5759 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 5760 TypeLocBuilder &TLB, 5761 TemplateSpecializationTypeLoc TL, 5762 TemplateName Template) { 5763 TemplateArgumentListInfo NewTemplateArgs; 5764 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5765 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5766 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 5767 ArgIterator; 5768 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5769 ArgIterator(TL, TL.getNumArgs()), 5770 NewTemplateArgs)) 5771 return QualType(); 5772 5773 // FIXME: maybe don't rebuild if all the template arguments are the same. 5774 5775 QualType Result = 5776 getDerived().RebuildTemplateSpecializationType(Template, 5777 TL.getTemplateNameLoc(), 5778 NewTemplateArgs); 5779 5780 if (!Result.isNull()) { 5781 // Specializations of template template parameters are represented as 5782 // TemplateSpecializationTypes, and substitution of type alias templates 5783 // within a dependent context can transform them into 5784 // DependentTemplateSpecializationTypes. 5785 if (isa<DependentTemplateSpecializationType>(Result)) { 5786 DependentTemplateSpecializationTypeLoc NewTL 5787 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5788 NewTL.setElaboratedKeywordLoc(SourceLocation()); 5789 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 5790 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5791 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5792 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5793 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5794 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5795 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5796 return Result; 5797 } 5798 5799 TemplateSpecializationTypeLoc NewTL 5800 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5801 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5802 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5803 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5804 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5805 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5806 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5807 } 5808 5809 return Result; 5810 } 5811 5812 template <typename Derived> 5813 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 5814 TypeLocBuilder &TLB, 5815 DependentTemplateSpecializationTypeLoc TL, 5816 TemplateName Template, 5817 CXXScopeSpec &SS) { 5818 TemplateArgumentListInfo NewTemplateArgs; 5819 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5820 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5821 typedef TemplateArgumentLocContainerIterator< 5822 DependentTemplateSpecializationTypeLoc> ArgIterator; 5823 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5824 ArgIterator(TL, TL.getNumArgs()), 5825 NewTemplateArgs)) 5826 return QualType(); 5827 5828 // FIXME: maybe don't rebuild if all the template arguments are the same. 5829 5830 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 5831 QualType Result 5832 = getSema().Context.getDependentTemplateSpecializationType( 5833 TL.getTypePtr()->getKeyword(), 5834 DTN->getQualifier(), 5835 DTN->getIdentifier(), 5836 NewTemplateArgs); 5837 5838 DependentTemplateSpecializationTypeLoc NewTL 5839 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5840 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5841 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 5842 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5843 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5844 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5845 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5846 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5847 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5848 return Result; 5849 } 5850 5851 QualType Result 5852 = getDerived().RebuildTemplateSpecializationType(Template, 5853 TL.getTemplateNameLoc(), 5854 NewTemplateArgs); 5855 5856 if (!Result.isNull()) { 5857 /// FIXME: Wrap this in an elaborated-type-specifier? 5858 TemplateSpecializationTypeLoc NewTL 5859 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5860 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5861 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5862 NewTL.setLAngleLoc(TL.getLAngleLoc()); 5863 NewTL.setRAngleLoc(TL.getRAngleLoc()); 5864 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 5865 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 5866 } 5867 5868 return Result; 5869 } 5870 5871 template<typename Derived> 5872 QualType 5873 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 5874 ElaboratedTypeLoc TL) { 5875 const ElaboratedType *T = TL.getTypePtr(); 5876 5877 NestedNameSpecifierLoc QualifierLoc; 5878 // NOTE: the qualifier in an ElaboratedType is optional. 5879 if (TL.getQualifierLoc()) { 5880 QualifierLoc 5881 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 5882 if (!QualifierLoc) 5883 return QualType(); 5884 } 5885 5886 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 5887 if (NamedT.isNull()) 5888 return QualType(); 5889 5890 // C++0x [dcl.type.elab]p2: 5891 // If the identifier resolves to a typedef-name or the simple-template-id 5892 // resolves to an alias template specialization, the 5893 // elaborated-type-specifier is ill-formed. 5894 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 5895 if (const TemplateSpecializationType *TST = 5896 NamedT->getAs<TemplateSpecializationType>()) { 5897 TemplateName Template = TST->getTemplateName(); 5898 if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>( 5899 Template.getAsTemplateDecl())) { 5900 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 5901 diag::err_tag_reference_non_tag) 5902 << TAT << Sema::NTK_TypeAliasTemplate 5903 << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword()); 5904 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 5905 } 5906 } 5907 } 5908 5909 QualType Result = TL.getType(); 5910 if (getDerived().AlwaysRebuild() || 5911 QualifierLoc != TL.getQualifierLoc() || 5912 NamedT != T->getNamedType()) { 5913 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 5914 T->getKeyword(), 5915 QualifierLoc, NamedT); 5916 if (Result.isNull()) 5917 return QualType(); 5918 } 5919 5920 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 5921 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5922 NewTL.setQualifierLoc(QualifierLoc); 5923 return Result; 5924 } 5925 5926 template<typename Derived> 5927 QualType TreeTransform<Derived>::TransformAttributedType( 5928 TypeLocBuilder &TLB, 5929 AttributedTypeLoc TL) { 5930 const AttributedType *oldType = TL.getTypePtr(); 5931 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 5932 if (modifiedType.isNull()) 5933 return QualType(); 5934 5935 QualType result = TL.getType(); 5936 5937 // FIXME: dependent operand expressions? 5938 if (getDerived().AlwaysRebuild() || 5939 modifiedType != oldType->getModifiedType()) { 5940 // TODO: this is really lame; we should really be rebuilding the 5941 // equivalent type from first principles. 5942 QualType equivalentType 5943 = getDerived().TransformType(oldType->getEquivalentType()); 5944 if (equivalentType.isNull()) 5945 return QualType(); 5946 5947 // Check whether we can add nullability; it is only represented as 5948 // type sugar, and therefore cannot be diagnosed in any other way. 5949 if (auto nullability = oldType->getImmediateNullability()) { 5950 if (!modifiedType->canHaveNullability()) { 5951 SemaRef.Diag(TL.getAttrNameLoc(), diag::err_nullability_nonpointer) 5952 << DiagNullabilityKind(*nullability, false) << modifiedType; 5953 return QualType(); 5954 } 5955 } 5956 5957 result = SemaRef.Context.getAttributedType(oldType->getAttrKind(), 5958 modifiedType, 5959 equivalentType); 5960 } 5961 5962 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 5963 newTL.setAttrNameLoc(TL.getAttrNameLoc()); 5964 if (TL.hasAttrOperand()) 5965 newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5966 if (TL.hasAttrExprOperand()) 5967 newTL.setAttrExprOperand(TL.getAttrExprOperand()); 5968 else if (TL.hasAttrEnumOperand()) 5969 newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc()); 5970 5971 return result; 5972 } 5973 5974 template<typename Derived> 5975 QualType 5976 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 5977 ParenTypeLoc TL) { 5978 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 5979 if (Inner.isNull()) 5980 return QualType(); 5981 5982 QualType Result = TL.getType(); 5983 if (getDerived().AlwaysRebuild() || 5984 Inner != TL.getInnerLoc().getType()) { 5985 Result = getDerived().RebuildParenType(Inner); 5986 if (Result.isNull()) 5987 return QualType(); 5988 } 5989 5990 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 5991 NewTL.setLParenLoc(TL.getLParenLoc()); 5992 NewTL.setRParenLoc(TL.getRParenLoc()); 5993 return Result; 5994 } 5995 5996 template<typename Derived> 5997 QualType TreeTransform<Derived>::TransformDependentNameType( 5998 TypeLocBuilder &TLB, DependentNameTypeLoc TL) { 5999 return TransformDependentNameType(TLB, TL, false); 6000 } 6001 6002 template<typename Derived> 6003 QualType TreeTransform<Derived>::TransformDependentNameType( 6004 TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) { 6005 const DependentNameType *T = TL.getTypePtr(); 6006 6007 NestedNameSpecifierLoc QualifierLoc 6008 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6009 if (!QualifierLoc) 6010 return QualType(); 6011 6012 QualType Result 6013 = getDerived().RebuildDependentNameType(T->getKeyword(), 6014 TL.getElaboratedKeywordLoc(), 6015 QualifierLoc, 6016 T->getIdentifier(), 6017 TL.getNameLoc(), 6018 DeducedTSTContext); 6019 if (Result.isNull()) 6020 return QualType(); 6021 6022 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 6023 QualType NamedT = ElabT->getNamedType(); 6024 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 6025 6026 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6027 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6028 NewTL.setQualifierLoc(QualifierLoc); 6029 } else { 6030 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 6031 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6032 NewTL.setQualifierLoc(QualifierLoc); 6033 NewTL.setNameLoc(TL.getNameLoc()); 6034 } 6035 return Result; 6036 } 6037 6038 template<typename Derived> 6039 QualType TreeTransform<Derived>:: 6040 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6041 DependentTemplateSpecializationTypeLoc TL) { 6042 NestedNameSpecifierLoc QualifierLoc; 6043 if (TL.getQualifierLoc()) { 6044 QualifierLoc 6045 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 6046 if (!QualifierLoc) 6047 return QualType(); 6048 } 6049 6050 return getDerived() 6051 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 6052 } 6053 6054 template<typename Derived> 6055 QualType TreeTransform<Derived>:: 6056 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 6057 DependentTemplateSpecializationTypeLoc TL, 6058 NestedNameSpecifierLoc QualifierLoc) { 6059 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 6060 6061 TemplateArgumentListInfo NewTemplateArgs; 6062 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 6063 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 6064 6065 typedef TemplateArgumentLocContainerIterator< 6066 DependentTemplateSpecializationTypeLoc> ArgIterator; 6067 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 6068 ArgIterator(TL, TL.getNumArgs()), 6069 NewTemplateArgs)) 6070 return QualType(); 6071 6072 QualType Result = getDerived().RebuildDependentTemplateSpecializationType( 6073 T->getKeyword(), QualifierLoc, T->getIdentifier(), 6074 TL.getTemplateNameLoc(), NewTemplateArgs, 6075 /*AllowInjectedClassName*/ false); 6076 if (Result.isNull()) 6077 return QualType(); 6078 6079 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 6080 QualType NamedT = ElabT->getNamedType(); 6081 6082 // Copy information relevant to the template specialization. 6083 TemplateSpecializationTypeLoc NamedTL 6084 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 6085 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6086 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6087 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 6088 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 6089 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6090 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6091 6092 // Copy information relevant to the elaborated type. 6093 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 6094 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6095 NewTL.setQualifierLoc(QualifierLoc); 6096 } else if (isa<DependentTemplateSpecializationType>(Result)) { 6097 DependentTemplateSpecializationTypeLoc SpecTL 6098 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 6099 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 6100 SpecTL.setQualifierLoc(QualifierLoc); 6101 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6102 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6103 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6104 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6105 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6106 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6107 } else { 6108 TemplateSpecializationTypeLoc SpecTL 6109 = TLB.push<TemplateSpecializationTypeLoc>(Result); 6110 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 6111 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 6112 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 6113 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 6114 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 6115 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 6116 } 6117 return Result; 6118 } 6119 6120 template<typename Derived> 6121 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 6122 PackExpansionTypeLoc TL) { 6123 QualType Pattern 6124 = getDerived().TransformType(TLB, TL.getPatternLoc()); 6125 if (Pattern.isNull()) 6126 return QualType(); 6127 6128 QualType Result = TL.getType(); 6129 if (getDerived().AlwaysRebuild() || 6130 Pattern != TL.getPatternLoc().getType()) { 6131 Result = getDerived().RebuildPackExpansionType(Pattern, 6132 TL.getPatternLoc().getSourceRange(), 6133 TL.getEllipsisLoc(), 6134 TL.getTypePtr()->getNumExpansions()); 6135 if (Result.isNull()) 6136 return QualType(); 6137 } 6138 6139 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 6140 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 6141 return Result; 6142 } 6143 6144 template<typename Derived> 6145 QualType 6146 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 6147 ObjCInterfaceTypeLoc TL) { 6148 // ObjCInterfaceType is never dependent. 6149 TLB.pushFullCopy(TL); 6150 return TL.getType(); 6151 } 6152 6153 template<typename Derived> 6154 QualType 6155 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB, 6156 ObjCTypeParamTypeLoc TL) { 6157 const ObjCTypeParamType *T = TL.getTypePtr(); 6158 ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>( 6159 getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl())); 6160 if (!OTP) 6161 return QualType(); 6162 6163 QualType Result = TL.getType(); 6164 if (getDerived().AlwaysRebuild() || 6165 OTP != T->getDecl()) { 6166 Result = getDerived().RebuildObjCTypeParamType(OTP, 6167 TL.getProtocolLAngleLoc(), 6168 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6169 TL.getNumProtocols()), 6170 TL.getProtocolLocs(), 6171 TL.getProtocolRAngleLoc()); 6172 if (Result.isNull()) 6173 return QualType(); 6174 } 6175 6176 ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result); 6177 if (TL.getNumProtocols()) { 6178 NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6179 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6180 NewTL.setProtocolLoc(i, TL.getProtocolLoc(i)); 6181 NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6182 } 6183 return Result; 6184 } 6185 6186 template<typename Derived> 6187 QualType 6188 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 6189 ObjCObjectTypeLoc TL) { 6190 // Transform base type. 6191 QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc()); 6192 if (BaseType.isNull()) 6193 return QualType(); 6194 6195 bool AnyChanged = BaseType != TL.getBaseLoc().getType(); 6196 6197 // Transform type arguments. 6198 SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos; 6199 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) { 6200 TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i); 6201 TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc(); 6202 QualType TypeArg = TypeArgInfo->getType(); 6203 if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) { 6204 AnyChanged = true; 6205 6206 // We have a pack expansion. Instantiate it. 6207 const auto *PackExpansion = PackExpansionLoc.getType() 6208 ->castAs<PackExpansionType>(); 6209 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 6210 SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(), 6211 Unexpanded); 6212 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 6213 6214 // Determine whether the set of unexpanded parameter packs can 6215 // and should be expanded. 6216 TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc(); 6217 bool Expand = false; 6218 bool RetainExpansion = false; 6219 Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions(); 6220 if (getDerived().TryExpandParameterPacks( 6221 PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(), 6222 Unexpanded, Expand, RetainExpansion, NumExpansions)) 6223 return QualType(); 6224 6225 if (!Expand) { 6226 // We can't expand this pack expansion into separate arguments yet; 6227 // just substitute into the pattern and create a new pack expansion 6228 // type. 6229 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 6230 6231 TypeLocBuilder TypeArgBuilder; 6232 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6233 QualType NewPatternType = getDerived().TransformType(TypeArgBuilder, 6234 PatternLoc); 6235 if (NewPatternType.isNull()) 6236 return QualType(); 6237 6238 QualType NewExpansionType = SemaRef.Context.getPackExpansionType( 6239 NewPatternType, NumExpansions); 6240 auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType); 6241 NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc()); 6242 NewTypeArgInfos.push_back( 6243 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType)); 6244 continue; 6245 } 6246 6247 // Substitute into the pack expansion pattern for each slice of the 6248 // pack. 6249 for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) { 6250 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx); 6251 6252 TypeLocBuilder TypeArgBuilder; 6253 TypeArgBuilder.reserve(PatternLoc.getFullDataSize()); 6254 6255 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, 6256 PatternLoc); 6257 if (NewTypeArg.isNull()) 6258 return QualType(); 6259 6260 NewTypeArgInfos.push_back( 6261 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6262 } 6263 6264 continue; 6265 } 6266 6267 TypeLocBuilder TypeArgBuilder; 6268 TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize()); 6269 QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc); 6270 if (NewTypeArg.isNull()) 6271 return QualType(); 6272 6273 // If nothing changed, just keep the old TypeSourceInfo. 6274 if (NewTypeArg == TypeArg) { 6275 NewTypeArgInfos.push_back(TypeArgInfo); 6276 continue; 6277 } 6278 6279 NewTypeArgInfos.push_back( 6280 TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg)); 6281 AnyChanged = true; 6282 } 6283 6284 QualType Result = TL.getType(); 6285 if (getDerived().AlwaysRebuild() || AnyChanged) { 6286 // Rebuild the type. 6287 Result = getDerived().RebuildObjCObjectType( 6288 BaseType, 6289 TL.getLocStart(), 6290 TL.getTypeArgsLAngleLoc(), 6291 NewTypeArgInfos, 6292 TL.getTypeArgsRAngleLoc(), 6293 TL.getProtocolLAngleLoc(), 6294 llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), 6295 TL.getNumProtocols()), 6296 TL.getProtocolLocs(), 6297 TL.getProtocolRAngleLoc()); 6298 6299 if (Result.isNull()) 6300 return QualType(); 6301 } 6302 6303 ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result); 6304 NewT.setHasBaseTypeAsWritten(true); 6305 NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc()); 6306 for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) 6307 NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]); 6308 NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc()); 6309 NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc()); 6310 for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i) 6311 NewT.setProtocolLoc(i, TL.getProtocolLoc(i)); 6312 NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc()); 6313 return Result; 6314 } 6315 6316 template<typename Derived> 6317 QualType 6318 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 6319 ObjCObjectPointerTypeLoc TL) { 6320 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 6321 if (PointeeType.isNull()) 6322 return QualType(); 6323 6324 QualType Result = TL.getType(); 6325 if (getDerived().AlwaysRebuild() || 6326 PointeeType != TL.getPointeeLoc().getType()) { 6327 Result = getDerived().RebuildObjCObjectPointerType(PointeeType, 6328 TL.getStarLoc()); 6329 if (Result.isNull()) 6330 return QualType(); 6331 } 6332 6333 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 6334 NewT.setStarLoc(TL.getStarLoc()); 6335 return Result; 6336 } 6337 6338 //===----------------------------------------------------------------------===// 6339 // Statement transformation 6340 //===----------------------------------------------------------------------===// 6341 template<typename Derived> 6342 StmtResult 6343 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 6344 return S; 6345 } 6346 6347 template<typename Derived> 6348 StmtResult 6349 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 6350 return getDerived().TransformCompoundStmt(S, false); 6351 } 6352 6353 template<typename Derived> 6354 StmtResult 6355 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 6356 bool IsStmtExpr) { 6357 Sema::CompoundScopeRAII CompoundScope(getSema()); 6358 6359 bool SubStmtInvalid = false; 6360 bool SubStmtChanged = false; 6361 SmallVector<Stmt*, 8> Statements; 6362 for (auto *B : S->body()) { 6363 StmtResult Result = getDerived().TransformStmt(B); 6364 if (Result.isInvalid()) { 6365 // Immediately fail if this was a DeclStmt, since it's very 6366 // likely that this will cause problems for future statements. 6367 if (isa<DeclStmt>(B)) 6368 return StmtError(); 6369 6370 // Otherwise, just keep processing substatements and fail later. 6371 SubStmtInvalid = true; 6372 continue; 6373 } 6374 6375 SubStmtChanged = SubStmtChanged || Result.get() != B; 6376 Statements.push_back(Result.getAs<Stmt>()); 6377 } 6378 6379 if (SubStmtInvalid) 6380 return StmtError(); 6381 6382 if (!getDerived().AlwaysRebuild() && 6383 !SubStmtChanged) 6384 return S; 6385 6386 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 6387 Statements, 6388 S->getRBracLoc(), 6389 IsStmtExpr); 6390 } 6391 6392 template<typename Derived> 6393 StmtResult 6394 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 6395 ExprResult LHS, RHS; 6396 { 6397 EnterExpressionEvaluationContext Unevaluated( 6398 SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated); 6399 6400 // Transform the left-hand case value. 6401 LHS = getDerived().TransformExpr(S->getLHS()); 6402 LHS = SemaRef.ActOnConstantExpression(LHS); 6403 if (LHS.isInvalid()) 6404 return StmtError(); 6405 6406 // Transform the right-hand case value (for the GNU case-range extension). 6407 RHS = getDerived().TransformExpr(S->getRHS()); 6408 RHS = SemaRef.ActOnConstantExpression(RHS); 6409 if (RHS.isInvalid()) 6410 return StmtError(); 6411 } 6412 6413 // Build the case statement. 6414 // Case statements are always rebuilt so that they will attached to their 6415 // transformed switch statement. 6416 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 6417 LHS.get(), 6418 S->getEllipsisLoc(), 6419 RHS.get(), 6420 S->getColonLoc()); 6421 if (Case.isInvalid()) 6422 return StmtError(); 6423 6424 // Transform the statement following the case 6425 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6426 if (SubStmt.isInvalid()) 6427 return StmtError(); 6428 6429 // Attach the body to the case statement 6430 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 6431 } 6432 6433 template<typename Derived> 6434 StmtResult 6435 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 6436 // Transform the statement following the default case 6437 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6438 if (SubStmt.isInvalid()) 6439 return StmtError(); 6440 6441 // Default statements are always rebuilt 6442 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 6443 SubStmt.get()); 6444 } 6445 6446 template<typename Derived> 6447 StmtResult 6448 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 6449 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6450 if (SubStmt.isInvalid()) 6451 return StmtError(); 6452 6453 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 6454 S->getDecl()); 6455 if (!LD) 6456 return StmtError(); 6457 6458 6459 // FIXME: Pass the real colon location in. 6460 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 6461 cast<LabelDecl>(LD), SourceLocation(), 6462 SubStmt.get()); 6463 } 6464 6465 template <typename Derived> 6466 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) { 6467 if (!R) 6468 return R; 6469 6470 switch (R->getKind()) { 6471 // Transform attributes with a pragma spelling by calling TransformXXXAttr. 6472 #define ATTR(X) 6473 #define PRAGMA_SPELLING_ATTR(X) \ 6474 case attr::X: \ 6475 return getDerived().Transform##X##Attr(cast<X##Attr>(R)); 6476 #include "clang/Basic/AttrList.inc" 6477 default: 6478 return R; 6479 } 6480 } 6481 6482 template <typename Derived> 6483 StmtResult TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) { 6484 bool AttrsChanged = false; 6485 SmallVector<const Attr *, 1> Attrs; 6486 6487 // Visit attributes and keep track if any are transformed. 6488 for (const auto *I : S->getAttrs()) { 6489 const Attr *R = getDerived().TransformAttr(I); 6490 AttrsChanged |= (I != R); 6491 Attrs.push_back(R); 6492 } 6493 6494 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 6495 if (SubStmt.isInvalid()) 6496 return StmtError(); 6497 6498 if (SubStmt.get() == S->getSubStmt() && !AttrsChanged) 6499 return S; 6500 6501 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs, 6502 SubStmt.get()); 6503 } 6504 6505 template<typename Derived> 6506 StmtResult 6507 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 6508 // Transform the initialization statement 6509 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6510 if (Init.isInvalid()) 6511 return StmtError(); 6512 6513 // Transform the condition 6514 Sema::ConditionResult Cond = getDerived().TransformCondition( 6515 S->getIfLoc(), S->getConditionVariable(), S->getCond(), 6516 S->isConstexpr() ? Sema::ConditionKind::ConstexprIf 6517 : Sema::ConditionKind::Boolean); 6518 if (Cond.isInvalid()) 6519 return StmtError(); 6520 6521 // If this is a constexpr if, determine which arm we should instantiate. 6522 llvm::Optional<bool> ConstexprConditionValue; 6523 if (S->isConstexpr()) 6524 ConstexprConditionValue = Cond.getKnownValue(); 6525 6526 // Transform the "then" branch. 6527 StmtResult Then; 6528 if (!ConstexprConditionValue || *ConstexprConditionValue) { 6529 Then = getDerived().TransformStmt(S->getThen()); 6530 if (Then.isInvalid()) 6531 return StmtError(); 6532 } else { 6533 Then = new (getSema().Context) NullStmt(S->getThen()->getLocStart()); 6534 } 6535 6536 // Transform the "else" branch. 6537 StmtResult Else; 6538 if (!ConstexprConditionValue || !*ConstexprConditionValue) { 6539 Else = getDerived().TransformStmt(S->getElse()); 6540 if (Else.isInvalid()) 6541 return StmtError(); 6542 } 6543 6544 if (!getDerived().AlwaysRebuild() && 6545 Init.get() == S->getInit() && 6546 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6547 Then.get() == S->getThen() && 6548 Else.get() == S->getElse()) 6549 return S; 6550 6551 return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond, 6552 Init.get(), Then.get(), S->getElseLoc(), 6553 Else.get()); 6554 } 6555 6556 template<typename Derived> 6557 StmtResult 6558 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 6559 // Transform the initialization statement 6560 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6561 if (Init.isInvalid()) 6562 return StmtError(); 6563 6564 // Transform the condition. 6565 Sema::ConditionResult Cond = getDerived().TransformCondition( 6566 S->getSwitchLoc(), S->getConditionVariable(), S->getCond(), 6567 Sema::ConditionKind::Switch); 6568 if (Cond.isInvalid()) 6569 return StmtError(); 6570 6571 // Rebuild the switch statement. 6572 StmtResult Switch 6573 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), 6574 S->getInit(), Cond); 6575 if (Switch.isInvalid()) 6576 return StmtError(); 6577 6578 // Transform the body of the switch statement. 6579 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6580 if (Body.isInvalid()) 6581 return StmtError(); 6582 6583 // Complete the switch statement. 6584 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 6585 Body.get()); 6586 } 6587 6588 template<typename Derived> 6589 StmtResult 6590 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 6591 // Transform the condition 6592 Sema::ConditionResult Cond = getDerived().TransformCondition( 6593 S->getWhileLoc(), S->getConditionVariable(), S->getCond(), 6594 Sema::ConditionKind::Boolean); 6595 if (Cond.isInvalid()) 6596 return StmtError(); 6597 6598 // Transform the body 6599 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6600 if (Body.isInvalid()) 6601 return StmtError(); 6602 6603 if (!getDerived().AlwaysRebuild() && 6604 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6605 Body.get() == S->getBody()) 6606 return Owned(S); 6607 6608 return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get()); 6609 } 6610 6611 template<typename Derived> 6612 StmtResult 6613 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 6614 // Transform the body 6615 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6616 if (Body.isInvalid()) 6617 return StmtError(); 6618 6619 // Transform the condition 6620 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6621 if (Cond.isInvalid()) 6622 return StmtError(); 6623 6624 if (!getDerived().AlwaysRebuild() && 6625 Cond.get() == S->getCond() && 6626 Body.get() == S->getBody()) 6627 return S; 6628 6629 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 6630 /*FIXME:*/S->getWhileLoc(), Cond.get(), 6631 S->getRParenLoc()); 6632 } 6633 6634 template<typename Derived> 6635 StmtResult 6636 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 6637 // Transform the initialization statement 6638 StmtResult Init = getDerived().TransformStmt(S->getInit()); 6639 if (Init.isInvalid()) 6640 return StmtError(); 6641 6642 // In OpenMP loop region loop control variable must be captured and be 6643 // private. Perform analysis of first part (if any). 6644 if (getSema().getLangOpts().OpenMP && Init.isUsable()) 6645 getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get()); 6646 6647 // Transform the condition 6648 Sema::ConditionResult Cond = getDerived().TransformCondition( 6649 S->getForLoc(), S->getConditionVariable(), S->getCond(), 6650 Sema::ConditionKind::Boolean); 6651 if (Cond.isInvalid()) 6652 return StmtError(); 6653 6654 // Transform the increment 6655 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6656 if (Inc.isInvalid()) 6657 return StmtError(); 6658 6659 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 6660 if (S->getInc() && !FullInc.get()) 6661 return StmtError(); 6662 6663 // Transform the body 6664 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6665 if (Body.isInvalid()) 6666 return StmtError(); 6667 6668 if (!getDerived().AlwaysRebuild() && 6669 Init.get() == S->getInit() && 6670 Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) && 6671 Inc.get() == S->getInc() && 6672 Body.get() == S->getBody()) 6673 return S; 6674 6675 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 6676 Init.get(), Cond, FullInc, 6677 S->getRParenLoc(), Body.get()); 6678 } 6679 6680 template<typename Derived> 6681 StmtResult 6682 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 6683 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 6684 S->getLabel()); 6685 if (!LD) 6686 return StmtError(); 6687 6688 // Goto statements must always be rebuilt, to resolve the label. 6689 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 6690 cast<LabelDecl>(LD)); 6691 } 6692 6693 template<typename Derived> 6694 StmtResult 6695 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 6696 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 6697 if (Target.isInvalid()) 6698 return StmtError(); 6699 Target = SemaRef.MaybeCreateExprWithCleanups(Target.get()); 6700 6701 if (!getDerived().AlwaysRebuild() && 6702 Target.get() == S->getTarget()) 6703 return S; 6704 6705 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 6706 Target.get()); 6707 } 6708 6709 template<typename Derived> 6710 StmtResult 6711 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 6712 return S; 6713 } 6714 6715 template<typename Derived> 6716 StmtResult 6717 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 6718 return S; 6719 } 6720 6721 template<typename Derived> 6722 StmtResult 6723 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 6724 ExprResult Result = getDerived().TransformInitializer(S->getRetValue(), 6725 /*NotCopyInit*/false); 6726 if (Result.isInvalid()) 6727 return StmtError(); 6728 6729 // FIXME: We always rebuild the return statement because there is no way 6730 // to tell whether the return type of the function has changed. 6731 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 6732 } 6733 6734 template<typename Derived> 6735 StmtResult 6736 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 6737 bool DeclChanged = false; 6738 SmallVector<Decl *, 4> Decls; 6739 for (auto *D : S->decls()) { 6740 Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D); 6741 if (!Transformed) 6742 return StmtError(); 6743 6744 if (Transformed != D) 6745 DeclChanged = true; 6746 6747 Decls.push_back(Transformed); 6748 } 6749 6750 if (!getDerived().AlwaysRebuild() && !DeclChanged) 6751 return S; 6752 6753 return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc()); 6754 } 6755 6756 template<typename Derived> 6757 StmtResult 6758 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 6759 6760 SmallVector<Expr*, 8> Constraints; 6761 SmallVector<Expr*, 8> Exprs; 6762 SmallVector<IdentifierInfo *, 4> Names; 6763 6764 ExprResult AsmString; 6765 SmallVector<Expr*, 8> Clobbers; 6766 6767 bool ExprsChanged = false; 6768 6769 // Go through the outputs. 6770 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 6771 Names.push_back(S->getOutputIdentifier(I)); 6772 6773 // No need to transform the constraint literal. 6774 Constraints.push_back(S->getOutputConstraintLiteral(I)); 6775 6776 // Transform the output expr. 6777 Expr *OutputExpr = S->getOutputExpr(I); 6778 ExprResult Result = getDerived().TransformExpr(OutputExpr); 6779 if (Result.isInvalid()) 6780 return StmtError(); 6781 6782 ExprsChanged |= Result.get() != OutputExpr; 6783 6784 Exprs.push_back(Result.get()); 6785 } 6786 6787 // Go through the inputs. 6788 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 6789 Names.push_back(S->getInputIdentifier(I)); 6790 6791 // No need to transform the constraint literal. 6792 Constraints.push_back(S->getInputConstraintLiteral(I)); 6793 6794 // Transform the input expr. 6795 Expr *InputExpr = S->getInputExpr(I); 6796 ExprResult Result = getDerived().TransformExpr(InputExpr); 6797 if (Result.isInvalid()) 6798 return StmtError(); 6799 6800 ExprsChanged |= Result.get() != InputExpr; 6801 6802 Exprs.push_back(Result.get()); 6803 } 6804 6805 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 6806 return S; 6807 6808 // Go through the clobbers. 6809 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 6810 Clobbers.push_back(S->getClobberStringLiteral(I)); 6811 6812 // No need to transform the asm string literal. 6813 AsmString = S->getAsmString(); 6814 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 6815 S->isVolatile(), S->getNumOutputs(), 6816 S->getNumInputs(), Names.data(), 6817 Constraints, Exprs, AsmString.get(), 6818 Clobbers, S->getRParenLoc()); 6819 } 6820 6821 template<typename Derived> 6822 StmtResult 6823 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 6824 ArrayRef<Token> AsmToks = 6825 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 6826 6827 bool HadError = false, HadChange = false; 6828 6829 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 6830 SmallVector<Expr*, 8> TransformedExprs; 6831 TransformedExprs.reserve(SrcExprs.size()); 6832 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 6833 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 6834 if (!Result.isUsable()) { 6835 HadError = true; 6836 } else { 6837 HadChange |= (Result.get() != SrcExprs[i]); 6838 TransformedExprs.push_back(Result.get()); 6839 } 6840 } 6841 6842 if (HadError) return StmtError(); 6843 if (!HadChange && !getDerived().AlwaysRebuild()) 6844 return Owned(S); 6845 6846 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 6847 AsmToks, S->getAsmString(), 6848 S->getNumOutputs(), S->getNumInputs(), 6849 S->getAllConstraints(), S->getClobbers(), 6850 TransformedExprs, S->getEndLoc()); 6851 } 6852 6853 // C++ Coroutines TS 6854 6855 template<typename Derived> 6856 StmtResult 6857 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) { 6858 auto *ScopeInfo = SemaRef.getCurFunction(); 6859 auto *FD = cast<FunctionDecl>(SemaRef.CurContext); 6860 assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise && 6861 ScopeInfo->NeedsCoroutineSuspends && 6862 ScopeInfo->CoroutineSuspends.first == nullptr && 6863 ScopeInfo->CoroutineSuspends.second == nullptr && 6864 "expected clean scope info"); 6865 6866 // Set that we have (possibly-invalid) suspend points before we do anything 6867 // that may fail. 6868 ScopeInfo->setNeedsCoroutineSuspends(false); 6869 6870 // The new CoroutinePromise object needs to be built and put into the current 6871 // FunctionScopeInfo before any transformations or rebuilding occurs. 6872 auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation()); 6873 if (!Promise) 6874 return StmtError(); 6875 getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise); 6876 ScopeInfo->CoroutinePromise = Promise; 6877 6878 // Transform the implicit coroutine statements we built during the initial 6879 // parse. 6880 StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt()); 6881 if (InitSuspend.isInvalid()) 6882 return StmtError(); 6883 StmtResult FinalSuspend = 6884 getDerived().TransformStmt(S->getFinalSuspendStmt()); 6885 if (FinalSuspend.isInvalid()) 6886 return StmtError(); 6887 ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get()); 6888 assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get())); 6889 6890 StmtResult BodyRes = getDerived().TransformStmt(S->getBody()); 6891 if (BodyRes.isInvalid()) 6892 return StmtError(); 6893 6894 CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get()); 6895 if (Builder.isInvalid()) 6896 return StmtError(); 6897 6898 Expr *ReturnObject = S->getReturnValueInit(); 6899 assert(ReturnObject && "the return object is expected to be valid"); 6900 ExprResult Res = getDerived().TransformInitializer(ReturnObject, 6901 /*NoCopyInit*/ false); 6902 if (Res.isInvalid()) 6903 return StmtError(); 6904 Builder.ReturnValue = Res.get(); 6905 6906 if (S->hasDependentPromiseType()) { 6907 assert(!Promise->getType()->isDependentType() && 6908 "the promise type must no longer be dependent"); 6909 assert(!S->getFallthroughHandler() && !S->getExceptionHandler() && 6910 !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() && 6911 "these nodes should not have been built yet"); 6912 if (!Builder.buildDependentStatements()) 6913 return StmtError(); 6914 } else { 6915 if (auto *OnFallthrough = S->getFallthroughHandler()) { 6916 StmtResult Res = getDerived().TransformStmt(OnFallthrough); 6917 if (Res.isInvalid()) 6918 return StmtError(); 6919 Builder.OnFallthrough = Res.get(); 6920 } 6921 6922 if (auto *OnException = S->getExceptionHandler()) { 6923 StmtResult Res = getDerived().TransformStmt(OnException); 6924 if (Res.isInvalid()) 6925 return StmtError(); 6926 Builder.OnException = Res.get(); 6927 } 6928 6929 if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) { 6930 StmtResult Res = getDerived().TransformStmt(OnAllocFailure); 6931 if (Res.isInvalid()) 6932 return StmtError(); 6933 Builder.ReturnStmtOnAllocFailure = Res.get(); 6934 } 6935 6936 // Transform any additional statements we may have already built 6937 assert(S->getAllocate() && S->getDeallocate() && 6938 "allocation and deallocation calls must already be built"); 6939 ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate()); 6940 if (AllocRes.isInvalid()) 6941 return StmtError(); 6942 Builder.Allocate = AllocRes.get(); 6943 6944 ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate()); 6945 if (DeallocRes.isInvalid()) 6946 return StmtError(); 6947 Builder.Deallocate = DeallocRes.get(); 6948 } 6949 6950 return getDerived().RebuildCoroutineBodyStmt(Builder); 6951 } 6952 6953 template<typename Derived> 6954 StmtResult 6955 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 6956 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 6957 /*NotCopyInit*/false); 6958 if (Result.isInvalid()) 6959 return StmtError(); 6960 6961 // Always rebuild; we don't know if this needs to be injected into a new 6962 // context or if the promise type has changed. 6963 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 6964 S->isImplicit()); 6965 } 6966 6967 template<typename Derived> 6968 ExprResult 6969 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 6970 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 6971 /*NotCopyInit*/false); 6972 if (Result.isInvalid()) 6973 return ExprError(); 6974 6975 // Always rebuild; we don't know if this needs to be injected into a new 6976 // context or if the promise type has changed. 6977 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 6978 E->isImplicit()); 6979 } 6980 6981 template <typename Derived> 6982 ExprResult 6983 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 6984 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 6985 /*NotCopyInit*/ false); 6986 if (OperandResult.isInvalid()) 6987 return ExprError(); 6988 6989 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 6990 E->getOperatorCoawaitLookup()); 6991 6992 if (LookupResult.isInvalid()) 6993 return ExprError(); 6994 6995 // Always rebuild; we don't know if this needs to be injected into a new 6996 // context or if the promise type has changed. 6997 return getDerived().RebuildDependentCoawaitExpr( 6998 E->getKeywordLoc(), OperandResult.get(), 6999 cast<UnresolvedLookupExpr>(LookupResult.get())); 7000 } 7001 7002 template<typename Derived> 7003 ExprResult 7004 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7005 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7006 /*NotCopyInit*/false); 7007 if (Result.isInvalid()) 7008 return ExprError(); 7009 7010 // Always rebuild; we don't know if this needs to be injected into a new 7011 // context or if the promise type has changed. 7012 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7013 } 7014 7015 // Objective-C Statements. 7016 7017 template<typename Derived> 7018 StmtResult 7019 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7020 // Transform the body of the @try. 7021 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7022 if (TryBody.isInvalid()) 7023 return StmtError(); 7024 7025 // Transform the @catch statements (if present). 7026 bool AnyCatchChanged = false; 7027 SmallVector<Stmt*, 8> CatchStmts; 7028 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7029 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7030 if (Catch.isInvalid()) 7031 return StmtError(); 7032 if (Catch.get() != S->getCatchStmt(I)) 7033 AnyCatchChanged = true; 7034 CatchStmts.push_back(Catch.get()); 7035 } 7036 7037 // Transform the @finally statement (if present). 7038 StmtResult Finally; 7039 if (S->getFinallyStmt()) { 7040 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7041 if (Finally.isInvalid()) 7042 return StmtError(); 7043 } 7044 7045 // If nothing changed, just retain this statement. 7046 if (!getDerived().AlwaysRebuild() && 7047 TryBody.get() == S->getTryBody() && 7048 !AnyCatchChanged && 7049 Finally.get() == S->getFinallyStmt()) 7050 return S; 7051 7052 // Build a new statement. 7053 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7054 CatchStmts, Finally.get()); 7055 } 7056 7057 template<typename Derived> 7058 StmtResult 7059 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7060 // Transform the @catch parameter, if there is one. 7061 VarDecl *Var = nullptr; 7062 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7063 TypeSourceInfo *TSInfo = nullptr; 7064 if (FromVar->getTypeSourceInfo()) { 7065 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7066 if (!TSInfo) 7067 return StmtError(); 7068 } 7069 7070 QualType T; 7071 if (TSInfo) 7072 T = TSInfo->getType(); 7073 else { 7074 T = getDerived().TransformType(FromVar->getType()); 7075 if (T.isNull()) 7076 return StmtError(); 7077 } 7078 7079 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7080 if (!Var) 7081 return StmtError(); 7082 } 7083 7084 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7085 if (Body.isInvalid()) 7086 return StmtError(); 7087 7088 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7089 S->getRParenLoc(), 7090 Var, Body.get()); 7091 } 7092 7093 template<typename Derived> 7094 StmtResult 7095 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7096 // Transform the body. 7097 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7098 if (Body.isInvalid()) 7099 return StmtError(); 7100 7101 // If nothing changed, just retain this statement. 7102 if (!getDerived().AlwaysRebuild() && 7103 Body.get() == S->getFinallyBody()) 7104 return S; 7105 7106 // Build a new statement. 7107 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7108 Body.get()); 7109 } 7110 7111 template<typename Derived> 7112 StmtResult 7113 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7114 ExprResult Operand; 7115 if (S->getThrowExpr()) { 7116 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7117 if (Operand.isInvalid()) 7118 return StmtError(); 7119 } 7120 7121 if (!getDerived().AlwaysRebuild() && 7122 Operand.get() == S->getThrowExpr()) 7123 return S; 7124 7125 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7126 } 7127 7128 template<typename Derived> 7129 StmtResult 7130 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7131 ObjCAtSynchronizedStmt *S) { 7132 // Transform the object we are locking. 7133 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7134 if (Object.isInvalid()) 7135 return StmtError(); 7136 Object = 7137 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7138 Object.get()); 7139 if (Object.isInvalid()) 7140 return StmtError(); 7141 7142 // Transform the body. 7143 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7144 if (Body.isInvalid()) 7145 return StmtError(); 7146 7147 // If nothing change, just retain the current statement. 7148 if (!getDerived().AlwaysRebuild() && 7149 Object.get() == S->getSynchExpr() && 7150 Body.get() == S->getSynchBody()) 7151 return S; 7152 7153 // Build a new statement. 7154 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7155 Object.get(), Body.get()); 7156 } 7157 7158 template<typename Derived> 7159 StmtResult 7160 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7161 ObjCAutoreleasePoolStmt *S) { 7162 // Transform the body. 7163 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7164 if (Body.isInvalid()) 7165 return StmtError(); 7166 7167 // If nothing changed, just retain this statement. 7168 if (!getDerived().AlwaysRebuild() && 7169 Body.get() == S->getSubStmt()) 7170 return S; 7171 7172 // Build a new statement. 7173 return getDerived().RebuildObjCAutoreleasePoolStmt( 7174 S->getAtLoc(), Body.get()); 7175 } 7176 7177 template<typename Derived> 7178 StmtResult 7179 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7180 ObjCForCollectionStmt *S) { 7181 // Transform the element statement. 7182 StmtResult Element = getDerived().TransformStmt(S->getElement()); 7183 if (Element.isInvalid()) 7184 return StmtError(); 7185 7186 // Transform the collection expression. 7187 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7188 if (Collection.isInvalid()) 7189 return StmtError(); 7190 7191 // Transform the body. 7192 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7193 if (Body.isInvalid()) 7194 return StmtError(); 7195 7196 // If nothing changed, just retain this statement. 7197 if (!getDerived().AlwaysRebuild() && 7198 Element.get() == S->getElement() && 7199 Collection.get() == S->getCollection() && 7200 Body.get() == S->getBody()) 7201 return S; 7202 7203 // Build a new statement. 7204 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7205 Element.get(), 7206 Collection.get(), 7207 S->getRParenLoc(), 7208 Body.get()); 7209 } 7210 7211 template <typename Derived> 7212 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7213 // Transform the exception declaration, if any. 7214 VarDecl *Var = nullptr; 7215 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7216 TypeSourceInfo *T = 7217 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7218 if (!T) 7219 return StmtError(); 7220 7221 Var = getDerived().RebuildExceptionDecl( 7222 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7223 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7224 if (!Var || Var->isInvalidDecl()) 7225 return StmtError(); 7226 } 7227 7228 // Transform the actual exception handler. 7229 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7230 if (Handler.isInvalid()) 7231 return StmtError(); 7232 7233 if (!getDerived().AlwaysRebuild() && !Var && 7234 Handler.get() == S->getHandlerBlock()) 7235 return S; 7236 7237 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7238 } 7239 7240 template <typename Derived> 7241 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7242 // Transform the try block itself. 7243 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7244 if (TryBlock.isInvalid()) 7245 return StmtError(); 7246 7247 // Transform the handlers. 7248 bool HandlerChanged = false; 7249 SmallVector<Stmt *, 8> Handlers; 7250 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7251 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7252 if (Handler.isInvalid()) 7253 return StmtError(); 7254 7255 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7256 Handlers.push_back(Handler.getAs<Stmt>()); 7257 } 7258 7259 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7260 !HandlerChanged) 7261 return S; 7262 7263 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7264 Handlers); 7265 } 7266 7267 template<typename Derived> 7268 StmtResult 7269 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7270 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7271 if (Range.isInvalid()) 7272 return StmtError(); 7273 7274 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7275 if (Begin.isInvalid()) 7276 return StmtError(); 7277 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7278 if (End.isInvalid()) 7279 return StmtError(); 7280 7281 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7282 if (Cond.isInvalid()) 7283 return StmtError(); 7284 if (Cond.get()) 7285 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7286 if (Cond.isInvalid()) 7287 return StmtError(); 7288 if (Cond.get()) 7289 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7290 7291 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7292 if (Inc.isInvalid()) 7293 return StmtError(); 7294 if (Inc.get()) 7295 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7296 7297 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7298 if (LoopVar.isInvalid()) 7299 return StmtError(); 7300 7301 StmtResult NewStmt = S; 7302 if (getDerived().AlwaysRebuild() || 7303 Range.get() != S->getRangeStmt() || 7304 Begin.get() != S->getBeginStmt() || 7305 End.get() != S->getEndStmt() || 7306 Cond.get() != S->getCond() || 7307 Inc.get() != S->getInc() || 7308 LoopVar.get() != S->getLoopVarStmt()) { 7309 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7310 S->getCoawaitLoc(), 7311 S->getColonLoc(), Range.get(), 7312 Begin.get(), End.get(), 7313 Cond.get(), 7314 Inc.get(), LoopVar.get(), 7315 S->getRParenLoc()); 7316 if (NewStmt.isInvalid()) 7317 return StmtError(); 7318 } 7319 7320 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7321 if (Body.isInvalid()) 7322 return StmtError(); 7323 7324 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7325 // it now so we have a new statement to attach the body to. 7326 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7327 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7328 S->getCoawaitLoc(), 7329 S->getColonLoc(), Range.get(), 7330 Begin.get(), End.get(), 7331 Cond.get(), 7332 Inc.get(), LoopVar.get(), 7333 S->getRParenLoc()); 7334 if (NewStmt.isInvalid()) 7335 return StmtError(); 7336 } 7337 7338 if (NewStmt.get() == S) 7339 return S; 7340 7341 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7342 } 7343 7344 template<typename Derived> 7345 StmtResult 7346 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7347 MSDependentExistsStmt *S) { 7348 // Transform the nested-name-specifier, if any. 7349 NestedNameSpecifierLoc QualifierLoc; 7350 if (S->getQualifierLoc()) { 7351 QualifierLoc 7352 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7353 if (!QualifierLoc) 7354 return StmtError(); 7355 } 7356 7357 // Transform the declaration name. 7358 DeclarationNameInfo NameInfo = S->getNameInfo(); 7359 if (NameInfo.getName()) { 7360 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7361 if (!NameInfo.getName()) 7362 return StmtError(); 7363 } 7364 7365 // Check whether anything changed. 7366 if (!getDerived().AlwaysRebuild() && 7367 QualifierLoc == S->getQualifierLoc() && 7368 NameInfo.getName() == S->getNameInfo().getName()) 7369 return S; 7370 7371 // Determine whether this name exists, if we can. 7372 CXXScopeSpec SS; 7373 SS.Adopt(QualifierLoc); 7374 bool Dependent = false; 7375 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 7376 case Sema::IER_Exists: 7377 if (S->isIfExists()) 7378 break; 7379 7380 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7381 7382 case Sema::IER_DoesNotExist: 7383 if (S->isIfNotExists()) 7384 break; 7385 7386 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7387 7388 case Sema::IER_Dependent: 7389 Dependent = true; 7390 break; 7391 7392 case Sema::IER_Error: 7393 return StmtError(); 7394 } 7395 7396 // We need to continue with the instantiation, so do so now. 7397 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7398 if (SubStmt.isInvalid()) 7399 return StmtError(); 7400 7401 // If we have resolved the name, just transform to the substatement. 7402 if (!Dependent) 7403 return SubStmt; 7404 7405 // The name is still dependent, so build a dependent expression again. 7406 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7407 S->isIfExists(), 7408 QualifierLoc, 7409 NameInfo, 7410 SubStmt.get()); 7411 } 7412 7413 template<typename Derived> 7414 ExprResult 7415 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7416 NestedNameSpecifierLoc QualifierLoc; 7417 if (E->getQualifierLoc()) { 7418 QualifierLoc 7419 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7420 if (!QualifierLoc) 7421 return ExprError(); 7422 } 7423 7424 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7425 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7426 if (!PD) 7427 return ExprError(); 7428 7429 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7430 if (Base.isInvalid()) 7431 return ExprError(); 7432 7433 return new (SemaRef.getASTContext()) 7434 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 7435 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 7436 QualifierLoc, E->getMemberLoc()); 7437 } 7438 7439 template <typename Derived> 7440 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 7441 MSPropertySubscriptExpr *E) { 7442 auto BaseRes = getDerived().TransformExpr(E->getBase()); 7443 if (BaseRes.isInvalid()) 7444 return ExprError(); 7445 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 7446 if (IdxRes.isInvalid()) 7447 return ExprError(); 7448 7449 if (!getDerived().AlwaysRebuild() && 7450 BaseRes.get() == E->getBase() && 7451 IdxRes.get() == E->getIdx()) 7452 return E; 7453 7454 return getDerived().RebuildArraySubscriptExpr( 7455 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 7456 } 7457 7458 template <typename Derived> 7459 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 7460 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7461 if (TryBlock.isInvalid()) 7462 return StmtError(); 7463 7464 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 7465 if (Handler.isInvalid()) 7466 return StmtError(); 7467 7468 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7469 Handler.get() == S->getHandler()) 7470 return S; 7471 7472 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 7473 TryBlock.get(), Handler.get()); 7474 } 7475 7476 template <typename Derived> 7477 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 7478 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7479 if (Block.isInvalid()) 7480 return StmtError(); 7481 7482 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 7483 } 7484 7485 template <typename Derived> 7486 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 7487 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 7488 if (FilterExpr.isInvalid()) 7489 return StmtError(); 7490 7491 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7492 if (Block.isInvalid()) 7493 return StmtError(); 7494 7495 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 7496 Block.get()); 7497 } 7498 7499 template <typename Derived> 7500 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 7501 if (isa<SEHFinallyStmt>(Handler)) 7502 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 7503 else 7504 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 7505 } 7506 7507 template<typename Derived> 7508 StmtResult 7509 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 7510 return S; 7511 } 7512 7513 //===----------------------------------------------------------------------===// 7514 // OpenMP directive transformation 7515 //===----------------------------------------------------------------------===// 7516 template <typename Derived> 7517 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 7518 OMPExecutableDirective *D) { 7519 7520 // Transform the clauses 7521 llvm::SmallVector<OMPClause *, 16> TClauses; 7522 ArrayRef<OMPClause *> Clauses = D->clauses(); 7523 TClauses.reserve(Clauses.size()); 7524 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7525 I != E; ++I) { 7526 if (*I) { 7527 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 7528 OMPClause *Clause = getDerived().TransformOMPClause(*I); 7529 getDerived().getSema().EndOpenMPClause(); 7530 if (Clause) 7531 TClauses.push_back(Clause); 7532 } else { 7533 TClauses.push_back(nullptr); 7534 } 7535 } 7536 StmtResult AssociatedStmt; 7537 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 7538 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 7539 /*CurScope=*/nullptr); 7540 StmtResult Body; 7541 { 7542 Sema::CompoundScopeRAII CompoundScope(getSema()); 7543 int ThisCaptureLevel = 7544 Sema::getOpenMPCaptureLevels(D->getDirectiveKind()); 7545 Stmt *CS = D->getAssociatedStmt(); 7546 while (--ThisCaptureLevel >= 0) 7547 CS = cast<CapturedStmt>(CS)->getCapturedStmt(); 7548 Body = getDerived().TransformStmt(CS); 7549 } 7550 AssociatedStmt = 7551 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 7552 if (AssociatedStmt.isInvalid()) { 7553 return StmtError(); 7554 } 7555 } 7556 if (TClauses.size() != Clauses.size()) { 7557 return StmtError(); 7558 } 7559 7560 // Transform directive name for 'omp critical' directive. 7561 DeclarationNameInfo DirName; 7562 if (D->getDirectiveKind() == OMPD_critical) { 7563 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 7564 DirName = getDerived().TransformDeclarationNameInfo(DirName); 7565 } 7566 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 7567 if (D->getDirectiveKind() == OMPD_cancellation_point) { 7568 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 7569 } else if (D->getDirectiveKind() == OMPD_cancel) { 7570 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 7571 } 7572 7573 return getDerived().RebuildOMPExecutableDirective( 7574 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 7575 AssociatedStmt.get(), D->getLocStart(), D->getLocEnd()); 7576 } 7577 7578 template <typename Derived> 7579 StmtResult 7580 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 7581 DeclarationNameInfo DirName; 7582 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 7583 D->getLocStart()); 7584 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7585 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7586 return Res; 7587 } 7588 7589 template <typename Derived> 7590 StmtResult 7591 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 7592 DeclarationNameInfo DirName; 7593 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 7594 D->getLocStart()); 7595 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7596 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7597 return Res; 7598 } 7599 7600 template <typename Derived> 7601 StmtResult 7602 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 7603 DeclarationNameInfo DirName; 7604 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 7605 D->getLocStart()); 7606 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7607 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7608 return Res; 7609 } 7610 7611 template <typename Derived> 7612 StmtResult 7613 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 7614 DeclarationNameInfo DirName; 7615 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 7616 D->getLocStart()); 7617 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7618 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7619 return Res; 7620 } 7621 7622 template <typename Derived> 7623 StmtResult 7624 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 7625 DeclarationNameInfo DirName; 7626 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 7627 D->getLocStart()); 7628 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7629 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7630 return Res; 7631 } 7632 7633 template <typename Derived> 7634 StmtResult 7635 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 7636 DeclarationNameInfo DirName; 7637 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 7638 D->getLocStart()); 7639 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7640 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7641 return Res; 7642 } 7643 7644 template <typename Derived> 7645 StmtResult 7646 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 7647 DeclarationNameInfo DirName; 7648 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 7649 D->getLocStart()); 7650 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7651 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7652 return Res; 7653 } 7654 7655 template <typename Derived> 7656 StmtResult 7657 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 7658 DeclarationNameInfo DirName; 7659 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 7660 D->getLocStart()); 7661 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7662 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7663 return Res; 7664 } 7665 7666 template <typename Derived> 7667 StmtResult 7668 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 7669 getDerived().getSema().StartOpenMPDSABlock( 7670 OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart()); 7671 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7672 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7673 return Res; 7674 } 7675 7676 template <typename Derived> 7677 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 7678 OMPParallelForDirective *D) { 7679 DeclarationNameInfo DirName; 7680 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 7681 nullptr, D->getLocStart()); 7682 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7683 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7684 return Res; 7685 } 7686 7687 template <typename Derived> 7688 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 7689 OMPParallelForSimdDirective *D) { 7690 DeclarationNameInfo DirName; 7691 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 7692 nullptr, D->getLocStart()); 7693 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7694 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7695 return Res; 7696 } 7697 7698 template <typename Derived> 7699 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 7700 OMPParallelSectionsDirective *D) { 7701 DeclarationNameInfo DirName; 7702 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 7703 nullptr, D->getLocStart()); 7704 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7705 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7706 return Res; 7707 } 7708 7709 template <typename Derived> 7710 StmtResult 7711 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 7712 DeclarationNameInfo DirName; 7713 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 7714 D->getLocStart()); 7715 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7716 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7717 return Res; 7718 } 7719 7720 template <typename Derived> 7721 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 7722 OMPTaskyieldDirective *D) { 7723 DeclarationNameInfo DirName; 7724 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 7725 D->getLocStart()); 7726 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7727 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7728 return Res; 7729 } 7730 7731 template <typename Derived> 7732 StmtResult 7733 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 7734 DeclarationNameInfo DirName; 7735 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 7736 D->getLocStart()); 7737 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7738 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7739 return Res; 7740 } 7741 7742 template <typename Derived> 7743 StmtResult 7744 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 7745 DeclarationNameInfo DirName; 7746 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 7747 D->getLocStart()); 7748 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7749 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7750 return Res; 7751 } 7752 7753 template <typename Derived> 7754 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 7755 OMPTaskgroupDirective *D) { 7756 DeclarationNameInfo DirName; 7757 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 7758 D->getLocStart()); 7759 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7760 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7761 return Res; 7762 } 7763 7764 template <typename Derived> 7765 StmtResult 7766 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 7767 DeclarationNameInfo DirName; 7768 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 7769 D->getLocStart()); 7770 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7771 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7772 return Res; 7773 } 7774 7775 template <typename Derived> 7776 StmtResult 7777 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 7778 DeclarationNameInfo DirName; 7779 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 7780 D->getLocStart()); 7781 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7782 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7783 return Res; 7784 } 7785 7786 template <typename Derived> 7787 StmtResult 7788 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 7789 DeclarationNameInfo DirName; 7790 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 7791 D->getLocStart()); 7792 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7793 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7794 return Res; 7795 } 7796 7797 template <typename Derived> 7798 StmtResult 7799 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 7800 DeclarationNameInfo DirName; 7801 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 7802 D->getLocStart()); 7803 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7804 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7805 return Res; 7806 } 7807 7808 template <typename Derived> 7809 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 7810 OMPTargetDataDirective *D) { 7811 DeclarationNameInfo DirName; 7812 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 7813 D->getLocStart()); 7814 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7815 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7816 return Res; 7817 } 7818 7819 template <typename Derived> 7820 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 7821 OMPTargetEnterDataDirective *D) { 7822 DeclarationNameInfo DirName; 7823 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 7824 nullptr, D->getLocStart()); 7825 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7826 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7827 return Res; 7828 } 7829 7830 template <typename Derived> 7831 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 7832 OMPTargetExitDataDirective *D) { 7833 DeclarationNameInfo DirName; 7834 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 7835 nullptr, D->getLocStart()); 7836 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7837 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7838 return Res; 7839 } 7840 7841 template <typename Derived> 7842 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 7843 OMPTargetParallelDirective *D) { 7844 DeclarationNameInfo DirName; 7845 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 7846 nullptr, D->getLocStart()); 7847 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7848 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7849 return Res; 7850 } 7851 7852 template <typename Derived> 7853 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 7854 OMPTargetParallelForDirective *D) { 7855 DeclarationNameInfo DirName; 7856 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 7857 nullptr, D->getLocStart()); 7858 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7859 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7860 return Res; 7861 } 7862 7863 template <typename Derived> 7864 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 7865 OMPTargetUpdateDirective *D) { 7866 DeclarationNameInfo DirName; 7867 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 7868 nullptr, D->getLocStart()); 7869 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7870 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7871 return Res; 7872 } 7873 7874 template <typename Derived> 7875 StmtResult 7876 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 7877 DeclarationNameInfo DirName; 7878 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 7879 D->getLocStart()); 7880 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7881 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7882 return Res; 7883 } 7884 7885 template <typename Derived> 7886 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 7887 OMPCancellationPointDirective *D) { 7888 DeclarationNameInfo DirName; 7889 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 7890 nullptr, D->getLocStart()); 7891 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7892 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7893 return Res; 7894 } 7895 7896 template <typename Derived> 7897 StmtResult 7898 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 7899 DeclarationNameInfo DirName; 7900 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 7901 D->getLocStart()); 7902 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7903 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7904 return Res; 7905 } 7906 7907 template <typename Derived> 7908 StmtResult 7909 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 7910 DeclarationNameInfo DirName; 7911 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 7912 D->getLocStart()); 7913 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7914 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7915 return Res; 7916 } 7917 7918 template <typename Derived> 7919 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 7920 OMPTaskLoopSimdDirective *D) { 7921 DeclarationNameInfo DirName; 7922 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 7923 nullptr, D->getLocStart()); 7924 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7925 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7926 return Res; 7927 } 7928 7929 template <typename Derived> 7930 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 7931 OMPDistributeDirective *D) { 7932 DeclarationNameInfo DirName; 7933 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 7934 D->getLocStart()); 7935 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7936 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7937 return Res; 7938 } 7939 7940 template <typename Derived> 7941 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 7942 OMPDistributeParallelForDirective *D) { 7943 DeclarationNameInfo DirName; 7944 getDerived().getSema().StartOpenMPDSABlock( 7945 OMPD_distribute_parallel_for, DirName, nullptr, D->getLocStart()); 7946 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7947 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7948 return Res; 7949 } 7950 7951 template <typename Derived> 7952 StmtResult 7953 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 7954 OMPDistributeParallelForSimdDirective *D) { 7955 DeclarationNameInfo DirName; 7956 getDerived().getSema().StartOpenMPDSABlock( 7957 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart()); 7958 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7959 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7960 return Res; 7961 } 7962 7963 template <typename Derived> 7964 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 7965 OMPDistributeSimdDirective *D) { 7966 DeclarationNameInfo DirName; 7967 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 7968 nullptr, D->getLocStart()); 7969 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7970 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7971 return Res; 7972 } 7973 7974 template <typename Derived> 7975 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 7976 OMPTargetParallelForSimdDirective *D) { 7977 DeclarationNameInfo DirName; 7978 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for_simd, 7979 DirName, nullptr, 7980 D->getLocStart()); 7981 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7982 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7983 return Res; 7984 } 7985 7986 template <typename Derived> 7987 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 7988 OMPTargetSimdDirective *D) { 7989 DeclarationNameInfo DirName; 7990 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 7991 D->getLocStart()); 7992 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7993 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7994 return Res; 7995 } 7996 7997 template <typename Derived> 7998 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 7999 OMPTeamsDistributeDirective *D) { 8000 DeclarationNameInfo DirName; 8001 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8002 nullptr, D->getLocStart()); 8003 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8004 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8005 return Res; 8006 } 8007 8008 template <typename Derived> 8009 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8010 OMPTeamsDistributeSimdDirective *D) { 8011 DeclarationNameInfo DirName; 8012 getDerived().getSema().StartOpenMPDSABlock( 8013 OMPD_teams_distribute_simd, DirName, nullptr, D->getLocStart()); 8014 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8015 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8016 return Res; 8017 } 8018 8019 template <typename Derived> 8020 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8021 OMPTeamsDistributeParallelForSimdDirective *D) { 8022 DeclarationNameInfo DirName; 8023 getDerived().getSema().StartOpenMPDSABlock( 8024 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart()); 8025 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8026 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8027 return Res; 8028 } 8029 8030 template <typename Derived> 8031 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8032 OMPTeamsDistributeParallelForDirective *D) { 8033 DeclarationNameInfo DirName; 8034 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute_parallel_for, 8035 DirName, nullptr, D->getLocStart()); 8036 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8037 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8038 return Res; 8039 } 8040 8041 template <typename Derived> 8042 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8043 OMPTargetTeamsDirective *D) { 8044 DeclarationNameInfo DirName; 8045 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8046 nullptr, D->getLocStart()); 8047 auto Res = getDerived().TransformOMPExecutableDirective(D); 8048 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8049 return Res; 8050 } 8051 8052 template <typename Derived> 8053 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8054 OMPTargetTeamsDistributeDirective *D) { 8055 DeclarationNameInfo DirName; 8056 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_distribute, 8057 DirName, nullptr, D->getLocStart()); 8058 auto Res = getDerived().TransformOMPExecutableDirective(D); 8059 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8060 return Res; 8061 } 8062 8063 template <typename Derived> 8064 StmtResult 8065 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8066 OMPTargetTeamsDistributeParallelForDirective *D) { 8067 DeclarationNameInfo DirName; 8068 getDerived().getSema().StartOpenMPDSABlock( 8069 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8070 D->getLocStart()); 8071 auto Res = getDerived().TransformOMPExecutableDirective(D); 8072 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8073 return Res; 8074 } 8075 8076 template <typename Derived> 8077 StmtResult TreeTransform<Derived>:: 8078 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8079 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8080 DeclarationNameInfo DirName; 8081 getDerived().getSema().StartOpenMPDSABlock( 8082 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8083 D->getLocStart()); 8084 auto Res = getDerived().TransformOMPExecutableDirective(D); 8085 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8086 return Res; 8087 } 8088 8089 template <typename Derived> 8090 StmtResult 8091 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8092 OMPTargetTeamsDistributeSimdDirective *D) { 8093 DeclarationNameInfo DirName; 8094 getDerived().getSema().StartOpenMPDSABlock( 8095 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getLocStart()); 8096 auto Res = getDerived().TransformOMPExecutableDirective(D); 8097 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8098 return Res; 8099 } 8100 8101 8102 //===----------------------------------------------------------------------===// 8103 // OpenMP clause transformation 8104 //===----------------------------------------------------------------------===// 8105 template <typename Derived> 8106 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8107 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8108 if (Cond.isInvalid()) 8109 return nullptr; 8110 return getDerived().RebuildOMPIfClause( 8111 C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(), 8112 C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd()); 8113 } 8114 8115 template <typename Derived> 8116 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8117 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8118 if (Cond.isInvalid()) 8119 return nullptr; 8120 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(), 8121 C->getLParenLoc(), C->getLocEnd()); 8122 } 8123 8124 template <typename Derived> 8125 OMPClause * 8126 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8127 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8128 if (NumThreads.isInvalid()) 8129 return nullptr; 8130 return getDerived().RebuildOMPNumThreadsClause( 8131 NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8132 } 8133 8134 template <typename Derived> 8135 OMPClause * 8136 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8137 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8138 if (E.isInvalid()) 8139 return nullptr; 8140 return getDerived().RebuildOMPSafelenClause( 8141 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8142 } 8143 8144 template <typename Derived> 8145 OMPClause * 8146 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8147 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8148 if (E.isInvalid()) 8149 return nullptr; 8150 return getDerived().RebuildOMPSimdlenClause( 8151 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8152 } 8153 8154 template <typename Derived> 8155 OMPClause * 8156 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8157 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8158 if (E.isInvalid()) 8159 return nullptr; 8160 return getDerived().RebuildOMPCollapseClause( 8161 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8162 } 8163 8164 template <typename Derived> 8165 OMPClause * 8166 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8167 return getDerived().RebuildOMPDefaultClause( 8168 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(), 8169 C->getLParenLoc(), C->getLocEnd()); 8170 } 8171 8172 template <typename Derived> 8173 OMPClause * 8174 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8175 return getDerived().RebuildOMPProcBindClause( 8176 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(), 8177 C->getLParenLoc(), C->getLocEnd()); 8178 } 8179 8180 template <typename Derived> 8181 OMPClause * 8182 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8183 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8184 if (E.isInvalid()) 8185 return nullptr; 8186 return getDerived().RebuildOMPScheduleClause( 8187 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8188 C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(), 8189 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8190 C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd()); 8191 } 8192 8193 template <typename Derived> 8194 OMPClause * 8195 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8196 ExprResult E; 8197 if (auto *Num = C->getNumForLoops()) { 8198 E = getDerived().TransformExpr(Num); 8199 if (E.isInvalid()) 8200 return nullptr; 8201 } 8202 return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(), 8203 C->getLParenLoc(), E.get()); 8204 } 8205 8206 template <typename Derived> 8207 OMPClause * 8208 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8209 // No need to rebuild this clause, no template-dependent parameters. 8210 return C; 8211 } 8212 8213 template <typename Derived> 8214 OMPClause * 8215 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8216 // No need to rebuild this clause, no template-dependent parameters. 8217 return C; 8218 } 8219 8220 template <typename Derived> 8221 OMPClause * 8222 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8223 // No need to rebuild this clause, no template-dependent parameters. 8224 return C; 8225 } 8226 8227 template <typename Derived> 8228 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8229 // No need to rebuild this clause, no template-dependent parameters. 8230 return C; 8231 } 8232 8233 template <typename Derived> 8234 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8235 // No need to rebuild this clause, no template-dependent parameters. 8236 return C; 8237 } 8238 8239 template <typename Derived> 8240 OMPClause * 8241 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8242 // No need to rebuild this clause, no template-dependent parameters. 8243 return C; 8244 } 8245 8246 template <typename Derived> 8247 OMPClause * 8248 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8249 // No need to rebuild this clause, no template-dependent parameters. 8250 return C; 8251 } 8252 8253 template <typename Derived> 8254 OMPClause * 8255 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8256 // No need to rebuild this clause, no template-dependent parameters. 8257 return C; 8258 } 8259 8260 template <typename Derived> 8261 OMPClause * 8262 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8263 // No need to rebuild this clause, no template-dependent parameters. 8264 return C; 8265 } 8266 8267 template <typename Derived> 8268 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8269 // No need to rebuild this clause, no template-dependent parameters. 8270 return C; 8271 } 8272 8273 template <typename Derived> 8274 OMPClause * 8275 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8276 // No need to rebuild this clause, no template-dependent parameters. 8277 return C; 8278 } 8279 8280 template <typename Derived> 8281 OMPClause * 8282 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 8283 llvm::SmallVector<Expr *, 16> Vars; 8284 Vars.reserve(C->varlist_size()); 8285 for (auto *VE : C->varlists()) { 8286 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8287 if (EVar.isInvalid()) 8288 return nullptr; 8289 Vars.push_back(EVar.get()); 8290 } 8291 return getDerived().RebuildOMPPrivateClause( 8292 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8293 } 8294 8295 template <typename Derived> 8296 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 8297 OMPFirstprivateClause *C) { 8298 llvm::SmallVector<Expr *, 16> Vars; 8299 Vars.reserve(C->varlist_size()); 8300 for (auto *VE : C->varlists()) { 8301 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8302 if (EVar.isInvalid()) 8303 return nullptr; 8304 Vars.push_back(EVar.get()); 8305 } 8306 return getDerived().RebuildOMPFirstprivateClause( 8307 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8308 } 8309 8310 template <typename Derived> 8311 OMPClause * 8312 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) { 8313 llvm::SmallVector<Expr *, 16> Vars; 8314 Vars.reserve(C->varlist_size()); 8315 for (auto *VE : C->varlists()) { 8316 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8317 if (EVar.isInvalid()) 8318 return nullptr; 8319 Vars.push_back(EVar.get()); 8320 } 8321 return getDerived().RebuildOMPLastprivateClause( 8322 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8323 } 8324 8325 template <typename Derived> 8326 OMPClause * 8327 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 8328 llvm::SmallVector<Expr *, 16> Vars; 8329 Vars.reserve(C->varlist_size()); 8330 for (auto *VE : C->varlists()) { 8331 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8332 if (EVar.isInvalid()) 8333 return nullptr; 8334 Vars.push_back(EVar.get()); 8335 } 8336 return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(), 8337 C->getLParenLoc(), C->getLocEnd()); 8338 } 8339 8340 template <typename Derived> 8341 OMPClause * 8342 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 8343 llvm::SmallVector<Expr *, 16> Vars; 8344 Vars.reserve(C->varlist_size()); 8345 for (auto *VE : C->varlists()) { 8346 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8347 if (EVar.isInvalid()) 8348 return nullptr; 8349 Vars.push_back(EVar.get()); 8350 } 8351 CXXScopeSpec ReductionIdScopeSpec; 8352 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8353 8354 DeclarationNameInfo NameInfo = C->getNameInfo(); 8355 if (NameInfo.getName()) { 8356 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8357 if (!NameInfo.getName()) 8358 return nullptr; 8359 } 8360 // Build a list of all UDR decls with the same names ranged by the Scopes. 8361 // The Scope boundary is a duplication of the previous decl. 8362 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8363 for (auto *E : C->reduction_ops()) { 8364 // Transform all the decls. 8365 if (E) { 8366 auto *ULE = cast<UnresolvedLookupExpr>(E); 8367 UnresolvedSet<8> Decls; 8368 for (auto *D : ULE->decls()) { 8369 NamedDecl *InstD = 8370 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8371 Decls.addDecl(InstD, InstD->getAccess()); 8372 } 8373 UnresolvedReductions.push_back( 8374 UnresolvedLookupExpr::Create( 8375 SemaRef.Context, /*NamingClass=*/nullptr, 8376 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 8377 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 8378 Decls.begin(), Decls.end())); 8379 } else 8380 UnresolvedReductions.push_back(nullptr); 8381 } 8382 return getDerived().RebuildOMPReductionClause( 8383 Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(), 8384 C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8385 } 8386 8387 template <typename Derived> 8388 OMPClause * 8389 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 8390 llvm::SmallVector<Expr *, 16> Vars; 8391 Vars.reserve(C->varlist_size()); 8392 for (auto *VE : C->varlists()) { 8393 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8394 if (EVar.isInvalid()) 8395 return nullptr; 8396 Vars.push_back(EVar.get()); 8397 } 8398 ExprResult Step = getDerived().TransformExpr(C->getStep()); 8399 if (Step.isInvalid()) 8400 return nullptr; 8401 return getDerived().RebuildOMPLinearClause( 8402 Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(), 8403 C->getModifierLoc(), C->getColonLoc(), C->getLocEnd()); 8404 } 8405 8406 template <typename Derived> 8407 OMPClause * 8408 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 8409 llvm::SmallVector<Expr *, 16> Vars; 8410 Vars.reserve(C->varlist_size()); 8411 for (auto *VE : C->varlists()) { 8412 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8413 if (EVar.isInvalid()) 8414 return nullptr; 8415 Vars.push_back(EVar.get()); 8416 } 8417 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 8418 if (Alignment.isInvalid()) 8419 return nullptr; 8420 return getDerived().RebuildOMPAlignedClause( 8421 Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(), 8422 C->getColonLoc(), C->getLocEnd()); 8423 } 8424 8425 template <typename Derived> 8426 OMPClause * 8427 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) { 8428 llvm::SmallVector<Expr *, 16> Vars; 8429 Vars.reserve(C->varlist_size()); 8430 for (auto *VE : C->varlists()) { 8431 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8432 if (EVar.isInvalid()) 8433 return nullptr; 8434 Vars.push_back(EVar.get()); 8435 } 8436 return getDerived().RebuildOMPCopyinClause(Vars, C->getLocStart(), 8437 C->getLParenLoc(), C->getLocEnd()); 8438 } 8439 8440 template <typename Derived> 8441 OMPClause * 8442 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 8443 llvm::SmallVector<Expr *, 16> Vars; 8444 Vars.reserve(C->varlist_size()); 8445 for (auto *VE : C->varlists()) { 8446 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8447 if (EVar.isInvalid()) 8448 return nullptr; 8449 Vars.push_back(EVar.get()); 8450 } 8451 return getDerived().RebuildOMPCopyprivateClause( 8452 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8453 } 8454 8455 template <typename Derived> 8456 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) { 8457 llvm::SmallVector<Expr *, 16> Vars; 8458 Vars.reserve(C->varlist_size()); 8459 for (auto *VE : C->varlists()) { 8460 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8461 if (EVar.isInvalid()) 8462 return nullptr; 8463 Vars.push_back(EVar.get()); 8464 } 8465 return getDerived().RebuildOMPFlushClause(Vars, C->getLocStart(), 8466 C->getLParenLoc(), C->getLocEnd()); 8467 } 8468 8469 template <typename Derived> 8470 OMPClause * 8471 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 8472 llvm::SmallVector<Expr *, 16> Vars; 8473 Vars.reserve(C->varlist_size()); 8474 for (auto *VE : C->varlists()) { 8475 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8476 if (EVar.isInvalid()) 8477 return nullptr; 8478 Vars.push_back(EVar.get()); 8479 } 8480 return getDerived().RebuildOMPDependClause( 8481 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 8482 C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8483 } 8484 8485 template <typename Derived> 8486 OMPClause * 8487 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 8488 ExprResult E = getDerived().TransformExpr(C->getDevice()); 8489 if (E.isInvalid()) 8490 return nullptr; 8491 return getDerived().RebuildOMPDeviceClause( 8492 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8493 } 8494 8495 template <typename Derived> 8496 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 8497 llvm::SmallVector<Expr *, 16> Vars; 8498 Vars.reserve(C->varlist_size()); 8499 for (auto *VE : C->varlists()) { 8500 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8501 if (EVar.isInvalid()) 8502 return nullptr; 8503 Vars.push_back(EVar.get()); 8504 } 8505 return getDerived().RebuildOMPMapClause( 8506 C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(), 8507 C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(), 8508 C->getLParenLoc(), C->getLocEnd()); 8509 } 8510 8511 template <typename Derived> 8512 OMPClause * 8513 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 8514 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 8515 if (E.isInvalid()) 8516 return nullptr; 8517 return getDerived().RebuildOMPNumTeamsClause( 8518 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8519 } 8520 8521 template <typename Derived> 8522 OMPClause * 8523 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 8524 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 8525 if (E.isInvalid()) 8526 return nullptr; 8527 return getDerived().RebuildOMPThreadLimitClause( 8528 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8529 } 8530 8531 template <typename Derived> 8532 OMPClause * 8533 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 8534 ExprResult E = getDerived().TransformExpr(C->getPriority()); 8535 if (E.isInvalid()) 8536 return nullptr; 8537 return getDerived().RebuildOMPPriorityClause( 8538 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8539 } 8540 8541 template <typename Derived> 8542 OMPClause * 8543 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 8544 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 8545 if (E.isInvalid()) 8546 return nullptr; 8547 return getDerived().RebuildOMPGrainsizeClause( 8548 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8549 } 8550 8551 template <typename Derived> 8552 OMPClause * 8553 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 8554 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 8555 if (E.isInvalid()) 8556 return nullptr; 8557 return getDerived().RebuildOMPNumTasksClause( 8558 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8559 } 8560 8561 template <typename Derived> 8562 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 8563 ExprResult E = getDerived().TransformExpr(C->getHint()); 8564 if (E.isInvalid()) 8565 return nullptr; 8566 return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(), 8567 C->getLParenLoc(), C->getLocEnd()); 8568 } 8569 8570 template <typename Derived> 8571 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 8572 OMPDistScheduleClause *C) { 8573 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8574 if (E.isInvalid()) 8575 return nullptr; 8576 return getDerived().RebuildOMPDistScheduleClause( 8577 C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(), 8578 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd()); 8579 } 8580 8581 template <typename Derived> 8582 OMPClause * 8583 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 8584 return C; 8585 } 8586 8587 template <typename Derived> 8588 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 8589 llvm::SmallVector<Expr *, 16> Vars; 8590 Vars.reserve(C->varlist_size()); 8591 for (auto *VE : C->varlists()) { 8592 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8593 if (EVar.isInvalid()) 8594 return 0; 8595 Vars.push_back(EVar.get()); 8596 } 8597 return getDerived().RebuildOMPToClause(Vars, C->getLocStart(), 8598 C->getLParenLoc(), C->getLocEnd()); 8599 } 8600 8601 template <typename Derived> 8602 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) { 8603 llvm::SmallVector<Expr *, 16> Vars; 8604 Vars.reserve(C->varlist_size()); 8605 for (auto *VE : C->varlists()) { 8606 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8607 if (EVar.isInvalid()) 8608 return 0; 8609 Vars.push_back(EVar.get()); 8610 } 8611 return getDerived().RebuildOMPFromClause(Vars, C->getLocStart(), 8612 C->getLParenLoc(), C->getLocEnd()); 8613 } 8614 8615 template <typename Derived> 8616 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 8617 OMPUseDevicePtrClause *C) { 8618 llvm::SmallVector<Expr *, 16> Vars; 8619 Vars.reserve(C->varlist_size()); 8620 for (auto *VE : C->varlists()) { 8621 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8622 if (EVar.isInvalid()) 8623 return nullptr; 8624 Vars.push_back(EVar.get()); 8625 } 8626 return getDerived().RebuildOMPUseDevicePtrClause( 8627 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8628 } 8629 8630 template <typename Derived> 8631 OMPClause * 8632 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 8633 llvm::SmallVector<Expr *, 16> Vars; 8634 Vars.reserve(C->varlist_size()); 8635 for (auto *VE : C->varlists()) { 8636 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8637 if (EVar.isInvalid()) 8638 return nullptr; 8639 Vars.push_back(EVar.get()); 8640 } 8641 return getDerived().RebuildOMPIsDevicePtrClause( 8642 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8643 } 8644 8645 //===----------------------------------------------------------------------===// 8646 // Expression transformation 8647 //===----------------------------------------------------------------------===// 8648 template<typename Derived> 8649 ExprResult 8650 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 8651 if (!E->isTypeDependent()) 8652 return E; 8653 8654 return getDerived().RebuildPredefinedExpr(E->getLocation(), 8655 E->getIdentType()); 8656 } 8657 8658 template<typename Derived> 8659 ExprResult 8660 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 8661 NestedNameSpecifierLoc QualifierLoc; 8662 if (E->getQualifierLoc()) { 8663 QualifierLoc 8664 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8665 if (!QualifierLoc) 8666 return ExprError(); 8667 } 8668 8669 ValueDecl *ND 8670 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 8671 E->getDecl())); 8672 if (!ND) 8673 return ExprError(); 8674 8675 DeclarationNameInfo NameInfo = E->getNameInfo(); 8676 if (NameInfo.getName()) { 8677 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8678 if (!NameInfo.getName()) 8679 return ExprError(); 8680 } 8681 8682 if (!getDerived().AlwaysRebuild() && 8683 QualifierLoc == E->getQualifierLoc() && 8684 ND == E->getDecl() && 8685 NameInfo.getName() == E->getDecl()->getDeclName() && 8686 !E->hasExplicitTemplateArgs()) { 8687 8688 // Mark it referenced in the new context regardless. 8689 // FIXME: this is a bit instantiation-specific. 8690 SemaRef.MarkDeclRefReferenced(E); 8691 8692 return E; 8693 } 8694 8695 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 8696 if (E->hasExplicitTemplateArgs()) { 8697 TemplateArgs = &TransArgs; 8698 TransArgs.setLAngleLoc(E->getLAngleLoc()); 8699 TransArgs.setRAngleLoc(E->getRAngleLoc()); 8700 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 8701 E->getNumTemplateArgs(), 8702 TransArgs)) 8703 return ExprError(); 8704 } 8705 8706 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 8707 TemplateArgs); 8708 } 8709 8710 template<typename Derived> 8711 ExprResult 8712 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 8713 return E; 8714 } 8715 8716 template<typename Derived> 8717 ExprResult 8718 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 8719 return E; 8720 } 8721 8722 template<typename Derived> 8723 ExprResult 8724 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 8725 return E; 8726 } 8727 8728 template<typename Derived> 8729 ExprResult 8730 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 8731 return E; 8732 } 8733 8734 template<typename Derived> 8735 ExprResult 8736 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 8737 return E; 8738 } 8739 8740 template<typename Derived> 8741 ExprResult 8742 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 8743 if (FunctionDecl *FD = E->getDirectCallee()) 8744 SemaRef.MarkFunctionReferenced(E->getLocStart(), FD); 8745 return SemaRef.MaybeBindToTemporary(E); 8746 } 8747 8748 template<typename Derived> 8749 ExprResult 8750 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 8751 ExprResult ControllingExpr = 8752 getDerived().TransformExpr(E->getControllingExpr()); 8753 if (ControllingExpr.isInvalid()) 8754 return ExprError(); 8755 8756 SmallVector<Expr *, 4> AssocExprs; 8757 SmallVector<TypeSourceInfo *, 4> AssocTypes; 8758 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 8759 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 8760 if (TS) { 8761 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 8762 if (!AssocType) 8763 return ExprError(); 8764 AssocTypes.push_back(AssocType); 8765 } else { 8766 AssocTypes.push_back(nullptr); 8767 } 8768 8769 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 8770 if (AssocExpr.isInvalid()) 8771 return ExprError(); 8772 AssocExprs.push_back(AssocExpr.get()); 8773 } 8774 8775 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 8776 E->getDefaultLoc(), 8777 E->getRParenLoc(), 8778 ControllingExpr.get(), 8779 AssocTypes, 8780 AssocExprs); 8781 } 8782 8783 template<typename Derived> 8784 ExprResult 8785 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 8786 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 8787 if (SubExpr.isInvalid()) 8788 return ExprError(); 8789 8790 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 8791 return E; 8792 8793 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 8794 E->getRParen()); 8795 } 8796 8797 /// \brief The operand of a unary address-of operator has special rules: it's 8798 /// allowed to refer to a non-static member of a class even if there's no 'this' 8799 /// object available. 8800 template<typename Derived> 8801 ExprResult 8802 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 8803 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 8804 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 8805 else 8806 return getDerived().TransformExpr(E); 8807 } 8808 8809 template<typename Derived> 8810 ExprResult 8811 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 8812 ExprResult SubExpr; 8813 if (E->getOpcode() == UO_AddrOf) 8814 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 8815 else 8816 SubExpr = TransformExpr(E->getSubExpr()); 8817 if (SubExpr.isInvalid()) 8818 return ExprError(); 8819 8820 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 8821 return E; 8822 8823 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 8824 E->getOpcode(), 8825 SubExpr.get()); 8826 } 8827 8828 template<typename Derived> 8829 ExprResult 8830 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 8831 // Transform the type. 8832 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 8833 if (!Type) 8834 return ExprError(); 8835 8836 // Transform all of the components into components similar to what the 8837 // parser uses. 8838 // FIXME: It would be slightly more efficient in the non-dependent case to 8839 // just map FieldDecls, rather than requiring the rebuilder to look for 8840 // the fields again. However, __builtin_offsetof is rare enough in 8841 // template code that we don't care. 8842 bool ExprChanged = false; 8843 typedef Sema::OffsetOfComponent Component; 8844 SmallVector<Component, 4> Components; 8845 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 8846 const OffsetOfNode &ON = E->getComponent(I); 8847 Component Comp; 8848 Comp.isBrackets = true; 8849 Comp.LocStart = ON.getSourceRange().getBegin(); 8850 Comp.LocEnd = ON.getSourceRange().getEnd(); 8851 switch (ON.getKind()) { 8852 case OffsetOfNode::Array: { 8853 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 8854 ExprResult Index = getDerived().TransformExpr(FromIndex); 8855 if (Index.isInvalid()) 8856 return ExprError(); 8857 8858 ExprChanged = ExprChanged || Index.get() != FromIndex; 8859 Comp.isBrackets = true; 8860 Comp.U.E = Index.get(); 8861 break; 8862 } 8863 8864 case OffsetOfNode::Field: 8865 case OffsetOfNode::Identifier: 8866 Comp.isBrackets = false; 8867 Comp.U.IdentInfo = ON.getFieldName(); 8868 if (!Comp.U.IdentInfo) 8869 continue; 8870 8871 break; 8872 8873 case OffsetOfNode::Base: 8874 // Will be recomputed during the rebuild. 8875 continue; 8876 } 8877 8878 Components.push_back(Comp); 8879 } 8880 8881 // If nothing changed, retain the existing expression. 8882 if (!getDerived().AlwaysRebuild() && 8883 Type == E->getTypeSourceInfo() && 8884 !ExprChanged) 8885 return E; 8886 8887 // Build a new offsetof expression. 8888 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 8889 Components, E->getRParenLoc()); 8890 } 8891 8892 template<typename Derived> 8893 ExprResult 8894 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 8895 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 8896 "opaque value expression requires transformation"); 8897 return E; 8898 } 8899 8900 template<typename Derived> 8901 ExprResult 8902 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 8903 return E; 8904 } 8905 8906 template<typename Derived> 8907 ExprResult 8908 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 8909 // Rebuild the syntactic form. The original syntactic form has 8910 // opaque-value expressions in it, so strip those away and rebuild 8911 // the result. This is a really awful way of doing this, but the 8912 // better solution (rebuilding the semantic expressions and 8913 // rebinding OVEs as necessary) doesn't work; we'd need 8914 // TreeTransform to not strip away implicit conversions. 8915 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 8916 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 8917 if (result.isInvalid()) return ExprError(); 8918 8919 // If that gives us a pseudo-object result back, the pseudo-object 8920 // expression must have been an lvalue-to-rvalue conversion which we 8921 // should reapply. 8922 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 8923 result = SemaRef.checkPseudoObjectRValue(result.get()); 8924 8925 return result; 8926 } 8927 8928 template<typename Derived> 8929 ExprResult 8930 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 8931 UnaryExprOrTypeTraitExpr *E) { 8932 if (E->isArgumentType()) { 8933 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 8934 8935 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 8936 if (!NewT) 8937 return ExprError(); 8938 8939 if (!getDerived().AlwaysRebuild() && OldT == NewT) 8940 return E; 8941 8942 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 8943 E->getKind(), 8944 E->getSourceRange()); 8945 } 8946 8947 // C++0x [expr.sizeof]p1: 8948 // The operand is either an expression, which is an unevaluated operand 8949 // [...] 8950 EnterExpressionEvaluationContext Unevaluated( 8951 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 8952 Sema::ReuseLambdaContextDecl); 8953 8954 // Try to recover if we have something like sizeof(T::X) where X is a type. 8955 // Notably, there must be *exactly* one set of parens if X is a type. 8956 TypeSourceInfo *RecoveryTSI = nullptr; 8957 ExprResult SubExpr; 8958 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 8959 if (auto *DRE = 8960 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 8961 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 8962 PE, DRE, false, &RecoveryTSI); 8963 else 8964 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 8965 8966 if (RecoveryTSI) { 8967 return getDerived().RebuildUnaryExprOrTypeTrait( 8968 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 8969 } else if (SubExpr.isInvalid()) 8970 return ExprError(); 8971 8972 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 8973 return E; 8974 8975 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 8976 E->getOperatorLoc(), 8977 E->getKind(), 8978 E->getSourceRange()); 8979 } 8980 8981 template<typename Derived> 8982 ExprResult 8983 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 8984 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 8985 if (LHS.isInvalid()) 8986 return ExprError(); 8987 8988 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 8989 if (RHS.isInvalid()) 8990 return ExprError(); 8991 8992 8993 if (!getDerived().AlwaysRebuild() && 8994 LHS.get() == E->getLHS() && 8995 RHS.get() == E->getRHS()) 8996 return E; 8997 8998 return getDerived().RebuildArraySubscriptExpr(LHS.get(), 8999 /*FIXME:*/E->getLHS()->getLocStart(), 9000 RHS.get(), 9001 E->getRBracketLoc()); 9002 } 9003 9004 template <typename Derived> 9005 ExprResult 9006 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9007 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9008 if (Base.isInvalid()) 9009 return ExprError(); 9010 9011 ExprResult LowerBound; 9012 if (E->getLowerBound()) { 9013 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9014 if (LowerBound.isInvalid()) 9015 return ExprError(); 9016 } 9017 9018 ExprResult Length; 9019 if (E->getLength()) { 9020 Length = getDerived().TransformExpr(E->getLength()); 9021 if (Length.isInvalid()) 9022 return ExprError(); 9023 } 9024 9025 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9026 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9027 return E; 9028 9029 return getDerived().RebuildOMPArraySectionExpr( 9030 Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(), 9031 Length.get(), E->getRBracketLoc()); 9032 } 9033 9034 template<typename Derived> 9035 ExprResult 9036 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9037 // Transform the callee. 9038 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9039 if (Callee.isInvalid()) 9040 return ExprError(); 9041 9042 // Transform arguments. 9043 bool ArgChanged = false; 9044 SmallVector<Expr*, 8> Args; 9045 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9046 &ArgChanged)) 9047 return ExprError(); 9048 9049 if (!getDerived().AlwaysRebuild() && 9050 Callee.get() == E->getCallee() && 9051 !ArgChanged) 9052 return SemaRef.MaybeBindToTemporary(E); 9053 9054 // FIXME: Wrong source location information for the '('. 9055 SourceLocation FakeLParenLoc 9056 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9057 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9058 Args, 9059 E->getRParenLoc()); 9060 } 9061 9062 template<typename Derived> 9063 ExprResult 9064 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9065 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9066 if (Base.isInvalid()) 9067 return ExprError(); 9068 9069 NestedNameSpecifierLoc QualifierLoc; 9070 if (E->hasQualifier()) { 9071 QualifierLoc 9072 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9073 9074 if (!QualifierLoc) 9075 return ExprError(); 9076 } 9077 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9078 9079 ValueDecl *Member 9080 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9081 E->getMemberDecl())); 9082 if (!Member) 9083 return ExprError(); 9084 9085 NamedDecl *FoundDecl = E->getFoundDecl(); 9086 if (FoundDecl == E->getMemberDecl()) { 9087 FoundDecl = Member; 9088 } else { 9089 FoundDecl = cast_or_null<NamedDecl>( 9090 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9091 if (!FoundDecl) 9092 return ExprError(); 9093 } 9094 9095 if (!getDerived().AlwaysRebuild() && 9096 Base.get() == E->getBase() && 9097 QualifierLoc == E->getQualifierLoc() && 9098 Member == E->getMemberDecl() && 9099 FoundDecl == E->getFoundDecl() && 9100 !E->hasExplicitTemplateArgs()) { 9101 9102 // Mark it referenced in the new context regardless. 9103 // FIXME: this is a bit instantiation-specific. 9104 SemaRef.MarkMemberReferenced(E); 9105 9106 return E; 9107 } 9108 9109 TemplateArgumentListInfo TransArgs; 9110 if (E->hasExplicitTemplateArgs()) { 9111 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9112 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9113 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9114 E->getNumTemplateArgs(), 9115 TransArgs)) 9116 return ExprError(); 9117 } 9118 9119 // FIXME: Bogus source location for the operator 9120 SourceLocation FakeOperatorLoc = 9121 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9122 9123 // FIXME: to do this check properly, we will need to preserve the 9124 // first-qualifier-in-scope here, just in case we had a dependent 9125 // base (and therefore couldn't do the check) and a 9126 // nested-name-qualifier (and therefore could do the lookup). 9127 NamedDecl *FirstQualifierInScope = nullptr; 9128 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9129 if (MemberNameInfo.getName()) { 9130 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9131 if (!MemberNameInfo.getName()) 9132 return ExprError(); 9133 } 9134 9135 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9136 E->isArrow(), 9137 QualifierLoc, 9138 TemplateKWLoc, 9139 MemberNameInfo, 9140 Member, 9141 FoundDecl, 9142 (E->hasExplicitTemplateArgs() 9143 ? &TransArgs : nullptr), 9144 FirstQualifierInScope); 9145 } 9146 9147 template<typename Derived> 9148 ExprResult 9149 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9150 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9151 if (LHS.isInvalid()) 9152 return ExprError(); 9153 9154 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9155 if (RHS.isInvalid()) 9156 return ExprError(); 9157 9158 if (!getDerived().AlwaysRebuild() && 9159 LHS.get() == E->getLHS() && 9160 RHS.get() == E->getRHS()) 9161 return E; 9162 9163 Sema::FPContractStateRAII FPContractState(getSema()); 9164 getSema().FPFeatures = E->getFPFeatures(); 9165 9166 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9167 LHS.get(), RHS.get()); 9168 } 9169 9170 template<typename Derived> 9171 ExprResult 9172 TreeTransform<Derived>::TransformCompoundAssignOperator( 9173 CompoundAssignOperator *E) { 9174 return getDerived().TransformBinaryOperator(E); 9175 } 9176 9177 template<typename Derived> 9178 ExprResult TreeTransform<Derived>:: 9179 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 9180 // Just rebuild the common and RHS expressions and see whether we 9181 // get any changes. 9182 9183 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 9184 if (commonExpr.isInvalid()) 9185 return ExprError(); 9186 9187 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 9188 if (rhs.isInvalid()) 9189 return ExprError(); 9190 9191 if (!getDerived().AlwaysRebuild() && 9192 commonExpr.get() == e->getCommon() && 9193 rhs.get() == e->getFalseExpr()) 9194 return e; 9195 9196 return getDerived().RebuildConditionalOperator(commonExpr.get(), 9197 e->getQuestionLoc(), 9198 nullptr, 9199 e->getColonLoc(), 9200 rhs.get()); 9201 } 9202 9203 template<typename Derived> 9204 ExprResult 9205 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 9206 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9207 if (Cond.isInvalid()) 9208 return ExprError(); 9209 9210 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9211 if (LHS.isInvalid()) 9212 return ExprError(); 9213 9214 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9215 if (RHS.isInvalid()) 9216 return ExprError(); 9217 9218 if (!getDerived().AlwaysRebuild() && 9219 Cond.get() == E->getCond() && 9220 LHS.get() == E->getLHS() && 9221 RHS.get() == E->getRHS()) 9222 return E; 9223 9224 return getDerived().RebuildConditionalOperator(Cond.get(), 9225 E->getQuestionLoc(), 9226 LHS.get(), 9227 E->getColonLoc(), 9228 RHS.get()); 9229 } 9230 9231 template<typename Derived> 9232 ExprResult 9233 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 9234 // Implicit casts are eliminated during transformation, since they 9235 // will be recomputed by semantic analysis after transformation. 9236 return getDerived().TransformExpr(E->getSubExprAsWritten()); 9237 } 9238 9239 template<typename Derived> 9240 ExprResult 9241 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 9242 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9243 if (!Type) 9244 return ExprError(); 9245 9246 ExprResult SubExpr 9247 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9248 if (SubExpr.isInvalid()) 9249 return ExprError(); 9250 9251 if (!getDerived().AlwaysRebuild() && 9252 Type == E->getTypeInfoAsWritten() && 9253 SubExpr.get() == E->getSubExpr()) 9254 return E; 9255 9256 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 9257 Type, 9258 E->getRParenLoc(), 9259 SubExpr.get()); 9260 } 9261 9262 template<typename Derived> 9263 ExprResult 9264 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 9265 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 9266 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9267 if (!NewT) 9268 return ExprError(); 9269 9270 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 9271 if (Init.isInvalid()) 9272 return ExprError(); 9273 9274 if (!getDerived().AlwaysRebuild() && 9275 OldT == NewT && 9276 Init.get() == E->getInitializer()) 9277 return SemaRef.MaybeBindToTemporary(E); 9278 9279 // Note: the expression type doesn't necessarily match the 9280 // type-as-written, but that's okay, because it should always be 9281 // derivable from the initializer. 9282 9283 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 9284 /*FIXME:*/E->getInitializer()->getLocEnd(), 9285 Init.get()); 9286 } 9287 9288 template<typename Derived> 9289 ExprResult 9290 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 9291 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9292 if (Base.isInvalid()) 9293 return ExprError(); 9294 9295 if (!getDerived().AlwaysRebuild() && 9296 Base.get() == E->getBase()) 9297 return E; 9298 9299 // FIXME: Bad source location 9300 SourceLocation FakeOperatorLoc = 9301 SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd()); 9302 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 9303 E->getAccessorLoc(), 9304 E->getAccessor()); 9305 } 9306 9307 template<typename Derived> 9308 ExprResult 9309 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 9310 if (InitListExpr *Syntactic = E->getSyntacticForm()) 9311 E = Syntactic; 9312 9313 bool InitChanged = false; 9314 9315 SmallVector<Expr*, 4> Inits; 9316 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 9317 Inits, &InitChanged)) 9318 return ExprError(); 9319 9320 if (!getDerived().AlwaysRebuild() && !InitChanged) { 9321 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 9322 // in some cases. We can't reuse it in general, because the syntactic and 9323 // semantic forms are linked, and we can't know that semantic form will 9324 // match even if the syntactic form does. 9325 } 9326 9327 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 9328 E->getRBraceLoc(), E->getType()); 9329 } 9330 9331 template<typename Derived> 9332 ExprResult 9333 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 9334 Designation Desig; 9335 9336 // transform the initializer value 9337 ExprResult Init = getDerived().TransformExpr(E->getInit()); 9338 if (Init.isInvalid()) 9339 return ExprError(); 9340 9341 // transform the designators. 9342 SmallVector<Expr*, 4> ArrayExprs; 9343 bool ExprChanged = false; 9344 for (const DesignatedInitExpr::Designator &D : E->designators()) { 9345 if (D.isFieldDesignator()) { 9346 Desig.AddDesignator(Designator::getField(D.getFieldName(), 9347 D.getDotLoc(), 9348 D.getFieldLoc())); 9349 if (D.getField()) { 9350 FieldDecl *Field = cast_or_null<FieldDecl>( 9351 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 9352 if (Field != D.getField()) 9353 // Rebuild the expression when the transformed FieldDecl is 9354 // different to the already assigned FieldDecl. 9355 ExprChanged = true; 9356 } else { 9357 // Ensure that the designator expression is rebuilt when there isn't 9358 // a resolved FieldDecl in the designator as we don't want to assign 9359 // a FieldDecl to a pattern designator that will be instantiated again. 9360 ExprChanged = true; 9361 } 9362 continue; 9363 } 9364 9365 if (D.isArrayDesignator()) { 9366 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 9367 if (Index.isInvalid()) 9368 return ExprError(); 9369 9370 Desig.AddDesignator( 9371 Designator::getArray(Index.get(), D.getLBracketLoc())); 9372 9373 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 9374 ArrayExprs.push_back(Index.get()); 9375 continue; 9376 } 9377 9378 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 9379 ExprResult Start 9380 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 9381 if (Start.isInvalid()) 9382 return ExprError(); 9383 9384 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 9385 if (End.isInvalid()) 9386 return ExprError(); 9387 9388 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 9389 End.get(), 9390 D.getLBracketLoc(), 9391 D.getEllipsisLoc())); 9392 9393 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 9394 End.get() != E->getArrayRangeEnd(D); 9395 9396 ArrayExprs.push_back(Start.get()); 9397 ArrayExprs.push_back(End.get()); 9398 } 9399 9400 if (!getDerived().AlwaysRebuild() && 9401 Init.get() == E->getInit() && 9402 !ExprChanged) 9403 return E; 9404 9405 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 9406 E->getEqualOrColonLoc(), 9407 E->usesGNUSyntax(), Init.get()); 9408 } 9409 9410 // Seems that if TransformInitListExpr() only works on the syntactic form of an 9411 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 9412 template<typename Derived> 9413 ExprResult 9414 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 9415 DesignatedInitUpdateExpr *E) { 9416 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 9417 "initializer"); 9418 return ExprError(); 9419 } 9420 9421 template<typename Derived> 9422 ExprResult 9423 TreeTransform<Derived>::TransformNoInitExpr( 9424 NoInitExpr *E) { 9425 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 9426 return ExprError(); 9427 } 9428 9429 template<typename Derived> 9430 ExprResult 9431 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 9432 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 9433 return ExprError(); 9434 } 9435 9436 template<typename Derived> 9437 ExprResult 9438 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 9439 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 9440 return ExprError(); 9441 } 9442 9443 template<typename Derived> 9444 ExprResult 9445 TreeTransform<Derived>::TransformImplicitValueInitExpr( 9446 ImplicitValueInitExpr *E) { 9447 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 9448 9449 // FIXME: Will we ever have proper type location here? Will we actually 9450 // need to transform the type? 9451 QualType T = getDerived().TransformType(E->getType()); 9452 if (T.isNull()) 9453 return ExprError(); 9454 9455 if (!getDerived().AlwaysRebuild() && 9456 T == E->getType()) 9457 return E; 9458 9459 return getDerived().RebuildImplicitValueInitExpr(T); 9460 } 9461 9462 template<typename Derived> 9463 ExprResult 9464 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 9465 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 9466 if (!TInfo) 9467 return ExprError(); 9468 9469 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9470 if (SubExpr.isInvalid()) 9471 return ExprError(); 9472 9473 if (!getDerived().AlwaysRebuild() && 9474 TInfo == E->getWrittenTypeInfo() && 9475 SubExpr.get() == E->getSubExpr()) 9476 return E; 9477 9478 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 9479 TInfo, E->getRParenLoc()); 9480 } 9481 9482 template<typename Derived> 9483 ExprResult 9484 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 9485 bool ArgumentChanged = false; 9486 SmallVector<Expr*, 4> Inits; 9487 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 9488 &ArgumentChanged)) 9489 return ExprError(); 9490 9491 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 9492 Inits, 9493 E->getRParenLoc()); 9494 } 9495 9496 /// \brief Transform an address-of-label expression. 9497 /// 9498 /// By default, the transformation of an address-of-label expression always 9499 /// rebuilds the expression, so that the label identifier can be resolved to 9500 /// the corresponding label statement by semantic analysis. 9501 template<typename Derived> 9502 ExprResult 9503 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 9504 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 9505 E->getLabel()); 9506 if (!LD) 9507 return ExprError(); 9508 9509 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 9510 cast<LabelDecl>(LD)); 9511 } 9512 9513 template<typename Derived> 9514 ExprResult 9515 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 9516 SemaRef.ActOnStartStmtExpr(); 9517 StmtResult SubStmt 9518 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 9519 if (SubStmt.isInvalid()) { 9520 SemaRef.ActOnStmtExprError(); 9521 return ExprError(); 9522 } 9523 9524 if (!getDerived().AlwaysRebuild() && 9525 SubStmt.get() == E->getSubStmt()) { 9526 // Calling this an 'error' is unintuitive, but it does the right thing. 9527 SemaRef.ActOnStmtExprError(); 9528 return SemaRef.MaybeBindToTemporary(E); 9529 } 9530 9531 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 9532 SubStmt.get(), 9533 E->getRParenLoc()); 9534 } 9535 9536 template<typename Derived> 9537 ExprResult 9538 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 9539 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9540 if (Cond.isInvalid()) 9541 return ExprError(); 9542 9543 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9544 if (LHS.isInvalid()) 9545 return ExprError(); 9546 9547 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9548 if (RHS.isInvalid()) 9549 return ExprError(); 9550 9551 if (!getDerived().AlwaysRebuild() && 9552 Cond.get() == E->getCond() && 9553 LHS.get() == E->getLHS() && 9554 RHS.get() == E->getRHS()) 9555 return E; 9556 9557 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 9558 Cond.get(), LHS.get(), RHS.get(), 9559 E->getRParenLoc()); 9560 } 9561 9562 template<typename Derived> 9563 ExprResult 9564 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 9565 return E; 9566 } 9567 9568 template<typename Derived> 9569 ExprResult 9570 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 9571 switch (E->getOperator()) { 9572 case OO_New: 9573 case OO_Delete: 9574 case OO_Array_New: 9575 case OO_Array_Delete: 9576 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 9577 9578 case OO_Call: { 9579 // This is a call to an object's operator(). 9580 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 9581 9582 // Transform the object itself. 9583 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 9584 if (Object.isInvalid()) 9585 return ExprError(); 9586 9587 // FIXME: Poor location information 9588 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 9589 static_cast<Expr *>(Object.get())->getLocEnd()); 9590 9591 // Transform the call arguments. 9592 SmallVector<Expr*, 8> Args; 9593 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 9594 Args)) 9595 return ExprError(); 9596 9597 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 9598 Args, 9599 E->getLocEnd()); 9600 } 9601 9602 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 9603 case OO_##Name: 9604 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 9605 #include "clang/Basic/OperatorKinds.def" 9606 case OO_Subscript: 9607 // Handled below. 9608 break; 9609 9610 case OO_Conditional: 9611 llvm_unreachable("conditional operator is not actually overloadable"); 9612 9613 case OO_None: 9614 case NUM_OVERLOADED_OPERATORS: 9615 llvm_unreachable("not an overloaded operator?"); 9616 } 9617 9618 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9619 if (Callee.isInvalid()) 9620 return ExprError(); 9621 9622 ExprResult First; 9623 if (E->getOperator() == OO_Amp) 9624 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 9625 else 9626 First = getDerived().TransformExpr(E->getArg(0)); 9627 if (First.isInvalid()) 9628 return ExprError(); 9629 9630 ExprResult Second; 9631 if (E->getNumArgs() == 2) { 9632 Second = getDerived().TransformExpr(E->getArg(1)); 9633 if (Second.isInvalid()) 9634 return ExprError(); 9635 } 9636 9637 if (!getDerived().AlwaysRebuild() && 9638 Callee.get() == E->getCallee() && 9639 First.get() == E->getArg(0) && 9640 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 9641 return SemaRef.MaybeBindToTemporary(E); 9642 9643 Sema::FPContractStateRAII FPContractState(getSema()); 9644 getSema().FPFeatures = E->getFPFeatures(); 9645 9646 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 9647 E->getOperatorLoc(), 9648 Callee.get(), 9649 First.get(), 9650 Second.get()); 9651 } 9652 9653 template<typename Derived> 9654 ExprResult 9655 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 9656 return getDerived().TransformCallExpr(E); 9657 } 9658 9659 template<typename Derived> 9660 ExprResult 9661 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 9662 // Transform the callee. 9663 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9664 if (Callee.isInvalid()) 9665 return ExprError(); 9666 9667 // Transform exec config. 9668 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 9669 if (EC.isInvalid()) 9670 return ExprError(); 9671 9672 // Transform arguments. 9673 bool ArgChanged = false; 9674 SmallVector<Expr*, 8> Args; 9675 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9676 &ArgChanged)) 9677 return ExprError(); 9678 9679 if (!getDerived().AlwaysRebuild() && 9680 Callee.get() == E->getCallee() && 9681 !ArgChanged) 9682 return SemaRef.MaybeBindToTemporary(E); 9683 9684 // FIXME: Wrong source location information for the '('. 9685 SourceLocation FakeLParenLoc 9686 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9687 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9688 Args, 9689 E->getRParenLoc(), EC.get()); 9690 } 9691 9692 template<typename Derived> 9693 ExprResult 9694 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 9695 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9696 if (!Type) 9697 return ExprError(); 9698 9699 ExprResult SubExpr 9700 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9701 if (SubExpr.isInvalid()) 9702 return ExprError(); 9703 9704 if (!getDerived().AlwaysRebuild() && 9705 Type == E->getTypeInfoAsWritten() && 9706 SubExpr.get() == E->getSubExpr()) 9707 return E; 9708 return getDerived().RebuildCXXNamedCastExpr( 9709 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 9710 Type, E->getAngleBrackets().getEnd(), 9711 // FIXME. this should be '(' location 9712 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 9713 } 9714 9715 template<typename Derived> 9716 ExprResult 9717 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 9718 return getDerived().TransformCXXNamedCastExpr(E); 9719 } 9720 9721 template<typename Derived> 9722 ExprResult 9723 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 9724 return getDerived().TransformCXXNamedCastExpr(E); 9725 } 9726 9727 template<typename Derived> 9728 ExprResult 9729 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 9730 CXXReinterpretCastExpr *E) { 9731 return getDerived().TransformCXXNamedCastExpr(E); 9732 } 9733 9734 template<typename Derived> 9735 ExprResult 9736 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 9737 return getDerived().TransformCXXNamedCastExpr(E); 9738 } 9739 9740 template<typename Derived> 9741 ExprResult 9742 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 9743 CXXFunctionalCastExpr *E) { 9744 TypeSourceInfo *Type = 9745 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 9746 if (!Type) 9747 return ExprError(); 9748 9749 ExprResult SubExpr 9750 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9751 if (SubExpr.isInvalid()) 9752 return ExprError(); 9753 9754 if (!getDerived().AlwaysRebuild() && 9755 Type == E->getTypeInfoAsWritten() && 9756 SubExpr.get() == E->getSubExpr()) 9757 return E; 9758 9759 return getDerived().RebuildCXXFunctionalCastExpr(Type, 9760 E->getLParenLoc(), 9761 SubExpr.get(), 9762 E->getRParenLoc()); 9763 } 9764 9765 template<typename Derived> 9766 ExprResult 9767 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 9768 if (E->isTypeOperand()) { 9769 TypeSourceInfo *TInfo 9770 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 9771 if (!TInfo) 9772 return ExprError(); 9773 9774 if (!getDerived().AlwaysRebuild() && 9775 TInfo == E->getTypeOperandSourceInfo()) 9776 return E; 9777 9778 return getDerived().RebuildCXXTypeidExpr(E->getType(), 9779 E->getLocStart(), 9780 TInfo, 9781 E->getLocEnd()); 9782 } 9783 9784 // We don't know whether the subexpression is potentially evaluated until 9785 // after we perform semantic analysis. We speculatively assume it is 9786 // unevaluated; it will get fixed later if the subexpression is in fact 9787 // potentially evaluated. 9788 EnterExpressionEvaluationContext Unevaluated( 9789 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9790 Sema::ReuseLambdaContextDecl); 9791 9792 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 9793 if (SubExpr.isInvalid()) 9794 return ExprError(); 9795 9796 if (!getDerived().AlwaysRebuild() && 9797 SubExpr.get() == E->getExprOperand()) 9798 return E; 9799 9800 return getDerived().RebuildCXXTypeidExpr(E->getType(), 9801 E->getLocStart(), 9802 SubExpr.get(), 9803 E->getLocEnd()); 9804 } 9805 9806 template<typename Derived> 9807 ExprResult 9808 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 9809 if (E->isTypeOperand()) { 9810 TypeSourceInfo *TInfo 9811 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 9812 if (!TInfo) 9813 return ExprError(); 9814 9815 if (!getDerived().AlwaysRebuild() && 9816 TInfo == E->getTypeOperandSourceInfo()) 9817 return E; 9818 9819 return getDerived().RebuildCXXUuidofExpr(E->getType(), 9820 E->getLocStart(), 9821 TInfo, 9822 E->getLocEnd()); 9823 } 9824 9825 EnterExpressionEvaluationContext Unevaluated( 9826 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 9827 9828 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 9829 if (SubExpr.isInvalid()) 9830 return ExprError(); 9831 9832 if (!getDerived().AlwaysRebuild() && 9833 SubExpr.get() == E->getExprOperand()) 9834 return E; 9835 9836 return getDerived().RebuildCXXUuidofExpr(E->getType(), 9837 E->getLocStart(), 9838 SubExpr.get(), 9839 E->getLocEnd()); 9840 } 9841 9842 template<typename Derived> 9843 ExprResult 9844 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 9845 return E; 9846 } 9847 9848 template<typename Derived> 9849 ExprResult 9850 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 9851 CXXNullPtrLiteralExpr *E) { 9852 return E; 9853 } 9854 9855 template<typename Derived> 9856 ExprResult 9857 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 9858 QualType T = getSema().getCurrentThisType(); 9859 9860 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 9861 // Make sure that we capture 'this'. 9862 getSema().CheckCXXThisCapture(E->getLocStart()); 9863 return E; 9864 } 9865 9866 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 9867 } 9868 9869 template<typename Derived> 9870 ExprResult 9871 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 9872 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9873 if (SubExpr.isInvalid()) 9874 return ExprError(); 9875 9876 if (!getDerived().AlwaysRebuild() && 9877 SubExpr.get() == E->getSubExpr()) 9878 return E; 9879 9880 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 9881 E->isThrownVariableInScope()); 9882 } 9883 9884 template<typename Derived> 9885 ExprResult 9886 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 9887 ParmVarDecl *Param 9888 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 9889 E->getParam())); 9890 if (!Param) 9891 return ExprError(); 9892 9893 if (!getDerived().AlwaysRebuild() && 9894 Param == E->getParam()) 9895 return E; 9896 9897 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 9898 } 9899 9900 template<typename Derived> 9901 ExprResult 9902 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 9903 FieldDecl *Field 9904 = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(), 9905 E->getField())); 9906 if (!Field) 9907 return ExprError(); 9908 9909 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 9910 return E; 9911 9912 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 9913 } 9914 9915 template<typename Derived> 9916 ExprResult 9917 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 9918 CXXScalarValueInitExpr *E) { 9919 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 9920 if (!T) 9921 return ExprError(); 9922 9923 if (!getDerived().AlwaysRebuild() && 9924 T == E->getTypeSourceInfo()) 9925 return E; 9926 9927 return getDerived().RebuildCXXScalarValueInitExpr(T, 9928 /*FIXME:*/T->getTypeLoc().getEndLoc(), 9929 E->getRParenLoc()); 9930 } 9931 9932 template<typename Derived> 9933 ExprResult 9934 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 9935 // Transform the type that we're allocating 9936 TypeSourceInfo *AllocTypeInfo = 9937 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 9938 if (!AllocTypeInfo) 9939 return ExprError(); 9940 9941 // Transform the size of the array we're allocating (if any). 9942 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 9943 if (ArraySize.isInvalid()) 9944 return ExprError(); 9945 9946 // Transform the placement arguments (if any). 9947 bool ArgumentChanged = false; 9948 SmallVector<Expr*, 8> PlacementArgs; 9949 if (getDerived().TransformExprs(E->getPlacementArgs(), 9950 E->getNumPlacementArgs(), true, 9951 PlacementArgs, &ArgumentChanged)) 9952 return ExprError(); 9953 9954 // Transform the initializer (if any). 9955 Expr *OldInit = E->getInitializer(); 9956 ExprResult NewInit; 9957 if (OldInit) 9958 NewInit = getDerived().TransformInitializer(OldInit, true); 9959 if (NewInit.isInvalid()) 9960 return ExprError(); 9961 9962 // Transform new operator and delete operator. 9963 FunctionDecl *OperatorNew = nullptr; 9964 if (E->getOperatorNew()) { 9965 OperatorNew = cast_or_null<FunctionDecl>( 9966 getDerived().TransformDecl(E->getLocStart(), 9967 E->getOperatorNew())); 9968 if (!OperatorNew) 9969 return ExprError(); 9970 } 9971 9972 FunctionDecl *OperatorDelete = nullptr; 9973 if (E->getOperatorDelete()) { 9974 OperatorDelete = cast_or_null<FunctionDecl>( 9975 getDerived().TransformDecl(E->getLocStart(), 9976 E->getOperatorDelete())); 9977 if (!OperatorDelete) 9978 return ExprError(); 9979 } 9980 9981 if (!getDerived().AlwaysRebuild() && 9982 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 9983 ArraySize.get() == E->getArraySize() && 9984 NewInit.get() == OldInit && 9985 OperatorNew == E->getOperatorNew() && 9986 OperatorDelete == E->getOperatorDelete() && 9987 !ArgumentChanged) { 9988 // Mark any declarations we need as referenced. 9989 // FIXME: instantiation-specific. 9990 if (OperatorNew) 9991 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew); 9992 if (OperatorDelete) 9993 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 9994 9995 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 9996 QualType ElementType 9997 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 9998 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 9999 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10000 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10001 SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor); 10002 } 10003 } 10004 } 10005 10006 return E; 10007 } 10008 10009 QualType AllocType = AllocTypeInfo->getType(); 10010 if (!ArraySize.get()) { 10011 // If no array size was specified, but the new expression was 10012 // instantiated with an array type (e.g., "new T" where T is 10013 // instantiated with "int[4]"), extract the outer bound from the 10014 // array type as our array size. We do this with constant and 10015 // dependently-sized array types. 10016 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10017 if (!ArrayT) { 10018 // Do nothing 10019 } else if (const ConstantArrayType *ConsArrayT 10020 = dyn_cast<ConstantArrayType>(ArrayT)) { 10021 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10022 SemaRef.Context.getSizeType(), 10023 /*FIXME:*/ E->getLocStart()); 10024 AllocType = ConsArrayT->getElementType(); 10025 } else if (const DependentSizedArrayType *DepArrayT 10026 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10027 if (DepArrayT->getSizeExpr()) { 10028 ArraySize = DepArrayT->getSizeExpr(); 10029 AllocType = DepArrayT->getElementType(); 10030 } 10031 } 10032 } 10033 10034 return getDerived().RebuildCXXNewExpr(E->getLocStart(), 10035 E->isGlobalNew(), 10036 /*FIXME:*/E->getLocStart(), 10037 PlacementArgs, 10038 /*FIXME:*/E->getLocStart(), 10039 E->getTypeIdParens(), 10040 AllocType, 10041 AllocTypeInfo, 10042 ArraySize.get(), 10043 E->getDirectInitRange(), 10044 NewInit.get()); 10045 } 10046 10047 template<typename Derived> 10048 ExprResult 10049 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10050 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10051 if (Operand.isInvalid()) 10052 return ExprError(); 10053 10054 // Transform the delete operator, if known. 10055 FunctionDecl *OperatorDelete = nullptr; 10056 if (E->getOperatorDelete()) { 10057 OperatorDelete = cast_or_null<FunctionDecl>( 10058 getDerived().TransformDecl(E->getLocStart(), 10059 E->getOperatorDelete())); 10060 if (!OperatorDelete) 10061 return ExprError(); 10062 } 10063 10064 if (!getDerived().AlwaysRebuild() && 10065 Operand.get() == E->getArgument() && 10066 OperatorDelete == E->getOperatorDelete()) { 10067 // Mark any declarations we need as referenced. 10068 // FIXME: instantiation-specific. 10069 if (OperatorDelete) 10070 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 10071 10072 if (!E->getArgument()->isTypeDependent()) { 10073 QualType Destroyed = SemaRef.Context.getBaseElementType( 10074 E->getDestroyedType()); 10075 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10076 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10077 SemaRef.MarkFunctionReferenced(E->getLocStart(), 10078 SemaRef.LookupDestructor(Record)); 10079 } 10080 } 10081 10082 return E; 10083 } 10084 10085 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 10086 E->isGlobalDelete(), 10087 E->isArrayForm(), 10088 Operand.get()); 10089 } 10090 10091 template<typename Derived> 10092 ExprResult 10093 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10094 CXXPseudoDestructorExpr *E) { 10095 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10096 if (Base.isInvalid()) 10097 return ExprError(); 10098 10099 ParsedType ObjectTypePtr; 10100 bool MayBePseudoDestructor = false; 10101 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10102 E->getOperatorLoc(), 10103 E->isArrow()? tok::arrow : tok::period, 10104 ObjectTypePtr, 10105 MayBePseudoDestructor); 10106 if (Base.isInvalid()) 10107 return ExprError(); 10108 10109 QualType ObjectType = ObjectTypePtr.get(); 10110 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10111 if (QualifierLoc) { 10112 QualifierLoc 10113 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10114 if (!QualifierLoc) 10115 return ExprError(); 10116 } 10117 CXXScopeSpec SS; 10118 SS.Adopt(QualifierLoc); 10119 10120 PseudoDestructorTypeStorage Destroyed; 10121 if (E->getDestroyedTypeInfo()) { 10122 TypeSourceInfo *DestroyedTypeInfo 10123 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10124 ObjectType, nullptr, SS); 10125 if (!DestroyedTypeInfo) 10126 return ExprError(); 10127 Destroyed = DestroyedTypeInfo; 10128 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10129 // We aren't likely to be able to resolve the identifier down to a type 10130 // now anyway, so just retain the identifier. 10131 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 10132 E->getDestroyedTypeLoc()); 10133 } else { 10134 // Look for a destructor known with the given name. 10135 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 10136 *E->getDestroyedTypeIdentifier(), 10137 E->getDestroyedTypeLoc(), 10138 /*Scope=*/nullptr, 10139 SS, ObjectTypePtr, 10140 false); 10141 if (!T) 10142 return ExprError(); 10143 10144 Destroyed 10145 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 10146 E->getDestroyedTypeLoc()); 10147 } 10148 10149 TypeSourceInfo *ScopeTypeInfo = nullptr; 10150 if (E->getScopeTypeInfo()) { 10151 CXXScopeSpec EmptySS; 10152 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 10153 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 10154 if (!ScopeTypeInfo) 10155 return ExprError(); 10156 } 10157 10158 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 10159 E->getOperatorLoc(), 10160 E->isArrow(), 10161 SS, 10162 ScopeTypeInfo, 10163 E->getColonColonLoc(), 10164 E->getTildeLoc(), 10165 Destroyed); 10166 } 10167 10168 template <typename Derived> 10169 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 10170 bool RequiresADL, 10171 LookupResult &R) { 10172 // Transform all the decls. 10173 bool AllEmptyPacks = true; 10174 for (auto *OldD : Old->decls()) { 10175 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 10176 if (!InstD) { 10177 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 10178 // This can happen because of dependent hiding. 10179 if (isa<UsingShadowDecl>(OldD)) 10180 continue; 10181 else { 10182 R.clear(); 10183 return true; 10184 } 10185 } 10186 10187 // Expand using pack declarations. 10188 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 10189 ArrayRef<NamedDecl*> Decls = SingleDecl; 10190 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 10191 Decls = UPD->expansions(); 10192 10193 // Expand using declarations. 10194 for (auto *D : Decls) { 10195 if (auto *UD = dyn_cast<UsingDecl>(D)) { 10196 for (auto *SD : UD->shadows()) 10197 R.addDecl(SD); 10198 } else { 10199 R.addDecl(D); 10200 } 10201 } 10202 10203 AllEmptyPacks &= Decls.empty(); 10204 }; 10205 10206 // C++ [temp.res]/8.4.2: 10207 // The program is ill-formed, no diagnostic required, if [...] lookup for 10208 // a name in the template definition found a using-declaration, but the 10209 // lookup in the corresponding scope in the instantiation odoes not find 10210 // any declarations because the using-declaration was a pack expansion and 10211 // the corresponding pack is empty 10212 if (AllEmptyPacks && !RequiresADL) { 10213 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 10214 << isa<UnresolvedMemberExpr>(Old) << Old->getNameInfo().getName(); 10215 return true; 10216 } 10217 10218 // Resolve a kind, but don't do any further analysis. If it's 10219 // ambiguous, the callee needs to deal with it. 10220 R.resolveKind(); 10221 return false; 10222 } 10223 10224 template<typename Derived> 10225 ExprResult 10226 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 10227 UnresolvedLookupExpr *Old) { 10228 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 10229 Sema::LookupOrdinaryName); 10230 10231 // Transform the declaration set. 10232 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 10233 return ExprError(); 10234 10235 // Rebuild the nested-name qualifier, if present. 10236 CXXScopeSpec SS; 10237 if (Old->getQualifierLoc()) { 10238 NestedNameSpecifierLoc QualifierLoc 10239 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 10240 if (!QualifierLoc) 10241 return ExprError(); 10242 10243 SS.Adopt(QualifierLoc); 10244 } 10245 10246 if (Old->getNamingClass()) { 10247 CXXRecordDecl *NamingClass 10248 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 10249 Old->getNameLoc(), 10250 Old->getNamingClass())); 10251 if (!NamingClass) { 10252 R.clear(); 10253 return ExprError(); 10254 } 10255 10256 R.setNamingClass(NamingClass); 10257 } 10258 10259 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 10260 10261 // If we have neither explicit template arguments, nor the template keyword, 10262 // it's a normal declaration name or member reference. 10263 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 10264 NamedDecl *D = R.getAsSingle<NamedDecl>(); 10265 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 10266 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 10267 // give a good diagnostic. 10268 if (D && D->isCXXInstanceMember()) { 10269 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 10270 /*TemplateArgs=*/nullptr, 10271 /*Scope=*/nullptr); 10272 } 10273 10274 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 10275 } 10276 10277 // If we have template arguments, rebuild them, then rebuild the 10278 // templateid expression. 10279 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 10280 if (Old->hasExplicitTemplateArgs() && 10281 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 10282 Old->getNumTemplateArgs(), 10283 TransArgs)) { 10284 R.clear(); 10285 return ExprError(); 10286 } 10287 10288 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 10289 Old->requiresADL(), &TransArgs); 10290 } 10291 10292 template<typename Derived> 10293 ExprResult 10294 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 10295 bool ArgChanged = false; 10296 SmallVector<TypeSourceInfo *, 4> Args; 10297 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 10298 TypeSourceInfo *From = E->getArg(I); 10299 TypeLoc FromTL = From->getTypeLoc(); 10300 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 10301 TypeLocBuilder TLB; 10302 TLB.reserve(FromTL.getFullDataSize()); 10303 QualType To = getDerived().TransformType(TLB, FromTL); 10304 if (To.isNull()) 10305 return ExprError(); 10306 10307 if (To == From->getType()) 10308 Args.push_back(From); 10309 else { 10310 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10311 ArgChanged = true; 10312 } 10313 continue; 10314 } 10315 10316 ArgChanged = true; 10317 10318 // We have a pack expansion. Instantiate it. 10319 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 10320 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 10321 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10322 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 10323 10324 // Determine whether the set of unexpanded parameter packs can and should 10325 // be expanded. 10326 bool Expand = true; 10327 bool RetainExpansion = false; 10328 Optional<unsigned> OrigNumExpansions = 10329 ExpansionTL.getTypePtr()->getNumExpansions(); 10330 Optional<unsigned> NumExpansions = OrigNumExpansions; 10331 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 10332 PatternTL.getSourceRange(), 10333 Unexpanded, 10334 Expand, RetainExpansion, 10335 NumExpansions)) 10336 return ExprError(); 10337 10338 if (!Expand) { 10339 // The transform has determined that we should perform a simple 10340 // transformation on the pack expansion, producing another pack 10341 // expansion. 10342 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10343 10344 TypeLocBuilder TLB; 10345 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10346 10347 QualType To = getDerived().TransformType(TLB, PatternTL); 10348 if (To.isNull()) 10349 return ExprError(); 10350 10351 To = getDerived().RebuildPackExpansionType(To, 10352 PatternTL.getSourceRange(), 10353 ExpansionTL.getEllipsisLoc(), 10354 NumExpansions); 10355 if (To.isNull()) 10356 return ExprError(); 10357 10358 PackExpansionTypeLoc ToExpansionTL 10359 = TLB.push<PackExpansionTypeLoc>(To); 10360 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10361 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10362 continue; 10363 } 10364 10365 // Expand the pack expansion by substituting for each argument in the 10366 // pack(s). 10367 for (unsigned I = 0; I != *NumExpansions; ++I) { 10368 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 10369 TypeLocBuilder TLB; 10370 TLB.reserve(PatternTL.getFullDataSize()); 10371 QualType To = getDerived().TransformType(TLB, PatternTL); 10372 if (To.isNull()) 10373 return ExprError(); 10374 10375 if (To->containsUnexpandedParameterPack()) { 10376 To = getDerived().RebuildPackExpansionType(To, 10377 PatternTL.getSourceRange(), 10378 ExpansionTL.getEllipsisLoc(), 10379 NumExpansions); 10380 if (To.isNull()) 10381 return ExprError(); 10382 10383 PackExpansionTypeLoc ToExpansionTL 10384 = TLB.push<PackExpansionTypeLoc>(To); 10385 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10386 } 10387 10388 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10389 } 10390 10391 if (!RetainExpansion) 10392 continue; 10393 10394 // If we're supposed to retain a pack expansion, do so by temporarily 10395 // forgetting the partially-substituted parameter pack. 10396 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10397 10398 TypeLocBuilder TLB; 10399 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10400 10401 QualType To = getDerived().TransformType(TLB, PatternTL); 10402 if (To.isNull()) 10403 return ExprError(); 10404 10405 To = getDerived().RebuildPackExpansionType(To, 10406 PatternTL.getSourceRange(), 10407 ExpansionTL.getEllipsisLoc(), 10408 NumExpansions); 10409 if (To.isNull()) 10410 return ExprError(); 10411 10412 PackExpansionTypeLoc ToExpansionTL 10413 = TLB.push<PackExpansionTypeLoc>(To); 10414 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10415 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10416 } 10417 10418 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10419 return E; 10420 10421 return getDerived().RebuildTypeTrait(E->getTrait(), 10422 E->getLocStart(), 10423 Args, 10424 E->getLocEnd()); 10425 } 10426 10427 template<typename Derived> 10428 ExprResult 10429 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 10430 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 10431 if (!T) 10432 return ExprError(); 10433 10434 if (!getDerived().AlwaysRebuild() && 10435 T == E->getQueriedTypeSourceInfo()) 10436 return E; 10437 10438 ExprResult SubExpr; 10439 { 10440 EnterExpressionEvaluationContext Unevaluated( 10441 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10442 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 10443 if (SubExpr.isInvalid()) 10444 return ExprError(); 10445 10446 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 10447 return E; 10448 } 10449 10450 return getDerived().RebuildArrayTypeTrait(E->getTrait(), 10451 E->getLocStart(), 10452 T, 10453 SubExpr.get(), 10454 E->getLocEnd()); 10455 } 10456 10457 template<typename Derived> 10458 ExprResult 10459 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 10460 ExprResult SubExpr; 10461 { 10462 EnterExpressionEvaluationContext Unevaluated( 10463 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10464 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 10465 if (SubExpr.isInvalid()) 10466 return ExprError(); 10467 10468 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 10469 return E; 10470 } 10471 10472 return getDerived().RebuildExpressionTrait( 10473 E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd()); 10474 } 10475 10476 template <typename Derived> 10477 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 10478 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 10479 TypeSourceInfo **RecoveryTSI) { 10480 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 10481 DRE, AddrTaken, RecoveryTSI); 10482 10483 // Propagate both errors and recovered types, which return ExprEmpty. 10484 if (!NewDRE.isUsable()) 10485 return NewDRE; 10486 10487 // We got an expr, wrap it up in parens. 10488 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 10489 return PE; 10490 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 10491 PE->getRParen()); 10492 } 10493 10494 template <typename Derived> 10495 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10496 DependentScopeDeclRefExpr *E) { 10497 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 10498 nullptr); 10499 } 10500 10501 template<typename Derived> 10502 ExprResult 10503 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10504 DependentScopeDeclRefExpr *E, 10505 bool IsAddressOfOperand, 10506 TypeSourceInfo **RecoveryTSI) { 10507 assert(E->getQualifierLoc()); 10508 NestedNameSpecifierLoc QualifierLoc 10509 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10510 if (!QualifierLoc) 10511 return ExprError(); 10512 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10513 10514 // TODO: If this is a conversion-function-id, verify that the 10515 // destination type name (if present) resolves the same way after 10516 // instantiation as it did in the local scope. 10517 10518 DeclarationNameInfo NameInfo 10519 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 10520 if (!NameInfo.getName()) 10521 return ExprError(); 10522 10523 if (!E->hasExplicitTemplateArgs()) { 10524 if (!getDerived().AlwaysRebuild() && 10525 QualifierLoc == E->getQualifierLoc() && 10526 // Note: it is sufficient to compare the Name component of NameInfo: 10527 // if name has not changed, DNLoc has not changed either. 10528 NameInfo.getName() == E->getDeclName()) 10529 return E; 10530 10531 return getDerived().RebuildDependentScopeDeclRefExpr( 10532 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 10533 IsAddressOfOperand, RecoveryTSI); 10534 } 10535 10536 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 10537 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10538 E->getNumTemplateArgs(), 10539 TransArgs)) 10540 return ExprError(); 10541 10542 return getDerived().RebuildDependentScopeDeclRefExpr( 10543 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 10544 RecoveryTSI); 10545 } 10546 10547 template<typename Derived> 10548 ExprResult 10549 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 10550 // CXXConstructExprs other than for list-initialization and 10551 // CXXTemporaryObjectExpr are always implicit, so when we have 10552 // a 1-argument construction we just transform that argument. 10553 if ((E->getNumArgs() == 1 || 10554 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 10555 (!getDerived().DropCallArgument(E->getArg(0))) && 10556 !E->isListInitialization()) 10557 return getDerived().TransformExpr(E->getArg(0)); 10558 10559 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 10560 10561 QualType T = getDerived().TransformType(E->getType()); 10562 if (T.isNull()) 10563 return ExprError(); 10564 10565 CXXConstructorDecl *Constructor 10566 = cast_or_null<CXXConstructorDecl>( 10567 getDerived().TransformDecl(E->getLocStart(), 10568 E->getConstructor())); 10569 if (!Constructor) 10570 return ExprError(); 10571 10572 bool ArgumentChanged = false; 10573 SmallVector<Expr*, 8> Args; 10574 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10575 &ArgumentChanged)) 10576 return ExprError(); 10577 10578 if (!getDerived().AlwaysRebuild() && 10579 T == E->getType() && 10580 Constructor == E->getConstructor() && 10581 !ArgumentChanged) { 10582 // Mark the constructor as referenced. 10583 // FIXME: Instantiation-specific 10584 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10585 return E; 10586 } 10587 10588 return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 10589 Constructor, 10590 E->isElidable(), Args, 10591 E->hadMultipleCandidates(), 10592 E->isListInitialization(), 10593 E->isStdInitListInitialization(), 10594 E->requiresZeroInitialization(), 10595 E->getConstructionKind(), 10596 E->getParenOrBraceRange()); 10597 } 10598 10599 template<typename Derived> 10600 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 10601 CXXInheritedCtorInitExpr *E) { 10602 QualType T = getDerived().TransformType(E->getType()); 10603 if (T.isNull()) 10604 return ExprError(); 10605 10606 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10607 getDerived().TransformDecl(E->getLocStart(), E->getConstructor())); 10608 if (!Constructor) 10609 return ExprError(); 10610 10611 if (!getDerived().AlwaysRebuild() && 10612 T == E->getType() && 10613 Constructor == E->getConstructor()) { 10614 // Mark the constructor as referenced. 10615 // FIXME: Instantiation-specific 10616 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10617 return E; 10618 } 10619 10620 return getDerived().RebuildCXXInheritedCtorInitExpr( 10621 T, E->getLocation(), Constructor, 10622 E->constructsVBase(), E->inheritedFromVBase()); 10623 } 10624 10625 /// \brief Transform a C++ temporary-binding expression. 10626 /// 10627 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 10628 /// transform the subexpression and return that. 10629 template<typename Derived> 10630 ExprResult 10631 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 10632 return getDerived().TransformExpr(E->getSubExpr()); 10633 } 10634 10635 /// \brief Transform a C++ expression that contains cleanups that should 10636 /// be run after the expression is evaluated. 10637 /// 10638 /// Since ExprWithCleanups nodes are implicitly generated, we 10639 /// just transform the subexpression and return that. 10640 template<typename Derived> 10641 ExprResult 10642 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 10643 return getDerived().TransformExpr(E->getSubExpr()); 10644 } 10645 10646 template<typename Derived> 10647 ExprResult 10648 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 10649 CXXTemporaryObjectExpr *E) { 10650 TypeSourceInfo *T = 10651 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 10652 if (!T) 10653 return ExprError(); 10654 10655 CXXConstructorDecl *Constructor 10656 = cast_or_null<CXXConstructorDecl>( 10657 getDerived().TransformDecl(E->getLocStart(), 10658 E->getConstructor())); 10659 if (!Constructor) 10660 return ExprError(); 10661 10662 bool ArgumentChanged = false; 10663 SmallVector<Expr*, 8> Args; 10664 Args.reserve(E->getNumArgs()); 10665 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10666 &ArgumentChanged)) 10667 return ExprError(); 10668 10669 if (!getDerived().AlwaysRebuild() && 10670 T == E->getTypeSourceInfo() && 10671 Constructor == E->getConstructor() && 10672 !ArgumentChanged) { 10673 // FIXME: Instantiation-specific 10674 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10675 return SemaRef.MaybeBindToTemporary(E); 10676 } 10677 10678 // FIXME: Pass in E->isListInitialization(). 10679 return getDerived().RebuildCXXTemporaryObjectExpr(T, 10680 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10681 Args, 10682 E->getLocEnd()); 10683 } 10684 10685 template<typename Derived> 10686 ExprResult 10687 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 10688 // Transform any init-capture expressions before entering the scope of the 10689 // lambda body, because they are not semantically within that scope. 10690 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 10691 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 10692 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 10693 E->explicit_capture_begin()); 10694 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10695 CEnd = E->capture_end(); 10696 C != CEnd; ++C) { 10697 if (!E->isInitCapture(C)) 10698 continue; 10699 EnterExpressionEvaluationContext EEEC( 10700 getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 10701 ExprResult NewExprInitResult = getDerived().TransformInitializer( 10702 C->getCapturedVar()->getInit(), 10703 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 10704 10705 if (NewExprInitResult.isInvalid()) 10706 return ExprError(); 10707 Expr *NewExprInit = NewExprInitResult.get(); 10708 10709 VarDecl *OldVD = C->getCapturedVar(); 10710 QualType NewInitCaptureType = 10711 getSema().buildLambdaInitCaptureInitialization( 10712 C->getLocation(), OldVD->getType()->isReferenceType(), 10713 OldVD->getIdentifier(), 10714 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit); 10715 NewExprInitResult = NewExprInit; 10716 InitCaptureExprsAndTypes[C - E->capture_begin()] = 10717 std::make_pair(NewExprInitResult, NewInitCaptureType); 10718 } 10719 10720 // Transform the template parameters, and add them to the current 10721 // instantiation scope. The null case is handled correctly. 10722 auto TPL = getDerived().TransformTemplateParameterList( 10723 E->getTemplateParameterList()); 10724 10725 // Transform the type of the original lambda's call operator. 10726 // The transformation MUST be done in the CurrentInstantiationScope since 10727 // it introduces a mapping of the original to the newly created 10728 // transformed parameters. 10729 TypeSourceInfo *NewCallOpTSI = nullptr; 10730 { 10731 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 10732 FunctionProtoTypeLoc OldCallOpFPTL = 10733 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 10734 10735 TypeLocBuilder NewCallOpTLBuilder; 10736 SmallVector<QualType, 4> ExceptionStorage; 10737 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 10738 QualType NewCallOpType = TransformFunctionProtoType( 10739 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0, 10740 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 10741 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 10742 ExceptionStorage, Changed); 10743 }); 10744 if (NewCallOpType.isNull()) 10745 return ExprError(); 10746 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 10747 NewCallOpType); 10748 } 10749 10750 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 10751 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 10752 LSI->GLTemplateParameterList = TPL; 10753 10754 // Create the local class that will describe the lambda. 10755 CXXRecordDecl *Class 10756 = getSema().createLambdaClosureType(E->getIntroducerRange(), 10757 NewCallOpTSI, 10758 /*KnownDependent=*/false, 10759 E->getCaptureDefault()); 10760 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 10761 10762 // Build the call operator. 10763 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 10764 Class, E->getIntroducerRange(), NewCallOpTSI, 10765 E->getCallOperator()->getLocEnd(), 10766 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 10767 E->getCallOperator()->isConstexpr()); 10768 10769 LSI->CallOperator = NewCallOperator; 10770 10771 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 10772 I != NumParams; ++I) { 10773 auto *P = NewCallOperator->getParamDecl(I); 10774 if (P->hasUninstantiatedDefaultArg()) { 10775 EnterExpressionEvaluationContext Eval( 10776 getSema(), 10777 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 10778 ExprResult R = getDerived().TransformExpr( 10779 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 10780 P->setDefaultArg(R.get()); 10781 } 10782 } 10783 10784 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 10785 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 10786 10787 // Introduce the context of the call operator. 10788 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 10789 /*NewThisContext*/false); 10790 10791 // Enter the scope of the lambda. 10792 getSema().buildLambdaScope(LSI, NewCallOperator, 10793 E->getIntroducerRange(), 10794 E->getCaptureDefault(), 10795 E->getCaptureDefaultLoc(), 10796 E->hasExplicitParameters(), 10797 E->hasExplicitResultType(), 10798 E->isMutable()); 10799 10800 bool Invalid = false; 10801 10802 // Transform captures. 10803 bool FinishedExplicitCaptures = false; 10804 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10805 CEnd = E->capture_end(); 10806 C != CEnd; ++C) { 10807 // When we hit the first implicit capture, tell Sema that we've finished 10808 // the list of explicit captures. 10809 if (!FinishedExplicitCaptures && C->isImplicit()) { 10810 getSema().finishLambdaExplicitCaptures(LSI); 10811 FinishedExplicitCaptures = true; 10812 } 10813 10814 // Capturing 'this' is trivial. 10815 if (C->capturesThis()) { 10816 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 10817 /*BuildAndDiagnose*/ true, nullptr, 10818 C->getCaptureKind() == LCK_StarThis); 10819 continue; 10820 } 10821 // Captured expression will be recaptured during captured variables 10822 // rebuilding. 10823 if (C->capturesVLAType()) 10824 continue; 10825 10826 // Rebuild init-captures, including the implied field declaration. 10827 if (E->isInitCapture(C)) { 10828 InitCaptureInfoTy InitExprTypePair = 10829 InitCaptureExprsAndTypes[C - E->capture_begin()]; 10830 ExprResult Init = InitExprTypePair.first; 10831 QualType InitQualType = InitExprTypePair.second; 10832 if (Init.isInvalid() || InitQualType.isNull()) { 10833 Invalid = true; 10834 continue; 10835 } 10836 VarDecl *OldVD = C->getCapturedVar(); 10837 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 10838 OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(), 10839 OldVD->getInitStyle(), Init.get()); 10840 if (!NewVD) 10841 Invalid = true; 10842 else { 10843 getDerived().transformedLocalDecl(OldVD, NewVD); 10844 } 10845 getSema().buildInitCaptureField(LSI, NewVD); 10846 continue; 10847 } 10848 10849 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 10850 10851 // Determine the capture kind for Sema. 10852 Sema::TryCaptureKind Kind 10853 = C->isImplicit()? Sema::TryCapture_Implicit 10854 : C->getCaptureKind() == LCK_ByCopy 10855 ? Sema::TryCapture_ExplicitByVal 10856 : Sema::TryCapture_ExplicitByRef; 10857 SourceLocation EllipsisLoc; 10858 if (C->isPackExpansion()) { 10859 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 10860 bool ShouldExpand = false; 10861 bool RetainExpansion = false; 10862 Optional<unsigned> NumExpansions; 10863 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 10864 C->getLocation(), 10865 Unexpanded, 10866 ShouldExpand, RetainExpansion, 10867 NumExpansions)) { 10868 Invalid = true; 10869 continue; 10870 } 10871 10872 if (ShouldExpand) { 10873 // The transform has determined that we should perform an expansion; 10874 // transform and capture each of the arguments. 10875 // expansion of the pattern. Do so. 10876 VarDecl *Pack = C->getCapturedVar(); 10877 for (unsigned I = 0; I != *NumExpansions; ++I) { 10878 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 10879 VarDecl *CapturedVar 10880 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 10881 Pack)); 10882 if (!CapturedVar) { 10883 Invalid = true; 10884 continue; 10885 } 10886 10887 // Capture the transformed variable. 10888 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 10889 } 10890 10891 // FIXME: Retain a pack expansion if RetainExpansion is true. 10892 10893 continue; 10894 } 10895 10896 EllipsisLoc = C->getEllipsisLoc(); 10897 } 10898 10899 // Transform the captured variable. 10900 VarDecl *CapturedVar 10901 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 10902 C->getCapturedVar())); 10903 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 10904 Invalid = true; 10905 continue; 10906 } 10907 10908 // Capture the transformed variable. 10909 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 10910 EllipsisLoc); 10911 } 10912 if (!FinishedExplicitCaptures) 10913 getSema().finishLambdaExplicitCaptures(LSI); 10914 10915 // Enter a new evaluation context to insulate the lambda from any 10916 // cleanups from the enclosing full-expression. 10917 getSema().PushExpressionEvaluationContext( 10918 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 10919 10920 // Instantiate the body of the lambda expression. 10921 StmtResult Body = 10922 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 10923 10924 // ActOnLambda* will pop the function scope for us. 10925 FuncScopeCleanup.disable(); 10926 10927 if (Body.isInvalid()) { 10928 SavedContext.pop(); 10929 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr, 10930 /*IsInstantiation=*/true); 10931 return ExprError(); 10932 } 10933 10934 // Copy the LSI before ActOnFinishFunctionBody removes it. 10935 // FIXME: This is dumb. Store the lambda information somewhere that outlives 10936 // the call operator. 10937 auto LSICopy = *LSI; 10938 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 10939 /*IsInstantiation*/ true); 10940 SavedContext.pop(); 10941 10942 return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(), 10943 &LSICopy); 10944 } 10945 10946 template<typename Derived> 10947 ExprResult 10948 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 10949 CXXUnresolvedConstructExpr *E) { 10950 TypeSourceInfo *T = 10951 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 10952 if (!T) 10953 return ExprError(); 10954 10955 bool ArgumentChanged = false; 10956 SmallVector<Expr*, 8> Args; 10957 Args.reserve(E->arg_size()); 10958 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 10959 &ArgumentChanged)) 10960 return ExprError(); 10961 10962 if (!getDerived().AlwaysRebuild() && 10963 T == E->getTypeSourceInfo() && 10964 !ArgumentChanged) 10965 return E; 10966 10967 // FIXME: we're faking the locations of the commas 10968 return getDerived().RebuildCXXUnresolvedConstructExpr(T, 10969 E->getLParenLoc(), 10970 Args, 10971 E->getRParenLoc()); 10972 } 10973 10974 template<typename Derived> 10975 ExprResult 10976 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 10977 CXXDependentScopeMemberExpr *E) { 10978 // Transform the base of the expression. 10979 ExprResult Base((Expr*) nullptr); 10980 Expr *OldBase; 10981 QualType BaseType; 10982 QualType ObjectType; 10983 if (!E->isImplicitAccess()) { 10984 OldBase = E->getBase(); 10985 Base = getDerived().TransformExpr(OldBase); 10986 if (Base.isInvalid()) 10987 return ExprError(); 10988 10989 // Start the member reference and compute the object's type. 10990 ParsedType ObjectTy; 10991 bool MayBePseudoDestructor = false; 10992 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10993 E->getOperatorLoc(), 10994 E->isArrow()? tok::arrow : tok::period, 10995 ObjectTy, 10996 MayBePseudoDestructor); 10997 if (Base.isInvalid()) 10998 return ExprError(); 10999 11000 ObjectType = ObjectTy.get(); 11001 BaseType = ((Expr*) Base.get())->getType(); 11002 } else { 11003 OldBase = nullptr; 11004 BaseType = getDerived().TransformType(E->getBaseType()); 11005 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 11006 } 11007 11008 // Transform the first part of the nested-name-specifier that qualifies 11009 // the member name. 11010 NamedDecl *FirstQualifierInScope 11011 = getDerived().TransformFirstQualifierInScope( 11012 E->getFirstQualifierFoundInScope(), 11013 E->getQualifierLoc().getBeginLoc()); 11014 11015 NestedNameSpecifierLoc QualifierLoc; 11016 if (E->getQualifier()) { 11017 QualifierLoc 11018 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 11019 ObjectType, 11020 FirstQualifierInScope); 11021 if (!QualifierLoc) 11022 return ExprError(); 11023 } 11024 11025 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11026 11027 // TODO: If this is a conversion-function-id, verify that the 11028 // destination type name (if present) resolves the same way after 11029 // instantiation as it did in the local scope. 11030 11031 DeclarationNameInfo NameInfo 11032 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 11033 if (!NameInfo.getName()) 11034 return ExprError(); 11035 11036 if (!E->hasExplicitTemplateArgs()) { 11037 // This is a reference to a member without an explicitly-specified 11038 // template argument list. Optimize for this common case. 11039 if (!getDerived().AlwaysRebuild() && 11040 Base.get() == OldBase && 11041 BaseType == E->getBaseType() && 11042 QualifierLoc == E->getQualifierLoc() && 11043 NameInfo.getName() == E->getMember() && 11044 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 11045 return E; 11046 11047 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11048 BaseType, 11049 E->isArrow(), 11050 E->getOperatorLoc(), 11051 QualifierLoc, 11052 TemplateKWLoc, 11053 FirstQualifierInScope, 11054 NameInfo, 11055 /*TemplateArgs*/nullptr); 11056 } 11057 11058 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11059 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11060 E->getNumTemplateArgs(), 11061 TransArgs)) 11062 return ExprError(); 11063 11064 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11065 BaseType, 11066 E->isArrow(), 11067 E->getOperatorLoc(), 11068 QualifierLoc, 11069 TemplateKWLoc, 11070 FirstQualifierInScope, 11071 NameInfo, 11072 &TransArgs); 11073 } 11074 11075 template<typename Derived> 11076 ExprResult 11077 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 11078 // Transform the base of the expression. 11079 ExprResult Base((Expr*) nullptr); 11080 QualType BaseType; 11081 if (!Old->isImplicitAccess()) { 11082 Base = getDerived().TransformExpr(Old->getBase()); 11083 if (Base.isInvalid()) 11084 return ExprError(); 11085 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 11086 Old->isArrow()); 11087 if (Base.isInvalid()) 11088 return ExprError(); 11089 BaseType = Base.get()->getType(); 11090 } else { 11091 BaseType = getDerived().TransformType(Old->getBaseType()); 11092 } 11093 11094 NestedNameSpecifierLoc QualifierLoc; 11095 if (Old->getQualifierLoc()) { 11096 QualifierLoc 11097 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11098 if (!QualifierLoc) 11099 return ExprError(); 11100 } 11101 11102 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11103 11104 LookupResult R(SemaRef, Old->getMemberNameInfo(), 11105 Sema::LookupOrdinaryName); 11106 11107 // Transform the declaration set. 11108 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 11109 return ExprError(); 11110 11111 // Determine the naming class. 11112 if (Old->getNamingClass()) { 11113 CXXRecordDecl *NamingClass 11114 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11115 Old->getMemberLoc(), 11116 Old->getNamingClass())); 11117 if (!NamingClass) 11118 return ExprError(); 11119 11120 R.setNamingClass(NamingClass); 11121 } 11122 11123 TemplateArgumentListInfo TransArgs; 11124 if (Old->hasExplicitTemplateArgs()) { 11125 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 11126 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 11127 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11128 Old->getNumTemplateArgs(), 11129 TransArgs)) 11130 return ExprError(); 11131 } 11132 11133 // FIXME: to do this check properly, we will need to preserve the 11134 // first-qualifier-in-scope here, just in case we had a dependent 11135 // base (and therefore couldn't do the check) and a 11136 // nested-name-qualifier (and therefore could do the lookup). 11137 NamedDecl *FirstQualifierInScope = nullptr; 11138 11139 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 11140 BaseType, 11141 Old->getOperatorLoc(), 11142 Old->isArrow(), 11143 QualifierLoc, 11144 TemplateKWLoc, 11145 FirstQualifierInScope, 11146 R, 11147 (Old->hasExplicitTemplateArgs() 11148 ? &TransArgs : nullptr)); 11149 } 11150 11151 template<typename Derived> 11152 ExprResult 11153 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 11154 EnterExpressionEvaluationContext Unevaluated( 11155 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11156 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 11157 if (SubExpr.isInvalid()) 11158 return ExprError(); 11159 11160 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 11161 return E; 11162 11163 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 11164 } 11165 11166 template<typename Derived> 11167 ExprResult 11168 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 11169 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 11170 if (Pattern.isInvalid()) 11171 return ExprError(); 11172 11173 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 11174 return E; 11175 11176 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 11177 E->getNumExpansions()); 11178 } 11179 11180 template<typename Derived> 11181 ExprResult 11182 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 11183 // If E is not value-dependent, then nothing will change when we transform it. 11184 // Note: This is an instantiation-centric view. 11185 if (!E->isValueDependent()) 11186 return E; 11187 11188 EnterExpressionEvaluationContext Unevaluated( 11189 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 11190 11191 ArrayRef<TemplateArgument> PackArgs; 11192 TemplateArgument ArgStorage; 11193 11194 // Find the argument list to transform. 11195 if (E->isPartiallySubstituted()) { 11196 PackArgs = E->getPartialArguments(); 11197 } else if (E->isValueDependent()) { 11198 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 11199 bool ShouldExpand = false; 11200 bool RetainExpansion = false; 11201 Optional<unsigned> NumExpansions; 11202 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 11203 Unexpanded, 11204 ShouldExpand, RetainExpansion, 11205 NumExpansions)) 11206 return ExprError(); 11207 11208 // If we need to expand the pack, build a template argument from it and 11209 // expand that. 11210 if (ShouldExpand) { 11211 auto *Pack = E->getPack(); 11212 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 11213 ArgStorage = getSema().Context.getPackExpansionType( 11214 getSema().Context.getTypeDeclType(TTPD), None); 11215 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 11216 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 11217 } else { 11218 auto *VD = cast<ValueDecl>(Pack); 11219 ExprResult DRE = getSema().BuildDeclRefExpr(VD, VD->getType(), 11220 VK_RValue, E->getPackLoc()); 11221 if (DRE.isInvalid()) 11222 return ExprError(); 11223 ArgStorage = new (getSema().Context) PackExpansionExpr( 11224 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 11225 } 11226 PackArgs = ArgStorage; 11227 } 11228 } 11229 11230 // If we're not expanding the pack, just transform the decl. 11231 if (!PackArgs.size()) { 11232 auto *Pack = cast_or_null<NamedDecl>( 11233 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 11234 if (!Pack) 11235 return ExprError(); 11236 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 11237 E->getPackLoc(), 11238 E->getRParenLoc(), None, None); 11239 } 11240 11241 // Try to compute the result without performing a partial substitution. 11242 Optional<unsigned> Result = 0; 11243 for (const TemplateArgument &Arg : PackArgs) { 11244 if (!Arg.isPackExpansion()) { 11245 Result = *Result + 1; 11246 continue; 11247 } 11248 11249 TemplateArgumentLoc ArgLoc; 11250 InventTemplateArgumentLoc(Arg, ArgLoc); 11251 11252 // Find the pattern of the pack expansion. 11253 SourceLocation Ellipsis; 11254 Optional<unsigned> OrigNumExpansions; 11255 TemplateArgumentLoc Pattern = 11256 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 11257 OrigNumExpansions); 11258 11259 // Substitute under the pack expansion. Do not expand the pack (yet). 11260 TemplateArgumentLoc OutPattern; 11261 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11262 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 11263 /*Uneval*/ true)) 11264 return true; 11265 11266 // See if we can determine the number of arguments from the result. 11267 Optional<unsigned> NumExpansions = 11268 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 11269 if (!NumExpansions) { 11270 // No: we must be in an alias template expansion, and we're going to need 11271 // to actually expand the packs. 11272 Result = None; 11273 break; 11274 } 11275 11276 Result = *Result + *NumExpansions; 11277 } 11278 11279 // Common case: we could determine the number of expansions without 11280 // substituting. 11281 if (Result) 11282 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11283 E->getPackLoc(), 11284 E->getRParenLoc(), *Result, None); 11285 11286 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 11287 E->getPackLoc()); 11288 { 11289 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 11290 typedef TemplateArgumentLocInventIterator< 11291 Derived, const TemplateArgument*> PackLocIterator; 11292 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 11293 PackLocIterator(*this, PackArgs.end()), 11294 TransformedPackArgs, /*Uneval*/true)) 11295 return ExprError(); 11296 } 11297 11298 // Check whether we managed to fully-expand the pack. 11299 // FIXME: Is it possible for us to do so and not hit the early exit path? 11300 SmallVector<TemplateArgument, 8> Args; 11301 bool PartialSubstitution = false; 11302 for (auto &Loc : TransformedPackArgs.arguments()) { 11303 Args.push_back(Loc.getArgument()); 11304 if (Loc.getArgument().isPackExpansion()) 11305 PartialSubstitution = true; 11306 } 11307 11308 if (PartialSubstitution) 11309 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11310 E->getPackLoc(), 11311 E->getRParenLoc(), None, Args); 11312 11313 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11314 E->getPackLoc(), E->getRParenLoc(), 11315 Args.size(), None); 11316 } 11317 11318 template<typename Derived> 11319 ExprResult 11320 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 11321 SubstNonTypeTemplateParmPackExpr *E) { 11322 // Default behavior is to do nothing with this transformation. 11323 return E; 11324 } 11325 11326 template<typename Derived> 11327 ExprResult 11328 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 11329 SubstNonTypeTemplateParmExpr *E) { 11330 // Default behavior is to do nothing with this transformation. 11331 return E; 11332 } 11333 11334 template<typename Derived> 11335 ExprResult 11336 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 11337 // Default behavior is to do nothing with this transformation. 11338 return E; 11339 } 11340 11341 template<typename Derived> 11342 ExprResult 11343 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 11344 MaterializeTemporaryExpr *E) { 11345 return getDerived().TransformExpr(E->GetTemporaryExpr()); 11346 } 11347 11348 template<typename Derived> 11349 ExprResult 11350 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 11351 Expr *Pattern = E->getPattern(); 11352 11353 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11354 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 11355 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11356 11357 // Determine whether the set of unexpanded parameter packs can and should 11358 // be expanded. 11359 bool Expand = true; 11360 bool RetainExpansion = false; 11361 Optional<unsigned> NumExpansions; 11362 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 11363 Pattern->getSourceRange(), 11364 Unexpanded, 11365 Expand, RetainExpansion, 11366 NumExpansions)) 11367 return true; 11368 11369 if (!Expand) { 11370 // Do not expand any packs here, just transform and rebuild a fold 11371 // expression. 11372 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11373 11374 ExprResult LHS = 11375 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 11376 if (LHS.isInvalid()) 11377 return true; 11378 11379 ExprResult RHS = 11380 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 11381 if (RHS.isInvalid()) 11382 return true; 11383 11384 if (!getDerived().AlwaysRebuild() && 11385 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 11386 return E; 11387 11388 return getDerived().RebuildCXXFoldExpr( 11389 E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 11390 RHS.get(), E->getLocEnd()); 11391 } 11392 11393 // The transform has determined that we should perform an elementwise 11394 // expansion of the pattern. Do so. 11395 ExprResult Result = getDerived().TransformExpr(E->getInit()); 11396 if (Result.isInvalid()) 11397 return true; 11398 bool LeftFold = E->isLeftFold(); 11399 11400 // If we're retaining an expansion for a right fold, it is the innermost 11401 // component and takes the init (if any). 11402 if (!LeftFold && RetainExpansion) { 11403 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11404 11405 ExprResult Out = getDerived().TransformExpr(Pattern); 11406 if (Out.isInvalid()) 11407 return true; 11408 11409 Result = getDerived().RebuildCXXFoldExpr( 11410 E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 11411 Result.get(), E->getLocEnd()); 11412 if (Result.isInvalid()) 11413 return true; 11414 } 11415 11416 for (unsigned I = 0; I != *NumExpansions; ++I) { 11417 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 11418 getSema(), LeftFold ? I : *NumExpansions - I - 1); 11419 ExprResult Out = getDerived().TransformExpr(Pattern); 11420 if (Out.isInvalid()) 11421 return true; 11422 11423 if (Out.get()->containsUnexpandedParameterPack()) { 11424 // We still have a pack; retain a pack expansion for this slice. 11425 Result = getDerived().RebuildCXXFoldExpr( 11426 E->getLocStart(), 11427 LeftFold ? Result.get() : Out.get(), 11428 E->getOperator(), E->getEllipsisLoc(), 11429 LeftFold ? Out.get() : Result.get(), 11430 E->getLocEnd()); 11431 } else if (Result.isUsable()) { 11432 // We've got down to a single element; build a binary operator. 11433 Result = getDerived().RebuildBinaryOperator( 11434 E->getEllipsisLoc(), E->getOperator(), 11435 LeftFold ? Result.get() : Out.get(), 11436 LeftFold ? Out.get() : Result.get()); 11437 } else 11438 Result = Out; 11439 11440 if (Result.isInvalid()) 11441 return true; 11442 } 11443 11444 // If we're retaining an expansion for a left fold, it is the outermost 11445 // component and takes the complete expansion so far as its init (if any). 11446 if (LeftFold && RetainExpansion) { 11447 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11448 11449 ExprResult Out = getDerived().TransformExpr(Pattern); 11450 if (Out.isInvalid()) 11451 return true; 11452 11453 Result = getDerived().RebuildCXXFoldExpr( 11454 E->getLocStart(), Result.get(), 11455 E->getOperator(), E->getEllipsisLoc(), 11456 Out.get(), E->getLocEnd()); 11457 if (Result.isInvalid()) 11458 return true; 11459 } 11460 11461 // If we had no init and an empty pack, and we're not retaining an expansion, 11462 // then produce a fallback value or error. 11463 if (Result.isUnset()) 11464 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 11465 E->getOperator()); 11466 11467 return Result; 11468 } 11469 11470 template<typename Derived> 11471 ExprResult 11472 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 11473 CXXStdInitializerListExpr *E) { 11474 return getDerived().TransformExpr(E->getSubExpr()); 11475 } 11476 11477 template<typename Derived> 11478 ExprResult 11479 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 11480 return SemaRef.MaybeBindToTemporary(E); 11481 } 11482 11483 template<typename Derived> 11484 ExprResult 11485 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 11486 return E; 11487 } 11488 11489 template<typename Derived> 11490 ExprResult 11491 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 11492 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11493 if (SubExpr.isInvalid()) 11494 return ExprError(); 11495 11496 if (!getDerived().AlwaysRebuild() && 11497 SubExpr.get() == E->getSubExpr()) 11498 return E; 11499 11500 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 11501 } 11502 11503 template<typename Derived> 11504 ExprResult 11505 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 11506 // Transform each of the elements. 11507 SmallVector<Expr *, 8> Elements; 11508 bool ArgChanged = false; 11509 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 11510 /*IsCall=*/false, Elements, &ArgChanged)) 11511 return ExprError(); 11512 11513 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11514 return SemaRef.MaybeBindToTemporary(E); 11515 11516 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 11517 Elements.data(), 11518 Elements.size()); 11519 } 11520 11521 template<typename Derived> 11522 ExprResult 11523 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 11524 ObjCDictionaryLiteral *E) { 11525 // Transform each of the elements. 11526 SmallVector<ObjCDictionaryElement, 8> Elements; 11527 bool ArgChanged = false; 11528 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 11529 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 11530 11531 if (OrigElement.isPackExpansion()) { 11532 // This key/value element is a pack expansion. 11533 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11534 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 11535 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 11536 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11537 11538 // Determine whether the set of unexpanded parameter packs can 11539 // and should be expanded. 11540 bool Expand = true; 11541 bool RetainExpansion = false; 11542 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 11543 Optional<unsigned> NumExpansions = OrigNumExpansions; 11544 SourceRange PatternRange(OrigElement.Key->getLocStart(), 11545 OrigElement.Value->getLocEnd()); 11546 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 11547 PatternRange, 11548 Unexpanded, 11549 Expand, RetainExpansion, 11550 NumExpansions)) 11551 return ExprError(); 11552 11553 if (!Expand) { 11554 // The transform has determined that we should perform a simple 11555 // transformation on the pack expansion, producing another pack 11556 // expansion. 11557 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11558 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11559 if (Key.isInvalid()) 11560 return ExprError(); 11561 11562 if (Key.get() != OrigElement.Key) 11563 ArgChanged = true; 11564 11565 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11566 if (Value.isInvalid()) 11567 return ExprError(); 11568 11569 if (Value.get() != OrigElement.Value) 11570 ArgChanged = true; 11571 11572 ObjCDictionaryElement Expansion = { 11573 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 11574 }; 11575 Elements.push_back(Expansion); 11576 continue; 11577 } 11578 11579 // Record right away that the argument was changed. This needs 11580 // to happen even if the array expands to nothing. 11581 ArgChanged = true; 11582 11583 // The transform has determined that we should perform an elementwise 11584 // expansion of the pattern. Do so. 11585 for (unsigned I = 0; I != *NumExpansions; ++I) { 11586 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11587 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11588 if (Key.isInvalid()) 11589 return ExprError(); 11590 11591 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11592 if (Value.isInvalid()) 11593 return ExprError(); 11594 11595 ObjCDictionaryElement Element = { 11596 Key.get(), Value.get(), SourceLocation(), NumExpansions 11597 }; 11598 11599 // If any unexpanded parameter packs remain, we still have a 11600 // pack expansion. 11601 // FIXME: Can this really happen? 11602 if (Key.get()->containsUnexpandedParameterPack() || 11603 Value.get()->containsUnexpandedParameterPack()) 11604 Element.EllipsisLoc = OrigElement.EllipsisLoc; 11605 11606 Elements.push_back(Element); 11607 } 11608 11609 // FIXME: Retain a pack expansion if RetainExpansion is true. 11610 11611 // We've finished with this pack expansion. 11612 continue; 11613 } 11614 11615 // Transform and check key. 11616 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11617 if (Key.isInvalid()) 11618 return ExprError(); 11619 11620 if (Key.get() != OrigElement.Key) 11621 ArgChanged = true; 11622 11623 // Transform and check value. 11624 ExprResult Value 11625 = getDerived().TransformExpr(OrigElement.Value); 11626 if (Value.isInvalid()) 11627 return ExprError(); 11628 11629 if (Value.get() != OrigElement.Value) 11630 ArgChanged = true; 11631 11632 ObjCDictionaryElement Element = { 11633 Key.get(), Value.get(), SourceLocation(), None 11634 }; 11635 Elements.push_back(Element); 11636 } 11637 11638 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11639 return SemaRef.MaybeBindToTemporary(E); 11640 11641 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 11642 Elements); 11643 } 11644 11645 template<typename Derived> 11646 ExprResult 11647 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 11648 TypeSourceInfo *EncodedTypeInfo 11649 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 11650 if (!EncodedTypeInfo) 11651 return ExprError(); 11652 11653 if (!getDerived().AlwaysRebuild() && 11654 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 11655 return E; 11656 11657 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 11658 EncodedTypeInfo, 11659 E->getRParenLoc()); 11660 } 11661 11662 template<typename Derived> 11663 ExprResult TreeTransform<Derived>:: 11664 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 11665 // This is a kind of implicit conversion, and it needs to get dropped 11666 // and recomputed for the same general reasons that ImplicitCastExprs 11667 // do, as well a more specific one: this expression is only valid when 11668 // it appears *immediately* as an argument expression. 11669 return getDerived().TransformExpr(E->getSubExpr()); 11670 } 11671 11672 template<typename Derived> 11673 ExprResult TreeTransform<Derived>:: 11674 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 11675 TypeSourceInfo *TSInfo 11676 = getDerived().TransformType(E->getTypeInfoAsWritten()); 11677 if (!TSInfo) 11678 return ExprError(); 11679 11680 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 11681 if (Result.isInvalid()) 11682 return ExprError(); 11683 11684 if (!getDerived().AlwaysRebuild() && 11685 TSInfo == E->getTypeInfoAsWritten() && 11686 Result.get() == E->getSubExpr()) 11687 return E; 11688 11689 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 11690 E->getBridgeKeywordLoc(), TSInfo, 11691 Result.get()); 11692 } 11693 11694 template <typename Derived> 11695 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 11696 ObjCAvailabilityCheckExpr *E) { 11697 return E; 11698 } 11699 11700 template<typename Derived> 11701 ExprResult 11702 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 11703 // Transform arguments. 11704 bool ArgChanged = false; 11705 SmallVector<Expr*, 8> Args; 11706 Args.reserve(E->getNumArgs()); 11707 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 11708 &ArgChanged)) 11709 return ExprError(); 11710 11711 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 11712 // Class message: transform the receiver type. 11713 TypeSourceInfo *ReceiverTypeInfo 11714 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 11715 if (!ReceiverTypeInfo) 11716 return ExprError(); 11717 11718 // If nothing changed, just retain the existing message send. 11719 if (!getDerived().AlwaysRebuild() && 11720 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 11721 return SemaRef.MaybeBindToTemporary(E); 11722 11723 // Build a new class message send. 11724 SmallVector<SourceLocation, 16> SelLocs; 11725 E->getSelectorLocs(SelLocs); 11726 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 11727 E->getSelector(), 11728 SelLocs, 11729 E->getMethodDecl(), 11730 E->getLeftLoc(), 11731 Args, 11732 E->getRightLoc()); 11733 } 11734 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 11735 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 11736 if (!E->getMethodDecl()) 11737 return ExprError(); 11738 11739 // Build a new class message send to 'super'. 11740 SmallVector<SourceLocation, 16> SelLocs; 11741 E->getSelectorLocs(SelLocs); 11742 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 11743 E->getSelector(), 11744 SelLocs, 11745 E->getReceiverType(), 11746 E->getMethodDecl(), 11747 E->getLeftLoc(), 11748 Args, 11749 E->getRightLoc()); 11750 } 11751 11752 // Instance message: transform the receiver 11753 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 11754 "Only class and instance messages may be instantiated"); 11755 ExprResult Receiver 11756 = getDerived().TransformExpr(E->getInstanceReceiver()); 11757 if (Receiver.isInvalid()) 11758 return ExprError(); 11759 11760 // If nothing changed, just retain the existing message send. 11761 if (!getDerived().AlwaysRebuild() && 11762 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 11763 return SemaRef.MaybeBindToTemporary(E); 11764 11765 // Build a new instance message send. 11766 SmallVector<SourceLocation, 16> SelLocs; 11767 E->getSelectorLocs(SelLocs); 11768 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 11769 E->getSelector(), 11770 SelLocs, 11771 E->getMethodDecl(), 11772 E->getLeftLoc(), 11773 Args, 11774 E->getRightLoc()); 11775 } 11776 11777 template<typename Derived> 11778 ExprResult 11779 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 11780 return E; 11781 } 11782 11783 template<typename Derived> 11784 ExprResult 11785 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 11786 return E; 11787 } 11788 11789 template<typename Derived> 11790 ExprResult 11791 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 11792 // Transform the base expression. 11793 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11794 if (Base.isInvalid()) 11795 return ExprError(); 11796 11797 // We don't need to transform the ivar; it will never change. 11798 11799 // If nothing changed, just retain the existing expression. 11800 if (!getDerived().AlwaysRebuild() && 11801 Base.get() == E->getBase()) 11802 return E; 11803 11804 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 11805 E->getLocation(), 11806 E->isArrow(), E->isFreeIvar()); 11807 } 11808 11809 template<typename Derived> 11810 ExprResult 11811 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 11812 // 'super' and types never change. Property never changes. Just 11813 // retain the existing expression. 11814 if (!E->isObjectReceiver()) 11815 return E; 11816 11817 // Transform the base expression. 11818 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11819 if (Base.isInvalid()) 11820 return ExprError(); 11821 11822 // We don't need to transform the property; it will never change. 11823 11824 // If nothing changed, just retain the existing expression. 11825 if (!getDerived().AlwaysRebuild() && 11826 Base.get() == E->getBase()) 11827 return E; 11828 11829 if (E->isExplicitProperty()) 11830 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 11831 E->getExplicitProperty(), 11832 E->getLocation()); 11833 11834 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 11835 SemaRef.Context.PseudoObjectTy, 11836 E->getImplicitPropertyGetter(), 11837 E->getImplicitPropertySetter(), 11838 E->getLocation()); 11839 } 11840 11841 template<typename Derived> 11842 ExprResult 11843 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 11844 // Transform the base expression. 11845 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 11846 if (Base.isInvalid()) 11847 return ExprError(); 11848 11849 // Transform the key expression. 11850 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 11851 if (Key.isInvalid()) 11852 return ExprError(); 11853 11854 // If nothing changed, just retain the existing expression. 11855 if (!getDerived().AlwaysRebuild() && 11856 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 11857 return E; 11858 11859 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 11860 Base.get(), Key.get(), 11861 E->getAtIndexMethodDecl(), 11862 E->setAtIndexMethodDecl()); 11863 } 11864 11865 template<typename Derived> 11866 ExprResult 11867 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 11868 // Transform the base expression. 11869 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11870 if (Base.isInvalid()) 11871 return ExprError(); 11872 11873 // If nothing changed, just retain the existing expression. 11874 if (!getDerived().AlwaysRebuild() && 11875 Base.get() == E->getBase()) 11876 return E; 11877 11878 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 11879 E->getOpLoc(), 11880 E->isArrow()); 11881 } 11882 11883 template<typename Derived> 11884 ExprResult 11885 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 11886 bool ArgumentChanged = false; 11887 SmallVector<Expr*, 8> SubExprs; 11888 SubExprs.reserve(E->getNumSubExprs()); 11889 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 11890 SubExprs, &ArgumentChanged)) 11891 return ExprError(); 11892 11893 if (!getDerived().AlwaysRebuild() && 11894 !ArgumentChanged) 11895 return E; 11896 11897 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 11898 SubExprs, 11899 E->getRParenLoc()); 11900 } 11901 11902 template<typename Derived> 11903 ExprResult 11904 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 11905 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 11906 if (SrcExpr.isInvalid()) 11907 return ExprError(); 11908 11909 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 11910 if (!Type) 11911 return ExprError(); 11912 11913 if (!getDerived().AlwaysRebuild() && 11914 Type == E->getTypeSourceInfo() && 11915 SrcExpr.get() == E->getSrcExpr()) 11916 return E; 11917 11918 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 11919 SrcExpr.get(), Type, 11920 E->getRParenLoc()); 11921 } 11922 11923 template<typename Derived> 11924 ExprResult 11925 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 11926 BlockDecl *oldBlock = E->getBlockDecl(); 11927 11928 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 11929 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 11930 11931 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 11932 blockScope->TheDecl->setBlockMissingReturnType( 11933 oldBlock->blockMissingReturnType()); 11934 11935 SmallVector<ParmVarDecl*, 4> params; 11936 SmallVector<QualType, 4> paramTypes; 11937 11938 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 11939 11940 // Parameter substitution. 11941 Sema::ExtParameterInfoBuilder extParamInfos; 11942 if (getDerived().TransformFunctionTypeParams( 11943 E->getCaretLocation(), oldBlock->parameters(), nullptr, 11944 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 11945 extParamInfos)) { 11946 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 11947 return ExprError(); 11948 } 11949 11950 QualType exprResultType = 11951 getDerived().TransformType(exprFunctionType->getReturnType()); 11952 11953 auto epi = exprFunctionType->getExtProtoInfo(); 11954 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 11955 11956 QualType functionType = 11957 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 11958 blockScope->FunctionType = functionType; 11959 11960 // Set the parameters on the block decl. 11961 if (!params.empty()) 11962 blockScope->TheDecl->setParams(params); 11963 11964 if (!oldBlock->blockMissingReturnType()) { 11965 blockScope->HasImplicitReturnType = false; 11966 blockScope->ReturnType = exprResultType; 11967 } 11968 11969 // Transform the body 11970 StmtResult body = getDerived().TransformStmt(E->getBody()); 11971 if (body.isInvalid()) { 11972 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 11973 return ExprError(); 11974 } 11975 11976 #ifndef NDEBUG 11977 // In builds with assertions, make sure that we captured everything we 11978 // captured before. 11979 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 11980 for (const auto &I : oldBlock->captures()) { 11981 VarDecl *oldCapture = I.getVariable(); 11982 11983 // Ignore parameter packs. 11984 if (isa<ParmVarDecl>(oldCapture) && 11985 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 11986 continue; 11987 11988 VarDecl *newCapture = 11989 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 11990 oldCapture)); 11991 assert(blockScope->CaptureMap.count(newCapture)); 11992 } 11993 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 11994 } 11995 #endif 11996 11997 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 11998 /*Scope=*/nullptr); 11999 } 12000 12001 template<typename Derived> 12002 ExprResult 12003 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 12004 llvm_unreachable("Cannot transform asType expressions yet"); 12005 } 12006 12007 template<typename Derived> 12008 ExprResult 12009 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 12010 QualType RetTy = getDerived().TransformType(E->getType()); 12011 bool ArgumentChanged = false; 12012 SmallVector<Expr*, 8> SubExprs; 12013 SubExprs.reserve(E->getNumSubExprs()); 12014 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12015 SubExprs, &ArgumentChanged)) 12016 return ExprError(); 12017 12018 if (!getDerived().AlwaysRebuild() && 12019 !ArgumentChanged) 12020 return E; 12021 12022 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 12023 RetTy, E->getOp(), E->getRParenLoc()); 12024 } 12025 12026 //===----------------------------------------------------------------------===// 12027 // Type reconstruction 12028 //===----------------------------------------------------------------------===// 12029 12030 template<typename Derived> 12031 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 12032 SourceLocation Star) { 12033 return SemaRef.BuildPointerType(PointeeType, Star, 12034 getDerived().getBaseEntity()); 12035 } 12036 12037 template<typename Derived> 12038 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 12039 SourceLocation Star) { 12040 return SemaRef.BuildBlockPointerType(PointeeType, Star, 12041 getDerived().getBaseEntity()); 12042 } 12043 12044 template<typename Derived> 12045 QualType 12046 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 12047 bool WrittenAsLValue, 12048 SourceLocation Sigil) { 12049 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 12050 Sigil, getDerived().getBaseEntity()); 12051 } 12052 12053 template<typename Derived> 12054 QualType 12055 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 12056 QualType ClassType, 12057 SourceLocation Sigil) { 12058 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 12059 getDerived().getBaseEntity()); 12060 } 12061 12062 template<typename Derived> 12063 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 12064 const ObjCTypeParamDecl *Decl, 12065 SourceLocation ProtocolLAngleLoc, 12066 ArrayRef<ObjCProtocolDecl *> Protocols, 12067 ArrayRef<SourceLocation> ProtocolLocs, 12068 SourceLocation ProtocolRAngleLoc) { 12069 return SemaRef.BuildObjCTypeParamType(Decl, 12070 ProtocolLAngleLoc, Protocols, 12071 ProtocolLocs, ProtocolRAngleLoc, 12072 /*FailOnError=*/true); 12073 } 12074 12075 template<typename Derived> 12076 QualType TreeTransform<Derived>::RebuildObjCObjectType( 12077 QualType BaseType, 12078 SourceLocation Loc, 12079 SourceLocation TypeArgsLAngleLoc, 12080 ArrayRef<TypeSourceInfo *> TypeArgs, 12081 SourceLocation TypeArgsRAngleLoc, 12082 SourceLocation ProtocolLAngleLoc, 12083 ArrayRef<ObjCProtocolDecl *> Protocols, 12084 ArrayRef<SourceLocation> ProtocolLocs, 12085 SourceLocation ProtocolRAngleLoc) { 12086 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 12087 TypeArgs, TypeArgsRAngleLoc, 12088 ProtocolLAngleLoc, Protocols, ProtocolLocs, 12089 ProtocolRAngleLoc, 12090 /*FailOnError=*/true); 12091 } 12092 12093 template<typename Derived> 12094 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 12095 QualType PointeeType, 12096 SourceLocation Star) { 12097 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 12098 } 12099 12100 template<typename Derived> 12101 QualType 12102 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 12103 ArrayType::ArraySizeModifier SizeMod, 12104 const llvm::APInt *Size, 12105 Expr *SizeExpr, 12106 unsigned IndexTypeQuals, 12107 SourceRange BracketsRange) { 12108 if (SizeExpr || !Size) 12109 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 12110 IndexTypeQuals, BracketsRange, 12111 getDerived().getBaseEntity()); 12112 12113 QualType Types[] = { 12114 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 12115 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 12116 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 12117 }; 12118 const unsigned NumTypes = llvm::array_lengthof(Types); 12119 QualType SizeType; 12120 for (unsigned I = 0; I != NumTypes; ++I) 12121 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 12122 SizeType = Types[I]; 12123 break; 12124 } 12125 12126 // Note that we can return a VariableArrayType here in the case where 12127 // the element type was a dependent VariableArrayType. 12128 IntegerLiteral *ArraySize 12129 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 12130 /*FIXME*/BracketsRange.getBegin()); 12131 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 12132 IndexTypeQuals, BracketsRange, 12133 getDerived().getBaseEntity()); 12134 } 12135 12136 template<typename Derived> 12137 QualType 12138 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 12139 ArrayType::ArraySizeModifier SizeMod, 12140 const llvm::APInt &Size, 12141 unsigned IndexTypeQuals, 12142 SourceRange BracketsRange) { 12143 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 12144 IndexTypeQuals, BracketsRange); 12145 } 12146 12147 template<typename Derived> 12148 QualType 12149 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 12150 ArrayType::ArraySizeModifier SizeMod, 12151 unsigned IndexTypeQuals, 12152 SourceRange BracketsRange) { 12153 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 12154 IndexTypeQuals, BracketsRange); 12155 } 12156 12157 template<typename Derived> 12158 QualType 12159 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 12160 ArrayType::ArraySizeModifier SizeMod, 12161 Expr *SizeExpr, 12162 unsigned IndexTypeQuals, 12163 SourceRange BracketsRange) { 12164 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12165 SizeExpr, 12166 IndexTypeQuals, BracketsRange); 12167 } 12168 12169 template<typename Derived> 12170 QualType 12171 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 12172 ArrayType::ArraySizeModifier SizeMod, 12173 Expr *SizeExpr, 12174 unsigned IndexTypeQuals, 12175 SourceRange BracketsRange) { 12176 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12177 SizeExpr, 12178 IndexTypeQuals, BracketsRange); 12179 } 12180 12181 template<typename Derived> 12182 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 12183 unsigned NumElements, 12184 VectorType::VectorKind VecKind) { 12185 // FIXME: semantic checking! 12186 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 12187 } 12188 12189 template<typename Derived> 12190 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 12191 unsigned NumElements, 12192 SourceLocation AttributeLoc) { 12193 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 12194 NumElements, true); 12195 IntegerLiteral *VectorSize 12196 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 12197 AttributeLoc); 12198 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 12199 } 12200 12201 template<typename Derived> 12202 QualType 12203 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 12204 Expr *SizeExpr, 12205 SourceLocation AttributeLoc) { 12206 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 12207 } 12208 12209 template<typename Derived> 12210 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 12211 QualType T, 12212 MutableArrayRef<QualType> ParamTypes, 12213 const FunctionProtoType::ExtProtoInfo &EPI) { 12214 return SemaRef.BuildFunctionType(T, ParamTypes, 12215 getDerived().getBaseLocation(), 12216 getDerived().getBaseEntity(), 12217 EPI); 12218 } 12219 12220 template<typename Derived> 12221 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 12222 return SemaRef.Context.getFunctionNoProtoType(T); 12223 } 12224 12225 template<typename Derived> 12226 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 12227 Decl *D) { 12228 assert(D && "no decl found"); 12229 if (D->isInvalidDecl()) return QualType(); 12230 12231 // FIXME: Doesn't account for ObjCInterfaceDecl! 12232 TypeDecl *Ty; 12233 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 12234 // A valid resolved using typename pack expansion decl can have multiple 12235 // UsingDecls, but they must each have exactly one type, and it must be 12236 // the same type in every case. But we must have at least one expansion! 12237 if (UPD->expansions().empty()) { 12238 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 12239 << UPD->isCXXClassMember() << UPD; 12240 return QualType(); 12241 } 12242 12243 // We might still have some unresolved types. Try to pick a resolved type 12244 // if we can. The final instantiation will check that the remaining 12245 // unresolved types instantiate to the type we pick. 12246 QualType FallbackT; 12247 QualType T; 12248 for (auto *E : UPD->expansions()) { 12249 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 12250 if (ThisT.isNull()) 12251 continue; 12252 else if (ThisT->getAs<UnresolvedUsingType>()) 12253 FallbackT = ThisT; 12254 else if (T.isNull()) 12255 T = ThisT; 12256 else 12257 assert(getSema().Context.hasSameType(ThisT, T) && 12258 "mismatched resolved types in using pack expansion"); 12259 } 12260 return T.isNull() ? FallbackT : T; 12261 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 12262 assert(Using->hasTypename() && 12263 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 12264 12265 // A valid resolved using typename decl points to exactly one type decl. 12266 assert(++Using->shadow_begin() == Using->shadow_end()); 12267 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 12268 } else { 12269 assert(isa<UnresolvedUsingTypenameDecl>(D) && 12270 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 12271 Ty = cast<UnresolvedUsingTypenameDecl>(D); 12272 } 12273 12274 return SemaRef.Context.getTypeDeclType(Ty); 12275 } 12276 12277 template<typename Derived> 12278 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 12279 SourceLocation Loc) { 12280 return SemaRef.BuildTypeofExprType(E, Loc); 12281 } 12282 12283 template<typename Derived> 12284 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 12285 return SemaRef.Context.getTypeOfType(Underlying); 12286 } 12287 12288 template<typename Derived> 12289 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 12290 SourceLocation Loc) { 12291 return SemaRef.BuildDecltypeType(E, Loc); 12292 } 12293 12294 template<typename Derived> 12295 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 12296 UnaryTransformType::UTTKind UKind, 12297 SourceLocation Loc) { 12298 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 12299 } 12300 12301 template<typename Derived> 12302 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 12303 TemplateName Template, 12304 SourceLocation TemplateNameLoc, 12305 TemplateArgumentListInfo &TemplateArgs) { 12306 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 12307 } 12308 12309 template<typename Derived> 12310 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 12311 SourceLocation KWLoc) { 12312 return SemaRef.BuildAtomicType(ValueType, KWLoc); 12313 } 12314 12315 template<typename Derived> 12316 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 12317 SourceLocation KWLoc, 12318 bool isReadPipe) { 12319 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 12320 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 12321 } 12322 12323 template<typename Derived> 12324 TemplateName 12325 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12326 bool TemplateKW, 12327 TemplateDecl *Template) { 12328 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 12329 Template); 12330 } 12331 12332 template<typename Derived> 12333 TemplateName 12334 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12335 const IdentifierInfo &Name, 12336 SourceLocation NameLoc, 12337 QualType ObjectType, 12338 NamedDecl *FirstQualifierInScope, 12339 bool AllowInjectedClassName) { 12340 UnqualifiedId TemplateName; 12341 TemplateName.setIdentifier(&Name, NameLoc); 12342 Sema::TemplateTy Template; 12343 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12344 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12345 SS, TemplateKWLoc, TemplateName, 12346 ParsedType::make(ObjectType), 12347 /*EnteringContext=*/false, 12348 Template, AllowInjectedClassName); 12349 return Template.get(); 12350 } 12351 12352 template<typename Derived> 12353 TemplateName 12354 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12355 OverloadedOperatorKind Operator, 12356 SourceLocation NameLoc, 12357 QualType ObjectType, 12358 bool AllowInjectedClassName) { 12359 UnqualifiedId Name; 12360 // FIXME: Bogus location information. 12361 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 12362 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 12363 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12364 Sema::TemplateTy Template; 12365 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12366 SS, TemplateKWLoc, Name, 12367 ParsedType::make(ObjectType), 12368 /*EnteringContext=*/false, 12369 Template, AllowInjectedClassName); 12370 return Template.get(); 12371 } 12372 12373 template<typename Derived> 12374 ExprResult 12375 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 12376 SourceLocation OpLoc, 12377 Expr *OrigCallee, 12378 Expr *First, 12379 Expr *Second) { 12380 Expr *Callee = OrigCallee->IgnoreParenCasts(); 12381 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 12382 12383 if (First->getObjectKind() == OK_ObjCProperty) { 12384 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12385 if (BinaryOperator::isAssignmentOp(Opc)) 12386 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 12387 First, Second); 12388 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 12389 if (Result.isInvalid()) 12390 return ExprError(); 12391 First = Result.get(); 12392 } 12393 12394 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 12395 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 12396 if (Result.isInvalid()) 12397 return ExprError(); 12398 Second = Result.get(); 12399 } 12400 12401 // Determine whether this should be a builtin operation. 12402 if (Op == OO_Subscript) { 12403 if (!First->getType()->isOverloadableType() && 12404 !Second->getType()->isOverloadableType()) 12405 return getSema().CreateBuiltinArraySubscriptExpr(First, 12406 Callee->getLocStart(), 12407 Second, OpLoc); 12408 } else if (Op == OO_Arrow) { 12409 // -> is never a builtin operation. 12410 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 12411 } else if (Second == nullptr || isPostIncDec) { 12412 if (!First->getType()->isOverloadableType()) { 12413 // The argument is not of overloadable type, so try to create a 12414 // built-in unary operation. 12415 UnaryOperatorKind Opc 12416 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12417 12418 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 12419 } 12420 } else { 12421 if (!First->getType()->isOverloadableType() && 12422 !Second->getType()->isOverloadableType()) { 12423 // Neither of the arguments is an overloadable type, so try to 12424 // create a built-in binary operation. 12425 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12426 ExprResult Result 12427 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 12428 if (Result.isInvalid()) 12429 return ExprError(); 12430 12431 return Result; 12432 } 12433 } 12434 12435 // Compute the transformed set of functions (and function templates) to be 12436 // used during overload resolution. 12437 UnresolvedSet<16> Functions; 12438 12439 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12440 assert(ULE->requiresADL()); 12441 Functions.append(ULE->decls_begin(), ULE->decls_end()); 12442 } else { 12443 // If we've resolved this to a particular non-member function, just call 12444 // that function. If we resolved it to a member function, 12445 // CreateOverloaded* will find that function for us. 12446 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 12447 if (!isa<CXXMethodDecl>(ND)) 12448 Functions.addDecl(ND); 12449 } 12450 12451 // Add any functions found via argument-dependent lookup. 12452 Expr *Args[2] = { First, Second }; 12453 unsigned NumArgs = 1 + (Second != nullptr); 12454 12455 // Create the overloaded operator invocation for unary operators. 12456 if (NumArgs == 1 || isPostIncDec) { 12457 UnaryOperatorKind Opc 12458 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12459 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First); 12460 } 12461 12462 if (Op == OO_Subscript) { 12463 SourceLocation LBrace; 12464 SourceLocation RBrace; 12465 12466 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 12467 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 12468 LBrace = SourceLocation::getFromRawEncoding( 12469 NameLoc.CXXOperatorName.BeginOpNameLoc); 12470 RBrace = SourceLocation::getFromRawEncoding( 12471 NameLoc.CXXOperatorName.EndOpNameLoc); 12472 } else { 12473 LBrace = Callee->getLocStart(); 12474 RBrace = OpLoc; 12475 } 12476 12477 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 12478 First, Second); 12479 } 12480 12481 // Create the overloaded operator invocation for binary operators. 12482 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12483 ExprResult Result 12484 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 12485 if (Result.isInvalid()) 12486 return ExprError(); 12487 12488 return Result; 12489 } 12490 12491 template<typename Derived> 12492 ExprResult 12493 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 12494 SourceLocation OperatorLoc, 12495 bool isArrow, 12496 CXXScopeSpec &SS, 12497 TypeSourceInfo *ScopeType, 12498 SourceLocation CCLoc, 12499 SourceLocation TildeLoc, 12500 PseudoDestructorTypeStorage Destroyed) { 12501 QualType BaseType = Base->getType(); 12502 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 12503 (!isArrow && !BaseType->getAs<RecordType>()) || 12504 (isArrow && BaseType->getAs<PointerType>() && 12505 !BaseType->getAs<PointerType>()->getPointeeType() 12506 ->template getAs<RecordType>())){ 12507 // This pseudo-destructor expression is still a pseudo-destructor. 12508 return SemaRef.BuildPseudoDestructorExpr( 12509 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 12510 CCLoc, TildeLoc, Destroyed); 12511 } 12512 12513 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 12514 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 12515 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 12516 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 12517 NameInfo.setNamedTypeInfo(DestroyedType); 12518 12519 // The scope type is now known to be a valid nested name specifier 12520 // component. Tack it on to the end of the nested name specifier. 12521 if (ScopeType) { 12522 if (!ScopeType->getType()->getAs<TagType>()) { 12523 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 12524 diag::err_expected_class_or_namespace) 12525 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 12526 return ExprError(); 12527 } 12528 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 12529 CCLoc); 12530 } 12531 12532 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12533 return getSema().BuildMemberReferenceExpr(Base, BaseType, 12534 OperatorLoc, isArrow, 12535 SS, TemplateKWLoc, 12536 /*FIXME: FirstQualifier*/ nullptr, 12537 NameInfo, 12538 /*TemplateArgs*/ nullptr, 12539 /*S*/nullptr); 12540 } 12541 12542 template<typename Derived> 12543 StmtResult 12544 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 12545 SourceLocation Loc = S->getLocStart(); 12546 CapturedDecl *CD = S->getCapturedDecl(); 12547 unsigned NumParams = CD->getNumParams(); 12548 unsigned ContextParamPos = CD->getContextParamPosition(); 12549 SmallVector<Sema::CapturedParamNameType, 4> Params; 12550 for (unsigned I = 0; I < NumParams; ++I) { 12551 if (I != ContextParamPos) { 12552 Params.push_back( 12553 std::make_pair( 12554 CD->getParam(I)->getName(), 12555 getDerived().TransformType(CD->getParam(I)->getType()))); 12556 } else { 12557 Params.push_back(std::make_pair(StringRef(), QualType())); 12558 } 12559 } 12560 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 12561 S->getCapturedRegionKind(), Params); 12562 StmtResult Body; 12563 { 12564 Sema::CompoundScopeRAII CompoundScope(getSema()); 12565 Body = getDerived().TransformStmt(S->getCapturedStmt()); 12566 } 12567 12568 if (Body.isInvalid()) { 12569 getSema().ActOnCapturedRegionError(); 12570 return StmtError(); 12571 } 12572 12573 return getSema().ActOnCapturedRegionEnd(Body.get()); 12574 } 12575 12576 } // end namespace clang 12577 12578 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 12579