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