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 assert(S->getResultDecl() && "ResultDecl must already be built"); 6950 StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl()); 6951 if (ResultDecl.isInvalid()) 6952 return StmtError(); 6953 Builder.ResultDecl = ResultDecl.get(); 6954 6955 if (auto *ReturnStmt = S->getReturnStmt()) { 6956 StmtResult Res = getDerived().TransformStmt(ReturnStmt); 6957 if (Res.isInvalid()) 6958 return StmtError(); 6959 Builder.ReturnStmt = Res.get(); 6960 } 6961 } 6962 if (!Builder.buildParameterMoves()) 6963 return StmtError(); 6964 6965 return getDerived().RebuildCoroutineBodyStmt(Builder); 6966 } 6967 6968 template<typename Derived> 6969 StmtResult 6970 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) { 6971 ExprResult Result = getDerived().TransformInitializer(S->getOperand(), 6972 /*NotCopyInit*/false); 6973 if (Result.isInvalid()) 6974 return StmtError(); 6975 6976 // Always rebuild; we don't know if this needs to be injected into a new 6977 // context or if the promise type has changed. 6978 return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(), 6979 S->isImplicit()); 6980 } 6981 6982 template<typename Derived> 6983 ExprResult 6984 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) { 6985 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 6986 /*NotCopyInit*/false); 6987 if (Result.isInvalid()) 6988 return ExprError(); 6989 6990 // Always rebuild; we don't know if this needs to be injected into a new 6991 // context or if the promise type has changed. 6992 return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(), 6993 E->isImplicit()); 6994 } 6995 6996 template <typename Derived> 6997 ExprResult 6998 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) { 6999 ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(), 7000 /*NotCopyInit*/ false); 7001 if (OperandResult.isInvalid()) 7002 return ExprError(); 7003 7004 ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr( 7005 E->getOperatorCoawaitLookup()); 7006 7007 if (LookupResult.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().RebuildDependentCoawaitExpr( 7013 E->getKeywordLoc(), OperandResult.get(), 7014 cast<UnresolvedLookupExpr>(LookupResult.get())); 7015 } 7016 7017 template<typename Derived> 7018 ExprResult 7019 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) { 7020 ExprResult Result = getDerived().TransformInitializer(E->getOperand(), 7021 /*NotCopyInit*/false); 7022 if (Result.isInvalid()) 7023 return ExprError(); 7024 7025 // Always rebuild; we don't know if this needs to be injected into a new 7026 // context or if the promise type has changed. 7027 return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get()); 7028 } 7029 7030 // Objective-C Statements. 7031 7032 template<typename Derived> 7033 StmtResult 7034 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 7035 // Transform the body of the @try. 7036 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 7037 if (TryBody.isInvalid()) 7038 return StmtError(); 7039 7040 // Transform the @catch statements (if present). 7041 bool AnyCatchChanged = false; 7042 SmallVector<Stmt*, 8> CatchStmts; 7043 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 7044 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 7045 if (Catch.isInvalid()) 7046 return StmtError(); 7047 if (Catch.get() != S->getCatchStmt(I)) 7048 AnyCatchChanged = true; 7049 CatchStmts.push_back(Catch.get()); 7050 } 7051 7052 // Transform the @finally statement (if present). 7053 StmtResult Finally; 7054 if (S->getFinallyStmt()) { 7055 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 7056 if (Finally.isInvalid()) 7057 return StmtError(); 7058 } 7059 7060 // If nothing changed, just retain this statement. 7061 if (!getDerived().AlwaysRebuild() && 7062 TryBody.get() == S->getTryBody() && 7063 !AnyCatchChanged && 7064 Finally.get() == S->getFinallyStmt()) 7065 return S; 7066 7067 // Build a new statement. 7068 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 7069 CatchStmts, Finally.get()); 7070 } 7071 7072 template<typename Derived> 7073 StmtResult 7074 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 7075 // Transform the @catch parameter, if there is one. 7076 VarDecl *Var = nullptr; 7077 if (VarDecl *FromVar = S->getCatchParamDecl()) { 7078 TypeSourceInfo *TSInfo = nullptr; 7079 if (FromVar->getTypeSourceInfo()) { 7080 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 7081 if (!TSInfo) 7082 return StmtError(); 7083 } 7084 7085 QualType T; 7086 if (TSInfo) 7087 T = TSInfo->getType(); 7088 else { 7089 T = getDerived().TransformType(FromVar->getType()); 7090 if (T.isNull()) 7091 return StmtError(); 7092 } 7093 7094 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 7095 if (!Var) 7096 return StmtError(); 7097 } 7098 7099 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 7100 if (Body.isInvalid()) 7101 return StmtError(); 7102 7103 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 7104 S->getRParenLoc(), 7105 Var, Body.get()); 7106 } 7107 7108 template<typename Derived> 7109 StmtResult 7110 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 7111 // Transform the body. 7112 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 7113 if (Body.isInvalid()) 7114 return StmtError(); 7115 7116 // If nothing changed, just retain this statement. 7117 if (!getDerived().AlwaysRebuild() && 7118 Body.get() == S->getFinallyBody()) 7119 return S; 7120 7121 // Build a new statement. 7122 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 7123 Body.get()); 7124 } 7125 7126 template<typename Derived> 7127 StmtResult 7128 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 7129 ExprResult Operand; 7130 if (S->getThrowExpr()) { 7131 Operand = getDerived().TransformExpr(S->getThrowExpr()); 7132 if (Operand.isInvalid()) 7133 return StmtError(); 7134 } 7135 7136 if (!getDerived().AlwaysRebuild() && 7137 Operand.get() == S->getThrowExpr()) 7138 return S; 7139 7140 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 7141 } 7142 7143 template<typename Derived> 7144 StmtResult 7145 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 7146 ObjCAtSynchronizedStmt *S) { 7147 // Transform the object we are locking. 7148 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 7149 if (Object.isInvalid()) 7150 return StmtError(); 7151 Object = 7152 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 7153 Object.get()); 7154 if (Object.isInvalid()) 7155 return StmtError(); 7156 7157 // Transform the body. 7158 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 7159 if (Body.isInvalid()) 7160 return StmtError(); 7161 7162 // If nothing change, just retain the current statement. 7163 if (!getDerived().AlwaysRebuild() && 7164 Object.get() == S->getSynchExpr() && 7165 Body.get() == S->getSynchBody()) 7166 return S; 7167 7168 // Build a new statement. 7169 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 7170 Object.get(), Body.get()); 7171 } 7172 7173 template<typename Derived> 7174 StmtResult 7175 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 7176 ObjCAutoreleasePoolStmt *S) { 7177 // Transform the body. 7178 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 7179 if (Body.isInvalid()) 7180 return StmtError(); 7181 7182 // If nothing changed, just retain this statement. 7183 if (!getDerived().AlwaysRebuild() && 7184 Body.get() == S->getSubStmt()) 7185 return S; 7186 7187 // Build a new statement. 7188 return getDerived().RebuildObjCAutoreleasePoolStmt( 7189 S->getAtLoc(), Body.get()); 7190 } 7191 7192 template<typename Derived> 7193 StmtResult 7194 TreeTransform<Derived>::TransformObjCForCollectionStmt( 7195 ObjCForCollectionStmt *S) { 7196 // Transform the element statement. 7197 StmtResult Element = getDerived().TransformStmt(S->getElement()); 7198 if (Element.isInvalid()) 7199 return StmtError(); 7200 7201 // Transform the collection expression. 7202 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 7203 if (Collection.isInvalid()) 7204 return StmtError(); 7205 7206 // Transform the body. 7207 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7208 if (Body.isInvalid()) 7209 return StmtError(); 7210 7211 // If nothing changed, just retain this statement. 7212 if (!getDerived().AlwaysRebuild() && 7213 Element.get() == S->getElement() && 7214 Collection.get() == S->getCollection() && 7215 Body.get() == S->getBody()) 7216 return S; 7217 7218 // Build a new statement. 7219 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 7220 Element.get(), 7221 Collection.get(), 7222 S->getRParenLoc(), 7223 Body.get()); 7224 } 7225 7226 template <typename Derived> 7227 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 7228 // Transform the exception declaration, if any. 7229 VarDecl *Var = nullptr; 7230 if (VarDecl *ExceptionDecl = S->getExceptionDecl()) { 7231 TypeSourceInfo *T = 7232 getDerived().TransformType(ExceptionDecl->getTypeSourceInfo()); 7233 if (!T) 7234 return StmtError(); 7235 7236 Var = getDerived().RebuildExceptionDecl( 7237 ExceptionDecl, T, ExceptionDecl->getInnerLocStart(), 7238 ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier()); 7239 if (!Var || Var->isInvalidDecl()) 7240 return StmtError(); 7241 } 7242 7243 // Transform the actual exception handler. 7244 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 7245 if (Handler.isInvalid()) 7246 return StmtError(); 7247 7248 if (!getDerived().AlwaysRebuild() && !Var && 7249 Handler.get() == S->getHandlerBlock()) 7250 return S; 7251 7252 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get()); 7253 } 7254 7255 template <typename Derived> 7256 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 7257 // Transform the try block itself. 7258 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7259 if (TryBlock.isInvalid()) 7260 return StmtError(); 7261 7262 // Transform the handlers. 7263 bool HandlerChanged = false; 7264 SmallVector<Stmt *, 8> Handlers; 7265 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 7266 StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 7267 if (Handler.isInvalid()) 7268 return StmtError(); 7269 7270 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 7271 Handlers.push_back(Handler.getAs<Stmt>()); 7272 } 7273 7274 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7275 !HandlerChanged) 7276 return S; 7277 7278 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 7279 Handlers); 7280 } 7281 7282 template<typename Derived> 7283 StmtResult 7284 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 7285 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 7286 if (Range.isInvalid()) 7287 return StmtError(); 7288 7289 StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt()); 7290 if (Begin.isInvalid()) 7291 return StmtError(); 7292 StmtResult End = getDerived().TransformStmt(S->getEndStmt()); 7293 if (End.isInvalid()) 7294 return StmtError(); 7295 7296 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 7297 if (Cond.isInvalid()) 7298 return StmtError(); 7299 if (Cond.get()) 7300 Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get()); 7301 if (Cond.isInvalid()) 7302 return StmtError(); 7303 if (Cond.get()) 7304 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get()); 7305 7306 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 7307 if (Inc.isInvalid()) 7308 return StmtError(); 7309 if (Inc.get()) 7310 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get()); 7311 7312 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 7313 if (LoopVar.isInvalid()) 7314 return StmtError(); 7315 7316 StmtResult NewStmt = S; 7317 if (getDerived().AlwaysRebuild() || 7318 Range.get() != S->getRangeStmt() || 7319 Begin.get() != S->getBeginStmt() || 7320 End.get() != S->getEndStmt() || 7321 Cond.get() != S->getCond() || 7322 Inc.get() != S->getInc() || 7323 LoopVar.get() != S->getLoopVarStmt()) { 7324 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7325 S->getCoawaitLoc(), 7326 S->getColonLoc(), Range.get(), 7327 Begin.get(), End.get(), 7328 Cond.get(), 7329 Inc.get(), LoopVar.get(), 7330 S->getRParenLoc()); 7331 if (NewStmt.isInvalid()) 7332 return StmtError(); 7333 } 7334 7335 StmtResult Body = getDerived().TransformStmt(S->getBody()); 7336 if (Body.isInvalid()) 7337 return StmtError(); 7338 7339 // Body has changed but we didn't rebuild the for-range statement. Rebuild 7340 // it now so we have a new statement to attach the body to. 7341 if (Body.get() != S->getBody() && NewStmt.get() == S) { 7342 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 7343 S->getCoawaitLoc(), 7344 S->getColonLoc(), Range.get(), 7345 Begin.get(), End.get(), 7346 Cond.get(), 7347 Inc.get(), LoopVar.get(), 7348 S->getRParenLoc()); 7349 if (NewStmt.isInvalid()) 7350 return StmtError(); 7351 } 7352 7353 if (NewStmt.get() == S) 7354 return S; 7355 7356 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 7357 } 7358 7359 template<typename Derived> 7360 StmtResult 7361 TreeTransform<Derived>::TransformMSDependentExistsStmt( 7362 MSDependentExistsStmt *S) { 7363 // Transform the nested-name-specifier, if any. 7364 NestedNameSpecifierLoc QualifierLoc; 7365 if (S->getQualifierLoc()) { 7366 QualifierLoc 7367 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 7368 if (!QualifierLoc) 7369 return StmtError(); 7370 } 7371 7372 // Transform the declaration name. 7373 DeclarationNameInfo NameInfo = S->getNameInfo(); 7374 if (NameInfo.getName()) { 7375 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 7376 if (!NameInfo.getName()) 7377 return StmtError(); 7378 } 7379 7380 // Check whether anything changed. 7381 if (!getDerived().AlwaysRebuild() && 7382 QualifierLoc == S->getQualifierLoc() && 7383 NameInfo.getName() == S->getNameInfo().getName()) 7384 return S; 7385 7386 // Determine whether this name exists, if we can. 7387 CXXScopeSpec SS; 7388 SS.Adopt(QualifierLoc); 7389 bool Dependent = false; 7390 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) { 7391 case Sema::IER_Exists: 7392 if (S->isIfExists()) 7393 break; 7394 7395 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7396 7397 case Sema::IER_DoesNotExist: 7398 if (S->isIfNotExists()) 7399 break; 7400 7401 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 7402 7403 case Sema::IER_Dependent: 7404 Dependent = true; 7405 break; 7406 7407 case Sema::IER_Error: 7408 return StmtError(); 7409 } 7410 7411 // We need to continue with the instantiation, so do so now. 7412 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 7413 if (SubStmt.isInvalid()) 7414 return StmtError(); 7415 7416 // If we have resolved the name, just transform to the substatement. 7417 if (!Dependent) 7418 return SubStmt; 7419 7420 // The name is still dependent, so build a dependent expression again. 7421 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 7422 S->isIfExists(), 7423 QualifierLoc, 7424 NameInfo, 7425 SubStmt.get()); 7426 } 7427 7428 template<typename Derived> 7429 ExprResult 7430 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 7431 NestedNameSpecifierLoc QualifierLoc; 7432 if (E->getQualifierLoc()) { 7433 QualifierLoc 7434 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 7435 if (!QualifierLoc) 7436 return ExprError(); 7437 } 7438 7439 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 7440 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 7441 if (!PD) 7442 return ExprError(); 7443 7444 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 7445 if (Base.isInvalid()) 7446 return ExprError(); 7447 7448 return new (SemaRef.getASTContext()) 7449 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 7450 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 7451 QualifierLoc, E->getMemberLoc()); 7452 } 7453 7454 template <typename Derived> 7455 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr( 7456 MSPropertySubscriptExpr *E) { 7457 auto BaseRes = getDerived().TransformExpr(E->getBase()); 7458 if (BaseRes.isInvalid()) 7459 return ExprError(); 7460 auto IdxRes = getDerived().TransformExpr(E->getIdx()); 7461 if (IdxRes.isInvalid()) 7462 return ExprError(); 7463 7464 if (!getDerived().AlwaysRebuild() && 7465 BaseRes.get() == E->getBase() && 7466 IdxRes.get() == E->getIdx()) 7467 return E; 7468 7469 return getDerived().RebuildArraySubscriptExpr( 7470 BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc()); 7471 } 7472 7473 template <typename Derived> 7474 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 7475 StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock()); 7476 if (TryBlock.isInvalid()) 7477 return StmtError(); 7478 7479 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 7480 if (Handler.isInvalid()) 7481 return StmtError(); 7482 7483 if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() && 7484 Handler.get() == S->getHandler()) 7485 return S; 7486 7487 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(), 7488 TryBlock.get(), Handler.get()); 7489 } 7490 7491 template <typename Derived> 7492 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 7493 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7494 if (Block.isInvalid()) 7495 return StmtError(); 7496 7497 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get()); 7498 } 7499 7500 template <typename Derived> 7501 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 7502 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 7503 if (FilterExpr.isInvalid()) 7504 return StmtError(); 7505 7506 StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock()); 7507 if (Block.isInvalid()) 7508 return StmtError(); 7509 7510 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(), 7511 Block.get()); 7512 } 7513 7514 template <typename Derived> 7515 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 7516 if (isa<SEHFinallyStmt>(Handler)) 7517 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 7518 else 7519 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 7520 } 7521 7522 template<typename Derived> 7523 StmtResult 7524 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) { 7525 return S; 7526 } 7527 7528 //===----------------------------------------------------------------------===// 7529 // OpenMP directive transformation 7530 //===----------------------------------------------------------------------===// 7531 template <typename Derived> 7532 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective( 7533 OMPExecutableDirective *D) { 7534 7535 // Transform the clauses 7536 llvm::SmallVector<OMPClause *, 16> TClauses; 7537 ArrayRef<OMPClause *> Clauses = D->clauses(); 7538 TClauses.reserve(Clauses.size()); 7539 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 7540 I != E; ++I) { 7541 if (*I) { 7542 getDerived().getSema().StartOpenMPClause((*I)->getClauseKind()); 7543 OMPClause *Clause = getDerived().TransformOMPClause(*I); 7544 getDerived().getSema().EndOpenMPClause(); 7545 if (Clause) 7546 TClauses.push_back(Clause); 7547 } else { 7548 TClauses.push_back(nullptr); 7549 } 7550 } 7551 StmtResult AssociatedStmt; 7552 if (D->hasAssociatedStmt() && D->getAssociatedStmt()) { 7553 getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(), 7554 /*CurScope=*/nullptr); 7555 StmtResult Body; 7556 { 7557 Sema::CompoundScopeRAII CompoundScope(getSema()); 7558 int ThisCaptureLevel = 7559 Sema::getOpenMPCaptureLevels(D->getDirectiveKind()); 7560 Stmt *CS = D->getAssociatedStmt(); 7561 while (--ThisCaptureLevel >= 0) 7562 CS = cast<CapturedStmt>(CS)->getCapturedStmt(); 7563 Body = getDerived().TransformStmt(CS); 7564 } 7565 AssociatedStmt = 7566 getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses); 7567 if (AssociatedStmt.isInvalid()) { 7568 return StmtError(); 7569 } 7570 } 7571 if (TClauses.size() != Clauses.size()) { 7572 return StmtError(); 7573 } 7574 7575 // Transform directive name for 'omp critical' directive. 7576 DeclarationNameInfo DirName; 7577 if (D->getDirectiveKind() == OMPD_critical) { 7578 DirName = cast<OMPCriticalDirective>(D)->getDirectiveName(); 7579 DirName = getDerived().TransformDeclarationNameInfo(DirName); 7580 } 7581 OpenMPDirectiveKind CancelRegion = OMPD_unknown; 7582 if (D->getDirectiveKind() == OMPD_cancellation_point) { 7583 CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion(); 7584 } else if (D->getDirectiveKind() == OMPD_cancel) { 7585 CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion(); 7586 } 7587 7588 return getDerived().RebuildOMPExecutableDirective( 7589 D->getDirectiveKind(), DirName, CancelRegion, TClauses, 7590 AssociatedStmt.get(), D->getLocStart(), D->getLocEnd()); 7591 } 7592 7593 template <typename Derived> 7594 StmtResult 7595 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 7596 DeclarationNameInfo DirName; 7597 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr, 7598 D->getLocStart()); 7599 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7600 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7601 return Res; 7602 } 7603 7604 template <typename Derived> 7605 StmtResult 7606 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) { 7607 DeclarationNameInfo DirName; 7608 getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr, 7609 D->getLocStart()); 7610 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7611 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7612 return Res; 7613 } 7614 7615 template <typename Derived> 7616 StmtResult 7617 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) { 7618 DeclarationNameInfo DirName; 7619 getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr, 7620 D->getLocStart()); 7621 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7622 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7623 return Res; 7624 } 7625 7626 template <typename Derived> 7627 StmtResult 7628 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) { 7629 DeclarationNameInfo DirName; 7630 getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr, 7631 D->getLocStart()); 7632 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7633 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7634 return Res; 7635 } 7636 7637 template <typename Derived> 7638 StmtResult 7639 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) { 7640 DeclarationNameInfo DirName; 7641 getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr, 7642 D->getLocStart()); 7643 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7644 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7645 return Res; 7646 } 7647 7648 template <typename Derived> 7649 StmtResult 7650 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) { 7651 DeclarationNameInfo DirName; 7652 getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr, 7653 D->getLocStart()); 7654 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7655 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7656 return Res; 7657 } 7658 7659 template <typename Derived> 7660 StmtResult 7661 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) { 7662 DeclarationNameInfo DirName; 7663 getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr, 7664 D->getLocStart()); 7665 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7666 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7667 return Res; 7668 } 7669 7670 template <typename Derived> 7671 StmtResult 7672 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) { 7673 DeclarationNameInfo DirName; 7674 getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr, 7675 D->getLocStart()); 7676 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7677 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7678 return Res; 7679 } 7680 7681 template <typename Derived> 7682 StmtResult 7683 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) { 7684 getDerived().getSema().StartOpenMPDSABlock( 7685 OMPD_critical, D->getDirectiveName(), nullptr, D->getLocStart()); 7686 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7687 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7688 return Res; 7689 } 7690 7691 template <typename Derived> 7692 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective( 7693 OMPParallelForDirective *D) { 7694 DeclarationNameInfo DirName; 7695 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName, 7696 nullptr, D->getLocStart()); 7697 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7698 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7699 return Res; 7700 } 7701 7702 template <typename Derived> 7703 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective( 7704 OMPParallelForSimdDirective *D) { 7705 DeclarationNameInfo DirName; 7706 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName, 7707 nullptr, D->getLocStart()); 7708 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7709 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7710 return Res; 7711 } 7712 7713 template <typename Derived> 7714 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective( 7715 OMPParallelSectionsDirective *D) { 7716 DeclarationNameInfo DirName; 7717 getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName, 7718 nullptr, D->getLocStart()); 7719 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7720 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7721 return Res; 7722 } 7723 7724 template <typename Derived> 7725 StmtResult 7726 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) { 7727 DeclarationNameInfo DirName; 7728 getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr, 7729 D->getLocStart()); 7730 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7731 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7732 return Res; 7733 } 7734 7735 template <typename Derived> 7736 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective( 7737 OMPTaskyieldDirective *D) { 7738 DeclarationNameInfo DirName; 7739 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr, 7740 D->getLocStart()); 7741 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7742 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7743 return Res; 7744 } 7745 7746 template <typename Derived> 7747 StmtResult 7748 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) { 7749 DeclarationNameInfo DirName; 7750 getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr, 7751 D->getLocStart()); 7752 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7753 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7754 return Res; 7755 } 7756 7757 template <typename Derived> 7758 StmtResult 7759 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) { 7760 DeclarationNameInfo DirName; 7761 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr, 7762 D->getLocStart()); 7763 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7764 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7765 return Res; 7766 } 7767 7768 template <typename Derived> 7769 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective( 7770 OMPTaskgroupDirective *D) { 7771 DeclarationNameInfo DirName; 7772 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr, 7773 D->getLocStart()); 7774 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7775 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7776 return Res; 7777 } 7778 7779 template <typename Derived> 7780 StmtResult 7781 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) { 7782 DeclarationNameInfo DirName; 7783 getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr, 7784 D->getLocStart()); 7785 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7786 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7787 return Res; 7788 } 7789 7790 template <typename Derived> 7791 StmtResult 7792 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) { 7793 DeclarationNameInfo DirName; 7794 getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr, 7795 D->getLocStart()); 7796 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7797 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7798 return Res; 7799 } 7800 7801 template <typename Derived> 7802 StmtResult 7803 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) { 7804 DeclarationNameInfo DirName; 7805 getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr, 7806 D->getLocStart()); 7807 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7808 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7809 return Res; 7810 } 7811 7812 template <typename Derived> 7813 StmtResult 7814 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) { 7815 DeclarationNameInfo DirName; 7816 getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr, 7817 D->getLocStart()); 7818 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7819 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7820 return Res; 7821 } 7822 7823 template <typename Derived> 7824 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective( 7825 OMPTargetDataDirective *D) { 7826 DeclarationNameInfo DirName; 7827 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr, 7828 D->getLocStart()); 7829 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7830 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7831 return Res; 7832 } 7833 7834 template <typename Derived> 7835 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective( 7836 OMPTargetEnterDataDirective *D) { 7837 DeclarationNameInfo DirName; 7838 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName, 7839 nullptr, D->getLocStart()); 7840 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7841 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7842 return Res; 7843 } 7844 7845 template <typename Derived> 7846 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective( 7847 OMPTargetExitDataDirective *D) { 7848 DeclarationNameInfo DirName; 7849 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName, 7850 nullptr, D->getLocStart()); 7851 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7852 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7853 return Res; 7854 } 7855 7856 template <typename Derived> 7857 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective( 7858 OMPTargetParallelDirective *D) { 7859 DeclarationNameInfo DirName; 7860 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName, 7861 nullptr, D->getLocStart()); 7862 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7863 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7864 return Res; 7865 } 7866 7867 template <typename Derived> 7868 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective( 7869 OMPTargetParallelForDirective *D) { 7870 DeclarationNameInfo DirName; 7871 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName, 7872 nullptr, D->getLocStart()); 7873 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7874 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7875 return Res; 7876 } 7877 7878 template <typename Derived> 7879 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective( 7880 OMPTargetUpdateDirective *D) { 7881 DeclarationNameInfo DirName; 7882 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName, 7883 nullptr, D->getLocStart()); 7884 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7885 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7886 return Res; 7887 } 7888 7889 template <typename Derived> 7890 StmtResult 7891 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) { 7892 DeclarationNameInfo DirName; 7893 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr, 7894 D->getLocStart()); 7895 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7896 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7897 return Res; 7898 } 7899 7900 template <typename Derived> 7901 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective( 7902 OMPCancellationPointDirective *D) { 7903 DeclarationNameInfo DirName; 7904 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName, 7905 nullptr, D->getLocStart()); 7906 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7907 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7908 return Res; 7909 } 7910 7911 template <typename Derived> 7912 StmtResult 7913 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) { 7914 DeclarationNameInfo DirName; 7915 getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr, 7916 D->getLocStart()); 7917 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7918 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7919 return Res; 7920 } 7921 7922 template <typename Derived> 7923 StmtResult 7924 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) { 7925 DeclarationNameInfo DirName; 7926 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr, 7927 D->getLocStart()); 7928 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7929 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7930 return Res; 7931 } 7932 7933 template <typename Derived> 7934 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective( 7935 OMPTaskLoopSimdDirective *D) { 7936 DeclarationNameInfo DirName; 7937 getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName, 7938 nullptr, D->getLocStart()); 7939 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7940 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7941 return Res; 7942 } 7943 7944 template <typename Derived> 7945 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective( 7946 OMPDistributeDirective *D) { 7947 DeclarationNameInfo DirName; 7948 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr, 7949 D->getLocStart()); 7950 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7951 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7952 return Res; 7953 } 7954 7955 template <typename Derived> 7956 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective( 7957 OMPDistributeParallelForDirective *D) { 7958 DeclarationNameInfo DirName; 7959 getDerived().getSema().StartOpenMPDSABlock( 7960 OMPD_distribute_parallel_for, DirName, nullptr, D->getLocStart()); 7961 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7962 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7963 return Res; 7964 } 7965 7966 template <typename Derived> 7967 StmtResult 7968 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective( 7969 OMPDistributeParallelForSimdDirective *D) { 7970 DeclarationNameInfo DirName; 7971 getDerived().getSema().StartOpenMPDSABlock( 7972 OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart()); 7973 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7974 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7975 return Res; 7976 } 7977 7978 template <typename Derived> 7979 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective( 7980 OMPDistributeSimdDirective *D) { 7981 DeclarationNameInfo DirName; 7982 getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName, 7983 nullptr, D->getLocStart()); 7984 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7985 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7986 return Res; 7987 } 7988 7989 template <typename Derived> 7990 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective( 7991 OMPTargetParallelForSimdDirective *D) { 7992 DeclarationNameInfo DirName; 7993 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for_simd, 7994 DirName, nullptr, 7995 D->getLocStart()); 7996 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 7997 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 7998 return Res; 7999 } 8000 8001 template <typename Derived> 8002 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective( 8003 OMPTargetSimdDirective *D) { 8004 DeclarationNameInfo DirName; 8005 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr, 8006 D->getLocStart()); 8007 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8008 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8009 return Res; 8010 } 8011 8012 template <typename Derived> 8013 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective( 8014 OMPTeamsDistributeDirective *D) { 8015 DeclarationNameInfo DirName; 8016 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName, 8017 nullptr, D->getLocStart()); 8018 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8019 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8020 return Res; 8021 } 8022 8023 template <typename Derived> 8024 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective( 8025 OMPTeamsDistributeSimdDirective *D) { 8026 DeclarationNameInfo DirName; 8027 getDerived().getSema().StartOpenMPDSABlock( 8028 OMPD_teams_distribute_simd, DirName, nullptr, D->getLocStart()); 8029 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8030 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8031 return Res; 8032 } 8033 8034 template <typename Derived> 8035 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective( 8036 OMPTeamsDistributeParallelForSimdDirective *D) { 8037 DeclarationNameInfo DirName; 8038 getDerived().getSema().StartOpenMPDSABlock( 8039 OMPD_teams_distribute_parallel_for_simd, DirName, nullptr, D->getLocStart()); 8040 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8041 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8042 return Res; 8043 } 8044 8045 template <typename Derived> 8046 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective( 8047 OMPTeamsDistributeParallelForDirective *D) { 8048 DeclarationNameInfo DirName; 8049 getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute_parallel_for, 8050 DirName, nullptr, D->getLocStart()); 8051 StmtResult Res = getDerived().TransformOMPExecutableDirective(D); 8052 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8053 return Res; 8054 } 8055 8056 template <typename Derived> 8057 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective( 8058 OMPTargetTeamsDirective *D) { 8059 DeclarationNameInfo DirName; 8060 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName, 8061 nullptr, D->getLocStart()); 8062 auto Res = getDerived().TransformOMPExecutableDirective(D); 8063 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8064 return Res; 8065 } 8066 8067 template <typename Derived> 8068 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective( 8069 OMPTargetTeamsDistributeDirective *D) { 8070 DeclarationNameInfo DirName; 8071 getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams_distribute, 8072 DirName, nullptr, D->getLocStart()); 8073 auto Res = getDerived().TransformOMPExecutableDirective(D); 8074 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8075 return Res; 8076 } 8077 8078 template <typename Derived> 8079 StmtResult 8080 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective( 8081 OMPTargetTeamsDistributeParallelForDirective *D) { 8082 DeclarationNameInfo DirName; 8083 getDerived().getSema().StartOpenMPDSABlock( 8084 OMPD_target_teams_distribute_parallel_for, DirName, nullptr, 8085 D->getLocStart()); 8086 auto Res = getDerived().TransformOMPExecutableDirective(D); 8087 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8088 return Res; 8089 } 8090 8091 template <typename Derived> 8092 StmtResult TreeTransform<Derived>:: 8093 TransformOMPTargetTeamsDistributeParallelForSimdDirective( 8094 OMPTargetTeamsDistributeParallelForSimdDirective *D) { 8095 DeclarationNameInfo DirName; 8096 getDerived().getSema().StartOpenMPDSABlock( 8097 OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr, 8098 D->getLocStart()); 8099 auto Res = getDerived().TransformOMPExecutableDirective(D); 8100 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8101 return Res; 8102 } 8103 8104 template <typename Derived> 8105 StmtResult 8106 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective( 8107 OMPTargetTeamsDistributeSimdDirective *D) { 8108 DeclarationNameInfo DirName; 8109 getDerived().getSema().StartOpenMPDSABlock( 8110 OMPD_target_teams_distribute_simd, DirName, nullptr, D->getLocStart()); 8111 auto Res = getDerived().TransformOMPExecutableDirective(D); 8112 getDerived().getSema().EndOpenMPDSABlock(Res.get()); 8113 return Res; 8114 } 8115 8116 8117 //===----------------------------------------------------------------------===// 8118 // OpenMP clause transformation 8119 //===----------------------------------------------------------------------===// 8120 template <typename Derived> 8121 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { 8122 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8123 if (Cond.isInvalid()) 8124 return nullptr; 8125 return getDerived().RebuildOMPIfClause( 8126 C->getNameModifier(), Cond.get(), C->getLocStart(), C->getLParenLoc(), 8127 C->getNameModifierLoc(), C->getColonLoc(), C->getLocEnd()); 8128 } 8129 8130 template <typename Derived> 8131 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) { 8132 ExprResult Cond = getDerived().TransformExpr(C->getCondition()); 8133 if (Cond.isInvalid()) 8134 return nullptr; 8135 return getDerived().RebuildOMPFinalClause(Cond.get(), C->getLocStart(), 8136 C->getLParenLoc(), C->getLocEnd()); 8137 } 8138 8139 template <typename Derived> 8140 OMPClause * 8141 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) { 8142 ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads()); 8143 if (NumThreads.isInvalid()) 8144 return nullptr; 8145 return getDerived().RebuildOMPNumThreadsClause( 8146 NumThreads.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8147 } 8148 8149 template <typename Derived> 8150 OMPClause * 8151 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) { 8152 ExprResult E = getDerived().TransformExpr(C->getSafelen()); 8153 if (E.isInvalid()) 8154 return nullptr; 8155 return getDerived().RebuildOMPSafelenClause( 8156 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8157 } 8158 8159 template <typename Derived> 8160 OMPClause * 8161 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) { 8162 ExprResult E = getDerived().TransformExpr(C->getSimdlen()); 8163 if (E.isInvalid()) 8164 return nullptr; 8165 return getDerived().RebuildOMPSimdlenClause( 8166 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8167 } 8168 8169 template <typename Derived> 8170 OMPClause * 8171 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) { 8172 ExprResult E = getDerived().TransformExpr(C->getNumForLoops()); 8173 if (E.isInvalid()) 8174 return nullptr; 8175 return getDerived().RebuildOMPCollapseClause( 8176 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8177 } 8178 8179 template <typename Derived> 8180 OMPClause * 8181 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 8182 return getDerived().RebuildOMPDefaultClause( 8183 C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getLocStart(), 8184 C->getLParenLoc(), C->getLocEnd()); 8185 } 8186 8187 template <typename Derived> 8188 OMPClause * 8189 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) { 8190 return getDerived().RebuildOMPProcBindClause( 8191 C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getLocStart(), 8192 C->getLParenLoc(), C->getLocEnd()); 8193 } 8194 8195 template <typename Derived> 8196 OMPClause * 8197 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) { 8198 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8199 if (E.isInvalid()) 8200 return nullptr; 8201 return getDerived().RebuildOMPScheduleClause( 8202 C->getFirstScheduleModifier(), C->getSecondScheduleModifier(), 8203 C->getScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(), 8204 C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(), 8205 C->getScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd()); 8206 } 8207 8208 template <typename Derived> 8209 OMPClause * 8210 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) { 8211 ExprResult E; 8212 if (auto *Num = C->getNumForLoops()) { 8213 E = getDerived().TransformExpr(Num); 8214 if (E.isInvalid()) 8215 return nullptr; 8216 } 8217 return getDerived().RebuildOMPOrderedClause(C->getLocStart(), C->getLocEnd(), 8218 C->getLParenLoc(), E.get()); 8219 } 8220 8221 template <typename Derived> 8222 OMPClause * 8223 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) { 8224 // No need to rebuild this clause, no template-dependent parameters. 8225 return C; 8226 } 8227 8228 template <typename Derived> 8229 OMPClause * 8230 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) { 8231 // No need to rebuild this clause, no template-dependent parameters. 8232 return C; 8233 } 8234 8235 template <typename Derived> 8236 OMPClause * 8237 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) { 8238 // No need to rebuild this clause, no template-dependent parameters. 8239 return C; 8240 } 8241 8242 template <typename Derived> 8243 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) { 8244 // No need to rebuild this clause, no template-dependent parameters. 8245 return C; 8246 } 8247 8248 template <typename Derived> 8249 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) { 8250 // No need to rebuild this clause, no template-dependent parameters. 8251 return C; 8252 } 8253 8254 template <typename Derived> 8255 OMPClause * 8256 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) { 8257 // No need to rebuild this clause, no template-dependent parameters. 8258 return C; 8259 } 8260 8261 template <typename Derived> 8262 OMPClause * 8263 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) { 8264 // No need to rebuild this clause, no template-dependent parameters. 8265 return C; 8266 } 8267 8268 template <typename Derived> 8269 OMPClause * 8270 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) { 8271 // No need to rebuild this clause, no template-dependent parameters. 8272 return C; 8273 } 8274 8275 template <typename Derived> 8276 OMPClause * 8277 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) { 8278 // No need to rebuild this clause, no template-dependent parameters. 8279 return C; 8280 } 8281 8282 template <typename Derived> 8283 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) { 8284 // No need to rebuild this clause, no template-dependent parameters. 8285 return C; 8286 } 8287 8288 template <typename Derived> 8289 OMPClause * 8290 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) { 8291 // No need to rebuild this clause, no template-dependent parameters. 8292 return C; 8293 } 8294 8295 template <typename Derived> 8296 OMPClause * 8297 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *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().RebuildOMPPrivateClause( 8307 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8308 } 8309 8310 template <typename Derived> 8311 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause( 8312 OMPFirstprivateClause *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().RebuildOMPFirstprivateClause( 8322 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8323 } 8324 8325 template <typename Derived> 8326 OMPClause * 8327 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *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().RebuildOMPLastprivateClause( 8337 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8338 } 8339 8340 template <typename Derived> 8341 OMPClause * 8342 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *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 return getDerived().RebuildOMPSharedClause(Vars, C->getLocStart(), 8352 C->getLParenLoc(), C->getLocEnd()); 8353 } 8354 8355 template <typename Derived> 8356 OMPClause * 8357 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) { 8358 llvm::SmallVector<Expr *, 16> Vars; 8359 Vars.reserve(C->varlist_size()); 8360 for (auto *VE : C->varlists()) { 8361 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8362 if (EVar.isInvalid()) 8363 return nullptr; 8364 Vars.push_back(EVar.get()); 8365 } 8366 CXXScopeSpec ReductionIdScopeSpec; 8367 ReductionIdScopeSpec.Adopt(C->getQualifierLoc()); 8368 8369 DeclarationNameInfo NameInfo = C->getNameInfo(); 8370 if (NameInfo.getName()) { 8371 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8372 if (!NameInfo.getName()) 8373 return nullptr; 8374 } 8375 // Build a list of all UDR decls with the same names ranged by the Scopes. 8376 // The Scope boundary is a duplication of the previous decl. 8377 llvm::SmallVector<Expr *, 16> UnresolvedReductions; 8378 for (auto *E : C->reduction_ops()) { 8379 // Transform all the decls. 8380 if (E) { 8381 auto *ULE = cast<UnresolvedLookupExpr>(E); 8382 UnresolvedSet<8> Decls; 8383 for (auto *D : ULE->decls()) { 8384 NamedDecl *InstD = 8385 cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D)); 8386 Decls.addDecl(InstD, InstD->getAccess()); 8387 } 8388 UnresolvedReductions.push_back( 8389 UnresolvedLookupExpr::Create( 8390 SemaRef.Context, /*NamingClass=*/nullptr, 8391 ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), 8392 NameInfo, /*ADL=*/true, ULE->isOverloaded(), 8393 Decls.begin(), Decls.end())); 8394 } else 8395 UnresolvedReductions.push_back(nullptr); 8396 } 8397 return getDerived().RebuildOMPReductionClause( 8398 Vars, C->getLocStart(), C->getLParenLoc(), C->getColonLoc(), 8399 C->getLocEnd(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions); 8400 } 8401 8402 template <typename Derived> 8403 OMPClause * 8404 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) { 8405 llvm::SmallVector<Expr *, 16> Vars; 8406 Vars.reserve(C->varlist_size()); 8407 for (auto *VE : C->varlists()) { 8408 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8409 if (EVar.isInvalid()) 8410 return nullptr; 8411 Vars.push_back(EVar.get()); 8412 } 8413 ExprResult Step = getDerived().TransformExpr(C->getStep()); 8414 if (Step.isInvalid()) 8415 return nullptr; 8416 return getDerived().RebuildOMPLinearClause( 8417 Vars, Step.get(), C->getLocStart(), C->getLParenLoc(), C->getModifier(), 8418 C->getModifierLoc(), C->getColonLoc(), C->getLocEnd()); 8419 } 8420 8421 template <typename Derived> 8422 OMPClause * 8423 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) { 8424 llvm::SmallVector<Expr *, 16> Vars; 8425 Vars.reserve(C->varlist_size()); 8426 for (auto *VE : C->varlists()) { 8427 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8428 if (EVar.isInvalid()) 8429 return nullptr; 8430 Vars.push_back(EVar.get()); 8431 } 8432 ExprResult Alignment = getDerived().TransformExpr(C->getAlignment()); 8433 if (Alignment.isInvalid()) 8434 return nullptr; 8435 return getDerived().RebuildOMPAlignedClause( 8436 Vars, Alignment.get(), C->getLocStart(), C->getLParenLoc(), 8437 C->getColonLoc(), C->getLocEnd()); 8438 } 8439 8440 template <typename Derived> 8441 OMPClause * 8442 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *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().RebuildOMPCopyinClause(Vars, C->getLocStart(), 8452 C->getLParenLoc(), C->getLocEnd()); 8453 } 8454 8455 template <typename Derived> 8456 OMPClause * 8457 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) { 8458 llvm::SmallVector<Expr *, 16> Vars; 8459 Vars.reserve(C->varlist_size()); 8460 for (auto *VE : C->varlists()) { 8461 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8462 if (EVar.isInvalid()) 8463 return nullptr; 8464 Vars.push_back(EVar.get()); 8465 } 8466 return getDerived().RebuildOMPCopyprivateClause( 8467 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8468 } 8469 8470 template <typename Derived> 8471 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *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().RebuildOMPFlushClause(Vars, C->getLocStart(), 8481 C->getLParenLoc(), C->getLocEnd()); 8482 } 8483 8484 template <typename Derived> 8485 OMPClause * 8486 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) { 8487 llvm::SmallVector<Expr *, 16> Vars; 8488 Vars.reserve(C->varlist_size()); 8489 for (auto *VE : C->varlists()) { 8490 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8491 if (EVar.isInvalid()) 8492 return nullptr; 8493 Vars.push_back(EVar.get()); 8494 } 8495 return getDerived().RebuildOMPDependClause( 8496 C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars, 8497 C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8498 } 8499 8500 template <typename Derived> 8501 OMPClause * 8502 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) { 8503 ExprResult E = getDerived().TransformExpr(C->getDevice()); 8504 if (E.isInvalid()) 8505 return nullptr; 8506 return getDerived().RebuildOMPDeviceClause( 8507 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8508 } 8509 8510 template <typename Derived> 8511 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) { 8512 llvm::SmallVector<Expr *, 16> Vars; 8513 Vars.reserve(C->varlist_size()); 8514 for (auto *VE : C->varlists()) { 8515 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8516 if (EVar.isInvalid()) 8517 return nullptr; 8518 Vars.push_back(EVar.get()); 8519 } 8520 return getDerived().RebuildOMPMapClause( 8521 C->getMapTypeModifier(), C->getMapType(), C->isImplicitMapType(), 8522 C->getMapLoc(), C->getColonLoc(), Vars, C->getLocStart(), 8523 C->getLParenLoc(), C->getLocEnd()); 8524 } 8525 8526 template <typename Derived> 8527 OMPClause * 8528 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) { 8529 ExprResult E = getDerived().TransformExpr(C->getNumTeams()); 8530 if (E.isInvalid()) 8531 return nullptr; 8532 return getDerived().RebuildOMPNumTeamsClause( 8533 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8534 } 8535 8536 template <typename Derived> 8537 OMPClause * 8538 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) { 8539 ExprResult E = getDerived().TransformExpr(C->getThreadLimit()); 8540 if (E.isInvalid()) 8541 return nullptr; 8542 return getDerived().RebuildOMPThreadLimitClause( 8543 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8544 } 8545 8546 template <typename Derived> 8547 OMPClause * 8548 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) { 8549 ExprResult E = getDerived().TransformExpr(C->getPriority()); 8550 if (E.isInvalid()) 8551 return nullptr; 8552 return getDerived().RebuildOMPPriorityClause( 8553 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8554 } 8555 8556 template <typename Derived> 8557 OMPClause * 8558 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) { 8559 ExprResult E = getDerived().TransformExpr(C->getGrainsize()); 8560 if (E.isInvalid()) 8561 return nullptr; 8562 return getDerived().RebuildOMPGrainsizeClause( 8563 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8564 } 8565 8566 template <typename Derived> 8567 OMPClause * 8568 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) { 8569 ExprResult E = getDerived().TransformExpr(C->getNumTasks()); 8570 if (E.isInvalid()) 8571 return nullptr; 8572 return getDerived().RebuildOMPNumTasksClause( 8573 E.get(), C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8574 } 8575 8576 template <typename Derived> 8577 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) { 8578 ExprResult E = getDerived().TransformExpr(C->getHint()); 8579 if (E.isInvalid()) 8580 return nullptr; 8581 return getDerived().RebuildOMPHintClause(E.get(), C->getLocStart(), 8582 C->getLParenLoc(), C->getLocEnd()); 8583 } 8584 8585 template <typename Derived> 8586 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause( 8587 OMPDistScheduleClause *C) { 8588 ExprResult E = getDerived().TransformExpr(C->getChunkSize()); 8589 if (E.isInvalid()) 8590 return nullptr; 8591 return getDerived().RebuildOMPDistScheduleClause( 8592 C->getDistScheduleKind(), E.get(), C->getLocStart(), C->getLParenLoc(), 8593 C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getLocEnd()); 8594 } 8595 8596 template <typename Derived> 8597 OMPClause * 8598 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) { 8599 return C; 8600 } 8601 8602 template <typename Derived> 8603 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) { 8604 llvm::SmallVector<Expr *, 16> Vars; 8605 Vars.reserve(C->varlist_size()); 8606 for (auto *VE : C->varlists()) { 8607 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8608 if (EVar.isInvalid()) 8609 return 0; 8610 Vars.push_back(EVar.get()); 8611 } 8612 return getDerived().RebuildOMPToClause(Vars, C->getLocStart(), 8613 C->getLParenLoc(), C->getLocEnd()); 8614 } 8615 8616 template <typename Derived> 8617 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *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 0; 8624 Vars.push_back(EVar.get()); 8625 } 8626 return getDerived().RebuildOMPFromClause(Vars, C->getLocStart(), 8627 C->getLParenLoc(), C->getLocEnd()); 8628 } 8629 8630 template <typename Derived> 8631 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause( 8632 OMPUseDevicePtrClause *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().RebuildOMPUseDevicePtrClause( 8642 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8643 } 8644 8645 template <typename Derived> 8646 OMPClause * 8647 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 8648 llvm::SmallVector<Expr *, 16> Vars; 8649 Vars.reserve(C->varlist_size()); 8650 for (auto *VE : C->varlists()) { 8651 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE)); 8652 if (EVar.isInvalid()) 8653 return nullptr; 8654 Vars.push_back(EVar.get()); 8655 } 8656 return getDerived().RebuildOMPIsDevicePtrClause( 8657 Vars, C->getLocStart(), C->getLParenLoc(), C->getLocEnd()); 8658 } 8659 8660 //===----------------------------------------------------------------------===// 8661 // Expression transformation 8662 //===----------------------------------------------------------------------===// 8663 template<typename Derived> 8664 ExprResult 8665 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 8666 if (!E->isTypeDependent()) 8667 return E; 8668 8669 return getDerived().RebuildPredefinedExpr(E->getLocation(), 8670 E->getIdentType()); 8671 } 8672 8673 template<typename Derived> 8674 ExprResult 8675 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 8676 NestedNameSpecifierLoc QualifierLoc; 8677 if (E->getQualifierLoc()) { 8678 QualifierLoc 8679 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8680 if (!QualifierLoc) 8681 return ExprError(); 8682 } 8683 8684 ValueDecl *ND 8685 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 8686 E->getDecl())); 8687 if (!ND) 8688 return ExprError(); 8689 8690 DeclarationNameInfo NameInfo = E->getNameInfo(); 8691 if (NameInfo.getName()) { 8692 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 8693 if (!NameInfo.getName()) 8694 return ExprError(); 8695 } 8696 8697 if (!getDerived().AlwaysRebuild() && 8698 QualifierLoc == E->getQualifierLoc() && 8699 ND == E->getDecl() && 8700 NameInfo.getName() == E->getDecl()->getDeclName() && 8701 !E->hasExplicitTemplateArgs()) { 8702 8703 // Mark it referenced in the new context regardless. 8704 // FIXME: this is a bit instantiation-specific. 8705 SemaRef.MarkDeclRefReferenced(E); 8706 8707 return E; 8708 } 8709 8710 TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr; 8711 if (E->hasExplicitTemplateArgs()) { 8712 TemplateArgs = &TransArgs; 8713 TransArgs.setLAngleLoc(E->getLAngleLoc()); 8714 TransArgs.setRAngleLoc(E->getRAngleLoc()); 8715 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 8716 E->getNumTemplateArgs(), 8717 TransArgs)) 8718 return ExprError(); 8719 } 8720 8721 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 8722 TemplateArgs); 8723 } 8724 8725 template<typename Derived> 8726 ExprResult 8727 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 8728 return E; 8729 } 8730 8731 template<typename Derived> 8732 ExprResult 8733 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 8734 return E; 8735 } 8736 8737 template<typename Derived> 8738 ExprResult 8739 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 8740 return E; 8741 } 8742 8743 template<typename Derived> 8744 ExprResult 8745 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 8746 return E; 8747 } 8748 8749 template<typename Derived> 8750 ExprResult 8751 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 8752 return E; 8753 } 8754 8755 template<typename Derived> 8756 ExprResult 8757 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 8758 if (FunctionDecl *FD = E->getDirectCallee()) 8759 SemaRef.MarkFunctionReferenced(E->getLocStart(), FD); 8760 return SemaRef.MaybeBindToTemporary(E); 8761 } 8762 8763 template<typename Derived> 8764 ExprResult 8765 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 8766 ExprResult ControllingExpr = 8767 getDerived().TransformExpr(E->getControllingExpr()); 8768 if (ControllingExpr.isInvalid()) 8769 return ExprError(); 8770 8771 SmallVector<Expr *, 4> AssocExprs; 8772 SmallVector<TypeSourceInfo *, 4> AssocTypes; 8773 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 8774 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 8775 if (TS) { 8776 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 8777 if (!AssocType) 8778 return ExprError(); 8779 AssocTypes.push_back(AssocType); 8780 } else { 8781 AssocTypes.push_back(nullptr); 8782 } 8783 8784 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 8785 if (AssocExpr.isInvalid()) 8786 return ExprError(); 8787 AssocExprs.push_back(AssocExpr.get()); 8788 } 8789 8790 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 8791 E->getDefaultLoc(), 8792 E->getRParenLoc(), 8793 ControllingExpr.get(), 8794 AssocTypes, 8795 AssocExprs); 8796 } 8797 8798 template<typename Derived> 8799 ExprResult 8800 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 8801 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 8802 if (SubExpr.isInvalid()) 8803 return ExprError(); 8804 8805 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 8806 return E; 8807 8808 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 8809 E->getRParen()); 8810 } 8811 8812 /// \brief The operand of a unary address-of operator has special rules: it's 8813 /// allowed to refer to a non-static member of a class even if there's no 'this' 8814 /// object available. 8815 template<typename Derived> 8816 ExprResult 8817 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 8818 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 8819 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr); 8820 else 8821 return getDerived().TransformExpr(E); 8822 } 8823 8824 template<typename Derived> 8825 ExprResult 8826 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 8827 ExprResult SubExpr; 8828 if (E->getOpcode() == UO_AddrOf) 8829 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 8830 else 8831 SubExpr = TransformExpr(E->getSubExpr()); 8832 if (SubExpr.isInvalid()) 8833 return ExprError(); 8834 8835 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 8836 return E; 8837 8838 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 8839 E->getOpcode(), 8840 SubExpr.get()); 8841 } 8842 8843 template<typename Derived> 8844 ExprResult 8845 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 8846 // Transform the type. 8847 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 8848 if (!Type) 8849 return ExprError(); 8850 8851 // Transform all of the components into components similar to what the 8852 // parser uses. 8853 // FIXME: It would be slightly more efficient in the non-dependent case to 8854 // just map FieldDecls, rather than requiring the rebuilder to look for 8855 // the fields again. However, __builtin_offsetof is rare enough in 8856 // template code that we don't care. 8857 bool ExprChanged = false; 8858 typedef Sema::OffsetOfComponent Component; 8859 SmallVector<Component, 4> Components; 8860 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 8861 const OffsetOfNode &ON = E->getComponent(I); 8862 Component Comp; 8863 Comp.isBrackets = true; 8864 Comp.LocStart = ON.getSourceRange().getBegin(); 8865 Comp.LocEnd = ON.getSourceRange().getEnd(); 8866 switch (ON.getKind()) { 8867 case OffsetOfNode::Array: { 8868 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 8869 ExprResult Index = getDerived().TransformExpr(FromIndex); 8870 if (Index.isInvalid()) 8871 return ExprError(); 8872 8873 ExprChanged = ExprChanged || Index.get() != FromIndex; 8874 Comp.isBrackets = true; 8875 Comp.U.E = Index.get(); 8876 break; 8877 } 8878 8879 case OffsetOfNode::Field: 8880 case OffsetOfNode::Identifier: 8881 Comp.isBrackets = false; 8882 Comp.U.IdentInfo = ON.getFieldName(); 8883 if (!Comp.U.IdentInfo) 8884 continue; 8885 8886 break; 8887 8888 case OffsetOfNode::Base: 8889 // Will be recomputed during the rebuild. 8890 continue; 8891 } 8892 8893 Components.push_back(Comp); 8894 } 8895 8896 // If nothing changed, retain the existing expression. 8897 if (!getDerived().AlwaysRebuild() && 8898 Type == E->getTypeSourceInfo() && 8899 !ExprChanged) 8900 return E; 8901 8902 // Build a new offsetof expression. 8903 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 8904 Components, E->getRParenLoc()); 8905 } 8906 8907 template<typename Derived> 8908 ExprResult 8909 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 8910 assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) && 8911 "opaque value expression requires transformation"); 8912 return E; 8913 } 8914 8915 template<typename Derived> 8916 ExprResult 8917 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) { 8918 return E; 8919 } 8920 8921 template<typename Derived> 8922 ExprResult 8923 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 8924 // Rebuild the syntactic form. The original syntactic form has 8925 // opaque-value expressions in it, so strip those away and rebuild 8926 // the result. This is a really awful way of doing this, but the 8927 // better solution (rebuilding the semantic expressions and 8928 // rebinding OVEs as necessary) doesn't work; we'd need 8929 // TreeTransform to not strip away implicit conversions. 8930 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 8931 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 8932 if (result.isInvalid()) return ExprError(); 8933 8934 // If that gives us a pseudo-object result back, the pseudo-object 8935 // expression must have been an lvalue-to-rvalue conversion which we 8936 // should reapply. 8937 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 8938 result = SemaRef.checkPseudoObjectRValue(result.get()); 8939 8940 return result; 8941 } 8942 8943 template<typename Derived> 8944 ExprResult 8945 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 8946 UnaryExprOrTypeTraitExpr *E) { 8947 if (E->isArgumentType()) { 8948 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 8949 8950 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 8951 if (!NewT) 8952 return ExprError(); 8953 8954 if (!getDerived().AlwaysRebuild() && OldT == NewT) 8955 return E; 8956 8957 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 8958 E->getKind(), 8959 E->getSourceRange()); 8960 } 8961 8962 // C++0x [expr.sizeof]p1: 8963 // The operand is either an expression, which is an unevaluated operand 8964 // [...] 8965 EnterExpressionEvaluationContext Unevaluated( 8966 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 8967 Sema::ReuseLambdaContextDecl); 8968 8969 // Try to recover if we have something like sizeof(T::X) where X is a type. 8970 // Notably, there must be *exactly* one set of parens if X is a type. 8971 TypeSourceInfo *RecoveryTSI = nullptr; 8972 ExprResult SubExpr; 8973 auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr()); 8974 if (auto *DRE = 8975 PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr) 8976 SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr( 8977 PE, DRE, false, &RecoveryTSI); 8978 else 8979 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 8980 8981 if (RecoveryTSI) { 8982 return getDerived().RebuildUnaryExprOrTypeTrait( 8983 RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange()); 8984 } else if (SubExpr.isInvalid()) 8985 return ExprError(); 8986 8987 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 8988 return E; 8989 8990 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 8991 E->getOperatorLoc(), 8992 E->getKind(), 8993 E->getSourceRange()); 8994 } 8995 8996 template<typename Derived> 8997 ExprResult 8998 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 8999 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9000 if (LHS.isInvalid()) 9001 return ExprError(); 9002 9003 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9004 if (RHS.isInvalid()) 9005 return ExprError(); 9006 9007 9008 if (!getDerived().AlwaysRebuild() && 9009 LHS.get() == E->getLHS() && 9010 RHS.get() == E->getRHS()) 9011 return E; 9012 9013 return getDerived().RebuildArraySubscriptExpr(LHS.get(), 9014 /*FIXME:*/E->getLHS()->getLocStart(), 9015 RHS.get(), 9016 E->getRBracketLoc()); 9017 } 9018 9019 template <typename Derived> 9020 ExprResult 9021 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) { 9022 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9023 if (Base.isInvalid()) 9024 return ExprError(); 9025 9026 ExprResult LowerBound; 9027 if (E->getLowerBound()) { 9028 LowerBound = getDerived().TransformExpr(E->getLowerBound()); 9029 if (LowerBound.isInvalid()) 9030 return ExprError(); 9031 } 9032 9033 ExprResult Length; 9034 if (E->getLength()) { 9035 Length = getDerived().TransformExpr(E->getLength()); 9036 if (Length.isInvalid()) 9037 return ExprError(); 9038 } 9039 9040 if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() && 9041 LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength()) 9042 return E; 9043 9044 return getDerived().RebuildOMPArraySectionExpr( 9045 Base.get(), E->getBase()->getLocEnd(), LowerBound.get(), E->getColonLoc(), 9046 Length.get(), E->getRBracketLoc()); 9047 } 9048 9049 template<typename Derived> 9050 ExprResult 9051 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 9052 // Transform the callee. 9053 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9054 if (Callee.isInvalid()) 9055 return ExprError(); 9056 9057 // Transform arguments. 9058 bool ArgChanged = false; 9059 SmallVector<Expr*, 8> Args; 9060 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9061 &ArgChanged)) 9062 return ExprError(); 9063 9064 if (!getDerived().AlwaysRebuild() && 9065 Callee.get() == E->getCallee() && 9066 !ArgChanged) 9067 return SemaRef.MaybeBindToTemporary(E); 9068 9069 // FIXME: Wrong source location information for the '('. 9070 SourceLocation FakeLParenLoc 9071 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9072 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9073 Args, 9074 E->getRParenLoc()); 9075 } 9076 9077 template<typename Derived> 9078 ExprResult 9079 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 9080 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9081 if (Base.isInvalid()) 9082 return ExprError(); 9083 9084 NestedNameSpecifierLoc QualifierLoc; 9085 if (E->hasQualifier()) { 9086 QualifierLoc 9087 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 9088 9089 if (!QualifierLoc) 9090 return ExprError(); 9091 } 9092 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 9093 9094 ValueDecl *Member 9095 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 9096 E->getMemberDecl())); 9097 if (!Member) 9098 return ExprError(); 9099 9100 NamedDecl *FoundDecl = E->getFoundDecl(); 9101 if (FoundDecl == E->getMemberDecl()) { 9102 FoundDecl = Member; 9103 } else { 9104 FoundDecl = cast_or_null<NamedDecl>( 9105 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 9106 if (!FoundDecl) 9107 return ExprError(); 9108 } 9109 9110 if (!getDerived().AlwaysRebuild() && 9111 Base.get() == E->getBase() && 9112 QualifierLoc == E->getQualifierLoc() && 9113 Member == E->getMemberDecl() && 9114 FoundDecl == E->getFoundDecl() && 9115 !E->hasExplicitTemplateArgs()) { 9116 9117 // Mark it referenced in the new context regardless. 9118 // FIXME: this is a bit instantiation-specific. 9119 SemaRef.MarkMemberReferenced(E); 9120 9121 return E; 9122 } 9123 9124 TemplateArgumentListInfo TransArgs; 9125 if (E->hasExplicitTemplateArgs()) { 9126 TransArgs.setLAngleLoc(E->getLAngleLoc()); 9127 TransArgs.setRAngleLoc(E->getRAngleLoc()); 9128 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 9129 E->getNumTemplateArgs(), 9130 TransArgs)) 9131 return ExprError(); 9132 } 9133 9134 // FIXME: Bogus source location for the operator 9135 SourceLocation FakeOperatorLoc = 9136 SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 9137 9138 // FIXME: to do this check properly, we will need to preserve the 9139 // first-qualifier-in-scope here, just in case we had a dependent 9140 // base (and therefore couldn't do the check) and a 9141 // nested-name-qualifier (and therefore could do the lookup). 9142 NamedDecl *FirstQualifierInScope = nullptr; 9143 DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo(); 9144 if (MemberNameInfo.getName()) { 9145 MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo); 9146 if (!MemberNameInfo.getName()) 9147 return ExprError(); 9148 } 9149 9150 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 9151 E->isArrow(), 9152 QualifierLoc, 9153 TemplateKWLoc, 9154 MemberNameInfo, 9155 Member, 9156 FoundDecl, 9157 (E->hasExplicitTemplateArgs() 9158 ? &TransArgs : nullptr), 9159 FirstQualifierInScope); 9160 } 9161 9162 template<typename Derived> 9163 ExprResult 9164 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 9165 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9166 if (LHS.isInvalid()) 9167 return ExprError(); 9168 9169 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9170 if (RHS.isInvalid()) 9171 return ExprError(); 9172 9173 if (!getDerived().AlwaysRebuild() && 9174 LHS.get() == E->getLHS() && 9175 RHS.get() == E->getRHS()) 9176 return E; 9177 9178 Sema::FPContractStateRAII FPContractState(getSema()); 9179 getSema().FPFeatures = E->getFPFeatures(); 9180 9181 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 9182 LHS.get(), RHS.get()); 9183 } 9184 9185 template<typename Derived> 9186 ExprResult 9187 TreeTransform<Derived>::TransformCompoundAssignOperator( 9188 CompoundAssignOperator *E) { 9189 return getDerived().TransformBinaryOperator(E); 9190 } 9191 9192 template<typename Derived> 9193 ExprResult TreeTransform<Derived>:: 9194 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 9195 // Just rebuild the common and RHS expressions and see whether we 9196 // get any changes. 9197 9198 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 9199 if (commonExpr.isInvalid()) 9200 return ExprError(); 9201 9202 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 9203 if (rhs.isInvalid()) 9204 return ExprError(); 9205 9206 if (!getDerived().AlwaysRebuild() && 9207 commonExpr.get() == e->getCommon() && 9208 rhs.get() == e->getFalseExpr()) 9209 return e; 9210 9211 return getDerived().RebuildConditionalOperator(commonExpr.get(), 9212 e->getQuestionLoc(), 9213 nullptr, 9214 e->getColonLoc(), 9215 rhs.get()); 9216 } 9217 9218 template<typename Derived> 9219 ExprResult 9220 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 9221 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9222 if (Cond.isInvalid()) 9223 return ExprError(); 9224 9225 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9226 if (LHS.isInvalid()) 9227 return ExprError(); 9228 9229 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9230 if (RHS.isInvalid()) 9231 return ExprError(); 9232 9233 if (!getDerived().AlwaysRebuild() && 9234 Cond.get() == E->getCond() && 9235 LHS.get() == E->getLHS() && 9236 RHS.get() == E->getRHS()) 9237 return E; 9238 9239 return getDerived().RebuildConditionalOperator(Cond.get(), 9240 E->getQuestionLoc(), 9241 LHS.get(), 9242 E->getColonLoc(), 9243 RHS.get()); 9244 } 9245 9246 template<typename Derived> 9247 ExprResult 9248 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 9249 // Implicit casts are eliminated during transformation, since they 9250 // will be recomputed by semantic analysis after transformation. 9251 return getDerived().TransformExpr(E->getSubExprAsWritten()); 9252 } 9253 9254 template<typename Derived> 9255 ExprResult 9256 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 9257 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9258 if (!Type) 9259 return ExprError(); 9260 9261 ExprResult SubExpr 9262 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9263 if (SubExpr.isInvalid()) 9264 return ExprError(); 9265 9266 if (!getDerived().AlwaysRebuild() && 9267 Type == E->getTypeInfoAsWritten() && 9268 SubExpr.get() == E->getSubExpr()) 9269 return E; 9270 9271 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 9272 Type, 9273 E->getRParenLoc(), 9274 SubExpr.get()); 9275 } 9276 9277 template<typename Derived> 9278 ExprResult 9279 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 9280 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 9281 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 9282 if (!NewT) 9283 return ExprError(); 9284 9285 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 9286 if (Init.isInvalid()) 9287 return ExprError(); 9288 9289 if (!getDerived().AlwaysRebuild() && 9290 OldT == NewT && 9291 Init.get() == E->getInitializer()) 9292 return SemaRef.MaybeBindToTemporary(E); 9293 9294 // Note: the expression type doesn't necessarily match the 9295 // type-as-written, but that's okay, because it should always be 9296 // derivable from the initializer. 9297 9298 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 9299 /*FIXME:*/E->getInitializer()->getLocEnd(), 9300 Init.get()); 9301 } 9302 9303 template<typename Derived> 9304 ExprResult 9305 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 9306 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9307 if (Base.isInvalid()) 9308 return ExprError(); 9309 9310 if (!getDerived().AlwaysRebuild() && 9311 Base.get() == E->getBase()) 9312 return E; 9313 9314 // FIXME: Bad source location 9315 SourceLocation FakeOperatorLoc = 9316 SemaRef.getLocForEndOfToken(E->getBase()->getLocEnd()); 9317 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 9318 E->getAccessorLoc(), 9319 E->getAccessor()); 9320 } 9321 9322 template<typename Derived> 9323 ExprResult 9324 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 9325 if (InitListExpr *Syntactic = E->getSyntacticForm()) 9326 E = Syntactic; 9327 9328 bool InitChanged = false; 9329 9330 SmallVector<Expr*, 4> Inits; 9331 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 9332 Inits, &InitChanged)) 9333 return ExprError(); 9334 9335 if (!getDerived().AlwaysRebuild() && !InitChanged) { 9336 // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr 9337 // in some cases. We can't reuse it in general, because the syntactic and 9338 // semantic forms are linked, and we can't know that semantic form will 9339 // match even if the syntactic form does. 9340 } 9341 9342 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 9343 E->getRBraceLoc(), E->getType()); 9344 } 9345 9346 template<typename Derived> 9347 ExprResult 9348 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 9349 Designation Desig; 9350 9351 // transform the initializer value 9352 ExprResult Init = getDerived().TransformExpr(E->getInit()); 9353 if (Init.isInvalid()) 9354 return ExprError(); 9355 9356 // transform the designators. 9357 SmallVector<Expr*, 4> ArrayExprs; 9358 bool ExprChanged = false; 9359 for (const DesignatedInitExpr::Designator &D : E->designators()) { 9360 if (D.isFieldDesignator()) { 9361 Desig.AddDesignator(Designator::getField(D.getFieldName(), 9362 D.getDotLoc(), 9363 D.getFieldLoc())); 9364 if (D.getField()) { 9365 FieldDecl *Field = cast_or_null<FieldDecl>( 9366 getDerived().TransformDecl(D.getFieldLoc(), D.getField())); 9367 if (Field != D.getField()) 9368 // Rebuild the expression when the transformed FieldDecl is 9369 // different to the already assigned FieldDecl. 9370 ExprChanged = true; 9371 } else { 9372 // Ensure that the designator expression is rebuilt when there isn't 9373 // a resolved FieldDecl in the designator as we don't want to assign 9374 // a FieldDecl to a pattern designator that will be instantiated again. 9375 ExprChanged = true; 9376 } 9377 continue; 9378 } 9379 9380 if (D.isArrayDesignator()) { 9381 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D)); 9382 if (Index.isInvalid()) 9383 return ExprError(); 9384 9385 Desig.AddDesignator( 9386 Designator::getArray(Index.get(), D.getLBracketLoc())); 9387 9388 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D); 9389 ArrayExprs.push_back(Index.get()); 9390 continue; 9391 } 9392 9393 assert(D.isArrayRangeDesignator() && "New kind of designator?"); 9394 ExprResult Start 9395 = getDerived().TransformExpr(E->getArrayRangeStart(D)); 9396 if (Start.isInvalid()) 9397 return ExprError(); 9398 9399 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D)); 9400 if (End.isInvalid()) 9401 return ExprError(); 9402 9403 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 9404 End.get(), 9405 D.getLBracketLoc(), 9406 D.getEllipsisLoc())); 9407 9408 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) || 9409 End.get() != E->getArrayRangeEnd(D); 9410 9411 ArrayExprs.push_back(Start.get()); 9412 ArrayExprs.push_back(End.get()); 9413 } 9414 9415 if (!getDerived().AlwaysRebuild() && 9416 Init.get() == E->getInit() && 9417 !ExprChanged) 9418 return E; 9419 9420 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 9421 E->getEqualOrColonLoc(), 9422 E->usesGNUSyntax(), Init.get()); 9423 } 9424 9425 // Seems that if TransformInitListExpr() only works on the syntactic form of an 9426 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered. 9427 template<typename Derived> 9428 ExprResult 9429 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr( 9430 DesignatedInitUpdateExpr *E) { 9431 llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of " 9432 "initializer"); 9433 return ExprError(); 9434 } 9435 9436 template<typename Derived> 9437 ExprResult 9438 TreeTransform<Derived>::TransformNoInitExpr( 9439 NoInitExpr *E) { 9440 llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer"); 9441 return ExprError(); 9442 } 9443 9444 template<typename Derived> 9445 ExprResult 9446 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) { 9447 llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer"); 9448 return ExprError(); 9449 } 9450 9451 template<typename Derived> 9452 ExprResult 9453 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) { 9454 llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer"); 9455 return ExprError(); 9456 } 9457 9458 template<typename Derived> 9459 ExprResult 9460 TreeTransform<Derived>::TransformImplicitValueInitExpr( 9461 ImplicitValueInitExpr *E) { 9462 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 9463 9464 // FIXME: Will we ever have proper type location here? Will we actually 9465 // need to transform the type? 9466 QualType T = getDerived().TransformType(E->getType()); 9467 if (T.isNull()) 9468 return ExprError(); 9469 9470 if (!getDerived().AlwaysRebuild() && 9471 T == E->getType()) 9472 return E; 9473 9474 return getDerived().RebuildImplicitValueInitExpr(T); 9475 } 9476 9477 template<typename Derived> 9478 ExprResult 9479 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 9480 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 9481 if (!TInfo) 9482 return ExprError(); 9483 9484 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9485 if (SubExpr.isInvalid()) 9486 return ExprError(); 9487 9488 if (!getDerived().AlwaysRebuild() && 9489 TInfo == E->getWrittenTypeInfo() && 9490 SubExpr.get() == E->getSubExpr()) 9491 return E; 9492 9493 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 9494 TInfo, E->getRParenLoc()); 9495 } 9496 9497 template<typename Derived> 9498 ExprResult 9499 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 9500 bool ArgumentChanged = false; 9501 SmallVector<Expr*, 4> Inits; 9502 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 9503 &ArgumentChanged)) 9504 return ExprError(); 9505 9506 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 9507 Inits, 9508 E->getRParenLoc()); 9509 } 9510 9511 /// \brief Transform an address-of-label expression. 9512 /// 9513 /// By default, the transformation of an address-of-label expression always 9514 /// rebuilds the expression, so that the label identifier can be resolved to 9515 /// the corresponding label statement by semantic analysis. 9516 template<typename Derived> 9517 ExprResult 9518 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 9519 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 9520 E->getLabel()); 9521 if (!LD) 9522 return ExprError(); 9523 9524 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 9525 cast<LabelDecl>(LD)); 9526 } 9527 9528 template<typename Derived> 9529 ExprResult 9530 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 9531 SemaRef.ActOnStartStmtExpr(); 9532 StmtResult SubStmt 9533 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 9534 if (SubStmt.isInvalid()) { 9535 SemaRef.ActOnStmtExprError(); 9536 return ExprError(); 9537 } 9538 9539 if (!getDerived().AlwaysRebuild() && 9540 SubStmt.get() == E->getSubStmt()) { 9541 // Calling this an 'error' is unintuitive, but it does the right thing. 9542 SemaRef.ActOnStmtExprError(); 9543 return SemaRef.MaybeBindToTemporary(E); 9544 } 9545 9546 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 9547 SubStmt.get(), 9548 E->getRParenLoc()); 9549 } 9550 9551 template<typename Derived> 9552 ExprResult 9553 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 9554 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 9555 if (Cond.isInvalid()) 9556 return ExprError(); 9557 9558 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 9559 if (LHS.isInvalid()) 9560 return ExprError(); 9561 9562 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 9563 if (RHS.isInvalid()) 9564 return ExprError(); 9565 9566 if (!getDerived().AlwaysRebuild() && 9567 Cond.get() == E->getCond() && 9568 LHS.get() == E->getLHS() && 9569 RHS.get() == E->getRHS()) 9570 return E; 9571 9572 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 9573 Cond.get(), LHS.get(), RHS.get(), 9574 E->getRParenLoc()); 9575 } 9576 9577 template<typename Derived> 9578 ExprResult 9579 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 9580 return E; 9581 } 9582 9583 template<typename Derived> 9584 ExprResult 9585 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 9586 switch (E->getOperator()) { 9587 case OO_New: 9588 case OO_Delete: 9589 case OO_Array_New: 9590 case OO_Array_Delete: 9591 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 9592 9593 case OO_Call: { 9594 // This is a call to an object's operator(). 9595 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 9596 9597 // Transform the object itself. 9598 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 9599 if (Object.isInvalid()) 9600 return ExprError(); 9601 9602 // FIXME: Poor location information 9603 SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken( 9604 static_cast<Expr *>(Object.get())->getLocEnd()); 9605 9606 // Transform the call arguments. 9607 SmallVector<Expr*, 8> Args; 9608 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 9609 Args)) 9610 return ExprError(); 9611 9612 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 9613 Args, 9614 E->getLocEnd()); 9615 } 9616 9617 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 9618 case OO_##Name: 9619 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 9620 #include "clang/Basic/OperatorKinds.def" 9621 case OO_Subscript: 9622 // Handled below. 9623 break; 9624 9625 case OO_Conditional: 9626 llvm_unreachable("conditional operator is not actually overloadable"); 9627 9628 case OO_None: 9629 case NUM_OVERLOADED_OPERATORS: 9630 llvm_unreachable("not an overloaded operator?"); 9631 } 9632 9633 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9634 if (Callee.isInvalid()) 9635 return ExprError(); 9636 9637 ExprResult First; 9638 if (E->getOperator() == OO_Amp) 9639 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 9640 else 9641 First = getDerived().TransformExpr(E->getArg(0)); 9642 if (First.isInvalid()) 9643 return ExprError(); 9644 9645 ExprResult Second; 9646 if (E->getNumArgs() == 2) { 9647 Second = getDerived().TransformExpr(E->getArg(1)); 9648 if (Second.isInvalid()) 9649 return ExprError(); 9650 } 9651 9652 if (!getDerived().AlwaysRebuild() && 9653 Callee.get() == E->getCallee() && 9654 First.get() == E->getArg(0) && 9655 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 9656 return SemaRef.MaybeBindToTemporary(E); 9657 9658 Sema::FPContractStateRAII FPContractState(getSema()); 9659 getSema().FPFeatures = E->getFPFeatures(); 9660 9661 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 9662 E->getOperatorLoc(), 9663 Callee.get(), 9664 First.get(), 9665 Second.get()); 9666 } 9667 9668 template<typename Derived> 9669 ExprResult 9670 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 9671 return getDerived().TransformCallExpr(E); 9672 } 9673 9674 template<typename Derived> 9675 ExprResult 9676 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 9677 // Transform the callee. 9678 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 9679 if (Callee.isInvalid()) 9680 return ExprError(); 9681 9682 // Transform exec config. 9683 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 9684 if (EC.isInvalid()) 9685 return ExprError(); 9686 9687 // Transform arguments. 9688 bool ArgChanged = false; 9689 SmallVector<Expr*, 8> Args; 9690 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 9691 &ArgChanged)) 9692 return ExprError(); 9693 9694 if (!getDerived().AlwaysRebuild() && 9695 Callee.get() == E->getCallee() && 9696 !ArgChanged) 9697 return SemaRef.MaybeBindToTemporary(E); 9698 9699 // FIXME: Wrong source location information for the '('. 9700 SourceLocation FakeLParenLoc 9701 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 9702 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 9703 Args, 9704 E->getRParenLoc(), EC.get()); 9705 } 9706 9707 template<typename Derived> 9708 ExprResult 9709 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 9710 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 9711 if (!Type) 9712 return ExprError(); 9713 9714 ExprResult SubExpr 9715 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9716 if (SubExpr.isInvalid()) 9717 return ExprError(); 9718 9719 if (!getDerived().AlwaysRebuild() && 9720 Type == E->getTypeInfoAsWritten() && 9721 SubExpr.get() == E->getSubExpr()) 9722 return E; 9723 return getDerived().RebuildCXXNamedCastExpr( 9724 E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(), 9725 Type, E->getAngleBrackets().getEnd(), 9726 // FIXME. this should be '(' location 9727 E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc()); 9728 } 9729 9730 template<typename Derived> 9731 ExprResult 9732 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 9733 return getDerived().TransformCXXNamedCastExpr(E); 9734 } 9735 9736 template<typename Derived> 9737 ExprResult 9738 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 9739 return getDerived().TransformCXXNamedCastExpr(E); 9740 } 9741 9742 template<typename Derived> 9743 ExprResult 9744 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 9745 CXXReinterpretCastExpr *E) { 9746 return getDerived().TransformCXXNamedCastExpr(E); 9747 } 9748 9749 template<typename Derived> 9750 ExprResult 9751 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 9752 return getDerived().TransformCXXNamedCastExpr(E); 9753 } 9754 9755 template<typename Derived> 9756 ExprResult 9757 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 9758 CXXFunctionalCastExpr *E) { 9759 TypeSourceInfo *Type = 9760 getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten()); 9761 if (!Type) 9762 return ExprError(); 9763 9764 ExprResult SubExpr 9765 = getDerived().TransformExpr(E->getSubExprAsWritten()); 9766 if (SubExpr.isInvalid()) 9767 return ExprError(); 9768 9769 if (!getDerived().AlwaysRebuild() && 9770 Type == E->getTypeInfoAsWritten() && 9771 SubExpr.get() == E->getSubExpr()) 9772 return E; 9773 9774 return getDerived().RebuildCXXFunctionalCastExpr(Type, 9775 E->getLParenLoc(), 9776 SubExpr.get(), 9777 E->getRParenLoc()); 9778 } 9779 9780 template<typename Derived> 9781 ExprResult 9782 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 9783 if (E->isTypeOperand()) { 9784 TypeSourceInfo *TInfo 9785 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 9786 if (!TInfo) 9787 return ExprError(); 9788 9789 if (!getDerived().AlwaysRebuild() && 9790 TInfo == E->getTypeOperandSourceInfo()) 9791 return E; 9792 9793 return getDerived().RebuildCXXTypeidExpr(E->getType(), 9794 E->getLocStart(), 9795 TInfo, 9796 E->getLocEnd()); 9797 } 9798 9799 // We don't know whether the subexpression is potentially evaluated until 9800 // after we perform semantic analysis. We speculatively assume it is 9801 // unevaluated; it will get fixed later if the subexpression is in fact 9802 // potentially evaluated. 9803 EnterExpressionEvaluationContext Unevaluated( 9804 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, 9805 Sema::ReuseLambdaContextDecl); 9806 9807 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 9808 if (SubExpr.isInvalid()) 9809 return ExprError(); 9810 9811 if (!getDerived().AlwaysRebuild() && 9812 SubExpr.get() == E->getExprOperand()) 9813 return E; 9814 9815 return getDerived().RebuildCXXTypeidExpr(E->getType(), 9816 E->getLocStart(), 9817 SubExpr.get(), 9818 E->getLocEnd()); 9819 } 9820 9821 template<typename Derived> 9822 ExprResult 9823 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 9824 if (E->isTypeOperand()) { 9825 TypeSourceInfo *TInfo 9826 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 9827 if (!TInfo) 9828 return ExprError(); 9829 9830 if (!getDerived().AlwaysRebuild() && 9831 TInfo == E->getTypeOperandSourceInfo()) 9832 return E; 9833 9834 return getDerived().RebuildCXXUuidofExpr(E->getType(), 9835 E->getLocStart(), 9836 TInfo, 9837 E->getLocEnd()); 9838 } 9839 9840 EnterExpressionEvaluationContext Unevaluated( 9841 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 9842 9843 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 9844 if (SubExpr.isInvalid()) 9845 return ExprError(); 9846 9847 if (!getDerived().AlwaysRebuild() && 9848 SubExpr.get() == E->getExprOperand()) 9849 return E; 9850 9851 return getDerived().RebuildCXXUuidofExpr(E->getType(), 9852 E->getLocStart(), 9853 SubExpr.get(), 9854 E->getLocEnd()); 9855 } 9856 9857 template<typename Derived> 9858 ExprResult 9859 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 9860 return E; 9861 } 9862 9863 template<typename Derived> 9864 ExprResult 9865 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 9866 CXXNullPtrLiteralExpr *E) { 9867 return E; 9868 } 9869 9870 template<typename Derived> 9871 ExprResult 9872 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 9873 QualType T = getSema().getCurrentThisType(); 9874 9875 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 9876 // Make sure that we capture 'this'. 9877 getSema().CheckCXXThisCapture(E->getLocStart()); 9878 return E; 9879 } 9880 9881 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 9882 } 9883 9884 template<typename Derived> 9885 ExprResult 9886 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 9887 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 9888 if (SubExpr.isInvalid()) 9889 return ExprError(); 9890 9891 if (!getDerived().AlwaysRebuild() && 9892 SubExpr.get() == E->getSubExpr()) 9893 return E; 9894 9895 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 9896 E->isThrownVariableInScope()); 9897 } 9898 9899 template<typename Derived> 9900 ExprResult 9901 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 9902 ParmVarDecl *Param 9903 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 9904 E->getParam())); 9905 if (!Param) 9906 return ExprError(); 9907 9908 if (!getDerived().AlwaysRebuild() && 9909 Param == E->getParam()) 9910 return E; 9911 9912 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 9913 } 9914 9915 template<typename Derived> 9916 ExprResult 9917 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 9918 FieldDecl *Field 9919 = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(), 9920 E->getField())); 9921 if (!Field) 9922 return ExprError(); 9923 9924 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 9925 return E; 9926 9927 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 9928 } 9929 9930 template<typename Derived> 9931 ExprResult 9932 TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 9933 CXXScalarValueInitExpr *E) { 9934 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 9935 if (!T) 9936 return ExprError(); 9937 9938 if (!getDerived().AlwaysRebuild() && 9939 T == E->getTypeSourceInfo()) 9940 return E; 9941 9942 return getDerived().RebuildCXXScalarValueInitExpr(T, 9943 /*FIXME:*/T->getTypeLoc().getEndLoc(), 9944 E->getRParenLoc()); 9945 } 9946 9947 template<typename Derived> 9948 ExprResult 9949 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 9950 // Transform the type that we're allocating 9951 TypeSourceInfo *AllocTypeInfo = 9952 getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo()); 9953 if (!AllocTypeInfo) 9954 return ExprError(); 9955 9956 // Transform the size of the array we're allocating (if any). 9957 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 9958 if (ArraySize.isInvalid()) 9959 return ExprError(); 9960 9961 // Transform the placement arguments (if any). 9962 bool ArgumentChanged = false; 9963 SmallVector<Expr*, 8> PlacementArgs; 9964 if (getDerived().TransformExprs(E->getPlacementArgs(), 9965 E->getNumPlacementArgs(), true, 9966 PlacementArgs, &ArgumentChanged)) 9967 return ExprError(); 9968 9969 // Transform the initializer (if any). 9970 Expr *OldInit = E->getInitializer(); 9971 ExprResult NewInit; 9972 if (OldInit) 9973 NewInit = getDerived().TransformInitializer(OldInit, true); 9974 if (NewInit.isInvalid()) 9975 return ExprError(); 9976 9977 // Transform new operator and delete operator. 9978 FunctionDecl *OperatorNew = nullptr; 9979 if (E->getOperatorNew()) { 9980 OperatorNew = cast_or_null<FunctionDecl>( 9981 getDerived().TransformDecl(E->getLocStart(), 9982 E->getOperatorNew())); 9983 if (!OperatorNew) 9984 return ExprError(); 9985 } 9986 9987 FunctionDecl *OperatorDelete = nullptr; 9988 if (E->getOperatorDelete()) { 9989 OperatorDelete = cast_or_null<FunctionDecl>( 9990 getDerived().TransformDecl(E->getLocStart(), 9991 E->getOperatorDelete())); 9992 if (!OperatorDelete) 9993 return ExprError(); 9994 } 9995 9996 if (!getDerived().AlwaysRebuild() && 9997 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 9998 ArraySize.get() == E->getArraySize() && 9999 NewInit.get() == OldInit && 10000 OperatorNew == E->getOperatorNew() && 10001 OperatorDelete == E->getOperatorDelete() && 10002 !ArgumentChanged) { 10003 // Mark any declarations we need as referenced. 10004 // FIXME: instantiation-specific. 10005 if (OperatorNew) 10006 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew); 10007 if (OperatorDelete) 10008 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 10009 10010 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 10011 QualType ElementType 10012 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 10013 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 10014 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 10015 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 10016 SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor); 10017 } 10018 } 10019 } 10020 10021 return E; 10022 } 10023 10024 QualType AllocType = AllocTypeInfo->getType(); 10025 if (!ArraySize.get()) { 10026 // If no array size was specified, but the new expression was 10027 // instantiated with an array type (e.g., "new T" where T is 10028 // instantiated with "int[4]"), extract the outer bound from the 10029 // array type as our array size. We do this with constant and 10030 // dependently-sized array types. 10031 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 10032 if (!ArrayT) { 10033 // Do nothing 10034 } else if (const ConstantArrayType *ConsArrayT 10035 = dyn_cast<ConstantArrayType>(ArrayT)) { 10036 ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(), 10037 SemaRef.Context.getSizeType(), 10038 /*FIXME:*/ E->getLocStart()); 10039 AllocType = ConsArrayT->getElementType(); 10040 } else if (const DependentSizedArrayType *DepArrayT 10041 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 10042 if (DepArrayT->getSizeExpr()) { 10043 ArraySize = DepArrayT->getSizeExpr(); 10044 AllocType = DepArrayT->getElementType(); 10045 } 10046 } 10047 } 10048 10049 return getDerived().RebuildCXXNewExpr(E->getLocStart(), 10050 E->isGlobalNew(), 10051 /*FIXME:*/E->getLocStart(), 10052 PlacementArgs, 10053 /*FIXME:*/E->getLocStart(), 10054 E->getTypeIdParens(), 10055 AllocType, 10056 AllocTypeInfo, 10057 ArraySize.get(), 10058 E->getDirectInitRange(), 10059 NewInit.get()); 10060 } 10061 10062 template<typename Derived> 10063 ExprResult 10064 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 10065 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 10066 if (Operand.isInvalid()) 10067 return ExprError(); 10068 10069 // Transform the delete operator, if known. 10070 FunctionDecl *OperatorDelete = nullptr; 10071 if (E->getOperatorDelete()) { 10072 OperatorDelete = cast_or_null<FunctionDecl>( 10073 getDerived().TransformDecl(E->getLocStart(), 10074 E->getOperatorDelete())); 10075 if (!OperatorDelete) 10076 return ExprError(); 10077 } 10078 10079 if (!getDerived().AlwaysRebuild() && 10080 Operand.get() == E->getArgument() && 10081 OperatorDelete == E->getOperatorDelete()) { 10082 // Mark any declarations we need as referenced. 10083 // FIXME: instantiation-specific. 10084 if (OperatorDelete) 10085 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 10086 10087 if (!E->getArgument()->isTypeDependent()) { 10088 QualType Destroyed = SemaRef.Context.getBaseElementType( 10089 E->getDestroyedType()); 10090 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 10091 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 10092 SemaRef.MarkFunctionReferenced(E->getLocStart(), 10093 SemaRef.LookupDestructor(Record)); 10094 } 10095 } 10096 10097 return E; 10098 } 10099 10100 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 10101 E->isGlobalDelete(), 10102 E->isArrayForm(), 10103 Operand.get()); 10104 } 10105 10106 template<typename Derived> 10107 ExprResult 10108 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 10109 CXXPseudoDestructorExpr *E) { 10110 ExprResult Base = getDerived().TransformExpr(E->getBase()); 10111 if (Base.isInvalid()) 10112 return ExprError(); 10113 10114 ParsedType ObjectTypePtr; 10115 bool MayBePseudoDestructor = false; 10116 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 10117 E->getOperatorLoc(), 10118 E->isArrow()? tok::arrow : tok::period, 10119 ObjectTypePtr, 10120 MayBePseudoDestructor); 10121 if (Base.isInvalid()) 10122 return ExprError(); 10123 10124 QualType ObjectType = ObjectTypePtr.get(); 10125 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 10126 if (QualifierLoc) { 10127 QualifierLoc 10128 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 10129 if (!QualifierLoc) 10130 return ExprError(); 10131 } 10132 CXXScopeSpec SS; 10133 SS.Adopt(QualifierLoc); 10134 10135 PseudoDestructorTypeStorage Destroyed; 10136 if (E->getDestroyedTypeInfo()) { 10137 TypeSourceInfo *DestroyedTypeInfo 10138 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 10139 ObjectType, nullptr, SS); 10140 if (!DestroyedTypeInfo) 10141 return ExprError(); 10142 Destroyed = DestroyedTypeInfo; 10143 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 10144 // We aren't likely to be able to resolve the identifier down to a type 10145 // now anyway, so just retain the identifier. 10146 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 10147 E->getDestroyedTypeLoc()); 10148 } else { 10149 // Look for a destructor known with the given name. 10150 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 10151 *E->getDestroyedTypeIdentifier(), 10152 E->getDestroyedTypeLoc(), 10153 /*Scope=*/nullptr, 10154 SS, ObjectTypePtr, 10155 false); 10156 if (!T) 10157 return ExprError(); 10158 10159 Destroyed 10160 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 10161 E->getDestroyedTypeLoc()); 10162 } 10163 10164 TypeSourceInfo *ScopeTypeInfo = nullptr; 10165 if (E->getScopeTypeInfo()) { 10166 CXXScopeSpec EmptySS; 10167 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 10168 E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS); 10169 if (!ScopeTypeInfo) 10170 return ExprError(); 10171 } 10172 10173 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 10174 E->getOperatorLoc(), 10175 E->isArrow(), 10176 SS, 10177 ScopeTypeInfo, 10178 E->getColonColonLoc(), 10179 E->getTildeLoc(), 10180 Destroyed); 10181 } 10182 10183 template <typename Derived> 10184 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old, 10185 bool RequiresADL, 10186 LookupResult &R) { 10187 // Transform all the decls. 10188 bool AllEmptyPacks = true; 10189 for (auto *OldD : Old->decls()) { 10190 Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD); 10191 if (!InstD) { 10192 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 10193 // This can happen because of dependent hiding. 10194 if (isa<UsingShadowDecl>(OldD)) 10195 continue; 10196 else { 10197 R.clear(); 10198 return true; 10199 } 10200 } 10201 10202 // Expand using pack declarations. 10203 NamedDecl *SingleDecl = cast<NamedDecl>(InstD); 10204 ArrayRef<NamedDecl*> Decls = SingleDecl; 10205 if (auto *UPD = dyn_cast<UsingPackDecl>(InstD)) 10206 Decls = UPD->expansions(); 10207 10208 // Expand using declarations. 10209 for (auto *D : Decls) { 10210 if (auto *UD = dyn_cast<UsingDecl>(D)) { 10211 for (auto *SD : UD->shadows()) 10212 R.addDecl(SD); 10213 } else { 10214 R.addDecl(D); 10215 } 10216 } 10217 10218 AllEmptyPacks &= Decls.empty(); 10219 }; 10220 10221 // C++ [temp.res]/8.4.2: 10222 // The program is ill-formed, no diagnostic required, if [...] lookup for 10223 // a name in the template definition found a using-declaration, but the 10224 // lookup in the corresponding scope in the instantiation odoes not find 10225 // any declarations because the using-declaration was a pack expansion and 10226 // the corresponding pack is empty 10227 if (AllEmptyPacks && !RequiresADL) { 10228 getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty) 10229 << isa<UnresolvedMemberExpr>(Old) << Old->getNameInfo().getName(); 10230 return true; 10231 } 10232 10233 // Resolve a kind, but don't do any further analysis. If it's 10234 // ambiguous, the callee needs to deal with it. 10235 R.resolveKind(); 10236 return false; 10237 } 10238 10239 template<typename Derived> 10240 ExprResult 10241 TreeTransform<Derived>::TransformUnresolvedLookupExpr( 10242 UnresolvedLookupExpr *Old) { 10243 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 10244 Sema::LookupOrdinaryName); 10245 10246 // Transform the declaration set. 10247 if (TransformOverloadExprDecls(Old, Old->requiresADL(), R)) 10248 return ExprError(); 10249 10250 // Rebuild the nested-name qualifier, if present. 10251 CXXScopeSpec SS; 10252 if (Old->getQualifierLoc()) { 10253 NestedNameSpecifierLoc QualifierLoc 10254 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 10255 if (!QualifierLoc) 10256 return ExprError(); 10257 10258 SS.Adopt(QualifierLoc); 10259 } 10260 10261 if (Old->getNamingClass()) { 10262 CXXRecordDecl *NamingClass 10263 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 10264 Old->getNameLoc(), 10265 Old->getNamingClass())); 10266 if (!NamingClass) { 10267 R.clear(); 10268 return ExprError(); 10269 } 10270 10271 R.setNamingClass(NamingClass); 10272 } 10273 10274 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 10275 10276 // If we have neither explicit template arguments, nor the template keyword, 10277 // it's a normal declaration name or member reference. 10278 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) { 10279 NamedDecl *D = R.getAsSingle<NamedDecl>(); 10280 // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an 10281 // instance member. In other contexts, BuildPossibleImplicitMemberExpr will 10282 // give a good diagnostic. 10283 if (D && D->isCXXInstanceMember()) { 10284 return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R, 10285 /*TemplateArgs=*/nullptr, 10286 /*Scope=*/nullptr); 10287 } 10288 10289 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 10290 } 10291 10292 // If we have template arguments, rebuild them, then rebuild the 10293 // templateid expression. 10294 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 10295 if (Old->hasExplicitTemplateArgs() && 10296 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 10297 Old->getNumTemplateArgs(), 10298 TransArgs)) { 10299 R.clear(); 10300 return ExprError(); 10301 } 10302 10303 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 10304 Old->requiresADL(), &TransArgs); 10305 } 10306 10307 template<typename Derived> 10308 ExprResult 10309 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 10310 bool ArgChanged = false; 10311 SmallVector<TypeSourceInfo *, 4> Args; 10312 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 10313 TypeSourceInfo *From = E->getArg(I); 10314 TypeLoc FromTL = From->getTypeLoc(); 10315 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 10316 TypeLocBuilder TLB; 10317 TLB.reserve(FromTL.getFullDataSize()); 10318 QualType To = getDerived().TransformType(TLB, FromTL); 10319 if (To.isNull()) 10320 return ExprError(); 10321 10322 if (To == From->getType()) 10323 Args.push_back(From); 10324 else { 10325 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10326 ArgChanged = true; 10327 } 10328 continue; 10329 } 10330 10331 ArgChanged = true; 10332 10333 // We have a pack expansion. Instantiate it. 10334 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 10335 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 10336 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 10337 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 10338 10339 // Determine whether the set of unexpanded parameter packs can and should 10340 // be expanded. 10341 bool Expand = true; 10342 bool RetainExpansion = false; 10343 Optional<unsigned> OrigNumExpansions = 10344 ExpansionTL.getTypePtr()->getNumExpansions(); 10345 Optional<unsigned> NumExpansions = OrigNumExpansions; 10346 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 10347 PatternTL.getSourceRange(), 10348 Unexpanded, 10349 Expand, RetainExpansion, 10350 NumExpansions)) 10351 return ExprError(); 10352 10353 if (!Expand) { 10354 // The transform has determined that we should perform a simple 10355 // transformation on the pack expansion, producing another pack 10356 // expansion. 10357 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 10358 10359 TypeLocBuilder TLB; 10360 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10361 10362 QualType To = getDerived().TransformType(TLB, PatternTL); 10363 if (To.isNull()) 10364 return ExprError(); 10365 10366 To = getDerived().RebuildPackExpansionType(To, 10367 PatternTL.getSourceRange(), 10368 ExpansionTL.getEllipsisLoc(), 10369 NumExpansions); 10370 if (To.isNull()) 10371 return ExprError(); 10372 10373 PackExpansionTypeLoc ToExpansionTL 10374 = TLB.push<PackExpansionTypeLoc>(To); 10375 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10376 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10377 continue; 10378 } 10379 10380 // Expand the pack expansion by substituting for each argument in the 10381 // pack(s). 10382 for (unsigned I = 0; I != *NumExpansions; ++I) { 10383 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 10384 TypeLocBuilder TLB; 10385 TLB.reserve(PatternTL.getFullDataSize()); 10386 QualType To = getDerived().TransformType(TLB, PatternTL); 10387 if (To.isNull()) 10388 return ExprError(); 10389 10390 if (To->containsUnexpandedParameterPack()) { 10391 To = getDerived().RebuildPackExpansionType(To, 10392 PatternTL.getSourceRange(), 10393 ExpansionTL.getEllipsisLoc(), 10394 NumExpansions); 10395 if (To.isNull()) 10396 return ExprError(); 10397 10398 PackExpansionTypeLoc ToExpansionTL 10399 = TLB.push<PackExpansionTypeLoc>(To); 10400 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10401 } 10402 10403 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10404 } 10405 10406 if (!RetainExpansion) 10407 continue; 10408 10409 // If we're supposed to retain a pack expansion, do so by temporarily 10410 // forgetting the partially-substituted parameter pack. 10411 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 10412 10413 TypeLocBuilder TLB; 10414 TLB.reserve(From->getTypeLoc().getFullDataSize()); 10415 10416 QualType To = getDerived().TransformType(TLB, PatternTL); 10417 if (To.isNull()) 10418 return ExprError(); 10419 10420 To = getDerived().RebuildPackExpansionType(To, 10421 PatternTL.getSourceRange(), 10422 ExpansionTL.getEllipsisLoc(), 10423 NumExpansions); 10424 if (To.isNull()) 10425 return ExprError(); 10426 10427 PackExpansionTypeLoc ToExpansionTL 10428 = TLB.push<PackExpansionTypeLoc>(To); 10429 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 10430 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 10431 } 10432 10433 if (!getDerived().AlwaysRebuild() && !ArgChanged) 10434 return E; 10435 10436 return getDerived().RebuildTypeTrait(E->getTrait(), 10437 E->getLocStart(), 10438 Args, 10439 E->getLocEnd()); 10440 } 10441 10442 template<typename Derived> 10443 ExprResult 10444 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 10445 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 10446 if (!T) 10447 return ExprError(); 10448 10449 if (!getDerived().AlwaysRebuild() && 10450 T == E->getQueriedTypeSourceInfo()) 10451 return E; 10452 10453 ExprResult SubExpr; 10454 { 10455 EnterExpressionEvaluationContext Unevaluated( 10456 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10457 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 10458 if (SubExpr.isInvalid()) 10459 return ExprError(); 10460 10461 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 10462 return E; 10463 } 10464 10465 return getDerived().RebuildArrayTypeTrait(E->getTrait(), 10466 E->getLocStart(), 10467 T, 10468 SubExpr.get(), 10469 E->getLocEnd()); 10470 } 10471 10472 template<typename Derived> 10473 ExprResult 10474 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 10475 ExprResult SubExpr; 10476 { 10477 EnterExpressionEvaluationContext Unevaluated( 10478 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 10479 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 10480 if (SubExpr.isInvalid()) 10481 return ExprError(); 10482 10483 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 10484 return E; 10485 } 10486 10487 return getDerived().RebuildExpressionTrait( 10488 E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd()); 10489 } 10490 10491 template <typename Derived> 10492 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr( 10493 ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken, 10494 TypeSourceInfo **RecoveryTSI) { 10495 ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr( 10496 DRE, AddrTaken, RecoveryTSI); 10497 10498 // Propagate both errors and recovered types, which return ExprEmpty. 10499 if (!NewDRE.isUsable()) 10500 return NewDRE; 10501 10502 // We got an expr, wrap it up in parens. 10503 if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE) 10504 return PE; 10505 return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(), 10506 PE->getRParen()); 10507 } 10508 10509 template <typename Derived> 10510 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10511 DependentScopeDeclRefExpr *E) { 10512 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false, 10513 nullptr); 10514 } 10515 10516 template<typename Derived> 10517 ExprResult 10518 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 10519 DependentScopeDeclRefExpr *E, 10520 bool IsAddressOfOperand, 10521 TypeSourceInfo **RecoveryTSI) { 10522 assert(E->getQualifierLoc()); 10523 NestedNameSpecifierLoc QualifierLoc 10524 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 10525 if (!QualifierLoc) 10526 return ExprError(); 10527 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 10528 10529 // TODO: If this is a conversion-function-id, verify that the 10530 // destination type name (if present) resolves the same way after 10531 // instantiation as it did in the local scope. 10532 10533 DeclarationNameInfo NameInfo 10534 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 10535 if (!NameInfo.getName()) 10536 return ExprError(); 10537 10538 if (!E->hasExplicitTemplateArgs()) { 10539 if (!getDerived().AlwaysRebuild() && 10540 QualifierLoc == E->getQualifierLoc() && 10541 // Note: it is sufficient to compare the Name component of NameInfo: 10542 // if name has not changed, DNLoc has not changed either. 10543 NameInfo.getName() == E->getDeclName()) 10544 return E; 10545 10546 return getDerived().RebuildDependentScopeDeclRefExpr( 10547 QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr, 10548 IsAddressOfOperand, RecoveryTSI); 10549 } 10550 10551 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 10552 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 10553 E->getNumTemplateArgs(), 10554 TransArgs)) 10555 return ExprError(); 10556 10557 return getDerived().RebuildDependentScopeDeclRefExpr( 10558 QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand, 10559 RecoveryTSI); 10560 } 10561 10562 template<typename Derived> 10563 ExprResult 10564 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 10565 // CXXConstructExprs other than for list-initialization and 10566 // CXXTemporaryObjectExpr are always implicit, so when we have 10567 // a 1-argument construction we just transform that argument. 10568 if ((E->getNumArgs() == 1 || 10569 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 10570 (!getDerived().DropCallArgument(E->getArg(0))) && 10571 !E->isListInitialization()) 10572 return getDerived().TransformExpr(E->getArg(0)); 10573 10574 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 10575 10576 QualType T = getDerived().TransformType(E->getType()); 10577 if (T.isNull()) 10578 return ExprError(); 10579 10580 CXXConstructorDecl *Constructor 10581 = cast_or_null<CXXConstructorDecl>( 10582 getDerived().TransformDecl(E->getLocStart(), 10583 E->getConstructor())); 10584 if (!Constructor) 10585 return ExprError(); 10586 10587 bool ArgumentChanged = false; 10588 SmallVector<Expr*, 8> Args; 10589 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10590 &ArgumentChanged)) 10591 return ExprError(); 10592 10593 if (!getDerived().AlwaysRebuild() && 10594 T == E->getType() && 10595 Constructor == E->getConstructor() && 10596 !ArgumentChanged) { 10597 // Mark the constructor as referenced. 10598 // FIXME: Instantiation-specific 10599 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10600 return E; 10601 } 10602 10603 return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 10604 Constructor, 10605 E->isElidable(), Args, 10606 E->hadMultipleCandidates(), 10607 E->isListInitialization(), 10608 E->isStdInitListInitialization(), 10609 E->requiresZeroInitialization(), 10610 E->getConstructionKind(), 10611 E->getParenOrBraceRange()); 10612 } 10613 10614 template<typename Derived> 10615 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr( 10616 CXXInheritedCtorInitExpr *E) { 10617 QualType T = getDerived().TransformType(E->getType()); 10618 if (T.isNull()) 10619 return ExprError(); 10620 10621 CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>( 10622 getDerived().TransformDecl(E->getLocStart(), E->getConstructor())); 10623 if (!Constructor) 10624 return ExprError(); 10625 10626 if (!getDerived().AlwaysRebuild() && 10627 T == E->getType() && 10628 Constructor == E->getConstructor()) { 10629 // Mark the constructor as referenced. 10630 // FIXME: Instantiation-specific 10631 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10632 return E; 10633 } 10634 10635 return getDerived().RebuildCXXInheritedCtorInitExpr( 10636 T, E->getLocation(), Constructor, 10637 E->constructsVBase(), E->inheritedFromVBase()); 10638 } 10639 10640 /// \brief Transform a C++ temporary-binding expression. 10641 /// 10642 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 10643 /// transform the subexpression and return that. 10644 template<typename Derived> 10645 ExprResult 10646 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 10647 return getDerived().TransformExpr(E->getSubExpr()); 10648 } 10649 10650 /// \brief Transform a C++ expression that contains cleanups that should 10651 /// be run after the expression is evaluated. 10652 /// 10653 /// Since ExprWithCleanups nodes are implicitly generated, we 10654 /// just transform the subexpression and return that. 10655 template<typename Derived> 10656 ExprResult 10657 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 10658 return getDerived().TransformExpr(E->getSubExpr()); 10659 } 10660 10661 template<typename Derived> 10662 ExprResult 10663 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 10664 CXXTemporaryObjectExpr *E) { 10665 TypeSourceInfo *T = 10666 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 10667 if (!T) 10668 return ExprError(); 10669 10670 CXXConstructorDecl *Constructor 10671 = cast_or_null<CXXConstructorDecl>( 10672 getDerived().TransformDecl(E->getLocStart(), 10673 E->getConstructor())); 10674 if (!Constructor) 10675 return ExprError(); 10676 10677 bool ArgumentChanged = false; 10678 SmallVector<Expr*, 8> Args; 10679 Args.reserve(E->getNumArgs()); 10680 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 10681 &ArgumentChanged)) 10682 return ExprError(); 10683 10684 if (!getDerived().AlwaysRebuild() && 10685 T == E->getTypeSourceInfo() && 10686 Constructor == E->getConstructor() && 10687 !ArgumentChanged) { 10688 // FIXME: Instantiation-specific 10689 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 10690 return SemaRef.MaybeBindToTemporary(E); 10691 } 10692 10693 // FIXME: Pass in E->isListInitialization(). 10694 return getDerived().RebuildCXXTemporaryObjectExpr(T, 10695 /*FIXME:*/T->getTypeLoc().getEndLoc(), 10696 Args, 10697 E->getLocEnd()); 10698 } 10699 10700 template<typename Derived> 10701 ExprResult 10702 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 10703 // Transform any init-capture expressions before entering the scope of the 10704 // lambda body, because they are not semantically within that scope. 10705 typedef std::pair<ExprResult, QualType> InitCaptureInfoTy; 10706 SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes; 10707 InitCaptureExprsAndTypes.resize(E->explicit_capture_end() - 10708 E->explicit_capture_begin()); 10709 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10710 CEnd = E->capture_end(); 10711 C != CEnd; ++C) { 10712 if (!E->isInitCapture(C)) 10713 continue; 10714 EnterExpressionEvaluationContext EEEC( 10715 getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 10716 ExprResult NewExprInitResult = getDerived().TransformInitializer( 10717 C->getCapturedVar()->getInit(), 10718 C->getCapturedVar()->getInitStyle() == VarDecl::CallInit); 10719 10720 if (NewExprInitResult.isInvalid()) 10721 return ExprError(); 10722 Expr *NewExprInit = NewExprInitResult.get(); 10723 10724 VarDecl *OldVD = C->getCapturedVar(); 10725 QualType NewInitCaptureType = 10726 getSema().buildLambdaInitCaptureInitialization( 10727 C->getLocation(), OldVD->getType()->isReferenceType(), 10728 OldVD->getIdentifier(), 10729 C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit); 10730 NewExprInitResult = NewExprInit; 10731 InitCaptureExprsAndTypes[C - E->capture_begin()] = 10732 std::make_pair(NewExprInitResult, NewInitCaptureType); 10733 } 10734 10735 // Transform the template parameters, and add them to the current 10736 // instantiation scope. The null case is handled correctly. 10737 auto TPL = getDerived().TransformTemplateParameterList( 10738 E->getTemplateParameterList()); 10739 10740 // Transform the type of the original lambda's call operator. 10741 // The transformation MUST be done in the CurrentInstantiationScope since 10742 // it introduces a mapping of the original to the newly created 10743 // transformed parameters. 10744 TypeSourceInfo *NewCallOpTSI = nullptr; 10745 { 10746 TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo(); 10747 FunctionProtoTypeLoc OldCallOpFPTL = 10748 OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>(); 10749 10750 TypeLocBuilder NewCallOpTLBuilder; 10751 SmallVector<QualType, 4> ExceptionStorage; 10752 TreeTransform *This = this; // Work around gcc.gnu.org/PR56135. 10753 QualType NewCallOpType = TransformFunctionProtoType( 10754 NewCallOpTLBuilder, OldCallOpFPTL, nullptr, 0, 10755 [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) { 10756 return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI, 10757 ExceptionStorage, Changed); 10758 }); 10759 if (NewCallOpType.isNull()) 10760 return ExprError(); 10761 NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context, 10762 NewCallOpType); 10763 } 10764 10765 LambdaScopeInfo *LSI = getSema().PushLambdaScope(); 10766 Sema::FunctionScopeRAII FuncScopeCleanup(getSema()); 10767 LSI->GLTemplateParameterList = TPL; 10768 10769 // Create the local class that will describe the lambda. 10770 CXXRecordDecl *Class 10771 = getSema().createLambdaClosureType(E->getIntroducerRange(), 10772 NewCallOpTSI, 10773 /*KnownDependent=*/false, 10774 E->getCaptureDefault()); 10775 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 10776 10777 // Build the call operator. 10778 CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition( 10779 Class, E->getIntroducerRange(), NewCallOpTSI, 10780 E->getCallOperator()->getLocEnd(), 10781 NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(), 10782 E->getCallOperator()->isConstexpr()); 10783 10784 LSI->CallOperator = NewCallOperator; 10785 10786 for (unsigned I = 0, NumParams = NewCallOperator->getNumParams(); 10787 I != NumParams; ++I) { 10788 auto *P = NewCallOperator->getParamDecl(I); 10789 if (P->hasUninstantiatedDefaultArg()) { 10790 EnterExpressionEvaluationContext Eval( 10791 getSema(), 10792 Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P); 10793 ExprResult R = getDerived().TransformExpr( 10794 E->getCallOperator()->getParamDecl(I)->getDefaultArg()); 10795 P->setDefaultArg(R.get()); 10796 } 10797 } 10798 10799 getDerived().transformAttrs(E->getCallOperator(), NewCallOperator); 10800 getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator); 10801 10802 // Introduce the context of the call operator. 10803 Sema::ContextRAII SavedContext(getSema(), NewCallOperator, 10804 /*NewThisContext*/false); 10805 10806 // Enter the scope of the lambda. 10807 getSema().buildLambdaScope(LSI, NewCallOperator, 10808 E->getIntroducerRange(), 10809 E->getCaptureDefault(), 10810 E->getCaptureDefaultLoc(), 10811 E->hasExplicitParameters(), 10812 E->hasExplicitResultType(), 10813 E->isMutable()); 10814 10815 bool Invalid = false; 10816 10817 // Transform captures. 10818 bool FinishedExplicitCaptures = false; 10819 for (LambdaExpr::capture_iterator C = E->capture_begin(), 10820 CEnd = E->capture_end(); 10821 C != CEnd; ++C) { 10822 // When we hit the first implicit capture, tell Sema that we've finished 10823 // the list of explicit captures. 10824 if (!FinishedExplicitCaptures && C->isImplicit()) { 10825 getSema().finishLambdaExplicitCaptures(LSI); 10826 FinishedExplicitCaptures = true; 10827 } 10828 10829 // Capturing 'this' is trivial. 10830 if (C->capturesThis()) { 10831 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(), 10832 /*BuildAndDiagnose*/ true, nullptr, 10833 C->getCaptureKind() == LCK_StarThis); 10834 continue; 10835 } 10836 // Captured expression will be recaptured during captured variables 10837 // rebuilding. 10838 if (C->capturesVLAType()) 10839 continue; 10840 10841 // Rebuild init-captures, including the implied field declaration. 10842 if (E->isInitCapture(C)) { 10843 InitCaptureInfoTy InitExprTypePair = 10844 InitCaptureExprsAndTypes[C - E->capture_begin()]; 10845 ExprResult Init = InitExprTypePair.first; 10846 QualType InitQualType = InitExprTypePair.second; 10847 if (Init.isInvalid() || InitQualType.isNull()) { 10848 Invalid = true; 10849 continue; 10850 } 10851 VarDecl *OldVD = C->getCapturedVar(); 10852 VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl( 10853 OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(), 10854 OldVD->getInitStyle(), Init.get()); 10855 if (!NewVD) 10856 Invalid = true; 10857 else { 10858 getDerived().transformedLocalDecl(OldVD, NewVD); 10859 } 10860 getSema().buildInitCaptureField(LSI, NewVD); 10861 continue; 10862 } 10863 10864 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 10865 10866 // Determine the capture kind for Sema. 10867 Sema::TryCaptureKind Kind 10868 = C->isImplicit()? Sema::TryCapture_Implicit 10869 : C->getCaptureKind() == LCK_ByCopy 10870 ? Sema::TryCapture_ExplicitByVal 10871 : Sema::TryCapture_ExplicitByRef; 10872 SourceLocation EllipsisLoc; 10873 if (C->isPackExpansion()) { 10874 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 10875 bool ShouldExpand = false; 10876 bool RetainExpansion = false; 10877 Optional<unsigned> NumExpansions; 10878 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 10879 C->getLocation(), 10880 Unexpanded, 10881 ShouldExpand, RetainExpansion, 10882 NumExpansions)) { 10883 Invalid = true; 10884 continue; 10885 } 10886 10887 if (ShouldExpand) { 10888 // The transform has determined that we should perform an expansion; 10889 // transform and capture each of the arguments. 10890 // expansion of the pattern. Do so. 10891 VarDecl *Pack = C->getCapturedVar(); 10892 for (unsigned I = 0; I != *NumExpansions; ++I) { 10893 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 10894 VarDecl *CapturedVar 10895 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 10896 Pack)); 10897 if (!CapturedVar) { 10898 Invalid = true; 10899 continue; 10900 } 10901 10902 // Capture the transformed variable. 10903 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 10904 } 10905 10906 // FIXME: Retain a pack expansion if RetainExpansion is true. 10907 10908 continue; 10909 } 10910 10911 EllipsisLoc = C->getEllipsisLoc(); 10912 } 10913 10914 // Transform the captured variable. 10915 VarDecl *CapturedVar 10916 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 10917 C->getCapturedVar())); 10918 if (!CapturedVar || CapturedVar->isInvalidDecl()) { 10919 Invalid = true; 10920 continue; 10921 } 10922 10923 // Capture the transformed variable. 10924 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind, 10925 EllipsisLoc); 10926 } 10927 if (!FinishedExplicitCaptures) 10928 getSema().finishLambdaExplicitCaptures(LSI); 10929 10930 // Enter a new evaluation context to insulate the lambda from any 10931 // cleanups from the enclosing full-expression. 10932 getSema().PushExpressionEvaluationContext( 10933 Sema::ExpressionEvaluationContext::PotentiallyEvaluated); 10934 10935 // Instantiate the body of the lambda expression. 10936 StmtResult Body = 10937 Invalid ? StmtError() : getDerived().TransformStmt(E->getBody()); 10938 10939 // ActOnLambda* will pop the function scope for us. 10940 FuncScopeCleanup.disable(); 10941 10942 if (Body.isInvalid()) { 10943 SavedContext.pop(); 10944 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/nullptr, 10945 /*IsInstantiation=*/true); 10946 return ExprError(); 10947 } 10948 10949 // Copy the LSI before ActOnFinishFunctionBody removes it. 10950 // FIXME: This is dumb. Store the lambda information somewhere that outlives 10951 // the call operator. 10952 auto LSICopy = *LSI; 10953 getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(), 10954 /*IsInstantiation*/ true); 10955 SavedContext.pop(); 10956 10957 return getSema().BuildLambdaExpr(E->getLocStart(), Body.get()->getLocEnd(), 10958 &LSICopy); 10959 } 10960 10961 template<typename Derived> 10962 ExprResult 10963 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 10964 CXXUnresolvedConstructExpr *E) { 10965 TypeSourceInfo *T = 10966 getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo()); 10967 if (!T) 10968 return ExprError(); 10969 10970 bool ArgumentChanged = false; 10971 SmallVector<Expr*, 8> Args; 10972 Args.reserve(E->arg_size()); 10973 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 10974 &ArgumentChanged)) 10975 return ExprError(); 10976 10977 if (!getDerived().AlwaysRebuild() && 10978 T == E->getTypeSourceInfo() && 10979 !ArgumentChanged) 10980 return E; 10981 10982 // FIXME: we're faking the locations of the commas 10983 return getDerived().RebuildCXXUnresolvedConstructExpr(T, 10984 E->getLParenLoc(), 10985 Args, 10986 E->getRParenLoc()); 10987 } 10988 10989 template<typename Derived> 10990 ExprResult 10991 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 10992 CXXDependentScopeMemberExpr *E) { 10993 // Transform the base of the expression. 10994 ExprResult Base((Expr*) nullptr); 10995 Expr *OldBase; 10996 QualType BaseType; 10997 QualType ObjectType; 10998 if (!E->isImplicitAccess()) { 10999 OldBase = E->getBase(); 11000 Base = getDerived().TransformExpr(OldBase); 11001 if (Base.isInvalid()) 11002 return ExprError(); 11003 11004 // Start the member reference and compute the object's type. 11005 ParsedType ObjectTy; 11006 bool MayBePseudoDestructor = false; 11007 Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(), 11008 E->getOperatorLoc(), 11009 E->isArrow()? tok::arrow : tok::period, 11010 ObjectTy, 11011 MayBePseudoDestructor); 11012 if (Base.isInvalid()) 11013 return ExprError(); 11014 11015 ObjectType = ObjectTy.get(); 11016 BaseType = ((Expr*) Base.get())->getType(); 11017 } else { 11018 OldBase = nullptr; 11019 BaseType = getDerived().TransformType(E->getBaseType()); 11020 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 11021 } 11022 11023 // Transform the first part of the nested-name-specifier that qualifies 11024 // the member name. 11025 NamedDecl *FirstQualifierInScope 11026 = getDerived().TransformFirstQualifierInScope( 11027 E->getFirstQualifierFoundInScope(), 11028 E->getQualifierLoc().getBeginLoc()); 11029 11030 NestedNameSpecifierLoc QualifierLoc; 11031 if (E->getQualifier()) { 11032 QualifierLoc 11033 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 11034 ObjectType, 11035 FirstQualifierInScope); 11036 if (!QualifierLoc) 11037 return ExprError(); 11038 } 11039 11040 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 11041 11042 // TODO: If this is a conversion-function-id, verify that the 11043 // destination type name (if present) resolves the same way after 11044 // instantiation as it did in the local scope. 11045 11046 DeclarationNameInfo NameInfo 11047 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 11048 if (!NameInfo.getName()) 11049 return ExprError(); 11050 11051 if (!E->hasExplicitTemplateArgs()) { 11052 // This is a reference to a member without an explicitly-specified 11053 // template argument list. Optimize for this common case. 11054 if (!getDerived().AlwaysRebuild() && 11055 Base.get() == OldBase && 11056 BaseType == E->getBaseType() && 11057 QualifierLoc == E->getQualifierLoc() && 11058 NameInfo.getName() == E->getMember() && 11059 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 11060 return E; 11061 11062 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11063 BaseType, 11064 E->isArrow(), 11065 E->getOperatorLoc(), 11066 QualifierLoc, 11067 TemplateKWLoc, 11068 FirstQualifierInScope, 11069 NameInfo, 11070 /*TemplateArgs*/nullptr); 11071 } 11072 11073 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 11074 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 11075 E->getNumTemplateArgs(), 11076 TransArgs)) 11077 return ExprError(); 11078 11079 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 11080 BaseType, 11081 E->isArrow(), 11082 E->getOperatorLoc(), 11083 QualifierLoc, 11084 TemplateKWLoc, 11085 FirstQualifierInScope, 11086 NameInfo, 11087 &TransArgs); 11088 } 11089 11090 template<typename Derived> 11091 ExprResult 11092 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 11093 // Transform the base of the expression. 11094 ExprResult Base((Expr*) nullptr); 11095 QualType BaseType; 11096 if (!Old->isImplicitAccess()) { 11097 Base = getDerived().TransformExpr(Old->getBase()); 11098 if (Base.isInvalid()) 11099 return ExprError(); 11100 Base = getSema().PerformMemberExprBaseConversion(Base.get(), 11101 Old->isArrow()); 11102 if (Base.isInvalid()) 11103 return ExprError(); 11104 BaseType = Base.get()->getType(); 11105 } else { 11106 BaseType = getDerived().TransformType(Old->getBaseType()); 11107 } 11108 11109 NestedNameSpecifierLoc QualifierLoc; 11110 if (Old->getQualifierLoc()) { 11111 QualifierLoc 11112 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 11113 if (!QualifierLoc) 11114 return ExprError(); 11115 } 11116 11117 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 11118 11119 LookupResult R(SemaRef, Old->getMemberNameInfo(), 11120 Sema::LookupOrdinaryName); 11121 11122 // Transform the declaration set. 11123 if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R)) 11124 return ExprError(); 11125 11126 // Determine the naming class. 11127 if (Old->getNamingClass()) { 11128 CXXRecordDecl *NamingClass 11129 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 11130 Old->getMemberLoc(), 11131 Old->getNamingClass())); 11132 if (!NamingClass) 11133 return ExprError(); 11134 11135 R.setNamingClass(NamingClass); 11136 } 11137 11138 TemplateArgumentListInfo TransArgs; 11139 if (Old->hasExplicitTemplateArgs()) { 11140 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 11141 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 11142 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 11143 Old->getNumTemplateArgs(), 11144 TransArgs)) 11145 return ExprError(); 11146 } 11147 11148 // FIXME: to do this check properly, we will need to preserve the 11149 // first-qualifier-in-scope here, just in case we had a dependent 11150 // base (and therefore couldn't do the check) and a 11151 // nested-name-qualifier (and therefore could do the lookup). 11152 NamedDecl *FirstQualifierInScope = nullptr; 11153 11154 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 11155 BaseType, 11156 Old->getOperatorLoc(), 11157 Old->isArrow(), 11158 QualifierLoc, 11159 TemplateKWLoc, 11160 FirstQualifierInScope, 11161 R, 11162 (Old->hasExplicitTemplateArgs() 11163 ? &TransArgs : nullptr)); 11164 } 11165 11166 template<typename Derived> 11167 ExprResult 11168 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 11169 EnterExpressionEvaluationContext Unevaluated( 11170 SemaRef, Sema::ExpressionEvaluationContext::Unevaluated); 11171 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 11172 if (SubExpr.isInvalid()) 11173 return ExprError(); 11174 11175 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 11176 return E; 11177 11178 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 11179 } 11180 11181 template<typename Derived> 11182 ExprResult 11183 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 11184 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 11185 if (Pattern.isInvalid()) 11186 return ExprError(); 11187 11188 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 11189 return E; 11190 11191 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 11192 E->getNumExpansions()); 11193 } 11194 11195 template<typename Derived> 11196 ExprResult 11197 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 11198 // If E is not value-dependent, then nothing will change when we transform it. 11199 // Note: This is an instantiation-centric view. 11200 if (!E->isValueDependent()) 11201 return E; 11202 11203 EnterExpressionEvaluationContext Unevaluated( 11204 getSema(), Sema::ExpressionEvaluationContext::Unevaluated); 11205 11206 ArrayRef<TemplateArgument> PackArgs; 11207 TemplateArgument ArgStorage; 11208 11209 // Find the argument list to transform. 11210 if (E->isPartiallySubstituted()) { 11211 PackArgs = E->getPartialArguments(); 11212 } else if (E->isValueDependent()) { 11213 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 11214 bool ShouldExpand = false; 11215 bool RetainExpansion = false; 11216 Optional<unsigned> NumExpansions; 11217 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 11218 Unexpanded, 11219 ShouldExpand, RetainExpansion, 11220 NumExpansions)) 11221 return ExprError(); 11222 11223 // If we need to expand the pack, build a template argument from it and 11224 // expand that. 11225 if (ShouldExpand) { 11226 auto *Pack = E->getPack(); 11227 if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) { 11228 ArgStorage = getSema().Context.getPackExpansionType( 11229 getSema().Context.getTypeDeclType(TTPD), None); 11230 } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) { 11231 ArgStorage = TemplateArgument(TemplateName(TTPD), None); 11232 } else { 11233 auto *VD = cast<ValueDecl>(Pack); 11234 ExprResult DRE = getSema().BuildDeclRefExpr(VD, VD->getType(), 11235 VK_RValue, E->getPackLoc()); 11236 if (DRE.isInvalid()) 11237 return ExprError(); 11238 ArgStorage = new (getSema().Context) PackExpansionExpr( 11239 getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None); 11240 } 11241 PackArgs = ArgStorage; 11242 } 11243 } 11244 11245 // If we're not expanding the pack, just transform the decl. 11246 if (!PackArgs.size()) { 11247 auto *Pack = cast_or_null<NamedDecl>( 11248 getDerived().TransformDecl(E->getPackLoc(), E->getPack())); 11249 if (!Pack) 11250 return ExprError(); 11251 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 11252 E->getPackLoc(), 11253 E->getRParenLoc(), None, None); 11254 } 11255 11256 // Try to compute the result without performing a partial substitution. 11257 Optional<unsigned> Result = 0; 11258 for (const TemplateArgument &Arg : PackArgs) { 11259 if (!Arg.isPackExpansion()) { 11260 Result = *Result + 1; 11261 continue; 11262 } 11263 11264 TemplateArgumentLoc ArgLoc; 11265 InventTemplateArgumentLoc(Arg, ArgLoc); 11266 11267 // Find the pattern of the pack expansion. 11268 SourceLocation Ellipsis; 11269 Optional<unsigned> OrigNumExpansions; 11270 TemplateArgumentLoc Pattern = 11271 getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis, 11272 OrigNumExpansions); 11273 11274 // Substitute under the pack expansion. Do not expand the pack (yet). 11275 TemplateArgumentLoc OutPattern; 11276 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11277 if (getDerived().TransformTemplateArgument(Pattern, OutPattern, 11278 /*Uneval*/ true)) 11279 return true; 11280 11281 // See if we can determine the number of arguments from the result. 11282 Optional<unsigned> NumExpansions = 11283 getSema().getFullyPackExpandedSize(OutPattern.getArgument()); 11284 if (!NumExpansions) { 11285 // No: we must be in an alias template expansion, and we're going to need 11286 // to actually expand the packs. 11287 Result = None; 11288 break; 11289 } 11290 11291 Result = *Result + *NumExpansions; 11292 } 11293 11294 // Common case: we could determine the number of expansions without 11295 // substituting. 11296 if (Result) 11297 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11298 E->getPackLoc(), 11299 E->getRParenLoc(), *Result, None); 11300 11301 TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(), 11302 E->getPackLoc()); 11303 { 11304 TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity()); 11305 typedef TemplateArgumentLocInventIterator< 11306 Derived, const TemplateArgument*> PackLocIterator; 11307 if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()), 11308 PackLocIterator(*this, PackArgs.end()), 11309 TransformedPackArgs, /*Uneval*/true)) 11310 return ExprError(); 11311 } 11312 11313 // Check whether we managed to fully-expand the pack. 11314 // FIXME: Is it possible for us to do so and not hit the early exit path? 11315 SmallVector<TemplateArgument, 8> Args; 11316 bool PartialSubstitution = false; 11317 for (auto &Loc : TransformedPackArgs.arguments()) { 11318 Args.push_back(Loc.getArgument()); 11319 if (Loc.getArgument().isPackExpansion()) 11320 PartialSubstitution = true; 11321 } 11322 11323 if (PartialSubstitution) 11324 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11325 E->getPackLoc(), 11326 E->getRParenLoc(), None, Args); 11327 11328 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(), 11329 E->getPackLoc(), E->getRParenLoc(), 11330 Args.size(), None); 11331 } 11332 11333 template<typename Derived> 11334 ExprResult 11335 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 11336 SubstNonTypeTemplateParmPackExpr *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>::TransformSubstNonTypeTemplateParmExpr( 11344 SubstNonTypeTemplateParmExpr *E) { 11345 // Default behavior is to do nothing with this transformation. 11346 return E; 11347 } 11348 11349 template<typename Derived> 11350 ExprResult 11351 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 11352 // Default behavior is to do nothing with this transformation. 11353 return E; 11354 } 11355 11356 template<typename Derived> 11357 ExprResult 11358 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 11359 MaterializeTemporaryExpr *E) { 11360 return getDerived().TransformExpr(E->GetTemporaryExpr()); 11361 } 11362 11363 template<typename Derived> 11364 ExprResult 11365 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) { 11366 Expr *Pattern = E->getPattern(); 11367 11368 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11369 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 11370 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11371 11372 // Determine whether the set of unexpanded parameter packs can and should 11373 // be expanded. 11374 bool Expand = true; 11375 bool RetainExpansion = false; 11376 Optional<unsigned> NumExpansions; 11377 if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(), 11378 Pattern->getSourceRange(), 11379 Unexpanded, 11380 Expand, RetainExpansion, 11381 NumExpansions)) 11382 return true; 11383 11384 if (!Expand) { 11385 // Do not expand any packs here, just transform and rebuild a fold 11386 // expression. 11387 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11388 11389 ExprResult LHS = 11390 E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult(); 11391 if (LHS.isInvalid()) 11392 return true; 11393 11394 ExprResult RHS = 11395 E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult(); 11396 if (RHS.isInvalid()) 11397 return true; 11398 11399 if (!getDerived().AlwaysRebuild() && 11400 LHS.get() == E->getLHS() && RHS.get() == E->getRHS()) 11401 return E; 11402 11403 return getDerived().RebuildCXXFoldExpr( 11404 E->getLocStart(), LHS.get(), E->getOperator(), E->getEllipsisLoc(), 11405 RHS.get(), E->getLocEnd()); 11406 } 11407 11408 // The transform has determined that we should perform an elementwise 11409 // expansion of the pattern. Do so. 11410 ExprResult Result = getDerived().TransformExpr(E->getInit()); 11411 if (Result.isInvalid()) 11412 return true; 11413 bool LeftFold = E->isLeftFold(); 11414 11415 // If we're retaining an expansion for a right fold, it is the innermost 11416 // component and takes the init (if any). 11417 if (!LeftFold && RetainExpansion) { 11418 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11419 11420 ExprResult Out = getDerived().TransformExpr(Pattern); 11421 if (Out.isInvalid()) 11422 return true; 11423 11424 Result = getDerived().RebuildCXXFoldExpr( 11425 E->getLocStart(), Out.get(), E->getOperator(), E->getEllipsisLoc(), 11426 Result.get(), E->getLocEnd()); 11427 if (Result.isInvalid()) 11428 return true; 11429 } 11430 11431 for (unsigned I = 0; I != *NumExpansions; ++I) { 11432 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex( 11433 getSema(), LeftFold ? I : *NumExpansions - I - 1); 11434 ExprResult Out = getDerived().TransformExpr(Pattern); 11435 if (Out.isInvalid()) 11436 return true; 11437 11438 if (Out.get()->containsUnexpandedParameterPack()) { 11439 // We still have a pack; retain a pack expansion for this slice. 11440 Result = getDerived().RebuildCXXFoldExpr( 11441 E->getLocStart(), 11442 LeftFold ? Result.get() : Out.get(), 11443 E->getOperator(), E->getEllipsisLoc(), 11444 LeftFold ? Out.get() : Result.get(), 11445 E->getLocEnd()); 11446 } else if (Result.isUsable()) { 11447 // We've got down to a single element; build a binary operator. 11448 Result = getDerived().RebuildBinaryOperator( 11449 E->getEllipsisLoc(), E->getOperator(), 11450 LeftFold ? Result.get() : Out.get(), 11451 LeftFold ? Out.get() : Result.get()); 11452 } else 11453 Result = Out; 11454 11455 if (Result.isInvalid()) 11456 return true; 11457 } 11458 11459 // If we're retaining an expansion for a left fold, it is the outermost 11460 // component and takes the complete expansion so far as its init (if any). 11461 if (LeftFold && RetainExpansion) { 11462 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 11463 11464 ExprResult Out = getDerived().TransformExpr(Pattern); 11465 if (Out.isInvalid()) 11466 return true; 11467 11468 Result = getDerived().RebuildCXXFoldExpr( 11469 E->getLocStart(), Result.get(), 11470 E->getOperator(), E->getEllipsisLoc(), 11471 Out.get(), E->getLocEnd()); 11472 if (Result.isInvalid()) 11473 return true; 11474 } 11475 11476 // If we had no init and an empty pack, and we're not retaining an expansion, 11477 // then produce a fallback value or error. 11478 if (Result.isUnset()) 11479 return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(), 11480 E->getOperator()); 11481 11482 return Result; 11483 } 11484 11485 template<typename Derived> 11486 ExprResult 11487 TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 11488 CXXStdInitializerListExpr *E) { 11489 return getDerived().TransformExpr(E->getSubExpr()); 11490 } 11491 11492 template<typename Derived> 11493 ExprResult 11494 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 11495 return SemaRef.MaybeBindToTemporary(E); 11496 } 11497 11498 template<typename Derived> 11499 ExprResult 11500 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 11501 return E; 11502 } 11503 11504 template<typename Derived> 11505 ExprResult 11506 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 11507 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 11508 if (SubExpr.isInvalid()) 11509 return ExprError(); 11510 11511 if (!getDerived().AlwaysRebuild() && 11512 SubExpr.get() == E->getSubExpr()) 11513 return E; 11514 11515 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 11516 } 11517 11518 template<typename Derived> 11519 ExprResult 11520 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 11521 // Transform each of the elements. 11522 SmallVector<Expr *, 8> Elements; 11523 bool ArgChanged = false; 11524 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 11525 /*IsCall=*/false, Elements, &ArgChanged)) 11526 return ExprError(); 11527 11528 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11529 return SemaRef.MaybeBindToTemporary(E); 11530 11531 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 11532 Elements.data(), 11533 Elements.size()); 11534 } 11535 11536 template<typename Derived> 11537 ExprResult 11538 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 11539 ObjCDictionaryLiteral *E) { 11540 // Transform each of the elements. 11541 SmallVector<ObjCDictionaryElement, 8> Elements; 11542 bool ArgChanged = false; 11543 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 11544 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 11545 11546 if (OrigElement.isPackExpansion()) { 11547 // This key/value element is a pack expansion. 11548 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 11549 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 11550 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 11551 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 11552 11553 // Determine whether the set of unexpanded parameter packs can 11554 // and should be expanded. 11555 bool Expand = true; 11556 bool RetainExpansion = false; 11557 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 11558 Optional<unsigned> NumExpansions = OrigNumExpansions; 11559 SourceRange PatternRange(OrigElement.Key->getLocStart(), 11560 OrigElement.Value->getLocEnd()); 11561 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 11562 PatternRange, 11563 Unexpanded, 11564 Expand, RetainExpansion, 11565 NumExpansions)) 11566 return ExprError(); 11567 11568 if (!Expand) { 11569 // The transform has determined that we should perform a simple 11570 // transformation on the pack expansion, producing another pack 11571 // expansion. 11572 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 11573 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11574 if (Key.isInvalid()) 11575 return ExprError(); 11576 11577 if (Key.get() != OrigElement.Key) 11578 ArgChanged = true; 11579 11580 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11581 if (Value.isInvalid()) 11582 return ExprError(); 11583 11584 if (Value.get() != OrigElement.Value) 11585 ArgChanged = true; 11586 11587 ObjCDictionaryElement Expansion = { 11588 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 11589 }; 11590 Elements.push_back(Expansion); 11591 continue; 11592 } 11593 11594 // Record right away that the argument was changed. This needs 11595 // to happen even if the array expands to nothing. 11596 ArgChanged = true; 11597 11598 // The transform has determined that we should perform an elementwise 11599 // expansion of the pattern. Do so. 11600 for (unsigned I = 0; I != *NumExpansions; ++I) { 11601 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 11602 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11603 if (Key.isInvalid()) 11604 return ExprError(); 11605 11606 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 11607 if (Value.isInvalid()) 11608 return ExprError(); 11609 11610 ObjCDictionaryElement Element = { 11611 Key.get(), Value.get(), SourceLocation(), NumExpansions 11612 }; 11613 11614 // If any unexpanded parameter packs remain, we still have a 11615 // pack expansion. 11616 // FIXME: Can this really happen? 11617 if (Key.get()->containsUnexpandedParameterPack() || 11618 Value.get()->containsUnexpandedParameterPack()) 11619 Element.EllipsisLoc = OrigElement.EllipsisLoc; 11620 11621 Elements.push_back(Element); 11622 } 11623 11624 // FIXME: Retain a pack expansion if RetainExpansion is true. 11625 11626 // We've finished with this pack expansion. 11627 continue; 11628 } 11629 11630 // Transform and check key. 11631 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 11632 if (Key.isInvalid()) 11633 return ExprError(); 11634 11635 if (Key.get() != OrigElement.Key) 11636 ArgChanged = true; 11637 11638 // Transform and check value. 11639 ExprResult Value 11640 = getDerived().TransformExpr(OrigElement.Value); 11641 if (Value.isInvalid()) 11642 return ExprError(); 11643 11644 if (Value.get() != OrigElement.Value) 11645 ArgChanged = true; 11646 11647 ObjCDictionaryElement Element = { 11648 Key.get(), Value.get(), SourceLocation(), None 11649 }; 11650 Elements.push_back(Element); 11651 } 11652 11653 if (!getDerived().AlwaysRebuild() && !ArgChanged) 11654 return SemaRef.MaybeBindToTemporary(E); 11655 11656 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 11657 Elements); 11658 } 11659 11660 template<typename Derived> 11661 ExprResult 11662 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 11663 TypeSourceInfo *EncodedTypeInfo 11664 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 11665 if (!EncodedTypeInfo) 11666 return ExprError(); 11667 11668 if (!getDerived().AlwaysRebuild() && 11669 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 11670 return E; 11671 11672 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 11673 EncodedTypeInfo, 11674 E->getRParenLoc()); 11675 } 11676 11677 template<typename Derived> 11678 ExprResult TreeTransform<Derived>:: 11679 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 11680 // This is a kind of implicit conversion, and it needs to get dropped 11681 // and recomputed for the same general reasons that ImplicitCastExprs 11682 // do, as well a more specific one: this expression is only valid when 11683 // it appears *immediately* as an argument expression. 11684 return getDerived().TransformExpr(E->getSubExpr()); 11685 } 11686 11687 template<typename Derived> 11688 ExprResult TreeTransform<Derived>:: 11689 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 11690 TypeSourceInfo *TSInfo 11691 = getDerived().TransformType(E->getTypeInfoAsWritten()); 11692 if (!TSInfo) 11693 return ExprError(); 11694 11695 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 11696 if (Result.isInvalid()) 11697 return ExprError(); 11698 11699 if (!getDerived().AlwaysRebuild() && 11700 TSInfo == E->getTypeInfoAsWritten() && 11701 Result.get() == E->getSubExpr()) 11702 return E; 11703 11704 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 11705 E->getBridgeKeywordLoc(), TSInfo, 11706 Result.get()); 11707 } 11708 11709 template <typename Derived> 11710 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr( 11711 ObjCAvailabilityCheckExpr *E) { 11712 return E; 11713 } 11714 11715 template<typename Derived> 11716 ExprResult 11717 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 11718 // Transform arguments. 11719 bool ArgChanged = false; 11720 SmallVector<Expr*, 8> Args; 11721 Args.reserve(E->getNumArgs()); 11722 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 11723 &ArgChanged)) 11724 return ExprError(); 11725 11726 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 11727 // Class message: transform the receiver type. 11728 TypeSourceInfo *ReceiverTypeInfo 11729 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 11730 if (!ReceiverTypeInfo) 11731 return ExprError(); 11732 11733 // If nothing changed, just retain the existing message send. 11734 if (!getDerived().AlwaysRebuild() && 11735 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 11736 return SemaRef.MaybeBindToTemporary(E); 11737 11738 // Build a new class message send. 11739 SmallVector<SourceLocation, 16> SelLocs; 11740 E->getSelectorLocs(SelLocs); 11741 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 11742 E->getSelector(), 11743 SelLocs, 11744 E->getMethodDecl(), 11745 E->getLeftLoc(), 11746 Args, 11747 E->getRightLoc()); 11748 } 11749 else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass || 11750 E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { 11751 if (!E->getMethodDecl()) 11752 return ExprError(); 11753 11754 // Build a new class message send to 'super'. 11755 SmallVector<SourceLocation, 16> SelLocs; 11756 E->getSelectorLocs(SelLocs); 11757 return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(), 11758 E->getSelector(), 11759 SelLocs, 11760 E->getReceiverType(), 11761 E->getMethodDecl(), 11762 E->getLeftLoc(), 11763 Args, 11764 E->getRightLoc()); 11765 } 11766 11767 // Instance message: transform the receiver 11768 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 11769 "Only class and instance messages may be instantiated"); 11770 ExprResult Receiver 11771 = getDerived().TransformExpr(E->getInstanceReceiver()); 11772 if (Receiver.isInvalid()) 11773 return ExprError(); 11774 11775 // If nothing changed, just retain the existing message send. 11776 if (!getDerived().AlwaysRebuild() && 11777 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 11778 return SemaRef.MaybeBindToTemporary(E); 11779 11780 // Build a new instance message send. 11781 SmallVector<SourceLocation, 16> SelLocs; 11782 E->getSelectorLocs(SelLocs); 11783 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 11784 E->getSelector(), 11785 SelLocs, 11786 E->getMethodDecl(), 11787 E->getLeftLoc(), 11788 Args, 11789 E->getRightLoc()); 11790 } 11791 11792 template<typename Derived> 11793 ExprResult 11794 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 11795 return E; 11796 } 11797 11798 template<typename Derived> 11799 ExprResult 11800 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 11801 return E; 11802 } 11803 11804 template<typename Derived> 11805 ExprResult 11806 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 11807 // Transform the base expression. 11808 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11809 if (Base.isInvalid()) 11810 return ExprError(); 11811 11812 // We don't need to transform the ivar; it will never change. 11813 11814 // If nothing changed, just retain the existing expression. 11815 if (!getDerived().AlwaysRebuild() && 11816 Base.get() == E->getBase()) 11817 return E; 11818 11819 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 11820 E->getLocation(), 11821 E->isArrow(), E->isFreeIvar()); 11822 } 11823 11824 template<typename Derived> 11825 ExprResult 11826 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 11827 // 'super' and types never change. Property never changes. Just 11828 // retain the existing expression. 11829 if (!E->isObjectReceiver()) 11830 return E; 11831 11832 // Transform the base expression. 11833 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11834 if (Base.isInvalid()) 11835 return ExprError(); 11836 11837 // We don't need to transform the property; it will never change. 11838 11839 // If nothing changed, just retain the existing expression. 11840 if (!getDerived().AlwaysRebuild() && 11841 Base.get() == E->getBase()) 11842 return E; 11843 11844 if (E->isExplicitProperty()) 11845 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 11846 E->getExplicitProperty(), 11847 E->getLocation()); 11848 11849 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 11850 SemaRef.Context.PseudoObjectTy, 11851 E->getImplicitPropertyGetter(), 11852 E->getImplicitPropertySetter(), 11853 E->getLocation()); 11854 } 11855 11856 template<typename Derived> 11857 ExprResult 11858 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 11859 // Transform the base expression. 11860 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 11861 if (Base.isInvalid()) 11862 return ExprError(); 11863 11864 // Transform the key expression. 11865 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 11866 if (Key.isInvalid()) 11867 return ExprError(); 11868 11869 // If nothing changed, just retain the existing expression. 11870 if (!getDerived().AlwaysRebuild() && 11871 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 11872 return E; 11873 11874 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 11875 Base.get(), Key.get(), 11876 E->getAtIndexMethodDecl(), 11877 E->setAtIndexMethodDecl()); 11878 } 11879 11880 template<typename Derived> 11881 ExprResult 11882 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 11883 // Transform the base expression. 11884 ExprResult Base = getDerived().TransformExpr(E->getBase()); 11885 if (Base.isInvalid()) 11886 return ExprError(); 11887 11888 // If nothing changed, just retain the existing expression. 11889 if (!getDerived().AlwaysRebuild() && 11890 Base.get() == E->getBase()) 11891 return E; 11892 11893 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 11894 E->getOpLoc(), 11895 E->isArrow()); 11896 } 11897 11898 template<typename Derived> 11899 ExprResult 11900 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 11901 bool ArgumentChanged = false; 11902 SmallVector<Expr*, 8> SubExprs; 11903 SubExprs.reserve(E->getNumSubExprs()); 11904 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 11905 SubExprs, &ArgumentChanged)) 11906 return ExprError(); 11907 11908 if (!getDerived().AlwaysRebuild() && 11909 !ArgumentChanged) 11910 return E; 11911 11912 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 11913 SubExprs, 11914 E->getRParenLoc()); 11915 } 11916 11917 template<typename Derived> 11918 ExprResult 11919 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) { 11920 ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr()); 11921 if (SrcExpr.isInvalid()) 11922 return ExprError(); 11923 11924 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 11925 if (!Type) 11926 return ExprError(); 11927 11928 if (!getDerived().AlwaysRebuild() && 11929 Type == E->getTypeSourceInfo() && 11930 SrcExpr.get() == E->getSrcExpr()) 11931 return E; 11932 11933 return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(), 11934 SrcExpr.get(), Type, 11935 E->getRParenLoc()); 11936 } 11937 11938 template<typename Derived> 11939 ExprResult 11940 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 11941 BlockDecl *oldBlock = E->getBlockDecl(); 11942 11943 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr); 11944 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 11945 11946 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 11947 blockScope->TheDecl->setBlockMissingReturnType( 11948 oldBlock->blockMissingReturnType()); 11949 11950 SmallVector<ParmVarDecl*, 4> params; 11951 SmallVector<QualType, 4> paramTypes; 11952 11953 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 11954 11955 // Parameter substitution. 11956 Sema::ExtParameterInfoBuilder extParamInfos; 11957 if (getDerived().TransformFunctionTypeParams( 11958 E->getCaretLocation(), oldBlock->parameters(), nullptr, 11959 exprFunctionType->getExtParameterInfosOrNull(), paramTypes, ¶ms, 11960 extParamInfos)) { 11961 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 11962 return ExprError(); 11963 } 11964 11965 QualType exprResultType = 11966 getDerived().TransformType(exprFunctionType->getReturnType()); 11967 11968 auto epi = exprFunctionType->getExtProtoInfo(); 11969 epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size()); 11970 11971 QualType functionType = 11972 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi); 11973 blockScope->FunctionType = functionType; 11974 11975 // Set the parameters on the block decl. 11976 if (!params.empty()) 11977 blockScope->TheDecl->setParams(params); 11978 11979 if (!oldBlock->blockMissingReturnType()) { 11980 blockScope->HasImplicitReturnType = false; 11981 blockScope->ReturnType = exprResultType; 11982 } 11983 11984 // Transform the body 11985 StmtResult body = getDerived().TransformStmt(E->getBody()); 11986 if (body.isInvalid()) { 11987 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr); 11988 return ExprError(); 11989 } 11990 11991 #ifndef NDEBUG 11992 // In builds with assertions, make sure that we captured everything we 11993 // captured before. 11994 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 11995 for (const auto &I : oldBlock->captures()) { 11996 VarDecl *oldCapture = I.getVariable(); 11997 11998 // Ignore parameter packs. 11999 if (isa<ParmVarDecl>(oldCapture) && 12000 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 12001 continue; 12002 12003 VarDecl *newCapture = 12004 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 12005 oldCapture)); 12006 assert(blockScope->CaptureMap.count(newCapture)); 12007 } 12008 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 12009 } 12010 #endif 12011 12012 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 12013 /*Scope=*/nullptr); 12014 } 12015 12016 template<typename Derived> 12017 ExprResult 12018 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 12019 llvm_unreachable("Cannot transform asType expressions yet"); 12020 } 12021 12022 template<typename Derived> 12023 ExprResult 12024 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 12025 QualType RetTy = getDerived().TransformType(E->getType()); 12026 bool ArgumentChanged = false; 12027 SmallVector<Expr*, 8> SubExprs; 12028 SubExprs.reserve(E->getNumSubExprs()); 12029 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 12030 SubExprs, &ArgumentChanged)) 12031 return ExprError(); 12032 12033 if (!getDerived().AlwaysRebuild() && 12034 !ArgumentChanged) 12035 return E; 12036 12037 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 12038 RetTy, E->getOp(), E->getRParenLoc()); 12039 } 12040 12041 //===----------------------------------------------------------------------===// 12042 // Type reconstruction 12043 //===----------------------------------------------------------------------===// 12044 12045 template<typename Derived> 12046 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 12047 SourceLocation Star) { 12048 return SemaRef.BuildPointerType(PointeeType, Star, 12049 getDerived().getBaseEntity()); 12050 } 12051 12052 template<typename Derived> 12053 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 12054 SourceLocation Star) { 12055 return SemaRef.BuildBlockPointerType(PointeeType, Star, 12056 getDerived().getBaseEntity()); 12057 } 12058 12059 template<typename Derived> 12060 QualType 12061 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 12062 bool WrittenAsLValue, 12063 SourceLocation Sigil) { 12064 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 12065 Sigil, getDerived().getBaseEntity()); 12066 } 12067 12068 template<typename Derived> 12069 QualType 12070 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 12071 QualType ClassType, 12072 SourceLocation Sigil) { 12073 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil, 12074 getDerived().getBaseEntity()); 12075 } 12076 12077 template<typename Derived> 12078 QualType TreeTransform<Derived>::RebuildObjCTypeParamType( 12079 const ObjCTypeParamDecl *Decl, 12080 SourceLocation ProtocolLAngleLoc, 12081 ArrayRef<ObjCProtocolDecl *> Protocols, 12082 ArrayRef<SourceLocation> ProtocolLocs, 12083 SourceLocation ProtocolRAngleLoc) { 12084 return SemaRef.BuildObjCTypeParamType(Decl, 12085 ProtocolLAngleLoc, Protocols, 12086 ProtocolLocs, ProtocolRAngleLoc, 12087 /*FailOnError=*/true); 12088 } 12089 12090 template<typename Derived> 12091 QualType TreeTransform<Derived>::RebuildObjCObjectType( 12092 QualType BaseType, 12093 SourceLocation Loc, 12094 SourceLocation TypeArgsLAngleLoc, 12095 ArrayRef<TypeSourceInfo *> TypeArgs, 12096 SourceLocation TypeArgsRAngleLoc, 12097 SourceLocation ProtocolLAngleLoc, 12098 ArrayRef<ObjCProtocolDecl *> Protocols, 12099 ArrayRef<SourceLocation> ProtocolLocs, 12100 SourceLocation ProtocolRAngleLoc) { 12101 return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc, 12102 TypeArgs, TypeArgsRAngleLoc, 12103 ProtocolLAngleLoc, Protocols, ProtocolLocs, 12104 ProtocolRAngleLoc, 12105 /*FailOnError=*/true); 12106 } 12107 12108 template<typename Derived> 12109 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType( 12110 QualType PointeeType, 12111 SourceLocation Star) { 12112 return SemaRef.Context.getObjCObjectPointerType(PointeeType); 12113 } 12114 12115 template<typename Derived> 12116 QualType 12117 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 12118 ArrayType::ArraySizeModifier SizeMod, 12119 const llvm::APInt *Size, 12120 Expr *SizeExpr, 12121 unsigned IndexTypeQuals, 12122 SourceRange BracketsRange) { 12123 if (SizeExpr || !Size) 12124 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 12125 IndexTypeQuals, BracketsRange, 12126 getDerived().getBaseEntity()); 12127 12128 QualType Types[] = { 12129 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 12130 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 12131 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 12132 }; 12133 const unsigned NumTypes = llvm::array_lengthof(Types); 12134 QualType SizeType; 12135 for (unsigned I = 0; I != NumTypes; ++I) 12136 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 12137 SizeType = Types[I]; 12138 break; 12139 } 12140 12141 // Note that we can return a VariableArrayType here in the case where 12142 // the element type was a dependent VariableArrayType. 12143 IntegerLiteral *ArraySize 12144 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 12145 /*FIXME*/BracketsRange.getBegin()); 12146 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 12147 IndexTypeQuals, BracketsRange, 12148 getDerived().getBaseEntity()); 12149 } 12150 12151 template<typename Derived> 12152 QualType 12153 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 12154 ArrayType::ArraySizeModifier SizeMod, 12155 const llvm::APInt &Size, 12156 unsigned IndexTypeQuals, 12157 SourceRange BracketsRange) { 12158 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr, 12159 IndexTypeQuals, BracketsRange); 12160 } 12161 12162 template<typename Derived> 12163 QualType 12164 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 12165 ArrayType::ArraySizeModifier SizeMod, 12166 unsigned IndexTypeQuals, 12167 SourceRange BracketsRange) { 12168 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr, 12169 IndexTypeQuals, BracketsRange); 12170 } 12171 12172 template<typename Derived> 12173 QualType 12174 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 12175 ArrayType::ArraySizeModifier SizeMod, 12176 Expr *SizeExpr, 12177 unsigned IndexTypeQuals, 12178 SourceRange BracketsRange) { 12179 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12180 SizeExpr, 12181 IndexTypeQuals, BracketsRange); 12182 } 12183 12184 template<typename Derived> 12185 QualType 12186 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 12187 ArrayType::ArraySizeModifier SizeMod, 12188 Expr *SizeExpr, 12189 unsigned IndexTypeQuals, 12190 SourceRange BracketsRange) { 12191 return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, 12192 SizeExpr, 12193 IndexTypeQuals, BracketsRange); 12194 } 12195 12196 template<typename Derived> 12197 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 12198 unsigned NumElements, 12199 VectorType::VectorKind VecKind) { 12200 // FIXME: semantic checking! 12201 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 12202 } 12203 12204 template<typename Derived> 12205 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 12206 unsigned NumElements, 12207 SourceLocation AttributeLoc) { 12208 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 12209 NumElements, true); 12210 IntegerLiteral *VectorSize 12211 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 12212 AttributeLoc); 12213 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 12214 } 12215 12216 template<typename Derived> 12217 QualType 12218 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 12219 Expr *SizeExpr, 12220 SourceLocation AttributeLoc) { 12221 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 12222 } 12223 12224 template<typename Derived> 12225 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 12226 QualType T, 12227 MutableArrayRef<QualType> ParamTypes, 12228 const FunctionProtoType::ExtProtoInfo &EPI) { 12229 return SemaRef.BuildFunctionType(T, ParamTypes, 12230 getDerived().getBaseLocation(), 12231 getDerived().getBaseEntity(), 12232 EPI); 12233 } 12234 12235 template<typename Derived> 12236 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 12237 return SemaRef.Context.getFunctionNoProtoType(T); 12238 } 12239 12240 template<typename Derived> 12241 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc, 12242 Decl *D) { 12243 assert(D && "no decl found"); 12244 if (D->isInvalidDecl()) return QualType(); 12245 12246 // FIXME: Doesn't account for ObjCInterfaceDecl! 12247 TypeDecl *Ty; 12248 if (auto *UPD = dyn_cast<UsingPackDecl>(D)) { 12249 // A valid resolved using typename pack expansion decl can have multiple 12250 // UsingDecls, but they must each have exactly one type, and it must be 12251 // the same type in every case. But we must have at least one expansion! 12252 if (UPD->expansions().empty()) { 12253 getSema().Diag(Loc, diag::err_using_pack_expansion_empty) 12254 << UPD->isCXXClassMember() << UPD; 12255 return QualType(); 12256 } 12257 12258 // We might still have some unresolved types. Try to pick a resolved type 12259 // if we can. The final instantiation will check that the remaining 12260 // unresolved types instantiate to the type we pick. 12261 QualType FallbackT; 12262 QualType T; 12263 for (auto *E : UPD->expansions()) { 12264 QualType ThisT = RebuildUnresolvedUsingType(Loc, E); 12265 if (ThisT.isNull()) 12266 continue; 12267 else if (ThisT->getAs<UnresolvedUsingType>()) 12268 FallbackT = ThisT; 12269 else if (T.isNull()) 12270 T = ThisT; 12271 else 12272 assert(getSema().Context.hasSameType(ThisT, T) && 12273 "mismatched resolved types in using pack expansion"); 12274 } 12275 return T.isNull() ? FallbackT : T; 12276 } else if (auto *Using = dyn_cast<UsingDecl>(D)) { 12277 assert(Using->hasTypename() && 12278 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 12279 12280 // A valid resolved using typename decl points to exactly one type decl. 12281 assert(++Using->shadow_begin() == Using->shadow_end()); 12282 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 12283 } else { 12284 assert(isa<UnresolvedUsingTypenameDecl>(D) && 12285 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 12286 Ty = cast<UnresolvedUsingTypenameDecl>(D); 12287 } 12288 12289 return SemaRef.Context.getTypeDeclType(Ty); 12290 } 12291 12292 template<typename Derived> 12293 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 12294 SourceLocation Loc) { 12295 return SemaRef.BuildTypeofExprType(E, Loc); 12296 } 12297 12298 template<typename Derived> 12299 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 12300 return SemaRef.Context.getTypeOfType(Underlying); 12301 } 12302 12303 template<typename Derived> 12304 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 12305 SourceLocation Loc) { 12306 return SemaRef.BuildDecltypeType(E, Loc); 12307 } 12308 12309 template<typename Derived> 12310 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 12311 UnaryTransformType::UTTKind UKind, 12312 SourceLocation Loc) { 12313 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 12314 } 12315 12316 template<typename Derived> 12317 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 12318 TemplateName Template, 12319 SourceLocation TemplateNameLoc, 12320 TemplateArgumentListInfo &TemplateArgs) { 12321 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 12322 } 12323 12324 template<typename Derived> 12325 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 12326 SourceLocation KWLoc) { 12327 return SemaRef.BuildAtomicType(ValueType, KWLoc); 12328 } 12329 12330 template<typename Derived> 12331 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType, 12332 SourceLocation KWLoc, 12333 bool isReadPipe) { 12334 return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc) 12335 : SemaRef.BuildWritePipeType(ValueType, KWLoc); 12336 } 12337 12338 template<typename Derived> 12339 TemplateName 12340 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12341 bool TemplateKW, 12342 TemplateDecl *Template) { 12343 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 12344 Template); 12345 } 12346 12347 template<typename Derived> 12348 TemplateName 12349 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12350 const IdentifierInfo &Name, 12351 SourceLocation NameLoc, 12352 QualType ObjectType, 12353 NamedDecl *FirstQualifierInScope, 12354 bool AllowInjectedClassName) { 12355 UnqualifiedId TemplateName; 12356 TemplateName.setIdentifier(&Name, NameLoc); 12357 Sema::TemplateTy Template; 12358 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12359 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12360 SS, TemplateKWLoc, TemplateName, 12361 ParsedType::make(ObjectType), 12362 /*EnteringContext=*/false, 12363 Template, AllowInjectedClassName); 12364 return Template.get(); 12365 } 12366 12367 template<typename Derived> 12368 TemplateName 12369 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 12370 OverloadedOperatorKind Operator, 12371 SourceLocation NameLoc, 12372 QualType ObjectType, 12373 bool AllowInjectedClassName) { 12374 UnqualifiedId Name; 12375 // FIXME: Bogus location information. 12376 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 12377 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 12378 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12379 Sema::TemplateTy Template; 12380 getSema().ActOnDependentTemplateName(/*Scope=*/nullptr, 12381 SS, TemplateKWLoc, Name, 12382 ParsedType::make(ObjectType), 12383 /*EnteringContext=*/false, 12384 Template, AllowInjectedClassName); 12385 return Template.get(); 12386 } 12387 12388 template<typename Derived> 12389 ExprResult 12390 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 12391 SourceLocation OpLoc, 12392 Expr *OrigCallee, 12393 Expr *First, 12394 Expr *Second) { 12395 Expr *Callee = OrigCallee->IgnoreParenCasts(); 12396 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 12397 12398 if (First->getObjectKind() == OK_ObjCProperty) { 12399 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12400 if (BinaryOperator::isAssignmentOp(Opc)) 12401 return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc, 12402 First, Second); 12403 ExprResult Result = SemaRef.CheckPlaceholderExpr(First); 12404 if (Result.isInvalid()) 12405 return ExprError(); 12406 First = Result.get(); 12407 } 12408 12409 if (Second && Second->getObjectKind() == OK_ObjCProperty) { 12410 ExprResult Result = SemaRef.CheckPlaceholderExpr(Second); 12411 if (Result.isInvalid()) 12412 return ExprError(); 12413 Second = Result.get(); 12414 } 12415 12416 // Determine whether this should be a builtin operation. 12417 if (Op == OO_Subscript) { 12418 if (!First->getType()->isOverloadableType() && 12419 !Second->getType()->isOverloadableType()) 12420 return getSema().CreateBuiltinArraySubscriptExpr(First, 12421 Callee->getLocStart(), 12422 Second, OpLoc); 12423 } else if (Op == OO_Arrow) { 12424 // -> is never a builtin operation. 12425 return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc); 12426 } else if (Second == nullptr || isPostIncDec) { 12427 if (!First->getType()->isOverloadableType()) { 12428 // The argument is not of overloadable type, so try to create a 12429 // built-in unary operation. 12430 UnaryOperatorKind Opc 12431 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12432 12433 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 12434 } 12435 } else { 12436 if (!First->getType()->isOverloadableType() && 12437 !Second->getType()->isOverloadableType()) { 12438 // Neither of the arguments is an overloadable type, so try to 12439 // create a built-in binary operation. 12440 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12441 ExprResult Result 12442 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 12443 if (Result.isInvalid()) 12444 return ExprError(); 12445 12446 return Result; 12447 } 12448 } 12449 12450 // Compute the transformed set of functions (and function templates) to be 12451 // used during overload resolution. 12452 UnresolvedSet<16> Functions; 12453 12454 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 12455 assert(ULE->requiresADL()); 12456 Functions.append(ULE->decls_begin(), ULE->decls_end()); 12457 } else { 12458 // If we've resolved this to a particular non-member function, just call 12459 // that function. If we resolved it to a member function, 12460 // CreateOverloaded* will find that function for us. 12461 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 12462 if (!isa<CXXMethodDecl>(ND)) 12463 Functions.addDecl(ND); 12464 } 12465 12466 // Add any functions found via argument-dependent lookup. 12467 Expr *Args[2] = { First, Second }; 12468 unsigned NumArgs = 1 + (Second != nullptr); 12469 12470 // Create the overloaded operator invocation for unary operators. 12471 if (NumArgs == 1 || isPostIncDec) { 12472 UnaryOperatorKind Opc 12473 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 12474 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First); 12475 } 12476 12477 if (Op == OO_Subscript) { 12478 SourceLocation LBrace; 12479 SourceLocation RBrace; 12480 12481 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 12482 DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo(); 12483 LBrace = SourceLocation::getFromRawEncoding( 12484 NameLoc.CXXOperatorName.BeginOpNameLoc); 12485 RBrace = SourceLocation::getFromRawEncoding( 12486 NameLoc.CXXOperatorName.EndOpNameLoc); 12487 } else { 12488 LBrace = Callee->getLocStart(); 12489 RBrace = OpLoc; 12490 } 12491 12492 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 12493 First, Second); 12494 } 12495 12496 // Create the overloaded operator invocation for binary operators. 12497 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 12498 ExprResult Result 12499 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 12500 if (Result.isInvalid()) 12501 return ExprError(); 12502 12503 return Result; 12504 } 12505 12506 template<typename Derived> 12507 ExprResult 12508 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 12509 SourceLocation OperatorLoc, 12510 bool isArrow, 12511 CXXScopeSpec &SS, 12512 TypeSourceInfo *ScopeType, 12513 SourceLocation CCLoc, 12514 SourceLocation TildeLoc, 12515 PseudoDestructorTypeStorage Destroyed) { 12516 QualType BaseType = Base->getType(); 12517 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 12518 (!isArrow && !BaseType->getAs<RecordType>()) || 12519 (isArrow && BaseType->getAs<PointerType>() && 12520 !BaseType->getAs<PointerType>()->getPointeeType() 12521 ->template getAs<RecordType>())){ 12522 // This pseudo-destructor expression is still a pseudo-destructor. 12523 return SemaRef.BuildPseudoDestructorExpr( 12524 Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType, 12525 CCLoc, TildeLoc, Destroyed); 12526 } 12527 12528 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 12529 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 12530 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 12531 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 12532 NameInfo.setNamedTypeInfo(DestroyedType); 12533 12534 // The scope type is now known to be a valid nested name specifier 12535 // component. Tack it on to the end of the nested name specifier. 12536 if (ScopeType) { 12537 if (!ScopeType->getType()->getAs<TagType>()) { 12538 getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(), 12539 diag::err_expected_class_or_namespace) 12540 << ScopeType->getType() << getSema().getLangOpts().CPlusPlus; 12541 return ExprError(); 12542 } 12543 SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(), 12544 CCLoc); 12545 } 12546 12547 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 12548 return getSema().BuildMemberReferenceExpr(Base, BaseType, 12549 OperatorLoc, isArrow, 12550 SS, TemplateKWLoc, 12551 /*FIXME: FirstQualifier*/ nullptr, 12552 NameInfo, 12553 /*TemplateArgs*/ nullptr, 12554 /*S*/nullptr); 12555 } 12556 12557 template<typename Derived> 12558 StmtResult 12559 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 12560 SourceLocation Loc = S->getLocStart(); 12561 CapturedDecl *CD = S->getCapturedDecl(); 12562 unsigned NumParams = CD->getNumParams(); 12563 unsigned ContextParamPos = CD->getContextParamPosition(); 12564 SmallVector<Sema::CapturedParamNameType, 4> Params; 12565 for (unsigned I = 0; I < NumParams; ++I) { 12566 if (I != ContextParamPos) { 12567 Params.push_back( 12568 std::make_pair( 12569 CD->getParam(I)->getName(), 12570 getDerived().TransformType(CD->getParam(I)->getType()))); 12571 } else { 12572 Params.push_back(std::make_pair(StringRef(), QualType())); 12573 } 12574 } 12575 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr, 12576 S->getCapturedRegionKind(), Params); 12577 StmtResult Body; 12578 { 12579 Sema::CompoundScopeRAII CompoundScope(getSema()); 12580 Body = getDerived().TransformStmt(S->getCapturedStmt()); 12581 } 12582 12583 if (Body.isInvalid()) { 12584 getSema().ActOnCapturedRegionError(); 12585 return StmtError(); 12586 } 12587 12588 return getSema().ActOnCapturedRegionEnd(Body.get()); 12589 } 12590 12591 } // end namespace clang 12592 12593 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H 12594