TreeTransform.h revision 8f1a2db8649eb151ee620273dcf34b700176430f
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_SEMA_TREETRANSFORM_H 15#define LLVM_CLANG_SEMA_TREETRANSFORM_H 16 17#include "TypeLocBuilder.h" 18#include "clang/AST/Decl.h" 19#include "clang/AST/DeclObjC.h" 20#include "clang/AST/DeclTemplate.h" 21#include "clang/AST/Expr.h" 22#include "clang/AST/ExprCXX.h" 23#include "clang/AST/ExprObjC.h" 24#include "clang/AST/Stmt.h" 25#include "clang/AST/StmtCXX.h" 26#include "clang/AST/StmtObjC.h" 27#include "clang/AST/StmtOpenMP.h" 28#include "clang/Lex/Preprocessor.h" 29#include "clang/Sema/Designator.h" 30#include "clang/Sema/Lookup.h" 31#include "clang/Sema/Ownership.h" 32#include "clang/Sema/ParsedTemplate.h" 33#include "clang/Sema/ScopeInfo.h" 34#include "clang/Sema/SemaDiagnostic.h" 35#include "clang/Sema/SemaInternal.h" 36#include "llvm/ADT/ArrayRef.h" 37#include "llvm/Support/ErrorHandling.h" 38#include <algorithm> 39 40namespace clang { 41using namespace sema; 42 43/// \brief A semantic tree transformation that allows one to transform one 44/// abstract syntax tree into another. 45/// 46/// A new tree transformation is defined by creating a new subclass \c X of 47/// \c TreeTransform<X> and then overriding certain operations to provide 48/// behavior specific to that transformation. For example, template 49/// instantiation is implemented as a tree transformation where the 50/// transformation of TemplateTypeParmType nodes involves substituting the 51/// template arguments for their corresponding template parameters; a similar 52/// transformation is performed for non-type template parameters and 53/// template template parameters. 54/// 55/// This tree-transformation template uses static polymorphism to allow 56/// subclasses to customize any of its operations. Thus, a subclass can 57/// override any of the transformation or rebuild operators by providing an 58/// operation with the same signature as the default implementation. The 59/// overridding function should not be virtual. 60/// 61/// Semantic tree transformations are split into two stages, either of which 62/// can be replaced by a subclass. The "transform" step transforms an AST node 63/// or the parts of an AST node using the various transformation functions, 64/// then passes the pieces on to the "rebuild" step, which constructs a new AST 65/// node of the appropriate kind from the pieces. The default transformation 66/// routines recursively transform the operands to composite AST nodes (e.g., 67/// the pointee type of a PointerType node) and, if any of those operand nodes 68/// were changed by the transformation, invokes the rebuild operation to create 69/// a new AST node. 70/// 71/// Subclasses can customize the transformation at various levels. The 72/// most coarse-grained transformations involve replacing TransformType(), 73/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(), 74/// TransformTemplateName(), or TransformTemplateArgument() with entirely 75/// new implementations. 76/// 77/// For more fine-grained transformations, subclasses can replace any of the 78/// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 79/// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 80/// replacing TransformTemplateTypeParmType() allows template instantiation 81/// to substitute template arguments for their corresponding template 82/// parameters. Additionally, subclasses can override the \c RebuildXXX 83/// functions to control how AST nodes are rebuilt when their operands change. 84/// By default, \c TreeTransform will invoke semantic analysis to rebuild 85/// AST nodes. However, certain other tree transformations (e.g, cloning) may 86/// be able to use more efficient rebuild steps. 87/// 88/// There are a handful of other functions that can be overridden, allowing one 89/// to avoid traversing nodes that don't need any transformation 90/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 91/// operands have not changed (\c AlwaysRebuild()), and customize the 92/// default locations and entity names used for type-checking 93/// (\c getBaseLocation(), \c getBaseEntity()). 94template<typename Derived> 95class TreeTransform { 96 /// \brief Private RAII object that helps us forget and then re-remember 97 /// the template argument corresponding to a partially-substituted parameter 98 /// pack. 99 class ForgetPartiallySubstitutedPackRAII { 100 Derived &Self; 101 TemplateArgument Old; 102 103 public: 104 ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) { 105 Old = Self.ForgetPartiallySubstitutedPack(); 106 } 107 108 ~ForgetPartiallySubstitutedPackRAII() { 109 Self.RememberPartiallySubstitutedPack(Old); 110 } 111 }; 112 113protected: 114 Sema &SemaRef; 115 116 /// \brief The set of local declarations that have been transformed, for 117 /// cases where we are forced to build new declarations within the transformer 118 /// rather than in the subclass (e.g., lambda closure types). 119 llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls; 120 121public: 122 /// \brief Initializes a new tree transformer. 123 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 124 125 /// \brief Retrieves a reference to the derived class. 126 Derived &getDerived() { return static_cast<Derived&>(*this); } 127 128 /// \brief Retrieves a reference to the derived class. 129 const Derived &getDerived() const { 130 return static_cast<const Derived&>(*this); 131 } 132 133 static inline ExprResult Owned(Expr *E) { return E; } 134 static inline StmtResult Owned(Stmt *S) { return S; } 135 136 /// \brief Retrieves a reference to the semantic analysis object used for 137 /// this tree transform. 138 Sema &getSema() const { return SemaRef; } 139 140 /// \brief Whether the transformation should always rebuild AST nodes, even 141 /// if none of the children have changed. 142 /// 143 /// Subclasses may override this function to specify when the transformation 144 /// should rebuild all AST nodes. 145 bool AlwaysRebuild() { return false; } 146 147 /// \brief Returns the location of the entity being transformed, if that 148 /// information was not available elsewhere in the AST. 149 /// 150 /// By default, returns no source-location information. Subclasses can 151 /// provide an alternative implementation that provides better location 152 /// information. 153 SourceLocation getBaseLocation() { return SourceLocation(); } 154 155 /// \brief Returns the name of the entity being transformed, if that 156 /// information was not available elsewhere in the AST. 157 /// 158 /// By default, returns an empty name. Subclasses can provide an alternative 159 /// implementation with a more precise name. 160 DeclarationName getBaseEntity() { return DeclarationName(); } 161 162 /// \brief Sets the "base" location and entity when that 163 /// information is known based on another transformation. 164 /// 165 /// By default, the source location and entity are ignored. Subclasses can 166 /// override this function to provide a customized implementation. 167 void setBase(SourceLocation Loc, DeclarationName Entity) { } 168 169 /// \brief RAII object that temporarily sets the base location and entity 170 /// used for reporting diagnostics in types. 171 class TemporaryBase { 172 TreeTransform &Self; 173 SourceLocation OldLocation; 174 DeclarationName OldEntity; 175 176 public: 177 TemporaryBase(TreeTransform &Self, SourceLocation Location, 178 DeclarationName Entity) : Self(Self) { 179 OldLocation = Self.getDerived().getBaseLocation(); 180 OldEntity = Self.getDerived().getBaseEntity(); 181 182 if (Location.isValid()) 183 Self.getDerived().setBase(Location, Entity); 184 } 185 186 ~TemporaryBase() { 187 Self.getDerived().setBase(OldLocation, OldEntity); 188 } 189 }; 190 191 /// \brief Determine whether the given type \p T has already been 192 /// transformed. 193 /// 194 /// Subclasses can provide an alternative implementation of this routine 195 /// to short-circuit evaluation when it is known that a given type will 196 /// not change. For example, template instantiation need not traverse 197 /// non-dependent types. 198 bool AlreadyTransformed(QualType T) { 199 return T.isNull(); 200 } 201 202 /// \brief Determine whether the given call argument should be dropped, e.g., 203 /// because it is a default argument. 204 /// 205 /// Subclasses can provide an alternative implementation of this routine to 206 /// determine which kinds of call arguments get dropped. By default, 207 /// CXXDefaultArgument nodes are dropped (prior to transformation). 208 bool DropCallArgument(Expr *E) { 209 return E->isDefaultArgument(); 210 } 211 212 /// \brief Determine whether we should expand a pack expansion with the 213 /// given set of parameter packs into separate arguments by repeatedly 214 /// transforming the pattern. 215 /// 216 /// By default, the transformer never tries to expand pack expansions. 217 /// Subclasses can override this routine to provide different behavior. 218 /// 219 /// \param EllipsisLoc The location of the ellipsis that identifies the 220 /// pack expansion. 221 /// 222 /// \param PatternRange The source range that covers the entire pattern of 223 /// the pack expansion. 224 /// 225 /// \param Unexpanded The set of unexpanded parameter packs within the 226 /// pattern. 227 /// 228 /// \param ShouldExpand Will be set to \c true if the transformer should 229 /// expand the corresponding pack expansions into separate arguments. When 230 /// set, \c NumExpansions must also be set. 231 /// 232 /// \param RetainExpansion Whether the caller should add an unexpanded 233 /// pack expansion after all of the expanded arguments. This is used 234 /// when extending explicitly-specified template argument packs per 235 /// C++0x [temp.arg.explicit]p9. 236 /// 237 /// \param NumExpansions The number of separate arguments that will be in 238 /// the expanded form of the corresponding pack expansion. This is both an 239 /// input and an output parameter, which can be set by the caller if the 240 /// number of expansions is known a priori (e.g., due to a prior substitution) 241 /// and will be set by the callee when the number of expansions is known. 242 /// The callee must set this value when \c ShouldExpand is \c true; it may 243 /// set this value in other cases. 244 /// 245 /// \returns true if an error occurred (e.g., because the parameter packs 246 /// are to be instantiated with arguments of different lengths), false 247 /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions) 248 /// must be set. 249 bool TryExpandParameterPacks(SourceLocation EllipsisLoc, 250 SourceRange PatternRange, 251 ArrayRef<UnexpandedParameterPack> Unexpanded, 252 bool &ShouldExpand, 253 bool &RetainExpansion, 254 Optional<unsigned> &NumExpansions) { 255 ShouldExpand = false; 256 return false; 257 } 258 259 /// \brief "Forget" about the partially-substituted pack template argument, 260 /// when performing an instantiation that must preserve the parameter pack 261 /// use. 262 /// 263 /// This routine is meant to be overridden by the template instantiator. 264 TemplateArgument ForgetPartiallySubstitutedPack() { 265 return TemplateArgument(); 266 } 267 268 /// \brief "Remember" the partially-substituted pack template argument 269 /// after performing an instantiation that must preserve the parameter pack 270 /// use. 271 /// 272 /// This routine is meant to be overridden by the template instantiator. 273 void RememberPartiallySubstitutedPack(TemplateArgument Arg) { } 274 275 /// \brief Note to the derived class when a function parameter pack is 276 /// being expanded. 277 void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { } 278 279 /// \brief Transforms the given type into another type. 280 /// 281 /// By default, this routine transforms a type by creating a 282 /// TypeSourceInfo for it and delegating to the appropriate 283 /// function. This is expensive, but we don't mind, because 284 /// this method is deprecated anyway; all users should be 285 /// switched to storing TypeSourceInfos. 286 /// 287 /// \returns the transformed type. 288 QualType TransformType(QualType T); 289 290 /// \brief Transforms the given type-with-location into a new 291 /// type-with-location. 292 /// 293 /// By default, this routine transforms a type by delegating to the 294 /// appropriate TransformXXXType to build a new type. Subclasses 295 /// may override this function (to take over all type 296 /// transformations) or some set of the TransformXXXType functions 297 /// to alter the transformation. 298 TypeSourceInfo *TransformType(TypeSourceInfo *DI); 299 300 /// \brief Transform the given type-with-location into a new 301 /// type, collecting location information in the given builder 302 /// as necessary. 303 /// 304 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL); 305 306 /// \brief Transform the given statement. 307 /// 308 /// By default, this routine transforms a statement by delegating to the 309 /// appropriate TransformXXXStmt function to transform a specific kind of 310 /// statement or the TransformExpr() function to transform an expression. 311 /// Subclasses may override this function to transform statements using some 312 /// other mechanism. 313 /// 314 /// \returns the transformed statement. 315 StmtResult TransformStmt(Stmt *S); 316 317 /// \brief Transform the given statement. 318 /// 319 /// By default, this routine transforms a statement by delegating to the 320 /// appropriate TransformOMPXXXClause function to transform a specific kind 321 /// of clause. Subclasses may override this function to transform statements 322 /// using some other mechanism. 323 /// 324 /// \returns the transformed OpenMP clause. 325 OMPClause *TransformOMPClause(OMPClause *S); 326 327 /// \brief Transform the given expression. 328 /// 329 /// By default, this routine transforms an expression by delegating to the 330 /// appropriate TransformXXXExpr function to build a new expression. 331 /// Subclasses may override this function to transform expressions using some 332 /// other mechanism. 333 /// 334 /// \returns the transformed expression. 335 ExprResult TransformExpr(Expr *E); 336 337 /// \brief Transform the given initializer. 338 /// 339 /// By default, this routine transforms an initializer by stripping off the 340 /// semantic nodes added by initialization, then passing the result to 341 /// TransformExpr or TransformExprs. 342 /// 343 /// \returns the transformed initializer. 344 ExprResult TransformInitializer(Expr *Init, bool CXXDirectInit); 345 346 /// \brief Transform the given list of expressions. 347 /// 348 /// This routine transforms a list of expressions by invoking 349 /// \c TransformExpr() for each subexpression. However, it also provides 350 /// support for variadic templates by expanding any pack expansions (if the 351 /// derived class permits such expansion) along the way. When pack expansions 352 /// are present, the number of outputs may not equal the number of inputs. 353 /// 354 /// \param Inputs The set of expressions to be transformed. 355 /// 356 /// \param NumInputs The number of expressions in \c Inputs. 357 /// 358 /// \param IsCall If \c true, then this transform is being performed on 359 /// function-call arguments, and any arguments that should be dropped, will 360 /// be. 361 /// 362 /// \param Outputs The transformed input expressions will be added to this 363 /// vector. 364 /// 365 /// \param ArgChanged If non-NULL, will be set \c true if any argument changed 366 /// due to transformation. 367 /// 368 /// \returns true if an error occurred, false otherwise. 369 bool TransformExprs(Expr **Inputs, unsigned NumInputs, bool IsCall, 370 SmallVectorImpl<Expr *> &Outputs, 371 bool *ArgChanged = 0); 372 373 /// \brief Transform the given declaration, which is referenced from a type 374 /// or expression. 375 /// 376 /// By default, acts as the identity function on declarations, unless the 377 /// transformer has had to transform the declaration itself. Subclasses 378 /// may override this function to provide alternate behavior. 379 Decl *TransformDecl(SourceLocation Loc, Decl *D) { 380 llvm::DenseMap<Decl *, Decl *>::iterator Known 381 = TransformedLocalDecls.find(D); 382 if (Known != TransformedLocalDecls.end()) 383 return Known->second; 384 385 return D; 386 } 387 388 /// \brief Transform the attributes associated with the given declaration and 389 /// place them on the new declaration. 390 /// 391 /// By default, this operation does nothing. Subclasses may override this 392 /// behavior to transform attributes. 393 void transformAttrs(Decl *Old, Decl *New) { } 394 395 /// \brief Note that a local declaration has been transformed by this 396 /// transformer. 397 /// 398 /// Local declarations are typically transformed via a call to 399 /// TransformDefinition. However, in some cases (e.g., lambda expressions), 400 /// the transformer itself has to transform the declarations. This routine 401 /// can be overridden by a subclass that keeps track of such mappings. 402 void transformedLocalDecl(Decl *Old, Decl *New) { 403 TransformedLocalDecls[Old] = New; 404 } 405 406 /// \brief Transform the definition of the given declaration. 407 /// 408 /// By default, invokes TransformDecl() to transform the declaration. 409 /// Subclasses may override this function to provide alternate behavior. 410 Decl *TransformDefinition(SourceLocation Loc, Decl *D) { 411 return getDerived().TransformDecl(Loc, D); 412 } 413 414 /// \brief Transform the given declaration, which was the first part of a 415 /// nested-name-specifier in a member access expression. 416 /// 417 /// This specific declaration transformation only applies to the first 418 /// identifier in a nested-name-specifier of a member access expression, e.g., 419 /// the \c T in \c x->T::member 420 /// 421 /// By default, invokes TransformDecl() to transform the declaration. 422 /// Subclasses may override this function to provide alternate behavior. 423 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) { 424 return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D)); 425 } 426 427 /// \brief Transform the given nested-name-specifier with source-location 428 /// information. 429 /// 430 /// By default, transforms all of the types and declarations within the 431 /// nested-name-specifier. Subclasses may override this function to provide 432 /// alternate behavior. 433 NestedNameSpecifierLoc TransformNestedNameSpecifierLoc( 434 NestedNameSpecifierLoc NNS, 435 QualType ObjectType = QualType(), 436 NamedDecl *FirstQualifierInScope = 0); 437 438 /// \brief Transform the given declaration name. 439 /// 440 /// By default, transforms the types of conversion function, constructor, 441 /// and destructor names and then (if needed) rebuilds the declaration name. 442 /// Identifiers and selectors are returned unmodified. Sublcasses may 443 /// override this function to provide alternate behavior. 444 DeclarationNameInfo 445 TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo); 446 447 /// \brief Transform the given template name. 448 /// 449 /// \param SS The nested-name-specifier that qualifies the template 450 /// name. This nested-name-specifier must already have been transformed. 451 /// 452 /// \param Name The template name to transform. 453 /// 454 /// \param NameLoc The source location of the template name. 455 /// 456 /// \param ObjectType If we're translating a template name within a member 457 /// access expression, this is the type of the object whose member template 458 /// is being referenced. 459 /// 460 /// \param FirstQualifierInScope If the first part of a nested-name-specifier 461 /// also refers to a name within the current (lexical) scope, this is the 462 /// declaration it refers to. 463 /// 464 /// By default, transforms the template name by transforming the declarations 465 /// and nested-name-specifiers that occur within the template name. 466 /// Subclasses may override this function to provide alternate behavior. 467 TemplateName TransformTemplateName(CXXScopeSpec &SS, 468 TemplateName Name, 469 SourceLocation NameLoc, 470 QualType ObjectType = QualType(), 471 NamedDecl *FirstQualifierInScope = 0); 472 473 /// \brief Transform the given template argument. 474 /// 475 /// By default, this operation transforms the type, expression, or 476 /// declaration stored within the template argument and constructs a 477 /// new template argument from the transformed result. Subclasses may 478 /// override this function to provide alternate behavior. 479 /// 480 /// Returns true if there was an error. 481 bool TransformTemplateArgument(const TemplateArgumentLoc &Input, 482 TemplateArgumentLoc &Output); 483 484 /// \brief Transform the given set of template arguments. 485 /// 486 /// By default, this operation transforms all of the template arguments 487 /// in the input set using \c TransformTemplateArgument(), and appends 488 /// the transformed arguments to the output list. 489 /// 490 /// Note that this overload of \c TransformTemplateArguments() is merely 491 /// a convenience function. Subclasses that wish to override this behavior 492 /// should override the iterator-based member template version. 493 /// 494 /// \param Inputs The set of template arguments to be transformed. 495 /// 496 /// \param NumInputs The number of template arguments in \p Inputs. 497 /// 498 /// \param Outputs The set of transformed template arguments output by this 499 /// routine. 500 /// 501 /// Returns true if an error occurred. 502 bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs, 503 unsigned NumInputs, 504 TemplateArgumentListInfo &Outputs) { 505 return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs); 506 } 507 508 /// \brief Transform the given set of template arguments. 509 /// 510 /// By default, this operation transforms all of the template arguments 511 /// in the input set using \c TransformTemplateArgument(), and appends 512 /// the transformed arguments to the output list. 513 /// 514 /// \param First An iterator to the first template argument. 515 /// 516 /// \param Last An iterator one step past the last template argument. 517 /// 518 /// \param Outputs The set of transformed template arguments output by this 519 /// routine. 520 /// 521 /// Returns true if an error occurred. 522 template<typename InputIterator> 523 bool TransformTemplateArguments(InputIterator First, 524 InputIterator Last, 525 TemplateArgumentListInfo &Outputs); 526 527 /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument. 528 void InventTemplateArgumentLoc(const TemplateArgument &Arg, 529 TemplateArgumentLoc &ArgLoc); 530 531 /// \brief Fakes up a TypeSourceInfo for a type. 532 TypeSourceInfo *InventTypeSourceInfo(QualType T) { 533 return SemaRef.Context.getTrivialTypeSourceInfo(T, 534 getDerived().getBaseLocation()); 535 } 536 537#define ABSTRACT_TYPELOC(CLASS, PARENT) 538#define TYPELOC(CLASS, PARENT) \ 539 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T); 540#include "clang/AST/TypeLocNodes.def" 541 542 QualType TransformFunctionProtoType(TypeLocBuilder &TLB, 543 FunctionProtoTypeLoc TL, 544 CXXRecordDecl *ThisContext, 545 unsigned ThisTypeQuals); 546 547 StmtResult 548 TransformSEHHandler(Stmt *Handler); 549 550 QualType 551 TransformTemplateSpecializationType(TypeLocBuilder &TLB, 552 TemplateSpecializationTypeLoc TL, 553 TemplateName Template); 554 555 QualType 556 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 557 DependentTemplateSpecializationTypeLoc TL, 558 TemplateName Template, 559 CXXScopeSpec &SS); 560 561 QualType 562 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 563 DependentTemplateSpecializationTypeLoc TL, 564 NestedNameSpecifierLoc QualifierLoc); 565 566 /// \brief Transforms the parameters of a function type into the 567 /// given vectors. 568 /// 569 /// The result vectors should be kept in sync; null entries in the 570 /// variables vector are acceptable. 571 /// 572 /// Return true on error. 573 bool TransformFunctionTypeParams(SourceLocation Loc, 574 ParmVarDecl **Params, unsigned NumParams, 575 const QualType *ParamTypes, 576 SmallVectorImpl<QualType> &PTypes, 577 SmallVectorImpl<ParmVarDecl*> *PVars); 578 579 /// \brief Transforms a single function-type parameter. Return null 580 /// on error. 581 /// 582 /// \param indexAdjustment - A number to add to the parameter's 583 /// scope index; can be negative 584 ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm, 585 int indexAdjustment, 586 Optional<unsigned> NumExpansions, 587 bool ExpectParameterPack); 588 589 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL); 590 591 StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 592 ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E); 593 594 /// \brief Transform the captures and body of a lambda expression. 595 ExprResult TransformLambdaScope(LambdaExpr *E, CXXMethodDecl *CallOperator); 596 597 ExprResult TransformAddressOfOperand(Expr *E); 598 ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E, 599 bool IsAddressOfOperand); 600 601#define STMT(Node, Parent) \ 602 StmtResult Transform##Node(Node *S); 603#define EXPR(Node, Parent) \ 604 ExprResult Transform##Node(Node *E); 605#define ABSTRACT_STMT(Stmt) 606#include "clang/AST/StmtNodes.inc" 607 608#define OPENMP_CLAUSE(Name, Class) \ 609 OMPClause *Transform ## Class(Class *S); 610#include "clang/Basic/OpenMPKinds.def" 611 612 /// \brief Build a new pointer type given its pointee type. 613 /// 614 /// By default, performs semantic analysis when building the pointer type. 615 /// Subclasses may override this routine to provide different behavior. 616 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil); 617 618 /// \brief Build a new block pointer type given its pointee type. 619 /// 620 /// By default, performs semantic analysis when building the block pointer 621 /// type. Subclasses may override this routine to provide different behavior. 622 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil); 623 624 /// \brief Build a new reference type given the type it references. 625 /// 626 /// By default, performs semantic analysis when building the 627 /// reference type. Subclasses may override this routine to provide 628 /// different behavior. 629 /// 630 /// \param LValue whether the type was written with an lvalue sigil 631 /// or an rvalue sigil. 632 QualType RebuildReferenceType(QualType ReferentType, 633 bool LValue, 634 SourceLocation Sigil); 635 636 /// \brief Build a new member pointer type given the pointee type and the 637 /// class type it refers into. 638 /// 639 /// By default, performs semantic analysis when building the member pointer 640 /// type. Subclasses may override this routine to provide different behavior. 641 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType, 642 SourceLocation Sigil); 643 644 /// \brief Build a new array type given the element type, size 645 /// modifier, size of the array (if known), size expression, and index type 646 /// qualifiers. 647 /// 648 /// By default, performs semantic analysis when building the array type. 649 /// Subclasses may override this routine to provide different behavior. 650 /// Also by default, all of the other Rebuild*Array 651 QualType RebuildArrayType(QualType ElementType, 652 ArrayType::ArraySizeModifier SizeMod, 653 const llvm::APInt *Size, 654 Expr *SizeExpr, 655 unsigned IndexTypeQuals, 656 SourceRange BracketsRange); 657 658 /// \brief Build a new constant array type given the element type, size 659 /// modifier, (known) size of the array, and index type qualifiers. 660 /// 661 /// By default, performs semantic analysis when building the array type. 662 /// Subclasses may override this routine to provide different behavior. 663 QualType RebuildConstantArrayType(QualType ElementType, 664 ArrayType::ArraySizeModifier SizeMod, 665 const llvm::APInt &Size, 666 unsigned IndexTypeQuals, 667 SourceRange BracketsRange); 668 669 /// \brief Build a new incomplete array type given the element type, size 670 /// modifier, and index type qualifiers. 671 /// 672 /// By default, performs semantic analysis when building the array type. 673 /// Subclasses may override this routine to provide different behavior. 674 QualType RebuildIncompleteArrayType(QualType ElementType, 675 ArrayType::ArraySizeModifier SizeMod, 676 unsigned IndexTypeQuals, 677 SourceRange BracketsRange); 678 679 /// \brief Build a new variable-length array type given the element type, 680 /// size modifier, size expression, and index type qualifiers. 681 /// 682 /// By default, performs semantic analysis when building the array type. 683 /// Subclasses may override this routine to provide different behavior. 684 QualType RebuildVariableArrayType(QualType ElementType, 685 ArrayType::ArraySizeModifier SizeMod, 686 Expr *SizeExpr, 687 unsigned IndexTypeQuals, 688 SourceRange BracketsRange); 689 690 /// \brief Build a new dependent-sized array type given the element type, 691 /// size modifier, size expression, and index type qualifiers. 692 /// 693 /// By default, performs semantic analysis when building the array type. 694 /// Subclasses may override this routine to provide different behavior. 695 QualType RebuildDependentSizedArrayType(QualType ElementType, 696 ArrayType::ArraySizeModifier SizeMod, 697 Expr *SizeExpr, 698 unsigned IndexTypeQuals, 699 SourceRange BracketsRange); 700 701 /// \brief Build a new vector type given the element type and 702 /// number of elements. 703 /// 704 /// By default, performs semantic analysis when building the vector type. 705 /// Subclasses may override this routine to provide different behavior. 706 QualType RebuildVectorType(QualType ElementType, unsigned NumElements, 707 VectorType::VectorKind VecKind); 708 709 /// \brief Build a new extended vector type given the element type and 710 /// number of elements. 711 /// 712 /// By default, performs semantic analysis when building the vector type. 713 /// Subclasses may override this routine to provide different behavior. 714 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 715 SourceLocation AttributeLoc); 716 717 /// \brief Build a new potentially dependently-sized extended vector type 718 /// given the element type and number of elements. 719 /// 720 /// By default, performs semantic analysis when building the vector type. 721 /// Subclasses may override this routine to provide different behavior. 722 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 723 Expr *SizeExpr, 724 SourceLocation AttributeLoc); 725 726 /// \brief Build a new function type. 727 /// 728 /// By default, performs semantic analysis when building the function type. 729 /// Subclasses may override this routine to provide different behavior. 730 QualType RebuildFunctionProtoType(QualType T, 731 llvm::MutableArrayRef<QualType> ParamTypes, 732 const FunctionProtoType::ExtProtoInfo &EPI); 733 734 /// \brief Build a new unprototyped function type. 735 QualType RebuildFunctionNoProtoType(QualType ResultType); 736 737 /// \brief Rebuild an unresolved typename type, given the decl that 738 /// the UnresolvedUsingTypenameDecl was transformed to. 739 QualType RebuildUnresolvedUsingType(Decl *D); 740 741 /// \brief Build a new typedef type. 742 QualType RebuildTypedefType(TypedefNameDecl *Typedef) { 743 return SemaRef.Context.getTypeDeclType(Typedef); 744 } 745 746 /// \brief Build a new class/struct/union type. 747 QualType RebuildRecordType(RecordDecl *Record) { 748 return SemaRef.Context.getTypeDeclType(Record); 749 } 750 751 /// \brief Build a new Enum type. 752 QualType RebuildEnumType(EnumDecl *Enum) { 753 return SemaRef.Context.getTypeDeclType(Enum); 754 } 755 756 /// \brief Build a new typeof(expr) type. 757 /// 758 /// By default, performs semantic analysis when building the typeof type. 759 /// Subclasses may override this routine to provide different behavior. 760 QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc); 761 762 /// \brief Build a new typeof(type) type. 763 /// 764 /// By default, builds a new TypeOfType with the given underlying type. 765 QualType RebuildTypeOfType(QualType Underlying); 766 767 /// \brief Build a new unary transform type. 768 QualType RebuildUnaryTransformType(QualType BaseType, 769 UnaryTransformType::UTTKind UKind, 770 SourceLocation Loc); 771 772 /// \brief Build a new C++11 decltype type. 773 /// 774 /// By default, performs semantic analysis when building the decltype type. 775 /// Subclasses may override this routine to provide different behavior. 776 QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc); 777 778 /// \brief Build a new C++11 auto type. 779 /// 780 /// By default, builds a new AutoType with the given deduced type. 781 QualType RebuildAutoType(QualType Deduced, bool IsDecltypeAuto) { 782 // Note, IsDependent is always false here: we implicitly convert an 'auto' 783 // which has been deduced to a dependent type into an undeduced 'auto', so 784 // that we'll retry deduction after the transformation. 785 return SemaRef.Context.getAutoType(Deduced, IsDecltypeAuto); 786 } 787 788 /// \brief Build a new template specialization type. 789 /// 790 /// By default, performs semantic analysis when building the template 791 /// specialization type. Subclasses may override this routine to provide 792 /// different behavior. 793 QualType RebuildTemplateSpecializationType(TemplateName Template, 794 SourceLocation TemplateLoc, 795 TemplateArgumentListInfo &Args); 796 797 /// \brief Build a new parenthesized type. 798 /// 799 /// By default, builds a new ParenType type from the inner type. 800 /// Subclasses may override this routine to provide different behavior. 801 QualType RebuildParenType(QualType InnerType) { 802 return SemaRef.Context.getParenType(InnerType); 803 } 804 805 /// \brief Build a new qualified name type. 806 /// 807 /// By default, builds a new ElaboratedType type from the keyword, 808 /// the nested-name-specifier and the named type. 809 /// Subclasses may override this routine to provide different behavior. 810 QualType RebuildElaboratedType(SourceLocation KeywordLoc, 811 ElaboratedTypeKeyword Keyword, 812 NestedNameSpecifierLoc QualifierLoc, 813 QualType Named) { 814 return SemaRef.Context.getElaboratedType(Keyword, 815 QualifierLoc.getNestedNameSpecifier(), 816 Named); 817 } 818 819 /// \brief Build a new typename type that refers to a template-id. 820 /// 821 /// By default, builds a new DependentNameType type from the 822 /// nested-name-specifier and the given type. Subclasses may override 823 /// this routine to provide different behavior. 824 QualType RebuildDependentTemplateSpecializationType( 825 ElaboratedTypeKeyword Keyword, 826 NestedNameSpecifierLoc QualifierLoc, 827 const IdentifierInfo *Name, 828 SourceLocation NameLoc, 829 TemplateArgumentListInfo &Args) { 830 // Rebuild the template name. 831 // TODO: avoid TemplateName abstraction 832 CXXScopeSpec SS; 833 SS.Adopt(QualifierLoc); 834 TemplateName InstName 835 = getDerived().RebuildTemplateName(SS, *Name, NameLoc, QualType(), 0); 836 837 if (InstName.isNull()) 838 return QualType(); 839 840 // If it's still dependent, make a dependent specialization. 841 if (InstName.getAsDependentTemplateName()) 842 return SemaRef.Context.getDependentTemplateSpecializationType(Keyword, 843 QualifierLoc.getNestedNameSpecifier(), 844 Name, 845 Args); 846 847 // Otherwise, make an elaborated type wrapping a non-dependent 848 // specialization. 849 QualType T = 850 getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args); 851 if (T.isNull()) return QualType(); 852 853 if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == 0) 854 return T; 855 856 return SemaRef.Context.getElaboratedType(Keyword, 857 QualifierLoc.getNestedNameSpecifier(), 858 T); 859 } 860 861 /// \brief Build a new typename type that refers to an identifier. 862 /// 863 /// By default, performs semantic analysis when building the typename type 864 /// (or elaborated type). Subclasses may override this routine to provide 865 /// different behavior. 866 QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword, 867 SourceLocation KeywordLoc, 868 NestedNameSpecifierLoc QualifierLoc, 869 const IdentifierInfo *Id, 870 SourceLocation IdLoc) { 871 CXXScopeSpec SS; 872 SS.Adopt(QualifierLoc); 873 874 if (QualifierLoc.getNestedNameSpecifier()->isDependent()) { 875 // If the name is still dependent, just build a new dependent name type. 876 if (!SemaRef.computeDeclContext(SS)) 877 return SemaRef.Context.getDependentNameType(Keyword, 878 QualifierLoc.getNestedNameSpecifier(), 879 Id); 880 } 881 882 if (Keyword == ETK_None || Keyword == ETK_Typename) 883 return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc, 884 *Id, IdLoc); 885 886 TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword); 887 888 // We had a dependent elaborated-type-specifier that has been transformed 889 // into a non-dependent elaborated-type-specifier. Find the tag we're 890 // referring to. 891 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 892 DeclContext *DC = SemaRef.computeDeclContext(SS, false); 893 if (!DC) 894 return QualType(); 895 896 if (SemaRef.RequireCompleteDeclContext(SS, DC)) 897 return QualType(); 898 899 TagDecl *Tag = 0; 900 SemaRef.LookupQualifiedName(Result, DC); 901 switch (Result.getResultKind()) { 902 case LookupResult::NotFound: 903 case LookupResult::NotFoundInCurrentInstantiation: 904 break; 905 906 case LookupResult::Found: 907 Tag = Result.getAsSingle<TagDecl>(); 908 break; 909 910 case LookupResult::FoundOverloaded: 911 case LookupResult::FoundUnresolvedValue: 912 llvm_unreachable("Tag lookup cannot find non-tags"); 913 914 case LookupResult::Ambiguous: 915 // Let the LookupResult structure handle ambiguities. 916 return QualType(); 917 } 918 919 if (!Tag) { 920 // Check where the name exists but isn't a tag type and use that to emit 921 // better diagnostics. 922 LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName); 923 SemaRef.LookupQualifiedName(Result, DC); 924 switch (Result.getResultKind()) { 925 case LookupResult::Found: 926 case LookupResult::FoundOverloaded: 927 case LookupResult::FoundUnresolvedValue: { 928 NamedDecl *SomeDecl = Result.getRepresentativeDecl(); 929 unsigned Kind = 0; 930 if (isa<TypedefDecl>(SomeDecl)) Kind = 1; 931 else if (isa<TypeAliasDecl>(SomeDecl)) Kind = 2; 932 else if (isa<ClassTemplateDecl>(SomeDecl)) Kind = 3; 933 SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << Kind; 934 SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at); 935 break; 936 } 937 default: 938 // FIXME: Would be nice to highlight just the source range. 939 SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope) 940 << Kind << Id << DC; 941 break; 942 } 943 return QualType(); 944 } 945 946 if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false, 947 IdLoc, *Id)) { 948 SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id; 949 SemaRef.Diag(Tag->getLocation(), diag::note_previous_use); 950 return QualType(); 951 } 952 953 // Build the elaborated-type-specifier type. 954 QualType T = SemaRef.Context.getTypeDeclType(Tag); 955 return SemaRef.Context.getElaboratedType(Keyword, 956 QualifierLoc.getNestedNameSpecifier(), 957 T); 958 } 959 960 /// \brief Build a new pack expansion type. 961 /// 962 /// By default, builds a new PackExpansionType type from the given pattern. 963 /// Subclasses may override this routine to provide different behavior. 964 QualType RebuildPackExpansionType(QualType Pattern, 965 SourceRange PatternRange, 966 SourceLocation EllipsisLoc, 967 Optional<unsigned> NumExpansions) { 968 return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc, 969 NumExpansions); 970 } 971 972 /// \brief Build a new atomic type given its value type. 973 /// 974 /// By default, performs semantic analysis when building the atomic type. 975 /// Subclasses may override this routine to provide different behavior. 976 QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc); 977 978 /// \brief Build a new template name given a nested name specifier, a flag 979 /// indicating whether the "template" keyword was provided, and the template 980 /// that the template name refers to. 981 /// 982 /// By default, builds the new template name directly. Subclasses may override 983 /// this routine to provide different behavior. 984 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 985 bool TemplateKW, 986 TemplateDecl *Template); 987 988 /// \brief Build a new template name given a nested name specifier and the 989 /// name that is referred to as a template. 990 /// 991 /// By default, performs semantic analysis to determine whether the name can 992 /// be resolved to a specific template, then builds the appropriate kind of 993 /// template name. Subclasses may override this routine to provide different 994 /// behavior. 995 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 996 const IdentifierInfo &Name, 997 SourceLocation NameLoc, 998 QualType ObjectType, 999 NamedDecl *FirstQualifierInScope); 1000 1001 /// \brief Build a new template name given a nested name specifier and the 1002 /// overloaded operator name that is referred to as a template. 1003 /// 1004 /// By default, performs semantic analysis to determine whether the name can 1005 /// be resolved to a specific template, then builds the appropriate kind of 1006 /// template name. Subclasses may override this routine to provide different 1007 /// behavior. 1008 TemplateName RebuildTemplateName(CXXScopeSpec &SS, 1009 OverloadedOperatorKind Operator, 1010 SourceLocation NameLoc, 1011 QualType ObjectType); 1012 1013 /// \brief Build a new template name given a template template parameter pack 1014 /// and the 1015 /// 1016 /// By default, performs semantic analysis to determine whether the name can 1017 /// be resolved to a specific template, then builds the appropriate kind of 1018 /// template name. Subclasses may override this routine to provide different 1019 /// behavior. 1020 TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param, 1021 const TemplateArgument &ArgPack) { 1022 return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack); 1023 } 1024 1025 /// \brief Build a new compound statement. 1026 /// 1027 /// By default, performs semantic analysis to build the new statement. 1028 /// Subclasses may override this routine to provide different behavior. 1029 StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 1030 MultiStmtArg Statements, 1031 SourceLocation RBraceLoc, 1032 bool IsStmtExpr) { 1033 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements, 1034 IsStmtExpr); 1035 } 1036 1037 /// \brief Build a new case statement. 1038 /// 1039 /// By default, performs semantic analysis to build the new statement. 1040 /// Subclasses may override this routine to provide different behavior. 1041 StmtResult RebuildCaseStmt(SourceLocation CaseLoc, 1042 Expr *LHS, 1043 SourceLocation EllipsisLoc, 1044 Expr *RHS, 1045 SourceLocation ColonLoc) { 1046 return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS, 1047 ColonLoc); 1048 } 1049 1050 /// \brief Attach the body to a new case statement. 1051 /// 1052 /// By default, performs semantic analysis to build the new statement. 1053 /// Subclasses may override this routine to provide different behavior. 1054 StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) { 1055 getSema().ActOnCaseStmtBody(S, Body); 1056 return S; 1057 } 1058 1059 /// \brief Build a new default statement. 1060 /// 1061 /// By default, performs semantic analysis to build the new statement. 1062 /// Subclasses may override this routine to provide different behavior. 1063 StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 1064 SourceLocation ColonLoc, 1065 Stmt *SubStmt) { 1066 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt, 1067 /*CurScope=*/0); 1068 } 1069 1070 /// \brief Build a new label statement. 1071 /// 1072 /// By default, performs semantic analysis to build the new statement. 1073 /// Subclasses may override this routine to provide different behavior. 1074 StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L, 1075 SourceLocation ColonLoc, Stmt *SubStmt) { 1076 return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt); 1077 } 1078 1079 /// \brief Build a new label statement. 1080 /// 1081 /// By default, performs semantic analysis to build the new statement. 1082 /// Subclasses may override this routine to provide different behavior. 1083 StmtResult RebuildAttributedStmt(SourceLocation AttrLoc, 1084 ArrayRef<const Attr*> Attrs, 1085 Stmt *SubStmt) { 1086 return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt); 1087 } 1088 1089 /// \brief Build a new "if" statement. 1090 /// 1091 /// By default, performs semantic analysis to build the new statement. 1092 /// Subclasses may override this routine to provide different behavior. 1093 StmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 1094 VarDecl *CondVar, Stmt *Then, 1095 SourceLocation ElseLoc, Stmt *Else) { 1096 return getSema().ActOnIfStmt(IfLoc, Cond, CondVar, Then, ElseLoc, Else); 1097 } 1098 1099 /// \brief Start building a new switch statement. 1100 /// 1101 /// By default, performs semantic analysis to build the new statement. 1102 /// Subclasses may override this routine to provide different behavior. 1103 StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, 1104 Expr *Cond, VarDecl *CondVar) { 1105 return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Cond, 1106 CondVar); 1107 } 1108 1109 /// \brief Attach the body to the switch statement. 1110 /// 1111 /// By default, performs semantic analysis to build the new statement. 1112 /// Subclasses may override this routine to provide different behavior. 1113 StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 1114 Stmt *Switch, Stmt *Body) { 1115 return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body); 1116 } 1117 1118 /// \brief Build a new while statement. 1119 /// 1120 /// By default, performs semantic analysis to build the new statement. 1121 /// Subclasses may override this routine to provide different behavior. 1122 StmtResult RebuildWhileStmt(SourceLocation WhileLoc, Sema::FullExprArg Cond, 1123 VarDecl *CondVar, Stmt *Body) { 1124 return getSema().ActOnWhileStmt(WhileLoc, Cond, CondVar, Body); 1125 } 1126 1127 /// \brief Build a new do-while statement. 1128 /// 1129 /// By default, performs semantic analysis to build the new statement. 1130 /// Subclasses may override this routine to provide different behavior. 1131 StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body, 1132 SourceLocation WhileLoc, SourceLocation LParenLoc, 1133 Expr *Cond, SourceLocation RParenLoc) { 1134 return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc, 1135 Cond, RParenLoc); 1136 } 1137 1138 /// \brief Build a new for statement. 1139 /// 1140 /// By default, performs semantic analysis to build the new statement. 1141 /// Subclasses may override this routine to provide different behavior. 1142 StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, 1143 Stmt *Init, Sema::FullExprArg Cond, 1144 VarDecl *CondVar, Sema::FullExprArg Inc, 1145 SourceLocation RParenLoc, Stmt *Body) { 1146 return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond, 1147 CondVar, Inc, RParenLoc, Body); 1148 } 1149 1150 /// \brief Build a new goto statement. 1151 /// 1152 /// By default, performs semantic analysis to build the new statement. 1153 /// Subclasses may override this routine to provide different behavior. 1154 StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, 1155 LabelDecl *Label) { 1156 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label); 1157 } 1158 1159 /// \brief Build a new indirect goto statement. 1160 /// 1161 /// By default, performs semantic analysis to build the new statement. 1162 /// Subclasses may override this routine to provide different behavior. 1163 StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 1164 SourceLocation StarLoc, 1165 Expr *Target) { 1166 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target); 1167 } 1168 1169 /// \brief Build a new return statement. 1170 /// 1171 /// By default, performs semantic analysis to build the new statement. 1172 /// Subclasses may override this routine to provide different behavior. 1173 StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) { 1174 return getSema().ActOnReturnStmt(ReturnLoc, Result); 1175 } 1176 1177 /// \brief Build a new declaration statement. 1178 /// 1179 /// By default, performs semantic analysis to build the new statement. 1180 /// Subclasses may override this routine to provide different behavior. 1181 StmtResult RebuildDeclStmt(llvm::MutableArrayRef<Decl *> Decls, 1182 SourceLocation StartLoc, SourceLocation EndLoc) { 1183 Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls); 1184 return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc); 1185 } 1186 1187 /// \brief Build a new inline asm statement. 1188 /// 1189 /// By default, performs semantic analysis to build the new statement. 1190 /// Subclasses may override this routine to provide different behavior. 1191 StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple, 1192 bool IsVolatile, unsigned NumOutputs, 1193 unsigned NumInputs, IdentifierInfo **Names, 1194 MultiExprArg Constraints, MultiExprArg Exprs, 1195 Expr *AsmString, MultiExprArg Clobbers, 1196 SourceLocation RParenLoc) { 1197 return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs, 1198 NumInputs, Names, Constraints, Exprs, 1199 AsmString, Clobbers, RParenLoc); 1200 } 1201 1202 /// \brief Build a new MS style inline asm 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 RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc, 1207 ArrayRef<Token> AsmToks, 1208 StringRef AsmString, 1209 unsigned NumOutputs, unsigned NumInputs, 1210 ArrayRef<StringRef> Constraints, 1211 ArrayRef<StringRef> Clobbers, 1212 ArrayRef<Expr*> Exprs, 1213 SourceLocation EndLoc) { 1214 return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString, 1215 NumOutputs, NumInputs, 1216 Constraints, Clobbers, Exprs, EndLoc); 1217 } 1218 1219 /// \brief Build a new Objective-C \@try statement. 1220 /// 1221 /// By default, performs semantic analysis to build the new statement. 1222 /// Subclasses may override this routine to provide different behavior. 1223 StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc, 1224 Stmt *TryBody, 1225 MultiStmtArg CatchStmts, 1226 Stmt *Finally) { 1227 return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts, 1228 Finally); 1229 } 1230 1231 /// \brief Rebuild an Objective-C exception declaration. 1232 /// 1233 /// By default, performs semantic analysis to build the new declaration. 1234 /// Subclasses may override this routine to provide different behavior. 1235 VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl, 1236 TypeSourceInfo *TInfo, QualType T) { 1237 return getSema().BuildObjCExceptionDecl(TInfo, T, 1238 ExceptionDecl->getInnerLocStart(), 1239 ExceptionDecl->getLocation(), 1240 ExceptionDecl->getIdentifier()); 1241 } 1242 1243 /// \brief Build a new Objective-C \@catch 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 RebuildObjCAtCatchStmt(SourceLocation AtLoc, 1248 SourceLocation RParenLoc, 1249 VarDecl *Var, 1250 Stmt *Body) { 1251 return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc, 1252 Var, Body); 1253 } 1254 1255 /// \brief Build a new Objective-C \@finally statement. 1256 /// 1257 /// By default, performs semantic analysis to build the new statement. 1258 /// Subclasses may override this routine to provide different behavior. 1259 StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc, 1260 Stmt *Body) { 1261 return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body); 1262 } 1263 1264 /// \brief Build a new Objective-C \@throw statement. 1265 /// 1266 /// By default, performs semantic analysis to build the new statement. 1267 /// Subclasses may override this routine to provide different behavior. 1268 StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc, 1269 Expr *Operand) { 1270 return getSema().BuildObjCAtThrowStmt(AtLoc, Operand); 1271 } 1272 1273 /// \brief Build a new OpenMP parallel directive. 1274 /// 1275 /// By default, performs semantic analysis to build the new statement. 1276 /// Subclasses may override this routine to provide different behavior. 1277 StmtResult RebuildOMPParallelDirective(ArrayRef<OMPClause *> Clauses, 1278 Stmt *AStmt, 1279 SourceLocation StartLoc, 1280 SourceLocation EndLoc) { 1281 return getSema().ActOnOpenMPParallelDirective(Clauses, AStmt, 1282 StartLoc, EndLoc); 1283 } 1284 1285 /// \brief Build a new OpenMP 'default' clause. 1286 /// 1287 /// By default, performs semantic analysis to build the new statement. 1288 /// Subclasses may override this routine to provide different behavior. 1289 OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind, 1290 SourceLocation KindKwLoc, 1291 SourceLocation StartLoc, 1292 SourceLocation LParenLoc, 1293 SourceLocation EndLoc) { 1294 return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc, 1295 StartLoc, LParenLoc, EndLoc); 1296 } 1297 1298 /// \brief Build a new OpenMP 'private' clause. 1299 /// 1300 /// By default, performs semantic analysis to build the new statement. 1301 /// Subclasses may override this routine to provide different behavior. 1302 OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList, 1303 SourceLocation StartLoc, 1304 SourceLocation LParenLoc, 1305 SourceLocation EndLoc) { 1306 return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, 1307 EndLoc); 1308 } 1309 1310 OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList, 1311 SourceLocation StartLoc, 1312 SourceLocation LParenLoc, 1313 SourceLocation EndLoc) { 1314 return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, 1315 EndLoc); 1316 } 1317 1318 /// \brief Rebuild the operand to an Objective-C \@synchronized statement. 1319 /// 1320 /// By default, performs semantic analysis to build the new statement. 1321 /// Subclasses may override this routine to provide different behavior. 1322 ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc, 1323 Expr *object) { 1324 return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object); 1325 } 1326 1327 /// \brief Build a new Objective-C \@synchronized statement. 1328 /// 1329 /// By default, performs semantic analysis to build the new statement. 1330 /// Subclasses may override this routine to provide different behavior. 1331 StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc, 1332 Expr *Object, Stmt *Body) { 1333 return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body); 1334 } 1335 1336 /// \brief Build a new Objective-C \@autoreleasepool statement. 1337 /// 1338 /// By default, performs semantic analysis to build the new statement. 1339 /// Subclasses may override this routine to provide different behavior. 1340 StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc, 1341 Stmt *Body) { 1342 return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body); 1343 } 1344 1345 /// \brief Build a new Objective-C fast enumeration 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 RebuildObjCForCollectionStmt(SourceLocation ForLoc, 1350 Stmt *Element, 1351 Expr *Collection, 1352 SourceLocation RParenLoc, 1353 Stmt *Body) { 1354 StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc, 1355 Element, 1356 Collection, 1357 RParenLoc); 1358 if (ForEachStmt.isInvalid()) 1359 return StmtError(); 1360 1361 return getSema().FinishObjCForCollectionStmt(ForEachStmt.take(), Body); 1362 } 1363 1364 /// \brief Build a new C++ exception declaration. 1365 /// 1366 /// By default, performs semantic analysis to build the new decaration. 1367 /// Subclasses may override this routine to provide different behavior. 1368 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, 1369 TypeSourceInfo *Declarator, 1370 SourceLocation StartLoc, 1371 SourceLocation IdLoc, 1372 IdentifierInfo *Id) { 1373 VarDecl *Var = getSema().BuildExceptionDeclaration(0, Declarator, 1374 StartLoc, IdLoc, Id); 1375 if (Var) 1376 getSema().CurContext->addDecl(Var); 1377 return Var; 1378 } 1379 1380 /// \brief Build a new C++ catch statement. 1381 /// 1382 /// By default, performs semantic analysis to build the new statement. 1383 /// Subclasses may override this routine to provide different behavior. 1384 StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 1385 VarDecl *ExceptionDecl, 1386 Stmt *Handler) { 1387 return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 1388 Handler)); 1389 } 1390 1391 /// \brief Build a new C++ try statement. 1392 /// 1393 /// By default, performs semantic analysis to build the new statement. 1394 /// Subclasses may override this routine to provide different behavior. 1395 StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock, 1396 ArrayRef<Stmt *> Handlers) { 1397 return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers); 1398 } 1399 1400 /// \brief Build a new C++0x range-based for statement. 1401 /// 1402 /// By default, performs semantic analysis to build the new statement. 1403 /// Subclasses may override this routine to provide different behavior. 1404 StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc, 1405 SourceLocation ColonLoc, 1406 Stmt *Range, Stmt *BeginEnd, 1407 Expr *Cond, Expr *Inc, 1408 Stmt *LoopVar, 1409 SourceLocation RParenLoc) { 1410 // If we've just learned that the range is actually an Objective-C 1411 // collection, treat this as an Objective-C fast enumeration loop. 1412 if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) { 1413 if (RangeStmt->isSingleDecl()) { 1414 if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) { 1415 if (RangeVar->isInvalidDecl()) 1416 return StmtError(); 1417 1418 Expr *RangeExpr = RangeVar->getInit(); 1419 if (!RangeExpr->isTypeDependent() && 1420 RangeExpr->getType()->isObjCObjectPointerType()) 1421 return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar, RangeExpr, 1422 RParenLoc); 1423 } 1424 } 1425 } 1426 1427 return getSema().BuildCXXForRangeStmt(ForLoc, ColonLoc, Range, BeginEnd, 1428 Cond, Inc, LoopVar, RParenLoc, 1429 Sema::BFRK_Rebuild); 1430 } 1431 1432 /// \brief Build a new C++0x range-based for statement. 1433 /// 1434 /// By default, performs semantic analysis to build the new statement. 1435 /// Subclasses may override this routine to provide different behavior. 1436 StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc, 1437 bool IsIfExists, 1438 NestedNameSpecifierLoc QualifierLoc, 1439 DeclarationNameInfo NameInfo, 1440 Stmt *Nested) { 1441 return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists, 1442 QualifierLoc, NameInfo, Nested); 1443 } 1444 1445 /// \brief Attach body to a C++0x range-based for statement. 1446 /// 1447 /// By default, performs semantic analysis to finish the new statement. 1448 /// Subclasses may override this routine to provide different behavior. 1449 StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) { 1450 return getSema().FinishCXXForRangeStmt(ForRange, Body); 1451 } 1452 1453 StmtResult RebuildSEHTryStmt(bool IsCXXTry, 1454 SourceLocation TryLoc, 1455 Stmt *TryBlock, 1456 Stmt *Handler) { 1457 return getSema().ActOnSEHTryBlock(IsCXXTry,TryLoc,TryBlock,Handler); 1458 } 1459 1460 StmtResult RebuildSEHExceptStmt(SourceLocation Loc, 1461 Expr *FilterExpr, 1462 Stmt *Block) { 1463 return getSema().ActOnSEHExceptBlock(Loc,FilterExpr,Block); 1464 } 1465 1466 StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, 1467 Stmt *Block) { 1468 return getSema().ActOnSEHFinallyBlock(Loc,Block); 1469 } 1470 1471 /// \brief Build a new expression that references a declaration. 1472 /// 1473 /// By default, performs semantic analysis to build the new expression. 1474 /// Subclasses may override this routine to provide different behavior. 1475 ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS, 1476 LookupResult &R, 1477 bool RequiresADL) { 1478 return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL); 1479 } 1480 1481 1482 /// \brief Build a new expression that references a declaration. 1483 /// 1484 /// By default, performs semantic analysis to build the new expression. 1485 /// Subclasses may override this routine to provide different behavior. 1486 ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc, 1487 ValueDecl *VD, 1488 const DeclarationNameInfo &NameInfo, 1489 TemplateArgumentListInfo *TemplateArgs) { 1490 CXXScopeSpec SS; 1491 SS.Adopt(QualifierLoc); 1492 1493 // FIXME: loses template args. 1494 1495 return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD); 1496 } 1497 1498 /// \brief Build a new expression in parentheses. 1499 /// 1500 /// By default, performs semantic analysis to build the new expression. 1501 /// Subclasses may override this routine to provide different behavior. 1502 ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen, 1503 SourceLocation RParen) { 1504 return getSema().ActOnParenExpr(LParen, RParen, SubExpr); 1505 } 1506 1507 /// \brief Build a new pseudo-destructor expression. 1508 /// 1509 /// By default, performs semantic analysis to build the new expression. 1510 /// Subclasses may override this routine to provide different behavior. 1511 ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base, 1512 SourceLocation OperatorLoc, 1513 bool isArrow, 1514 CXXScopeSpec &SS, 1515 TypeSourceInfo *ScopeType, 1516 SourceLocation CCLoc, 1517 SourceLocation TildeLoc, 1518 PseudoDestructorTypeStorage Destroyed); 1519 1520 /// \brief Build a new unary operator expression. 1521 /// 1522 /// By default, performs semantic analysis to build the new expression. 1523 /// Subclasses may override this routine to provide different behavior. 1524 ExprResult RebuildUnaryOperator(SourceLocation OpLoc, 1525 UnaryOperatorKind Opc, 1526 Expr *SubExpr) { 1527 return getSema().BuildUnaryOp(/*Scope=*/0, OpLoc, Opc, SubExpr); 1528 } 1529 1530 /// \brief Build a new builtin offsetof expression. 1531 /// 1532 /// By default, performs semantic analysis to build the new expression. 1533 /// Subclasses may override this routine to provide different behavior. 1534 ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc, 1535 TypeSourceInfo *Type, 1536 Sema::OffsetOfComponent *Components, 1537 unsigned NumComponents, 1538 SourceLocation RParenLoc) { 1539 return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components, 1540 NumComponents, RParenLoc); 1541 } 1542 1543 /// \brief Build a new sizeof, alignof or vec_step expression with a 1544 /// type argument. 1545 /// 1546 /// By default, performs semantic analysis to build the new expression. 1547 /// Subclasses may override this routine to provide different behavior. 1548 ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo, 1549 SourceLocation OpLoc, 1550 UnaryExprOrTypeTrait ExprKind, 1551 SourceRange R) { 1552 return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R); 1553 } 1554 1555 /// \brief Build a new sizeof, alignof or vec step expression with an 1556 /// expression argument. 1557 /// 1558 /// By default, performs semantic analysis to build the new expression. 1559 /// Subclasses may override this routine to provide different behavior. 1560 ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc, 1561 UnaryExprOrTypeTrait ExprKind, 1562 SourceRange R) { 1563 ExprResult Result 1564 = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind); 1565 if (Result.isInvalid()) 1566 return ExprError(); 1567 1568 return Result; 1569 } 1570 1571 /// \brief Build a new array subscript expression. 1572 /// 1573 /// By default, performs semantic analysis to build the new expression. 1574 /// Subclasses may override this routine to provide different behavior. 1575 ExprResult RebuildArraySubscriptExpr(Expr *LHS, 1576 SourceLocation LBracketLoc, 1577 Expr *RHS, 1578 SourceLocation RBracketLoc) { 1579 return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, LHS, 1580 LBracketLoc, RHS, 1581 RBracketLoc); 1582 } 1583 1584 /// \brief Build a new call expression. 1585 /// 1586 /// By default, performs semantic analysis to build the new expression. 1587 /// Subclasses may override this routine to provide different behavior. 1588 ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc, 1589 MultiExprArg Args, 1590 SourceLocation RParenLoc, 1591 Expr *ExecConfig = 0) { 1592 return getSema().ActOnCallExpr(/*Scope=*/0, Callee, LParenLoc, 1593 Args, RParenLoc, ExecConfig); 1594 } 1595 1596 /// \brief Build a new member access expression. 1597 /// 1598 /// By default, performs semantic analysis to build the new expression. 1599 /// Subclasses may override this routine to provide different behavior. 1600 ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc, 1601 bool isArrow, 1602 NestedNameSpecifierLoc QualifierLoc, 1603 SourceLocation TemplateKWLoc, 1604 const DeclarationNameInfo &MemberNameInfo, 1605 ValueDecl *Member, 1606 NamedDecl *FoundDecl, 1607 const TemplateArgumentListInfo *ExplicitTemplateArgs, 1608 NamedDecl *FirstQualifierInScope) { 1609 ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base, 1610 isArrow); 1611 if (!Member->getDeclName()) { 1612 // We have a reference to an unnamed field. This is always the 1613 // base of an anonymous struct/union member access, i.e. the 1614 // field is always of record type. 1615 assert(!QualifierLoc && "Can't have an unnamed field with a qualifier!"); 1616 assert(Member->getType()->isRecordType() && 1617 "unnamed member not of record type?"); 1618 1619 BaseResult = 1620 getSema().PerformObjectMemberConversion(BaseResult.take(), 1621 QualifierLoc.getNestedNameSpecifier(), 1622 FoundDecl, Member); 1623 if (BaseResult.isInvalid()) 1624 return ExprError(); 1625 Base = BaseResult.take(); 1626 ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind(); 1627 MemberExpr *ME = 1628 new (getSema().Context) MemberExpr(Base, isArrow, 1629 Member, MemberNameInfo, 1630 cast<FieldDecl>(Member)->getType(), 1631 VK, OK_Ordinary); 1632 return getSema().Owned(ME); 1633 } 1634 1635 CXXScopeSpec SS; 1636 SS.Adopt(QualifierLoc); 1637 1638 Base = BaseResult.take(); 1639 QualType BaseType = Base->getType(); 1640 1641 // FIXME: this involves duplicating earlier analysis in a lot of 1642 // cases; we should avoid this when possible. 1643 LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName); 1644 R.addDecl(FoundDecl); 1645 R.resolveKind(); 1646 1647 return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow, 1648 SS, TemplateKWLoc, 1649 FirstQualifierInScope, 1650 R, ExplicitTemplateArgs); 1651 } 1652 1653 /// \brief Build a new binary operator expression. 1654 /// 1655 /// By default, performs semantic analysis to build the new expression. 1656 /// Subclasses may override this routine to provide different behavior. 1657 ExprResult RebuildBinaryOperator(SourceLocation OpLoc, 1658 BinaryOperatorKind Opc, 1659 Expr *LHS, Expr *RHS) { 1660 return getSema().BuildBinOp(/*Scope=*/0, OpLoc, Opc, LHS, RHS); 1661 } 1662 1663 /// \brief Build a new conditional operator expression. 1664 /// 1665 /// By default, performs semantic analysis to build the new expression. 1666 /// Subclasses may override this routine to provide different behavior. 1667 ExprResult RebuildConditionalOperator(Expr *Cond, 1668 SourceLocation QuestionLoc, 1669 Expr *LHS, 1670 SourceLocation ColonLoc, 1671 Expr *RHS) { 1672 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond, 1673 LHS, RHS); 1674 } 1675 1676 /// \brief Build a new C-style cast expression. 1677 /// 1678 /// By default, performs semantic analysis to build the new expression. 1679 /// Subclasses may override this routine to provide different behavior. 1680 ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc, 1681 TypeSourceInfo *TInfo, 1682 SourceLocation RParenLoc, 1683 Expr *SubExpr) { 1684 return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc, 1685 SubExpr); 1686 } 1687 1688 /// \brief Build a new compound literal expression. 1689 /// 1690 /// By default, performs semantic analysis to build the new expression. 1691 /// Subclasses may override this routine to provide different behavior. 1692 ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 1693 TypeSourceInfo *TInfo, 1694 SourceLocation RParenLoc, 1695 Expr *Init) { 1696 return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc, 1697 Init); 1698 } 1699 1700 /// \brief Build a new extended vector element access expression. 1701 /// 1702 /// By default, performs semantic analysis to build the new expression. 1703 /// Subclasses may override this routine to provide different behavior. 1704 ExprResult RebuildExtVectorElementExpr(Expr *Base, 1705 SourceLocation OpLoc, 1706 SourceLocation AccessorLoc, 1707 IdentifierInfo &Accessor) { 1708 1709 CXXScopeSpec SS; 1710 DeclarationNameInfo NameInfo(&Accessor, AccessorLoc); 1711 return getSema().BuildMemberReferenceExpr(Base, Base->getType(), 1712 OpLoc, /*IsArrow*/ false, 1713 SS, SourceLocation(), 1714 /*FirstQualifierInScope*/ 0, 1715 NameInfo, 1716 /* TemplateArgs */ 0); 1717 } 1718 1719 /// \brief Build a new initializer list expression. 1720 /// 1721 /// By default, performs semantic analysis to build the new expression. 1722 /// Subclasses may override this routine to provide different behavior. 1723 ExprResult RebuildInitList(SourceLocation LBraceLoc, 1724 MultiExprArg Inits, 1725 SourceLocation RBraceLoc, 1726 QualType ResultTy) { 1727 ExprResult Result 1728 = SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc); 1729 if (Result.isInvalid() || ResultTy->isDependentType()) 1730 return Result; 1731 1732 // Patch in the result type we were given, which may have been computed 1733 // when the initial InitListExpr was built. 1734 InitListExpr *ILE = cast<InitListExpr>((Expr *)Result.get()); 1735 ILE->setType(ResultTy); 1736 return Result; 1737 } 1738 1739 /// \brief Build a new designated initializer expression. 1740 /// 1741 /// By default, performs semantic analysis to build the new expression. 1742 /// Subclasses may override this routine to provide different behavior. 1743 ExprResult RebuildDesignatedInitExpr(Designation &Desig, 1744 MultiExprArg ArrayExprs, 1745 SourceLocation EqualOrColonLoc, 1746 bool GNUSyntax, 1747 Expr *Init) { 1748 ExprResult Result 1749 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1750 Init); 1751 if (Result.isInvalid()) 1752 return ExprError(); 1753 1754 return Result; 1755 } 1756 1757 /// \brief Build a new value-initialized expression. 1758 /// 1759 /// By default, builds the implicit value initialization without performing 1760 /// any semantic analysis. Subclasses may override this routine to provide 1761 /// different behavior. 1762 ExprResult RebuildImplicitValueInitExpr(QualType T) { 1763 return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1764 } 1765 1766 /// \brief Build a new \c va_arg expression. 1767 /// 1768 /// By default, performs semantic analysis to build the new expression. 1769 /// Subclasses may override this routine to provide different behavior. 1770 ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, 1771 Expr *SubExpr, TypeSourceInfo *TInfo, 1772 SourceLocation RParenLoc) { 1773 return getSema().BuildVAArgExpr(BuiltinLoc, 1774 SubExpr, TInfo, 1775 RParenLoc); 1776 } 1777 1778 /// \brief Build a new expression list in parentheses. 1779 /// 1780 /// By default, performs semantic analysis to build the new expression. 1781 /// Subclasses may override this routine to provide different behavior. 1782 ExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1783 MultiExprArg SubExprs, 1784 SourceLocation RParenLoc) { 1785 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs); 1786 } 1787 1788 /// \brief Build a new address-of-label expression. 1789 /// 1790 /// By default, performs semantic analysis, using the name of the label 1791 /// rather than attempting to map the label statement itself. 1792 /// Subclasses may override this routine to provide different behavior. 1793 ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1794 SourceLocation LabelLoc, LabelDecl *Label) { 1795 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label); 1796 } 1797 1798 /// \brief Build a new GNU statement expression. 1799 /// 1800 /// By default, performs semantic analysis to build the new expression. 1801 /// Subclasses may override this routine to provide different behavior. 1802 ExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1803 Stmt *SubStmt, 1804 SourceLocation RParenLoc) { 1805 return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc); 1806 } 1807 1808 /// \brief Build a new __builtin_choose_expr expression. 1809 /// 1810 /// By default, performs semantic analysis to build the new expression. 1811 /// Subclasses may override this routine to provide different behavior. 1812 ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1813 Expr *Cond, Expr *LHS, Expr *RHS, 1814 SourceLocation RParenLoc) { 1815 return SemaRef.ActOnChooseExpr(BuiltinLoc, 1816 Cond, LHS, RHS, 1817 RParenLoc); 1818 } 1819 1820 /// \brief Build a new generic selection expression. 1821 /// 1822 /// By default, performs semantic analysis to build the new expression. 1823 /// Subclasses may override this routine to provide different behavior. 1824 ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc, 1825 SourceLocation DefaultLoc, 1826 SourceLocation RParenLoc, 1827 Expr *ControllingExpr, 1828 ArrayRef<TypeSourceInfo *> Types, 1829 ArrayRef<Expr *> Exprs) { 1830 return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc, 1831 ControllingExpr, Types, Exprs); 1832 } 1833 1834 /// \brief Build a new overloaded operator call expression. 1835 /// 1836 /// By default, performs semantic analysis to build the new expression. 1837 /// The semantic analysis provides the behavior of template instantiation, 1838 /// copying with transformations that turn what looks like an overloaded 1839 /// operator call into a use of a builtin operator, performing 1840 /// argument-dependent lookup, etc. Subclasses may override this routine to 1841 /// provide different behavior. 1842 ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1843 SourceLocation OpLoc, 1844 Expr *Callee, 1845 Expr *First, 1846 Expr *Second); 1847 1848 /// \brief Build a new C++ "named" cast expression, such as static_cast or 1849 /// reinterpret_cast. 1850 /// 1851 /// By default, this routine dispatches to one of the more-specific routines 1852 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1853 /// Subclasses may override this routine to provide different behavior. 1854 ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1855 Stmt::StmtClass Class, 1856 SourceLocation LAngleLoc, 1857 TypeSourceInfo *TInfo, 1858 SourceLocation RAngleLoc, 1859 SourceLocation LParenLoc, 1860 Expr *SubExpr, 1861 SourceLocation RParenLoc) { 1862 switch (Class) { 1863 case Stmt::CXXStaticCastExprClass: 1864 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo, 1865 RAngleLoc, LParenLoc, 1866 SubExpr, RParenLoc); 1867 1868 case Stmt::CXXDynamicCastExprClass: 1869 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo, 1870 RAngleLoc, LParenLoc, 1871 SubExpr, RParenLoc); 1872 1873 case Stmt::CXXReinterpretCastExprClass: 1874 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo, 1875 RAngleLoc, LParenLoc, 1876 SubExpr, 1877 RParenLoc); 1878 1879 case Stmt::CXXConstCastExprClass: 1880 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo, 1881 RAngleLoc, LParenLoc, 1882 SubExpr, RParenLoc); 1883 1884 default: 1885 llvm_unreachable("Invalid C++ named cast"); 1886 } 1887 } 1888 1889 /// \brief Build a new C++ static_cast expression. 1890 /// 1891 /// By default, performs semantic analysis to build the new expression. 1892 /// Subclasses may override this routine to provide different behavior. 1893 ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1894 SourceLocation LAngleLoc, 1895 TypeSourceInfo *TInfo, 1896 SourceLocation RAngleLoc, 1897 SourceLocation LParenLoc, 1898 Expr *SubExpr, 1899 SourceLocation RParenLoc) { 1900 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast, 1901 TInfo, SubExpr, 1902 SourceRange(LAngleLoc, RAngleLoc), 1903 SourceRange(LParenLoc, RParenLoc)); 1904 } 1905 1906 /// \brief Build a new C++ dynamic_cast expression. 1907 /// 1908 /// By default, performs semantic analysis to build the new expression. 1909 /// Subclasses may override this routine to provide different behavior. 1910 ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1911 SourceLocation LAngleLoc, 1912 TypeSourceInfo *TInfo, 1913 SourceLocation RAngleLoc, 1914 SourceLocation LParenLoc, 1915 Expr *SubExpr, 1916 SourceLocation RParenLoc) { 1917 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 1918 TInfo, SubExpr, 1919 SourceRange(LAngleLoc, RAngleLoc), 1920 SourceRange(LParenLoc, RParenLoc)); 1921 } 1922 1923 /// \brief Build a new C++ reinterpret_cast expression. 1924 /// 1925 /// By default, performs semantic analysis to build the new expression. 1926 /// Subclasses may override this routine to provide different behavior. 1927 ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1928 SourceLocation LAngleLoc, 1929 TypeSourceInfo *TInfo, 1930 SourceLocation RAngleLoc, 1931 SourceLocation LParenLoc, 1932 Expr *SubExpr, 1933 SourceLocation RParenLoc) { 1934 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1935 TInfo, SubExpr, 1936 SourceRange(LAngleLoc, RAngleLoc), 1937 SourceRange(LParenLoc, RParenLoc)); 1938 } 1939 1940 /// \brief Build a new C++ const_cast expression. 1941 /// 1942 /// By default, performs semantic analysis to build the new expression. 1943 /// Subclasses may override this routine to provide different behavior. 1944 ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1945 SourceLocation LAngleLoc, 1946 TypeSourceInfo *TInfo, 1947 SourceLocation RAngleLoc, 1948 SourceLocation LParenLoc, 1949 Expr *SubExpr, 1950 SourceLocation RParenLoc) { 1951 return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast, 1952 TInfo, SubExpr, 1953 SourceRange(LAngleLoc, RAngleLoc), 1954 SourceRange(LParenLoc, RParenLoc)); 1955 } 1956 1957 /// \brief Build a new C++ functional-style cast expression. 1958 /// 1959 /// By default, performs semantic analysis to build the new expression. 1960 /// Subclasses may override this routine to provide different behavior. 1961 ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, 1962 SourceLocation LParenLoc, 1963 Expr *Sub, 1964 SourceLocation RParenLoc) { 1965 return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc, 1966 MultiExprArg(&Sub, 1), 1967 RParenLoc); 1968 } 1969 1970 /// \brief Build a new C++ typeid(type) expression. 1971 /// 1972 /// By default, performs semantic analysis to build the new expression. 1973 /// Subclasses may override this routine to provide different behavior. 1974 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 1975 SourceLocation TypeidLoc, 1976 TypeSourceInfo *Operand, 1977 SourceLocation RParenLoc) { 1978 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 1979 RParenLoc); 1980 } 1981 1982 1983 /// \brief Build a new C++ typeid(expr) expression. 1984 /// 1985 /// By default, performs semantic analysis to build the new expression. 1986 /// Subclasses may override this routine to provide different behavior. 1987 ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType, 1988 SourceLocation TypeidLoc, 1989 Expr *Operand, 1990 SourceLocation RParenLoc) { 1991 return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand, 1992 RParenLoc); 1993 } 1994 1995 /// \brief Build a new C++ __uuidof(type) expression. 1996 /// 1997 /// By default, performs semantic analysis to build the new expression. 1998 /// Subclasses may override this routine to provide different behavior. 1999 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2000 SourceLocation TypeidLoc, 2001 TypeSourceInfo *Operand, 2002 SourceLocation RParenLoc) { 2003 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2004 RParenLoc); 2005 } 2006 2007 /// \brief Build a new C++ __uuidof(expr) expression. 2008 /// 2009 /// By default, performs semantic analysis to build the new expression. 2010 /// Subclasses may override this routine to provide different behavior. 2011 ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType, 2012 SourceLocation TypeidLoc, 2013 Expr *Operand, 2014 SourceLocation RParenLoc) { 2015 return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand, 2016 RParenLoc); 2017 } 2018 2019 /// \brief Build a new C++ "this" expression. 2020 /// 2021 /// By default, builds a new "this" expression without performing any 2022 /// semantic analysis. Subclasses may override this routine to provide 2023 /// different behavior. 2024 ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 2025 QualType ThisType, 2026 bool isImplicit) { 2027 getSema().CheckCXXThisCapture(ThisLoc); 2028 return getSema().Owned( 2029 new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, 2030 isImplicit)); 2031 } 2032 2033 /// \brief Build a new C++ throw expression. 2034 /// 2035 /// By default, performs semantic analysis to build the new expression. 2036 /// Subclasses may override this routine to provide different behavior. 2037 ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub, 2038 bool IsThrownVariableInScope) { 2039 return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope); 2040 } 2041 2042 /// \brief Build a new C++ default-argument expression. 2043 /// 2044 /// By default, builds a new default-argument expression, which does not 2045 /// require any semantic analysis. Subclasses may override this routine to 2046 /// provide different behavior. 2047 ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, 2048 ParmVarDecl *Param) { 2049 return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Loc, 2050 Param)); 2051 } 2052 2053 /// \brief Build a new C++11 default-initialization expression. 2054 /// 2055 /// By default, builds a new default field initialization expression, which 2056 /// does not require any semantic analysis. Subclasses may override this 2057 /// routine to provide different behavior. 2058 ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc, 2059 FieldDecl *Field) { 2060 return getSema().Owned(CXXDefaultInitExpr::Create(getSema().Context, Loc, 2061 Field)); 2062 } 2063 2064 /// \brief Build a new C++ zero-initialization expression. 2065 /// 2066 /// By default, performs semantic analysis to build the new expression. 2067 /// Subclasses may override this routine to provide different behavior. 2068 ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo, 2069 SourceLocation LParenLoc, 2070 SourceLocation RParenLoc) { 2071 return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, 2072 None, RParenLoc); 2073 } 2074 2075 /// \brief Build a new C++ "new" expression. 2076 /// 2077 /// By default, performs semantic analysis to build the new expression. 2078 /// Subclasses may override this routine to provide different behavior. 2079 ExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 2080 bool UseGlobal, 2081 SourceLocation PlacementLParen, 2082 MultiExprArg PlacementArgs, 2083 SourceLocation PlacementRParen, 2084 SourceRange TypeIdParens, 2085 QualType AllocatedType, 2086 TypeSourceInfo *AllocatedTypeInfo, 2087 Expr *ArraySize, 2088 SourceRange DirectInitRange, 2089 Expr *Initializer) { 2090 return getSema().BuildCXXNew(StartLoc, UseGlobal, 2091 PlacementLParen, 2092 PlacementArgs, 2093 PlacementRParen, 2094 TypeIdParens, 2095 AllocatedType, 2096 AllocatedTypeInfo, 2097 ArraySize, 2098 DirectInitRange, 2099 Initializer); 2100 } 2101 2102 /// \brief Build a new C++ "delete" expression. 2103 /// 2104 /// By default, performs semantic analysis to build the new expression. 2105 /// Subclasses may override this routine to provide different behavior. 2106 ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 2107 bool IsGlobalDelete, 2108 bool IsArrayForm, 2109 Expr *Operand) { 2110 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 2111 Operand); 2112 } 2113 2114 /// \brief Build a new unary type trait expression. 2115 /// 2116 /// By default, performs semantic analysis to build the new expression. 2117 /// Subclasses may override this routine to provide different behavior. 2118 ExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 2119 SourceLocation StartLoc, 2120 TypeSourceInfo *T, 2121 SourceLocation RParenLoc) { 2122 return getSema().BuildUnaryTypeTrait(Trait, StartLoc, T, RParenLoc); 2123 } 2124 2125 /// \brief Build a new binary type trait expression. 2126 /// 2127 /// By default, performs semantic analysis to build the new expression. 2128 /// Subclasses may override this routine to provide different behavior. 2129 ExprResult RebuildBinaryTypeTrait(BinaryTypeTrait Trait, 2130 SourceLocation StartLoc, 2131 TypeSourceInfo *LhsT, 2132 TypeSourceInfo *RhsT, 2133 SourceLocation RParenLoc) { 2134 return getSema().BuildBinaryTypeTrait(Trait, StartLoc, LhsT, RhsT, RParenLoc); 2135 } 2136 2137 /// \brief Build a new type trait expression. 2138 /// 2139 /// By default, performs semantic analysis to build the new expression. 2140 /// Subclasses may override this routine to provide different behavior. 2141 ExprResult RebuildTypeTrait(TypeTrait Trait, 2142 SourceLocation StartLoc, 2143 ArrayRef<TypeSourceInfo *> Args, 2144 SourceLocation RParenLoc) { 2145 return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc); 2146 } 2147 2148 /// \brief Build a new array type trait expression. 2149 /// 2150 /// By default, performs semantic analysis to build the new expression. 2151 /// Subclasses may override this routine to provide different behavior. 2152 ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait, 2153 SourceLocation StartLoc, 2154 TypeSourceInfo *TSInfo, 2155 Expr *DimExpr, 2156 SourceLocation RParenLoc) { 2157 return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc); 2158 } 2159 2160 /// \brief Build a new expression trait expression. 2161 /// 2162 /// By default, performs semantic analysis to build the new expression. 2163 /// Subclasses may override this routine to provide different behavior. 2164 ExprResult RebuildExpressionTrait(ExpressionTrait Trait, 2165 SourceLocation StartLoc, 2166 Expr *Queried, 2167 SourceLocation RParenLoc) { 2168 return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc); 2169 } 2170 2171 /// \brief Build a new (previously unresolved) declaration reference 2172 /// expression. 2173 /// 2174 /// By default, performs semantic analysis to build the new expression. 2175 /// Subclasses may override this routine to provide different behavior. 2176 ExprResult RebuildDependentScopeDeclRefExpr( 2177 NestedNameSpecifierLoc QualifierLoc, 2178 SourceLocation TemplateKWLoc, 2179 const DeclarationNameInfo &NameInfo, 2180 const TemplateArgumentListInfo *TemplateArgs, 2181 bool IsAddressOfOperand) { 2182 CXXScopeSpec SS; 2183 SS.Adopt(QualifierLoc); 2184 2185 if (TemplateArgs || TemplateKWLoc.isValid()) 2186 return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, 2187 NameInfo, TemplateArgs); 2188 2189 return getSema().BuildQualifiedDeclarationNameExpr(SS, NameInfo, 2190 IsAddressOfOperand); 2191 } 2192 2193 /// \brief Build a new template-id expression. 2194 /// 2195 /// By default, performs semantic analysis to build the new expression. 2196 /// Subclasses may override this routine to provide different behavior. 2197 ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS, 2198 SourceLocation TemplateKWLoc, 2199 LookupResult &R, 2200 bool RequiresADL, 2201 const TemplateArgumentListInfo *TemplateArgs) { 2202 return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL, 2203 TemplateArgs); 2204 } 2205 2206 /// \brief Build a new object-construction expression. 2207 /// 2208 /// By default, performs semantic analysis to build the new expression. 2209 /// Subclasses may override this routine to provide different behavior. 2210 ExprResult RebuildCXXConstructExpr(QualType T, 2211 SourceLocation Loc, 2212 CXXConstructorDecl *Constructor, 2213 bool IsElidable, 2214 MultiExprArg Args, 2215 bool HadMultipleCandidates, 2216 bool ListInitialization, 2217 bool RequiresZeroInit, 2218 CXXConstructExpr::ConstructionKind ConstructKind, 2219 SourceRange ParenRange) { 2220 SmallVector<Expr*, 8> ConvertedArgs; 2221 if (getSema().CompleteConstructorCall(Constructor, Args, Loc, 2222 ConvertedArgs)) 2223 return ExprError(); 2224 2225 return getSema().BuildCXXConstructExpr(Loc, T, Constructor, IsElidable, 2226 ConvertedArgs, 2227 HadMultipleCandidates, 2228 ListInitialization, 2229 RequiresZeroInit, ConstructKind, 2230 ParenRange); 2231 } 2232 2233 /// \brief Build a new object-construction expression. 2234 /// 2235 /// By default, performs semantic analysis to build the new expression. 2236 /// Subclasses may override this routine to provide different behavior. 2237 ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo, 2238 SourceLocation LParenLoc, 2239 MultiExprArg Args, 2240 SourceLocation RParenLoc) { 2241 return getSema().BuildCXXTypeConstructExpr(TSInfo, 2242 LParenLoc, 2243 Args, 2244 RParenLoc); 2245 } 2246 2247 /// \brief Build a new object-construction expression. 2248 /// 2249 /// By default, performs semantic analysis to build the new expression. 2250 /// Subclasses may override this routine to provide different behavior. 2251 ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo, 2252 SourceLocation LParenLoc, 2253 MultiExprArg Args, 2254 SourceLocation RParenLoc) { 2255 return getSema().BuildCXXTypeConstructExpr(TSInfo, 2256 LParenLoc, 2257 Args, 2258 RParenLoc); 2259 } 2260 2261 /// \brief Build a new member reference expression. 2262 /// 2263 /// By default, performs semantic analysis to build the new expression. 2264 /// Subclasses may override this routine to provide different behavior. 2265 ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE, 2266 QualType BaseType, 2267 bool IsArrow, 2268 SourceLocation OperatorLoc, 2269 NestedNameSpecifierLoc QualifierLoc, 2270 SourceLocation TemplateKWLoc, 2271 NamedDecl *FirstQualifierInScope, 2272 const DeclarationNameInfo &MemberNameInfo, 2273 const TemplateArgumentListInfo *TemplateArgs) { 2274 CXXScopeSpec SS; 2275 SS.Adopt(QualifierLoc); 2276 2277 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2278 OperatorLoc, IsArrow, 2279 SS, TemplateKWLoc, 2280 FirstQualifierInScope, 2281 MemberNameInfo, 2282 TemplateArgs); 2283 } 2284 2285 /// \brief Build a new member reference expression. 2286 /// 2287 /// By default, performs semantic analysis to build the new expression. 2288 /// Subclasses may override this routine to provide different behavior. 2289 ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType, 2290 SourceLocation OperatorLoc, 2291 bool IsArrow, 2292 NestedNameSpecifierLoc QualifierLoc, 2293 SourceLocation TemplateKWLoc, 2294 NamedDecl *FirstQualifierInScope, 2295 LookupResult &R, 2296 const TemplateArgumentListInfo *TemplateArgs) { 2297 CXXScopeSpec SS; 2298 SS.Adopt(QualifierLoc); 2299 2300 return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType, 2301 OperatorLoc, IsArrow, 2302 SS, TemplateKWLoc, 2303 FirstQualifierInScope, 2304 R, TemplateArgs); 2305 } 2306 2307 /// \brief Build a new noexcept expression. 2308 /// 2309 /// By default, performs semantic analysis to build the new expression. 2310 /// Subclasses may override this routine to provide different behavior. 2311 ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) { 2312 return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd()); 2313 } 2314 2315 /// \brief Build a new expression to compute the length of a parameter pack. 2316 ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc, NamedDecl *Pack, 2317 SourceLocation PackLoc, 2318 SourceLocation RParenLoc, 2319 Optional<unsigned> Length) { 2320 if (Length) 2321 return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(), 2322 OperatorLoc, Pack, PackLoc, 2323 RParenLoc, *Length); 2324 2325 return new (SemaRef.Context) SizeOfPackExpr(SemaRef.Context.getSizeType(), 2326 OperatorLoc, Pack, PackLoc, 2327 RParenLoc); 2328 } 2329 2330 /// \brief Build a new Objective-C boxed expression. 2331 /// 2332 /// By default, performs semantic analysis to build the new expression. 2333 /// Subclasses may override this routine to provide different behavior. 2334 ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) { 2335 return getSema().BuildObjCBoxedExpr(SR, ValueExpr); 2336 } 2337 2338 /// \brief Build a new Objective-C array literal. 2339 /// 2340 /// By default, performs semantic analysis to build the new expression. 2341 /// Subclasses may override this routine to provide different behavior. 2342 ExprResult RebuildObjCArrayLiteral(SourceRange Range, 2343 Expr **Elements, unsigned NumElements) { 2344 return getSema().BuildObjCArrayLiteral(Range, 2345 MultiExprArg(Elements, NumElements)); 2346 } 2347 2348 ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB, 2349 Expr *Base, Expr *Key, 2350 ObjCMethodDecl *getterMethod, 2351 ObjCMethodDecl *setterMethod) { 2352 return getSema().BuildObjCSubscriptExpression(RB, Base, Key, 2353 getterMethod, setterMethod); 2354 } 2355 2356 /// \brief Build a new Objective-C dictionary literal. 2357 /// 2358 /// By default, performs semantic analysis to build the new expression. 2359 /// Subclasses may override this routine to provide different behavior. 2360 ExprResult RebuildObjCDictionaryLiteral(SourceRange Range, 2361 ObjCDictionaryElement *Elements, 2362 unsigned NumElements) { 2363 return getSema().BuildObjCDictionaryLiteral(Range, Elements, NumElements); 2364 } 2365 2366 /// \brief Build a new Objective-C \@encode expression. 2367 /// 2368 /// By default, performs semantic analysis to build the new expression. 2369 /// Subclasses may override this routine to provide different behavior. 2370 ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 2371 TypeSourceInfo *EncodeTypeInfo, 2372 SourceLocation RParenLoc) { 2373 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, 2374 RParenLoc)); 2375 } 2376 2377 /// \brief Build a new Objective-C class message. 2378 ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo, 2379 Selector Sel, 2380 ArrayRef<SourceLocation> SelectorLocs, 2381 ObjCMethodDecl *Method, 2382 SourceLocation LBracLoc, 2383 MultiExprArg Args, 2384 SourceLocation RBracLoc) { 2385 return SemaRef.BuildClassMessage(ReceiverTypeInfo, 2386 ReceiverTypeInfo->getType(), 2387 /*SuperLoc=*/SourceLocation(), 2388 Sel, Method, LBracLoc, SelectorLocs, 2389 RBracLoc, Args); 2390 } 2391 2392 /// \brief Build a new Objective-C instance message. 2393 ExprResult RebuildObjCMessageExpr(Expr *Receiver, 2394 Selector Sel, 2395 ArrayRef<SourceLocation> SelectorLocs, 2396 ObjCMethodDecl *Method, 2397 SourceLocation LBracLoc, 2398 MultiExprArg Args, 2399 SourceLocation RBracLoc) { 2400 return SemaRef.BuildInstanceMessage(Receiver, 2401 Receiver->getType(), 2402 /*SuperLoc=*/SourceLocation(), 2403 Sel, Method, LBracLoc, SelectorLocs, 2404 RBracLoc, Args); 2405 } 2406 2407 /// \brief Build a new Objective-C ivar reference 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 RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar, 2412 SourceLocation IvarLoc, 2413 bool IsArrow, bool IsFreeIvar) { 2414 // FIXME: We lose track of the IsFreeIvar bit. 2415 CXXScopeSpec SS; 2416 ExprResult Base = getSema().Owned(BaseArg); 2417 LookupResult R(getSema(), Ivar->getDeclName(), IvarLoc, 2418 Sema::LookupMemberName); 2419 ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 2420 /*FIME:*/IvarLoc, 2421 SS, 0, 2422 false); 2423 if (Result.isInvalid() || Base.isInvalid()) 2424 return ExprError(); 2425 2426 if (Result.get()) 2427 return Result; 2428 2429 return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(), 2430 /*FIXME:*/IvarLoc, IsArrow, 2431 SS, SourceLocation(), 2432 /*FirstQualifierInScope=*/0, 2433 R, 2434 /*TemplateArgs=*/0); 2435 } 2436 2437 /// \brief Build a new Objective-C property reference expression. 2438 /// 2439 /// By default, performs semantic analysis to build the new expression. 2440 /// Subclasses may override this routine to provide different behavior. 2441 ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg, 2442 ObjCPropertyDecl *Property, 2443 SourceLocation PropertyLoc) { 2444 CXXScopeSpec SS; 2445 ExprResult Base = getSema().Owned(BaseArg); 2446 LookupResult R(getSema(), Property->getDeclName(), PropertyLoc, 2447 Sema::LookupMemberName); 2448 bool IsArrow = false; 2449 ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 2450 /*FIME:*/PropertyLoc, 2451 SS, 0, false); 2452 if (Result.isInvalid() || Base.isInvalid()) 2453 return ExprError(); 2454 2455 if (Result.get()) 2456 return Result; 2457 2458 return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(), 2459 /*FIXME:*/PropertyLoc, IsArrow, 2460 SS, SourceLocation(), 2461 /*FirstQualifierInScope=*/0, 2462 R, 2463 /*TemplateArgs=*/0); 2464 } 2465 2466 /// \brief Build a new Objective-C property reference expression. 2467 /// 2468 /// By default, performs semantic analysis to build the new expression. 2469 /// Subclasses may override this routine to provide different behavior. 2470 ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T, 2471 ObjCMethodDecl *Getter, 2472 ObjCMethodDecl *Setter, 2473 SourceLocation PropertyLoc) { 2474 // Since these expressions can only be value-dependent, we do not 2475 // need to perform semantic analysis again. 2476 return Owned( 2477 new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T, 2478 VK_LValue, OK_ObjCProperty, 2479 PropertyLoc, Base)); 2480 } 2481 2482 /// \brief Build a new Objective-C "isa" expression. 2483 /// 2484 /// By default, performs semantic analysis to build the new expression. 2485 /// Subclasses may override this routine to provide different behavior. 2486 ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc, 2487 SourceLocation OpLoc, 2488 bool IsArrow) { 2489 CXXScopeSpec SS; 2490 ExprResult Base = getSema().Owned(BaseArg); 2491 LookupResult R(getSema(), &getSema().Context.Idents.get("isa"), IsaLoc, 2492 Sema::LookupMemberName); 2493 ExprResult Result = getSema().LookupMemberExpr(R, Base, IsArrow, 2494 OpLoc, 2495 SS, 0, false); 2496 if (Result.isInvalid() || Base.isInvalid()) 2497 return ExprError(); 2498 2499 if (Result.get()) 2500 return Result; 2501 2502 return getSema().BuildMemberReferenceExpr(Base.get(), Base.get()->getType(), 2503 OpLoc, IsArrow, 2504 SS, SourceLocation(), 2505 /*FirstQualifierInScope=*/0, 2506 R, 2507 /*TemplateArgs=*/0); 2508 } 2509 2510 /// \brief Build a new shuffle vector 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 RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 2515 MultiExprArg SubExprs, 2516 SourceLocation RParenLoc) { 2517 // Find the declaration for __builtin_shufflevector 2518 const IdentifierInfo &Name 2519 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 2520 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 2521 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 2522 assert(!Lookup.empty() && "No __builtin_shufflevector?"); 2523 2524 // Build a reference to the __builtin_shufflevector builtin 2525 FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front()); 2526 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, false, 2527 SemaRef.Context.BuiltinFnTy, 2528 VK_RValue, BuiltinLoc); 2529 QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType()); 2530 Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy, 2531 CK_BuiltinFnToFnPtr).take(); 2532 2533 // Build the CallExpr 2534 ExprResult TheCall = SemaRef.Owned( 2535 new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, SubExprs, 2536 Builtin->getCallResultType(), 2537 Expr::getValueKindForType(Builtin->getResultType()), 2538 RParenLoc)); 2539 2540 // Type-check the __builtin_shufflevector expression. 2541 return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.take())); 2542 } 2543 2544 /// \brief Build a new template argument pack expansion. 2545 /// 2546 /// By default, performs semantic analysis to build a new pack expansion 2547 /// for a template argument. Subclasses may override this routine to provide 2548 /// different behavior. 2549 TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern, 2550 SourceLocation EllipsisLoc, 2551 Optional<unsigned> NumExpansions) { 2552 switch (Pattern.getArgument().getKind()) { 2553 case TemplateArgument::Expression: { 2554 ExprResult Result 2555 = getSema().CheckPackExpansion(Pattern.getSourceExpression(), 2556 EllipsisLoc, NumExpansions); 2557 if (Result.isInvalid()) 2558 return TemplateArgumentLoc(); 2559 2560 return TemplateArgumentLoc(Result.get(), Result.get()); 2561 } 2562 2563 case TemplateArgument::Template: 2564 return TemplateArgumentLoc(TemplateArgument( 2565 Pattern.getArgument().getAsTemplate(), 2566 NumExpansions), 2567 Pattern.getTemplateQualifierLoc(), 2568 Pattern.getTemplateNameLoc(), 2569 EllipsisLoc); 2570 2571 case TemplateArgument::Null: 2572 case TemplateArgument::Integral: 2573 case TemplateArgument::Declaration: 2574 case TemplateArgument::Pack: 2575 case TemplateArgument::TemplateExpansion: 2576 case TemplateArgument::NullPtr: 2577 llvm_unreachable("Pack expansion pattern has no parameter packs"); 2578 2579 case TemplateArgument::Type: 2580 if (TypeSourceInfo *Expansion 2581 = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(), 2582 EllipsisLoc, 2583 NumExpansions)) 2584 return TemplateArgumentLoc(TemplateArgument(Expansion->getType()), 2585 Expansion); 2586 break; 2587 } 2588 2589 return TemplateArgumentLoc(); 2590 } 2591 2592 /// \brief Build a new expression pack expansion. 2593 /// 2594 /// By default, performs semantic analysis to build a new pack expansion 2595 /// for an expression. Subclasses may override this routine to provide 2596 /// different behavior. 2597 ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc, 2598 Optional<unsigned> NumExpansions) { 2599 return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions); 2600 } 2601 2602 /// \brief Build a new atomic operation expression. 2603 /// 2604 /// By default, performs semantic analysis to build the new expression. 2605 /// Subclasses may override this routine to provide different behavior. 2606 ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, 2607 MultiExprArg SubExprs, 2608 QualType RetTy, 2609 AtomicExpr::AtomicOp Op, 2610 SourceLocation RParenLoc) { 2611 // Just create the expression; there is not any interesting semantic 2612 // analysis here because we can't actually build an AtomicExpr until 2613 // we are sure it is semantically sound. 2614 return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op, 2615 RParenLoc); 2616 } 2617 2618private: 2619 TypeLoc TransformTypeInObjectScope(TypeLoc TL, 2620 QualType ObjectType, 2621 NamedDecl *FirstQualifierInScope, 2622 CXXScopeSpec &SS); 2623 2624 TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 2625 QualType ObjectType, 2626 NamedDecl *FirstQualifierInScope, 2627 CXXScopeSpec &SS); 2628}; 2629 2630template<typename Derived> 2631StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 2632 if (!S) 2633 return SemaRef.Owned(S); 2634 2635 switch (S->getStmtClass()) { 2636 case Stmt::NoStmtClass: break; 2637 2638 // Transform individual statement nodes 2639#define STMT(Node, Parent) \ 2640 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 2641#define ABSTRACT_STMT(Node) 2642#define EXPR(Node, Parent) 2643#include "clang/AST/StmtNodes.inc" 2644 2645 // Transform expressions by calling TransformExpr. 2646#define STMT(Node, Parent) 2647#define ABSTRACT_STMT(Stmt) 2648#define EXPR(Node, Parent) case Stmt::Node##Class: 2649#include "clang/AST/StmtNodes.inc" 2650 { 2651 ExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 2652 if (E.isInvalid()) 2653 return StmtError(); 2654 2655 return getSema().ActOnExprStmt(E); 2656 } 2657 } 2658 2659 return SemaRef.Owned(S); 2660} 2661 2662template<typename Derived> 2663OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) { 2664 if (!S) 2665 return S; 2666 2667 switch (S->getClauseKind()) { 2668 default: break; 2669 // Transform individual clause nodes 2670#define OPENMP_CLAUSE(Name, Class) \ 2671 case OMPC_ ## Name : \ 2672 return getDerived().Transform ## Class(cast<Class>(S)); 2673#include "clang/Basic/OpenMPKinds.def" 2674 } 2675 2676 return S; 2677} 2678 2679 2680template<typename Derived> 2681ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) { 2682 if (!E) 2683 return SemaRef.Owned(E); 2684 2685 switch (E->getStmtClass()) { 2686 case Stmt::NoStmtClass: break; 2687#define STMT(Node, Parent) case Stmt::Node##Class: break; 2688#define ABSTRACT_STMT(Stmt) 2689#define EXPR(Node, Parent) \ 2690 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 2691#include "clang/AST/StmtNodes.inc" 2692 } 2693 2694 return SemaRef.Owned(E); 2695} 2696 2697template<typename Derived> 2698ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init, 2699 bool CXXDirectInit) { 2700 // Initializers are instantiated like expressions, except that various outer 2701 // layers are stripped. 2702 if (!Init) 2703 return SemaRef.Owned(Init); 2704 2705 if (ExprWithCleanups *ExprTemp = dyn_cast<ExprWithCleanups>(Init)) 2706 Init = ExprTemp->getSubExpr(); 2707 2708 if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init)) 2709 Init = MTE->GetTemporaryExpr(); 2710 2711 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 2712 Init = Binder->getSubExpr(); 2713 2714 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 2715 Init = ICE->getSubExprAsWritten(); 2716 2717 if (CXXStdInitializerListExpr *ILE = 2718 dyn_cast<CXXStdInitializerListExpr>(Init)) 2719 return TransformInitializer(ILE->getSubExpr(), CXXDirectInit); 2720 2721 // If this is not a direct-initializer, we only need to reconstruct 2722 // InitListExprs. Other forms of copy-initialization will be a no-op if 2723 // the initializer is already the right type. 2724 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 2725 if (!CXXDirectInit && !(Construct && Construct->isListInitialization())) 2726 return getDerived().TransformExpr(Init); 2727 2728 // Revert value-initialization back to empty parens. 2729 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 2730 SourceRange Parens = VIE->getSourceRange(); 2731 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 2732 Parens.getEnd()); 2733 } 2734 2735 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 2736 if (isa<ImplicitValueInitExpr>(Init)) 2737 return getDerived().RebuildParenListExpr(SourceLocation(), None, 2738 SourceLocation()); 2739 2740 // Revert initialization by constructor back to a parenthesized or braced list 2741 // of expressions. Any other form of initializer can just be reused directly. 2742 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 2743 return getDerived().TransformExpr(Init); 2744 2745 SmallVector<Expr*, 8> NewArgs; 2746 bool ArgChanged = false; 2747 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 2748 /*IsCall*/true, NewArgs, &ArgChanged)) 2749 return ExprError(); 2750 2751 // If this was list initialization, revert to list form. 2752 if (Construct->isListInitialization()) 2753 return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs, 2754 Construct->getLocEnd(), 2755 Construct->getType()); 2756 2757 // Build a ParenListExpr to represent anything else. 2758 SourceRange Parens = Construct->getParenRange(); 2759 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 2760 Parens.getEnd()); 2761} 2762 2763template<typename Derived> 2764bool TreeTransform<Derived>::TransformExprs(Expr **Inputs, 2765 unsigned NumInputs, 2766 bool IsCall, 2767 SmallVectorImpl<Expr *> &Outputs, 2768 bool *ArgChanged) { 2769 for (unsigned I = 0; I != NumInputs; ++I) { 2770 // If requested, drop call arguments that need to be dropped. 2771 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 2772 if (ArgChanged) 2773 *ArgChanged = true; 2774 2775 break; 2776 } 2777 2778 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 2779 Expr *Pattern = Expansion->getPattern(); 2780 2781 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 2782 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 2783 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 2784 2785 // Determine whether the set of unexpanded parameter packs can and should 2786 // be expanded. 2787 bool Expand = true; 2788 bool RetainExpansion = false; 2789 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 2790 Optional<unsigned> NumExpansions = OrigNumExpansions; 2791 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 2792 Pattern->getSourceRange(), 2793 Unexpanded, 2794 Expand, RetainExpansion, 2795 NumExpansions)) 2796 return true; 2797 2798 if (!Expand) { 2799 // The transform has determined that we should perform a simple 2800 // transformation on the pack expansion, producing another pack 2801 // expansion. 2802 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 2803 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 2804 if (OutPattern.isInvalid()) 2805 return true; 2806 2807 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 2808 Expansion->getEllipsisLoc(), 2809 NumExpansions); 2810 if (Out.isInvalid()) 2811 return true; 2812 2813 if (ArgChanged) 2814 *ArgChanged = true; 2815 Outputs.push_back(Out.get()); 2816 continue; 2817 } 2818 2819 // Record right away that the argument was changed. This needs 2820 // to happen even if the array expands to nothing. 2821 if (ArgChanged) *ArgChanged = true; 2822 2823 // The transform has determined that we should perform an elementwise 2824 // expansion of the pattern. Do so. 2825 for (unsigned I = 0; I != *NumExpansions; ++I) { 2826 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 2827 ExprResult Out = getDerived().TransformExpr(Pattern); 2828 if (Out.isInvalid()) 2829 return true; 2830 2831 if (Out.get()->containsUnexpandedParameterPack()) { 2832 Out = RebuildPackExpansion(Out.get(), Expansion->getEllipsisLoc(), 2833 OrigNumExpansions); 2834 if (Out.isInvalid()) 2835 return true; 2836 } 2837 2838 Outputs.push_back(Out.get()); 2839 } 2840 2841 continue; 2842 } 2843 2844 ExprResult Result = 2845 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 2846 : getDerived().TransformExpr(Inputs[I]); 2847 if (Result.isInvalid()) 2848 return true; 2849 2850 if (Result.get() != Inputs[I] && ArgChanged) 2851 *ArgChanged = true; 2852 2853 Outputs.push_back(Result.get()); 2854 } 2855 2856 return false; 2857} 2858 2859template<typename Derived> 2860NestedNameSpecifierLoc 2861TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 2862 NestedNameSpecifierLoc NNS, 2863 QualType ObjectType, 2864 NamedDecl *FirstQualifierInScope) { 2865 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 2866 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 2867 Qualifier = Qualifier.getPrefix()) 2868 Qualifiers.push_back(Qualifier); 2869 2870 CXXScopeSpec SS; 2871 while (!Qualifiers.empty()) { 2872 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 2873 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 2874 2875 switch (QNNS->getKind()) { 2876 case NestedNameSpecifier::Identifier: 2877 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/0, 2878 *QNNS->getAsIdentifier(), 2879 Q.getLocalBeginLoc(), 2880 Q.getLocalEndLoc(), 2881 ObjectType, false, SS, 2882 FirstQualifierInScope, false)) 2883 return NestedNameSpecifierLoc(); 2884 2885 break; 2886 2887 case NestedNameSpecifier::Namespace: { 2888 NamespaceDecl *NS 2889 = cast_or_null<NamespaceDecl>( 2890 getDerived().TransformDecl( 2891 Q.getLocalBeginLoc(), 2892 QNNS->getAsNamespace())); 2893 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 2894 break; 2895 } 2896 2897 case NestedNameSpecifier::NamespaceAlias: { 2898 NamespaceAliasDecl *Alias 2899 = cast_or_null<NamespaceAliasDecl>( 2900 getDerived().TransformDecl(Q.getLocalBeginLoc(), 2901 QNNS->getAsNamespaceAlias())); 2902 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 2903 Q.getLocalEndLoc()); 2904 break; 2905 } 2906 2907 case NestedNameSpecifier::Global: 2908 // There is no meaningful transformation that one could perform on the 2909 // global scope. 2910 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 2911 break; 2912 2913 case NestedNameSpecifier::TypeSpecWithTemplate: 2914 case NestedNameSpecifier::TypeSpec: { 2915 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 2916 FirstQualifierInScope, SS); 2917 2918 if (!TL) 2919 return NestedNameSpecifierLoc(); 2920 2921 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 2922 (SemaRef.getLangOpts().CPlusPlus11 && 2923 TL.getType()->isEnumeralType())) { 2924 assert(!TL.getType().hasLocalQualifiers() && 2925 "Can't get cv-qualifiers here"); 2926 if (TL.getType()->isEnumeralType()) 2927 SemaRef.Diag(TL.getBeginLoc(), 2928 diag::warn_cxx98_compat_enum_nested_name_spec); 2929 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 2930 Q.getLocalEndLoc()); 2931 break; 2932 } 2933 // If the nested-name-specifier is an invalid type def, don't emit an 2934 // error because a previous error should have already been emitted. 2935 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 2936 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 2937 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 2938 << TL.getType() << SS.getRange(); 2939 } 2940 return NestedNameSpecifierLoc(); 2941 } 2942 } 2943 2944 // The qualifier-in-scope and object type only apply to the leftmost entity. 2945 FirstQualifierInScope = 0; 2946 ObjectType = QualType(); 2947 } 2948 2949 // Don't rebuild the nested-name-specifier if we don't have to. 2950 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 2951 !getDerived().AlwaysRebuild()) 2952 return NNS; 2953 2954 // If we can re-use the source-location data from the original 2955 // nested-name-specifier, do so. 2956 if (SS.location_size() == NNS.getDataLength() && 2957 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 2958 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 2959 2960 // Allocate new nested-name-specifier location information. 2961 return SS.getWithLocInContext(SemaRef.Context); 2962} 2963 2964template<typename Derived> 2965DeclarationNameInfo 2966TreeTransform<Derived> 2967::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 2968 DeclarationName Name = NameInfo.getName(); 2969 if (!Name) 2970 return DeclarationNameInfo(); 2971 2972 switch (Name.getNameKind()) { 2973 case DeclarationName::Identifier: 2974 case DeclarationName::ObjCZeroArgSelector: 2975 case DeclarationName::ObjCOneArgSelector: 2976 case DeclarationName::ObjCMultiArgSelector: 2977 case DeclarationName::CXXOperatorName: 2978 case DeclarationName::CXXLiteralOperatorName: 2979 case DeclarationName::CXXUsingDirective: 2980 return NameInfo; 2981 2982 case DeclarationName::CXXConstructorName: 2983 case DeclarationName::CXXDestructorName: 2984 case DeclarationName::CXXConversionFunctionName: { 2985 TypeSourceInfo *NewTInfo; 2986 CanQualType NewCanTy; 2987 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 2988 NewTInfo = getDerived().TransformType(OldTInfo); 2989 if (!NewTInfo) 2990 return DeclarationNameInfo(); 2991 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 2992 } 2993 else { 2994 NewTInfo = 0; 2995 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 2996 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 2997 if (NewT.isNull()) 2998 return DeclarationNameInfo(); 2999 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 3000 } 3001 3002 DeclarationName NewName 3003 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 3004 NewCanTy); 3005 DeclarationNameInfo NewNameInfo(NameInfo); 3006 NewNameInfo.setName(NewName); 3007 NewNameInfo.setNamedTypeInfo(NewTInfo); 3008 return NewNameInfo; 3009 } 3010 } 3011 3012 llvm_unreachable("Unknown name kind."); 3013} 3014 3015template<typename Derived> 3016TemplateName 3017TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 3018 TemplateName Name, 3019 SourceLocation NameLoc, 3020 QualType ObjectType, 3021 NamedDecl *FirstQualifierInScope) { 3022 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 3023 TemplateDecl *Template = QTN->getTemplateDecl(); 3024 assert(Template && "qualified template name must refer to a template"); 3025 3026 TemplateDecl *TransTemplate 3027 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3028 Template)); 3029 if (!TransTemplate) 3030 return TemplateName(); 3031 3032 if (!getDerived().AlwaysRebuild() && 3033 SS.getScopeRep() == QTN->getQualifier() && 3034 TransTemplate == Template) 3035 return Name; 3036 3037 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 3038 TransTemplate); 3039 } 3040 3041 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 3042 if (SS.getScopeRep()) { 3043 // These apply to the scope specifier, not the template. 3044 ObjectType = QualType(); 3045 FirstQualifierInScope = 0; 3046 } 3047 3048 if (!getDerived().AlwaysRebuild() && 3049 SS.getScopeRep() == DTN->getQualifier() && 3050 ObjectType.isNull()) 3051 return Name; 3052 3053 if (DTN->isIdentifier()) { 3054 return getDerived().RebuildTemplateName(SS, 3055 *DTN->getIdentifier(), 3056 NameLoc, 3057 ObjectType, 3058 FirstQualifierInScope); 3059 } 3060 3061 return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc, 3062 ObjectType); 3063 } 3064 3065 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 3066 TemplateDecl *TransTemplate 3067 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 3068 Template)); 3069 if (!TransTemplate) 3070 return TemplateName(); 3071 3072 if (!getDerived().AlwaysRebuild() && 3073 TransTemplate == Template) 3074 return Name; 3075 3076 return TemplateName(TransTemplate); 3077 } 3078 3079 if (SubstTemplateTemplateParmPackStorage *SubstPack 3080 = Name.getAsSubstTemplateTemplateParmPack()) { 3081 TemplateTemplateParmDecl *TransParam 3082 = cast_or_null<TemplateTemplateParmDecl>( 3083 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3084 if (!TransParam) 3085 return TemplateName(); 3086 3087 if (!getDerived().AlwaysRebuild() && 3088 TransParam == SubstPack->getParameterPack()) 3089 return Name; 3090 3091 return getDerived().RebuildTemplateName(TransParam, 3092 SubstPack->getArgumentPack()); 3093 } 3094 3095 // These should be getting filtered out before they reach the AST. 3096 llvm_unreachable("overloaded function decl survived to here"); 3097} 3098 3099template<typename Derived> 3100void TreeTransform<Derived>::InventTemplateArgumentLoc( 3101 const TemplateArgument &Arg, 3102 TemplateArgumentLoc &Output) { 3103 SourceLocation Loc = getDerived().getBaseLocation(); 3104 switch (Arg.getKind()) { 3105 case TemplateArgument::Null: 3106 llvm_unreachable("null template argument in TreeTransform"); 3107 break; 3108 3109 case TemplateArgument::Type: 3110 Output = TemplateArgumentLoc(Arg, 3111 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3112 3113 break; 3114 3115 case TemplateArgument::Template: 3116 case TemplateArgument::TemplateExpansion: { 3117 NestedNameSpecifierLocBuilder Builder; 3118 TemplateName Template = Arg.getAsTemplate(); 3119 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3120 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3121 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3122 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3123 3124 if (Arg.getKind() == TemplateArgument::Template) 3125 Output = TemplateArgumentLoc(Arg, 3126 Builder.getWithLocInContext(SemaRef.Context), 3127 Loc); 3128 else 3129 Output = TemplateArgumentLoc(Arg, 3130 Builder.getWithLocInContext(SemaRef.Context), 3131 Loc, Loc); 3132 3133 break; 3134 } 3135 3136 case TemplateArgument::Expression: 3137 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3138 break; 3139 3140 case TemplateArgument::Declaration: 3141 case TemplateArgument::Integral: 3142 case TemplateArgument::Pack: 3143 case TemplateArgument::NullPtr: 3144 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3145 break; 3146 } 3147} 3148 3149template<typename Derived> 3150bool TreeTransform<Derived>::TransformTemplateArgument( 3151 const TemplateArgumentLoc &Input, 3152 TemplateArgumentLoc &Output) { 3153 const TemplateArgument &Arg = Input.getArgument(); 3154 switch (Arg.getKind()) { 3155 case TemplateArgument::Null: 3156 case TemplateArgument::Integral: 3157 case TemplateArgument::Pack: 3158 case TemplateArgument::Declaration: 3159 case TemplateArgument::NullPtr: 3160 llvm_unreachable("Unexpected TemplateArgument"); 3161 3162 case TemplateArgument::Type: { 3163 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3164 if (DI == NULL) 3165 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3166 3167 DI = getDerived().TransformType(DI); 3168 if (!DI) return true; 3169 3170 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3171 return false; 3172 } 3173 3174 case TemplateArgument::Template: { 3175 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3176 if (QualifierLoc) { 3177 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3178 if (!QualifierLoc) 3179 return true; 3180 } 3181 3182 CXXScopeSpec SS; 3183 SS.Adopt(QualifierLoc); 3184 TemplateName Template 3185 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3186 Input.getTemplateNameLoc()); 3187 if (Template.isNull()) 3188 return true; 3189 3190 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3191 Input.getTemplateNameLoc()); 3192 return false; 3193 } 3194 3195 case TemplateArgument::TemplateExpansion: 3196 llvm_unreachable("Caller should expand pack expansions"); 3197 3198 case TemplateArgument::Expression: { 3199 // Template argument expressions are constant expressions. 3200 EnterExpressionEvaluationContext Unevaluated(getSema(), 3201 Sema::ConstantEvaluated); 3202 3203 Expr *InputExpr = Input.getSourceExpression(); 3204 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3205 3206 ExprResult E = getDerived().TransformExpr(InputExpr); 3207 E = SemaRef.ActOnConstantExpression(E); 3208 if (E.isInvalid()) return true; 3209 Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take()); 3210 return false; 3211 } 3212 } 3213 3214 // Work around bogus GCC warning 3215 return true; 3216} 3217 3218/// \brief Iterator adaptor that invents template argument location information 3219/// for each of the template arguments in its underlying iterator. 3220template<typename Derived, typename InputIterator> 3221class TemplateArgumentLocInventIterator { 3222 TreeTransform<Derived> &Self; 3223 InputIterator Iter; 3224 3225public: 3226 typedef TemplateArgumentLoc value_type; 3227 typedef TemplateArgumentLoc reference; 3228 typedef typename std::iterator_traits<InputIterator>::difference_type 3229 difference_type; 3230 typedef std::input_iterator_tag iterator_category; 3231 3232 class pointer { 3233 TemplateArgumentLoc Arg; 3234 3235 public: 3236 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3237 3238 const TemplateArgumentLoc *operator->() const { return &Arg; } 3239 }; 3240 3241 TemplateArgumentLocInventIterator() { } 3242 3243 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3244 InputIterator Iter) 3245 : Self(Self), Iter(Iter) { } 3246 3247 TemplateArgumentLocInventIterator &operator++() { 3248 ++Iter; 3249 return *this; 3250 } 3251 3252 TemplateArgumentLocInventIterator operator++(int) { 3253 TemplateArgumentLocInventIterator Old(*this); 3254 ++(*this); 3255 return Old; 3256 } 3257 3258 reference operator*() const { 3259 TemplateArgumentLoc Result; 3260 Self.InventTemplateArgumentLoc(*Iter, Result); 3261 return Result; 3262 } 3263 3264 pointer operator->() const { return pointer(**this); } 3265 3266 friend bool operator==(const TemplateArgumentLocInventIterator &X, 3267 const TemplateArgumentLocInventIterator &Y) { 3268 return X.Iter == Y.Iter; 3269 } 3270 3271 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 3272 const TemplateArgumentLocInventIterator &Y) { 3273 return X.Iter != Y.Iter; 3274 } 3275}; 3276 3277template<typename Derived> 3278template<typename InputIterator> 3279bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First, 3280 InputIterator Last, 3281 TemplateArgumentListInfo &Outputs) { 3282 for (; First != Last; ++First) { 3283 TemplateArgumentLoc Out; 3284 TemplateArgumentLoc In = *First; 3285 3286 if (In.getArgument().getKind() == TemplateArgument::Pack) { 3287 // Unpack argument packs, which we translate them into separate 3288 // arguments. 3289 // FIXME: We could do much better if we could guarantee that the 3290 // TemplateArgumentLocInfo for the pack expansion would be usable for 3291 // all of the template arguments in the argument pack. 3292 typedef TemplateArgumentLocInventIterator<Derived, 3293 TemplateArgument::pack_iterator> 3294 PackLocIterator; 3295 if (TransformTemplateArguments(PackLocIterator(*this, 3296 In.getArgument().pack_begin()), 3297 PackLocIterator(*this, 3298 In.getArgument().pack_end()), 3299 Outputs)) 3300 return true; 3301 3302 continue; 3303 } 3304 3305 if (In.getArgument().isPackExpansion()) { 3306 // We have a pack expansion, for which we will be substituting into 3307 // the pattern. 3308 SourceLocation Ellipsis; 3309 Optional<unsigned> OrigNumExpansions; 3310 TemplateArgumentLoc Pattern 3311 = getSema().getTemplateArgumentPackExpansionPattern( 3312 In, Ellipsis, OrigNumExpansions); 3313 3314 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3315 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3316 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3317 3318 // Determine whether the set of unexpanded parameter packs can and should 3319 // be expanded. 3320 bool Expand = true; 3321 bool RetainExpansion = false; 3322 Optional<unsigned> NumExpansions = OrigNumExpansions; 3323 if (getDerived().TryExpandParameterPacks(Ellipsis, 3324 Pattern.getSourceRange(), 3325 Unexpanded, 3326 Expand, 3327 RetainExpansion, 3328 NumExpansions)) 3329 return true; 3330 3331 if (!Expand) { 3332 // The transform has determined that we should perform a simple 3333 // transformation on the pack expansion, producing another pack 3334 // expansion. 3335 TemplateArgumentLoc OutPattern; 3336 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3337 if (getDerived().TransformTemplateArgument(Pattern, OutPattern)) 3338 return true; 3339 3340 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 3341 NumExpansions); 3342 if (Out.getArgument().isNull()) 3343 return true; 3344 3345 Outputs.addArgument(Out); 3346 continue; 3347 } 3348 3349 // The transform has determined that we should perform an elementwise 3350 // expansion of the pattern. Do so. 3351 for (unsigned I = 0; I != *NumExpansions; ++I) { 3352 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3353 3354 if (getDerived().TransformTemplateArgument(Pattern, Out)) 3355 return true; 3356 3357 if (Out.getArgument().containsUnexpandedParameterPack()) { 3358 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 3359 OrigNumExpansions); 3360 if (Out.getArgument().isNull()) 3361 return true; 3362 } 3363 3364 Outputs.addArgument(Out); 3365 } 3366 3367 // If we're supposed to retain a pack expansion, do so by temporarily 3368 // forgetting the partially-substituted parameter pack. 3369 if (RetainExpansion) { 3370 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3371 3372 if (getDerived().TransformTemplateArgument(Pattern, Out)) 3373 return true; 3374 3375 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 3376 OrigNumExpansions); 3377 if (Out.getArgument().isNull()) 3378 return true; 3379 3380 Outputs.addArgument(Out); 3381 } 3382 3383 continue; 3384 } 3385 3386 // The simple case: 3387 if (getDerived().TransformTemplateArgument(In, Out)) 3388 return true; 3389 3390 Outputs.addArgument(Out); 3391 } 3392 3393 return false; 3394 3395} 3396 3397//===----------------------------------------------------------------------===// 3398// Type transformation 3399//===----------------------------------------------------------------------===// 3400 3401template<typename Derived> 3402QualType TreeTransform<Derived>::TransformType(QualType T) { 3403 if (getDerived().AlreadyTransformed(T)) 3404 return T; 3405 3406 // Temporary workaround. All of these transformations should 3407 // eventually turn into transformations on TypeLocs. 3408 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 3409 getDerived().getBaseLocation()); 3410 3411 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 3412 3413 if (!NewDI) 3414 return QualType(); 3415 3416 return NewDI->getType(); 3417} 3418 3419template<typename Derived> 3420TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 3421 // Refine the base location to the type's location. 3422 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 3423 getDerived().getBaseEntity()); 3424 if (getDerived().AlreadyTransformed(DI->getType())) 3425 return DI; 3426 3427 TypeLocBuilder TLB; 3428 3429 TypeLoc TL = DI->getTypeLoc(); 3430 TLB.reserve(TL.getFullDataSize()); 3431 3432 QualType Result = getDerived().TransformType(TLB, TL); 3433 if (Result.isNull()) 3434 return 0; 3435 3436 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 3437} 3438 3439template<typename Derived> 3440QualType 3441TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 3442 switch (T.getTypeLocClass()) { 3443#define ABSTRACT_TYPELOC(CLASS, PARENT) 3444#define TYPELOC(CLASS, PARENT) \ 3445 case TypeLoc::CLASS: \ 3446 return getDerived().Transform##CLASS##Type(TLB, \ 3447 T.castAs<CLASS##TypeLoc>()); 3448#include "clang/AST/TypeLocNodes.def" 3449 } 3450 3451 llvm_unreachable("unhandled type loc!"); 3452} 3453 3454/// FIXME: By default, this routine adds type qualifiers only to types 3455/// that can have qualifiers, and silently suppresses those qualifiers 3456/// that are not permitted (e.g., qualifiers on reference or function 3457/// types). This is the right thing for template instantiation, but 3458/// probably not for other clients. 3459template<typename Derived> 3460QualType 3461TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 3462 QualifiedTypeLoc T) { 3463 Qualifiers Quals = T.getType().getLocalQualifiers(); 3464 3465 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 3466 if (Result.isNull()) 3467 return QualType(); 3468 3469 // Silently suppress qualifiers if the result type can't be qualified. 3470 // FIXME: this is the right thing for template instantiation, but 3471 // probably not for other clients. 3472 if (Result->isFunctionType() || Result->isReferenceType()) 3473 return Result; 3474 3475 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 3476 // resulting type. 3477 if (Quals.hasObjCLifetime()) { 3478 if (!Result->isObjCLifetimeType() && !Result->isDependentType()) 3479 Quals.removeObjCLifetime(); 3480 else if (Result.getObjCLifetime()) { 3481 // Objective-C ARC: 3482 // A lifetime qualifier applied to a substituted template parameter 3483 // overrides the lifetime qualifier from the template argument. 3484 const AutoType *AutoTy; 3485 if (const SubstTemplateTypeParmType *SubstTypeParam 3486 = dyn_cast<SubstTemplateTypeParmType>(Result)) { 3487 QualType Replacement = SubstTypeParam->getReplacementType(); 3488 Qualifiers Qs = Replacement.getQualifiers(); 3489 Qs.removeObjCLifetime(); 3490 Replacement 3491 = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(), 3492 Qs); 3493 Result = SemaRef.Context.getSubstTemplateTypeParmType( 3494 SubstTypeParam->getReplacedParameter(), 3495 Replacement); 3496 TLB.TypeWasModifiedSafely(Result); 3497 } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) { 3498 // 'auto' types behave the same way as template parameters. 3499 QualType Deduced = AutoTy->getDeducedType(); 3500 Qualifiers Qs = Deduced.getQualifiers(); 3501 Qs.removeObjCLifetime(); 3502 Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), 3503 Qs); 3504 Result = SemaRef.Context.getAutoType(Deduced, AutoTy->isDecltypeAuto()); 3505 TLB.TypeWasModifiedSafely(Result); 3506 } else { 3507 // Otherwise, complain about the addition of a qualifier to an 3508 // already-qualified type. 3509 SourceRange R = T.getUnqualifiedLoc().getSourceRange(); 3510 SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant) 3511 << Result << R; 3512 3513 Quals.removeObjCLifetime(); 3514 } 3515 } 3516 } 3517 if (!Quals.empty()) { 3518 Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals); 3519 // BuildQualifiedType might not add qualifiers if they are invalid. 3520 if (Result.hasLocalQualifiers()) 3521 TLB.push<QualifiedTypeLoc>(Result); 3522 // No location information to preserve. 3523 } 3524 3525 return Result; 3526} 3527 3528template<typename Derived> 3529TypeLoc 3530TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 3531 QualType ObjectType, 3532 NamedDecl *UnqualLookup, 3533 CXXScopeSpec &SS) { 3534 QualType T = TL.getType(); 3535 if (getDerived().AlreadyTransformed(T)) 3536 return TL; 3537 3538 TypeLocBuilder TLB; 3539 QualType Result; 3540 3541 if (isa<TemplateSpecializationType>(T)) { 3542 TemplateSpecializationTypeLoc SpecTL = 3543 TL.castAs<TemplateSpecializationTypeLoc>(); 3544 3545 TemplateName Template = 3546 getDerived().TransformTemplateName(SS, 3547 SpecTL.getTypePtr()->getTemplateName(), 3548 SpecTL.getTemplateNameLoc(), 3549 ObjectType, UnqualLookup); 3550 if (Template.isNull()) 3551 return TypeLoc(); 3552 3553 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 3554 Template); 3555 } else if (isa<DependentTemplateSpecializationType>(T)) { 3556 DependentTemplateSpecializationTypeLoc SpecTL = 3557 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 3558 3559 TemplateName Template 3560 = getDerived().RebuildTemplateName(SS, 3561 *SpecTL.getTypePtr()->getIdentifier(), 3562 SpecTL.getTemplateNameLoc(), 3563 ObjectType, UnqualLookup); 3564 if (Template.isNull()) 3565 return TypeLoc(); 3566 3567 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 3568 SpecTL, 3569 Template, 3570 SS); 3571 } else { 3572 // Nothing special needs to be done for these. 3573 Result = getDerived().TransformType(TLB, TL); 3574 } 3575 3576 if (Result.isNull()) 3577 return TypeLoc(); 3578 3579 return TLB.getTypeSourceInfo(SemaRef.Context, Result)->getTypeLoc(); 3580} 3581 3582template<typename Derived> 3583TypeSourceInfo * 3584TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3585 QualType ObjectType, 3586 NamedDecl *UnqualLookup, 3587 CXXScopeSpec &SS) { 3588 // FIXME: Painfully copy-paste from the above! 3589 3590 QualType T = TSInfo->getType(); 3591 if (getDerived().AlreadyTransformed(T)) 3592 return TSInfo; 3593 3594 TypeLocBuilder TLB; 3595 QualType Result; 3596 3597 TypeLoc TL = TSInfo->getTypeLoc(); 3598 if (isa<TemplateSpecializationType>(T)) { 3599 TemplateSpecializationTypeLoc SpecTL = 3600 TL.castAs<TemplateSpecializationTypeLoc>(); 3601 3602 TemplateName Template 3603 = getDerived().TransformTemplateName(SS, 3604 SpecTL.getTypePtr()->getTemplateName(), 3605 SpecTL.getTemplateNameLoc(), 3606 ObjectType, UnqualLookup); 3607 if (Template.isNull()) 3608 return 0; 3609 3610 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 3611 Template); 3612 } else if (isa<DependentTemplateSpecializationType>(T)) { 3613 DependentTemplateSpecializationTypeLoc SpecTL = 3614 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 3615 3616 TemplateName Template 3617 = getDerived().RebuildTemplateName(SS, 3618 *SpecTL.getTypePtr()->getIdentifier(), 3619 SpecTL.getTemplateNameLoc(), 3620 ObjectType, UnqualLookup); 3621 if (Template.isNull()) 3622 return 0; 3623 3624 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 3625 SpecTL, 3626 Template, 3627 SS); 3628 } else { 3629 // Nothing special needs to be done for these. 3630 Result = getDerived().TransformType(TLB, TL); 3631 } 3632 3633 if (Result.isNull()) 3634 return 0; 3635 3636 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 3637} 3638 3639template <class TyLoc> static inline 3640QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 3641 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 3642 NewT.setNameLoc(T.getNameLoc()); 3643 return T.getType(); 3644} 3645 3646template<typename Derived> 3647QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 3648 BuiltinTypeLoc T) { 3649 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 3650 NewT.setBuiltinLoc(T.getBuiltinLoc()); 3651 if (T.needsExtraLocalData()) 3652 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 3653 return T.getType(); 3654} 3655 3656template<typename Derived> 3657QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 3658 ComplexTypeLoc T) { 3659 // FIXME: recurse? 3660 return TransformTypeSpecType(TLB, T); 3661} 3662 3663template<typename Derived> 3664QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB, 3665 DecayedTypeLoc TL) { 3666 QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc()); 3667 if (OriginalType.isNull()) 3668 return QualType(); 3669 3670 QualType Result = TL.getType(); 3671 if (getDerived().AlwaysRebuild() || 3672 OriginalType != TL.getOriginalLoc().getType()) 3673 Result = SemaRef.Context.getDecayedType(OriginalType); 3674 TLB.push<DecayedTypeLoc>(Result); 3675 // Nothing to set for DecayedTypeLoc. 3676 return Result; 3677} 3678 3679template<typename Derived> 3680QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 3681 PointerTypeLoc TL) { 3682 QualType PointeeType 3683 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3684 if (PointeeType.isNull()) 3685 return QualType(); 3686 3687 QualType Result = TL.getType(); 3688 if (PointeeType->getAs<ObjCObjectType>()) { 3689 // A dependent pointer type 'T *' has is being transformed such 3690 // that an Objective-C class type is being replaced for 'T'. The 3691 // resulting pointer type is an ObjCObjectPointerType, not a 3692 // PointerType. 3693 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 3694 3695 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 3696 NewT.setStarLoc(TL.getStarLoc()); 3697 return Result; 3698 } 3699 3700 if (getDerived().AlwaysRebuild() || 3701 PointeeType != TL.getPointeeLoc().getType()) { 3702 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 3703 if (Result.isNull()) 3704 return QualType(); 3705 } 3706 3707 // Objective-C ARC can add lifetime qualifiers to the type that we're 3708 // pointing to. 3709 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 3710 3711 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 3712 NewT.setSigilLoc(TL.getSigilLoc()); 3713 return Result; 3714} 3715 3716template<typename Derived> 3717QualType 3718TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 3719 BlockPointerTypeLoc TL) { 3720 QualType PointeeType 3721 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3722 if (PointeeType.isNull()) 3723 return QualType(); 3724 3725 QualType Result = TL.getType(); 3726 if (getDerived().AlwaysRebuild() || 3727 PointeeType != TL.getPointeeLoc().getType()) { 3728 Result = getDerived().RebuildBlockPointerType(PointeeType, 3729 TL.getSigilLoc()); 3730 if (Result.isNull()) 3731 return QualType(); 3732 } 3733 3734 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 3735 NewT.setSigilLoc(TL.getSigilLoc()); 3736 return Result; 3737} 3738 3739/// Transforms a reference type. Note that somewhat paradoxically we 3740/// don't care whether the type itself is an l-value type or an r-value 3741/// type; we only care if the type was *written* as an l-value type 3742/// or an r-value type. 3743template<typename Derived> 3744QualType 3745TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 3746 ReferenceTypeLoc TL) { 3747 const ReferenceType *T = TL.getTypePtr(); 3748 3749 // Note that this works with the pointee-as-written. 3750 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3751 if (PointeeType.isNull()) 3752 return QualType(); 3753 3754 QualType Result = TL.getType(); 3755 if (getDerived().AlwaysRebuild() || 3756 PointeeType != T->getPointeeTypeAsWritten()) { 3757 Result = getDerived().RebuildReferenceType(PointeeType, 3758 T->isSpelledAsLValue(), 3759 TL.getSigilLoc()); 3760 if (Result.isNull()) 3761 return QualType(); 3762 } 3763 3764 // Objective-C ARC can add lifetime qualifiers to the type that we're 3765 // referring to. 3766 TLB.TypeWasModifiedSafely( 3767 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 3768 3769 // r-value references can be rebuilt as l-value references. 3770 ReferenceTypeLoc NewTL; 3771 if (isa<LValueReferenceType>(Result)) 3772 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 3773 else 3774 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 3775 NewTL.setSigilLoc(TL.getSigilLoc()); 3776 3777 return Result; 3778} 3779 3780template<typename Derived> 3781QualType 3782TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 3783 LValueReferenceTypeLoc TL) { 3784 return TransformReferenceType(TLB, TL); 3785} 3786 3787template<typename Derived> 3788QualType 3789TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 3790 RValueReferenceTypeLoc TL) { 3791 return TransformReferenceType(TLB, TL); 3792} 3793 3794template<typename Derived> 3795QualType 3796TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 3797 MemberPointerTypeLoc TL) { 3798 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3799 if (PointeeType.isNull()) 3800 return QualType(); 3801 3802 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 3803 TypeSourceInfo* NewClsTInfo = 0; 3804 if (OldClsTInfo) { 3805 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 3806 if (!NewClsTInfo) 3807 return QualType(); 3808 } 3809 3810 const MemberPointerType *T = TL.getTypePtr(); 3811 QualType OldClsType = QualType(T->getClass(), 0); 3812 QualType NewClsType; 3813 if (NewClsTInfo) 3814 NewClsType = NewClsTInfo->getType(); 3815 else { 3816 NewClsType = getDerived().TransformType(OldClsType); 3817 if (NewClsType.isNull()) 3818 return QualType(); 3819 } 3820 3821 QualType Result = TL.getType(); 3822 if (getDerived().AlwaysRebuild() || 3823 PointeeType != T->getPointeeType() || 3824 NewClsType != OldClsType) { 3825 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 3826 TL.getStarLoc()); 3827 if (Result.isNull()) 3828 return QualType(); 3829 } 3830 3831 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 3832 NewTL.setSigilLoc(TL.getSigilLoc()); 3833 NewTL.setClassTInfo(NewClsTInfo); 3834 3835 return Result; 3836} 3837 3838template<typename Derived> 3839QualType 3840TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 3841 ConstantArrayTypeLoc TL) { 3842 const ConstantArrayType *T = TL.getTypePtr(); 3843 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3844 if (ElementType.isNull()) 3845 return QualType(); 3846 3847 QualType Result = TL.getType(); 3848 if (getDerived().AlwaysRebuild() || 3849 ElementType != T->getElementType()) { 3850 Result = getDerived().RebuildConstantArrayType(ElementType, 3851 T->getSizeModifier(), 3852 T->getSize(), 3853 T->getIndexTypeCVRQualifiers(), 3854 TL.getBracketsRange()); 3855 if (Result.isNull()) 3856 return QualType(); 3857 } 3858 3859 // We might have either a ConstantArrayType or a VariableArrayType now: 3860 // a ConstantArrayType is allowed to have an element type which is a 3861 // VariableArrayType if the type is dependent. Fortunately, all array 3862 // types have the same location layout. 3863 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 3864 NewTL.setLBracketLoc(TL.getLBracketLoc()); 3865 NewTL.setRBracketLoc(TL.getRBracketLoc()); 3866 3867 Expr *Size = TL.getSizeExpr(); 3868 if (Size) { 3869 EnterExpressionEvaluationContext Unevaluated(SemaRef, 3870 Sema::ConstantEvaluated); 3871 Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 3872 Size = SemaRef.ActOnConstantExpression(Size).take(); 3873 } 3874 NewTL.setSizeExpr(Size); 3875 3876 return Result; 3877} 3878 3879template<typename Derived> 3880QualType TreeTransform<Derived>::TransformIncompleteArrayType( 3881 TypeLocBuilder &TLB, 3882 IncompleteArrayTypeLoc TL) { 3883 const IncompleteArrayType *T = TL.getTypePtr(); 3884 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3885 if (ElementType.isNull()) 3886 return QualType(); 3887 3888 QualType Result = TL.getType(); 3889 if (getDerived().AlwaysRebuild() || 3890 ElementType != T->getElementType()) { 3891 Result = getDerived().RebuildIncompleteArrayType(ElementType, 3892 T->getSizeModifier(), 3893 T->getIndexTypeCVRQualifiers(), 3894 TL.getBracketsRange()); 3895 if (Result.isNull()) 3896 return QualType(); 3897 } 3898 3899 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 3900 NewTL.setLBracketLoc(TL.getLBracketLoc()); 3901 NewTL.setRBracketLoc(TL.getRBracketLoc()); 3902 NewTL.setSizeExpr(0); 3903 3904 return Result; 3905} 3906 3907template<typename Derived> 3908QualType 3909TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 3910 VariableArrayTypeLoc TL) { 3911 const VariableArrayType *T = TL.getTypePtr(); 3912 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3913 if (ElementType.isNull()) 3914 return QualType(); 3915 3916 ExprResult SizeResult 3917 = getDerived().TransformExpr(T->getSizeExpr()); 3918 if (SizeResult.isInvalid()) 3919 return QualType(); 3920 3921 Expr *Size = SizeResult.take(); 3922 3923 QualType Result = TL.getType(); 3924 if (getDerived().AlwaysRebuild() || 3925 ElementType != T->getElementType() || 3926 Size != T->getSizeExpr()) { 3927 Result = getDerived().RebuildVariableArrayType(ElementType, 3928 T->getSizeModifier(), 3929 Size, 3930 T->getIndexTypeCVRQualifiers(), 3931 TL.getBracketsRange()); 3932 if (Result.isNull()) 3933 return QualType(); 3934 } 3935 3936 VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 3937 NewTL.setLBracketLoc(TL.getLBracketLoc()); 3938 NewTL.setRBracketLoc(TL.getRBracketLoc()); 3939 NewTL.setSizeExpr(Size); 3940 3941 return Result; 3942} 3943 3944template<typename Derived> 3945QualType 3946TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 3947 DependentSizedArrayTypeLoc TL) { 3948 const DependentSizedArrayType *T = TL.getTypePtr(); 3949 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3950 if (ElementType.isNull()) 3951 return QualType(); 3952 3953 // Array bounds are constant expressions. 3954 EnterExpressionEvaluationContext Unevaluated(SemaRef, 3955 Sema::ConstantEvaluated); 3956 3957 // Prefer the expression from the TypeLoc; the other may have been uniqued. 3958 Expr *origSize = TL.getSizeExpr(); 3959 if (!origSize) origSize = T->getSizeExpr(); 3960 3961 ExprResult sizeResult 3962 = getDerived().TransformExpr(origSize); 3963 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 3964 if (sizeResult.isInvalid()) 3965 return QualType(); 3966 3967 Expr *size = sizeResult.get(); 3968 3969 QualType Result = TL.getType(); 3970 if (getDerived().AlwaysRebuild() || 3971 ElementType != T->getElementType() || 3972 size != origSize) { 3973 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 3974 T->getSizeModifier(), 3975 size, 3976 T->getIndexTypeCVRQualifiers(), 3977 TL.getBracketsRange()); 3978 if (Result.isNull()) 3979 return QualType(); 3980 } 3981 3982 // We might have any sort of array type now, but fortunately they 3983 // all have the same location layout. 3984 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 3985 NewTL.setLBracketLoc(TL.getLBracketLoc()); 3986 NewTL.setRBracketLoc(TL.getRBracketLoc()); 3987 NewTL.setSizeExpr(size); 3988 3989 return Result; 3990} 3991 3992template<typename Derived> 3993QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 3994 TypeLocBuilder &TLB, 3995 DependentSizedExtVectorTypeLoc TL) { 3996 const DependentSizedExtVectorType *T = TL.getTypePtr(); 3997 3998 // FIXME: ext vector locs should be nested 3999 QualType ElementType = getDerived().TransformType(T->getElementType()); 4000 if (ElementType.isNull()) 4001 return QualType(); 4002 4003 // Vector sizes are constant expressions. 4004 EnterExpressionEvaluationContext Unevaluated(SemaRef, 4005 Sema::ConstantEvaluated); 4006 4007 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 4008 Size = SemaRef.ActOnConstantExpression(Size); 4009 if (Size.isInvalid()) 4010 return QualType(); 4011 4012 QualType Result = TL.getType(); 4013 if (getDerived().AlwaysRebuild() || 4014 ElementType != T->getElementType() || 4015 Size.get() != T->getSizeExpr()) { 4016 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 4017 Size.take(), 4018 T->getAttributeLoc()); 4019 if (Result.isNull()) 4020 return QualType(); 4021 } 4022 4023 // Result might be dependent or not. 4024 if (isa<DependentSizedExtVectorType>(Result)) { 4025 DependentSizedExtVectorTypeLoc NewTL 4026 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 4027 NewTL.setNameLoc(TL.getNameLoc()); 4028 } else { 4029 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4030 NewTL.setNameLoc(TL.getNameLoc()); 4031 } 4032 4033 return Result; 4034} 4035 4036template<typename Derived> 4037QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 4038 VectorTypeLoc TL) { 4039 const VectorType *T = TL.getTypePtr(); 4040 QualType ElementType = getDerived().TransformType(T->getElementType()); 4041 if (ElementType.isNull()) 4042 return QualType(); 4043 4044 QualType Result = TL.getType(); 4045 if (getDerived().AlwaysRebuild() || 4046 ElementType != T->getElementType()) { 4047 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 4048 T->getVectorKind()); 4049 if (Result.isNull()) 4050 return QualType(); 4051 } 4052 4053 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 4054 NewTL.setNameLoc(TL.getNameLoc()); 4055 4056 return Result; 4057} 4058 4059template<typename Derived> 4060QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 4061 ExtVectorTypeLoc TL) { 4062 const VectorType *T = TL.getTypePtr(); 4063 QualType ElementType = getDerived().TransformType(T->getElementType()); 4064 if (ElementType.isNull()) 4065 return QualType(); 4066 4067 QualType Result = TL.getType(); 4068 if (getDerived().AlwaysRebuild() || 4069 ElementType != T->getElementType()) { 4070 Result = getDerived().RebuildExtVectorType(ElementType, 4071 T->getNumElements(), 4072 /*FIXME*/ SourceLocation()); 4073 if (Result.isNull()) 4074 return QualType(); 4075 } 4076 4077 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 4078 NewTL.setNameLoc(TL.getNameLoc()); 4079 4080 return Result; 4081} 4082 4083template <typename Derived> 4084ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 4085 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 4086 bool ExpectParameterPack) { 4087 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 4088 TypeSourceInfo *NewDI = 0; 4089 4090 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 4091 // If we're substituting into a pack expansion type and we know the 4092 // length we want to expand to, just substitute for the pattern. 4093 TypeLoc OldTL = OldDI->getTypeLoc(); 4094 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 4095 4096 TypeLocBuilder TLB; 4097 TypeLoc NewTL = OldDI->getTypeLoc(); 4098 TLB.reserve(NewTL.getFullDataSize()); 4099 4100 QualType Result = getDerived().TransformType(TLB, 4101 OldExpansionTL.getPatternLoc()); 4102 if (Result.isNull()) 4103 return 0; 4104 4105 Result = RebuildPackExpansionType(Result, 4106 OldExpansionTL.getPatternLoc().getSourceRange(), 4107 OldExpansionTL.getEllipsisLoc(), 4108 NumExpansions); 4109 if (Result.isNull()) 4110 return 0; 4111 4112 PackExpansionTypeLoc NewExpansionTL 4113 = TLB.push<PackExpansionTypeLoc>(Result); 4114 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 4115 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 4116 } else 4117 NewDI = getDerived().TransformType(OldDI); 4118 if (!NewDI) 4119 return 0; 4120 4121 if (NewDI == OldDI && indexAdjustment == 0) 4122 return OldParm; 4123 4124 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 4125 OldParm->getDeclContext(), 4126 OldParm->getInnerLocStart(), 4127 OldParm->getLocation(), 4128 OldParm->getIdentifier(), 4129 NewDI->getType(), 4130 NewDI, 4131 OldParm->getStorageClass(), 4132 /* DefArg */ NULL); 4133 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 4134 OldParm->getFunctionScopeIndex() + indexAdjustment); 4135 return newParm; 4136} 4137 4138template<typename Derived> 4139bool TreeTransform<Derived>:: 4140 TransformFunctionTypeParams(SourceLocation Loc, 4141 ParmVarDecl **Params, unsigned NumParams, 4142 const QualType *ParamTypes, 4143 SmallVectorImpl<QualType> &OutParamTypes, 4144 SmallVectorImpl<ParmVarDecl*> *PVars) { 4145 int indexAdjustment = 0; 4146 4147 for (unsigned i = 0; i != NumParams; ++i) { 4148 if (ParmVarDecl *OldParm = Params[i]) { 4149 assert(OldParm->getFunctionScopeIndex() == i); 4150 4151 Optional<unsigned> NumExpansions; 4152 ParmVarDecl *NewParm = 0; 4153 if (OldParm->isParameterPack()) { 4154 // We have a function parameter pack that may need to be expanded. 4155 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4156 4157 // Find the parameter packs that could be expanded. 4158 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 4159 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 4160 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 4161 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 4162 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 4163 4164 // Determine whether we should expand the parameter packs. 4165 bool ShouldExpand = false; 4166 bool RetainExpansion = false; 4167 Optional<unsigned> OrigNumExpansions = 4168 ExpansionTL.getTypePtr()->getNumExpansions(); 4169 NumExpansions = OrigNumExpansions; 4170 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 4171 Pattern.getSourceRange(), 4172 Unexpanded, 4173 ShouldExpand, 4174 RetainExpansion, 4175 NumExpansions)) { 4176 return true; 4177 } 4178 4179 if (ShouldExpand) { 4180 // Expand the function parameter pack into multiple, separate 4181 // parameters. 4182 getDerived().ExpandingFunctionParameterPack(OldParm); 4183 for (unsigned I = 0; I != *NumExpansions; ++I) { 4184 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4185 ParmVarDecl *NewParm 4186 = getDerived().TransformFunctionTypeParam(OldParm, 4187 indexAdjustment++, 4188 OrigNumExpansions, 4189 /*ExpectParameterPack=*/false); 4190 if (!NewParm) 4191 return true; 4192 4193 OutParamTypes.push_back(NewParm->getType()); 4194 if (PVars) 4195 PVars->push_back(NewParm); 4196 } 4197 4198 // If we're supposed to retain a pack expansion, do so by temporarily 4199 // forgetting the partially-substituted parameter pack. 4200 if (RetainExpansion) { 4201 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4202 ParmVarDecl *NewParm 4203 = getDerived().TransformFunctionTypeParam(OldParm, 4204 indexAdjustment++, 4205 OrigNumExpansions, 4206 /*ExpectParameterPack=*/false); 4207 if (!NewParm) 4208 return true; 4209 4210 OutParamTypes.push_back(NewParm->getType()); 4211 if (PVars) 4212 PVars->push_back(NewParm); 4213 } 4214 4215 // The next parameter should have the same adjustment as the 4216 // last thing we pushed, but we post-incremented indexAdjustment 4217 // on every push. Also, if we push nothing, the adjustment should 4218 // go down by one. 4219 indexAdjustment--; 4220 4221 // We're done with the pack expansion. 4222 continue; 4223 } 4224 4225 // We'll substitute the parameter now without expanding the pack 4226 // expansion. 4227 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4228 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 4229 indexAdjustment, 4230 NumExpansions, 4231 /*ExpectParameterPack=*/true); 4232 } else { 4233 NewParm = getDerived().TransformFunctionTypeParam( 4234 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 4235 } 4236 4237 if (!NewParm) 4238 return true; 4239 4240 OutParamTypes.push_back(NewParm->getType()); 4241 if (PVars) 4242 PVars->push_back(NewParm); 4243 continue; 4244 } 4245 4246 // Deal with the possibility that we don't have a parameter 4247 // declaration for this parameter. 4248 QualType OldType = ParamTypes[i]; 4249 bool IsPackExpansion = false; 4250 Optional<unsigned> NumExpansions; 4251 QualType NewType; 4252 if (const PackExpansionType *Expansion 4253 = dyn_cast<PackExpansionType>(OldType)) { 4254 // We have a function parameter pack that may need to be expanded. 4255 QualType Pattern = Expansion->getPattern(); 4256 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4257 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4258 4259 // Determine whether we should expand the parameter packs. 4260 bool ShouldExpand = false; 4261 bool RetainExpansion = false; 4262 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 4263 Unexpanded, 4264 ShouldExpand, 4265 RetainExpansion, 4266 NumExpansions)) { 4267 return true; 4268 } 4269 4270 if (ShouldExpand) { 4271 // Expand the function parameter pack into multiple, separate 4272 // parameters. 4273 for (unsigned I = 0; I != *NumExpansions; ++I) { 4274 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4275 QualType NewType = getDerived().TransformType(Pattern); 4276 if (NewType.isNull()) 4277 return true; 4278 4279 OutParamTypes.push_back(NewType); 4280 if (PVars) 4281 PVars->push_back(0); 4282 } 4283 4284 // We're done with the pack expansion. 4285 continue; 4286 } 4287 4288 // If we're supposed to retain a pack expansion, do so by temporarily 4289 // forgetting the partially-substituted parameter pack. 4290 if (RetainExpansion) { 4291 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4292 QualType NewType = getDerived().TransformType(Pattern); 4293 if (NewType.isNull()) 4294 return true; 4295 4296 OutParamTypes.push_back(NewType); 4297 if (PVars) 4298 PVars->push_back(0); 4299 } 4300 4301 // We'll substitute the parameter now without expanding the pack 4302 // expansion. 4303 OldType = Expansion->getPattern(); 4304 IsPackExpansion = true; 4305 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4306 NewType = getDerived().TransformType(OldType); 4307 } else { 4308 NewType = getDerived().TransformType(OldType); 4309 } 4310 4311 if (NewType.isNull()) 4312 return true; 4313 4314 if (IsPackExpansion) 4315 NewType = getSema().Context.getPackExpansionType(NewType, 4316 NumExpansions); 4317 4318 OutParamTypes.push_back(NewType); 4319 if (PVars) 4320 PVars->push_back(0); 4321 } 4322 4323#ifndef NDEBUG 4324 if (PVars) { 4325 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 4326 if (ParmVarDecl *parm = (*PVars)[i]) 4327 assert(parm->getFunctionScopeIndex() == i); 4328 } 4329#endif 4330 4331 return false; 4332} 4333 4334template<typename Derived> 4335QualType 4336TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 4337 FunctionProtoTypeLoc TL) { 4338 return getDerived().TransformFunctionProtoType(TLB, TL, 0, 0); 4339} 4340 4341template<typename Derived> 4342QualType 4343TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 4344 FunctionProtoTypeLoc TL, 4345 CXXRecordDecl *ThisContext, 4346 unsigned ThisTypeQuals) { 4347 // Transform the parameters and return type. 4348 // 4349 // We are required to instantiate the params and return type in source order. 4350 // When the function has a trailing return type, we instantiate the 4351 // parameters before the return type, since the return type can then refer 4352 // to the parameters themselves (via decltype, sizeof, etc.). 4353 // 4354 SmallVector<QualType, 4> ParamTypes; 4355 SmallVector<ParmVarDecl*, 4> ParamDecls; 4356 const FunctionProtoType *T = TL.getTypePtr(); 4357 4358 QualType ResultType; 4359 4360 if (T->hasTrailingReturn()) { 4361 if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 4362 TL.getParmArray(), 4363 TL.getNumArgs(), 4364 TL.getTypePtr()->arg_type_begin(), 4365 ParamTypes, &ParamDecls)) 4366 return QualType(); 4367 4368 { 4369 // C++11 [expr.prim.general]p3: 4370 // If a declaration declares a member function or member function 4371 // template of a class X, the expression this is a prvalue of type 4372 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 4373 // and the end of the function-definition, member-declarator, or 4374 // declarator. 4375 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 4376 4377 ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 4378 if (ResultType.isNull()) 4379 return QualType(); 4380 } 4381 } 4382 else { 4383 ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 4384 if (ResultType.isNull()) 4385 return QualType(); 4386 4387 if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 4388 TL.getParmArray(), 4389 TL.getNumArgs(), 4390 TL.getTypePtr()->arg_type_begin(), 4391 ParamTypes, &ParamDecls)) 4392 return QualType(); 4393 } 4394 4395 // FIXME: Need to transform the exception-specification too. 4396 4397 QualType Result = TL.getType(); 4398 if (getDerived().AlwaysRebuild() || 4399 ResultType != T->getResultType() || 4400 T->getNumArgs() != ParamTypes.size() || 4401 !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 4402 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, 4403 T->getExtProtoInfo()); 4404 if (Result.isNull()) 4405 return QualType(); 4406 } 4407 4408 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 4409 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 4410 NewTL.setLParenLoc(TL.getLParenLoc()); 4411 NewTL.setRParenLoc(TL.getRParenLoc()); 4412 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 4413 for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 4414 NewTL.setArg(i, ParamDecls[i]); 4415 4416 return Result; 4417} 4418 4419template<typename Derived> 4420QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 4421 TypeLocBuilder &TLB, 4422 FunctionNoProtoTypeLoc TL) { 4423 const FunctionNoProtoType *T = TL.getTypePtr(); 4424 QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 4425 if (ResultType.isNull()) 4426 return QualType(); 4427 4428 QualType Result = TL.getType(); 4429 if (getDerived().AlwaysRebuild() || 4430 ResultType != T->getResultType()) 4431 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 4432 4433 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 4434 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 4435 NewTL.setLParenLoc(TL.getLParenLoc()); 4436 NewTL.setRParenLoc(TL.getRParenLoc()); 4437 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 4438 4439 return Result; 4440} 4441 4442template<typename Derived> QualType 4443TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 4444 UnresolvedUsingTypeLoc TL) { 4445 const UnresolvedUsingType *T = TL.getTypePtr(); 4446 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 4447 if (!D) 4448 return QualType(); 4449 4450 QualType Result = TL.getType(); 4451 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 4452 Result = getDerived().RebuildUnresolvedUsingType(D); 4453 if (Result.isNull()) 4454 return QualType(); 4455 } 4456 4457 // We might get an arbitrary type spec type back. We should at 4458 // least always get a type spec type, though. 4459 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 4460 NewTL.setNameLoc(TL.getNameLoc()); 4461 4462 return Result; 4463} 4464 4465template<typename Derived> 4466QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 4467 TypedefTypeLoc TL) { 4468 const TypedefType *T = TL.getTypePtr(); 4469 TypedefNameDecl *Typedef 4470 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 4471 T->getDecl())); 4472 if (!Typedef) 4473 return QualType(); 4474 4475 QualType Result = TL.getType(); 4476 if (getDerived().AlwaysRebuild() || 4477 Typedef != T->getDecl()) { 4478 Result = getDerived().RebuildTypedefType(Typedef); 4479 if (Result.isNull()) 4480 return QualType(); 4481 } 4482 4483 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 4484 NewTL.setNameLoc(TL.getNameLoc()); 4485 4486 return Result; 4487} 4488 4489template<typename Derived> 4490QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 4491 TypeOfExprTypeLoc TL) { 4492 // typeof expressions are not potentially evaluated contexts 4493 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 4494 Sema::ReuseLambdaContextDecl); 4495 4496 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 4497 if (E.isInvalid()) 4498 return QualType(); 4499 4500 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 4501 if (E.isInvalid()) 4502 return QualType(); 4503 4504 QualType Result = TL.getType(); 4505 if (getDerived().AlwaysRebuild() || 4506 E.get() != TL.getUnderlyingExpr()) { 4507 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 4508 if (Result.isNull()) 4509 return QualType(); 4510 } 4511 else E.take(); 4512 4513 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 4514 NewTL.setTypeofLoc(TL.getTypeofLoc()); 4515 NewTL.setLParenLoc(TL.getLParenLoc()); 4516 NewTL.setRParenLoc(TL.getRParenLoc()); 4517 4518 return Result; 4519} 4520 4521template<typename Derived> 4522QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 4523 TypeOfTypeLoc TL) { 4524 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 4525 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 4526 if (!New_Under_TI) 4527 return QualType(); 4528 4529 QualType Result = TL.getType(); 4530 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 4531 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 4532 if (Result.isNull()) 4533 return QualType(); 4534 } 4535 4536 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 4537 NewTL.setTypeofLoc(TL.getTypeofLoc()); 4538 NewTL.setLParenLoc(TL.getLParenLoc()); 4539 NewTL.setRParenLoc(TL.getRParenLoc()); 4540 NewTL.setUnderlyingTInfo(New_Under_TI); 4541 4542 return Result; 4543} 4544 4545template<typename Derived> 4546QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 4547 DecltypeTypeLoc TL) { 4548 const DecltypeType *T = TL.getTypePtr(); 4549 4550 // decltype expressions are not potentially evaluated contexts 4551 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 0, 4552 /*IsDecltype=*/ true); 4553 4554 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 4555 if (E.isInvalid()) 4556 return QualType(); 4557 4558 E = getSema().ActOnDecltypeExpression(E.take()); 4559 if (E.isInvalid()) 4560 return QualType(); 4561 4562 QualType Result = TL.getType(); 4563 if (getDerived().AlwaysRebuild() || 4564 E.get() != T->getUnderlyingExpr()) { 4565 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 4566 if (Result.isNull()) 4567 return QualType(); 4568 } 4569 else E.take(); 4570 4571 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 4572 NewTL.setNameLoc(TL.getNameLoc()); 4573 4574 return Result; 4575} 4576 4577template<typename Derived> 4578QualType TreeTransform<Derived>::TransformUnaryTransformType( 4579 TypeLocBuilder &TLB, 4580 UnaryTransformTypeLoc TL) { 4581 QualType Result = TL.getType(); 4582 if (Result->isDependentType()) { 4583 const UnaryTransformType *T = TL.getTypePtr(); 4584 QualType NewBase = 4585 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 4586 Result = getDerived().RebuildUnaryTransformType(NewBase, 4587 T->getUTTKind(), 4588 TL.getKWLoc()); 4589 if (Result.isNull()) 4590 return QualType(); 4591 } 4592 4593 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 4594 NewTL.setKWLoc(TL.getKWLoc()); 4595 NewTL.setParensRange(TL.getParensRange()); 4596 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 4597 return Result; 4598} 4599 4600template<typename Derived> 4601QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 4602 AutoTypeLoc TL) { 4603 const AutoType *T = TL.getTypePtr(); 4604 QualType OldDeduced = T->getDeducedType(); 4605 QualType NewDeduced; 4606 if (!OldDeduced.isNull()) { 4607 NewDeduced = getDerived().TransformType(OldDeduced); 4608 if (NewDeduced.isNull()) 4609 return QualType(); 4610 } 4611 4612 QualType Result = TL.getType(); 4613 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 4614 T->isDependentType()) { 4615 Result = getDerived().RebuildAutoType(NewDeduced, T->isDecltypeAuto()); 4616 if (Result.isNull()) 4617 return QualType(); 4618 } 4619 4620 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 4621 NewTL.setNameLoc(TL.getNameLoc()); 4622 4623 return Result; 4624} 4625 4626template<typename Derived> 4627QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 4628 RecordTypeLoc TL) { 4629 const RecordType *T = TL.getTypePtr(); 4630 RecordDecl *Record 4631 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 4632 T->getDecl())); 4633 if (!Record) 4634 return QualType(); 4635 4636 QualType Result = TL.getType(); 4637 if (getDerived().AlwaysRebuild() || 4638 Record != T->getDecl()) { 4639 Result = getDerived().RebuildRecordType(Record); 4640 if (Result.isNull()) 4641 return QualType(); 4642 } 4643 4644 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 4645 NewTL.setNameLoc(TL.getNameLoc()); 4646 4647 return Result; 4648} 4649 4650template<typename Derived> 4651QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 4652 EnumTypeLoc TL) { 4653 const EnumType *T = TL.getTypePtr(); 4654 EnumDecl *Enum 4655 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 4656 T->getDecl())); 4657 if (!Enum) 4658 return QualType(); 4659 4660 QualType Result = TL.getType(); 4661 if (getDerived().AlwaysRebuild() || 4662 Enum != T->getDecl()) { 4663 Result = getDerived().RebuildEnumType(Enum); 4664 if (Result.isNull()) 4665 return QualType(); 4666 } 4667 4668 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 4669 NewTL.setNameLoc(TL.getNameLoc()); 4670 4671 return Result; 4672} 4673 4674template<typename Derived> 4675QualType TreeTransform<Derived>::TransformInjectedClassNameType( 4676 TypeLocBuilder &TLB, 4677 InjectedClassNameTypeLoc TL) { 4678 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 4679 TL.getTypePtr()->getDecl()); 4680 if (!D) return QualType(); 4681 4682 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 4683 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 4684 return T; 4685} 4686 4687template<typename Derived> 4688QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 4689 TypeLocBuilder &TLB, 4690 TemplateTypeParmTypeLoc TL) { 4691 return TransformTypeSpecType(TLB, TL); 4692} 4693 4694template<typename Derived> 4695QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 4696 TypeLocBuilder &TLB, 4697 SubstTemplateTypeParmTypeLoc TL) { 4698 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 4699 4700 // Substitute into the replacement type, which itself might involve something 4701 // that needs to be transformed. This only tends to occur with default 4702 // template arguments of template template parameters. 4703 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 4704 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 4705 if (Replacement.isNull()) 4706 return QualType(); 4707 4708 // Always canonicalize the replacement type. 4709 Replacement = SemaRef.Context.getCanonicalType(Replacement); 4710 QualType Result 4711 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 4712 Replacement); 4713 4714 // Propagate type-source information. 4715 SubstTemplateTypeParmTypeLoc NewTL 4716 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 4717 NewTL.setNameLoc(TL.getNameLoc()); 4718 return Result; 4719 4720} 4721 4722template<typename Derived> 4723QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 4724 TypeLocBuilder &TLB, 4725 SubstTemplateTypeParmPackTypeLoc TL) { 4726 return TransformTypeSpecType(TLB, TL); 4727} 4728 4729template<typename Derived> 4730QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 4731 TypeLocBuilder &TLB, 4732 TemplateSpecializationTypeLoc TL) { 4733 const TemplateSpecializationType *T = TL.getTypePtr(); 4734 4735 // The nested-name-specifier never matters in a TemplateSpecializationType, 4736 // because we can't have a dependent nested-name-specifier anyway. 4737 CXXScopeSpec SS; 4738 TemplateName Template 4739 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 4740 TL.getTemplateNameLoc()); 4741 if (Template.isNull()) 4742 return QualType(); 4743 4744 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 4745} 4746 4747template<typename Derived> 4748QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 4749 AtomicTypeLoc TL) { 4750 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 4751 if (ValueType.isNull()) 4752 return QualType(); 4753 4754 QualType Result = TL.getType(); 4755 if (getDerived().AlwaysRebuild() || 4756 ValueType != TL.getValueLoc().getType()) { 4757 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 4758 if (Result.isNull()) 4759 return QualType(); 4760 } 4761 4762 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 4763 NewTL.setKWLoc(TL.getKWLoc()); 4764 NewTL.setLParenLoc(TL.getLParenLoc()); 4765 NewTL.setRParenLoc(TL.getRParenLoc()); 4766 4767 return Result; 4768} 4769 4770 /// \brief Simple iterator that traverses the template arguments in a 4771 /// container that provides a \c getArgLoc() member function. 4772 /// 4773 /// This iterator is intended to be used with the iterator form of 4774 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 4775 template<typename ArgLocContainer> 4776 class TemplateArgumentLocContainerIterator { 4777 ArgLocContainer *Container; 4778 unsigned Index; 4779 4780 public: 4781 typedef TemplateArgumentLoc value_type; 4782 typedef TemplateArgumentLoc reference; 4783 typedef int difference_type; 4784 typedef std::input_iterator_tag iterator_category; 4785 4786 class pointer { 4787 TemplateArgumentLoc Arg; 4788 4789 public: 4790 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4791 4792 const TemplateArgumentLoc *operator->() const { 4793 return &Arg; 4794 } 4795 }; 4796 4797 4798 TemplateArgumentLocContainerIterator() {} 4799 4800 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 4801 unsigned Index) 4802 : Container(&Container), Index(Index) { } 4803 4804 TemplateArgumentLocContainerIterator &operator++() { 4805 ++Index; 4806 return *this; 4807 } 4808 4809 TemplateArgumentLocContainerIterator operator++(int) { 4810 TemplateArgumentLocContainerIterator Old(*this); 4811 ++(*this); 4812 return Old; 4813 } 4814 4815 TemplateArgumentLoc operator*() const { 4816 return Container->getArgLoc(Index); 4817 } 4818 4819 pointer operator->() const { 4820 return pointer(Container->getArgLoc(Index)); 4821 } 4822 4823 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 4824 const TemplateArgumentLocContainerIterator &Y) { 4825 return X.Container == Y.Container && X.Index == Y.Index; 4826 } 4827 4828 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 4829 const TemplateArgumentLocContainerIterator &Y) { 4830 return !(X == Y); 4831 } 4832 }; 4833 4834 4835template <typename Derived> 4836QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 4837 TypeLocBuilder &TLB, 4838 TemplateSpecializationTypeLoc TL, 4839 TemplateName Template) { 4840 TemplateArgumentListInfo NewTemplateArgs; 4841 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 4842 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 4843 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 4844 ArgIterator; 4845 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 4846 ArgIterator(TL, TL.getNumArgs()), 4847 NewTemplateArgs)) 4848 return QualType(); 4849 4850 // FIXME: maybe don't rebuild if all the template arguments are the same. 4851 4852 QualType Result = 4853 getDerived().RebuildTemplateSpecializationType(Template, 4854 TL.getTemplateNameLoc(), 4855 NewTemplateArgs); 4856 4857 if (!Result.isNull()) { 4858 // Specializations of template template parameters are represented as 4859 // TemplateSpecializationTypes, and substitution of type alias templates 4860 // within a dependent context can transform them into 4861 // DependentTemplateSpecializationTypes. 4862 if (isa<DependentTemplateSpecializationType>(Result)) { 4863 DependentTemplateSpecializationTypeLoc NewTL 4864 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 4865 NewTL.setElaboratedKeywordLoc(SourceLocation()); 4866 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 4867 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 4868 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 4869 NewTL.setLAngleLoc(TL.getLAngleLoc()); 4870 NewTL.setRAngleLoc(TL.getRAngleLoc()); 4871 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4872 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4873 return Result; 4874 } 4875 4876 TemplateSpecializationTypeLoc NewTL 4877 = TLB.push<TemplateSpecializationTypeLoc>(Result); 4878 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 4879 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 4880 NewTL.setLAngleLoc(TL.getLAngleLoc()); 4881 NewTL.setRAngleLoc(TL.getRAngleLoc()); 4882 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4883 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4884 } 4885 4886 return Result; 4887} 4888 4889template <typename Derived> 4890QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 4891 TypeLocBuilder &TLB, 4892 DependentTemplateSpecializationTypeLoc TL, 4893 TemplateName Template, 4894 CXXScopeSpec &SS) { 4895 TemplateArgumentListInfo NewTemplateArgs; 4896 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 4897 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 4898 typedef TemplateArgumentLocContainerIterator< 4899 DependentTemplateSpecializationTypeLoc> ArgIterator; 4900 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 4901 ArgIterator(TL, TL.getNumArgs()), 4902 NewTemplateArgs)) 4903 return QualType(); 4904 4905 // FIXME: maybe don't rebuild if all the template arguments are the same. 4906 4907 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 4908 QualType Result 4909 = getSema().Context.getDependentTemplateSpecializationType( 4910 TL.getTypePtr()->getKeyword(), 4911 DTN->getQualifier(), 4912 DTN->getIdentifier(), 4913 NewTemplateArgs); 4914 4915 DependentTemplateSpecializationTypeLoc NewTL 4916 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 4917 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 4918 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 4919 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 4920 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 4921 NewTL.setLAngleLoc(TL.getLAngleLoc()); 4922 NewTL.setRAngleLoc(TL.getRAngleLoc()); 4923 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4924 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4925 return Result; 4926 } 4927 4928 QualType Result 4929 = getDerived().RebuildTemplateSpecializationType(Template, 4930 TL.getTemplateNameLoc(), 4931 NewTemplateArgs); 4932 4933 if (!Result.isNull()) { 4934 /// FIXME: Wrap this in an elaborated-type-specifier? 4935 TemplateSpecializationTypeLoc NewTL 4936 = TLB.push<TemplateSpecializationTypeLoc>(Result); 4937 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 4938 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 4939 NewTL.setLAngleLoc(TL.getLAngleLoc()); 4940 NewTL.setRAngleLoc(TL.getRAngleLoc()); 4941 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4942 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4943 } 4944 4945 return Result; 4946} 4947 4948template<typename Derived> 4949QualType 4950TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 4951 ElaboratedTypeLoc TL) { 4952 const ElaboratedType *T = TL.getTypePtr(); 4953 4954 NestedNameSpecifierLoc QualifierLoc; 4955 // NOTE: the qualifier in an ElaboratedType is optional. 4956 if (TL.getQualifierLoc()) { 4957 QualifierLoc 4958 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 4959 if (!QualifierLoc) 4960 return QualType(); 4961 } 4962 4963 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 4964 if (NamedT.isNull()) 4965 return QualType(); 4966 4967 // C++0x [dcl.type.elab]p2: 4968 // If the identifier resolves to a typedef-name or the simple-template-id 4969 // resolves to an alias template specialization, the 4970 // elaborated-type-specifier is ill-formed. 4971 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 4972 if (const TemplateSpecializationType *TST = 4973 NamedT->getAs<TemplateSpecializationType>()) { 4974 TemplateName Template = TST->getTemplateName(); 4975 if (TypeAliasTemplateDecl *TAT = 4976 dyn_cast_or_null<TypeAliasTemplateDecl>(Template.getAsTemplateDecl())) { 4977 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 4978 diag::err_tag_reference_non_tag) << 4; 4979 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 4980 } 4981 } 4982 } 4983 4984 QualType Result = TL.getType(); 4985 if (getDerived().AlwaysRebuild() || 4986 QualifierLoc != TL.getQualifierLoc() || 4987 NamedT != T->getNamedType()) { 4988 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 4989 T->getKeyword(), 4990 QualifierLoc, NamedT); 4991 if (Result.isNull()) 4992 return QualType(); 4993 } 4994 4995 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 4996 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 4997 NewTL.setQualifierLoc(QualifierLoc); 4998 return Result; 4999} 5000 5001template<typename Derived> 5002QualType TreeTransform<Derived>::TransformAttributedType( 5003 TypeLocBuilder &TLB, 5004 AttributedTypeLoc TL) { 5005 const AttributedType *oldType = TL.getTypePtr(); 5006 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 5007 if (modifiedType.isNull()) 5008 return QualType(); 5009 5010 QualType result = TL.getType(); 5011 5012 // FIXME: dependent operand expressions? 5013 if (getDerived().AlwaysRebuild() || 5014 modifiedType != oldType->getModifiedType()) { 5015 // TODO: this is really lame; we should really be rebuilding the 5016 // equivalent type from first principles. 5017 QualType equivalentType 5018 = getDerived().TransformType(oldType->getEquivalentType()); 5019 if (equivalentType.isNull()) 5020 return QualType(); 5021 result = SemaRef.Context.getAttributedType(oldType->getAttrKind(), 5022 modifiedType, 5023 equivalentType); 5024 } 5025 5026 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 5027 newTL.setAttrNameLoc(TL.getAttrNameLoc()); 5028 if (TL.hasAttrOperand()) 5029 newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 5030 if (TL.hasAttrExprOperand()) 5031 newTL.setAttrExprOperand(TL.getAttrExprOperand()); 5032 else if (TL.hasAttrEnumOperand()) 5033 newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc()); 5034 5035 return result; 5036} 5037 5038template<typename Derived> 5039QualType 5040TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 5041 ParenTypeLoc TL) { 5042 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 5043 if (Inner.isNull()) 5044 return QualType(); 5045 5046 QualType Result = TL.getType(); 5047 if (getDerived().AlwaysRebuild() || 5048 Inner != TL.getInnerLoc().getType()) { 5049 Result = getDerived().RebuildParenType(Inner); 5050 if (Result.isNull()) 5051 return QualType(); 5052 } 5053 5054 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 5055 NewTL.setLParenLoc(TL.getLParenLoc()); 5056 NewTL.setRParenLoc(TL.getRParenLoc()); 5057 return Result; 5058} 5059 5060template<typename Derived> 5061QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB, 5062 DependentNameTypeLoc TL) { 5063 const DependentNameType *T = TL.getTypePtr(); 5064 5065 NestedNameSpecifierLoc QualifierLoc 5066 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 5067 if (!QualifierLoc) 5068 return QualType(); 5069 5070 QualType Result 5071 = getDerived().RebuildDependentNameType(T->getKeyword(), 5072 TL.getElaboratedKeywordLoc(), 5073 QualifierLoc, 5074 T->getIdentifier(), 5075 TL.getNameLoc()); 5076 if (Result.isNull()) 5077 return QualType(); 5078 5079 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 5080 QualType NamedT = ElabT->getNamedType(); 5081 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 5082 5083 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 5084 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5085 NewTL.setQualifierLoc(QualifierLoc); 5086 } else { 5087 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 5088 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5089 NewTL.setQualifierLoc(QualifierLoc); 5090 NewTL.setNameLoc(TL.getNameLoc()); 5091 } 5092 return Result; 5093} 5094 5095template<typename Derived> 5096QualType TreeTransform<Derived>:: 5097 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 5098 DependentTemplateSpecializationTypeLoc TL) { 5099 NestedNameSpecifierLoc QualifierLoc; 5100 if (TL.getQualifierLoc()) { 5101 QualifierLoc 5102 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 5103 if (!QualifierLoc) 5104 return QualType(); 5105 } 5106 5107 return getDerived() 5108 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 5109} 5110 5111template<typename Derived> 5112QualType TreeTransform<Derived>:: 5113TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 5114 DependentTemplateSpecializationTypeLoc TL, 5115 NestedNameSpecifierLoc QualifierLoc) { 5116 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 5117 5118 TemplateArgumentListInfo NewTemplateArgs; 5119 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5120 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5121 5122 typedef TemplateArgumentLocContainerIterator< 5123 DependentTemplateSpecializationTypeLoc> ArgIterator; 5124 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5125 ArgIterator(TL, TL.getNumArgs()), 5126 NewTemplateArgs)) 5127 return QualType(); 5128 5129 QualType Result 5130 = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(), 5131 QualifierLoc, 5132 T->getIdentifier(), 5133 TL.getTemplateNameLoc(), 5134 NewTemplateArgs); 5135 if (Result.isNull()) 5136 return QualType(); 5137 5138 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 5139 QualType NamedT = ElabT->getNamedType(); 5140 5141 // Copy information relevant to the template specialization. 5142 TemplateSpecializationTypeLoc NamedTL 5143 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 5144 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5145 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5146 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 5147 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 5148 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5149 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5150 5151 // Copy information relevant to the elaborated type. 5152 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 5153 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5154 NewTL.setQualifierLoc(QualifierLoc); 5155 } else if (isa<DependentTemplateSpecializationType>(Result)) { 5156 DependentTemplateSpecializationTypeLoc SpecTL 5157 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5158 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5159 SpecTL.setQualifierLoc(QualifierLoc); 5160 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5161 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5162 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 5163 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 5164 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5165 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5166 } else { 5167 TemplateSpecializationTypeLoc SpecTL 5168 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5169 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5170 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5171 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 5172 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 5173 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5174 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5175 } 5176 return Result; 5177} 5178 5179template<typename Derived> 5180QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 5181 PackExpansionTypeLoc TL) { 5182 QualType Pattern 5183 = getDerived().TransformType(TLB, TL.getPatternLoc()); 5184 if (Pattern.isNull()) 5185 return QualType(); 5186 5187 QualType Result = TL.getType(); 5188 if (getDerived().AlwaysRebuild() || 5189 Pattern != TL.getPatternLoc().getType()) { 5190 Result = getDerived().RebuildPackExpansionType(Pattern, 5191 TL.getPatternLoc().getSourceRange(), 5192 TL.getEllipsisLoc(), 5193 TL.getTypePtr()->getNumExpansions()); 5194 if (Result.isNull()) 5195 return QualType(); 5196 } 5197 5198 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 5199 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 5200 return Result; 5201} 5202 5203template<typename Derived> 5204QualType 5205TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 5206 ObjCInterfaceTypeLoc TL) { 5207 // ObjCInterfaceType is never dependent. 5208 TLB.pushFullCopy(TL); 5209 return TL.getType(); 5210} 5211 5212template<typename Derived> 5213QualType 5214TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 5215 ObjCObjectTypeLoc TL) { 5216 // ObjCObjectType is never dependent. 5217 TLB.pushFullCopy(TL); 5218 return TL.getType(); 5219} 5220 5221template<typename Derived> 5222QualType 5223TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 5224 ObjCObjectPointerTypeLoc TL) { 5225 // ObjCObjectPointerType is never dependent. 5226 TLB.pushFullCopy(TL); 5227 return TL.getType(); 5228} 5229 5230//===----------------------------------------------------------------------===// 5231// Statement transformation 5232//===----------------------------------------------------------------------===// 5233template<typename Derived> 5234StmtResult 5235TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 5236 return SemaRef.Owned(S); 5237} 5238 5239template<typename Derived> 5240StmtResult 5241TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 5242 return getDerived().TransformCompoundStmt(S, false); 5243} 5244 5245template<typename Derived> 5246StmtResult 5247TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 5248 bool IsStmtExpr) { 5249 Sema::CompoundScopeRAII CompoundScope(getSema()); 5250 5251 bool SubStmtInvalid = false; 5252 bool SubStmtChanged = false; 5253 SmallVector<Stmt*, 8> Statements; 5254 for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 5255 B != BEnd; ++B) { 5256 StmtResult Result = getDerived().TransformStmt(*B); 5257 if (Result.isInvalid()) { 5258 // Immediately fail if this was a DeclStmt, since it's very 5259 // likely that this will cause problems for future statements. 5260 if (isa<DeclStmt>(*B)) 5261 return StmtError(); 5262 5263 // Otherwise, just keep processing substatements and fail later. 5264 SubStmtInvalid = true; 5265 continue; 5266 } 5267 5268 SubStmtChanged = SubStmtChanged || Result.get() != *B; 5269 Statements.push_back(Result.takeAs<Stmt>()); 5270 } 5271 5272 if (SubStmtInvalid) 5273 return StmtError(); 5274 5275 if (!getDerived().AlwaysRebuild() && 5276 !SubStmtChanged) 5277 return SemaRef.Owned(S); 5278 5279 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 5280 Statements, 5281 S->getRBracLoc(), 5282 IsStmtExpr); 5283} 5284 5285template<typename Derived> 5286StmtResult 5287TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 5288 ExprResult LHS, RHS; 5289 { 5290 EnterExpressionEvaluationContext Unevaluated(SemaRef, 5291 Sema::ConstantEvaluated); 5292 5293 // Transform the left-hand case value. 5294 LHS = getDerived().TransformExpr(S->getLHS()); 5295 LHS = SemaRef.ActOnConstantExpression(LHS); 5296 if (LHS.isInvalid()) 5297 return StmtError(); 5298 5299 // Transform the right-hand case value (for the GNU case-range extension). 5300 RHS = getDerived().TransformExpr(S->getRHS()); 5301 RHS = SemaRef.ActOnConstantExpression(RHS); 5302 if (RHS.isInvalid()) 5303 return StmtError(); 5304 } 5305 5306 // Build the case statement. 5307 // Case statements are always rebuilt so that they will attached to their 5308 // transformed switch statement. 5309 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 5310 LHS.get(), 5311 S->getEllipsisLoc(), 5312 RHS.get(), 5313 S->getColonLoc()); 5314 if (Case.isInvalid()) 5315 return StmtError(); 5316 5317 // Transform the statement following the case 5318 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5319 if (SubStmt.isInvalid()) 5320 return StmtError(); 5321 5322 // Attach the body to the case statement 5323 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 5324} 5325 5326template<typename Derived> 5327StmtResult 5328TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 5329 // Transform the statement following the default case 5330 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5331 if (SubStmt.isInvalid()) 5332 return StmtError(); 5333 5334 // Default statements are always rebuilt 5335 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 5336 SubStmt.get()); 5337} 5338 5339template<typename Derived> 5340StmtResult 5341TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 5342 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5343 if (SubStmt.isInvalid()) 5344 return StmtError(); 5345 5346 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 5347 S->getDecl()); 5348 if (!LD) 5349 return StmtError(); 5350 5351 5352 // FIXME: Pass the real colon location in. 5353 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 5354 cast<LabelDecl>(LD), SourceLocation(), 5355 SubStmt.get()); 5356} 5357 5358template<typename Derived> 5359StmtResult 5360TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) { 5361 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5362 if (SubStmt.isInvalid()) 5363 return StmtError(); 5364 5365 // TODO: transform attributes 5366 if (SubStmt.get() == S->getSubStmt() /* && attrs are the same */) 5367 return S; 5368 5369 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), 5370 S->getAttrs(), 5371 SubStmt.get()); 5372} 5373 5374template<typename Derived> 5375StmtResult 5376TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 5377 // Transform the condition 5378 ExprResult Cond; 5379 VarDecl *ConditionVar = 0; 5380 if (S->getConditionVariable()) { 5381 ConditionVar 5382 = cast_or_null<VarDecl>( 5383 getDerived().TransformDefinition( 5384 S->getConditionVariable()->getLocation(), 5385 S->getConditionVariable())); 5386 if (!ConditionVar) 5387 return StmtError(); 5388 } else { 5389 Cond = getDerived().TransformExpr(S->getCond()); 5390 5391 if (Cond.isInvalid()) 5392 return StmtError(); 5393 5394 // Convert the condition to a boolean value. 5395 if (S->getCond()) { 5396 ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getIfLoc(), 5397 Cond.get()); 5398 if (CondE.isInvalid()) 5399 return StmtError(); 5400 5401 Cond = CondE.get(); 5402 } 5403 } 5404 5405 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 5406 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5407 return StmtError(); 5408 5409 // Transform the "then" branch. 5410 StmtResult Then = getDerived().TransformStmt(S->getThen()); 5411 if (Then.isInvalid()) 5412 return StmtError(); 5413 5414 // Transform the "else" branch. 5415 StmtResult Else = getDerived().TransformStmt(S->getElse()); 5416 if (Else.isInvalid()) 5417 return StmtError(); 5418 5419 if (!getDerived().AlwaysRebuild() && 5420 FullCond.get() == S->getCond() && 5421 ConditionVar == S->getConditionVariable() && 5422 Then.get() == S->getThen() && 5423 Else.get() == S->getElse()) 5424 return SemaRef.Owned(S); 5425 5426 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 5427 Then.get(), 5428 S->getElseLoc(), Else.get()); 5429} 5430 5431template<typename Derived> 5432StmtResult 5433TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 5434 // Transform the condition. 5435 ExprResult Cond; 5436 VarDecl *ConditionVar = 0; 5437 if (S->getConditionVariable()) { 5438 ConditionVar 5439 = cast_or_null<VarDecl>( 5440 getDerived().TransformDefinition( 5441 S->getConditionVariable()->getLocation(), 5442 S->getConditionVariable())); 5443 if (!ConditionVar) 5444 return StmtError(); 5445 } else { 5446 Cond = getDerived().TransformExpr(S->getCond()); 5447 5448 if (Cond.isInvalid()) 5449 return StmtError(); 5450 } 5451 5452 // Rebuild the switch statement. 5453 StmtResult Switch 5454 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(), 5455 ConditionVar); 5456 if (Switch.isInvalid()) 5457 return StmtError(); 5458 5459 // Transform the body of the switch statement. 5460 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5461 if (Body.isInvalid()) 5462 return StmtError(); 5463 5464 // Complete the switch statement. 5465 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 5466 Body.get()); 5467} 5468 5469template<typename Derived> 5470StmtResult 5471TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 5472 // Transform the condition 5473 ExprResult Cond; 5474 VarDecl *ConditionVar = 0; 5475 if (S->getConditionVariable()) { 5476 ConditionVar 5477 = cast_or_null<VarDecl>( 5478 getDerived().TransformDefinition( 5479 S->getConditionVariable()->getLocation(), 5480 S->getConditionVariable())); 5481 if (!ConditionVar) 5482 return StmtError(); 5483 } else { 5484 Cond = getDerived().TransformExpr(S->getCond()); 5485 5486 if (Cond.isInvalid()) 5487 return StmtError(); 5488 5489 if (S->getCond()) { 5490 // Convert the condition to a boolean value. 5491 ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getWhileLoc(), 5492 Cond.get()); 5493 if (CondE.isInvalid()) 5494 return StmtError(); 5495 Cond = CondE; 5496 } 5497 } 5498 5499 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 5500 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5501 return StmtError(); 5502 5503 // Transform the body 5504 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5505 if (Body.isInvalid()) 5506 return StmtError(); 5507 5508 if (!getDerived().AlwaysRebuild() && 5509 FullCond.get() == S->getCond() && 5510 ConditionVar == S->getConditionVariable() && 5511 Body.get() == S->getBody()) 5512 return Owned(S); 5513 5514 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, 5515 ConditionVar, Body.get()); 5516} 5517 5518template<typename Derived> 5519StmtResult 5520TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 5521 // Transform the body 5522 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5523 if (Body.isInvalid()) 5524 return StmtError(); 5525 5526 // Transform the condition 5527 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 5528 if (Cond.isInvalid()) 5529 return StmtError(); 5530 5531 if (!getDerived().AlwaysRebuild() && 5532 Cond.get() == S->getCond() && 5533 Body.get() == S->getBody()) 5534 return SemaRef.Owned(S); 5535 5536 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 5537 /*FIXME:*/S->getWhileLoc(), Cond.get(), 5538 S->getRParenLoc()); 5539} 5540 5541template<typename Derived> 5542StmtResult 5543TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 5544 // Transform the initialization statement 5545 StmtResult Init = getDerived().TransformStmt(S->getInit()); 5546 if (Init.isInvalid()) 5547 return StmtError(); 5548 5549 // Transform the condition 5550 ExprResult Cond; 5551 VarDecl *ConditionVar = 0; 5552 if (S->getConditionVariable()) { 5553 ConditionVar 5554 = cast_or_null<VarDecl>( 5555 getDerived().TransformDefinition( 5556 S->getConditionVariable()->getLocation(), 5557 S->getConditionVariable())); 5558 if (!ConditionVar) 5559 return StmtError(); 5560 } else { 5561 Cond = getDerived().TransformExpr(S->getCond()); 5562 5563 if (Cond.isInvalid()) 5564 return StmtError(); 5565 5566 if (S->getCond()) { 5567 // Convert the condition to a boolean value. 5568 ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getForLoc(), 5569 Cond.get()); 5570 if (CondE.isInvalid()) 5571 return StmtError(); 5572 5573 Cond = CondE.get(); 5574 } 5575 } 5576 5577 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 5578 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5579 return StmtError(); 5580 5581 // Transform the increment 5582 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 5583 if (Inc.isInvalid()) 5584 return StmtError(); 5585 5586 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 5587 if (S->getInc() && !FullInc.get()) 5588 return StmtError(); 5589 5590 // Transform the body 5591 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5592 if (Body.isInvalid()) 5593 return StmtError(); 5594 5595 if (!getDerived().AlwaysRebuild() && 5596 Init.get() == S->getInit() && 5597 FullCond.get() == S->getCond() && 5598 Inc.get() == S->getInc() && 5599 Body.get() == S->getBody()) 5600 return SemaRef.Owned(S); 5601 5602 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 5603 Init.get(), FullCond, ConditionVar, 5604 FullInc, S->getRParenLoc(), Body.get()); 5605} 5606 5607template<typename Derived> 5608StmtResult 5609TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 5610 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 5611 S->getLabel()); 5612 if (!LD) 5613 return StmtError(); 5614 5615 // Goto statements must always be rebuilt, to resolve the label. 5616 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 5617 cast<LabelDecl>(LD)); 5618} 5619 5620template<typename Derived> 5621StmtResult 5622TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 5623 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 5624 if (Target.isInvalid()) 5625 return StmtError(); 5626 Target = SemaRef.MaybeCreateExprWithCleanups(Target.take()); 5627 5628 if (!getDerived().AlwaysRebuild() && 5629 Target.get() == S->getTarget()) 5630 return SemaRef.Owned(S); 5631 5632 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 5633 Target.get()); 5634} 5635 5636template<typename Derived> 5637StmtResult 5638TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 5639 return SemaRef.Owned(S); 5640} 5641 5642template<typename Derived> 5643StmtResult 5644TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 5645 return SemaRef.Owned(S); 5646} 5647 5648template<typename Derived> 5649StmtResult 5650TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 5651 ExprResult Result = getDerived().TransformExpr(S->getRetValue()); 5652 if (Result.isInvalid()) 5653 return StmtError(); 5654 5655 // FIXME: We always rebuild the return statement because there is no way 5656 // to tell whether the return type of the function has changed. 5657 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 5658} 5659 5660template<typename Derived> 5661StmtResult 5662TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 5663 bool DeclChanged = false; 5664 SmallVector<Decl *, 4> Decls; 5665 for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 5666 D != DEnd; ++D) { 5667 Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(), 5668 *D); 5669 if (!Transformed) 5670 return StmtError(); 5671 5672 if (Transformed != *D) 5673 DeclChanged = true; 5674 5675 Decls.push_back(Transformed); 5676 } 5677 5678 if (!getDerived().AlwaysRebuild() && !DeclChanged) 5679 return SemaRef.Owned(S); 5680 5681 return getDerived().RebuildDeclStmt(Decls, S->getStartLoc(), S->getEndLoc()); 5682} 5683 5684template<typename Derived> 5685StmtResult 5686TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 5687 5688 SmallVector<Expr*, 8> Constraints; 5689 SmallVector<Expr*, 8> Exprs; 5690 SmallVector<IdentifierInfo *, 4> Names; 5691 5692 ExprResult AsmString; 5693 SmallVector<Expr*, 8> Clobbers; 5694 5695 bool ExprsChanged = false; 5696 5697 // Go through the outputs. 5698 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 5699 Names.push_back(S->getOutputIdentifier(I)); 5700 5701 // No need to transform the constraint literal. 5702 Constraints.push_back(S->getOutputConstraintLiteral(I)); 5703 5704 // Transform the output expr. 5705 Expr *OutputExpr = S->getOutputExpr(I); 5706 ExprResult Result = getDerived().TransformExpr(OutputExpr); 5707 if (Result.isInvalid()) 5708 return StmtError(); 5709 5710 ExprsChanged |= Result.get() != OutputExpr; 5711 5712 Exprs.push_back(Result.get()); 5713 } 5714 5715 // Go through the inputs. 5716 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 5717 Names.push_back(S->getInputIdentifier(I)); 5718 5719 // No need to transform the constraint literal. 5720 Constraints.push_back(S->getInputConstraintLiteral(I)); 5721 5722 // Transform the input expr. 5723 Expr *InputExpr = S->getInputExpr(I); 5724 ExprResult Result = getDerived().TransformExpr(InputExpr); 5725 if (Result.isInvalid()) 5726 return StmtError(); 5727 5728 ExprsChanged |= Result.get() != InputExpr; 5729 5730 Exprs.push_back(Result.get()); 5731 } 5732 5733 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 5734 return SemaRef.Owned(S); 5735 5736 // Go through the clobbers. 5737 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 5738 Clobbers.push_back(S->getClobberStringLiteral(I)); 5739 5740 // No need to transform the asm string literal. 5741 AsmString = SemaRef.Owned(S->getAsmString()); 5742 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 5743 S->isVolatile(), S->getNumOutputs(), 5744 S->getNumInputs(), Names.data(), 5745 Constraints, Exprs, AsmString.get(), 5746 Clobbers, S->getRParenLoc()); 5747} 5748 5749template<typename Derived> 5750StmtResult 5751TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 5752 ArrayRef<Token> AsmToks = 5753 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 5754 5755 bool HadError = false, HadChange = false; 5756 5757 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 5758 SmallVector<Expr*, 8> TransformedExprs; 5759 TransformedExprs.reserve(SrcExprs.size()); 5760 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 5761 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 5762 if (!Result.isUsable()) { 5763 HadError = true; 5764 } else { 5765 HadChange |= (Result.get() != SrcExprs[i]); 5766 TransformedExprs.push_back(Result.take()); 5767 } 5768 } 5769 5770 if (HadError) return StmtError(); 5771 if (!HadChange && !getDerived().AlwaysRebuild()) 5772 return Owned(S); 5773 5774 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 5775 AsmToks, S->getAsmString(), 5776 S->getNumOutputs(), S->getNumInputs(), 5777 S->getAllConstraints(), S->getClobbers(), 5778 TransformedExprs, S->getEndLoc()); 5779} 5780 5781template<typename Derived> 5782StmtResult 5783TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 5784 // Transform the body of the @try. 5785 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 5786 if (TryBody.isInvalid()) 5787 return StmtError(); 5788 5789 // Transform the @catch statements (if present). 5790 bool AnyCatchChanged = false; 5791 SmallVector<Stmt*, 8> CatchStmts; 5792 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 5793 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 5794 if (Catch.isInvalid()) 5795 return StmtError(); 5796 if (Catch.get() != S->getCatchStmt(I)) 5797 AnyCatchChanged = true; 5798 CatchStmts.push_back(Catch.release()); 5799 } 5800 5801 // Transform the @finally statement (if present). 5802 StmtResult Finally; 5803 if (S->getFinallyStmt()) { 5804 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 5805 if (Finally.isInvalid()) 5806 return StmtError(); 5807 } 5808 5809 // If nothing changed, just retain this statement. 5810 if (!getDerived().AlwaysRebuild() && 5811 TryBody.get() == S->getTryBody() && 5812 !AnyCatchChanged && 5813 Finally.get() == S->getFinallyStmt()) 5814 return SemaRef.Owned(S); 5815 5816 // Build a new statement. 5817 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 5818 CatchStmts, Finally.get()); 5819} 5820 5821template<typename Derived> 5822StmtResult 5823TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 5824 // Transform the @catch parameter, if there is one. 5825 VarDecl *Var = 0; 5826 if (VarDecl *FromVar = S->getCatchParamDecl()) { 5827 TypeSourceInfo *TSInfo = 0; 5828 if (FromVar->getTypeSourceInfo()) { 5829 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 5830 if (!TSInfo) 5831 return StmtError(); 5832 } 5833 5834 QualType T; 5835 if (TSInfo) 5836 T = TSInfo->getType(); 5837 else { 5838 T = getDerived().TransformType(FromVar->getType()); 5839 if (T.isNull()) 5840 return StmtError(); 5841 } 5842 5843 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 5844 if (!Var) 5845 return StmtError(); 5846 } 5847 5848 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 5849 if (Body.isInvalid()) 5850 return StmtError(); 5851 5852 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 5853 S->getRParenLoc(), 5854 Var, Body.get()); 5855} 5856 5857template<typename Derived> 5858StmtResult 5859TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 5860 // Transform the body. 5861 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 5862 if (Body.isInvalid()) 5863 return StmtError(); 5864 5865 // If nothing changed, just retain this statement. 5866 if (!getDerived().AlwaysRebuild() && 5867 Body.get() == S->getFinallyBody()) 5868 return SemaRef.Owned(S); 5869 5870 // Build a new statement. 5871 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 5872 Body.get()); 5873} 5874 5875template<typename Derived> 5876StmtResult 5877TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 5878 ExprResult Operand; 5879 if (S->getThrowExpr()) { 5880 Operand = getDerived().TransformExpr(S->getThrowExpr()); 5881 if (Operand.isInvalid()) 5882 return StmtError(); 5883 } 5884 5885 if (!getDerived().AlwaysRebuild() && 5886 Operand.get() == S->getThrowExpr()) 5887 return getSema().Owned(S); 5888 5889 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 5890} 5891 5892template<typename Derived> 5893StmtResult 5894TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 5895 ObjCAtSynchronizedStmt *S) { 5896 // Transform the object we are locking. 5897 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 5898 if (Object.isInvalid()) 5899 return StmtError(); 5900 Object = 5901 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 5902 Object.get()); 5903 if (Object.isInvalid()) 5904 return StmtError(); 5905 5906 // Transform the body. 5907 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 5908 if (Body.isInvalid()) 5909 return StmtError(); 5910 5911 // If nothing change, just retain the current statement. 5912 if (!getDerived().AlwaysRebuild() && 5913 Object.get() == S->getSynchExpr() && 5914 Body.get() == S->getSynchBody()) 5915 return SemaRef.Owned(S); 5916 5917 // Build a new statement. 5918 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 5919 Object.get(), Body.get()); 5920} 5921 5922template<typename Derived> 5923StmtResult 5924TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 5925 ObjCAutoreleasePoolStmt *S) { 5926 // Transform the body. 5927 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 5928 if (Body.isInvalid()) 5929 return StmtError(); 5930 5931 // If nothing changed, just retain this statement. 5932 if (!getDerived().AlwaysRebuild() && 5933 Body.get() == S->getSubStmt()) 5934 return SemaRef.Owned(S); 5935 5936 // Build a new statement. 5937 return getDerived().RebuildObjCAutoreleasePoolStmt( 5938 S->getAtLoc(), Body.get()); 5939} 5940 5941template<typename Derived> 5942StmtResult 5943TreeTransform<Derived>::TransformObjCForCollectionStmt( 5944 ObjCForCollectionStmt *S) { 5945 // Transform the element statement. 5946 StmtResult Element = getDerived().TransformStmt(S->getElement()); 5947 if (Element.isInvalid()) 5948 return StmtError(); 5949 5950 // Transform the collection expression. 5951 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 5952 if (Collection.isInvalid()) 5953 return StmtError(); 5954 5955 // Transform the body. 5956 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5957 if (Body.isInvalid()) 5958 return StmtError(); 5959 5960 // If nothing changed, just retain this statement. 5961 if (!getDerived().AlwaysRebuild() && 5962 Element.get() == S->getElement() && 5963 Collection.get() == S->getCollection() && 5964 Body.get() == S->getBody()) 5965 return SemaRef.Owned(S); 5966 5967 // Build a new statement. 5968 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 5969 Element.get(), 5970 Collection.get(), 5971 S->getRParenLoc(), 5972 Body.get()); 5973} 5974 5975 5976template<typename Derived> 5977StmtResult 5978TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 5979 // Transform the exception declaration, if any. 5980 VarDecl *Var = 0; 5981 if (S->getExceptionDecl()) { 5982 VarDecl *ExceptionDecl = S->getExceptionDecl(); 5983 TypeSourceInfo *T = getDerived().TransformType( 5984 ExceptionDecl->getTypeSourceInfo()); 5985 if (!T) 5986 return StmtError(); 5987 5988 Var = getDerived().RebuildExceptionDecl(ExceptionDecl, T, 5989 ExceptionDecl->getInnerLocStart(), 5990 ExceptionDecl->getLocation(), 5991 ExceptionDecl->getIdentifier()); 5992 if (!Var || Var->isInvalidDecl()) 5993 return StmtError(); 5994 } 5995 5996 // Transform the actual exception handler. 5997 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 5998 if (Handler.isInvalid()) 5999 return StmtError(); 6000 6001 if (!getDerived().AlwaysRebuild() && 6002 !Var && 6003 Handler.get() == S->getHandlerBlock()) 6004 return SemaRef.Owned(S); 6005 6006 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 6007 Var, 6008 Handler.get()); 6009} 6010 6011template<typename Derived> 6012StmtResult 6013TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 6014 // Transform the try block itself. 6015 StmtResult TryBlock 6016 = getDerived().TransformCompoundStmt(S->getTryBlock()); 6017 if (TryBlock.isInvalid()) 6018 return StmtError(); 6019 6020 // Transform the handlers. 6021 bool HandlerChanged = false; 6022 SmallVector<Stmt*, 8> Handlers; 6023 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 6024 StmtResult Handler 6025 = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 6026 if (Handler.isInvalid()) 6027 return StmtError(); 6028 6029 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 6030 Handlers.push_back(Handler.takeAs<Stmt>()); 6031 } 6032 6033 if (!getDerived().AlwaysRebuild() && 6034 TryBlock.get() == S->getTryBlock() && 6035 !HandlerChanged) 6036 return SemaRef.Owned(S); 6037 6038 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 6039 Handlers); 6040} 6041 6042template<typename Derived> 6043StmtResult 6044TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 6045 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 6046 if (Range.isInvalid()) 6047 return StmtError(); 6048 6049 StmtResult BeginEnd = getDerived().TransformStmt(S->getBeginEndStmt()); 6050 if (BeginEnd.isInvalid()) 6051 return StmtError(); 6052 6053 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 6054 if (Cond.isInvalid()) 6055 return StmtError(); 6056 if (Cond.get()) 6057 Cond = SemaRef.CheckBooleanCondition(Cond.take(), S->getColonLoc()); 6058 if (Cond.isInvalid()) 6059 return StmtError(); 6060 if (Cond.get()) 6061 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.take()); 6062 6063 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 6064 if (Inc.isInvalid()) 6065 return StmtError(); 6066 if (Inc.get()) 6067 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.take()); 6068 6069 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 6070 if (LoopVar.isInvalid()) 6071 return StmtError(); 6072 6073 StmtResult NewStmt = S; 6074 if (getDerived().AlwaysRebuild() || 6075 Range.get() != S->getRangeStmt() || 6076 BeginEnd.get() != S->getBeginEndStmt() || 6077 Cond.get() != S->getCond() || 6078 Inc.get() != S->getInc() || 6079 LoopVar.get() != S->getLoopVarStmt()) { 6080 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 6081 S->getColonLoc(), Range.get(), 6082 BeginEnd.get(), Cond.get(), 6083 Inc.get(), LoopVar.get(), 6084 S->getRParenLoc()); 6085 if (NewStmt.isInvalid()) 6086 return StmtError(); 6087 } 6088 6089 StmtResult Body = getDerived().TransformStmt(S->getBody()); 6090 if (Body.isInvalid()) 6091 return StmtError(); 6092 6093 // Body has changed but we didn't rebuild the for-range statement. Rebuild 6094 // it now so we have a new statement to attach the body to. 6095 if (Body.get() != S->getBody() && NewStmt.get() == S) { 6096 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 6097 S->getColonLoc(), Range.get(), 6098 BeginEnd.get(), Cond.get(), 6099 Inc.get(), LoopVar.get(), 6100 S->getRParenLoc()); 6101 if (NewStmt.isInvalid()) 6102 return StmtError(); 6103 } 6104 6105 if (NewStmt.get() == S) 6106 return SemaRef.Owned(S); 6107 6108 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 6109} 6110 6111template<typename Derived> 6112StmtResult 6113TreeTransform<Derived>::TransformMSDependentExistsStmt( 6114 MSDependentExistsStmt *S) { 6115 // Transform the nested-name-specifier, if any. 6116 NestedNameSpecifierLoc QualifierLoc; 6117 if (S->getQualifierLoc()) { 6118 QualifierLoc 6119 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 6120 if (!QualifierLoc) 6121 return StmtError(); 6122 } 6123 6124 // Transform the declaration name. 6125 DeclarationNameInfo NameInfo = S->getNameInfo(); 6126 if (NameInfo.getName()) { 6127 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 6128 if (!NameInfo.getName()) 6129 return StmtError(); 6130 } 6131 6132 // Check whether anything changed. 6133 if (!getDerived().AlwaysRebuild() && 6134 QualifierLoc == S->getQualifierLoc() && 6135 NameInfo.getName() == S->getNameInfo().getName()) 6136 return S; 6137 6138 // Determine whether this name exists, if we can. 6139 CXXScopeSpec SS; 6140 SS.Adopt(QualifierLoc); 6141 bool Dependent = false; 6142 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/0, SS, NameInfo)) { 6143 case Sema::IER_Exists: 6144 if (S->isIfExists()) 6145 break; 6146 6147 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 6148 6149 case Sema::IER_DoesNotExist: 6150 if (S->isIfNotExists()) 6151 break; 6152 6153 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 6154 6155 case Sema::IER_Dependent: 6156 Dependent = true; 6157 break; 6158 6159 case Sema::IER_Error: 6160 return StmtError(); 6161 } 6162 6163 // We need to continue with the instantiation, so do so now. 6164 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 6165 if (SubStmt.isInvalid()) 6166 return StmtError(); 6167 6168 // If we have resolved the name, just transform to the substatement. 6169 if (!Dependent) 6170 return SubStmt; 6171 6172 // The name is still dependent, so build a dependent expression again. 6173 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 6174 S->isIfExists(), 6175 QualifierLoc, 6176 NameInfo, 6177 SubStmt.get()); 6178} 6179 6180template<typename Derived> 6181ExprResult 6182TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 6183 NestedNameSpecifierLoc QualifierLoc; 6184 if (E->getQualifierLoc()) { 6185 QualifierLoc 6186 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 6187 if (!QualifierLoc) 6188 return ExprError(); 6189 } 6190 6191 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 6192 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 6193 if (!PD) 6194 return ExprError(); 6195 6196 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 6197 if (Base.isInvalid()) 6198 return ExprError(); 6199 6200 return new (SemaRef.getASTContext()) 6201 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 6202 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 6203 QualifierLoc, E->getMemberLoc()); 6204} 6205 6206template<typename Derived> 6207StmtResult 6208TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 6209 StmtResult TryBlock; // = getDerived().TransformCompoundStmt(S->getTryBlock()); 6210 if(TryBlock.isInvalid()) return StmtError(); 6211 6212 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 6213 if(!getDerived().AlwaysRebuild() && 6214 TryBlock.get() == S->getTryBlock() && 6215 Handler.get() == S->getHandler()) 6216 return SemaRef.Owned(S); 6217 6218 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), 6219 S->getTryLoc(), 6220 TryBlock.take(), 6221 Handler.take()); 6222} 6223 6224template<typename Derived> 6225StmtResult 6226TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 6227 StmtResult Block; // = getDerived().TransformCompoundStatement(S->getBlock()); 6228 if(Block.isInvalid()) return StmtError(); 6229 6230 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), 6231 Block.take()); 6232} 6233 6234template<typename Derived> 6235StmtResult 6236TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 6237 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 6238 if(FilterExpr.isInvalid()) return StmtError(); 6239 6240 StmtResult Block; // = getDerived().TransformCompoundStatement(S->getBlock()); 6241 if(Block.isInvalid()) return StmtError(); 6242 6243 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), 6244 FilterExpr.take(), 6245 Block.take()); 6246} 6247 6248template<typename Derived> 6249StmtResult 6250TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 6251 if(isa<SEHFinallyStmt>(Handler)) 6252 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 6253 else 6254 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 6255} 6256 6257template<typename Derived> 6258StmtResult 6259TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { 6260 DeclarationNameInfo DirName; 6261 getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, 0); 6262 6263 // Transform the clauses 6264 llvm::SmallVector<OMPClause *, 16> TClauses; 6265 ArrayRef<OMPClause *> Clauses = D->clauses(); 6266 TClauses.reserve(Clauses.size()); 6267 for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end(); 6268 I != E; ++I) { 6269 if (*I) { 6270 OMPClause *Clause = getDerived().TransformOMPClause(*I); 6271 if (!Clause) { 6272 getSema().EndOpenMPDSABlock(0); 6273 return StmtError(); 6274 } 6275 TClauses.push_back(Clause); 6276 } 6277 else { 6278 TClauses.push_back(0); 6279 } 6280 } 6281 if (!D->getAssociatedStmt()) { 6282 getSema().EndOpenMPDSABlock(0); 6283 return StmtError(); 6284 } 6285 StmtResult AssociatedStmt = 6286 getDerived().TransformStmt(D->getAssociatedStmt()); 6287 if (AssociatedStmt.isInvalid()) { 6288 getSema().EndOpenMPDSABlock(0); 6289 return StmtError(); 6290 } 6291 6292 StmtResult Res = getDerived().RebuildOMPParallelDirective(TClauses, 6293 AssociatedStmt.take(), 6294 D->getLocStart(), 6295 D->getLocEnd()); 6296 getSema().EndOpenMPDSABlock(Res.get()); 6297 return Res; 6298} 6299 6300template<typename Derived> 6301OMPClause * 6302TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { 6303 return getDerived().RebuildOMPDefaultClause(C->getDefaultKind(), 6304 C->getDefaultKindKwLoc(), 6305 C->getLocStart(), 6306 C->getLParenLoc(), 6307 C->getLocEnd()); 6308} 6309 6310template<typename Derived> 6311OMPClause * 6312TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) { 6313 llvm::SmallVector<Expr *, 16> Vars; 6314 Vars.reserve(C->varlist_size()); 6315 for (OMPVarList<OMPPrivateClause>::varlist_iterator I = C->varlist_begin(), 6316 E = C->varlist_end(); 6317 I != E; ++I) { 6318 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(*I)); 6319 if (EVar.isInvalid()) 6320 return 0; 6321 Vars.push_back(EVar.take()); 6322 } 6323 return getDerived().RebuildOMPPrivateClause(Vars, 6324 C->getLocStart(), 6325 C->getLParenLoc(), 6326 C->getLocEnd()); 6327} 6328 6329template<typename Derived> 6330OMPClause * 6331TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) { 6332 llvm::SmallVector<Expr *, 16> Vars; 6333 Vars.reserve(C->varlist_size()); 6334 for (OMPVarList<OMPSharedClause>::varlist_iterator I = C->varlist_begin(), 6335 E = C->varlist_end(); 6336 I != E; ++I) { 6337 ExprResult EVar = getDerived().TransformExpr(cast<Expr>(*I)); 6338 if (EVar.isInvalid()) 6339 return 0; 6340 Vars.push_back(EVar.take()); 6341 } 6342 return getDerived().RebuildOMPSharedClause(Vars, 6343 C->getLocStart(), 6344 C->getLParenLoc(), 6345 C->getLocEnd()); 6346} 6347 6348//===----------------------------------------------------------------------===// 6349// Expression transformation 6350//===----------------------------------------------------------------------===// 6351template<typename Derived> 6352ExprResult 6353TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 6354 return SemaRef.Owned(E); 6355} 6356 6357template<typename Derived> 6358ExprResult 6359TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 6360 NestedNameSpecifierLoc QualifierLoc; 6361 if (E->getQualifierLoc()) { 6362 QualifierLoc 6363 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 6364 if (!QualifierLoc) 6365 return ExprError(); 6366 } 6367 6368 ValueDecl *ND 6369 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 6370 E->getDecl())); 6371 if (!ND) 6372 return ExprError(); 6373 6374 DeclarationNameInfo NameInfo = E->getNameInfo(); 6375 if (NameInfo.getName()) { 6376 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 6377 if (!NameInfo.getName()) 6378 return ExprError(); 6379 } 6380 6381 if (!getDerived().AlwaysRebuild() && 6382 QualifierLoc == E->getQualifierLoc() && 6383 ND == E->getDecl() && 6384 NameInfo.getName() == E->getDecl()->getDeclName() && 6385 !E->hasExplicitTemplateArgs()) { 6386 6387 // Mark it referenced in the new context regardless. 6388 // FIXME: this is a bit instantiation-specific. 6389 SemaRef.MarkDeclRefReferenced(E); 6390 6391 return SemaRef.Owned(E); 6392 } 6393 6394 TemplateArgumentListInfo TransArgs, *TemplateArgs = 0; 6395 if (E->hasExplicitTemplateArgs()) { 6396 TemplateArgs = &TransArgs; 6397 TransArgs.setLAngleLoc(E->getLAngleLoc()); 6398 TransArgs.setRAngleLoc(E->getRAngleLoc()); 6399 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 6400 E->getNumTemplateArgs(), 6401 TransArgs)) 6402 return ExprError(); 6403 } 6404 6405 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 6406 TemplateArgs); 6407} 6408 6409template<typename Derived> 6410ExprResult 6411TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 6412 return SemaRef.Owned(E); 6413} 6414 6415template<typename Derived> 6416ExprResult 6417TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 6418 return SemaRef.Owned(E); 6419} 6420 6421template<typename Derived> 6422ExprResult 6423TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 6424 return SemaRef.Owned(E); 6425} 6426 6427template<typename Derived> 6428ExprResult 6429TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 6430 return SemaRef.Owned(E); 6431} 6432 6433template<typename Derived> 6434ExprResult 6435TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 6436 return SemaRef.Owned(E); 6437} 6438 6439template<typename Derived> 6440ExprResult 6441TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 6442 if (FunctionDecl *FD = E->getDirectCallee()) 6443 SemaRef.MarkFunctionReferenced(E->getLocStart(), FD); 6444 return SemaRef.MaybeBindToTemporary(E); 6445} 6446 6447template<typename Derived> 6448ExprResult 6449TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 6450 ExprResult ControllingExpr = 6451 getDerived().TransformExpr(E->getControllingExpr()); 6452 if (ControllingExpr.isInvalid()) 6453 return ExprError(); 6454 6455 SmallVector<Expr *, 4> AssocExprs; 6456 SmallVector<TypeSourceInfo *, 4> AssocTypes; 6457 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 6458 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 6459 if (TS) { 6460 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 6461 if (!AssocType) 6462 return ExprError(); 6463 AssocTypes.push_back(AssocType); 6464 } else { 6465 AssocTypes.push_back(0); 6466 } 6467 6468 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 6469 if (AssocExpr.isInvalid()) 6470 return ExprError(); 6471 AssocExprs.push_back(AssocExpr.release()); 6472 } 6473 6474 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 6475 E->getDefaultLoc(), 6476 E->getRParenLoc(), 6477 ControllingExpr.release(), 6478 AssocTypes, 6479 AssocExprs); 6480} 6481 6482template<typename Derived> 6483ExprResult 6484TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 6485 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 6486 if (SubExpr.isInvalid()) 6487 return ExprError(); 6488 6489 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 6490 return SemaRef.Owned(E); 6491 6492 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 6493 E->getRParen()); 6494} 6495 6496/// \brief The operand of a unary address-of operator has special rules: it's 6497/// allowed to refer to a non-static member of a class even if there's no 'this' 6498/// object available. 6499template<typename Derived> 6500ExprResult 6501TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 6502 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 6503 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true); 6504 else 6505 return getDerived().TransformExpr(E); 6506} 6507 6508template<typename Derived> 6509ExprResult 6510TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 6511 ExprResult SubExpr; 6512 if (E->getOpcode() == UO_AddrOf) 6513 SubExpr = TransformAddressOfOperand(E->getSubExpr()); 6514 else 6515 SubExpr = TransformExpr(E->getSubExpr()); 6516 if (SubExpr.isInvalid()) 6517 return ExprError(); 6518 6519 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 6520 return SemaRef.Owned(E); 6521 6522 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 6523 E->getOpcode(), 6524 SubExpr.get()); 6525} 6526 6527template<typename Derived> 6528ExprResult 6529TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 6530 // Transform the type. 6531 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 6532 if (!Type) 6533 return ExprError(); 6534 6535 // Transform all of the components into components similar to what the 6536 // parser uses. 6537 // FIXME: It would be slightly more efficient in the non-dependent case to 6538 // just map FieldDecls, rather than requiring the rebuilder to look for 6539 // the fields again. However, __builtin_offsetof is rare enough in 6540 // template code that we don't care. 6541 bool ExprChanged = false; 6542 typedef Sema::OffsetOfComponent Component; 6543 typedef OffsetOfExpr::OffsetOfNode Node; 6544 SmallVector<Component, 4> Components; 6545 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 6546 const Node &ON = E->getComponent(I); 6547 Component Comp; 6548 Comp.isBrackets = true; 6549 Comp.LocStart = ON.getSourceRange().getBegin(); 6550 Comp.LocEnd = ON.getSourceRange().getEnd(); 6551 switch (ON.getKind()) { 6552 case Node::Array: { 6553 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 6554 ExprResult Index = getDerived().TransformExpr(FromIndex); 6555 if (Index.isInvalid()) 6556 return ExprError(); 6557 6558 ExprChanged = ExprChanged || Index.get() != FromIndex; 6559 Comp.isBrackets = true; 6560 Comp.U.E = Index.get(); 6561 break; 6562 } 6563 6564 case Node::Field: 6565 case Node::Identifier: 6566 Comp.isBrackets = false; 6567 Comp.U.IdentInfo = ON.getFieldName(); 6568 if (!Comp.U.IdentInfo) 6569 continue; 6570 6571 break; 6572 6573 case Node::Base: 6574 // Will be recomputed during the rebuild. 6575 continue; 6576 } 6577 6578 Components.push_back(Comp); 6579 } 6580 6581 // If nothing changed, retain the existing expression. 6582 if (!getDerived().AlwaysRebuild() && 6583 Type == E->getTypeSourceInfo() && 6584 !ExprChanged) 6585 return SemaRef.Owned(E); 6586 6587 // Build a new offsetof expression. 6588 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 6589 Components.data(), Components.size(), 6590 E->getRParenLoc()); 6591} 6592 6593template<typename Derived> 6594ExprResult 6595TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 6596 assert(getDerived().AlreadyTransformed(E->getType()) && 6597 "opaque value expression requires transformation"); 6598 return SemaRef.Owned(E); 6599} 6600 6601template<typename Derived> 6602ExprResult 6603TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 6604 // Rebuild the syntactic form. The original syntactic form has 6605 // opaque-value expressions in it, so strip those away and rebuild 6606 // the result. This is a really awful way of doing this, but the 6607 // better solution (rebuilding the semantic expressions and 6608 // rebinding OVEs as necessary) doesn't work; we'd need 6609 // TreeTransform to not strip away implicit conversions. 6610 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 6611 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 6612 if (result.isInvalid()) return ExprError(); 6613 6614 // If that gives us a pseudo-object result back, the pseudo-object 6615 // expression must have been an lvalue-to-rvalue conversion which we 6616 // should reapply. 6617 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 6618 result = SemaRef.checkPseudoObjectRValue(result.take()); 6619 6620 return result; 6621} 6622 6623template<typename Derived> 6624ExprResult 6625TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 6626 UnaryExprOrTypeTraitExpr *E) { 6627 if (E->isArgumentType()) { 6628 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 6629 6630 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 6631 if (!NewT) 6632 return ExprError(); 6633 6634 if (!getDerived().AlwaysRebuild() && OldT == NewT) 6635 return SemaRef.Owned(E); 6636 6637 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 6638 E->getKind(), 6639 E->getSourceRange()); 6640 } 6641 6642 // C++0x [expr.sizeof]p1: 6643 // The operand is either an expression, which is an unevaluated operand 6644 // [...] 6645 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 6646 Sema::ReuseLambdaContextDecl); 6647 6648 ExprResult SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 6649 if (SubExpr.isInvalid()) 6650 return ExprError(); 6651 6652 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 6653 return SemaRef.Owned(E); 6654 6655 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 6656 E->getOperatorLoc(), 6657 E->getKind(), 6658 E->getSourceRange()); 6659} 6660 6661template<typename Derived> 6662ExprResult 6663TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 6664 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 6665 if (LHS.isInvalid()) 6666 return ExprError(); 6667 6668 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 6669 if (RHS.isInvalid()) 6670 return ExprError(); 6671 6672 6673 if (!getDerived().AlwaysRebuild() && 6674 LHS.get() == E->getLHS() && 6675 RHS.get() == E->getRHS()) 6676 return SemaRef.Owned(E); 6677 6678 return getDerived().RebuildArraySubscriptExpr(LHS.get(), 6679 /*FIXME:*/E->getLHS()->getLocStart(), 6680 RHS.get(), 6681 E->getRBracketLoc()); 6682} 6683 6684template<typename Derived> 6685ExprResult 6686TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 6687 // Transform the callee. 6688 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 6689 if (Callee.isInvalid()) 6690 return ExprError(); 6691 6692 // Transform arguments. 6693 bool ArgChanged = false; 6694 SmallVector<Expr*, 8> Args; 6695 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 6696 &ArgChanged)) 6697 return ExprError(); 6698 6699 if (!getDerived().AlwaysRebuild() && 6700 Callee.get() == E->getCallee() && 6701 !ArgChanged) 6702 return SemaRef.MaybeBindToTemporary(E); 6703 6704 // FIXME: Wrong source location information for the '('. 6705 SourceLocation FakeLParenLoc 6706 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 6707 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 6708 Args, 6709 E->getRParenLoc()); 6710} 6711 6712template<typename Derived> 6713ExprResult 6714TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 6715 ExprResult Base = getDerived().TransformExpr(E->getBase()); 6716 if (Base.isInvalid()) 6717 return ExprError(); 6718 6719 NestedNameSpecifierLoc QualifierLoc; 6720 if (E->hasQualifier()) { 6721 QualifierLoc 6722 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 6723 6724 if (!QualifierLoc) 6725 return ExprError(); 6726 } 6727 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 6728 6729 ValueDecl *Member 6730 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 6731 E->getMemberDecl())); 6732 if (!Member) 6733 return ExprError(); 6734 6735 NamedDecl *FoundDecl = E->getFoundDecl(); 6736 if (FoundDecl == E->getMemberDecl()) { 6737 FoundDecl = Member; 6738 } else { 6739 FoundDecl = cast_or_null<NamedDecl>( 6740 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 6741 if (!FoundDecl) 6742 return ExprError(); 6743 } 6744 6745 if (!getDerived().AlwaysRebuild() && 6746 Base.get() == E->getBase() && 6747 QualifierLoc == E->getQualifierLoc() && 6748 Member == E->getMemberDecl() && 6749 FoundDecl == E->getFoundDecl() && 6750 !E->hasExplicitTemplateArgs()) { 6751 6752 // Mark it referenced in the new context regardless. 6753 // FIXME: this is a bit instantiation-specific. 6754 SemaRef.MarkMemberReferenced(E); 6755 6756 return SemaRef.Owned(E); 6757 } 6758 6759 TemplateArgumentListInfo TransArgs; 6760 if (E->hasExplicitTemplateArgs()) { 6761 TransArgs.setLAngleLoc(E->getLAngleLoc()); 6762 TransArgs.setRAngleLoc(E->getRAngleLoc()); 6763 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 6764 E->getNumTemplateArgs(), 6765 TransArgs)) 6766 return ExprError(); 6767 } 6768 6769 // FIXME: Bogus source location for the operator 6770 SourceLocation FakeOperatorLoc 6771 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 6772 6773 // FIXME: to do this check properly, we will need to preserve the 6774 // first-qualifier-in-scope here, just in case we had a dependent 6775 // base (and therefore couldn't do the check) and a 6776 // nested-name-qualifier (and therefore could do the lookup). 6777 NamedDecl *FirstQualifierInScope = 0; 6778 6779 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 6780 E->isArrow(), 6781 QualifierLoc, 6782 TemplateKWLoc, 6783 E->getMemberNameInfo(), 6784 Member, 6785 FoundDecl, 6786 (E->hasExplicitTemplateArgs() 6787 ? &TransArgs : 0), 6788 FirstQualifierInScope); 6789} 6790 6791template<typename Derived> 6792ExprResult 6793TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 6794 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 6795 if (LHS.isInvalid()) 6796 return ExprError(); 6797 6798 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 6799 if (RHS.isInvalid()) 6800 return ExprError(); 6801 6802 if (!getDerived().AlwaysRebuild() && 6803 LHS.get() == E->getLHS() && 6804 RHS.get() == E->getRHS()) 6805 return SemaRef.Owned(E); 6806 6807 Sema::FPContractStateRAII FPContractState(getSema()); 6808 getSema().FPFeatures.fp_contract = E->isFPContractable(); 6809 6810 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 6811 LHS.get(), RHS.get()); 6812} 6813 6814template<typename Derived> 6815ExprResult 6816TreeTransform<Derived>::TransformCompoundAssignOperator( 6817 CompoundAssignOperator *E) { 6818 return getDerived().TransformBinaryOperator(E); 6819} 6820 6821template<typename Derived> 6822ExprResult TreeTransform<Derived>:: 6823TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 6824 // Just rebuild the common and RHS expressions and see whether we 6825 // get any changes. 6826 6827 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 6828 if (commonExpr.isInvalid()) 6829 return ExprError(); 6830 6831 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 6832 if (rhs.isInvalid()) 6833 return ExprError(); 6834 6835 if (!getDerived().AlwaysRebuild() && 6836 commonExpr.get() == e->getCommon() && 6837 rhs.get() == e->getFalseExpr()) 6838 return SemaRef.Owned(e); 6839 6840 return getDerived().RebuildConditionalOperator(commonExpr.take(), 6841 e->getQuestionLoc(), 6842 0, 6843 e->getColonLoc(), 6844 rhs.get()); 6845} 6846 6847template<typename Derived> 6848ExprResult 6849TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 6850 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 6851 if (Cond.isInvalid()) 6852 return ExprError(); 6853 6854 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 6855 if (LHS.isInvalid()) 6856 return ExprError(); 6857 6858 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 6859 if (RHS.isInvalid()) 6860 return ExprError(); 6861 6862 if (!getDerived().AlwaysRebuild() && 6863 Cond.get() == E->getCond() && 6864 LHS.get() == E->getLHS() && 6865 RHS.get() == E->getRHS()) 6866 return SemaRef.Owned(E); 6867 6868 return getDerived().RebuildConditionalOperator(Cond.get(), 6869 E->getQuestionLoc(), 6870 LHS.get(), 6871 E->getColonLoc(), 6872 RHS.get()); 6873} 6874 6875template<typename Derived> 6876ExprResult 6877TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 6878 // Implicit casts are eliminated during transformation, since they 6879 // will be recomputed by semantic analysis after transformation. 6880 return getDerived().TransformExpr(E->getSubExprAsWritten()); 6881} 6882 6883template<typename Derived> 6884ExprResult 6885TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 6886 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 6887 if (!Type) 6888 return ExprError(); 6889 6890 ExprResult SubExpr 6891 = getDerived().TransformExpr(E->getSubExprAsWritten()); 6892 if (SubExpr.isInvalid()) 6893 return ExprError(); 6894 6895 if (!getDerived().AlwaysRebuild() && 6896 Type == E->getTypeInfoAsWritten() && 6897 SubExpr.get() == E->getSubExpr()) 6898 return SemaRef.Owned(E); 6899 6900 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 6901 Type, 6902 E->getRParenLoc(), 6903 SubExpr.get()); 6904} 6905 6906template<typename Derived> 6907ExprResult 6908TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 6909 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 6910 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 6911 if (!NewT) 6912 return ExprError(); 6913 6914 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 6915 if (Init.isInvalid()) 6916 return ExprError(); 6917 6918 if (!getDerived().AlwaysRebuild() && 6919 OldT == NewT && 6920 Init.get() == E->getInitializer()) 6921 return SemaRef.MaybeBindToTemporary(E); 6922 6923 // Note: the expression type doesn't necessarily match the 6924 // type-as-written, but that's okay, because it should always be 6925 // derivable from the initializer. 6926 6927 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 6928 /*FIXME:*/E->getInitializer()->getLocEnd(), 6929 Init.get()); 6930} 6931 6932template<typename Derived> 6933ExprResult 6934TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 6935 ExprResult Base = getDerived().TransformExpr(E->getBase()); 6936 if (Base.isInvalid()) 6937 return ExprError(); 6938 6939 if (!getDerived().AlwaysRebuild() && 6940 Base.get() == E->getBase()) 6941 return SemaRef.Owned(E); 6942 6943 // FIXME: Bad source location 6944 SourceLocation FakeOperatorLoc 6945 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 6946 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 6947 E->getAccessorLoc(), 6948 E->getAccessor()); 6949} 6950 6951template<typename Derived> 6952ExprResult 6953TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 6954 bool InitChanged = false; 6955 6956 SmallVector<Expr*, 4> Inits; 6957 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 6958 Inits, &InitChanged)) 6959 return ExprError(); 6960 6961 if (!getDerived().AlwaysRebuild() && !InitChanged) 6962 return SemaRef.Owned(E); 6963 6964 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 6965 E->getRBraceLoc(), E->getType()); 6966} 6967 6968template<typename Derived> 6969ExprResult 6970TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 6971 Designation Desig; 6972 6973 // transform the initializer value 6974 ExprResult Init = getDerived().TransformExpr(E->getInit()); 6975 if (Init.isInvalid()) 6976 return ExprError(); 6977 6978 // transform the designators. 6979 SmallVector<Expr*, 4> ArrayExprs; 6980 bool ExprChanged = false; 6981 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 6982 DEnd = E->designators_end(); 6983 D != DEnd; ++D) { 6984 if (D->isFieldDesignator()) { 6985 Desig.AddDesignator(Designator::getField(D->getFieldName(), 6986 D->getDotLoc(), 6987 D->getFieldLoc())); 6988 continue; 6989 } 6990 6991 if (D->isArrayDesignator()) { 6992 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 6993 if (Index.isInvalid()) 6994 return ExprError(); 6995 6996 Desig.AddDesignator(Designator::getArray(Index.get(), 6997 D->getLBracketLoc())); 6998 6999 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 7000 ArrayExprs.push_back(Index.release()); 7001 continue; 7002 } 7003 7004 assert(D->isArrayRangeDesignator() && "New kind of designator?"); 7005 ExprResult Start 7006 = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 7007 if (Start.isInvalid()) 7008 return ExprError(); 7009 7010 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 7011 if (End.isInvalid()) 7012 return ExprError(); 7013 7014 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 7015 End.get(), 7016 D->getLBracketLoc(), 7017 D->getEllipsisLoc())); 7018 7019 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 7020 End.get() != E->getArrayRangeEnd(*D); 7021 7022 ArrayExprs.push_back(Start.release()); 7023 ArrayExprs.push_back(End.release()); 7024 } 7025 7026 if (!getDerived().AlwaysRebuild() && 7027 Init.get() == E->getInit() && 7028 !ExprChanged) 7029 return SemaRef.Owned(E); 7030 7031 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 7032 E->getEqualOrColonLoc(), 7033 E->usesGNUSyntax(), Init.get()); 7034} 7035 7036template<typename Derived> 7037ExprResult 7038TreeTransform<Derived>::TransformImplicitValueInitExpr( 7039 ImplicitValueInitExpr *E) { 7040 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 7041 7042 // FIXME: Will we ever have proper type location here? Will we actually 7043 // need to transform the type? 7044 QualType T = getDerived().TransformType(E->getType()); 7045 if (T.isNull()) 7046 return ExprError(); 7047 7048 if (!getDerived().AlwaysRebuild() && 7049 T == E->getType()) 7050 return SemaRef.Owned(E); 7051 7052 return getDerived().RebuildImplicitValueInitExpr(T); 7053} 7054 7055template<typename Derived> 7056ExprResult 7057TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 7058 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 7059 if (!TInfo) 7060 return ExprError(); 7061 7062 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 7063 if (SubExpr.isInvalid()) 7064 return ExprError(); 7065 7066 if (!getDerived().AlwaysRebuild() && 7067 TInfo == E->getWrittenTypeInfo() && 7068 SubExpr.get() == E->getSubExpr()) 7069 return SemaRef.Owned(E); 7070 7071 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 7072 TInfo, E->getRParenLoc()); 7073} 7074 7075template<typename Derived> 7076ExprResult 7077TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 7078 bool ArgumentChanged = false; 7079 SmallVector<Expr*, 4> Inits; 7080 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 7081 &ArgumentChanged)) 7082 return ExprError(); 7083 7084 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 7085 Inits, 7086 E->getRParenLoc()); 7087} 7088 7089/// \brief Transform an address-of-label expression. 7090/// 7091/// By default, the transformation of an address-of-label expression always 7092/// rebuilds the expression, so that the label identifier can be resolved to 7093/// the corresponding label statement by semantic analysis. 7094template<typename Derived> 7095ExprResult 7096TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 7097 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 7098 E->getLabel()); 7099 if (!LD) 7100 return ExprError(); 7101 7102 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 7103 cast<LabelDecl>(LD)); 7104} 7105 7106template<typename Derived> 7107ExprResult 7108TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 7109 SemaRef.ActOnStartStmtExpr(); 7110 StmtResult SubStmt 7111 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 7112 if (SubStmt.isInvalid()) { 7113 SemaRef.ActOnStmtExprError(); 7114 return ExprError(); 7115 } 7116 7117 if (!getDerived().AlwaysRebuild() && 7118 SubStmt.get() == E->getSubStmt()) { 7119 // Calling this an 'error' is unintuitive, but it does the right thing. 7120 SemaRef.ActOnStmtExprError(); 7121 return SemaRef.MaybeBindToTemporary(E); 7122 } 7123 7124 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 7125 SubStmt.get(), 7126 E->getRParenLoc()); 7127} 7128 7129template<typename Derived> 7130ExprResult 7131TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 7132 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 7133 if (Cond.isInvalid()) 7134 return ExprError(); 7135 7136 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 7137 if (LHS.isInvalid()) 7138 return ExprError(); 7139 7140 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 7141 if (RHS.isInvalid()) 7142 return ExprError(); 7143 7144 if (!getDerived().AlwaysRebuild() && 7145 Cond.get() == E->getCond() && 7146 LHS.get() == E->getLHS() && 7147 RHS.get() == E->getRHS()) 7148 return SemaRef.Owned(E); 7149 7150 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 7151 Cond.get(), LHS.get(), RHS.get(), 7152 E->getRParenLoc()); 7153} 7154 7155template<typename Derived> 7156ExprResult 7157TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 7158 return SemaRef.Owned(E); 7159} 7160 7161template<typename Derived> 7162ExprResult 7163TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 7164 switch (E->getOperator()) { 7165 case OO_New: 7166 case OO_Delete: 7167 case OO_Array_New: 7168 case OO_Array_Delete: 7169 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 7170 7171 case OO_Call: { 7172 // This is a call to an object's operator(). 7173 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 7174 7175 // Transform the object itself. 7176 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 7177 if (Object.isInvalid()) 7178 return ExprError(); 7179 7180 // FIXME: Poor location information 7181 SourceLocation FakeLParenLoc 7182 = SemaRef.PP.getLocForEndOfToken( 7183 static_cast<Expr *>(Object.get())->getLocEnd()); 7184 7185 // Transform the call arguments. 7186 SmallVector<Expr*, 8> Args; 7187 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 7188 Args)) 7189 return ExprError(); 7190 7191 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 7192 Args, 7193 E->getLocEnd()); 7194 } 7195 7196#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 7197 case OO_##Name: 7198#define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 7199#include "clang/Basic/OperatorKinds.def" 7200 case OO_Subscript: 7201 // Handled below. 7202 break; 7203 7204 case OO_Conditional: 7205 llvm_unreachable("conditional operator is not actually overloadable"); 7206 7207 case OO_None: 7208 case NUM_OVERLOADED_OPERATORS: 7209 llvm_unreachable("not an overloaded operator?"); 7210 } 7211 7212 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 7213 if (Callee.isInvalid()) 7214 return ExprError(); 7215 7216 ExprResult First; 7217 if (E->getOperator() == OO_Amp) 7218 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 7219 else 7220 First = getDerived().TransformExpr(E->getArg(0)); 7221 if (First.isInvalid()) 7222 return ExprError(); 7223 7224 ExprResult Second; 7225 if (E->getNumArgs() == 2) { 7226 Second = getDerived().TransformExpr(E->getArg(1)); 7227 if (Second.isInvalid()) 7228 return ExprError(); 7229 } 7230 7231 if (!getDerived().AlwaysRebuild() && 7232 Callee.get() == E->getCallee() && 7233 First.get() == E->getArg(0) && 7234 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 7235 return SemaRef.MaybeBindToTemporary(E); 7236 7237 Sema::FPContractStateRAII FPContractState(getSema()); 7238 getSema().FPFeatures.fp_contract = E->isFPContractable(); 7239 7240 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 7241 E->getOperatorLoc(), 7242 Callee.get(), 7243 First.get(), 7244 Second.get()); 7245} 7246 7247template<typename Derived> 7248ExprResult 7249TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 7250 return getDerived().TransformCallExpr(E); 7251} 7252 7253template<typename Derived> 7254ExprResult 7255TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 7256 // Transform the callee. 7257 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 7258 if (Callee.isInvalid()) 7259 return ExprError(); 7260 7261 // Transform exec config. 7262 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 7263 if (EC.isInvalid()) 7264 return ExprError(); 7265 7266 // Transform arguments. 7267 bool ArgChanged = false; 7268 SmallVector<Expr*, 8> Args; 7269 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 7270 &ArgChanged)) 7271 return ExprError(); 7272 7273 if (!getDerived().AlwaysRebuild() && 7274 Callee.get() == E->getCallee() && 7275 !ArgChanged) 7276 return SemaRef.MaybeBindToTemporary(E); 7277 7278 // FIXME: Wrong source location information for the '('. 7279 SourceLocation FakeLParenLoc 7280 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 7281 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 7282 Args, 7283 E->getRParenLoc(), EC.get()); 7284} 7285 7286template<typename Derived> 7287ExprResult 7288TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 7289 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 7290 if (!Type) 7291 return ExprError(); 7292 7293 ExprResult SubExpr 7294 = getDerived().TransformExpr(E->getSubExprAsWritten()); 7295 if (SubExpr.isInvalid()) 7296 return ExprError(); 7297 7298 if (!getDerived().AlwaysRebuild() && 7299 Type == E->getTypeInfoAsWritten() && 7300 SubExpr.get() == E->getSubExpr()) 7301 return SemaRef.Owned(E); 7302 return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 7303 E->getStmtClass(), 7304 E->getAngleBrackets().getBegin(), 7305 Type, 7306 E->getAngleBrackets().getEnd(), 7307 // FIXME. this should be '(' location 7308 E->getAngleBrackets().getEnd(), 7309 SubExpr.get(), 7310 E->getRParenLoc()); 7311} 7312 7313template<typename Derived> 7314ExprResult 7315TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 7316 return getDerived().TransformCXXNamedCastExpr(E); 7317} 7318 7319template<typename Derived> 7320ExprResult 7321TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 7322 return getDerived().TransformCXXNamedCastExpr(E); 7323} 7324 7325template<typename Derived> 7326ExprResult 7327TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 7328 CXXReinterpretCastExpr *E) { 7329 return getDerived().TransformCXXNamedCastExpr(E); 7330} 7331 7332template<typename Derived> 7333ExprResult 7334TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 7335 return getDerived().TransformCXXNamedCastExpr(E); 7336} 7337 7338template<typename Derived> 7339ExprResult 7340TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 7341 CXXFunctionalCastExpr *E) { 7342 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 7343 if (!Type) 7344 return ExprError(); 7345 7346 ExprResult SubExpr 7347 = getDerived().TransformExpr(E->getSubExprAsWritten()); 7348 if (SubExpr.isInvalid()) 7349 return ExprError(); 7350 7351 if (!getDerived().AlwaysRebuild() && 7352 Type == E->getTypeInfoAsWritten() && 7353 SubExpr.get() == E->getSubExpr()) 7354 return SemaRef.Owned(E); 7355 7356 return getDerived().RebuildCXXFunctionalCastExpr(Type, 7357 E->getLParenLoc(), 7358 SubExpr.get(), 7359 E->getRParenLoc()); 7360} 7361 7362template<typename Derived> 7363ExprResult 7364TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 7365 if (E->isTypeOperand()) { 7366 TypeSourceInfo *TInfo 7367 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 7368 if (!TInfo) 7369 return ExprError(); 7370 7371 if (!getDerived().AlwaysRebuild() && 7372 TInfo == E->getTypeOperandSourceInfo()) 7373 return SemaRef.Owned(E); 7374 7375 return getDerived().RebuildCXXTypeidExpr(E->getType(), 7376 E->getLocStart(), 7377 TInfo, 7378 E->getLocEnd()); 7379 } 7380 7381 // We don't know whether the subexpression is potentially evaluated until 7382 // after we perform semantic analysis. We speculatively assume it is 7383 // unevaluated; it will get fixed later if the subexpression is in fact 7384 // potentially evaluated. 7385 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 7386 Sema::ReuseLambdaContextDecl); 7387 7388 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 7389 if (SubExpr.isInvalid()) 7390 return ExprError(); 7391 7392 if (!getDerived().AlwaysRebuild() && 7393 SubExpr.get() == E->getExprOperand()) 7394 return SemaRef.Owned(E); 7395 7396 return getDerived().RebuildCXXTypeidExpr(E->getType(), 7397 E->getLocStart(), 7398 SubExpr.get(), 7399 E->getLocEnd()); 7400} 7401 7402template<typename Derived> 7403ExprResult 7404TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 7405 if (E->isTypeOperand()) { 7406 TypeSourceInfo *TInfo 7407 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 7408 if (!TInfo) 7409 return ExprError(); 7410 7411 if (!getDerived().AlwaysRebuild() && 7412 TInfo == E->getTypeOperandSourceInfo()) 7413 return SemaRef.Owned(E); 7414 7415 return getDerived().RebuildCXXUuidofExpr(E->getType(), 7416 E->getLocStart(), 7417 TInfo, 7418 E->getLocEnd()); 7419 } 7420 7421 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 7422 7423 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 7424 if (SubExpr.isInvalid()) 7425 return ExprError(); 7426 7427 if (!getDerived().AlwaysRebuild() && 7428 SubExpr.get() == E->getExprOperand()) 7429 return SemaRef.Owned(E); 7430 7431 return getDerived().RebuildCXXUuidofExpr(E->getType(), 7432 E->getLocStart(), 7433 SubExpr.get(), 7434 E->getLocEnd()); 7435} 7436 7437template<typename Derived> 7438ExprResult 7439TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 7440 return SemaRef.Owned(E); 7441} 7442 7443template<typename Derived> 7444ExprResult 7445TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 7446 CXXNullPtrLiteralExpr *E) { 7447 return SemaRef.Owned(E); 7448} 7449 7450template<typename Derived> 7451ExprResult 7452TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 7453 QualType T = getSema().getCurrentThisType(); 7454 7455 if (!getDerived().AlwaysRebuild() && T == E->getType()) { 7456 // Make sure that we capture 'this'. 7457 getSema().CheckCXXThisCapture(E->getLocStart()); 7458 return SemaRef.Owned(E); 7459 } 7460 7461 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T, E->isImplicit()); 7462} 7463 7464template<typename Derived> 7465ExprResult 7466TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 7467 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 7468 if (SubExpr.isInvalid()) 7469 return ExprError(); 7470 7471 if (!getDerived().AlwaysRebuild() && 7472 SubExpr.get() == E->getSubExpr()) 7473 return SemaRef.Owned(E); 7474 7475 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(), 7476 E->isThrownVariableInScope()); 7477} 7478 7479template<typename Derived> 7480ExprResult 7481TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 7482 ParmVarDecl *Param 7483 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getLocStart(), 7484 E->getParam())); 7485 if (!Param) 7486 return ExprError(); 7487 7488 if (!getDerived().AlwaysRebuild() && 7489 Param == E->getParam()) 7490 return SemaRef.Owned(E); 7491 7492 return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param); 7493} 7494 7495template<typename Derived> 7496ExprResult 7497TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) { 7498 FieldDecl *Field 7499 = cast_or_null<FieldDecl>(getDerived().TransformDecl(E->getLocStart(), 7500 E->getField())); 7501 if (!Field) 7502 return ExprError(); 7503 7504 if (!getDerived().AlwaysRebuild() && Field == E->getField()) 7505 return SemaRef.Owned(E); 7506 7507 return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field); 7508} 7509 7510template<typename Derived> 7511ExprResult 7512TreeTransform<Derived>::TransformCXXScalarValueInitExpr( 7513 CXXScalarValueInitExpr *E) { 7514 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 7515 if (!T) 7516 return ExprError(); 7517 7518 if (!getDerived().AlwaysRebuild() && 7519 T == E->getTypeSourceInfo()) 7520 return SemaRef.Owned(E); 7521 7522 return getDerived().RebuildCXXScalarValueInitExpr(T, 7523 /*FIXME:*/T->getTypeLoc().getEndLoc(), 7524 E->getRParenLoc()); 7525} 7526 7527template<typename Derived> 7528ExprResult 7529TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 7530 // Transform the type that we're allocating 7531 TypeSourceInfo *AllocTypeInfo 7532 = getDerived().TransformType(E->getAllocatedTypeSourceInfo()); 7533 if (!AllocTypeInfo) 7534 return ExprError(); 7535 7536 // Transform the size of the array we're allocating (if any). 7537 ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 7538 if (ArraySize.isInvalid()) 7539 return ExprError(); 7540 7541 // Transform the placement arguments (if any). 7542 bool ArgumentChanged = false; 7543 SmallVector<Expr*, 8> PlacementArgs; 7544 if (getDerived().TransformExprs(E->getPlacementArgs(), 7545 E->getNumPlacementArgs(), true, 7546 PlacementArgs, &ArgumentChanged)) 7547 return ExprError(); 7548 7549 // Transform the initializer (if any). 7550 Expr *OldInit = E->getInitializer(); 7551 ExprResult NewInit; 7552 if (OldInit) 7553 NewInit = getDerived().TransformExpr(OldInit); 7554 if (NewInit.isInvalid()) 7555 return ExprError(); 7556 7557 // Transform new operator and delete operator. 7558 FunctionDecl *OperatorNew = 0; 7559 if (E->getOperatorNew()) { 7560 OperatorNew = cast_or_null<FunctionDecl>( 7561 getDerived().TransformDecl(E->getLocStart(), 7562 E->getOperatorNew())); 7563 if (!OperatorNew) 7564 return ExprError(); 7565 } 7566 7567 FunctionDecl *OperatorDelete = 0; 7568 if (E->getOperatorDelete()) { 7569 OperatorDelete = cast_or_null<FunctionDecl>( 7570 getDerived().TransformDecl(E->getLocStart(), 7571 E->getOperatorDelete())); 7572 if (!OperatorDelete) 7573 return ExprError(); 7574 } 7575 7576 if (!getDerived().AlwaysRebuild() && 7577 AllocTypeInfo == E->getAllocatedTypeSourceInfo() && 7578 ArraySize.get() == E->getArraySize() && 7579 NewInit.get() == OldInit && 7580 OperatorNew == E->getOperatorNew() && 7581 OperatorDelete == E->getOperatorDelete() && 7582 !ArgumentChanged) { 7583 // Mark any declarations we need as referenced. 7584 // FIXME: instantiation-specific. 7585 if (OperatorNew) 7586 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorNew); 7587 if (OperatorDelete) 7588 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 7589 7590 if (E->isArray() && !E->getAllocatedType()->isDependentType()) { 7591 QualType ElementType 7592 = SemaRef.Context.getBaseElementType(E->getAllocatedType()); 7593 if (const RecordType *RecordT = ElementType->getAs<RecordType>()) { 7594 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl()); 7595 if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) { 7596 SemaRef.MarkFunctionReferenced(E->getLocStart(), Destructor); 7597 } 7598 } 7599 } 7600 7601 return SemaRef.Owned(E); 7602 } 7603 7604 QualType AllocType = AllocTypeInfo->getType(); 7605 if (!ArraySize.get()) { 7606 // If no array size was specified, but the new expression was 7607 // instantiated with an array type (e.g., "new T" where T is 7608 // instantiated with "int[4]"), extract the outer bound from the 7609 // array type as our array size. We do this with constant and 7610 // dependently-sized array types. 7611 const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType); 7612 if (!ArrayT) { 7613 // Do nothing 7614 } else if (const ConstantArrayType *ConsArrayT 7615 = dyn_cast<ConstantArrayType>(ArrayT)) { 7616 ArraySize 7617 = SemaRef.Owned(IntegerLiteral::Create(SemaRef.Context, 7618 ConsArrayT->getSize(), 7619 SemaRef.Context.getSizeType(), 7620 /*FIXME:*/E->getLocStart())); 7621 AllocType = ConsArrayT->getElementType(); 7622 } else if (const DependentSizedArrayType *DepArrayT 7623 = dyn_cast<DependentSizedArrayType>(ArrayT)) { 7624 if (DepArrayT->getSizeExpr()) { 7625 ArraySize = SemaRef.Owned(DepArrayT->getSizeExpr()); 7626 AllocType = DepArrayT->getElementType(); 7627 } 7628 } 7629 } 7630 7631 return getDerived().RebuildCXXNewExpr(E->getLocStart(), 7632 E->isGlobalNew(), 7633 /*FIXME:*/E->getLocStart(), 7634 PlacementArgs, 7635 /*FIXME:*/E->getLocStart(), 7636 E->getTypeIdParens(), 7637 AllocType, 7638 AllocTypeInfo, 7639 ArraySize.get(), 7640 E->getDirectInitRange(), 7641 NewInit.take()); 7642} 7643 7644template<typename Derived> 7645ExprResult 7646TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 7647 ExprResult Operand = getDerived().TransformExpr(E->getArgument()); 7648 if (Operand.isInvalid()) 7649 return ExprError(); 7650 7651 // Transform the delete operator, if known. 7652 FunctionDecl *OperatorDelete = 0; 7653 if (E->getOperatorDelete()) { 7654 OperatorDelete = cast_or_null<FunctionDecl>( 7655 getDerived().TransformDecl(E->getLocStart(), 7656 E->getOperatorDelete())); 7657 if (!OperatorDelete) 7658 return ExprError(); 7659 } 7660 7661 if (!getDerived().AlwaysRebuild() && 7662 Operand.get() == E->getArgument() && 7663 OperatorDelete == E->getOperatorDelete()) { 7664 // Mark any declarations we need as referenced. 7665 // FIXME: instantiation-specific. 7666 if (OperatorDelete) 7667 SemaRef.MarkFunctionReferenced(E->getLocStart(), OperatorDelete); 7668 7669 if (!E->getArgument()->isTypeDependent()) { 7670 QualType Destroyed = SemaRef.Context.getBaseElementType( 7671 E->getDestroyedType()); 7672 if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) { 7673 CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl()); 7674 SemaRef.MarkFunctionReferenced(E->getLocStart(), 7675 SemaRef.LookupDestructor(Record)); 7676 } 7677 } 7678 7679 return SemaRef.Owned(E); 7680 } 7681 7682 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 7683 E->isGlobalDelete(), 7684 E->isArrayForm(), 7685 Operand.get()); 7686} 7687 7688template<typename Derived> 7689ExprResult 7690TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 7691 CXXPseudoDestructorExpr *E) { 7692 ExprResult Base = getDerived().TransformExpr(E->getBase()); 7693 if (Base.isInvalid()) 7694 return ExprError(); 7695 7696 ParsedType ObjectTypePtr; 7697 bool MayBePseudoDestructor = false; 7698 Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 7699 E->getOperatorLoc(), 7700 E->isArrow()? tok::arrow : tok::period, 7701 ObjectTypePtr, 7702 MayBePseudoDestructor); 7703 if (Base.isInvalid()) 7704 return ExprError(); 7705 7706 QualType ObjectType = ObjectTypePtr.get(); 7707 NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc(); 7708 if (QualifierLoc) { 7709 QualifierLoc 7710 = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType); 7711 if (!QualifierLoc) 7712 return ExprError(); 7713 } 7714 CXXScopeSpec SS; 7715 SS.Adopt(QualifierLoc); 7716 7717 PseudoDestructorTypeStorage Destroyed; 7718 if (E->getDestroyedTypeInfo()) { 7719 TypeSourceInfo *DestroyedTypeInfo 7720 = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(), 7721 ObjectType, 0, SS); 7722 if (!DestroyedTypeInfo) 7723 return ExprError(); 7724 Destroyed = DestroyedTypeInfo; 7725 } else if (!ObjectType.isNull() && ObjectType->isDependentType()) { 7726 // We aren't likely to be able to resolve the identifier down to a type 7727 // now anyway, so just retain the identifier. 7728 Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(), 7729 E->getDestroyedTypeLoc()); 7730 } else { 7731 // Look for a destructor known with the given name. 7732 ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(), 7733 *E->getDestroyedTypeIdentifier(), 7734 E->getDestroyedTypeLoc(), 7735 /*Scope=*/0, 7736 SS, ObjectTypePtr, 7737 false); 7738 if (!T) 7739 return ExprError(); 7740 7741 Destroyed 7742 = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T), 7743 E->getDestroyedTypeLoc()); 7744 } 7745 7746 TypeSourceInfo *ScopeTypeInfo = 0; 7747 if (E->getScopeTypeInfo()) { 7748 CXXScopeSpec EmptySS; 7749 ScopeTypeInfo = getDerived().TransformTypeInObjectScope( 7750 E->getScopeTypeInfo(), ObjectType, 0, EmptySS); 7751 if (!ScopeTypeInfo) 7752 return ExprError(); 7753 } 7754 7755 return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(), 7756 E->getOperatorLoc(), 7757 E->isArrow(), 7758 SS, 7759 ScopeTypeInfo, 7760 E->getColonColonLoc(), 7761 E->getTildeLoc(), 7762 Destroyed); 7763} 7764 7765template<typename Derived> 7766ExprResult 7767TreeTransform<Derived>::TransformUnresolvedLookupExpr( 7768 UnresolvedLookupExpr *Old) { 7769 LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(), 7770 Sema::LookupOrdinaryName); 7771 7772 // Transform all the decls. 7773 for (UnresolvedLookupExpr::decls_iterator I = Old->decls_begin(), 7774 E = Old->decls_end(); I != E; ++I) { 7775 NamedDecl *InstD = static_cast<NamedDecl*>( 7776 getDerived().TransformDecl(Old->getNameLoc(), 7777 *I)); 7778 if (!InstD) { 7779 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 7780 // This can happen because of dependent hiding. 7781 if (isa<UsingShadowDecl>(*I)) 7782 continue; 7783 else 7784 return ExprError(); 7785 } 7786 7787 // Expand using declarations. 7788 if (isa<UsingDecl>(InstD)) { 7789 UsingDecl *UD = cast<UsingDecl>(InstD); 7790 for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 7791 E = UD->shadow_end(); I != E; ++I) 7792 R.addDecl(*I); 7793 continue; 7794 } 7795 7796 R.addDecl(InstD); 7797 } 7798 7799 // Resolve a kind, but don't do any further analysis. If it's 7800 // ambiguous, the callee needs to deal with it. 7801 R.resolveKind(); 7802 7803 // Rebuild the nested-name qualifier, if present. 7804 CXXScopeSpec SS; 7805 if (Old->getQualifierLoc()) { 7806 NestedNameSpecifierLoc QualifierLoc 7807 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 7808 if (!QualifierLoc) 7809 return ExprError(); 7810 7811 SS.Adopt(QualifierLoc); 7812 } 7813 7814 if (Old->getNamingClass()) { 7815 CXXRecordDecl *NamingClass 7816 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 7817 Old->getNameLoc(), 7818 Old->getNamingClass())); 7819 if (!NamingClass) 7820 return ExprError(); 7821 7822 R.setNamingClass(NamingClass); 7823 } 7824 7825 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 7826 7827 // If we have neither explicit template arguments, nor the template keyword, 7828 // it's a normal declaration name. 7829 if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) 7830 return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL()); 7831 7832 // If we have template arguments, rebuild them, then rebuild the 7833 // templateid expression. 7834 TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc()); 7835 if (Old->hasExplicitTemplateArgs() && 7836 getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 7837 Old->getNumTemplateArgs(), 7838 TransArgs)) 7839 return ExprError(); 7840 7841 return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R, 7842 Old->requiresADL(), &TransArgs); 7843} 7844 7845template<typename Derived> 7846ExprResult 7847TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 7848 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 7849 if (!T) 7850 return ExprError(); 7851 7852 if (!getDerived().AlwaysRebuild() && 7853 T == E->getQueriedTypeSourceInfo()) 7854 return SemaRef.Owned(E); 7855 7856 return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 7857 E->getLocStart(), 7858 T, 7859 E->getLocEnd()); 7860} 7861 7862template<typename Derived> 7863ExprResult 7864TreeTransform<Derived>::TransformBinaryTypeTraitExpr(BinaryTypeTraitExpr *E) { 7865 TypeSourceInfo *LhsT = getDerived().TransformType(E->getLhsTypeSourceInfo()); 7866 if (!LhsT) 7867 return ExprError(); 7868 7869 TypeSourceInfo *RhsT = getDerived().TransformType(E->getRhsTypeSourceInfo()); 7870 if (!RhsT) 7871 return ExprError(); 7872 7873 if (!getDerived().AlwaysRebuild() && 7874 LhsT == E->getLhsTypeSourceInfo() && RhsT == E->getRhsTypeSourceInfo()) 7875 return SemaRef.Owned(E); 7876 7877 return getDerived().RebuildBinaryTypeTrait(E->getTrait(), 7878 E->getLocStart(), 7879 LhsT, RhsT, 7880 E->getLocEnd()); 7881} 7882 7883template<typename Derived> 7884ExprResult 7885TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) { 7886 bool ArgChanged = false; 7887 SmallVector<TypeSourceInfo *, 4> Args; 7888 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 7889 TypeSourceInfo *From = E->getArg(I); 7890 TypeLoc FromTL = From->getTypeLoc(); 7891 if (!FromTL.getAs<PackExpansionTypeLoc>()) { 7892 TypeLocBuilder TLB; 7893 TLB.reserve(FromTL.getFullDataSize()); 7894 QualType To = getDerived().TransformType(TLB, FromTL); 7895 if (To.isNull()) 7896 return ExprError(); 7897 7898 if (To == From->getType()) 7899 Args.push_back(From); 7900 else { 7901 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 7902 ArgChanged = true; 7903 } 7904 continue; 7905 } 7906 7907 ArgChanged = true; 7908 7909 // We have a pack expansion. Instantiate it. 7910 PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>(); 7911 TypeLoc PatternTL = ExpansionTL.getPatternLoc(); 7912 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 7913 SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded); 7914 7915 // Determine whether the set of unexpanded parameter packs can and should 7916 // be expanded. 7917 bool Expand = true; 7918 bool RetainExpansion = false; 7919 Optional<unsigned> OrigNumExpansions = 7920 ExpansionTL.getTypePtr()->getNumExpansions(); 7921 Optional<unsigned> NumExpansions = OrigNumExpansions; 7922 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 7923 PatternTL.getSourceRange(), 7924 Unexpanded, 7925 Expand, RetainExpansion, 7926 NumExpansions)) 7927 return ExprError(); 7928 7929 if (!Expand) { 7930 // The transform has determined that we should perform a simple 7931 // transformation on the pack expansion, producing another pack 7932 // expansion. 7933 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 7934 7935 TypeLocBuilder TLB; 7936 TLB.reserve(From->getTypeLoc().getFullDataSize()); 7937 7938 QualType To = getDerived().TransformType(TLB, PatternTL); 7939 if (To.isNull()) 7940 return ExprError(); 7941 7942 To = getDerived().RebuildPackExpansionType(To, 7943 PatternTL.getSourceRange(), 7944 ExpansionTL.getEllipsisLoc(), 7945 NumExpansions); 7946 if (To.isNull()) 7947 return ExprError(); 7948 7949 PackExpansionTypeLoc ToExpansionTL 7950 = TLB.push<PackExpansionTypeLoc>(To); 7951 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 7952 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 7953 continue; 7954 } 7955 7956 // Expand the pack expansion by substituting for each argument in the 7957 // pack(s). 7958 for (unsigned I = 0; I != *NumExpansions; ++I) { 7959 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I); 7960 TypeLocBuilder TLB; 7961 TLB.reserve(PatternTL.getFullDataSize()); 7962 QualType To = getDerived().TransformType(TLB, PatternTL); 7963 if (To.isNull()) 7964 return ExprError(); 7965 7966 if (To->containsUnexpandedParameterPack()) { 7967 To = getDerived().RebuildPackExpansionType(To, 7968 PatternTL.getSourceRange(), 7969 ExpansionTL.getEllipsisLoc(), 7970 NumExpansions); 7971 if (To.isNull()) 7972 return ExprError(); 7973 7974 PackExpansionTypeLoc ToExpansionTL 7975 = TLB.push<PackExpansionTypeLoc>(To); 7976 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 7977 } 7978 7979 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 7980 } 7981 7982 if (!RetainExpansion) 7983 continue; 7984 7985 // If we're supposed to retain a pack expansion, do so by temporarily 7986 // forgetting the partially-substituted parameter pack. 7987 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 7988 7989 TypeLocBuilder TLB; 7990 TLB.reserve(From->getTypeLoc().getFullDataSize()); 7991 7992 QualType To = getDerived().TransformType(TLB, PatternTL); 7993 if (To.isNull()) 7994 return ExprError(); 7995 7996 To = getDerived().RebuildPackExpansionType(To, 7997 PatternTL.getSourceRange(), 7998 ExpansionTL.getEllipsisLoc(), 7999 NumExpansions); 8000 if (To.isNull()) 8001 return ExprError(); 8002 8003 PackExpansionTypeLoc ToExpansionTL 8004 = TLB.push<PackExpansionTypeLoc>(To); 8005 ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc()); 8006 Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To)); 8007 } 8008 8009 if (!getDerived().AlwaysRebuild() && !ArgChanged) 8010 return SemaRef.Owned(E); 8011 8012 return getDerived().RebuildTypeTrait(E->getTrait(), 8013 E->getLocStart(), 8014 Args, 8015 E->getLocEnd()); 8016} 8017 8018template<typename Derived> 8019ExprResult 8020TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) { 8021 TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo()); 8022 if (!T) 8023 return ExprError(); 8024 8025 if (!getDerived().AlwaysRebuild() && 8026 T == E->getQueriedTypeSourceInfo()) 8027 return SemaRef.Owned(E); 8028 8029 ExprResult SubExpr; 8030 { 8031 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 8032 SubExpr = getDerived().TransformExpr(E->getDimensionExpression()); 8033 if (SubExpr.isInvalid()) 8034 return ExprError(); 8035 8036 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression()) 8037 return SemaRef.Owned(E); 8038 } 8039 8040 return getDerived().RebuildArrayTypeTrait(E->getTrait(), 8041 E->getLocStart(), 8042 T, 8043 SubExpr.get(), 8044 E->getLocEnd()); 8045} 8046 8047template<typename Derived> 8048ExprResult 8049TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) { 8050 ExprResult SubExpr; 8051 { 8052 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 8053 SubExpr = getDerived().TransformExpr(E->getQueriedExpression()); 8054 if (SubExpr.isInvalid()) 8055 return ExprError(); 8056 8057 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression()) 8058 return SemaRef.Owned(E); 8059 } 8060 8061 return getDerived().RebuildExpressionTrait( 8062 E->getTrait(), E->getLocStart(), SubExpr.get(), E->getLocEnd()); 8063} 8064 8065template<typename Derived> 8066ExprResult 8067TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 8068 DependentScopeDeclRefExpr *E) { 8069 return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand*/false); 8070} 8071 8072template<typename Derived> 8073ExprResult 8074TreeTransform<Derived>::TransformDependentScopeDeclRefExpr( 8075 DependentScopeDeclRefExpr *E, 8076 bool IsAddressOfOperand) { 8077 NestedNameSpecifierLoc QualifierLoc 8078 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 8079 if (!QualifierLoc) 8080 return ExprError(); 8081 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 8082 8083 // TODO: If this is a conversion-function-id, verify that the 8084 // destination type name (if present) resolves the same way after 8085 // instantiation as it did in the local scope. 8086 8087 DeclarationNameInfo NameInfo 8088 = getDerived().TransformDeclarationNameInfo(E->getNameInfo()); 8089 if (!NameInfo.getName()) 8090 return ExprError(); 8091 8092 if (!E->hasExplicitTemplateArgs()) { 8093 if (!getDerived().AlwaysRebuild() && 8094 QualifierLoc == E->getQualifierLoc() && 8095 // Note: it is sufficient to compare the Name component of NameInfo: 8096 // if name has not changed, DNLoc has not changed either. 8097 NameInfo.getName() == E->getDeclName()) 8098 return SemaRef.Owned(E); 8099 8100 return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc, 8101 TemplateKWLoc, 8102 NameInfo, 8103 /*TemplateArgs*/ 0, 8104 IsAddressOfOperand); 8105 } 8106 8107 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 8108 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 8109 E->getNumTemplateArgs(), 8110 TransArgs)) 8111 return ExprError(); 8112 8113 return getDerived().RebuildDependentScopeDeclRefExpr(QualifierLoc, 8114 TemplateKWLoc, 8115 NameInfo, 8116 &TransArgs, 8117 IsAddressOfOperand); 8118} 8119 8120template<typename Derived> 8121ExprResult 8122TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 8123 // CXXConstructExprs other than for list-initialization and 8124 // CXXTemporaryObjectExpr are always implicit, so when we have 8125 // a 1-argument construction we just transform that argument. 8126 if ((E->getNumArgs() == 1 || 8127 (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) && 8128 (!getDerived().DropCallArgument(E->getArg(0))) && 8129 !E->isListInitialization()) 8130 return getDerived().TransformExpr(E->getArg(0)); 8131 8132 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 8133 8134 QualType T = getDerived().TransformType(E->getType()); 8135 if (T.isNull()) 8136 return ExprError(); 8137 8138 CXXConstructorDecl *Constructor 8139 = cast_or_null<CXXConstructorDecl>( 8140 getDerived().TransformDecl(E->getLocStart(), 8141 E->getConstructor())); 8142 if (!Constructor) 8143 return ExprError(); 8144 8145 bool ArgumentChanged = false; 8146 SmallVector<Expr*, 8> Args; 8147 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 8148 &ArgumentChanged)) 8149 return ExprError(); 8150 8151 if (!getDerived().AlwaysRebuild() && 8152 T == E->getType() && 8153 Constructor == E->getConstructor() && 8154 !ArgumentChanged) { 8155 // Mark the constructor as referenced. 8156 // FIXME: Instantiation-specific 8157 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 8158 return SemaRef.Owned(E); 8159 } 8160 8161 return getDerived().RebuildCXXConstructExpr(T, /*FIXME:*/E->getLocStart(), 8162 Constructor, E->isElidable(), 8163 Args, 8164 E->hadMultipleCandidates(), 8165 E->isListInitialization(), 8166 E->requiresZeroInitialization(), 8167 E->getConstructionKind(), 8168 E->getParenRange()); 8169} 8170 8171/// \brief Transform a C++ temporary-binding expression. 8172/// 8173/// Since CXXBindTemporaryExpr nodes are implicitly generated, we just 8174/// transform the subexpression and return that. 8175template<typename Derived> 8176ExprResult 8177TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 8178 return getDerived().TransformExpr(E->getSubExpr()); 8179} 8180 8181/// \brief Transform a C++ expression that contains cleanups that should 8182/// be run after the expression is evaluated. 8183/// 8184/// Since ExprWithCleanups nodes are implicitly generated, we 8185/// just transform the subexpression and return that. 8186template<typename Derived> 8187ExprResult 8188TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) { 8189 return getDerived().TransformExpr(E->getSubExpr()); 8190} 8191 8192template<typename Derived> 8193ExprResult 8194TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 8195 CXXTemporaryObjectExpr *E) { 8196 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 8197 if (!T) 8198 return ExprError(); 8199 8200 CXXConstructorDecl *Constructor 8201 = cast_or_null<CXXConstructorDecl>( 8202 getDerived().TransformDecl(E->getLocStart(), 8203 E->getConstructor())); 8204 if (!Constructor) 8205 return ExprError(); 8206 8207 bool ArgumentChanged = false; 8208 SmallVector<Expr*, 8> Args; 8209 Args.reserve(E->getNumArgs()); 8210 if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 8211 &ArgumentChanged)) 8212 return ExprError(); 8213 8214 if (!getDerived().AlwaysRebuild() && 8215 T == E->getTypeSourceInfo() && 8216 Constructor == E->getConstructor() && 8217 !ArgumentChanged) { 8218 // FIXME: Instantiation-specific 8219 SemaRef.MarkFunctionReferenced(E->getLocStart(), Constructor); 8220 return SemaRef.MaybeBindToTemporary(E); 8221 } 8222 8223 // FIXME: Pass in E->isListInitialization(). 8224 return getDerived().RebuildCXXTemporaryObjectExpr(T, 8225 /*FIXME:*/T->getTypeLoc().getEndLoc(), 8226 Args, 8227 E->getLocEnd()); 8228} 8229 8230template<typename Derived> 8231ExprResult 8232TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) { 8233 // Transform the type of the lambda parameters and start the definition of 8234 // the lambda itself. 8235 TypeSourceInfo *MethodTy 8236 = TransformType(E->getCallOperator()->getTypeSourceInfo()); 8237 if (!MethodTy) 8238 return ExprError(); 8239 8240 // Create the local class that will describe the lambda. 8241 CXXRecordDecl *Class 8242 = getSema().createLambdaClosureType(E->getIntroducerRange(), 8243 MethodTy, 8244 /*KnownDependent=*/false); 8245 getDerived().transformedLocalDecl(E->getLambdaClass(), Class); 8246 8247 // Transform lambda parameters. 8248 SmallVector<QualType, 4> ParamTypes; 8249 SmallVector<ParmVarDecl *, 4> Params; 8250 if (getDerived().TransformFunctionTypeParams(E->getLocStart(), 8251 E->getCallOperator()->param_begin(), 8252 E->getCallOperator()->param_size(), 8253 0, ParamTypes, &Params)) 8254 return ExprError(); 8255 8256 // Build the call operator. 8257 CXXMethodDecl *CallOperator 8258 = getSema().startLambdaDefinition(Class, E->getIntroducerRange(), 8259 MethodTy, 8260 E->getCallOperator()->getLocEnd(), 8261 Params); 8262 getDerived().transformAttrs(E->getCallOperator(), CallOperator); 8263 8264 return getDerived().TransformLambdaScope(E, CallOperator); 8265} 8266 8267template<typename Derived> 8268ExprResult 8269TreeTransform<Derived>::TransformLambdaScope(LambdaExpr *E, 8270 CXXMethodDecl *CallOperator) { 8271 bool Invalid = false; 8272 8273 // Transform any init-capture expressions before entering the scope of the 8274 // lambda. 8275 SmallVector<ExprResult, 8> InitCaptureExprs; 8276 InitCaptureExprs.resize(E->explicit_capture_end() - 8277 E->explicit_capture_begin()); 8278 for (LambdaExpr::capture_iterator C = E->capture_begin(), 8279 CEnd = E->capture_end(); 8280 C != CEnd; ++C) { 8281 if (!C->isInitCapture()) 8282 continue; 8283 InitCaptureExprs[C - E->capture_begin()] = 8284 getDerived().TransformExpr(E->getInitCaptureInit(C)); 8285 } 8286 8287 // Introduce the context of the call operator. 8288 Sema::ContextRAII SavedContext(getSema(), CallOperator); 8289 8290 // Enter the scope of the lambda. 8291 sema::LambdaScopeInfo *LSI 8292 = getSema().enterLambdaScope(CallOperator, E->getIntroducerRange(), 8293 E->getCaptureDefault(), 8294 E->getCaptureDefaultLoc(), 8295 E->hasExplicitParameters(), 8296 E->hasExplicitResultType(), 8297 E->isMutable()); 8298 8299 // Transform captures. 8300 bool FinishedExplicitCaptures = false; 8301 for (LambdaExpr::capture_iterator C = E->capture_begin(), 8302 CEnd = E->capture_end(); 8303 C != CEnd; ++C) { 8304 // When we hit the first implicit capture, tell Sema that we've finished 8305 // the list of explicit captures. 8306 if (!FinishedExplicitCaptures && C->isImplicit()) { 8307 getSema().finishLambdaExplicitCaptures(LSI); 8308 FinishedExplicitCaptures = true; 8309 } 8310 8311 // Capturing 'this' is trivial. 8312 if (C->capturesThis()) { 8313 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit()); 8314 continue; 8315 } 8316 8317 // Rebuild init-captures, including the implied field declaration. 8318 if (C->isInitCapture()) { 8319 ExprResult Init = InitCaptureExprs[C - E->capture_begin()]; 8320 if (Init.isInvalid()) { 8321 Invalid = true; 8322 continue; 8323 } 8324 FieldDecl *OldFD = C->getInitCaptureField(); 8325 FieldDecl *NewFD = getSema().checkInitCapture( 8326 C->getLocation(), OldFD->getType()->isReferenceType(), 8327 OldFD->getIdentifier(), Init.take()); 8328 if (!NewFD) 8329 Invalid = true; 8330 else 8331 getDerived().transformedLocalDecl(OldFD, NewFD); 8332 continue; 8333 } 8334 8335 assert(C->capturesVariable() && "unexpected kind of lambda capture"); 8336 8337 // Determine the capture kind for Sema. 8338 Sema::TryCaptureKind Kind 8339 = C->isImplicit()? Sema::TryCapture_Implicit 8340 : C->getCaptureKind() == LCK_ByCopy 8341 ? Sema::TryCapture_ExplicitByVal 8342 : Sema::TryCapture_ExplicitByRef; 8343 SourceLocation EllipsisLoc; 8344 if (C->isPackExpansion()) { 8345 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 8346 bool ShouldExpand = false; 8347 bool RetainExpansion = false; 8348 Optional<unsigned> NumExpansions; 8349 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 8350 C->getLocation(), 8351 Unexpanded, 8352 ShouldExpand, RetainExpansion, 8353 NumExpansions)) { 8354 Invalid = true; 8355 continue; 8356 } 8357 8358 if (ShouldExpand) { 8359 // The transform has determined that we should perform an expansion; 8360 // transform and capture each of the arguments. 8361 // expansion of the pattern. Do so. 8362 VarDecl *Pack = C->getCapturedVar(); 8363 for (unsigned I = 0; I != *NumExpansions; ++I) { 8364 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 8365 VarDecl *CapturedVar 8366 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 8367 Pack)); 8368 if (!CapturedVar) { 8369 Invalid = true; 8370 continue; 8371 } 8372 8373 // Capture the transformed variable. 8374 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 8375 } 8376 continue; 8377 } 8378 8379 EllipsisLoc = C->getEllipsisLoc(); 8380 } 8381 8382 // Transform the captured variable. 8383 VarDecl *CapturedVar 8384 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 8385 C->getCapturedVar())); 8386 if (!CapturedVar) { 8387 Invalid = true; 8388 continue; 8389 } 8390 8391 // Capture the transformed variable. 8392 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 8393 } 8394 if (!FinishedExplicitCaptures) 8395 getSema().finishLambdaExplicitCaptures(LSI); 8396 8397 8398 // Enter a new evaluation context to insulate the lambda from any 8399 // cleanups from the enclosing full-expression. 8400 getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated); 8401 8402 if (Invalid) { 8403 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/0, 8404 /*IsInstantiation=*/true); 8405 return ExprError(); 8406 } 8407 8408 // Instantiate the body of the lambda expression. 8409 StmtResult Body = getDerived().TransformStmt(E->getBody()); 8410 if (Body.isInvalid()) { 8411 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/0, 8412 /*IsInstantiation=*/true); 8413 return ExprError(); 8414 } 8415 8416 return getSema().ActOnLambdaExpr(E->getLocStart(), Body.take(), 8417 /*CurScope=*/0, /*IsInstantiation=*/true); 8418} 8419 8420template<typename Derived> 8421ExprResult 8422TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 8423 CXXUnresolvedConstructExpr *E) { 8424 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 8425 if (!T) 8426 return ExprError(); 8427 8428 bool ArgumentChanged = false; 8429 SmallVector<Expr*, 8> Args; 8430 Args.reserve(E->arg_size()); 8431 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 8432 &ArgumentChanged)) 8433 return ExprError(); 8434 8435 if (!getDerived().AlwaysRebuild() && 8436 T == E->getTypeSourceInfo() && 8437 !ArgumentChanged) 8438 return SemaRef.Owned(E); 8439 8440 // FIXME: we're faking the locations of the commas 8441 return getDerived().RebuildCXXUnresolvedConstructExpr(T, 8442 E->getLParenLoc(), 8443 Args, 8444 E->getRParenLoc()); 8445} 8446 8447template<typename Derived> 8448ExprResult 8449TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 8450 CXXDependentScopeMemberExpr *E) { 8451 // Transform the base of the expression. 8452 ExprResult Base((Expr*) 0); 8453 Expr *OldBase; 8454 QualType BaseType; 8455 QualType ObjectType; 8456 if (!E->isImplicitAccess()) { 8457 OldBase = E->getBase(); 8458 Base = getDerived().TransformExpr(OldBase); 8459 if (Base.isInvalid()) 8460 return ExprError(); 8461 8462 // Start the member reference and compute the object's type. 8463 ParsedType ObjectTy; 8464 bool MayBePseudoDestructor = false; 8465 Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 8466 E->getOperatorLoc(), 8467 E->isArrow()? tok::arrow : tok::period, 8468 ObjectTy, 8469 MayBePseudoDestructor); 8470 if (Base.isInvalid()) 8471 return ExprError(); 8472 8473 ObjectType = ObjectTy.get(); 8474 BaseType = ((Expr*) Base.get())->getType(); 8475 } else { 8476 OldBase = 0; 8477 BaseType = getDerived().TransformType(E->getBaseType()); 8478 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 8479 } 8480 8481 // Transform the first part of the nested-name-specifier that qualifies 8482 // the member name. 8483 NamedDecl *FirstQualifierInScope 8484 = getDerived().TransformFirstQualifierInScope( 8485 E->getFirstQualifierFoundInScope(), 8486 E->getQualifierLoc().getBeginLoc()); 8487 8488 NestedNameSpecifierLoc QualifierLoc; 8489 if (E->getQualifier()) { 8490 QualifierLoc 8491 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 8492 ObjectType, 8493 FirstQualifierInScope); 8494 if (!QualifierLoc) 8495 return ExprError(); 8496 } 8497 8498 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 8499 8500 // TODO: If this is a conversion-function-id, verify that the 8501 // destination type name (if present) resolves the same way after 8502 // instantiation as it did in the local scope. 8503 8504 DeclarationNameInfo NameInfo 8505 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 8506 if (!NameInfo.getName()) 8507 return ExprError(); 8508 8509 if (!E->hasExplicitTemplateArgs()) { 8510 // This is a reference to a member without an explicitly-specified 8511 // template argument list. Optimize for this common case. 8512 if (!getDerived().AlwaysRebuild() && 8513 Base.get() == OldBase && 8514 BaseType == E->getBaseType() && 8515 QualifierLoc == E->getQualifierLoc() && 8516 NameInfo.getName() == E->getMember() && 8517 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 8518 return SemaRef.Owned(E); 8519 8520 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 8521 BaseType, 8522 E->isArrow(), 8523 E->getOperatorLoc(), 8524 QualifierLoc, 8525 TemplateKWLoc, 8526 FirstQualifierInScope, 8527 NameInfo, 8528 /*TemplateArgs*/ 0); 8529 } 8530 8531 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 8532 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 8533 E->getNumTemplateArgs(), 8534 TransArgs)) 8535 return ExprError(); 8536 8537 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 8538 BaseType, 8539 E->isArrow(), 8540 E->getOperatorLoc(), 8541 QualifierLoc, 8542 TemplateKWLoc, 8543 FirstQualifierInScope, 8544 NameInfo, 8545 &TransArgs); 8546} 8547 8548template<typename Derived> 8549ExprResult 8550TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 8551 // Transform the base of the expression. 8552 ExprResult Base((Expr*) 0); 8553 QualType BaseType; 8554 if (!Old->isImplicitAccess()) { 8555 Base = getDerived().TransformExpr(Old->getBase()); 8556 if (Base.isInvalid()) 8557 return ExprError(); 8558 Base = getSema().PerformMemberExprBaseConversion(Base.take(), 8559 Old->isArrow()); 8560 if (Base.isInvalid()) 8561 return ExprError(); 8562 BaseType = Base.get()->getType(); 8563 } else { 8564 BaseType = getDerived().TransformType(Old->getBaseType()); 8565 } 8566 8567 NestedNameSpecifierLoc QualifierLoc; 8568 if (Old->getQualifierLoc()) { 8569 QualifierLoc 8570 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 8571 if (!QualifierLoc) 8572 return ExprError(); 8573 } 8574 8575 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 8576 8577 LookupResult R(SemaRef, Old->getMemberNameInfo(), 8578 Sema::LookupOrdinaryName); 8579 8580 // Transform all the decls. 8581 for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 8582 E = Old->decls_end(); I != E; ++I) { 8583 NamedDecl *InstD = static_cast<NamedDecl*>( 8584 getDerived().TransformDecl(Old->getMemberLoc(), 8585 *I)); 8586 if (!InstD) { 8587 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 8588 // This can happen because of dependent hiding. 8589 if (isa<UsingShadowDecl>(*I)) 8590 continue; 8591 else { 8592 R.clear(); 8593 return ExprError(); 8594 } 8595 } 8596 8597 // Expand using declarations. 8598 if (isa<UsingDecl>(InstD)) { 8599 UsingDecl *UD = cast<UsingDecl>(InstD); 8600 for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 8601 E = UD->shadow_end(); I != E; ++I) 8602 R.addDecl(*I); 8603 continue; 8604 } 8605 8606 R.addDecl(InstD); 8607 } 8608 8609 R.resolveKind(); 8610 8611 // Determine the naming class. 8612 if (Old->getNamingClass()) { 8613 CXXRecordDecl *NamingClass 8614 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 8615 Old->getMemberLoc(), 8616 Old->getNamingClass())); 8617 if (!NamingClass) 8618 return ExprError(); 8619 8620 R.setNamingClass(NamingClass); 8621 } 8622 8623 TemplateArgumentListInfo TransArgs; 8624 if (Old->hasExplicitTemplateArgs()) { 8625 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 8626 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 8627 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 8628 Old->getNumTemplateArgs(), 8629 TransArgs)) 8630 return ExprError(); 8631 } 8632 8633 // FIXME: to do this check properly, we will need to preserve the 8634 // first-qualifier-in-scope here, just in case we had a dependent 8635 // base (and therefore couldn't do the check) and a 8636 // nested-name-qualifier (and therefore could do the lookup). 8637 NamedDecl *FirstQualifierInScope = 0; 8638 8639 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 8640 BaseType, 8641 Old->getOperatorLoc(), 8642 Old->isArrow(), 8643 QualifierLoc, 8644 TemplateKWLoc, 8645 FirstQualifierInScope, 8646 R, 8647 (Old->hasExplicitTemplateArgs() 8648 ? &TransArgs : 0)); 8649} 8650 8651template<typename Derived> 8652ExprResult 8653TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 8654 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 8655 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 8656 if (SubExpr.isInvalid()) 8657 return ExprError(); 8658 8659 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 8660 return SemaRef.Owned(E); 8661 8662 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 8663} 8664 8665template<typename Derived> 8666ExprResult 8667TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 8668 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 8669 if (Pattern.isInvalid()) 8670 return ExprError(); 8671 8672 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 8673 return SemaRef.Owned(E); 8674 8675 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 8676 E->getNumExpansions()); 8677} 8678 8679template<typename Derived> 8680ExprResult 8681TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 8682 // If E is not value-dependent, then nothing will change when we transform it. 8683 // Note: This is an instantiation-centric view. 8684 if (!E->isValueDependent()) 8685 return SemaRef.Owned(E); 8686 8687 // Note: None of the implementations of TryExpandParameterPacks can ever 8688 // produce a diagnostic when given only a single unexpanded parameter pack, 8689 // so 8690 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 8691 bool ShouldExpand = false; 8692 bool RetainExpansion = false; 8693 Optional<unsigned> NumExpansions; 8694 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 8695 Unexpanded, 8696 ShouldExpand, RetainExpansion, 8697 NumExpansions)) 8698 return ExprError(); 8699 8700 if (RetainExpansion) 8701 return SemaRef.Owned(E); 8702 8703 NamedDecl *Pack = E->getPack(); 8704 if (!ShouldExpand) { 8705 Pack = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getPackLoc(), 8706 Pack)); 8707 if (!Pack) 8708 return ExprError(); 8709 } 8710 8711 8712 // We now know the length of the parameter pack, so build a new expression 8713 // that stores that length. 8714 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 8715 E->getPackLoc(), E->getRParenLoc(), 8716 NumExpansions); 8717} 8718 8719template<typename Derived> 8720ExprResult 8721TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 8722 SubstNonTypeTemplateParmPackExpr *E) { 8723 // Default behavior is to do nothing with this transformation. 8724 return SemaRef.Owned(E); 8725} 8726 8727template<typename Derived> 8728ExprResult 8729TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 8730 SubstNonTypeTemplateParmExpr *E) { 8731 // Default behavior is to do nothing with this transformation. 8732 return SemaRef.Owned(E); 8733} 8734 8735template<typename Derived> 8736ExprResult 8737TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 8738 // Default behavior is to do nothing with this transformation. 8739 return SemaRef.Owned(E); 8740} 8741 8742template<typename Derived> 8743ExprResult 8744TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 8745 MaterializeTemporaryExpr *E) { 8746 return getDerived().TransformExpr(E->GetTemporaryExpr()); 8747} 8748 8749template<typename Derived> 8750ExprResult 8751TreeTransform<Derived>::TransformCXXStdInitializerListExpr( 8752 CXXStdInitializerListExpr *E) { 8753 return getDerived().TransformExpr(E->getSubExpr()); 8754} 8755 8756template<typename Derived> 8757ExprResult 8758TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 8759 return SemaRef.MaybeBindToTemporary(E); 8760} 8761 8762template<typename Derived> 8763ExprResult 8764TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 8765 return SemaRef.Owned(E); 8766} 8767 8768template<typename Derived> 8769ExprResult 8770TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 8771 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 8772 if (SubExpr.isInvalid()) 8773 return ExprError(); 8774 8775 if (!getDerived().AlwaysRebuild() && 8776 SubExpr.get() == E->getSubExpr()) 8777 return SemaRef.Owned(E); 8778 8779 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 8780} 8781 8782template<typename Derived> 8783ExprResult 8784TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 8785 // Transform each of the elements. 8786 SmallVector<Expr *, 8> Elements; 8787 bool ArgChanged = false; 8788 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 8789 /*IsCall=*/false, Elements, &ArgChanged)) 8790 return ExprError(); 8791 8792 if (!getDerived().AlwaysRebuild() && !ArgChanged) 8793 return SemaRef.MaybeBindToTemporary(E); 8794 8795 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 8796 Elements.data(), 8797 Elements.size()); 8798} 8799 8800template<typename Derived> 8801ExprResult 8802TreeTransform<Derived>::TransformObjCDictionaryLiteral( 8803 ObjCDictionaryLiteral *E) { 8804 // Transform each of the elements. 8805 SmallVector<ObjCDictionaryElement, 8> Elements; 8806 bool ArgChanged = false; 8807 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 8808 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 8809 8810 if (OrigElement.isPackExpansion()) { 8811 // This key/value element is a pack expansion. 8812 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 8813 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 8814 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 8815 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 8816 8817 // Determine whether the set of unexpanded parameter packs can 8818 // and should be expanded. 8819 bool Expand = true; 8820 bool RetainExpansion = false; 8821 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 8822 Optional<unsigned> NumExpansions = OrigNumExpansions; 8823 SourceRange PatternRange(OrigElement.Key->getLocStart(), 8824 OrigElement.Value->getLocEnd()); 8825 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 8826 PatternRange, 8827 Unexpanded, 8828 Expand, RetainExpansion, 8829 NumExpansions)) 8830 return ExprError(); 8831 8832 if (!Expand) { 8833 // The transform has determined that we should perform a simple 8834 // transformation on the pack expansion, producing another pack 8835 // expansion. 8836 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 8837 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 8838 if (Key.isInvalid()) 8839 return ExprError(); 8840 8841 if (Key.get() != OrigElement.Key) 8842 ArgChanged = true; 8843 8844 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 8845 if (Value.isInvalid()) 8846 return ExprError(); 8847 8848 if (Value.get() != OrigElement.Value) 8849 ArgChanged = true; 8850 8851 ObjCDictionaryElement Expansion = { 8852 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 8853 }; 8854 Elements.push_back(Expansion); 8855 continue; 8856 } 8857 8858 // Record right away that the argument was changed. This needs 8859 // to happen even if the array expands to nothing. 8860 ArgChanged = true; 8861 8862 // The transform has determined that we should perform an elementwise 8863 // expansion of the pattern. Do so. 8864 for (unsigned I = 0; I != *NumExpansions; ++I) { 8865 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 8866 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 8867 if (Key.isInvalid()) 8868 return ExprError(); 8869 8870 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 8871 if (Value.isInvalid()) 8872 return ExprError(); 8873 8874 ObjCDictionaryElement Element = { 8875 Key.get(), Value.get(), SourceLocation(), NumExpansions 8876 }; 8877 8878 // If any unexpanded parameter packs remain, we still have a 8879 // pack expansion. 8880 if (Key.get()->containsUnexpandedParameterPack() || 8881 Value.get()->containsUnexpandedParameterPack()) 8882 Element.EllipsisLoc = OrigElement.EllipsisLoc; 8883 8884 Elements.push_back(Element); 8885 } 8886 8887 // We've finished with this pack expansion. 8888 continue; 8889 } 8890 8891 // Transform and check key. 8892 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 8893 if (Key.isInvalid()) 8894 return ExprError(); 8895 8896 if (Key.get() != OrigElement.Key) 8897 ArgChanged = true; 8898 8899 // Transform and check value. 8900 ExprResult Value 8901 = getDerived().TransformExpr(OrigElement.Value); 8902 if (Value.isInvalid()) 8903 return ExprError(); 8904 8905 if (Value.get() != OrigElement.Value) 8906 ArgChanged = true; 8907 8908 ObjCDictionaryElement Element = { 8909 Key.get(), Value.get(), SourceLocation(), None 8910 }; 8911 Elements.push_back(Element); 8912 } 8913 8914 if (!getDerived().AlwaysRebuild() && !ArgChanged) 8915 return SemaRef.MaybeBindToTemporary(E); 8916 8917 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 8918 Elements.data(), 8919 Elements.size()); 8920} 8921 8922template<typename Derived> 8923ExprResult 8924TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 8925 TypeSourceInfo *EncodedTypeInfo 8926 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 8927 if (!EncodedTypeInfo) 8928 return ExprError(); 8929 8930 if (!getDerived().AlwaysRebuild() && 8931 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 8932 return SemaRef.Owned(E); 8933 8934 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 8935 EncodedTypeInfo, 8936 E->getRParenLoc()); 8937} 8938 8939template<typename Derived> 8940ExprResult TreeTransform<Derived>:: 8941TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 8942 // This is a kind of implicit conversion, and it needs to get dropped 8943 // and recomputed for the same general reasons that ImplicitCastExprs 8944 // do, as well a more specific one: this expression is only valid when 8945 // it appears *immediately* as an argument expression. 8946 return getDerived().TransformExpr(E->getSubExpr()); 8947} 8948 8949template<typename Derived> 8950ExprResult TreeTransform<Derived>:: 8951TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 8952 TypeSourceInfo *TSInfo 8953 = getDerived().TransformType(E->getTypeInfoAsWritten()); 8954 if (!TSInfo) 8955 return ExprError(); 8956 8957 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 8958 if (Result.isInvalid()) 8959 return ExprError(); 8960 8961 if (!getDerived().AlwaysRebuild() && 8962 TSInfo == E->getTypeInfoAsWritten() && 8963 Result.get() == E->getSubExpr()) 8964 return SemaRef.Owned(E); 8965 8966 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 8967 E->getBridgeKeywordLoc(), TSInfo, 8968 Result.get()); 8969} 8970 8971template<typename Derived> 8972ExprResult 8973TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 8974 // Transform arguments. 8975 bool ArgChanged = false; 8976 SmallVector<Expr*, 8> Args; 8977 Args.reserve(E->getNumArgs()); 8978 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 8979 &ArgChanged)) 8980 return ExprError(); 8981 8982 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 8983 // Class message: transform the receiver type. 8984 TypeSourceInfo *ReceiverTypeInfo 8985 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 8986 if (!ReceiverTypeInfo) 8987 return ExprError(); 8988 8989 // If nothing changed, just retain the existing message send. 8990 if (!getDerived().AlwaysRebuild() && 8991 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 8992 return SemaRef.MaybeBindToTemporary(E); 8993 8994 // Build a new class message send. 8995 SmallVector<SourceLocation, 16> SelLocs; 8996 E->getSelectorLocs(SelLocs); 8997 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 8998 E->getSelector(), 8999 SelLocs, 9000 E->getMethodDecl(), 9001 E->getLeftLoc(), 9002 Args, 9003 E->getRightLoc()); 9004 } 9005 9006 // Instance message: transform the receiver 9007 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 9008 "Only class and instance messages may be instantiated"); 9009 ExprResult Receiver 9010 = getDerived().TransformExpr(E->getInstanceReceiver()); 9011 if (Receiver.isInvalid()) 9012 return ExprError(); 9013 9014 // If nothing changed, just retain the existing message send. 9015 if (!getDerived().AlwaysRebuild() && 9016 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 9017 return SemaRef.MaybeBindToTemporary(E); 9018 9019 // Build a new instance message send. 9020 SmallVector<SourceLocation, 16> SelLocs; 9021 E->getSelectorLocs(SelLocs); 9022 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 9023 E->getSelector(), 9024 SelLocs, 9025 E->getMethodDecl(), 9026 E->getLeftLoc(), 9027 Args, 9028 E->getRightLoc()); 9029} 9030 9031template<typename Derived> 9032ExprResult 9033TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 9034 return SemaRef.Owned(E); 9035} 9036 9037template<typename Derived> 9038ExprResult 9039TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 9040 return SemaRef.Owned(E); 9041} 9042 9043template<typename Derived> 9044ExprResult 9045TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 9046 // Transform the base expression. 9047 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9048 if (Base.isInvalid()) 9049 return ExprError(); 9050 9051 // We don't need to transform the ivar; it will never change. 9052 9053 // If nothing changed, just retain the existing expression. 9054 if (!getDerived().AlwaysRebuild() && 9055 Base.get() == E->getBase()) 9056 return SemaRef.Owned(E); 9057 9058 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 9059 E->getLocation(), 9060 E->isArrow(), E->isFreeIvar()); 9061} 9062 9063template<typename Derived> 9064ExprResult 9065TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 9066 // 'super' and types never change. Property never changes. Just 9067 // retain the existing expression. 9068 if (!E->isObjectReceiver()) 9069 return SemaRef.Owned(E); 9070 9071 // Transform the base expression. 9072 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9073 if (Base.isInvalid()) 9074 return ExprError(); 9075 9076 // We don't need to transform the property; it will never change. 9077 9078 // If nothing changed, just retain the existing expression. 9079 if (!getDerived().AlwaysRebuild() && 9080 Base.get() == E->getBase()) 9081 return SemaRef.Owned(E); 9082 9083 if (E->isExplicitProperty()) 9084 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 9085 E->getExplicitProperty(), 9086 E->getLocation()); 9087 9088 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 9089 SemaRef.Context.PseudoObjectTy, 9090 E->getImplicitPropertyGetter(), 9091 E->getImplicitPropertySetter(), 9092 E->getLocation()); 9093} 9094 9095template<typename Derived> 9096ExprResult 9097TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 9098 // Transform the base expression. 9099 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 9100 if (Base.isInvalid()) 9101 return ExprError(); 9102 9103 // Transform the key expression. 9104 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 9105 if (Key.isInvalid()) 9106 return ExprError(); 9107 9108 // If nothing changed, just retain the existing expression. 9109 if (!getDerived().AlwaysRebuild() && 9110 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 9111 return SemaRef.Owned(E); 9112 9113 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 9114 Base.get(), Key.get(), 9115 E->getAtIndexMethodDecl(), 9116 E->setAtIndexMethodDecl()); 9117} 9118 9119template<typename Derived> 9120ExprResult 9121TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 9122 // Transform the base expression. 9123 ExprResult Base = getDerived().TransformExpr(E->getBase()); 9124 if (Base.isInvalid()) 9125 return ExprError(); 9126 9127 // If nothing changed, just retain the existing expression. 9128 if (!getDerived().AlwaysRebuild() && 9129 Base.get() == E->getBase()) 9130 return SemaRef.Owned(E); 9131 9132 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 9133 E->getOpLoc(), 9134 E->isArrow()); 9135} 9136 9137template<typename Derived> 9138ExprResult 9139TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 9140 bool ArgumentChanged = false; 9141 SmallVector<Expr*, 8> SubExprs; 9142 SubExprs.reserve(E->getNumSubExprs()); 9143 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 9144 SubExprs, &ArgumentChanged)) 9145 return ExprError(); 9146 9147 if (!getDerived().AlwaysRebuild() && 9148 !ArgumentChanged) 9149 return SemaRef.Owned(E); 9150 9151 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 9152 SubExprs, 9153 E->getRParenLoc()); 9154} 9155 9156template<typename Derived> 9157ExprResult 9158TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 9159 BlockDecl *oldBlock = E->getBlockDecl(); 9160 9161 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/0); 9162 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 9163 9164 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 9165 blockScope->TheDecl->setBlockMissingReturnType( 9166 oldBlock->blockMissingReturnType()); 9167 9168 SmallVector<ParmVarDecl*, 4> params; 9169 SmallVector<QualType, 4> paramTypes; 9170 9171 // Parameter substitution. 9172 if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(), 9173 oldBlock->param_begin(), 9174 oldBlock->param_size(), 9175 0, paramTypes, ¶ms)) { 9176 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/0); 9177 return ExprError(); 9178 } 9179 9180 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 9181 QualType exprResultType = 9182 getDerived().TransformType(exprFunctionType->getResultType()); 9183 9184 QualType functionType = 9185 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, 9186 exprFunctionType->getExtProtoInfo()); 9187 blockScope->FunctionType = functionType; 9188 9189 // Set the parameters on the block decl. 9190 if (!params.empty()) 9191 blockScope->TheDecl->setParams(params); 9192 9193 if (!oldBlock->blockMissingReturnType()) { 9194 blockScope->HasImplicitReturnType = false; 9195 blockScope->ReturnType = exprResultType; 9196 } 9197 9198 // Transform the body 9199 StmtResult body = getDerived().TransformStmt(E->getBody()); 9200 if (body.isInvalid()) { 9201 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/0); 9202 return ExprError(); 9203 } 9204 9205#ifndef NDEBUG 9206 // In builds with assertions, make sure that we captured everything we 9207 // captured before. 9208 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 9209 for (BlockDecl::capture_iterator i = oldBlock->capture_begin(), 9210 e = oldBlock->capture_end(); i != e; ++i) { 9211 VarDecl *oldCapture = i->getVariable(); 9212 9213 // Ignore parameter packs. 9214 if (isa<ParmVarDecl>(oldCapture) && 9215 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 9216 continue; 9217 9218 VarDecl *newCapture = 9219 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 9220 oldCapture)); 9221 assert(blockScope->CaptureMap.count(newCapture)); 9222 } 9223 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 9224 } 9225#endif 9226 9227 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 9228 /*Scope=*/0); 9229} 9230 9231template<typename Derived> 9232ExprResult 9233TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 9234 llvm_unreachable("Cannot transform asType expressions yet"); 9235} 9236 9237template<typename Derived> 9238ExprResult 9239TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 9240 QualType RetTy = getDerived().TransformType(E->getType()); 9241 bool ArgumentChanged = false; 9242 SmallVector<Expr*, 8> SubExprs; 9243 SubExprs.reserve(E->getNumSubExprs()); 9244 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 9245 SubExprs, &ArgumentChanged)) 9246 return ExprError(); 9247 9248 if (!getDerived().AlwaysRebuild() && 9249 !ArgumentChanged) 9250 return SemaRef.Owned(E); 9251 9252 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 9253 RetTy, E->getOp(), E->getRParenLoc()); 9254} 9255 9256//===----------------------------------------------------------------------===// 9257// Type reconstruction 9258//===----------------------------------------------------------------------===// 9259 9260template<typename Derived> 9261QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 9262 SourceLocation Star) { 9263 return SemaRef.BuildPointerType(PointeeType, Star, 9264 getDerived().getBaseEntity()); 9265} 9266 9267template<typename Derived> 9268QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 9269 SourceLocation Star) { 9270 return SemaRef.BuildBlockPointerType(PointeeType, Star, 9271 getDerived().getBaseEntity()); 9272} 9273 9274template<typename Derived> 9275QualType 9276TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 9277 bool WrittenAsLValue, 9278 SourceLocation Sigil) { 9279 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 9280 Sigil, getDerived().getBaseEntity()); 9281} 9282 9283template<typename Derived> 9284QualType 9285TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 9286 QualType ClassType, 9287 SourceLocation Sigil) { 9288 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 9289 Sigil, getDerived().getBaseEntity()); 9290} 9291 9292template<typename Derived> 9293QualType 9294TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 9295 ArrayType::ArraySizeModifier SizeMod, 9296 const llvm::APInt *Size, 9297 Expr *SizeExpr, 9298 unsigned IndexTypeQuals, 9299 SourceRange BracketsRange) { 9300 if (SizeExpr || !Size) 9301 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 9302 IndexTypeQuals, BracketsRange, 9303 getDerived().getBaseEntity()); 9304 9305 QualType Types[] = { 9306 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 9307 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 9308 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 9309 }; 9310 const unsigned NumTypes = llvm::array_lengthof(Types); 9311 QualType SizeType; 9312 for (unsigned I = 0; I != NumTypes; ++I) 9313 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 9314 SizeType = Types[I]; 9315 break; 9316 } 9317 9318 // Note that we can return a VariableArrayType here in the case where 9319 // the element type was a dependent VariableArrayType. 9320 IntegerLiteral *ArraySize 9321 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 9322 /*FIXME*/BracketsRange.getBegin()); 9323 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 9324 IndexTypeQuals, BracketsRange, 9325 getDerived().getBaseEntity()); 9326} 9327 9328template<typename Derived> 9329QualType 9330TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 9331 ArrayType::ArraySizeModifier SizeMod, 9332 const llvm::APInt &Size, 9333 unsigned IndexTypeQuals, 9334 SourceRange BracketsRange) { 9335 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 9336 IndexTypeQuals, BracketsRange); 9337} 9338 9339template<typename Derived> 9340QualType 9341TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 9342 ArrayType::ArraySizeModifier SizeMod, 9343 unsigned IndexTypeQuals, 9344 SourceRange BracketsRange) { 9345 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 9346 IndexTypeQuals, BracketsRange); 9347} 9348 9349template<typename Derived> 9350QualType 9351TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 9352 ArrayType::ArraySizeModifier SizeMod, 9353 Expr *SizeExpr, 9354 unsigned IndexTypeQuals, 9355 SourceRange BracketsRange) { 9356 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 9357 SizeExpr, 9358 IndexTypeQuals, BracketsRange); 9359} 9360 9361template<typename Derived> 9362QualType 9363TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 9364 ArrayType::ArraySizeModifier SizeMod, 9365 Expr *SizeExpr, 9366 unsigned IndexTypeQuals, 9367 SourceRange BracketsRange) { 9368 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 9369 SizeExpr, 9370 IndexTypeQuals, BracketsRange); 9371} 9372 9373template<typename Derived> 9374QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 9375 unsigned NumElements, 9376 VectorType::VectorKind VecKind) { 9377 // FIXME: semantic checking! 9378 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 9379} 9380 9381template<typename Derived> 9382QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 9383 unsigned NumElements, 9384 SourceLocation AttributeLoc) { 9385 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 9386 NumElements, true); 9387 IntegerLiteral *VectorSize 9388 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 9389 AttributeLoc); 9390 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 9391} 9392 9393template<typename Derived> 9394QualType 9395TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 9396 Expr *SizeExpr, 9397 SourceLocation AttributeLoc) { 9398 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 9399} 9400 9401template<typename Derived> 9402QualType TreeTransform<Derived>::RebuildFunctionProtoType( 9403 QualType T, 9404 llvm::MutableArrayRef<QualType> ParamTypes, 9405 const FunctionProtoType::ExtProtoInfo &EPI) { 9406 return SemaRef.BuildFunctionType(T, ParamTypes, 9407 getDerived().getBaseLocation(), 9408 getDerived().getBaseEntity(), 9409 EPI); 9410} 9411 9412template<typename Derived> 9413QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 9414 return SemaRef.Context.getFunctionNoProtoType(T); 9415} 9416 9417template<typename Derived> 9418QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 9419 assert(D && "no decl found"); 9420 if (D->isInvalidDecl()) return QualType(); 9421 9422 // FIXME: Doesn't account for ObjCInterfaceDecl! 9423 TypeDecl *Ty; 9424 if (isa<UsingDecl>(D)) { 9425 UsingDecl *Using = cast<UsingDecl>(D); 9426 assert(Using->hasTypename() && 9427 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 9428 9429 // A valid resolved using typename decl points to exactly one type decl. 9430 assert(++Using->shadow_begin() == Using->shadow_end()); 9431 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 9432 9433 } else { 9434 assert(isa<UnresolvedUsingTypenameDecl>(D) && 9435 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 9436 Ty = cast<UnresolvedUsingTypenameDecl>(D); 9437 } 9438 9439 return SemaRef.Context.getTypeDeclType(Ty); 9440} 9441 9442template<typename Derived> 9443QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 9444 SourceLocation Loc) { 9445 return SemaRef.BuildTypeofExprType(E, Loc); 9446} 9447 9448template<typename Derived> 9449QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 9450 return SemaRef.Context.getTypeOfType(Underlying); 9451} 9452 9453template<typename Derived> 9454QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 9455 SourceLocation Loc) { 9456 return SemaRef.BuildDecltypeType(E, Loc); 9457} 9458 9459template<typename Derived> 9460QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 9461 UnaryTransformType::UTTKind UKind, 9462 SourceLocation Loc) { 9463 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 9464} 9465 9466template<typename Derived> 9467QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 9468 TemplateName Template, 9469 SourceLocation TemplateNameLoc, 9470 TemplateArgumentListInfo &TemplateArgs) { 9471 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 9472} 9473 9474template<typename Derived> 9475QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 9476 SourceLocation KWLoc) { 9477 return SemaRef.BuildAtomicType(ValueType, KWLoc); 9478} 9479 9480template<typename Derived> 9481TemplateName 9482TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 9483 bool TemplateKW, 9484 TemplateDecl *Template) { 9485 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 9486 Template); 9487} 9488 9489template<typename Derived> 9490TemplateName 9491TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 9492 const IdentifierInfo &Name, 9493 SourceLocation NameLoc, 9494 QualType ObjectType, 9495 NamedDecl *FirstQualifierInScope) { 9496 UnqualifiedId TemplateName; 9497 TemplateName.setIdentifier(&Name, NameLoc); 9498 Sema::TemplateTy Template; 9499 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 9500 getSema().ActOnDependentTemplateName(/*Scope=*/0, 9501 SS, TemplateKWLoc, TemplateName, 9502 ParsedType::make(ObjectType), 9503 /*EnteringContext=*/false, 9504 Template); 9505 return Template.get(); 9506} 9507 9508template<typename Derived> 9509TemplateName 9510TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 9511 OverloadedOperatorKind Operator, 9512 SourceLocation NameLoc, 9513 QualType ObjectType) { 9514 UnqualifiedId Name; 9515 // FIXME: Bogus location information. 9516 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 9517 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 9518 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 9519 Sema::TemplateTy Template; 9520 getSema().ActOnDependentTemplateName(/*Scope=*/0, 9521 SS, TemplateKWLoc, Name, 9522 ParsedType::make(ObjectType), 9523 /*EnteringContext=*/false, 9524 Template); 9525 return Template.get(); 9526} 9527 9528template<typename Derived> 9529ExprResult 9530TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 9531 SourceLocation OpLoc, 9532 Expr *OrigCallee, 9533 Expr *First, 9534 Expr *Second) { 9535 Expr *Callee = OrigCallee->IgnoreParenCasts(); 9536 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 9537 9538 // Determine whether this should be a builtin operation. 9539 if (Op == OO_Subscript) { 9540 if (!First->getType()->isOverloadableType() && 9541 !Second->getType()->isOverloadableType()) 9542 return getSema().CreateBuiltinArraySubscriptExpr(First, 9543 Callee->getLocStart(), 9544 Second, OpLoc); 9545 } else if (Op == OO_Arrow) { 9546 // -> is never a builtin operation. 9547 return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc); 9548 } else if (Second == 0 || isPostIncDec) { 9549 if (!First->getType()->isOverloadableType()) { 9550 // The argument is not of overloadable type, so try to create a 9551 // built-in unary operation. 9552 UnaryOperatorKind Opc 9553 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 9554 9555 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 9556 } 9557 } else { 9558 if (!First->getType()->isOverloadableType() && 9559 !Second->getType()->isOverloadableType()) { 9560 // Neither of the arguments is an overloadable type, so try to 9561 // create a built-in binary operation. 9562 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 9563 ExprResult Result 9564 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 9565 if (Result.isInvalid()) 9566 return ExprError(); 9567 9568 return Result; 9569 } 9570 } 9571 9572 // Compute the transformed set of functions (and function templates) to be 9573 // used during overload resolution. 9574 UnresolvedSet<16> Functions; 9575 9576 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 9577 assert(ULE->requiresADL()); 9578 9579 // FIXME: Do we have to check 9580 // IsAcceptableNonMemberOperatorCandidate for each of these? 9581 Functions.append(ULE->decls_begin(), ULE->decls_end()); 9582 } else { 9583 // If we've resolved this to a particular non-member function, just call 9584 // that function. If we resolved it to a member function, 9585 // CreateOverloaded* will find that function for us. 9586 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 9587 if (!isa<CXXMethodDecl>(ND)) 9588 Functions.addDecl(ND); 9589 } 9590 9591 // Add any functions found via argument-dependent lookup. 9592 Expr *Args[2] = { First, Second }; 9593 unsigned NumArgs = 1 + (Second != 0); 9594 9595 // Create the overloaded operator invocation for unary operators. 9596 if (NumArgs == 1 || isPostIncDec) { 9597 UnaryOperatorKind Opc 9598 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 9599 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First); 9600 } 9601 9602 if (Op == OO_Subscript) { 9603 SourceLocation LBrace; 9604 SourceLocation RBrace; 9605 9606 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 9607 DeclarationNameLoc &NameLoc = DRE->getNameInfo().getInfo(); 9608 LBrace = SourceLocation::getFromRawEncoding( 9609 NameLoc.CXXOperatorName.BeginOpNameLoc); 9610 RBrace = SourceLocation::getFromRawEncoding( 9611 NameLoc.CXXOperatorName.EndOpNameLoc); 9612 } else { 9613 LBrace = Callee->getLocStart(); 9614 RBrace = OpLoc; 9615 } 9616 9617 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 9618 First, Second); 9619 } 9620 9621 // Create the overloaded operator invocation for binary operators. 9622 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 9623 ExprResult Result 9624 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 9625 if (Result.isInvalid()) 9626 return ExprError(); 9627 9628 return Result; 9629} 9630 9631template<typename Derived> 9632ExprResult 9633TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 9634 SourceLocation OperatorLoc, 9635 bool isArrow, 9636 CXXScopeSpec &SS, 9637 TypeSourceInfo *ScopeType, 9638 SourceLocation CCLoc, 9639 SourceLocation TildeLoc, 9640 PseudoDestructorTypeStorage Destroyed) { 9641 QualType BaseType = Base->getType(); 9642 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 9643 (!isArrow && !BaseType->getAs<RecordType>()) || 9644 (isArrow && BaseType->getAs<PointerType>() && 9645 !BaseType->getAs<PointerType>()->getPointeeType() 9646 ->template getAs<RecordType>())){ 9647 // This pseudo-destructor expression is still a pseudo-destructor. 9648 return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc, 9649 isArrow? tok::arrow : tok::period, 9650 SS, ScopeType, CCLoc, TildeLoc, 9651 Destroyed, 9652 /*FIXME?*/true); 9653 } 9654 9655 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 9656 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 9657 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 9658 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 9659 NameInfo.setNamedTypeInfo(DestroyedType); 9660 9661 // The scope type is now known to be a valid nested name specifier 9662 // component. Tack it on to the end of the nested name specifier. 9663 if (ScopeType) 9664 SS.Extend(SemaRef.Context, SourceLocation(), 9665 ScopeType->getTypeLoc(), CCLoc); 9666 9667 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 9668 return getSema().BuildMemberReferenceExpr(Base, BaseType, 9669 OperatorLoc, isArrow, 9670 SS, TemplateKWLoc, 9671 /*FIXME: FirstQualifier*/ 0, 9672 NameInfo, 9673 /*TemplateArgs*/ 0); 9674} 9675 9676template<typename Derived> 9677StmtResult 9678TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 9679 SourceLocation Loc = S->getLocStart(); 9680 unsigned NumParams = S->getCapturedDecl()->getNumParams(); 9681 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/0, 9682 S->getCapturedRegionKind(), NumParams); 9683 StmtResult Body = getDerived().TransformStmt(S->getCapturedStmt()); 9684 9685 if (Body.isInvalid()) { 9686 getSema().ActOnCapturedRegionError(); 9687 return StmtError(); 9688 } 9689 9690 return getSema().ActOnCapturedRegionEnd(Body.take()); 9691} 9692 9693} // end namespace clang 9694 9695#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 9696