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 while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init)) 2634 Init = Binder->getSubExpr(); 2635 2636 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init)) 2637 Init = ICE->getSubExprAsWritten(); 2638 2639 // If this is not a direct-initializer, we only need to reconstruct 2640 // InitListExprs. Other forms of copy-initialization will be a no-op if 2641 // the initializer is already the right type. 2642 CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init); 2643 if (!CXXDirectInit && !(Construct && Construct->isListInitialization())) 2644 return getDerived().TransformExpr(Init); 2645 2646 // Revert value-initialization back to empty parens. 2647 if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) { 2648 SourceRange Parens = VIE->getSourceRange(); 2649 return getDerived().RebuildParenListExpr(Parens.getBegin(), None, 2650 Parens.getEnd()); 2651 } 2652 2653 // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization. 2654 if (isa<ImplicitValueInitExpr>(Init)) 2655 return getDerived().RebuildParenListExpr(SourceLocation(), None, 2656 SourceLocation()); 2657 2658 // Revert initialization by constructor back to a parenthesized or braced list 2659 // of expressions. Any other form of initializer can just be reused directly. 2660 if (!Construct || isa<CXXTemporaryObjectExpr>(Construct)) 2661 return getDerived().TransformExpr(Init); 2662 2663 SmallVector<Expr*, 8> NewArgs; 2664 bool ArgChanged = false; 2665 if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(), 2666 /*IsCall*/true, NewArgs, &ArgChanged)) 2667 return ExprError(); 2668 2669 // If this was list initialization, revert to list form. 2670 if (Construct->isListInitialization()) 2671 return getDerived().RebuildInitList(Construct->getLocStart(), NewArgs, 2672 Construct->getLocEnd(), 2673 Construct->getType()); 2674 2675 // Build a ParenListExpr to represent anything else. 2676 SourceRange Parens = Construct->getParenRange(); 2677 return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs, 2678 Parens.getEnd()); 2679 } 2680 2681 template<typename Derived> 2682 bool TreeTransform<Derived>::TransformExprs(Expr **Inputs, 2683 unsigned NumInputs, 2684 bool IsCall, 2685 SmallVectorImpl<Expr *> &Outputs, 2686 bool *ArgChanged) { 2687 for (unsigned I = 0; I != NumInputs; ++I) { 2688 // If requested, drop call arguments that need to be dropped. 2689 if (IsCall && getDerived().DropCallArgument(Inputs[I])) { 2690 if (ArgChanged) 2691 *ArgChanged = true; 2692 2693 break; 2694 } 2695 2696 if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) { 2697 Expr *Pattern = Expansion->getPattern(); 2698 2699 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 2700 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 2701 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 2702 2703 // Determine whether the set of unexpanded parameter packs can and should 2704 // be expanded. 2705 bool Expand = true; 2706 bool RetainExpansion = false; 2707 Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions(); 2708 Optional<unsigned> NumExpansions = OrigNumExpansions; 2709 if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(), 2710 Pattern->getSourceRange(), 2711 Unexpanded, 2712 Expand, RetainExpansion, 2713 NumExpansions)) 2714 return true; 2715 2716 if (!Expand) { 2717 // The transform has determined that we should perform a simple 2718 // transformation on the pack expansion, producing another pack 2719 // expansion. 2720 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 2721 ExprResult OutPattern = getDerived().TransformExpr(Pattern); 2722 if (OutPattern.isInvalid()) 2723 return true; 2724 2725 ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(), 2726 Expansion->getEllipsisLoc(), 2727 NumExpansions); 2728 if (Out.isInvalid()) 2729 return true; 2730 2731 if (ArgChanged) 2732 *ArgChanged = true; 2733 Outputs.push_back(Out.get()); 2734 continue; 2735 } 2736 2737 // Record right away that the argument was changed. This needs 2738 // to happen even if the array expands to nothing. 2739 if (ArgChanged) *ArgChanged = true; 2740 2741 // The transform has determined that we should perform an elementwise 2742 // expansion of the pattern. Do so. 2743 for (unsigned I = 0; I != *NumExpansions; ++I) { 2744 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 2745 ExprResult Out = getDerived().TransformExpr(Pattern); 2746 if (Out.isInvalid()) 2747 return true; 2748 2749 if (Out.get()->containsUnexpandedParameterPack()) { 2750 Out = RebuildPackExpansion(Out.get(), Expansion->getEllipsisLoc(), 2751 OrigNumExpansions); 2752 if (Out.isInvalid()) 2753 return true; 2754 } 2755 2756 Outputs.push_back(Out.get()); 2757 } 2758 2759 continue; 2760 } 2761 2762 ExprResult Result = 2763 IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false) 2764 : getDerived().TransformExpr(Inputs[I]); 2765 if (Result.isInvalid()) 2766 return true; 2767 2768 if (Result.get() != Inputs[I] && ArgChanged) 2769 *ArgChanged = true; 2770 2771 Outputs.push_back(Result.get()); 2772 } 2773 2774 return false; 2775 } 2776 2777 template<typename Derived> 2778 NestedNameSpecifierLoc 2779 TreeTransform<Derived>::TransformNestedNameSpecifierLoc( 2780 NestedNameSpecifierLoc NNS, 2781 QualType ObjectType, 2782 NamedDecl *FirstQualifierInScope) { 2783 SmallVector<NestedNameSpecifierLoc, 4> Qualifiers; 2784 for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier; 2785 Qualifier = Qualifier.getPrefix()) 2786 Qualifiers.push_back(Qualifier); 2787 2788 CXXScopeSpec SS; 2789 while (!Qualifiers.empty()) { 2790 NestedNameSpecifierLoc Q = Qualifiers.pop_back_val(); 2791 NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier(); 2792 2793 switch (QNNS->getKind()) { 2794 case NestedNameSpecifier::Identifier: 2795 if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/0, 2796 *QNNS->getAsIdentifier(), 2797 Q.getLocalBeginLoc(), 2798 Q.getLocalEndLoc(), 2799 ObjectType, false, SS, 2800 FirstQualifierInScope, false)) 2801 return NestedNameSpecifierLoc(); 2802 2803 break; 2804 2805 case NestedNameSpecifier::Namespace: { 2806 NamespaceDecl *NS 2807 = cast_or_null<NamespaceDecl>( 2808 getDerived().TransformDecl( 2809 Q.getLocalBeginLoc(), 2810 QNNS->getAsNamespace())); 2811 SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc()); 2812 break; 2813 } 2814 2815 case NestedNameSpecifier::NamespaceAlias: { 2816 NamespaceAliasDecl *Alias 2817 = cast_or_null<NamespaceAliasDecl>( 2818 getDerived().TransformDecl(Q.getLocalBeginLoc(), 2819 QNNS->getAsNamespaceAlias())); 2820 SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(), 2821 Q.getLocalEndLoc()); 2822 break; 2823 } 2824 2825 case NestedNameSpecifier::Global: 2826 // There is no meaningful transformation that one could perform on the 2827 // global scope. 2828 SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc()); 2829 break; 2830 2831 case NestedNameSpecifier::TypeSpecWithTemplate: 2832 case NestedNameSpecifier::TypeSpec: { 2833 TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType, 2834 FirstQualifierInScope, SS); 2835 2836 if (!TL) 2837 return NestedNameSpecifierLoc(); 2838 2839 if (TL.getType()->isDependentType() || TL.getType()->isRecordType() || 2840 (SemaRef.getLangOpts().CPlusPlus11 && 2841 TL.getType()->isEnumeralType())) { 2842 assert(!TL.getType().hasLocalQualifiers() && 2843 "Can't get cv-qualifiers here"); 2844 if (TL.getType()->isEnumeralType()) 2845 SemaRef.Diag(TL.getBeginLoc(), 2846 diag::warn_cxx98_compat_enum_nested_name_spec); 2847 SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL, 2848 Q.getLocalEndLoc()); 2849 break; 2850 } 2851 // If the nested-name-specifier is an invalid type def, don't emit an 2852 // error because a previous error should have already been emitted. 2853 TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>(); 2854 if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) { 2855 SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag) 2856 << TL.getType() << SS.getRange(); 2857 } 2858 return NestedNameSpecifierLoc(); 2859 } 2860 } 2861 2862 // The qualifier-in-scope and object type only apply to the leftmost entity. 2863 FirstQualifierInScope = 0; 2864 ObjectType = QualType(); 2865 } 2866 2867 // Don't rebuild the nested-name-specifier if we don't have to. 2868 if (SS.getScopeRep() == NNS.getNestedNameSpecifier() && 2869 !getDerived().AlwaysRebuild()) 2870 return NNS; 2871 2872 // If we can re-use the source-location data from the original 2873 // nested-name-specifier, do so. 2874 if (SS.location_size() == NNS.getDataLength() && 2875 memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0) 2876 return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData()); 2877 2878 // Allocate new nested-name-specifier location information. 2879 return SS.getWithLocInContext(SemaRef.Context); 2880 } 2881 2882 template<typename Derived> 2883 DeclarationNameInfo 2884 TreeTransform<Derived> 2885 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) { 2886 DeclarationName Name = NameInfo.getName(); 2887 if (!Name) 2888 return DeclarationNameInfo(); 2889 2890 switch (Name.getNameKind()) { 2891 case DeclarationName::Identifier: 2892 case DeclarationName::ObjCZeroArgSelector: 2893 case DeclarationName::ObjCOneArgSelector: 2894 case DeclarationName::ObjCMultiArgSelector: 2895 case DeclarationName::CXXOperatorName: 2896 case DeclarationName::CXXLiteralOperatorName: 2897 case DeclarationName::CXXUsingDirective: 2898 return NameInfo; 2899 2900 case DeclarationName::CXXConstructorName: 2901 case DeclarationName::CXXDestructorName: 2902 case DeclarationName::CXXConversionFunctionName: { 2903 TypeSourceInfo *NewTInfo; 2904 CanQualType NewCanTy; 2905 if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) { 2906 NewTInfo = getDerived().TransformType(OldTInfo); 2907 if (!NewTInfo) 2908 return DeclarationNameInfo(); 2909 NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType()); 2910 } 2911 else { 2912 NewTInfo = 0; 2913 TemporaryBase Rebase(*this, NameInfo.getLoc(), Name); 2914 QualType NewT = getDerived().TransformType(Name.getCXXNameType()); 2915 if (NewT.isNull()) 2916 return DeclarationNameInfo(); 2917 NewCanTy = SemaRef.Context.getCanonicalType(NewT); 2918 } 2919 2920 DeclarationName NewName 2921 = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(), 2922 NewCanTy); 2923 DeclarationNameInfo NewNameInfo(NameInfo); 2924 NewNameInfo.setName(NewName); 2925 NewNameInfo.setNamedTypeInfo(NewTInfo); 2926 return NewNameInfo; 2927 } 2928 } 2929 2930 llvm_unreachable("Unknown name kind."); 2931 } 2932 2933 template<typename Derived> 2934 TemplateName 2935 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS, 2936 TemplateName Name, 2937 SourceLocation NameLoc, 2938 QualType ObjectType, 2939 NamedDecl *FirstQualifierInScope) { 2940 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 2941 TemplateDecl *Template = QTN->getTemplateDecl(); 2942 assert(Template && "qualified template name must refer to a template"); 2943 2944 TemplateDecl *TransTemplate 2945 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 2946 Template)); 2947 if (!TransTemplate) 2948 return TemplateName(); 2949 2950 if (!getDerived().AlwaysRebuild() && 2951 SS.getScopeRep() == QTN->getQualifier() && 2952 TransTemplate == Template) 2953 return Name; 2954 2955 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(), 2956 TransTemplate); 2957 } 2958 2959 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 2960 if (SS.getScopeRep()) { 2961 // These apply to the scope specifier, not the template. 2962 ObjectType = QualType(); 2963 FirstQualifierInScope = 0; 2964 } 2965 2966 if (!getDerived().AlwaysRebuild() && 2967 SS.getScopeRep() == DTN->getQualifier() && 2968 ObjectType.isNull()) 2969 return Name; 2970 2971 if (DTN->isIdentifier()) { 2972 return getDerived().RebuildTemplateName(SS, 2973 *DTN->getIdentifier(), 2974 NameLoc, 2975 ObjectType, 2976 FirstQualifierInScope); 2977 } 2978 2979 return getDerived().RebuildTemplateName(SS, DTN->getOperator(), NameLoc, 2980 ObjectType); 2981 } 2982 2983 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 2984 TemplateDecl *TransTemplate 2985 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc, 2986 Template)); 2987 if (!TransTemplate) 2988 return TemplateName(); 2989 2990 if (!getDerived().AlwaysRebuild() && 2991 TransTemplate == Template) 2992 return Name; 2993 2994 return TemplateName(TransTemplate); 2995 } 2996 2997 if (SubstTemplateTemplateParmPackStorage *SubstPack 2998 = Name.getAsSubstTemplateTemplateParmPack()) { 2999 TemplateTemplateParmDecl *TransParam 3000 = cast_or_null<TemplateTemplateParmDecl>( 3001 getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack())); 3002 if (!TransParam) 3003 return TemplateName(); 3004 3005 if (!getDerived().AlwaysRebuild() && 3006 TransParam == SubstPack->getParameterPack()) 3007 return Name; 3008 3009 return getDerived().RebuildTemplateName(TransParam, 3010 SubstPack->getArgumentPack()); 3011 } 3012 3013 // These should be getting filtered out before they reach the AST. 3014 llvm_unreachable("overloaded function decl survived to here"); 3015 } 3016 3017 template<typename Derived> 3018 void TreeTransform<Derived>::InventTemplateArgumentLoc( 3019 const TemplateArgument &Arg, 3020 TemplateArgumentLoc &Output) { 3021 SourceLocation Loc = getDerived().getBaseLocation(); 3022 switch (Arg.getKind()) { 3023 case TemplateArgument::Null: 3024 llvm_unreachable("null template argument in TreeTransform"); 3025 break; 3026 3027 case TemplateArgument::Type: 3028 Output = TemplateArgumentLoc(Arg, 3029 SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc)); 3030 3031 break; 3032 3033 case TemplateArgument::Template: 3034 case TemplateArgument::TemplateExpansion: { 3035 NestedNameSpecifierLocBuilder Builder; 3036 TemplateName Template = Arg.getAsTemplate(); 3037 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) 3038 Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc); 3039 else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName()) 3040 Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc); 3041 3042 if (Arg.getKind() == TemplateArgument::Template) 3043 Output = TemplateArgumentLoc(Arg, 3044 Builder.getWithLocInContext(SemaRef.Context), 3045 Loc); 3046 else 3047 Output = TemplateArgumentLoc(Arg, 3048 Builder.getWithLocInContext(SemaRef.Context), 3049 Loc, Loc); 3050 3051 break; 3052 } 3053 3054 case TemplateArgument::Expression: 3055 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr()); 3056 break; 3057 3058 case TemplateArgument::Declaration: 3059 case TemplateArgument::Integral: 3060 case TemplateArgument::Pack: 3061 case TemplateArgument::NullPtr: 3062 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo()); 3063 break; 3064 } 3065 } 3066 3067 template<typename Derived> 3068 bool TreeTransform<Derived>::TransformTemplateArgument( 3069 const TemplateArgumentLoc &Input, 3070 TemplateArgumentLoc &Output) { 3071 const TemplateArgument &Arg = Input.getArgument(); 3072 switch (Arg.getKind()) { 3073 case TemplateArgument::Null: 3074 case TemplateArgument::Integral: 3075 case TemplateArgument::Pack: 3076 case TemplateArgument::Declaration: 3077 case TemplateArgument::NullPtr: 3078 llvm_unreachable("Unexpected TemplateArgument"); 3079 3080 case TemplateArgument::Type: { 3081 TypeSourceInfo *DI = Input.getTypeSourceInfo(); 3082 if (DI == NULL) 3083 DI = InventTypeSourceInfo(Input.getArgument().getAsType()); 3084 3085 DI = getDerived().TransformType(DI); 3086 if (!DI) return true; 3087 3088 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI); 3089 return false; 3090 } 3091 3092 case TemplateArgument::Template: { 3093 NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc(); 3094 if (QualifierLoc) { 3095 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc); 3096 if (!QualifierLoc) 3097 return true; 3098 } 3099 3100 CXXScopeSpec SS; 3101 SS.Adopt(QualifierLoc); 3102 TemplateName Template 3103 = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(), 3104 Input.getTemplateNameLoc()); 3105 if (Template.isNull()) 3106 return true; 3107 3108 Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc, 3109 Input.getTemplateNameLoc()); 3110 return false; 3111 } 3112 3113 case TemplateArgument::TemplateExpansion: 3114 llvm_unreachable("Caller should expand pack expansions"); 3115 3116 case TemplateArgument::Expression: { 3117 // Template argument expressions are constant expressions. 3118 EnterExpressionEvaluationContext Unevaluated(getSema(), 3119 Sema::ConstantEvaluated); 3120 3121 Expr *InputExpr = Input.getSourceExpression(); 3122 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr(); 3123 3124 ExprResult E = getDerived().TransformExpr(InputExpr); 3125 E = SemaRef.ActOnConstantExpression(E); 3126 if (E.isInvalid()) return true; 3127 Output = TemplateArgumentLoc(TemplateArgument(E.take()), E.take()); 3128 return false; 3129 } 3130 } 3131 3132 // Work around bogus GCC warning 3133 return true; 3134 } 3135 3136 /// \brief Iterator adaptor that invents template argument location information 3137 /// for each of the template arguments in its underlying iterator. 3138 template<typename Derived, typename InputIterator> 3139 class TemplateArgumentLocInventIterator { 3140 TreeTransform<Derived> &Self; 3141 InputIterator Iter; 3142 3143 public: 3144 typedef TemplateArgumentLoc value_type; 3145 typedef TemplateArgumentLoc reference; 3146 typedef typename std::iterator_traits<InputIterator>::difference_type 3147 difference_type; 3148 typedef std::input_iterator_tag iterator_category; 3149 3150 class pointer { 3151 TemplateArgumentLoc Arg; 3152 3153 public: 3154 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 3155 3156 const TemplateArgumentLoc *operator->() const { return &Arg; } 3157 }; 3158 3159 TemplateArgumentLocInventIterator() { } 3160 3161 explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self, 3162 InputIterator Iter) 3163 : Self(Self), Iter(Iter) { } 3164 3165 TemplateArgumentLocInventIterator &operator++() { 3166 ++Iter; 3167 return *this; 3168 } 3169 3170 TemplateArgumentLocInventIterator operator++(int) { 3171 TemplateArgumentLocInventIterator Old(*this); 3172 ++(*this); 3173 return Old; 3174 } 3175 3176 reference operator*() const { 3177 TemplateArgumentLoc Result; 3178 Self.InventTemplateArgumentLoc(*Iter, Result); 3179 return Result; 3180 } 3181 3182 pointer operator->() const { return pointer(**this); } 3183 3184 friend bool operator==(const TemplateArgumentLocInventIterator &X, 3185 const TemplateArgumentLocInventIterator &Y) { 3186 return X.Iter == Y.Iter; 3187 } 3188 3189 friend bool operator!=(const TemplateArgumentLocInventIterator &X, 3190 const TemplateArgumentLocInventIterator &Y) { 3191 return X.Iter != Y.Iter; 3192 } 3193 }; 3194 3195 template<typename Derived> 3196 template<typename InputIterator> 3197 bool TreeTransform<Derived>::TransformTemplateArguments(InputIterator First, 3198 InputIterator Last, 3199 TemplateArgumentListInfo &Outputs) { 3200 for (; First != Last; ++First) { 3201 TemplateArgumentLoc Out; 3202 TemplateArgumentLoc In = *First; 3203 3204 if (In.getArgument().getKind() == TemplateArgument::Pack) { 3205 // Unpack argument packs, which we translate them into separate 3206 // arguments. 3207 // FIXME: We could do much better if we could guarantee that the 3208 // TemplateArgumentLocInfo for the pack expansion would be usable for 3209 // all of the template arguments in the argument pack. 3210 typedef TemplateArgumentLocInventIterator<Derived, 3211 TemplateArgument::pack_iterator> 3212 PackLocIterator; 3213 if (TransformTemplateArguments(PackLocIterator(*this, 3214 In.getArgument().pack_begin()), 3215 PackLocIterator(*this, 3216 In.getArgument().pack_end()), 3217 Outputs)) 3218 return true; 3219 3220 continue; 3221 } 3222 3223 if (In.getArgument().isPackExpansion()) { 3224 // We have a pack expansion, for which we will be substituting into 3225 // the pattern. 3226 SourceLocation Ellipsis; 3227 Optional<unsigned> OrigNumExpansions; 3228 TemplateArgumentLoc Pattern 3229 = In.getPackExpansionPattern(Ellipsis, OrigNumExpansions, 3230 getSema().Context); 3231 3232 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 3233 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 3234 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 3235 3236 // Determine whether the set of unexpanded parameter packs can and should 3237 // be expanded. 3238 bool Expand = true; 3239 bool RetainExpansion = false; 3240 Optional<unsigned> NumExpansions = OrigNumExpansions; 3241 if (getDerived().TryExpandParameterPacks(Ellipsis, 3242 Pattern.getSourceRange(), 3243 Unexpanded, 3244 Expand, 3245 RetainExpansion, 3246 NumExpansions)) 3247 return true; 3248 3249 if (!Expand) { 3250 // The transform has determined that we should perform a simple 3251 // transformation on the pack expansion, producing another pack 3252 // expansion. 3253 TemplateArgumentLoc OutPattern; 3254 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 3255 if (getDerived().TransformTemplateArgument(Pattern, OutPattern)) 3256 return true; 3257 3258 Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis, 3259 NumExpansions); 3260 if (Out.getArgument().isNull()) 3261 return true; 3262 3263 Outputs.addArgument(Out); 3264 continue; 3265 } 3266 3267 // The transform has determined that we should perform an elementwise 3268 // expansion of the pattern. Do so. 3269 for (unsigned I = 0; I != *NumExpansions; ++I) { 3270 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 3271 3272 if (getDerived().TransformTemplateArgument(Pattern, Out)) 3273 return true; 3274 3275 if (Out.getArgument().containsUnexpandedParameterPack()) { 3276 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 3277 OrigNumExpansions); 3278 if (Out.getArgument().isNull()) 3279 return true; 3280 } 3281 3282 Outputs.addArgument(Out); 3283 } 3284 3285 // If we're supposed to retain a pack expansion, do so by temporarily 3286 // forgetting the partially-substituted parameter pack. 3287 if (RetainExpansion) { 3288 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 3289 3290 if (getDerived().TransformTemplateArgument(Pattern, Out)) 3291 return true; 3292 3293 Out = getDerived().RebuildPackExpansion(Out, Ellipsis, 3294 OrigNumExpansions); 3295 if (Out.getArgument().isNull()) 3296 return true; 3297 3298 Outputs.addArgument(Out); 3299 } 3300 3301 continue; 3302 } 3303 3304 // The simple case: 3305 if (getDerived().TransformTemplateArgument(In, Out)) 3306 return true; 3307 3308 Outputs.addArgument(Out); 3309 } 3310 3311 return false; 3312 3313 } 3314 3315 //===----------------------------------------------------------------------===// 3316 // Type transformation 3317 //===----------------------------------------------------------------------===// 3318 3319 template<typename Derived> 3320 QualType TreeTransform<Derived>::TransformType(QualType T) { 3321 if (getDerived().AlreadyTransformed(T)) 3322 return T; 3323 3324 // Temporary workaround. All of these transformations should 3325 // eventually turn into transformations on TypeLocs. 3326 TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T, 3327 getDerived().getBaseLocation()); 3328 3329 TypeSourceInfo *NewDI = getDerived().TransformType(DI); 3330 3331 if (!NewDI) 3332 return QualType(); 3333 3334 return NewDI->getType(); 3335 } 3336 3337 template<typename Derived> 3338 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) { 3339 // Refine the base location to the type's location. 3340 TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(), 3341 getDerived().getBaseEntity()); 3342 if (getDerived().AlreadyTransformed(DI->getType())) 3343 return DI; 3344 3345 TypeLocBuilder TLB; 3346 3347 TypeLoc TL = DI->getTypeLoc(); 3348 TLB.reserve(TL.getFullDataSize()); 3349 3350 QualType Result = getDerived().TransformType(TLB, TL); 3351 if (Result.isNull()) 3352 return 0; 3353 3354 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 3355 } 3356 3357 template<typename Derived> 3358 QualType 3359 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) { 3360 switch (T.getTypeLocClass()) { 3361 #define ABSTRACT_TYPELOC(CLASS, PARENT) 3362 #define TYPELOC(CLASS, PARENT) \ 3363 case TypeLoc::CLASS: \ 3364 return getDerived().Transform##CLASS##Type(TLB, \ 3365 T.castAs<CLASS##TypeLoc>()); 3366 #include "clang/AST/TypeLocNodes.def" 3367 } 3368 3369 llvm_unreachable("unhandled type loc!"); 3370 } 3371 3372 /// FIXME: By default, this routine adds type qualifiers only to types 3373 /// that can have qualifiers, and silently suppresses those qualifiers 3374 /// that are not permitted (e.g., qualifiers on reference or function 3375 /// types). This is the right thing for template instantiation, but 3376 /// probably not for other clients. 3377 template<typename Derived> 3378 QualType 3379 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB, 3380 QualifiedTypeLoc T) { 3381 Qualifiers Quals = T.getType().getLocalQualifiers(); 3382 3383 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc()); 3384 if (Result.isNull()) 3385 return QualType(); 3386 3387 // Silently suppress qualifiers if the result type can't be qualified. 3388 // FIXME: this is the right thing for template instantiation, but 3389 // probably not for other clients. 3390 if (Result->isFunctionType() || Result->isReferenceType()) 3391 return Result; 3392 3393 // Suppress Objective-C lifetime qualifiers if they don't make sense for the 3394 // resulting type. 3395 if (Quals.hasObjCLifetime()) { 3396 if (!Result->isObjCLifetimeType() && !Result->isDependentType()) 3397 Quals.removeObjCLifetime(); 3398 else if (Result.getObjCLifetime()) { 3399 // Objective-C ARC: 3400 // A lifetime qualifier applied to a substituted template parameter 3401 // overrides the lifetime qualifier from the template argument. 3402 const AutoType *AutoTy; 3403 if (const SubstTemplateTypeParmType *SubstTypeParam 3404 = dyn_cast<SubstTemplateTypeParmType>(Result)) { 3405 QualType Replacement = SubstTypeParam->getReplacementType(); 3406 Qualifiers Qs = Replacement.getQualifiers(); 3407 Qs.removeObjCLifetime(); 3408 Replacement 3409 = SemaRef.Context.getQualifiedType(Replacement.getUnqualifiedType(), 3410 Qs); 3411 Result = SemaRef.Context.getSubstTemplateTypeParmType( 3412 SubstTypeParam->getReplacedParameter(), 3413 Replacement); 3414 TLB.TypeWasModifiedSafely(Result); 3415 } else if ((AutoTy = dyn_cast<AutoType>(Result)) && AutoTy->isDeduced()) { 3416 // 'auto' types behave the same way as template parameters. 3417 QualType Deduced = AutoTy->getDeducedType(); 3418 Qualifiers Qs = Deduced.getQualifiers(); 3419 Qs.removeObjCLifetime(); 3420 Deduced = SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), 3421 Qs); 3422 Result = SemaRef.Context.getAutoType(Deduced, AutoTy->isDecltypeAuto()); 3423 TLB.TypeWasModifiedSafely(Result); 3424 } else { 3425 // Otherwise, complain about the addition of a qualifier to an 3426 // already-qualified type. 3427 SourceRange R = TLB.getTemporaryTypeLoc(Result).getSourceRange(); 3428 SemaRef.Diag(R.getBegin(), diag::err_attr_objc_ownership_redundant) 3429 << Result << R; 3430 3431 Quals.removeObjCLifetime(); 3432 } 3433 } 3434 } 3435 if (!Quals.empty()) { 3436 Result = SemaRef.BuildQualifiedType(Result, T.getBeginLoc(), Quals); 3437 // BuildQualifiedType might not add qualifiers if they are invalid. 3438 if (Result.hasLocalQualifiers()) 3439 TLB.push<QualifiedTypeLoc>(Result); 3440 // No location information to preserve. 3441 } 3442 3443 return Result; 3444 } 3445 3446 template<typename Derived> 3447 TypeLoc 3448 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL, 3449 QualType ObjectType, 3450 NamedDecl *UnqualLookup, 3451 CXXScopeSpec &SS) { 3452 QualType T = TL.getType(); 3453 if (getDerived().AlreadyTransformed(T)) 3454 return TL; 3455 3456 TypeLocBuilder TLB; 3457 QualType Result; 3458 3459 if (isa<TemplateSpecializationType>(T)) { 3460 TemplateSpecializationTypeLoc SpecTL = 3461 TL.castAs<TemplateSpecializationTypeLoc>(); 3462 3463 TemplateName Template = 3464 getDerived().TransformTemplateName(SS, 3465 SpecTL.getTypePtr()->getTemplateName(), 3466 SpecTL.getTemplateNameLoc(), 3467 ObjectType, UnqualLookup); 3468 if (Template.isNull()) 3469 return TypeLoc(); 3470 3471 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 3472 Template); 3473 } else if (isa<DependentTemplateSpecializationType>(T)) { 3474 DependentTemplateSpecializationTypeLoc SpecTL = 3475 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 3476 3477 TemplateName Template 3478 = getDerived().RebuildTemplateName(SS, 3479 *SpecTL.getTypePtr()->getIdentifier(), 3480 SpecTL.getTemplateNameLoc(), 3481 ObjectType, UnqualLookup); 3482 if (Template.isNull()) 3483 return TypeLoc(); 3484 3485 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 3486 SpecTL, 3487 Template, 3488 SS); 3489 } else { 3490 // Nothing special needs to be done for these. 3491 Result = getDerived().TransformType(TLB, TL); 3492 } 3493 3494 if (Result.isNull()) 3495 return TypeLoc(); 3496 3497 return TLB.getTypeSourceInfo(SemaRef.Context, Result)->getTypeLoc(); 3498 } 3499 3500 template<typename Derived> 3501 TypeSourceInfo * 3502 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo, 3503 QualType ObjectType, 3504 NamedDecl *UnqualLookup, 3505 CXXScopeSpec &SS) { 3506 // FIXME: Painfully copy-paste from the above! 3507 3508 QualType T = TSInfo->getType(); 3509 if (getDerived().AlreadyTransformed(T)) 3510 return TSInfo; 3511 3512 TypeLocBuilder TLB; 3513 QualType Result; 3514 3515 TypeLoc TL = TSInfo->getTypeLoc(); 3516 if (isa<TemplateSpecializationType>(T)) { 3517 TemplateSpecializationTypeLoc SpecTL = 3518 TL.castAs<TemplateSpecializationTypeLoc>(); 3519 3520 TemplateName Template 3521 = getDerived().TransformTemplateName(SS, 3522 SpecTL.getTypePtr()->getTemplateName(), 3523 SpecTL.getTemplateNameLoc(), 3524 ObjectType, UnqualLookup); 3525 if (Template.isNull()) 3526 return 0; 3527 3528 Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL, 3529 Template); 3530 } else if (isa<DependentTemplateSpecializationType>(T)) { 3531 DependentTemplateSpecializationTypeLoc SpecTL = 3532 TL.castAs<DependentTemplateSpecializationTypeLoc>(); 3533 3534 TemplateName Template 3535 = getDerived().RebuildTemplateName(SS, 3536 *SpecTL.getTypePtr()->getIdentifier(), 3537 SpecTL.getTemplateNameLoc(), 3538 ObjectType, UnqualLookup); 3539 if (Template.isNull()) 3540 return 0; 3541 3542 Result = getDerived().TransformDependentTemplateSpecializationType(TLB, 3543 SpecTL, 3544 Template, 3545 SS); 3546 } else { 3547 // Nothing special needs to be done for these. 3548 Result = getDerived().TransformType(TLB, TL); 3549 } 3550 3551 if (Result.isNull()) 3552 return 0; 3553 3554 return TLB.getTypeSourceInfo(SemaRef.Context, Result); 3555 } 3556 3557 template <class TyLoc> static inline 3558 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) { 3559 TyLoc NewT = TLB.push<TyLoc>(T.getType()); 3560 NewT.setNameLoc(T.getNameLoc()); 3561 return T.getType(); 3562 } 3563 3564 template<typename Derived> 3565 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB, 3566 BuiltinTypeLoc T) { 3567 BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType()); 3568 NewT.setBuiltinLoc(T.getBuiltinLoc()); 3569 if (T.needsExtraLocalData()) 3570 NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs(); 3571 return T.getType(); 3572 } 3573 3574 template<typename Derived> 3575 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB, 3576 ComplexTypeLoc T) { 3577 // FIXME: recurse? 3578 return TransformTypeSpecType(TLB, T); 3579 } 3580 3581 template<typename Derived> 3582 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB, 3583 PointerTypeLoc TL) { 3584 QualType PointeeType 3585 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3586 if (PointeeType.isNull()) 3587 return QualType(); 3588 3589 QualType Result = TL.getType(); 3590 if (PointeeType->getAs<ObjCObjectType>()) { 3591 // A dependent pointer type 'T *' has is being transformed such 3592 // that an Objective-C class type is being replaced for 'T'. The 3593 // resulting pointer type is an ObjCObjectPointerType, not a 3594 // PointerType. 3595 Result = SemaRef.Context.getObjCObjectPointerType(PointeeType); 3596 3597 ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result); 3598 NewT.setStarLoc(TL.getStarLoc()); 3599 return Result; 3600 } 3601 3602 if (getDerived().AlwaysRebuild() || 3603 PointeeType != TL.getPointeeLoc().getType()) { 3604 Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc()); 3605 if (Result.isNull()) 3606 return QualType(); 3607 } 3608 3609 // Objective-C ARC can add lifetime qualifiers to the type that we're 3610 // pointing to. 3611 TLB.TypeWasModifiedSafely(Result->getPointeeType()); 3612 3613 PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result); 3614 NewT.setSigilLoc(TL.getSigilLoc()); 3615 return Result; 3616 } 3617 3618 template<typename Derived> 3619 QualType 3620 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB, 3621 BlockPointerTypeLoc TL) { 3622 QualType PointeeType 3623 = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3624 if (PointeeType.isNull()) 3625 return QualType(); 3626 3627 QualType Result = TL.getType(); 3628 if (getDerived().AlwaysRebuild() || 3629 PointeeType != TL.getPointeeLoc().getType()) { 3630 Result = getDerived().RebuildBlockPointerType(PointeeType, 3631 TL.getSigilLoc()); 3632 if (Result.isNull()) 3633 return QualType(); 3634 } 3635 3636 BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result); 3637 NewT.setSigilLoc(TL.getSigilLoc()); 3638 return Result; 3639 } 3640 3641 /// Transforms a reference type. Note that somewhat paradoxically we 3642 /// don't care whether the type itself is an l-value type or an r-value 3643 /// type; we only care if the type was *written* as an l-value type 3644 /// or an r-value type. 3645 template<typename Derived> 3646 QualType 3647 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB, 3648 ReferenceTypeLoc TL) { 3649 const ReferenceType *T = TL.getTypePtr(); 3650 3651 // Note that this works with the pointee-as-written. 3652 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3653 if (PointeeType.isNull()) 3654 return QualType(); 3655 3656 QualType Result = TL.getType(); 3657 if (getDerived().AlwaysRebuild() || 3658 PointeeType != T->getPointeeTypeAsWritten()) { 3659 Result = getDerived().RebuildReferenceType(PointeeType, 3660 T->isSpelledAsLValue(), 3661 TL.getSigilLoc()); 3662 if (Result.isNull()) 3663 return QualType(); 3664 } 3665 3666 // Objective-C ARC can add lifetime qualifiers to the type that we're 3667 // referring to. 3668 TLB.TypeWasModifiedSafely( 3669 Result->getAs<ReferenceType>()->getPointeeTypeAsWritten()); 3670 3671 // r-value references can be rebuilt as l-value references. 3672 ReferenceTypeLoc NewTL; 3673 if (isa<LValueReferenceType>(Result)) 3674 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); 3675 else 3676 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); 3677 NewTL.setSigilLoc(TL.getSigilLoc()); 3678 3679 return Result; 3680 } 3681 3682 template<typename Derived> 3683 QualType 3684 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB, 3685 LValueReferenceTypeLoc TL) { 3686 return TransformReferenceType(TLB, TL); 3687 } 3688 3689 template<typename Derived> 3690 QualType 3691 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB, 3692 RValueReferenceTypeLoc TL) { 3693 return TransformReferenceType(TLB, TL); 3694 } 3695 3696 template<typename Derived> 3697 QualType 3698 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB, 3699 MemberPointerTypeLoc TL) { 3700 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc()); 3701 if (PointeeType.isNull()) 3702 return QualType(); 3703 3704 TypeSourceInfo* OldClsTInfo = TL.getClassTInfo(); 3705 TypeSourceInfo* NewClsTInfo = 0; 3706 if (OldClsTInfo) { 3707 NewClsTInfo = getDerived().TransformType(OldClsTInfo); 3708 if (!NewClsTInfo) 3709 return QualType(); 3710 } 3711 3712 const MemberPointerType *T = TL.getTypePtr(); 3713 QualType OldClsType = QualType(T->getClass(), 0); 3714 QualType NewClsType; 3715 if (NewClsTInfo) 3716 NewClsType = NewClsTInfo->getType(); 3717 else { 3718 NewClsType = getDerived().TransformType(OldClsType); 3719 if (NewClsType.isNull()) 3720 return QualType(); 3721 } 3722 3723 QualType Result = TL.getType(); 3724 if (getDerived().AlwaysRebuild() || 3725 PointeeType != T->getPointeeType() || 3726 NewClsType != OldClsType) { 3727 Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType, 3728 TL.getStarLoc()); 3729 if (Result.isNull()) 3730 return QualType(); 3731 } 3732 3733 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result); 3734 NewTL.setSigilLoc(TL.getSigilLoc()); 3735 NewTL.setClassTInfo(NewClsTInfo); 3736 3737 return Result; 3738 } 3739 3740 template<typename Derived> 3741 QualType 3742 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB, 3743 ConstantArrayTypeLoc TL) { 3744 const ConstantArrayType *T = TL.getTypePtr(); 3745 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3746 if (ElementType.isNull()) 3747 return QualType(); 3748 3749 QualType Result = TL.getType(); 3750 if (getDerived().AlwaysRebuild() || 3751 ElementType != T->getElementType()) { 3752 Result = getDerived().RebuildConstantArrayType(ElementType, 3753 T->getSizeModifier(), 3754 T->getSize(), 3755 T->getIndexTypeCVRQualifiers(), 3756 TL.getBracketsRange()); 3757 if (Result.isNull()) 3758 return QualType(); 3759 } 3760 3761 // We might have either a ConstantArrayType or a VariableArrayType now: 3762 // a ConstantArrayType is allowed to have an element type which is a 3763 // VariableArrayType if the type is dependent. Fortunately, all array 3764 // types have the same location layout. 3765 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 3766 NewTL.setLBracketLoc(TL.getLBracketLoc()); 3767 NewTL.setRBracketLoc(TL.getRBracketLoc()); 3768 3769 Expr *Size = TL.getSizeExpr(); 3770 if (Size) { 3771 EnterExpressionEvaluationContext Unevaluated(SemaRef, 3772 Sema::ConstantEvaluated); 3773 Size = getDerived().TransformExpr(Size).template takeAs<Expr>(); 3774 Size = SemaRef.ActOnConstantExpression(Size).take(); 3775 } 3776 NewTL.setSizeExpr(Size); 3777 3778 return Result; 3779 } 3780 3781 template<typename Derived> 3782 QualType TreeTransform<Derived>::TransformIncompleteArrayType( 3783 TypeLocBuilder &TLB, 3784 IncompleteArrayTypeLoc TL) { 3785 const IncompleteArrayType *T = TL.getTypePtr(); 3786 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3787 if (ElementType.isNull()) 3788 return QualType(); 3789 3790 QualType Result = TL.getType(); 3791 if (getDerived().AlwaysRebuild() || 3792 ElementType != T->getElementType()) { 3793 Result = getDerived().RebuildIncompleteArrayType(ElementType, 3794 T->getSizeModifier(), 3795 T->getIndexTypeCVRQualifiers(), 3796 TL.getBracketsRange()); 3797 if (Result.isNull()) 3798 return QualType(); 3799 } 3800 3801 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result); 3802 NewTL.setLBracketLoc(TL.getLBracketLoc()); 3803 NewTL.setRBracketLoc(TL.getRBracketLoc()); 3804 NewTL.setSizeExpr(0); 3805 3806 return Result; 3807 } 3808 3809 template<typename Derived> 3810 QualType 3811 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB, 3812 VariableArrayTypeLoc TL) { 3813 const VariableArrayType *T = TL.getTypePtr(); 3814 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3815 if (ElementType.isNull()) 3816 return QualType(); 3817 3818 ExprResult SizeResult 3819 = getDerived().TransformExpr(T->getSizeExpr()); 3820 if (SizeResult.isInvalid()) 3821 return QualType(); 3822 3823 Expr *Size = SizeResult.take(); 3824 3825 QualType Result = TL.getType(); 3826 if (getDerived().AlwaysRebuild() || 3827 ElementType != T->getElementType() || 3828 Size != T->getSizeExpr()) { 3829 Result = getDerived().RebuildVariableArrayType(ElementType, 3830 T->getSizeModifier(), 3831 Size, 3832 T->getIndexTypeCVRQualifiers(), 3833 TL.getBracketsRange()); 3834 if (Result.isNull()) 3835 return QualType(); 3836 } 3837 3838 VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result); 3839 NewTL.setLBracketLoc(TL.getLBracketLoc()); 3840 NewTL.setRBracketLoc(TL.getRBracketLoc()); 3841 NewTL.setSizeExpr(Size); 3842 3843 return Result; 3844 } 3845 3846 template<typename Derived> 3847 QualType 3848 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB, 3849 DependentSizedArrayTypeLoc TL) { 3850 const DependentSizedArrayType *T = TL.getTypePtr(); 3851 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc()); 3852 if (ElementType.isNull()) 3853 return QualType(); 3854 3855 // Array bounds are constant expressions. 3856 EnterExpressionEvaluationContext Unevaluated(SemaRef, 3857 Sema::ConstantEvaluated); 3858 3859 // Prefer the expression from the TypeLoc; the other may have been uniqued. 3860 Expr *origSize = TL.getSizeExpr(); 3861 if (!origSize) origSize = T->getSizeExpr(); 3862 3863 ExprResult sizeResult 3864 = getDerived().TransformExpr(origSize); 3865 sizeResult = SemaRef.ActOnConstantExpression(sizeResult); 3866 if (sizeResult.isInvalid()) 3867 return QualType(); 3868 3869 Expr *size = sizeResult.get(); 3870 3871 QualType Result = TL.getType(); 3872 if (getDerived().AlwaysRebuild() || 3873 ElementType != T->getElementType() || 3874 size != origSize) { 3875 Result = getDerived().RebuildDependentSizedArrayType(ElementType, 3876 T->getSizeModifier(), 3877 size, 3878 T->getIndexTypeCVRQualifiers(), 3879 TL.getBracketsRange()); 3880 if (Result.isNull()) 3881 return QualType(); 3882 } 3883 3884 // We might have any sort of array type now, but fortunately they 3885 // all have the same location layout. 3886 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result); 3887 NewTL.setLBracketLoc(TL.getLBracketLoc()); 3888 NewTL.setRBracketLoc(TL.getRBracketLoc()); 3889 NewTL.setSizeExpr(size); 3890 3891 return Result; 3892 } 3893 3894 template<typename Derived> 3895 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 3896 TypeLocBuilder &TLB, 3897 DependentSizedExtVectorTypeLoc TL) { 3898 const DependentSizedExtVectorType *T = TL.getTypePtr(); 3899 3900 // FIXME: ext vector locs should be nested 3901 QualType ElementType = getDerived().TransformType(T->getElementType()); 3902 if (ElementType.isNull()) 3903 return QualType(); 3904 3905 // Vector sizes are constant expressions. 3906 EnterExpressionEvaluationContext Unevaluated(SemaRef, 3907 Sema::ConstantEvaluated); 3908 3909 ExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 3910 Size = SemaRef.ActOnConstantExpression(Size); 3911 if (Size.isInvalid()) 3912 return QualType(); 3913 3914 QualType Result = TL.getType(); 3915 if (getDerived().AlwaysRebuild() || 3916 ElementType != T->getElementType() || 3917 Size.get() != T->getSizeExpr()) { 3918 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType, 3919 Size.take(), 3920 T->getAttributeLoc()); 3921 if (Result.isNull()) 3922 return QualType(); 3923 } 3924 3925 // Result might be dependent or not. 3926 if (isa<DependentSizedExtVectorType>(Result)) { 3927 DependentSizedExtVectorTypeLoc NewTL 3928 = TLB.push<DependentSizedExtVectorTypeLoc>(Result); 3929 NewTL.setNameLoc(TL.getNameLoc()); 3930 } else { 3931 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 3932 NewTL.setNameLoc(TL.getNameLoc()); 3933 } 3934 3935 return Result; 3936 } 3937 3938 template<typename Derived> 3939 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB, 3940 VectorTypeLoc TL) { 3941 const VectorType *T = TL.getTypePtr(); 3942 QualType ElementType = getDerived().TransformType(T->getElementType()); 3943 if (ElementType.isNull()) 3944 return QualType(); 3945 3946 QualType Result = TL.getType(); 3947 if (getDerived().AlwaysRebuild() || 3948 ElementType != T->getElementType()) { 3949 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(), 3950 T->getVectorKind()); 3951 if (Result.isNull()) 3952 return QualType(); 3953 } 3954 3955 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result); 3956 NewTL.setNameLoc(TL.getNameLoc()); 3957 3958 return Result; 3959 } 3960 3961 template<typename Derived> 3962 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB, 3963 ExtVectorTypeLoc TL) { 3964 const VectorType *T = TL.getTypePtr(); 3965 QualType ElementType = getDerived().TransformType(T->getElementType()); 3966 if (ElementType.isNull()) 3967 return QualType(); 3968 3969 QualType Result = TL.getType(); 3970 if (getDerived().AlwaysRebuild() || 3971 ElementType != T->getElementType()) { 3972 Result = getDerived().RebuildExtVectorType(ElementType, 3973 T->getNumElements(), 3974 /*FIXME*/ SourceLocation()); 3975 if (Result.isNull()) 3976 return QualType(); 3977 } 3978 3979 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result); 3980 NewTL.setNameLoc(TL.getNameLoc()); 3981 3982 return Result; 3983 } 3984 3985 template <typename Derived> 3986 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam( 3987 ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions, 3988 bool ExpectParameterPack) { 3989 TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo(); 3990 TypeSourceInfo *NewDI = 0; 3991 3992 if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) { 3993 // If we're substituting into a pack expansion type and we know the 3994 // length we want to expand to, just substitute for the pattern. 3995 TypeLoc OldTL = OldDI->getTypeLoc(); 3996 PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>(); 3997 3998 TypeLocBuilder TLB; 3999 TypeLoc NewTL = OldDI->getTypeLoc(); 4000 TLB.reserve(NewTL.getFullDataSize()); 4001 4002 QualType Result = getDerived().TransformType(TLB, 4003 OldExpansionTL.getPatternLoc()); 4004 if (Result.isNull()) 4005 return 0; 4006 4007 Result = RebuildPackExpansionType(Result, 4008 OldExpansionTL.getPatternLoc().getSourceRange(), 4009 OldExpansionTL.getEllipsisLoc(), 4010 NumExpansions); 4011 if (Result.isNull()) 4012 return 0; 4013 4014 PackExpansionTypeLoc NewExpansionTL 4015 = TLB.push<PackExpansionTypeLoc>(Result); 4016 NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc()); 4017 NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result); 4018 } else 4019 NewDI = getDerived().TransformType(OldDI); 4020 if (!NewDI) 4021 return 0; 4022 4023 if (NewDI == OldDI && indexAdjustment == 0) 4024 return OldParm; 4025 4026 ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context, 4027 OldParm->getDeclContext(), 4028 OldParm->getInnerLocStart(), 4029 OldParm->getLocation(), 4030 OldParm->getIdentifier(), 4031 NewDI->getType(), 4032 NewDI, 4033 OldParm->getStorageClass(), 4034 /* DefArg */ NULL); 4035 newParm->setScopeInfo(OldParm->getFunctionScopeDepth(), 4036 OldParm->getFunctionScopeIndex() + indexAdjustment); 4037 return newParm; 4038 } 4039 4040 template<typename Derived> 4041 bool TreeTransform<Derived>:: 4042 TransformFunctionTypeParams(SourceLocation Loc, 4043 ParmVarDecl **Params, unsigned NumParams, 4044 const QualType *ParamTypes, 4045 SmallVectorImpl<QualType> &OutParamTypes, 4046 SmallVectorImpl<ParmVarDecl*> *PVars) { 4047 int indexAdjustment = 0; 4048 4049 for (unsigned i = 0; i != NumParams; ++i) { 4050 if (ParmVarDecl *OldParm = Params[i]) { 4051 assert(OldParm->getFunctionScopeIndex() == i); 4052 4053 Optional<unsigned> NumExpansions; 4054 ParmVarDecl *NewParm = 0; 4055 if (OldParm->isParameterPack()) { 4056 // We have a function parameter pack that may need to be expanded. 4057 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4058 4059 // Find the parameter packs that could be expanded. 4060 TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc(); 4061 PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>(); 4062 TypeLoc Pattern = ExpansionTL.getPatternLoc(); 4063 SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded); 4064 assert(Unexpanded.size() > 0 && "Could not find parameter packs!"); 4065 4066 // Determine whether we should expand the parameter packs. 4067 bool ShouldExpand = false; 4068 bool RetainExpansion = false; 4069 Optional<unsigned> OrigNumExpansions = 4070 ExpansionTL.getTypePtr()->getNumExpansions(); 4071 NumExpansions = OrigNumExpansions; 4072 if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(), 4073 Pattern.getSourceRange(), 4074 Unexpanded, 4075 ShouldExpand, 4076 RetainExpansion, 4077 NumExpansions)) { 4078 return true; 4079 } 4080 4081 if (ShouldExpand) { 4082 // Expand the function parameter pack into multiple, separate 4083 // parameters. 4084 getDerived().ExpandingFunctionParameterPack(OldParm); 4085 for (unsigned I = 0; I != *NumExpansions; ++I) { 4086 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4087 ParmVarDecl *NewParm 4088 = getDerived().TransformFunctionTypeParam(OldParm, 4089 indexAdjustment++, 4090 OrigNumExpansions, 4091 /*ExpectParameterPack=*/false); 4092 if (!NewParm) 4093 return true; 4094 4095 OutParamTypes.push_back(NewParm->getType()); 4096 if (PVars) 4097 PVars->push_back(NewParm); 4098 } 4099 4100 // If we're supposed to retain a pack expansion, do so by temporarily 4101 // forgetting the partially-substituted parameter pack. 4102 if (RetainExpansion) { 4103 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4104 ParmVarDecl *NewParm 4105 = getDerived().TransformFunctionTypeParam(OldParm, 4106 indexAdjustment++, 4107 OrigNumExpansions, 4108 /*ExpectParameterPack=*/false); 4109 if (!NewParm) 4110 return true; 4111 4112 OutParamTypes.push_back(NewParm->getType()); 4113 if (PVars) 4114 PVars->push_back(NewParm); 4115 } 4116 4117 // The next parameter should have the same adjustment as the 4118 // last thing we pushed, but we post-incremented indexAdjustment 4119 // on every push. Also, if we push nothing, the adjustment should 4120 // go down by one. 4121 indexAdjustment--; 4122 4123 // We're done with the pack expansion. 4124 continue; 4125 } 4126 4127 // We'll substitute the parameter now without expanding the pack 4128 // expansion. 4129 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4130 NewParm = getDerived().TransformFunctionTypeParam(OldParm, 4131 indexAdjustment, 4132 NumExpansions, 4133 /*ExpectParameterPack=*/true); 4134 } else { 4135 NewParm = getDerived().TransformFunctionTypeParam( 4136 OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false); 4137 } 4138 4139 if (!NewParm) 4140 return true; 4141 4142 OutParamTypes.push_back(NewParm->getType()); 4143 if (PVars) 4144 PVars->push_back(NewParm); 4145 continue; 4146 } 4147 4148 // Deal with the possibility that we don't have a parameter 4149 // declaration for this parameter. 4150 QualType OldType = ParamTypes[i]; 4151 bool IsPackExpansion = false; 4152 Optional<unsigned> NumExpansions; 4153 QualType NewType; 4154 if (const PackExpansionType *Expansion 4155 = dyn_cast<PackExpansionType>(OldType)) { 4156 // We have a function parameter pack that may need to be expanded. 4157 QualType Pattern = Expansion->getPattern(); 4158 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 4159 getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded); 4160 4161 // Determine whether we should expand the parameter packs. 4162 bool ShouldExpand = false; 4163 bool RetainExpansion = false; 4164 if (getDerived().TryExpandParameterPacks(Loc, SourceRange(), 4165 Unexpanded, 4166 ShouldExpand, 4167 RetainExpansion, 4168 NumExpansions)) { 4169 return true; 4170 } 4171 4172 if (ShouldExpand) { 4173 // Expand the function parameter pack into multiple, separate 4174 // parameters. 4175 for (unsigned I = 0; I != *NumExpansions; ++I) { 4176 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 4177 QualType NewType = getDerived().TransformType(Pattern); 4178 if (NewType.isNull()) 4179 return true; 4180 4181 OutParamTypes.push_back(NewType); 4182 if (PVars) 4183 PVars->push_back(0); 4184 } 4185 4186 // We're done with the pack expansion. 4187 continue; 4188 } 4189 4190 // If we're supposed to retain a pack expansion, do so by temporarily 4191 // forgetting the partially-substituted parameter pack. 4192 if (RetainExpansion) { 4193 ForgetPartiallySubstitutedPackRAII Forget(getDerived()); 4194 QualType NewType = getDerived().TransformType(Pattern); 4195 if (NewType.isNull()) 4196 return true; 4197 4198 OutParamTypes.push_back(NewType); 4199 if (PVars) 4200 PVars->push_back(0); 4201 } 4202 4203 // We'll substitute the parameter now without expanding the pack 4204 // expansion. 4205 OldType = Expansion->getPattern(); 4206 IsPackExpansion = true; 4207 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 4208 NewType = getDerived().TransformType(OldType); 4209 } else { 4210 NewType = getDerived().TransformType(OldType); 4211 } 4212 4213 if (NewType.isNull()) 4214 return true; 4215 4216 if (IsPackExpansion) 4217 NewType = getSema().Context.getPackExpansionType(NewType, 4218 NumExpansions); 4219 4220 OutParamTypes.push_back(NewType); 4221 if (PVars) 4222 PVars->push_back(0); 4223 } 4224 4225 #ifndef NDEBUG 4226 if (PVars) { 4227 for (unsigned i = 0, e = PVars->size(); i != e; ++i) 4228 if (ParmVarDecl *parm = (*PVars)[i]) 4229 assert(parm->getFunctionScopeIndex() == i); 4230 } 4231 #endif 4232 4233 return false; 4234 } 4235 4236 template<typename Derived> 4237 QualType 4238 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 4239 FunctionProtoTypeLoc TL) { 4240 return getDerived().TransformFunctionProtoType(TLB, TL, 0, 0); 4241 } 4242 4243 template<typename Derived> 4244 QualType 4245 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB, 4246 FunctionProtoTypeLoc TL, 4247 CXXRecordDecl *ThisContext, 4248 unsigned ThisTypeQuals) { 4249 // Transform the parameters and return type. 4250 // 4251 // We are required to instantiate the params and return type in source order. 4252 // When the function has a trailing return type, we instantiate the 4253 // parameters before the return type, since the return type can then refer 4254 // to the parameters themselves (via decltype, sizeof, etc.). 4255 // 4256 SmallVector<QualType, 4> ParamTypes; 4257 SmallVector<ParmVarDecl*, 4> ParamDecls; 4258 const FunctionProtoType *T = TL.getTypePtr(); 4259 4260 QualType ResultType; 4261 4262 if (T->hasTrailingReturn()) { 4263 if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 4264 TL.getParmArray(), 4265 TL.getNumArgs(), 4266 TL.getTypePtr()->arg_type_begin(), 4267 ParamTypes, &ParamDecls)) 4268 return QualType(); 4269 4270 { 4271 // C++11 [expr.prim.general]p3: 4272 // If a declaration declares a member function or member function 4273 // template of a class X, the expression this is a prvalue of type 4274 // "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq 4275 // and the end of the function-definition, member-declarator, or 4276 // declarator. 4277 Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals); 4278 4279 ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 4280 if (ResultType.isNull()) 4281 return QualType(); 4282 } 4283 } 4284 else { 4285 ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 4286 if (ResultType.isNull()) 4287 return QualType(); 4288 4289 if (getDerived().TransformFunctionTypeParams(TL.getBeginLoc(), 4290 TL.getParmArray(), 4291 TL.getNumArgs(), 4292 TL.getTypePtr()->arg_type_begin(), 4293 ParamTypes, &ParamDecls)) 4294 return QualType(); 4295 } 4296 4297 // FIXME: Need to transform the exception-specification too. 4298 4299 QualType Result = TL.getType(); 4300 if (getDerived().AlwaysRebuild() || 4301 ResultType != T->getResultType() || 4302 T->getNumArgs() != ParamTypes.size() || 4303 !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) { 4304 Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, 4305 T->getExtProtoInfo()); 4306 if (Result.isNull()) 4307 return QualType(); 4308 } 4309 4310 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result); 4311 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 4312 NewTL.setLParenLoc(TL.getLParenLoc()); 4313 NewTL.setRParenLoc(TL.getRParenLoc()); 4314 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 4315 for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i) 4316 NewTL.setArg(i, ParamDecls[i]); 4317 4318 return Result; 4319 } 4320 4321 template<typename Derived> 4322 QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 4323 TypeLocBuilder &TLB, 4324 FunctionNoProtoTypeLoc TL) { 4325 const FunctionNoProtoType *T = TL.getTypePtr(); 4326 QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc()); 4327 if (ResultType.isNull()) 4328 return QualType(); 4329 4330 QualType Result = TL.getType(); 4331 if (getDerived().AlwaysRebuild() || 4332 ResultType != T->getResultType()) 4333 Result = getDerived().RebuildFunctionNoProtoType(ResultType); 4334 4335 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result); 4336 NewTL.setLocalRangeBegin(TL.getLocalRangeBegin()); 4337 NewTL.setLParenLoc(TL.getLParenLoc()); 4338 NewTL.setRParenLoc(TL.getRParenLoc()); 4339 NewTL.setLocalRangeEnd(TL.getLocalRangeEnd()); 4340 4341 return Result; 4342 } 4343 4344 template<typename Derived> QualType 4345 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB, 4346 UnresolvedUsingTypeLoc TL) { 4347 const UnresolvedUsingType *T = TL.getTypePtr(); 4348 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl()); 4349 if (!D) 4350 return QualType(); 4351 4352 QualType Result = TL.getType(); 4353 if (getDerived().AlwaysRebuild() || D != T->getDecl()) { 4354 Result = getDerived().RebuildUnresolvedUsingType(D); 4355 if (Result.isNull()) 4356 return QualType(); 4357 } 4358 4359 // We might get an arbitrary type spec type back. We should at 4360 // least always get a type spec type, though. 4361 TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result); 4362 NewTL.setNameLoc(TL.getNameLoc()); 4363 4364 return Result; 4365 } 4366 4367 template<typename Derived> 4368 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB, 4369 TypedefTypeLoc TL) { 4370 const TypedefType *T = TL.getTypePtr(); 4371 TypedefNameDecl *Typedef 4372 = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(), 4373 T->getDecl())); 4374 if (!Typedef) 4375 return QualType(); 4376 4377 QualType Result = TL.getType(); 4378 if (getDerived().AlwaysRebuild() || 4379 Typedef != T->getDecl()) { 4380 Result = getDerived().RebuildTypedefType(Typedef); 4381 if (Result.isNull()) 4382 return QualType(); 4383 } 4384 4385 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result); 4386 NewTL.setNameLoc(TL.getNameLoc()); 4387 4388 return Result; 4389 } 4390 4391 template<typename Derived> 4392 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB, 4393 TypeOfExprTypeLoc TL) { 4394 // typeof expressions are not potentially evaluated contexts 4395 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 4396 Sema::ReuseLambdaContextDecl); 4397 4398 ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr()); 4399 if (E.isInvalid()) 4400 return QualType(); 4401 4402 E = SemaRef.HandleExprEvaluationContextForTypeof(E.get()); 4403 if (E.isInvalid()) 4404 return QualType(); 4405 4406 QualType Result = TL.getType(); 4407 if (getDerived().AlwaysRebuild() || 4408 E.get() != TL.getUnderlyingExpr()) { 4409 Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc()); 4410 if (Result.isNull()) 4411 return QualType(); 4412 } 4413 else E.take(); 4414 4415 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result); 4416 NewTL.setTypeofLoc(TL.getTypeofLoc()); 4417 NewTL.setLParenLoc(TL.getLParenLoc()); 4418 NewTL.setRParenLoc(TL.getRParenLoc()); 4419 4420 return Result; 4421 } 4422 4423 template<typename Derived> 4424 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB, 4425 TypeOfTypeLoc TL) { 4426 TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo(); 4427 TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI); 4428 if (!New_Under_TI) 4429 return QualType(); 4430 4431 QualType Result = TL.getType(); 4432 if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) { 4433 Result = getDerived().RebuildTypeOfType(New_Under_TI->getType()); 4434 if (Result.isNull()) 4435 return QualType(); 4436 } 4437 4438 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result); 4439 NewTL.setTypeofLoc(TL.getTypeofLoc()); 4440 NewTL.setLParenLoc(TL.getLParenLoc()); 4441 NewTL.setRParenLoc(TL.getRParenLoc()); 4442 NewTL.setUnderlyingTInfo(New_Under_TI); 4443 4444 return Result; 4445 } 4446 4447 template<typename Derived> 4448 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB, 4449 DecltypeTypeLoc TL) { 4450 const DecltypeType *T = TL.getTypePtr(); 4451 4452 // decltype expressions are not potentially evaluated contexts 4453 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 0, 4454 /*IsDecltype=*/ true); 4455 4456 ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 4457 if (E.isInvalid()) 4458 return QualType(); 4459 4460 E = getSema().ActOnDecltypeExpression(E.take()); 4461 if (E.isInvalid()) 4462 return QualType(); 4463 4464 QualType Result = TL.getType(); 4465 if (getDerived().AlwaysRebuild() || 4466 E.get() != T->getUnderlyingExpr()) { 4467 Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc()); 4468 if (Result.isNull()) 4469 return QualType(); 4470 } 4471 else E.take(); 4472 4473 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result); 4474 NewTL.setNameLoc(TL.getNameLoc()); 4475 4476 return Result; 4477 } 4478 4479 template<typename Derived> 4480 QualType TreeTransform<Derived>::TransformUnaryTransformType( 4481 TypeLocBuilder &TLB, 4482 UnaryTransformTypeLoc TL) { 4483 QualType Result = TL.getType(); 4484 if (Result->isDependentType()) { 4485 const UnaryTransformType *T = TL.getTypePtr(); 4486 QualType NewBase = 4487 getDerived().TransformType(TL.getUnderlyingTInfo())->getType(); 4488 Result = getDerived().RebuildUnaryTransformType(NewBase, 4489 T->getUTTKind(), 4490 TL.getKWLoc()); 4491 if (Result.isNull()) 4492 return QualType(); 4493 } 4494 4495 UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result); 4496 NewTL.setKWLoc(TL.getKWLoc()); 4497 NewTL.setParensRange(TL.getParensRange()); 4498 NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo()); 4499 return Result; 4500 } 4501 4502 template<typename Derived> 4503 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB, 4504 AutoTypeLoc TL) { 4505 const AutoType *T = TL.getTypePtr(); 4506 QualType OldDeduced = T->getDeducedType(); 4507 QualType NewDeduced; 4508 if (!OldDeduced.isNull()) { 4509 NewDeduced = getDerived().TransformType(OldDeduced); 4510 if (NewDeduced.isNull()) 4511 return QualType(); 4512 } 4513 4514 QualType Result = TL.getType(); 4515 if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced || 4516 T->isDependentType()) { 4517 Result = getDerived().RebuildAutoType(NewDeduced, T->isDecltypeAuto()); 4518 if (Result.isNull()) 4519 return QualType(); 4520 } 4521 4522 AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result); 4523 NewTL.setNameLoc(TL.getNameLoc()); 4524 4525 return Result; 4526 } 4527 4528 template<typename Derived> 4529 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB, 4530 RecordTypeLoc TL) { 4531 const RecordType *T = TL.getTypePtr(); 4532 RecordDecl *Record 4533 = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(), 4534 T->getDecl())); 4535 if (!Record) 4536 return QualType(); 4537 4538 QualType Result = TL.getType(); 4539 if (getDerived().AlwaysRebuild() || 4540 Record != T->getDecl()) { 4541 Result = getDerived().RebuildRecordType(Record); 4542 if (Result.isNull()) 4543 return QualType(); 4544 } 4545 4546 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result); 4547 NewTL.setNameLoc(TL.getNameLoc()); 4548 4549 return Result; 4550 } 4551 4552 template<typename Derived> 4553 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB, 4554 EnumTypeLoc TL) { 4555 const EnumType *T = TL.getTypePtr(); 4556 EnumDecl *Enum 4557 = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(), 4558 T->getDecl())); 4559 if (!Enum) 4560 return QualType(); 4561 4562 QualType Result = TL.getType(); 4563 if (getDerived().AlwaysRebuild() || 4564 Enum != T->getDecl()) { 4565 Result = getDerived().RebuildEnumType(Enum); 4566 if (Result.isNull()) 4567 return QualType(); 4568 } 4569 4570 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result); 4571 NewTL.setNameLoc(TL.getNameLoc()); 4572 4573 return Result; 4574 } 4575 4576 template<typename Derived> 4577 QualType TreeTransform<Derived>::TransformInjectedClassNameType( 4578 TypeLocBuilder &TLB, 4579 InjectedClassNameTypeLoc TL) { 4580 Decl *D = getDerived().TransformDecl(TL.getNameLoc(), 4581 TL.getTypePtr()->getDecl()); 4582 if (!D) return QualType(); 4583 4584 QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D)); 4585 TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc()); 4586 return T; 4587 } 4588 4589 template<typename Derived> 4590 QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 4591 TypeLocBuilder &TLB, 4592 TemplateTypeParmTypeLoc TL) { 4593 return TransformTypeSpecType(TLB, TL); 4594 } 4595 4596 template<typename Derived> 4597 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 4598 TypeLocBuilder &TLB, 4599 SubstTemplateTypeParmTypeLoc TL) { 4600 const SubstTemplateTypeParmType *T = TL.getTypePtr(); 4601 4602 // Substitute into the replacement type, which itself might involve something 4603 // that needs to be transformed. This only tends to occur with default 4604 // template arguments of template template parameters. 4605 TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName()); 4606 QualType Replacement = getDerived().TransformType(T->getReplacementType()); 4607 if (Replacement.isNull()) 4608 return QualType(); 4609 4610 // Always canonicalize the replacement type. 4611 Replacement = SemaRef.Context.getCanonicalType(Replacement); 4612 QualType Result 4613 = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(), 4614 Replacement); 4615 4616 // Propagate type-source information. 4617 SubstTemplateTypeParmTypeLoc NewTL 4618 = TLB.push<SubstTemplateTypeParmTypeLoc>(Result); 4619 NewTL.setNameLoc(TL.getNameLoc()); 4620 return Result; 4621 4622 } 4623 4624 template<typename Derived> 4625 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType( 4626 TypeLocBuilder &TLB, 4627 SubstTemplateTypeParmPackTypeLoc TL) { 4628 return TransformTypeSpecType(TLB, TL); 4629 } 4630 4631 template<typename Derived> 4632 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 4633 TypeLocBuilder &TLB, 4634 TemplateSpecializationTypeLoc TL) { 4635 const TemplateSpecializationType *T = TL.getTypePtr(); 4636 4637 // The nested-name-specifier never matters in a TemplateSpecializationType, 4638 // because we can't have a dependent nested-name-specifier anyway. 4639 CXXScopeSpec SS; 4640 TemplateName Template 4641 = getDerived().TransformTemplateName(SS, T->getTemplateName(), 4642 TL.getTemplateNameLoc()); 4643 if (Template.isNull()) 4644 return QualType(); 4645 4646 return getDerived().TransformTemplateSpecializationType(TLB, TL, Template); 4647 } 4648 4649 template<typename Derived> 4650 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB, 4651 AtomicTypeLoc TL) { 4652 QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc()); 4653 if (ValueType.isNull()) 4654 return QualType(); 4655 4656 QualType Result = TL.getType(); 4657 if (getDerived().AlwaysRebuild() || 4658 ValueType != TL.getValueLoc().getType()) { 4659 Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc()); 4660 if (Result.isNull()) 4661 return QualType(); 4662 } 4663 4664 AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result); 4665 NewTL.setKWLoc(TL.getKWLoc()); 4666 NewTL.setLParenLoc(TL.getLParenLoc()); 4667 NewTL.setRParenLoc(TL.getRParenLoc()); 4668 4669 return Result; 4670 } 4671 4672 /// \brief Simple iterator that traverses the template arguments in a 4673 /// container that provides a \c getArgLoc() member function. 4674 /// 4675 /// This iterator is intended to be used with the iterator form of 4676 /// \c TreeTransform<Derived>::TransformTemplateArguments(). 4677 template<typename ArgLocContainer> 4678 class TemplateArgumentLocContainerIterator { 4679 ArgLocContainer *Container; 4680 unsigned Index; 4681 4682 public: 4683 typedef TemplateArgumentLoc value_type; 4684 typedef TemplateArgumentLoc reference; 4685 typedef int difference_type; 4686 typedef std::input_iterator_tag iterator_category; 4687 4688 class pointer { 4689 TemplateArgumentLoc Arg; 4690 4691 public: 4692 explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { } 4693 4694 const TemplateArgumentLoc *operator->() const { 4695 return &Arg; 4696 } 4697 }; 4698 4699 4700 TemplateArgumentLocContainerIterator() {} 4701 4702 TemplateArgumentLocContainerIterator(ArgLocContainer &Container, 4703 unsigned Index) 4704 : Container(&Container), Index(Index) { } 4705 4706 TemplateArgumentLocContainerIterator &operator++() { 4707 ++Index; 4708 return *this; 4709 } 4710 4711 TemplateArgumentLocContainerIterator operator++(int) { 4712 TemplateArgumentLocContainerIterator Old(*this); 4713 ++(*this); 4714 return Old; 4715 } 4716 4717 TemplateArgumentLoc operator*() const { 4718 return Container->getArgLoc(Index); 4719 } 4720 4721 pointer operator->() const { 4722 return pointer(Container->getArgLoc(Index)); 4723 } 4724 4725 friend bool operator==(const TemplateArgumentLocContainerIterator &X, 4726 const TemplateArgumentLocContainerIterator &Y) { 4727 return X.Container == Y.Container && X.Index == Y.Index; 4728 } 4729 4730 friend bool operator!=(const TemplateArgumentLocContainerIterator &X, 4731 const TemplateArgumentLocContainerIterator &Y) { 4732 return !(X == Y); 4733 } 4734 }; 4735 4736 4737 template <typename Derived> 4738 QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 4739 TypeLocBuilder &TLB, 4740 TemplateSpecializationTypeLoc TL, 4741 TemplateName Template) { 4742 TemplateArgumentListInfo NewTemplateArgs; 4743 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 4744 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 4745 typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc> 4746 ArgIterator; 4747 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 4748 ArgIterator(TL, TL.getNumArgs()), 4749 NewTemplateArgs)) 4750 return QualType(); 4751 4752 // FIXME: maybe don't rebuild if all the template arguments are the same. 4753 4754 QualType Result = 4755 getDerived().RebuildTemplateSpecializationType(Template, 4756 TL.getTemplateNameLoc(), 4757 NewTemplateArgs); 4758 4759 if (!Result.isNull()) { 4760 // Specializations of template template parameters are represented as 4761 // TemplateSpecializationTypes, and substitution of type alias templates 4762 // within a dependent context can transform them into 4763 // DependentTemplateSpecializationTypes. 4764 if (isa<DependentTemplateSpecializationType>(Result)) { 4765 DependentTemplateSpecializationTypeLoc NewTL 4766 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 4767 NewTL.setElaboratedKeywordLoc(SourceLocation()); 4768 NewTL.setQualifierLoc(NestedNameSpecifierLoc()); 4769 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 4770 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 4771 NewTL.setLAngleLoc(TL.getLAngleLoc()); 4772 NewTL.setRAngleLoc(TL.getRAngleLoc()); 4773 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4774 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4775 return Result; 4776 } 4777 4778 TemplateSpecializationTypeLoc NewTL 4779 = TLB.push<TemplateSpecializationTypeLoc>(Result); 4780 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 4781 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 4782 NewTL.setLAngleLoc(TL.getLAngleLoc()); 4783 NewTL.setRAngleLoc(TL.getRAngleLoc()); 4784 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4785 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4786 } 4787 4788 return Result; 4789 } 4790 4791 template <typename Derived> 4792 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType( 4793 TypeLocBuilder &TLB, 4794 DependentTemplateSpecializationTypeLoc TL, 4795 TemplateName Template, 4796 CXXScopeSpec &SS) { 4797 TemplateArgumentListInfo NewTemplateArgs; 4798 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 4799 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 4800 typedef TemplateArgumentLocContainerIterator< 4801 DependentTemplateSpecializationTypeLoc> ArgIterator; 4802 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 4803 ArgIterator(TL, TL.getNumArgs()), 4804 NewTemplateArgs)) 4805 return QualType(); 4806 4807 // FIXME: maybe don't rebuild if all the template arguments are the same. 4808 4809 if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) { 4810 QualType Result 4811 = getSema().Context.getDependentTemplateSpecializationType( 4812 TL.getTypePtr()->getKeyword(), 4813 DTN->getQualifier(), 4814 DTN->getIdentifier(), 4815 NewTemplateArgs); 4816 4817 DependentTemplateSpecializationTypeLoc NewTL 4818 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 4819 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 4820 NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context)); 4821 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 4822 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 4823 NewTL.setLAngleLoc(TL.getLAngleLoc()); 4824 NewTL.setRAngleLoc(TL.getRAngleLoc()); 4825 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4826 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4827 return Result; 4828 } 4829 4830 QualType Result 4831 = getDerived().RebuildTemplateSpecializationType(Template, 4832 TL.getTemplateNameLoc(), 4833 NewTemplateArgs); 4834 4835 if (!Result.isNull()) { 4836 /// FIXME: Wrap this in an elaborated-type-specifier? 4837 TemplateSpecializationTypeLoc NewTL 4838 = TLB.push<TemplateSpecializationTypeLoc>(Result); 4839 NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 4840 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 4841 NewTL.setLAngleLoc(TL.getLAngleLoc()); 4842 NewTL.setRAngleLoc(TL.getRAngleLoc()); 4843 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i) 4844 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo()); 4845 } 4846 4847 return Result; 4848 } 4849 4850 template<typename Derived> 4851 QualType 4852 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB, 4853 ElaboratedTypeLoc TL) { 4854 const ElaboratedType *T = TL.getTypePtr(); 4855 4856 NestedNameSpecifierLoc QualifierLoc; 4857 // NOTE: the qualifier in an ElaboratedType is optional. 4858 if (TL.getQualifierLoc()) { 4859 QualifierLoc 4860 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 4861 if (!QualifierLoc) 4862 return QualType(); 4863 } 4864 4865 QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc()); 4866 if (NamedT.isNull()) 4867 return QualType(); 4868 4869 // C++0x [dcl.type.elab]p2: 4870 // If the identifier resolves to a typedef-name or the simple-template-id 4871 // resolves to an alias template specialization, the 4872 // elaborated-type-specifier is ill-formed. 4873 if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) { 4874 if (const TemplateSpecializationType *TST = 4875 NamedT->getAs<TemplateSpecializationType>()) { 4876 TemplateName Template = TST->getTemplateName(); 4877 if (TypeAliasTemplateDecl *TAT = 4878 dyn_cast_or_null<TypeAliasTemplateDecl>(Template.getAsTemplateDecl())) { 4879 SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(), 4880 diag::err_tag_reference_non_tag) << 4; 4881 SemaRef.Diag(TAT->getLocation(), diag::note_declared_at); 4882 } 4883 } 4884 } 4885 4886 QualType Result = TL.getType(); 4887 if (getDerived().AlwaysRebuild() || 4888 QualifierLoc != TL.getQualifierLoc() || 4889 NamedT != T->getNamedType()) { 4890 Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(), 4891 T->getKeyword(), 4892 QualifierLoc, NamedT); 4893 if (Result.isNull()) 4894 return QualType(); 4895 } 4896 4897 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 4898 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 4899 NewTL.setQualifierLoc(QualifierLoc); 4900 return Result; 4901 } 4902 4903 template<typename Derived> 4904 QualType TreeTransform<Derived>::TransformAttributedType( 4905 TypeLocBuilder &TLB, 4906 AttributedTypeLoc TL) { 4907 const AttributedType *oldType = TL.getTypePtr(); 4908 QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc()); 4909 if (modifiedType.isNull()) 4910 return QualType(); 4911 4912 QualType result = TL.getType(); 4913 4914 // FIXME: dependent operand expressions? 4915 if (getDerived().AlwaysRebuild() || 4916 modifiedType != oldType->getModifiedType()) { 4917 // TODO: this is really lame; we should really be rebuilding the 4918 // equivalent type from first principles. 4919 QualType equivalentType 4920 = getDerived().TransformType(oldType->getEquivalentType()); 4921 if (equivalentType.isNull()) 4922 return QualType(); 4923 result = SemaRef.Context.getAttributedType(oldType->getAttrKind(), 4924 modifiedType, 4925 equivalentType); 4926 } 4927 4928 AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result); 4929 newTL.setAttrNameLoc(TL.getAttrNameLoc()); 4930 if (TL.hasAttrOperand()) 4931 newTL.setAttrOperandParensRange(TL.getAttrOperandParensRange()); 4932 if (TL.hasAttrExprOperand()) 4933 newTL.setAttrExprOperand(TL.getAttrExprOperand()); 4934 else if (TL.hasAttrEnumOperand()) 4935 newTL.setAttrEnumOperandLoc(TL.getAttrEnumOperandLoc()); 4936 4937 return result; 4938 } 4939 4940 template<typename Derived> 4941 QualType 4942 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB, 4943 ParenTypeLoc TL) { 4944 QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc()); 4945 if (Inner.isNull()) 4946 return QualType(); 4947 4948 QualType Result = TL.getType(); 4949 if (getDerived().AlwaysRebuild() || 4950 Inner != TL.getInnerLoc().getType()) { 4951 Result = getDerived().RebuildParenType(Inner); 4952 if (Result.isNull()) 4953 return QualType(); 4954 } 4955 4956 ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result); 4957 NewTL.setLParenLoc(TL.getLParenLoc()); 4958 NewTL.setRParenLoc(TL.getRParenLoc()); 4959 return Result; 4960 } 4961 4962 template<typename Derived> 4963 QualType TreeTransform<Derived>::TransformDependentNameType(TypeLocBuilder &TLB, 4964 DependentNameTypeLoc TL) { 4965 const DependentNameType *T = TL.getTypePtr(); 4966 4967 NestedNameSpecifierLoc QualifierLoc 4968 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 4969 if (!QualifierLoc) 4970 return QualType(); 4971 4972 QualType Result 4973 = getDerived().RebuildDependentNameType(T->getKeyword(), 4974 TL.getElaboratedKeywordLoc(), 4975 QualifierLoc, 4976 T->getIdentifier(), 4977 TL.getNameLoc()); 4978 if (Result.isNull()) 4979 return QualType(); 4980 4981 if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) { 4982 QualType NamedT = ElabT->getNamedType(); 4983 TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc()); 4984 4985 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 4986 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 4987 NewTL.setQualifierLoc(QualifierLoc); 4988 } else { 4989 DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result); 4990 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 4991 NewTL.setQualifierLoc(QualifierLoc); 4992 NewTL.setNameLoc(TL.getNameLoc()); 4993 } 4994 return Result; 4995 } 4996 4997 template<typename Derived> 4998 QualType TreeTransform<Derived>:: 4999 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 5000 DependentTemplateSpecializationTypeLoc TL) { 5001 NestedNameSpecifierLoc QualifierLoc; 5002 if (TL.getQualifierLoc()) { 5003 QualifierLoc 5004 = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc()); 5005 if (!QualifierLoc) 5006 return QualType(); 5007 } 5008 5009 return getDerived() 5010 .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc); 5011 } 5012 5013 template<typename Derived> 5014 QualType TreeTransform<Derived>:: 5015 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB, 5016 DependentTemplateSpecializationTypeLoc TL, 5017 NestedNameSpecifierLoc QualifierLoc) { 5018 const DependentTemplateSpecializationType *T = TL.getTypePtr(); 5019 5020 TemplateArgumentListInfo NewTemplateArgs; 5021 NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); 5022 NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); 5023 5024 typedef TemplateArgumentLocContainerIterator< 5025 DependentTemplateSpecializationTypeLoc> ArgIterator; 5026 if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), 5027 ArgIterator(TL, TL.getNumArgs()), 5028 NewTemplateArgs)) 5029 return QualType(); 5030 5031 QualType Result 5032 = getDerived().RebuildDependentTemplateSpecializationType(T->getKeyword(), 5033 QualifierLoc, 5034 T->getIdentifier(), 5035 TL.getTemplateNameLoc(), 5036 NewTemplateArgs); 5037 if (Result.isNull()) 5038 return QualType(); 5039 5040 if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) { 5041 QualType NamedT = ElabT->getNamedType(); 5042 5043 // Copy information relevant to the template specialization. 5044 TemplateSpecializationTypeLoc NamedTL 5045 = TLB.push<TemplateSpecializationTypeLoc>(NamedT); 5046 NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5047 NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5048 NamedTL.setLAngleLoc(TL.getLAngleLoc()); 5049 NamedTL.setRAngleLoc(TL.getRAngleLoc()); 5050 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5051 NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5052 5053 // Copy information relevant to the elaborated type. 5054 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result); 5055 NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5056 NewTL.setQualifierLoc(QualifierLoc); 5057 } else if (isa<DependentTemplateSpecializationType>(Result)) { 5058 DependentTemplateSpecializationTypeLoc SpecTL 5059 = TLB.push<DependentTemplateSpecializationTypeLoc>(Result); 5060 SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc()); 5061 SpecTL.setQualifierLoc(QualifierLoc); 5062 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5063 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5064 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 5065 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 5066 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5067 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5068 } else { 5069 TemplateSpecializationTypeLoc SpecTL 5070 = TLB.push<TemplateSpecializationTypeLoc>(Result); 5071 SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc()); 5072 SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc()); 5073 SpecTL.setLAngleLoc(TL.getLAngleLoc()); 5074 SpecTL.setRAngleLoc(TL.getRAngleLoc()); 5075 for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I) 5076 SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo()); 5077 } 5078 return Result; 5079 } 5080 5081 template<typename Derived> 5082 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB, 5083 PackExpansionTypeLoc TL) { 5084 QualType Pattern 5085 = getDerived().TransformType(TLB, TL.getPatternLoc()); 5086 if (Pattern.isNull()) 5087 return QualType(); 5088 5089 QualType Result = TL.getType(); 5090 if (getDerived().AlwaysRebuild() || 5091 Pattern != TL.getPatternLoc().getType()) { 5092 Result = getDerived().RebuildPackExpansionType(Pattern, 5093 TL.getPatternLoc().getSourceRange(), 5094 TL.getEllipsisLoc(), 5095 TL.getTypePtr()->getNumExpansions()); 5096 if (Result.isNull()) 5097 return QualType(); 5098 } 5099 5100 PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result); 5101 NewT.setEllipsisLoc(TL.getEllipsisLoc()); 5102 return Result; 5103 } 5104 5105 template<typename Derived> 5106 QualType 5107 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB, 5108 ObjCInterfaceTypeLoc TL) { 5109 // ObjCInterfaceType is never dependent. 5110 TLB.pushFullCopy(TL); 5111 return TL.getType(); 5112 } 5113 5114 template<typename Derived> 5115 QualType 5116 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB, 5117 ObjCObjectTypeLoc TL) { 5118 // ObjCObjectType is never dependent. 5119 TLB.pushFullCopy(TL); 5120 return TL.getType(); 5121 } 5122 5123 template<typename Derived> 5124 QualType 5125 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB, 5126 ObjCObjectPointerTypeLoc TL) { 5127 // ObjCObjectPointerType is never dependent. 5128 TLB.pushFullCopy(TL); 5129 return TL.getType(); 5130 } 5131 5132 //===----------------------------------------------------------------------===// 5133 // Statement transformation 5134 //===----------------------------------------------------------------------===// 5135 template<typename Derived> 5136 StmtResult 5137 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 5138 return SemaRef.Owned(S); 5139 } 5140 5141 template<typename Derived> 5142 StmtResult 5143 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 5144 return getDerived().TransformCompoundStmt(S, false); 5145 } 5146 5147 template<typename Derived> 5148 StmtResult 5149 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 5150 bool IsStmtExpr) { 5151 Sema::CompoundScopeRAII CompoundScope(getSema()); 5152 5153 bool SubStmtInvalid = false; 5154 bool SubStmtChanged = false; 5155 SmallVector<Stmt*, 8> Statements; 5156 for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 5157 B != BEnd; ++B) { 5158 StmtResult Result = getDerived().TransformStmt(*B); 5159 if (Result.isInvalid()) { 5160 // Immediately fail if this was a DeclStmt, since it's very 5161 // likely that this will cause problems for future statements. 5162 if (isa<DeclStmt>(*B)) 5163 return StmtError(); 5164 5165 // Otherwise, just keep processing substatements and fail later. 5166 SubStmtInvalid = true; 5167 continue; 5168 } 5169 5170 SubStmtChanged = SubStmtChanged || Result.get() != *B; 5171 Statements.push_back(Result.takeAs<Stmt>()); 5172 } 5173 5174 if (SubStmtInvalid) 5175 return StmtError(); 5176 5177 if (!getDerived().AlwaysRebuild() && 5178 !SubStmtChanged) 5179 return SemaRef.Owned(S); 5180 5181 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 5182 Statements, 5183 S->getRBracLoc(), 5184 IsStmtExpr); 5185 } 5186 5187 template<typename Derived> 5188 StmtResult 5189 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 5190 ExprResult LHS, RHS; 5191 { 5192 EnterExpressionEvaluationContext Unevaluated(SemaRef, 5193 Sema::ConstantEvaluated); 5194 5195 // Transform the left-hand case value. 5196 LHS = getDerived().TransformExpr(S->getLHS()); 5197 LHS = SemaRef.ActOnConstantExpression(LHS); 5198 if (LHS.isInvalid()) 5199 return StmtError(); 5200 5201 // Transform the right-hand case value (for the GNU case-range extension). 5202 RHS = getDerived().TransformExpr(S->getRHS()); 5203 RHS = SemaRef.ActOnConstantExpression(RHS); 5204 if (RHS.isInvalid()) 5205 return StmtError(); 5206 } 5207 5208 // Build the case statement. 5209 // Case statements are always rebuilt so that they will attached to their 5210 // transformed switch statement. 5211 StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 5212 LHS.get(), 5213 S->getEllipsisLoc(), 5214 RHS.get(), 5215 S->getColonLoc()); 5216 if (Case.isInvalid()) 5217 return StmtError(); 5218 5219 // Transform the statement following the case 5220 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5221 if (SubStmt.isInvalid()) 5222 return StmtError(); 5223 5224 // Attach the body to the case statement 5225 return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get()); 5226 } 5227 5228 template<typename Derived> 5229 StmtResult 5230 TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 5231 // Transform the statement following the default case 5232 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5233 if (SubStmt.isInvalid()) 5234 return StmtError(); 5235 5236 // Default statements are always rebuilt 5237 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 5238 SubStmt.get()); 5239 } 5240 5241 template<typename Derived> 5242 StmtResult 5243 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 5244 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5245 if (SubStmt.isInvalid()) 5246 return StmtError(); 5247 5248 Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(), 5249 S->getDecl()); 5250 if (!LD) 5251 return StmtError(); 5252 5253 5254 // FIXME: Pass the real colon location in. 5255 return getDerived().RebuildLabelStmt(S->getIdentLoc(), 5256 cast<LabelDecl>(LD), SourceLocation(), 5257 SubStmt.get()); 5258 } 5259 5260 template<typename Derived> 5261 StmtResult 5262 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S) { 5263 StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 5264 if (SubStmt.isInvalid()) 5265 return StmtError(); 5266 5267 // TODO: transform attributes 5268 if (SubStmt.get() == S->getSubStmt() /* && attrs are the same */) 5269 return S; 5270 5271 return getDerived().RebuildAttributedStmt(S->getAttrLoc(), 5272 S->getAttrs(), 5273 SubStmt.get()); 5274 } 5275 5276 template<typename Derived> 5277 StmtResult 5278 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 5279 // Transform the condition 5280 ExprResult Cond; 5281 VarDecl *ConditionVar = 0; 5282 if (S->getConditionVariable()) { 5283 ConditionVar 5284 = cast_or_null<VarDecl>( 5285 getDerived().TransformDefinition( 5286 S->getConditionVariable()->getLocation(), 5287 S->getConditionVariable())); 5288 if (!ConditionVar) 5289 return StmtError(); 5290 } else { 5291 Cond = getDerived().TransformExpr(S->getCond()); 5292 5293 if (Cond.isInvalid()) 5294 return StmtError(); 5295 5296 // Convert the condition to a boolean value. 5297 if (S->getCond()) { 5298 ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getIfLoc(), 5299 Cond.get()); 5300 if (CondE.isInvalid()) 5301 return StmtError(); 5302 5303 Cond = CondE.get(); 5304 } 5305 } 5306 5307 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 5308 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5309 return StmtError(); 5310 5311 // Transform the "then" branch. 5312 StmtResult Then = getDerived().TransformStmt(S->getThen()); 5313 if (Then.isInvalid()) 5314 return StmtError(); 5315 5316 // Transform the "else" branch. 5317 StmtResult Else = getDerived().TransformStmt(S->getElse()); 5318 if (Else.isInvalid()) 5319 return StmtError(); 5320 5321 if (!getDerived().AlwaysRebuild() && 5322 FullCond.get() == S->getCond() && 5323 ConditionVar == S->getConditionVariable() && 5324 Then.get() == S->getThen() && 5325 Else.get() == S->getElse()) 5326 return SemaRef.Owned(S); 5327 5328 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, ConditionVar, 5329 Then.get(), 5330 S->getElseLoc(), Else.get()); 5331 } 5332 5333 template<typename Derived> 5334 StmtResult 5335 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 5336 // Transform the condition. 5337 ExprResult Cond; 5338 VarDecl *ConditionVar = 0; 5339 if (S->getConditionVariable()) { 5340 ConditionVar 5341 = cast_or_null<VarDecl>( 5342 getDerived().TransformDefinition( 5343 S->getConditionVariable()->getLocation(), 5344 S->getConditionVariable())); 5345 if (!ConditionVar) 5346 return StmtError(); 5347 } else { 5348 Cond = getDerived().TransformExpr(S->getCond()); 5349 5350 if (Cond.isInvalid()) 5351 return StmtError(); 5352 } 5353 5354 // Rebuild the switch statement. 5355 StmtResult Switch 5356 = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Cond.get(), 5357 ConditionVar); 5358 if (Switch.isInvalid()) 5359 return StmtError(); 5360 5361 // Transform the body of the switch statement. 5362 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5363 if (Body.isInvalid()) 5364 return StmtError(); 5365 5366 // Complete the switch statement. 5367 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(), 5368 Body.get()); 5369 } 5370 5371 template<typename Derived> 5372 StmtResult 5373 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 5374 // Transform the condition 5375 ExprResult Cond; 5376 VarDecl *ConditionVar = 0; 5377 if (S->getConditionVariable()) { 5378 ConditionVar 5379 = cast_or_null<VarDecl>( 5380 getDerived().TransformDefinition( 5381 S->getConditionVariable()->getLocation(), 5382 S->getConditionVariable())); 5383 if (!ConditionVar) 5384 return StmtError(); 5385 } else { 5386 Cond = getDerived().TransformExpr(S->getCond()); 5387 5388 if (Cond.isInvalid()) 5389 return StmtError(); 5390 5391 if (S->getCond()) { 5392 // Convert the condition to a boolean value. 5393 ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getWhileLoc(), 5394 Cond.get()); 5395 if (CondE.isInvalid()) 5396 return StmtError(); 5397 Cond = CondE; 5398 } 5399 } 5400 5401 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 5402 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5403 return StmtError(); 5404 5405 // Transform the body 5406 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5407 if (Body.isInvalid()) 5408 return StmtError(); 5409 5410 if (!getDerived().AlwaysRebuild() && 5411 FullCond.get() == S->getCond() && 5412 ConditionVar == S->getConditionVariable() && 5413 Body.get() == S->getBody()) 5414 return Owned(S); 5415 5416 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, 5417 ConditionVar, Body.get()); 5418 } 5419 5420 template<typename Derived> 5421 StmtResult 5422 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 5423 // Transform the body 5424 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5425 if (Body.isInvalid()) 5426 return StmtError(); 5427 5428 // Transform the condition 5429 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 5430 if (Cond.isInvalid()) 5431 return StmtError(); 5432 5433 if (!getDerived().AlwaysRebuild() && 5434 Cond.get() == S->getCond() && 5435 Body.get() == S->getBody()) 5436 return SemaRef.Owned(S); 5437 5438 return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(), 5439 /*FIXME:*/S->getWhileLoc(), Cond.get(), 5440 S->getRParenLoc()); 5441 } 5442 5443 template<typename Derived> 5444 StmtResult 5445 TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 5446 // Transform the initialization statement 5447 StmtResult Init = getDerived().TransformStmt(S->getInit()); 5448 if (Init.isInvalid()) 5449 return StmtError(); 5450 5451 // Transform the condition 5452 ExprResult Cond; 5453 VarDecl *ConditionVar = 0; 5454 if (S->getConditionVariable()) { 5455 ConditionVar 5456 = cast_or_null<VarDecl>( 5457 getDerived().TransformDefinition( 5458 S->getConditionVariable()->getLocation(), 5459 S->getConditionVariable())); 5460 if (!ConditionVar) 5461 return StmtError(); 5462 } else { 5463 Cond = getDerived().TransformExpr(S->getCond()); 5464 5465 if (Cond.isInvalid()) 5466 return StmtError(); 5467 5468 if (S->getCond()) { 5469 // Convert the condition to a boolean value. 5470 ExprResult CondE = getSema().ActOnBooleanCondition(0, S->getForLoc(), 5471 Cond.get()); 5472 if (CondE.isInvalid()) 5473 return StmtError(); 5474 5475 Cond = CondE.get(); 5476 } 5477 } 5478 5479 Sema::FullExprArg FullCond(getSema().MakeFullExpr(Cond.take())); 5480 if (!S->getConditionVariable() && S->getCond() && !FullCond.get()) 5481 return StmtError(); 5482 5483 // Transform the increment 5484 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 5485 if (Inc.isInvalid()) 5486 return StmtError(); 5487 5488 Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get())); 5489 if (S->getInc() && !FullInc.get()) 5490 return StmtError(); 5491 5492 // Transform the body 5493 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5494 if (Body.isInvalid()) 5495 return StmtError(); 5496 5497 if (!getDerived().AlwaysRebuild() && 5498 Init.get() == S->getInit() && 5499 FullCond.get() == S->getCond() && 5500 Inc.get() == S->getInc() && 5501 Body.get() == S->getBody()) 5502 return SemaRef.Owned(S); 5503 5504 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 5505 Init.get(), FullCond, ConditionVar, 5506 FullInc, S->getRParenLoc(), Body.get()); 5507 } 5508 5509 template<typename Derived> 5510 StmtResult 5511 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 5512 Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(), 5513 S->getLabel()); 5514 if (!LD) 5515 return StmtError(); 5516 5517 // Goto statements must always be rebuilt, to resolve the label. 5518 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 5519 cast<LabelDecl>(LD)); 5520 } 5521 5522 template<typename Derived> 5523 StmtResult 5524 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 5525 ExprResult Target = getDerived().TransformExpr(S->getTarget()); 5526 if (Target.isInvalid()) 5527 return StmtError(); 5528 Target = SemaRef.MaybeCreateExprWithCleanups(Target.take()); 5529 5530 if (!getDerived().AlwaysRebuild() && 5531 Target.get() == S->getTarget()) 5532 return SemaRef.Owned(S); 5533 5534 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 5535 Target.get()); 5536 } 5537 5538 template<typename Derived> 5539 StmtResult 5540 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 5541 return SemaRef.Owned(S); 5542 } 5543 5544 template<typename Derived> 5545 StmtResult 5546 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 5547 return SemaRef.Owned(S); 5548 } 5549 5550 template<typename Derived> 5551 StmtResult 5552 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 5553 ExprResult Result = getDerived().TransformExpr(S->getRetValue()); 5554 if (Result.isInvalid()) 5555 return StmtError(); 5556 5557 // FIXME: We always rebuild the return statement because there is no way 5558 // to tell whether the return type of the function has changed. 5559 return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get()); 5560 } 5561 5562 template<typename Derived> 5563 StmtResult 5564 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 5565 bool DeclChanged = false; 5566 SmallVector<Decl *, 4> Decls; 5567 for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 5568 D != DEnd; ++D) { 5569 Decl *Transformed = getDerived().TransformDefinition((*D)->getLocation(), 5570 *D); 5571 if (!Transformed) 5572 return StmtError(); 5573 5574 if (Transformed != *D) 5575 DeclChanged = true; 5576 5577 Decls.push_back(Transformed); 5578 } 5579 5580 if (!getDerived().AlwaysRebuild() && !DeclChanged) 5581 return SemaRef.Owned(S); 5582 5583 return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 5584 S->getStartLoc(), S->getEndLoc()); 5585 } 5586 5587 template<typename Derived> 5588 StmtResult 5589 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) { 5590 5591 SmallVector<Expr*, 8> Constraints; 5592 SmallVector<Expr*, 8> Exprs; 5593 SmallVector<IdentifierInfo *, 4> Names; 5594 5595 ExprResult AsmString; 5596 SmallVector<Expr*, 8> Clobbers; 5597 5598 bool ExprsChanged = false; 5599 5600 // Go through the outputs. 5601 for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) { 5602 Names.push_back(S->getOutputIdentifier(I)); 5603 5604 // No need to transform the constraint literal. 5605 Constraints.push_back(S->getOutputConstraintLiteral(I)); 5606 5607 // Transform the output expr. 5608 Expr *OutputExpr = S->getOutputExpr(I); 5609 ExprResult Result = getDerived().TransformExpr(OutputExpr); 5610 if (Result.isInvalid()) 5611 return StmtError(); 5612 5613 ExprsChanged |= Result.get() != OutputExpr; 5614 5615 Exprs.push_back(Result.get()); 5616 } 5617 5618 // Go through the inputs. 5619 for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) { 5620 Names.push_back(S->getInputIdentifier(I)); 5621 5622 // No need to transform the constraint literal. 5623 Constraints.push_back(S->getInputConstraintLiteral(I)); 5624 5625 // Transform the input expr. 5626 Expr *InputExpr = S->getInputExpr(I); 5627 ExprResult Result = getDerived().TransformExpr(InputExpr); 5628 if (Result.isInvalid()) 5629 return StmtError(); 5630 5631 ExprsChanged |= Result.get() != InputExpr; 5632 5633 Exprs.push_back(Result.get()); 5634 } 5635 5636 if (!getDerived().AlwaysRebuild() && !ExprsChanged) 5637 return SemaRef.Owned(S); 5638 5639 // Go through the clobbers. 5640 for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I) 5641 Clobbers.push_back(S->getClobberStringLiteral(I)); 5642 5643 // No need to transform the asm string literal. 5644 AsmString = SemaRef.Owned(S->getAsmString()); 5645 return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(), 5646 S->isVolatile(), S->getNumOutputs(), 5647 S->getNumInputs(), Names.data(), 5648 Constraints, Exprs, AsmString.get(), 5649 Clobbers, S->getRParenLoc()); 5650 } 5651 5652 template<typename Derived> 5653 StmtResult 5654 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) { 5655 ArrayRef<Token> AsmToks = 5656 llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks()); 5657 5658 bool HadError = false, HadChange = false; 5659 5660 ArrayRef<Expr*> SrcExprs = S->getAllExprs(); 5661 SmallVector<Expr*, 8> TransformedExprs; 5662 TransformedExprs.reserve(SrcExprs.size()); 5663 for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) { 5664 ExprResult Result = getDerived().TransformExpr(SrcExprs[i]); 5665 if (!Result.isUsable()) { 5666 HadError = true; 5667 } else { 5668 HadChange |= (Result.get() != SrcExprs[i]); 5669 TransformedExprs.push_back(Result.take()); 5670 } 5671 } 5672 5673 if (HadError) return StmtError(); 5674 if (!HadChange && !getDerived().AlwaysRebuild()) 5675 return Owned(S); 5676 5677 return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(), 5678 AsmToks, S->getAsmString(), 5679 S->getNumOutputs(), S->getNumInputs(), 5680 S->getAllConstraints(), S->getClobbers(), 5681 TransformedExprs, S->getEndLoc()); 5682 } 5683 5684 template<typename Derived> 5685 StmtResult 5686 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 5687 // Transform the body of the @try. 5688 StmtResult TryBody = getDerived().TransformStmt(S->getTryBody()); 5689 if (TryBody.isInvalid()) 5690 return StmtError(); 5691 5692 // Transform the @catch statements (if present). 5693 bool AnyCatchChanged = false; 5694 SmallVector<Stmt*, 8> CatchStmts; 5695 for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) { 5696 StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I)); 5697 if (Catch.isInvalid()) 5698 return StmtError(); 5699 if (Catch.get() != S->getCatchStmt(I)) 5700 AnyCatchChanged = true; 5701 CatchStmts.push_back(Catch.release()); 5702 } 5703 5704 // Transform the @finally statement (if present). 5705 StmtResult Finally; 5706 if (S->getFinallyStmt()) { 5707 Finally = getDerived().TransformStmt(S->getFinallyStmt()); 5708 if (Finally.isInvalid()) 5709 return StmtError(); 5710 } 5711 5712 // If nothing changed, just retain this statement. 5713 if (!getDerived().AlwaysRebuild() && 5714 TryBody.get() == S->getTryBody() && 5715 !AnyCatchChanged && 5716 Finally.get() == S->getFinallyStmt()) 5717 return SemaRef.Owned(S); 5718 5719 // Build a new statement. 5720 return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(), 5721 CatchStmts, Finally.get()); 5722 } 5723 5724 template<typename Derived> 5725 StmtResult 5726 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 5727 // Transform the @catch parameter, if there is one. 5728 VarDecl *Var = 0; 5729 if (VarDecl *FromVar = S->getCatchParamDecl()) { 5730 TypeSourceInfo *TSInfo = 0; 5731 if (FromVar->getTypeSourceInfo()) { 5732 TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo()); 5733 if (!TSInfo) 5734 return StmtError(); 5735 } 5736 5737 QualType T; 5738 if (TSInfo) 5739 T = TSInfo->getType(); 5740 else { 5741 T = getDerived().TransformType(FromVar->getType()); 5742 if (T.isNull()) 5743 return StmtError(); 5744 } 5745 5746 Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T); 5747 if (!Var) 5748 return StmtError(); 5749 } 5750 5751 StmtResult Body = getDerived().TransformStmt(S->getCatchBody()); 5752 if (Body.isInvalid()) 5753 return StmtError(); 5754 5755 return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(), 5756 S->getRParenLoc(), 5757 Var, Body.get()); 5758 } 5759 5760 template<typename Derived> 5761 StmtResult 5762 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 5763 // Transform the body. 5764 StmtResult Body = getDerived().TransformStmt(S->getFinallyBody()); 5765 if (Body.isInvalid()) 5766 return StmtError(); 5767 5768 // If nothing changed, just retain this statement. 5769 if (!getDerived().AlwaysRebuild() && 5770 Body.get() == S->getFinallyBody()) 5771 return SemaRef.Owned(S); 5772 5773 // Build a new statement. 5774 return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(), 5775 Body.get()); 5776 } 5777 5778 template<typename Derived> 5779 StmtResult 5780 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 5781 ExprResult Operand; 5782 if (S->getThrowExpr()) { 5783 Operand = getDerived().TransformExpr(S->getThrowExpr()); 5784 if (Operand.isInvalid()) 5785 return StmtError(); 5786 } 5787 5788 if (!getDerived().AlwaysRebuild() && 5789 Operand.get() == S->getThrowExpr()) 5790 return getSema().Owned(S); 5791 5792 return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get()); 5793 } 5794 5795 template<typename Derived> 5796 StmtResult 5797 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 5798 ObjCAtSynchronizedStmt *S) { 5799 // Transform the object we are locking. 5800 ExprResult Object = getDerived().TransformExpr(S->getSynchExpr()); 5801 if (Object.isInvalid()) 5802 return StmtError(); 5803 Object = 5804 getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(), 5805 Object.get()); 5806 if (Object.isInvalid()) 5807 return StmtError(); 5808 5809 // Transform the body. 5810 StmtResult Body = getDerived().TransformStmt(S->getSynchBody()); 5811 if (Body.isInvalid()) 5812 return StmtError(); 5813 5814 // If nothing change, just retain the current statement. 5815 if (!getDerived().AlwaysRebuild() && 5816 Object.get() == S->getSynchExpr() && 5817 Body.get() == S->getSynchBody()) 5818 return SemaRef.Owned(S); 5819 5820 // Build a new statement. 5821 return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(), 5822 Object.get(), Body.get()); 5823 } 5824 5825 template<typename Derived> 5826 StmtResult 5827 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt( 5828 ObjCAutoreleasePoolStmt *S) { 5829 // Transform the body. 5830 StmtResult Body = getDerived().TransformStmt(S->getSubStmt()); 5831 if (Body.isInvalid()) 5832 return StmtError(); 5833 5834 // If nothing changed, just retain this statement. 5835 if (!getDerived().AlwaysRebuild() && 5836 Body.get() == S->getSubStmt()) 5837 return SemaRef.Owned(S); 5838 5839 // Build a new statement. 5840 return getDerived().RebuildObjCAutoreleasePoolStmt( 5841 S->getAtLoc(), Body.get()); 5842 } 5843 5844 template<typename Derived> 5845 StmtResult 5846 TreeTransform<Derived>::TransformObjCForCollectionStmt( 5847 ObjCForCollectionStmt *S) { 5848 // Transform the element statement. 5849 StmtResult Element = getDerived().TransformStmt(S->getElement()); 5850 if (Element.isInvalid()) 5851 return StmtError(); 5852 5853 // Transform the collection expression. 5854 ExprResult Collection = getDerived().TransformExpr(S->getCollection()); 5855 if (Collection.isInvalid()) 5856 return StmtError(); 5857 5858 // Transform the body. 5859 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5860 if (Body.isInvalid()) 5861 return StmtError(); 5862 5863 // If nothing changed, just retain this statement. 5864 if (!getDerived().AlwaysRebuild() && 5865 Element.get() == S->getElement() && 5866 Collection.get() == S->getCollection() && 5867 Body.get() == S->getBody()) 5868 return SemaRef.Owned(S); 5869 5870 // Build a new statement. 5871 return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(), 5872 Element.get(), 5873 Collection.get(), 5874 S->getRParenLoc(), 5875 Body.get()); 5876 } 5877 5878 5879 template<typename Derived> 5880 StmtResult 5881 TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 5882 // Transform the exception declaration, if any. 5883 VarDecl *Var = 0; 5884 if (S->getExceptionDecl()) { 5885 VarDecl *ExceptionDecl = S->getExceptionDecl(); 5886 TypeSourceInfo *T = getDerived().TransformType( 5887 ExceptionDecl->getTypeSourceInfo()); 5888 if (!T) 5889 return StmtError(); 5890 5891 Var = getDerived().RebuildExceptionDecl(ExceptionDecl, T, 5892 ExceptionDecl->getInnerLocStart(), 5893 ExceptionDecl->getLocation(), 5894 ExceptionDecl->getIdentifier()); 5895 if (!Var || Var->isInvalidDecl()) 5896 return StmtError(); 5897 } 5898 5899 // Transform the actual exception handler. 5900 StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 5901 if (Handler.isInvalid()) 5902 return StmtError(); 5903 5904 if (!getDerived().AlwaysRebuild() && 5905 !Var && 5906 Handler.get() == S->getHandlerBlock()) 5907 return SemaRef.Owned(S); 5908 5909 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 5910 Var, 5911 Handler.get()); 5912 } 5913 5914 template<typename Derived> 5915 StmtResult 5916 TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 5917 // Transform the try block itself. 5918 StmtResult TryBlock 5919 = getDerived().TransformCompoundStmt(S->getTryBlock()); 5920 if (TryBlock.isInvalid()) 5921 return StmtError(); 5922 5923 // Transform the handlers. 5924 bool HandlerChanged = false; 5925 SmallVector<Stmt*, 8> Handlers; 5926 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 5927 StmtResult Handler 5928 = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 5929 if (Handler.isInvalid()) 5930 return StmtError(); 5931 5932 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 5933 Handlers.push_back(Handler.takeAs<Stmt>()); 5934 } 5935 5936 if (!getDerived().AlwaysRebuild() && 5937 TryBlock.get() == S->getTryBlock() && 5938 !HandlerChanged) 5939 return SemaRef.Owned(S); 5940 5941 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(), 5942 Handlers); 5943 } 5944 5945 template<typename Derived> 5946 StmtResult 5947 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) { 5948 StmtResult Range = getDerived().TransformStmt(S->getRangeStmt()); 5949 if (Range.isInvalid()) 5950 return StmtError(); 5951 5952 StmtResult BeginEnd = getDerived().TransformStmt(S->getBeginEndStmt()); 5953 if (BeginEnd.isInvalid()) 5954 return StmtError(); 5955 5956 ExprResult Cond = getDerived().TransformExpr(S->getCond()); 5957 if (Cond.isInvalid()) 5958 return StmtError(); 5959 if (Cond.get()) 5960 Cond = SemaRef.CheckBooleanCondition(Cond.take(), S->getColonLoc()); 5961 if (Cond.isInvalid()) 5962 return StmtError(); 5963 if (Cond.get()) 5964 Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.take()); 5965 5966 ExprResult Inc = getDerived().TransformExpr(S->getInc()); 5967 if (Inc.isInvalid()) 5968 return StmtError(); 5969 if (Inc.get()) 5970 Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.take()); 5971 5972 StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt()); 5973 if (LoopVar.isInvalid()) 5974 return StmtError(); 5975 5976 StmtResult NewStmt = S; 5977 if (getDerived().AlwaysRebuild() || 5978 Range.get() != S->getRangeStmt() || 5979 BeginEnd.get() != S->getBeginEndStmt() || 5980 Cond.get() != S->getCond() || 5981 Inc.get() != S->getInc() || 5982 LoopVar.get() != S->getLoopVarStmt()) { 5983 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 5984 S->getColonLoc(), Range.get(), 5985 BeginEnd.get(), Cond.get(), 5986 Inc.get(), LoopVar.get(), 5987 S->getRParenLoc()); 5988 if (NewStmt.isInvalid()) 5989 return StmtError(); 5990 } 5991 5992 StmtResult Body = getDerived().TransformStmt(S->getBody()); 5993 if (Body.isInvalid()) 5994 return StmtError(); 5995 5996 // Body has changed but we didn't rebuild the for-range statement. Rebuild 5997 // it now so we have a new statement to attach the body to. 5998 if (Body.get() != S->getBody() && NewStmt.get() == S) { 5999 NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(), 6000 S->getColonLoc(), Range.get(), 6001 BeginEnd.get(), Cond.get(), 6002 Inc.get(), LoopVar.get(), 6003 S->getRParenLoc()); 6004 if (NewStmt.isInvalid()) 6005 return StmtError(); 6006 } 6007 6008 if (NewStmt.get() == S) 6009 return SemaRef.Owned(S); 6010 6011 return FinishCXXForRangeStmt(NewStmt.get(), Body.get()); 6012 } 6013 6014 template<typename Derived> 6015 StmtResult 6016 TreeTransform<Derived>::TransformMSDependentExistsStmt( 6017 MSDependentExistsStmt *S) { 6018 // Transform the nested-name-specifier, if any. 6019 NestedNameSpecifierLoc QualifierLoc; 6020 if (S->getQualifierLoc()) { 6021 QualifierLoc 6022 = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc()); 6023 if (!QualifierLoc) 6024 return StmtError(); 6025 } 6026 6027 // Transform the declaration name. 6028 DeclarationNameInfo NameInfo = S->getNameInfo(); 6029 if (NameInfo.getName()) { 6030 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 6031 if (!NameInfo.getName()) 6032 return StmtError(); 6033 } 6034 6035 // Check whether anything changed. 6036 if (!getDerived().AlwaysRebuild() && 6037 QualifierLoc == S->getQualifierLoc() && 6038 NameInfo.getName() == S->getNameInfo().getName()) 6039 return S; 6040 6041 // Determine whether this name exists, if we can. 6042 CXXScopeSpec SS; 6043 SS.Adopt(QualifierLoc); 6044 bool Dependent = false; 6045 switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/0, SS, NameInfo)) { 6046 case Sema::IER_Exists: 6047 if (S->isIfExists()) 6048 break; 6049 6050 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 6051 6052 case Sema::IER_DoesNotExist: 6053 if (S->isIfNotExists()) 6054 break; 6055 6056 return new (getSema().Context) NullStmt(S->getKeywordLoc()); 6057 6058 case Sema::IER_Dependent: 6059 Dependent = true; 6060 break; 6061 6062 case Sema::IER_Error: 6063 return StmtError(); 6064 } 6065 6066 // We need to continue with the instantiation, so do so now. 6067 StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt()); 6068 if (SubStmt.isInvalid()) 6069 return StmtError(); 6070 6071 // If we have resolved the name, just transform to the substatement. 6072 if (!Dependent) 6073 return SubStmt; 6074 6075 // The name is still dependent, so build a dependent expression again. 6076 return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(), 6077 S->isIfExists(), 6078 QualifierLoc, 6079 NameInfo, 6080 SubStmt.get()); 6081 } 6082 6083 template<typename Derived> 6084 ExprResult 6085 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) { 6086 NestedNameSpecifierLoc QualifierLoc; 6087 if (E->getQualifierLoc()) { 6088 QualifierLoc 6089 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 6090 if (!QualifierLoc) 6091 return ExprError(); 6092 } 6093 6094 MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>( 6095 getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl())); 6096 if (!PD) 6097 return ExprError(); 6098 6099 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 6100 if (Base.isInvalid()) 6101 return ExprError(); 6102 6103 return new (SemaRef.getASTContext()) 6104 MSPropertyRefExpr(Base.get(), PD, E->isArrow(), 6105 SemaRef.getASTContext().PseudoObjectTy, VK_LValue, 6106 QualifierLoc, E->getMemberLoc()); 6107 } 6108 6109 template<typename Derived> 6110 StmtResult 6111 TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) { 6112 StmtResult TryBlock; // = getDerived().TransformCompoundStmt(S->getTryBlock()); 6113 if(TryBlock.isInvalid()) return StmtError(); 6114 6115 StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler()); 6116 if(!getDerived().AlwaysRebuild() && 6117 TryBlock.get() == S->getTryBlock() && 6118 Handler.get() == S->getHandler()) 6119 return SemaRef.Owned(S); 6120 6121 return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), 6122 S->getTryLoc(), 6123 TryBlock.take(), 6124 Handler.take()); 6125 } 6126 6127 template<typename Derived> 6128 StmtResult 6129 TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) { 6130 StmtResult Block; // = getDerived().TransformCompoundStatement(S->getBlock()); 6131 if(Block.isInvalid()) return StmtError(); 6132 6133 return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), 6134 Block.take()); 6135 } 6136 6137 template<typename Derived> 6138 StmtResult 6139 TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) { 6140 ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr()); 6141 if(FilterExpr.isInvalid()) return StmtError(); 6142 6143 StmtResult Block; // = getDerived().TransformCompoundStatement(S->getBlock()); 6144 if(Block.isInvalid()) return StmtError(); 6145 6146 return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), 6147 FilterExpr.take(), 6148 Block.take()); 6149 } 6150 6151 template<typename Derived> 6152 StmtResult 6153 TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) { 6154 if(isa<SEHFinallyStmt>(Handler)) 6155 return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler)); 6156 else 6157 return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler)); 6158 } 6159 6160 //===----------------------------------------------------------------------===// 6161 // Expression transformation 6162 //===----------------------------------------------------------------------===// 6163 template<typename Derived> 6164 ExprResult 6165 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 6166 return SemaRef.Owned(E); 6167 } 6168 6169 template<typename Derived> 6170 ExprResult 6171 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 6172 NestedNameSpecifierLoc QualifierLoc; 6173 if (E->getQualifierLoc()) { 6174 QualifierLoc 6175 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 6176 if (!QualifierLoc) 6177 return ExprError(); 6178 } 6179 6180 ValueDecl *ND 6181 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(), 6182 E->getDecl())); 6183 if (!ND) 6184 return ExprError(); 6185 6186 DeclarationNameInfo NameInfo = E->getNameInfo(); 6187 if (NameInfo.getName()) { 6188 NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo); 6189 if (!NameInfo.getName()) 6190 return ExprError(); 6191 } 6192 6193 if (!getDerived().AlwaysRebuild() && 6194 QualifierLoc == E->getQualifierLoc() && 6195 ND == E->getDecl() && 6196 NameInfo.getName() == E->getDecl()->getDeclName() && 6197 !E->hasExplicitTemplateArgs()) { 6198 6199 // Mark it referenced in the new context regardless. 6200 // FIXME: this is a bit instantiation-specific. 6201 SemaRef.MarkDeclRefReferenced(E); 6202 6203 return SemaRef.Owned(E); 6204 } 6205 6206 TemplateArgumentListInfo TransArgs, *TemplateArgs = 0; 6207 if (E->hasExplicitTemplateArgs()) { 6208 TemplateArgs = &TransArgs; 6209 TransArgs.setLAngleLoc(E->getLAngleLoc()); 6210 TransArgs.setRAngleLoc(E->getRAngleLoc()); 6211 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 6212 E->getNumTemplateArgs(), 6213 TransArgs)) 6214 return ExprError(); 6215 } 6216 6217 return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo, 6218 TemplateArgs); 6219 } 6220 6221 template<typename Derived> 6222 ExprResult 6223 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 6224 return SemaRef.Owned(E); 6225 } 6226 6227 template<typename Derived> 6228 ExprResult 6229 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 6230 return SemaRef.Owned(E); 6231 } 6232 6233 template<typename Derived> 6234 ExprResult 6235 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 6236 return SemaRef.Owned(E); 6237 } 6238 6239 template<typename Derived> 6240 ExprResult 6241 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 6242 return SemaRef.Owned(E); 6243 } 6244 6245 template<typename Derived> 6246 ExprResult 6247 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 6248 return SemaRef.Owned(E); 6249 } 6250 6251 template<typename Derived> 6252 ExprResult 6253 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) { 6254 if (FunctionDecl *FD = E->getDirectCallee()) 6255 SemaRef.MarkFunctionReferenced(E->getLocStart(), FD); 6256 return SemaRef.MaybeBindToTemporary(E); 6257 } 6258 6259 template<typename Derived> 6260 ExprResult 6261 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) { 6262 ExprResult ControllingExpr = 6263 getDerived().TransformExpr(E->getControllingExpr()); 6264 if (ControllingExpr.isInvalid()) 6265 return ExprError(); 6266 6267 SmallVector<Expr *, 4> AssocExprs; 6268 SmallVector<TypeSourceInfo *, 4> AssocTypes; 6269 for (unsigned i = 0; i != E->getNumAssocs(); ++i) { 6270 TypeSourceInfo *TS = E->getAssocTypeSourceInfo(i); 6271 if (TS) { 6272 TypeSourceInfo *AssocType = getDerived().TransformType(TS); 6273 if (!AssocType) 6274 return ExprError(); 6275 AssocTypes.push_back(AssocType); 6276 } else { 6277 AssocTypes.push_back(0); 6278 } 6279 6280 ExprResult AssocExpr = getDerived().TransformExpr(E->getAssocExpr(i)); 6281 if (AssocExpr.isInvalid()) 6282 return ExprError(); 6283 AssocExprs.push_back(AssocExpr.release()); 6284 } 6285 6286 return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(), 6287 E->getDefaultLoc(), 6288 E->getRParenLoc(), 6289 ControllingExpr.release(), 6290 AssocTypes, 6291 AssocExprs); 6292 } 6293 6294 template<typename Derived> 6295 ExprResult 6296 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 6297 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 6298 if (SubExpr.isInvalid()) 6299 return ExprError(); 6300 6301 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 6302 return SemaRef.Owned(E); 6303 6304 return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(), 6305 E->getRParen()); 6306 } 6307 6308 /// \brief The operand of a unary address-of operator has special rules: it's 6309 /// allowed to refer to a non-static member of a class even if there's no 'this' 6310 /// object available. 6311 template<typename Derived> 6312 ExprResult 6313 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) { 6314 if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E)) 6315 return getDerived().TransformDependentScopeDeclRefExpr(DRE, true); 6316 else 6317 return getDerived().TransformExpr(E); 6318 } 6319 6320 template<typename Derived> 6321 ExprResult 6322 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 6323 ExprResult SubExpr = TransformAddressOfOperand(E->getSubExpr()); 6324 if (SubExpr.isInvalid()) 6325 return ExprError(); 6326 6327 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 6328 return SemaRef.Owned(E); 6329 6330 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 6331 E->getOpcode(), 6332 SubExpr.get()); 6333 } 6334 6335 template<typename Derived> 6336 ExprResult 6337 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) { 6338 // Transform the type. 6339 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo()); 6340 if (!Type) 6341 return ExprError(); 6342 6343 // Transform all of the components into components similar to what the 6344 // parser uses. 6345 // FIXME: It would be slightly more efficient in the non-dependent case to 6346 // just map FieldDecls, rather than requiring the rebuilder to look for 6347 // the fields again. However, __builtin_offsetof is rare enough in 6348 // template code that we don't care. 6349 bool ExprChanged = false; 6350 typedef Sema::OffsetOfComponent Component; 6351 typedef OffsetOfExpr::OffsetOfNode Node; 6352 SmallVector<Component, 4> Components; 6353 for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) { 6354 const Node &ON = E->getComponent(I); 6355 Component Comp; 6356 Comp.isBrackets = true; 6357 Comp.LocStart = ON.getSourceRange().getBegin(); 6358 Comp.LocEnd = ON.getSourceRange().getEnd(); 6359 switch (ON.getKind()) { 6360 case Node::Array: { 6361 Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex()); 6362 ExprResult Index = getDerived().TransformExpr(FromIndex); 6363 if (Index.isInvalid()) 6364 return ExprError(); 6365 6366 ExprChanged = ExprChanged || Index.get() != FromIndex; 6367 Comp.isBrackets = true; 6368 Comp.U.E = Index.get(); 6369 break; 6370 } 6371 6372 case Node::Field: 6373 case Node::Identifier: 6374 Comp.isBrackets = false; 6375 Comp.U.IdentInfo = ON.getFieldName(); 6376 if (!Comp.U.IdentInfo) 6377 continue; 6378 6379 break; 6380 6381 case Node::Base: 6382 // Will be recomputed during the rebuild. 6383 continue; 6384 } 6385 6386 Components.push_back(Comp); 6387 } 6388 6389 // If nothing changed, retain the existing expression. 6390 if (!getDerived().AlwaysRebuild() && 6391 Type == E->getTypeSourceInfo() && 6392 !ExprChanged) 6393 return SemaRef.Owned(E); 6394 6395 // Build a new offsetof expression. 6396 return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type, 6397 Components.data(), Components.size(), 6398 E->getRParenLoc()); 6399 } 6400 6401 template<typename Derived> 6402 ExprResult 6403 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) { 6404 assert(getDerived().AlreadyTransformed(E->getType()) && 6405 "opaque value expression requires transformation"); 6406 return SemaRef.Owned(E); 6407 } 6408 6409 template<typename Derived> 6410 ExprResult 6411 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) { 6412 // Rebuild the syntactic form. The original syntactic form has 6413 // opaque-value expressions in it, so strip those away and rebuild 6414 // the result. This is a really awful way of doing this, but the 6415 // better solution (rebuilding the semantic expressions and 6416 // rebinding OVEs as necessary) doesn't work; we'd need 6417 // TreeTransform to not strip away implicit conversions. 6418 Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E); 6419 ExprResult result = getDerived().TransformExpr(newSyntacticForm); 6420 if (result.isInvalid()) return ExprError(); 6421 6422 // If that gives us a pseudo-object result back, the pseudo-object 6423 // expression must have been an lvalue-to-rvalue conversion which we 6424 // should reapply. 6425 if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject)) 6426 result = SemaRef.checkPseudoObjectRValue(result.take()); 6427 6428 return result; 6429 } 6430 6431 template<typename Derived> 6432 ExprResult 6433 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr( 6434 UnaryExprOrTypeTraitExpr *E) { 6435 if (E->isArgumentType()) { 6436 TypeSourceInfo *OldT = E->getArgumentTypeInfo(); 6437 6438 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 6439 if (!NewT) 6440 return ExprError(); 6441 6442 if (!getDerived().AlwaysRebuild() && OldT == NewT) 6443 return SemaRef.Owned(E); 6444 6445 return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(), 6446 E->getKind(), 6447 E->getSourceRange()); 6448 } 6449 6450 // C++0x [expr.sizeof]p1: 6451 // The operand is either an expression, which is an unevaluated operand 6452 // [...] 6453 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 6454 Sema::ReuseLambdaContextDecl); 6455 6456 ExprResult SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 6457 if (SubExpr.isInvalid()) 6458 return ExprError(); 6459 6460 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 6461 return SemaRef.Owned(E); 6462 6463 return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(), 6464 E->getOperatorLoc(), 6465 E->getKind(), 6466 E->getSourceRange()); 6467 } 6468 6469 template<typename Derived> 6470 ExprResult 6471 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 6472 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 6473 if (LHS.isInvalid()) 6474 return ExprError(); 6475 6476 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 6477 if (RHS.isInvalid()) 6478 return ExprError(); 6479 6480 6481 if (!getDerived().AlwaysRebuild() && 6482 LHS.get() == E->getLHS() && 6483 RHS.get() == E->getRHS()) 6484 return SemaRef.Owned(E); 6485 6486 return getDerived().RebuildArraySubscriptExpr(LHS.get(), 6487 /*FIXME:*/E->getLHS()->getLocStart(), 6488 RHS.get(), 6489 E->getRBracketLoc()); 6490 } 6491 6492 template<typename Derived> 6493 ExprResult 6494 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 6495 // Transform the callee. 6496 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 6497 if (Callee.isInvalid()) 6498 return ExprError(); 6499 6500 // Transform arguments. 6501 bool ArgChanged = false; 6502 SmallVector<Expr*, 8> Args; 6503 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 6504 &ArgChanged)) 6505 return ExprError(); 6506 6507 if (!getDerived().AlwaysRebuild() && 6508 Callee.get() == E->getCallee() && 6509 !ArgChanged) 6510 return SemaRef.MaybeBindToTemporary(E); 6511 6512 // FIXME: Wrong source location information for the '('. 6513 SourceLocation FakeLParenLoc 6514 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 6515 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 6516 Args, 6517 E->getRParenLoc()); 6518 } 6519 6520 template<typename Derived> 6521 ExprResult 6522 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 6523 ExprResult Base = getDerived().TransformExpr(E->getBase()); 6524 if (Base.isInvalid()) 6525 return ExprError(); 6526 6527 NestedNameSpecifierLoc QualifierLoc; 6528 if (E->hasQualifier()) { 6529 QualifierLoc 6530 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc()); 6531 6532 if (!QualifierLoc) 6533 return ExprError(); 6534 } 6535 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 6536 6537 ValueDecl *Member 6538 = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(), 6539 E->getMemberDecl())); 6540 if (!Member) 6541 return ExprError(); 6542 6543 NamedDecl *FoundDecl = E->getFoundDecl(); 6544 if (FoundDecl == E->getMemberDecl()) { 6545 FoundDecl = Member; 6546 } else { 6547 FoundDecl = cast_or_null<NamedDecl>( 6548 getDerived().TransformDecl(E->getMemberLoc(), FoundDecl)); 6549 if (!FoundDecl) 6550 return ExprError(); 6551 } 6552 6553 if (!getDerived().AlwaysRebuild() && 6554 Base.get() == E->getBase() && 6555 QualifierLoc == E->getQualifierLoc() && 6556 Member == E->getMemberDecl() && 6557 FoundDecl == E->getFoundDecl() && 6558 !E->hasExplicitTemplateArgs()) { 6559 6560 // Mark it referenced in the new context regardless. 6561 // FIXME: this is a bit instantiation-specific. 6562 SemaRef.MarkMemberReferenced(E); 6563 6564 return SemaRef.Owned(E); 6565 } 6566 6567 TemplateArgumentListInfo TransArgs; 6568 if (E->hasExplicitTemplateArgs()) { 6569 TransArgs.setLAngleLoc(E->getLAngleLoc()); 6570 TransArgs.setRAngleLoc(E->getRAngleLoc()); 6571 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 6572 E->getNumTemplateArgs(), 6573 TransArgs)) 6574 return ExprError(); 6575 } 6576 6577 // FIXME: Bogus source location for the operator 6578 SourceLocation FakeOperatorLoc 6579 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 6580 6581 // FIXME: to do this check properly, we will need to preserve the 6582 // first-qualifier-in-scope here, just in case we had a dependent 6583 // base (and therefore couldn't do the check) and a 6584 // nested-name-qualifier (and therefore could do the lookup). 6585 NamedDecl *FirstQualifierInScope = 0; 6586 6587 return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc, 6588 E->isArrow(), 6589 QualifierLoc, 6590 TemplateKWLoc, 6591 E->getMemberNameInfo(), 6592 Member, 6593 FoundDecl, 6594 (E->hasExplicitTemplateArgs() 6595 ? &TransArgs : 0), 6596 FirstQualifierInScope); 6597 } 6598 6599 template<typename Derived> 6600 ExprResult 6601 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 6602 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 6603 if (LHS.isInvalid()) 6604 return ExprError(); 6605 6606 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 6607 if (RHS.isInvalid()) 6608 return ExprError(); 6609 6610 if (!getDerived().AlwaysRebuild() && 6611 LHS.get() == E->getLHS() && 6612 RHS.get() == E->getRHS()) 6613 return SemaRef.Owned(E); 6614 6615 Sema::FPContractStateRAII FPContractState(getSema()); 6616 getSema().FPFeatures.fp_contract = E->isFPContractable(); 6617 6618 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 6619 LHS.get(), RHS.get()); 6620 } 6621 6622 template<typename Derived> 6623 ExprResult 6624 TreeTransform<Derived>::TransformCompoundAssignOperator( 6625 CompoundAssignOperator *E) { 6626 return getDerived().TransformBinaryOperator(E); 6627 } 6628 6629 template<typename Derived> 6630 ExprResult TreeTransform<Derived>:: 6631 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) { 6632 // Just rebuild the common and RHS expressions and see whether we 6633 // get any changes. 6634 6635 ExprResult commonExpr = getDerived().TransformExpr(e->getCommon()); 6636 if (commonExpr.isInvalid()) 6637 return ExprError(); 6638 6639 ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr()); 6640 if (rhs.isInvalid()) 6641 return ExprError(); 6642 6643 if (!getDerived().AlwaysRebuild() && 6644 commonExpr.get() == e->getCommon() && 6645 rhs.get() == e->getFalseExpr()) 6646 return SemaRef.Owned(e); 6647 6648 return getDerived().RebuildConditionalOperator(commonExpr.take(), 6649 e->getQuestionLoc(), 6650 0, 6651 e->getColonLoc(), 6652 rhs.get()); 6653 } 6654 6655 template<typename Derived> 6656 ExprResult 6657 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 6658 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 6659 if (Cond.isInvalid()) 6660 return ExprError(); 6661 6662 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 6663 if (LHS.isInvalid()) 6664 return ExprError(); 6665 6666 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 6667 if (RHS.isInvalid()) 6668 return ExprError(); 6669 6670 if (!getDerived().AlwaysRebuild() && 6671 Cond.get() == E->getCond() && 6672 LHS.get() == E->getLHS() && 6673 RHS.get() == E->getRHS()) 6674 return SemaRef.Owned(E); 6675 6676 return getDerived().RebuildConditionalOperator(Cond.get(), 6677 E->getQuestionLoc(), 6678 LHS.get(), 6679 E->getColonLoc(), 6680 RHS.get()); 6681 } 6682 6683 template<typename Derived> 6684 ExprResult 6685 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 6686 // Implicit casts are eliminated during transformation, since they 6687 // will be recomputed by semantic analysis after transformation. 6688 return getDerived().TransformExpr(E->getSubExprAsWritten()); 6689 } 6690 6691 template<typename Derived> 6692 ExprResult 6693 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 6694 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 6695 if (!Type) 6696 return ExprError(); 6697 6698 ExprResult SubExpr 6699 = getDerived().TransformExpr(E->getSubExprAsWritten()); 6700 if (SubExpr.isInvalid()) 6701 return ExprError(); 6702 6703 if (!getDerived().AlwaysRebuild() && 6704 Type == E->getTypeInfoAsWritten() && 6705 SubExpr.get() == E->getSubExpr()) 6706 return SemaRef.Owned(E); 6707 6708 return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(), 6709 Type, 6710 E->getRParenLoc(), 6711 SubExpr.get()); 6712 } 6713 6714 template<typename Derived> 6715 ExprResult 6716 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 6717 TypeSourceInfo *OldT = E->getTypeSourceInfo(); 6718 TypeSourceInfo *NewT = getDerived().TransformType(OldT); 6719 if (!NewT) 6720 return ExprError(); 6721 6722 ExprResult Init = getDerived().TransformExpr(E->getInitializer()); 6723 if (Init.isInvalid()) 6724 return ExprError(); 6725 6726 if (!getDerived().AlwaysRebuild() && 6727 OldT == NewT && 6728 Init.get() == E->getInitializer()) 6729 return SemaRef.MaybeBindToTemporary(E); 6730 6731 // Note: the expression type doesn't necessarily match the 6732 // type-as-written, but that's okay, because it should always be 6733 // derivable from the initializer. 6734 6735 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), NewT, 6736 /*FIXME:*/E->getInitializer()->getLocEnd(), 6737 Init.get()); 6738 } 6739 6740 template<typename Derived> 6741 ExprResult 6742 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 6743 ExprResult Base = getDerived().TransformExpr(E->getBase()); 6744 if (Base.isInvalid()) 6745 return ExprError(); 6746 6747 if (!getDerived().AlwaysRebuild() && 6748 Base.get() == E->getBase()) 6749 return SemaRef.Owned(E); 6750 6751 // FIXME: Bad source location 6752 SourceLocation FakeOperatorLoc 6753 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 6754 return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc, 6755 E->getAccessorLoc(), 6756 E->getAccessor()); 6757 } 6758 6759 template<typename Derived> 6760 ExprResult 6761 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 6762 bool InitChanged = false; 6763 6764 SmallVector<Expr*, 4> Inits; 6765 if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false, 6766 Inits, &InitChanged)) 6767 return ExprError(); 6768 6769 if (!getDerived().AlwaysRebuild() && !InitChanged) 6770 return SemaRef.Owned(E); 6771 6772 return getDerived().RebuildInitList(E->getLBraceLoc(), Inits, 6773 E->getRBraceLoc(), E->getType()); 6774 } 6775 6776 template<typename Derived> 6777 ExprResult 6778 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 6779 Designation Desig; 6780 6781 // transform the initializer value 6782 ExprResult Init = getDerived().TransformExpr(E->getInit()); 6783 if (Init.isInvalid()) 6784 return ExprError(); 6785 6786 // transform the designators. 6787 SmallVector<Expr*, 4> ArrayExprs; 6788 bool ExprChanged = false; 6789 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 6790 DEnd = E->designators_end(); 6791 D != DEnd; ++D) { 6792 if (D->isFieldDesignator()) { 6793 Desig.AddDesignator(Designator::getField(D->getFieldName(), 6794 D->getDotLoc(), 6795 D->getFieldLoc())); 6796 continue; 6797 } 6798 6799 if (D->isArrayDesignator()) { 6800 ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 6801 if (Index.isInvalid()) 6802 return ExprError(); 6803 6804 Desig.AddDesignator(Designator::getArray(Index.get(), 6805 D->getLBracketLoc())); 6806 6807 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 6808 ArrayExprs.push_back(Index.release()); 6809 continue; 6810 } 6811 6812 assert(D->isArrayRangeDesignator() && "New kind of designator?"); 6813 ExprResult Start 6814 = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 6815 if (Start.isInvalid()) 6816 return ExprError(); 6817 6818 ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 6819 if (End.isInvalid()) 6820 return ExprError(); 6821 6822 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 6823 End.get(), 6824 D->getLBracketLoc(), 6825 D->getEllipsisLoc())); 6826 6827 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 6828 End.get() != E->getArrayRangeEnd(*D); 6829 6830 ArrayExprs.push_back(Start.release()); 6831 ArrayExprs.push_back(End.release()); 6832 } 6833 6834 if (!getDerived().AlwaysRebuild() && 6835 Init.get() == E->getInit() && 6836 !ExprChanged) 6837 return SemaRef.Owned(E); 6838 6839 return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs, 6840 E->getEqualOrColonLoc(), 6841 E->usesGNUSyntax(), Init.get()); 6842 } 6843 6844 template<typename Derived> 6845 ExprResult 6846 TreeTransform<Derived>::TransformImplicitValueInitExpr( 6847 ImplicitValueInitExpr *E) { 6848 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 6849 6850 // FIXME: Will we ever have proper type location here? Will we actually 6851 // need to transform the type? 6852 QualType T = getDerived().TransformType(E->getType()); 6853 if (T.isNull()) 6854 return ExprError(); 6855 6856 if (!getDerived().AlwaysRebuild() && 6857 T == E->getType()) 6858 return SemaRef.Owned(E); 6859 6860 return getDerived().RebuildImplicitValueInitExpr(T); 6861 } 6862 6863 template<typename Derived> 6864 ExprResult 6865 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 6866 TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo()); 6867 if (!TInfo) 6868 return ExprError(); 6869 6870 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 6871 if (SubExpr.isInvalid()) 6872 return ExprError(); 6873 6874 if (!getDerived().AlwaysRebuild() && 6875 TInfo == E->getWrittenTypeInfo() && 6876 SubExpr.get() == E->getSubExpr()) 6877 return SemaRef.Owned(E); 6878 6879 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(), 6880 TInfo, E->getRParenLoc()); 6881 } 6882 6883 template<typename Derived> 6884 ExprResult 6885 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 6886 bool ArgumentChanged = false; 6887 SmallVector<Expr*, 4> Inits; 6888 if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits, 6889 &ArgumentChanged)) 6890 return ExprError(); 6891 6892 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 6893 Inits, 6894 E->getRParenLoc()); 6895 } 6896 6897 /// \brief Transform an address-of-label expression. 6898 /// 6899 /// By default, the transformation of an address-of-label expression always 6900 /// rebuilds the expression, so that the label identifier can be resolved to 6901 /// the corresponding label statement by semantic analysis. 6902 template<typename Derived> 6903 ExprResult 6904 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 6905 Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(), 6906 E->getLabel()); 6907 if (!LD) 6908 return ExprError(); 6909 6910 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 6911 cast<LabelDecl>(LD)); 6912 } 6913 6914 template<typename Derived> 6915 ExprResult 6916 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 6917 SemaRef.ActOnStartStmtExpr(); 6918 StmtResult SubStmt 6919 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 6920 if (SubStmt.isInvalid()) { 6921 SemaRef.ActOnStmtExprError(); 6922 return ExprError(); 6923 } 6924 6925 if (!getDerived().AlwaysRebuild() && 6926 SubStmt.get() == E->getSubStmt()) { 6927 // Calling this an 'error' is unintuitive, but it does the right thing. 6928 SemaRef.ActOnStmtExprError(); 6929 return SemaRef.MaybeBindToTemporary(E); 6930 } 6931 6932 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 6933 SubStmt.get(), 6934 E->getRParenLoc()); 6935 } 6936 6937 template<typename Derived> 6938 ExprResult 6939 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 6940 ExprResult Cond = getDerived().TransformExpr(E->getCond()); 6941 if (Cond.isInvalid()) 6942 return ExprError(); 6943 6944 ExprResult LHS = getDerived().TransformExpr(E->getLHS()); 6945 if (LHS.isInvalid()) 6946 return ExprError(); 6947 6948 ExprResult RHS = getDerived().TransformExpr(E->getRHS()); 6949 if (RHS.isInvalid()) 6950 return ExprError(); 6951 6952 if (!getDerived().AlwaysRebuild() && 6953 Cond.get() == E->getCond() && 6954 LHS.get() == E->getLHS() && 6955 RHS.get() == E->getRHS()) 6956 return SemaRef.Owned(E); 6957 6958 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 6959 Cond.get(), LHS.get(), RHS.get(), 6960 E->getRParenLoc()); 6961 } 6962 6963 template<typename Derived> 6964 ExprResult 6965 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 6966 return SemaRef.Owned(E); 6967 } 6968 6969 template<typename Derived> 6970 ExprResult 6971 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 6972 switch (E->getOperator()) { 6973 case OO_New: 6974 case OO_Delete: 6975 case OO_Array_New: 6976 case OO_Array_Delete: 6977 llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr"); 6978 6979 case OO_Call: { 6980 // This is a call to an object's operator(). 6981 assert(E->getNumArgs() >= 1 && "Object call is missing arguments"); 6982 6983 // Transform the object itself. 6984 ExprResult Object = getDerived().TransformExpr(E->getArg(0)); 6985 if (Object.isInvalid()) 6986 return ExprError(); 6987 6988 // FIXME: Poor location information 6989 SourceLocation FakeLParenLoc 6990 = SemaRef.PP.getLocForEndOfToken( 6991 static_cast<Expr *>(Object.get())->getLocEnd()); 6992 6993 // Transform the call arguments. 6994 SmallVector<Expr*, 8> Args; 6995 if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true, 6996 Args)) 6997 return ExprError(); 6998 6999 return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, 7000 Args, 7001 E->getLocEnd()); 7002 } 7003 7004 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \ 7005 case OO_##Name: 7006 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly) 7007 #include "clang/Basic/OperatorKinds.def" 7008 case OO_Subscript: 7009 // Handled below. 7010 break; 7011 7012 case OO_Conditional: 7013 llvm_unreachable("conditional operator is not actually overloadable"); 7014 7015 case OO_None: 7016 case NUM_OVERLOADED_OPERATORS: 7017 llvm_unreachable("not an overloaded operator?"); 7018 } 7019 7020 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 7021 if (Callee.isInvalid()) 7022 return ExprError(); 7023 7024 ExprResult First; 7025 if (E->getOperator() == OO_Amp) 7026 First = getDerived().TransformAddressOfOperand(E->getArg(0)); 7027 else 7028 First = getDerived().TransformExpr(E->getArg(0)); 7029 if (First.isInvalid()) 7030 return ExprError(); 7031 7032 ExprResult Second; 7033 if (E->getNumArgs() == 2) { 7034 Second = getDerived().TransformExpr(E->getArg(1)); 7035 if (Second.isInvalid()) 7036 return ExprError(); 7037 } 7038 7039 if (!getDerived().AlwaysRebuild() && 7040 Callee.get() == E->getCallee() && 7041 First.get() == E->getArg(0) && 7042 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 7043 return SemaRef.MaybeBindToTemporary(E); 7044 7045 Sema::FPContractStateRAII FPContractState(getSema()); 7046 getSema().FPFeatures.fp_contract = E->isFPContractable(); 7047 7048 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 7049 E->getOperatorLoc(), 7050 Callee.get(), 7051 First.get(), 7052 Second.get()); 7053 } 7054 7055 template<typename Derived> 7056 ExprResult 7057 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 7058 return getDerived().TransformCallExpr(E); 7059 } 7060 7061 template<typename Derived> 7062 ExprResult 7063 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) { 7064 // Transform the callee. 7065 ExprResult Callee = getDerived().TransformExpr(E->getCallee()); 7066 if (Callee.isInvalid()) 7067 return ExprError(); 7068 7069 // Transform exec config. 7070 ExprResult EC = getDerived().TransformCallExpr(E->getConfig()); 7071 if (EC.isInvalid()) 7072 return ExprError(); 7073 7074 // Transform arguments. 7075 bool ArgChanged = false; 7076 SmallVector<Expr*, 8> Args; 7077 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args, 7078 &ArgChanged)) 7079 return ExprError(); 7080 7081 if (!getDerived().AlwaysRebuild() && 7082 Callee.get() == E->getCallee() && 7083 !ArgChanged) 7084 return SemaRef.MaybeBindToTemporary(E); 7085 7086 // FIXME: Wrong source location information for the '('. 7087 SourceLocation FakeLParenLoc 7088 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 7089 return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc, 7090 Args, 7091 E->getRParenLoc(), EC.get()); 7092 } 7093 7094 template<typename Derived> 7095 ExprResult 7096 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 7097 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 7098 if (!Type) 7099 return ExprError(); 7100 7101 ExprResult SubExpr 7102 = getDerived().TransformExpr(E->getSubExprAsWritten()); 7103 if (SubExpr.isInvalid()) 7104 return ExprError(); 7105 7106 if (!getDerived().AlwaysRebuild() && 7107 Type == E->getTypeInfoAsWritten() && 7108 SubExpr.get() == E->getSubExpr()) 7109 return SemaRef.Owned(E); 7110 return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 7111 E->getStmtClass(), 7112 E->getAngleBrackets().getBegin(), 7113 Type, 7114 E->getAngleBrackets().getEnd(), 7115 // FIXME. this should be '(' location 7116 E->getAngleBrackets().getEnd(), 7117 SubExpr.get(), 7118 E->getRParenLoc()); 7119 } 7120 7121 template<typename Derived> 7122 ExprResult 7123 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 7124 return getDerived().TransformCXXNamedCastExpr(E); 7125 } 7126 7127 template<typename Derived> 7128 ExprResult 7129 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 7130 return getDerived().TransformCXXNamedCastExpr(E); 7131 } 7132 7133 template<typename Derived> 7134 ExprResult 7135 TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 7136 CXXReinterpretCastExpr *E) { 7137 return getDerived().TransformCXXNamedCastExpr(E); 7138 } 7139 7140 template<typename Derived> 7141 ExprResult 7142 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 7143 return getDerived().TransformCXXNamedCastExpr(E); 7144 } 7145 7146 template<typename Derived> 7147 ExprResult 7148 TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 7149 CXXFunctionalCastExpr *E) { 7150 TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten()); 7151 if (!Type) 7152 return ExprError(); 7153 7154 ExprResult SubExpr 7155 = getDerived().TransformExpr(E->getSubExprAsWritten()); 7156 if (SubExpr.isInvalid()) 7157 return ExprError(); 7158 7159 if (!getDerived().AlwaysRebuild() && 7160 Type == E->getTypeInfoAsWritten() && 7161 SubExpr.get() == E->getSubExpr()) 7162 return SemaRef.Owned(E); 7163 7164 return getDerived().RebuildCXXFunctionalCastExpr(Type, 7165 /*FIXME:*/E->getSubExpr()->getLocStart(), 7166 SubExpr.get(), 7167 E->getRParenLoc()); 7168 } 7169 7170 template<typename Derived> 7171 ExprResult 7172 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 7173 if (E->isTypeOperand()) { 7174 TypeSourceInfo *TInfo 7175 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 7176 if (!TInfo) 7177 return ExprError(); 7178 7179 if (!getDerived().AlwaysRebuild() && 7180 TInfo == E->getTypeOperandSourceInfo()) 7181 return SemaRef.Owned(E); 7182 7183 return getDerived().RebuildCXXTypeidExpr(E->getType(), 7184 E->getLocStart(), 7185 TInfo, 7186 E->getLocEnd()); 7187 } 7188 7189 // We don't know whether the subexpression is potentially evaluated until 7190 // after we perform semantic analysis. We speculatively assume it is 7191 // unevaluated; it will get fixed later if the subexpression is in fact 7192 // potentially evaluated. 7193 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated, 7194 Sema::ReuseLambdaContextDecl); 7195 7196 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 7197 if (SubExpr.isInvalid()) 7198 return ExprError(); 7199 7200 if (!getDerived().AlwaysRebuild() && 7201 SubExpr.get() == E->getExprOperand()) 7202 return SemaRef.Owned(E); 7203 7204 return getDerived().RebuildCXXTypeidExpr(E->getType(), 7205 E->getLocStart(), 7206 SubExpr.get(), 7207 E->getLocEnd()); 7208 } 7209 7210 template<typename Derived> 7211 ExprResult 7212 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) { 7213 if (E->isTypeOperand()) { 7214 TypeSourceInfo *TInfo 7215 = getDerived().TransformType(E->getTypeOperandSourceInfo()); 7216 if (!TInfo) 7217 return ExprError(); 7218 7219 if (!getDerived().AlwaysRebuild() && 7220 TInfo == E->getTypeOperandSourceInfo()) 7221 return SemaRef.Owned(E); 7222 7223 return getDerived().RebuildCXXUuidofExpr(E->getType(), 7224 E->getLocStart(), 7225 TInfo, 7226 E->getLocEnd()); 7227 } 7228 7229 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 7230 7231 ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 7232 if (SubExpr.isInvalid()) 7233 return ExprError(); 7234 7235 if (!getDerived().AlwaysRebuild() && 7236 SubExpr.get() == E->getExprOperand()) 7237 return SemaRef.Owned(E); 7238 7239 return getDerived().RebuildCXXUuidofExpr(E->getType(), 7240 E->getLocStart(), 7241 SubExpr.get(), 7242 E->getLocEnd()); 7243 } 7244 7245 template<typename Derived> 7246 ExprResult 7247 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 7248 return SemaRef.Owned(E); 7249 } 7250 7251 template<typename Derived> 7252 ExprResult 7253 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 7254 CXXNullPtrLiteralExpr *E) { 7255 return SemaRef.Owned(E); 7256 } 7257 7258 template<typename Derived> 7259 ExprResult 7260 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 7261 DeclContext *DC = getSema().getFunctionLevelDeclContext(); 7262 QualType T; 7263 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DC)) 7264 T = MD->getThisType(getSema().Context); 7265 else if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(DC)) { 7266 T = getSema().Context.getPointerType( 7267 getSema().Context.getRecordType(Record)); 7268 } else { 7269 assert(SemaRef.Context.getDiagnostics().hasErrorOccurred() && 7270 "this in the wrong scope?"); 7271 return ExprError(); 7272 } 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 // Introduce the context of the call operator. 8078 Sema::ContextRAII SavedContext(getSema(), CallOperator); 8079 8080 // Enter the scope of the lambda. 8081 sema::LambdaScopeInfo *LSI 8082 = getSema().enterLambdaScope(CallOperator, E->getIntroducerRange(), 8083 E->getCaptureDefault(), 8084 E->hasExplicitParameters(), 8085 E->hasExplicitResultType(), 8086 E->isMutable()); 8087 8088 // Transform captures. 8089 bool Invalid = false; 8090 bool FinishedExplicitCaptures = false; 8091 for (LambdaExpr::capture_iterator C = E->capture_begin(), 8092 CEnd = E->capture_end(); 8093 C != CEnd; ++C) { 8094 // When we hit the first implicit capture, tell Sema that we've finished 8095 // the list of explicit captures. 8096 if (!FinishedExplicitCaptures && C->isImplicit()) { 8097 getSema().finishLambdaExplicitCaptures(LSI); 8098 FinishedExplicitCaptures = true; 8099 } 8100 8101 // Capturing 'this' is trivial. 8102 if (C->capturesThis()) { 8103 getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit()); 8104 continue; 8105 } 8106 8107 // Determine the capture kind for Sema. 8108 Sema::TryCaptureKind Kind 8109 = C->isImplicit()? Sema::TryCapture_Implicit 8110 : C->getCaptureKind() == LCK_ByCopy 8111 ? Sema::TryCapture_ExplicitByVal 8112 : Sema::TryCapture_ExplicitByRef; 8113 SourceLocation EllipsisLoc; 8114 if (C->isPackExpansion()) { 8115 UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation()); 8116 bool ShouldExpand = false; 8117 bool RetainExpansion = false; 8118 Optional<unsigned> NumExpansions; 8119 if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(), 8120 C->getLocation(), 8121 Unexpanded, 8122 ShouldExpand, RetainExpansion, 8123 NumExpansions)) 8124 return ExprError(); 8125 8126 if (ShouldExpand) { 8127 // The transform has determined that we should perform an expansion; 8128 // transform and capture each of the arguments. 8129 // expansion of the pattern. Do so. 8130 VarDecl *Pack = C->getCapturedVar(); 8131 for (unsigned I = 0; I != *NumExpansions; ++I) { 8132 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 8133 VarDecl *CapturedVar 8134 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 8135 Pack)); 8136 if (!CapturedVar) { 8137 Invalid = true; 8138 continue; 8139 } 8140 8141 // Capture the transformed variable. 8142 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 8143 } 8144 continue; 8145 } 8146 8147 EllipsisLoc = C->getEllipsisLoc(); 8148 } 8149 8150 // Transform the captured variable. 8151 VarDecl *CapturedVar 8152 = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(), 8153 C->getCapturedVar())); 8154 if (!CapturedVar) { 8155 Invalid = true; 8156 continue; 8157 } 8158 8159 // Capture the transformed variable. 8160 getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind); 8161 } 8162 if (!FinishedExplicitCaptures) 8163 getSema().finishLambdaExplicitCaptures(LSI); 8164 8165 8166 // Enter a new evaluation context to insulate the lambda from any 8167 // cleanups from the enclosing full-expression. 8168 getSema().PushExpressionEvaluationContext(Sema::PotentiallyEvaluated); 8169 8170 if (Invalid) { 8171 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/0, 8172 /*IsInstantiation=*/true); 8173 return ExprError(); 8174 } 8175 8176 // Instantiate the body of the lambda expression. 8177 StmtResult Body = getDerived().TransformStmt(E->getBody()); 8178 if (Body.isInvalid()) { 8179 getSema().ActOnLambdaError(E->getLocStart(), /*CurScope=*/0, 8180 /*IsInstantiation=*/true); 8181 return ExprError(); 8182 } 8183 8184 return getSema().ActOnLambdaExpr(E->getLocStart(), Body.take(), 8185 /*CurScope=*/0, /*IsInstantiation=*/true); 8186 } 8187 8188 template<typename Derived> 8189 ExprResult 8190 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 8191 CXXUnresolvedConstructExpr *E) { 8192 TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo()); 8193 if (!T) 8194 return ExprError(); 8195 8196 bool ArgumentChanged = false; 8197 SmallVector<Expr*, 8> Args; 8198 Args.reserve(E->arg_size()); 8199 if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args, 8200 &ArgumentChanged)) 8201 return ExprError(); 8202 8203 if (!getDerived().AlwaysRebuild() && 8204 T == E->getTypeSourceInfo() && 8205 !ArgumentChanged) 8206 return SemaRef.Owned(E); 8207 8208 // FIXME: we're faking the locations of the commas 8209 return getDerived().RebuildCXXUnresolvedConstructExpr(T, 8210 E->getLParenLoc(), 8211 Args, 8212 E->getRParenLoc()); 8213 } 8214 8215 template<typename Derived> 8216 ExprResult 8217 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr( 8218 CXXDependentScopeMemberExpr *E) { 8219 // Transform the base of the expression. 8220 ExprResult Base((Expr*) 0); 8221 Expr *OldBase; 8222 QualType BaseType; 8223 QualType ObjectType; 8224 if (!E->isImplicitAccess()) { 8225 OldBase = E->getBase(); 8226 Base = getDerived().TransformExpr(OldBase); 8227 if (Base.isInvalid()) 8228 return ExprError(); 8229 8230 // Start the member reference and compute the object's type. 8231 ParsedType ObjectTy; 8232 bool MayBePseudoDestructor = false; 8233 Base = SemaRef.ActOnStartCXXMemberReference(0, Base.get(), 8234 E->getOperatorLoc(), 8235 E->isArrow()? tok::arrow : tok::period, 8236 ObjectTy, 8237 MayBePseudoDestructor); 8238 if (Base.isInvalid()) 8239 return ExprError(); 8240 8241 ObjectType = ObjectTy.get(); 8242 BaseType = ((Expr*) Base.get())->getType(); 8243 } else { 8244 OldBase = 0; 8245 BaseType = getDerived().TransformType(E->getBaseType()); 8246 ObjectType = BaseType->getAs<PointerType>()->getPointeeType(); 8247 } 8248 8249 // Transform the first part of the nested-name-specifier that qualifies 8250 // the member name. 8251 NamedDecl *FirstQualifierInScope 8252 = getDerived().TransformFirstQualifierInScope( 8253 E->getFirstQualifierFoundInScope(), 8254 E->getQualifierLoc().getBeginLoc()); 8255 8256 NestedNameSpecifierLoc QualifierLoc; 8257 if (E->getQualifier()) { 8258 QualifierLoc 8259 = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(), 8260 ObjectType, 8261 FirstQualifierInScope); 8262 if (!QualifierLoc) 8263 return ExprError(); 8264 } 8265 8266 SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc(); 8267 8268 // TODO: If this is a conversion-function-id, verify that the 8269 // destination type name (if present) resolves the same way after 8270 // instantiation as it did in the local scope. 8271 8272 DeclarationNameInfo NameInfo 8273 = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo()); 8274 if (!NameInfo.getName()) 8275 return ExprError(); 8276 8277 if (!E->hasExplicitTemplateArgs()) { 8278 // This is a reference to a member without an explicitly-specified 8279 // template argument list. Optimize for this common case. 8280 if (!getDerived().AlwaysRebuild() && 8281 Base.get() == OldBase && 8282 BaseType == E->getBaseType() && 8283 QualifierLoc == E->getQualifierLoc() && 8284 NameInfo.getName() == E->getMember() && 8285 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 8286 return SemaRef.Owned(E); 8287 8288 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 8289 BaseType, 8290 E->isArrow(), 8291 E->getOperatorLoc(), 8292 QualifierLoc, 8293 TemplateKWLoc, 8294 FirstQualifierInScope, 8295 NameInfo, 8296 /*TemplateArgs*/ 0); 8297 } 8298 8299 TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc()); 8300 if (getDerived().TransformTemplateArguments(E->getTemplateArgs(), 8301 E->getNumTemplateArgs(), 8302 TransArgs)) 8303 return ExprError(); 8304 8305 return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(), 8306 BaseType, 8307 E->isArrow(), 8308 E->getOperatorLoc(), 8309 QualifierLoc, 8310 TemplateKWLoc, 8311 FirstQualifierInScope, 8312 NameInfo, 8313 &TransArgs); 8314 } 8315 8316 template<typename Derived> 8317 ExprResult 8318 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) { 8319 // Transform the base of the expression. 8320 ExprResult Base((Expr*) 0); 8321 QualType BaseType; 8322 if (!Old->isImplicitAccess()) { 8323 Base = getDerived().TransformExpr(Old->getBase()); 8324 if (Base.isInvalid()) 8325 return ExprError(); 8326 Base = getSema().PerformMemberExprBaseConversion(Base.take(), 8327 Old->isArrow()); 8328 if (Base.isInvalid()) 8329 return ExprError(); 8330 BaseType = Base.get()->getType(); 8331 } else { 8332 BaseType = getDerived().TransformType(Old->getBaseType()); 8333 } 8334 8335 NestedNameSpecifierLoc QualifierLoc; 8336 if (Old->getQualifierLoc()) { 8337 QualifierLoc 8338 = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc()); 8339 if (!QualifierLoc) 8340 return ExprError(); 8341 } 8342 8343 SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc(); 8344 8345 LookupResult R(SemaRef, Old->getMemberNameInfo(), 8346 Sema::LookupOrdinaryName); 8347 8348 // Transform all the decls. 8349 for (UnresolvedMemberExpr::decls_iterator I = Old->decls_begin(), 8350 E = Old->decls_end(); I != E; ++I) { 8351 NamedDecl *InstD = static_cast<NamedDecl*>( 8352 getDerived().TransformDecl(Old->getMemberLoc(), 8353 *I)); 8354 if (!InstD) { 8355 // Silently ignore these if a UsingShadowDecl instantiated to nothing. 8356 // This can happen because of dependent hiding. 8357 if (isa<UsingShadowDecl>(*I)) 8358 continue; 8359 else { 8360 R.clear(); 8361 return ExprError(); 8362 } 8363 } 8364 8365 // Expand using declarations. 8366 if (isa<UsingDecl>(InstD)) { 8367 UsingDecl *UD = cast<UsingDecl>(InstD); 8368 for (UsingDecl::shadow_iterator I = UD->shadow_begin(), 8369 E = UD->shadow_end(); I != E; ++I) 8370 R.addDecl(*I); 8371 continue; 8372 } 8373 8374 R.addDecl(InstD); 8375 } 8376 8377 R.resolveKind(); 8378 8379 // Determine the naming class. 8380 if (Old->getNamingClass()) { 8381 CXXRecordDecl *NamingClass 8382 = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl( 8383 Old->getMemberLoc(), 8384 Old->getNamingClass())); 8385 if (!NamingClass) 8386 return ExprError(); 8387 8388 R.setNamingClass(NamingClass); 8389 } 8390 8391 TemplateArgumentListInfo TransArgs; 8392 if (Old->hasExplicitTemplateArgs()) { 8393 TransArgs.setLAngleLoc(Old->getLAngleLoc()); 8394 TransArgs.setRAngleLoc(Old->getRAngleLoc()); 8395 if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(), 8396 Old->getNumTemplateArgs(), 8397 TransArgs)) 8398 return ExprError(); 8399 } 8400 8401 // FIXME: to do this check properly, we will need to preserve the 8402 // first-qualifier-in-scope here, just in case we had a dependent 8403 // base (and therefore couldn't do the check) and a 8404 // nested-name-qualifier (and therefore could do the lookup). 8405 NamedDecl *FirstQualifierInScope = 0; 8406 8407 return getDerived().RebuildUnresolvedMemberExpr(Base.get(), 8408 BaseType, 8409 Old->getOperatorLoc(), 8410 Old->isArrow(), 8411 QualifierLoc, 8412 TemplateKWLoc, 8413 FirstQualifierInScope, 8414 R, 8415 (Old->hasExplicitTemplateArgs() 8416 ? &TransArgs : 0)); 8417 } 8418 8419 template<typename Derived> 8420 ExprResult 8421 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) { 8422 EnterExpressionEvaluationContext Unevaluated(SemaRef, Sema::Unevaluated); 8423 ExprResult SubExpr = getDerived().TransformExpr(E->getOperand()); 8424 if (SubExpr.isInvalid()) 8425 return ExprError(); 8426 8427 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand()) 8428 return SemaRef.Owned(E); 8429 8430 return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get()); 8431 } 8432 8433 template<typename Derived> 8434 ExprResult 8435 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) { 8436 ExprResult Pattern = getDerived().TransformExpr(E->getPattern()); 8437 if (Pattern.isInvalid()) 8438 return ExprError(); 8439 8440 if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern()) 8441 return SemaRef.Owned(E); 8442 8443 return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(), 8444 E->getNumExpansions()); 8445 } 8446 8447 template<typename Derived> 8448 ExprResult 8449 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { 8450 // If E is not value-dependent, then nothing will change when we transform it. 8451 // Note: This is an instantiation-centric view. 8452 if (!E->isValueDependent()) 8453 return SemaRef.Owned(E); 8454 8455 // Note: None of the implementations of TryExpandParameterPacks can ever 8456 // produce a diagnostic when given only a single unexpanded parameter pack, 8457 // so 8458 UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc()); 8459 bool ShouldExpand = false; 8460 bool RetainExpansion = false; 8461 Optional<unsigned> NumExpansions; 8462 if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(), 8463 Unexpanded, 8464 ShouldExpand, RetainExpansion, 8465 NumExpansions)) 8466 return ExprError(); 8467 8468 if (RetainExpansion) 8469 return SemaRef.Owned(E); 8470 8471 NamedDecl *Pack = E->getPack(); 8472 if (!ShouldExpand) { 8473 Pack = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getPackLoc(), 8474 Pack)); 8475 if (!Pack) 8476 return ExprError(); 8477 } 8478 8479 8480 // We now know the length of the parameter pack, so build a new expression 8481 // that stores that length. 8482 return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack, 8483 E->getPackLoc(), E->getRParenLoc(), 8484 NumExpansions); 8485 } 8486 8487 template<typename Derived> 8488 ExprResult 8489 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr( 8490 SubstNonTypeTemplateParmPackExpr *E) { 8491 // Default behavior is to do nothing with this transformation. 8492 return SemaRef.Owned(E); 8493 } 8494 8495 template<typename Derived> 8496 ExprResult 8497 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr( 8498 SubstNonTypeTemplateParmExpr *E) { 8499 // Default behavior is to do nothing with this transformation. 8500 return SemaRef.Owned(E); 8501 } 8502 8503 template<typename Derived> 8504 ExprResult 8505 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) { 8506 // Default behavior is to do nothing with this transformation. 8507 return SemaRef.Owned(E); 8508 } 8509 8510 template<typename Derived> 8511 ExprResult 8512 TreeTransform<Derived>::TransformMaterializeTemporaryExpr( 8513 MaterializeTemporaryExpr *E) { 8514 return getDerived().TransformExpr(E->GetTemporaryExpr()); 8515 } 8516 8517 template<typename Derived> 8518 ExprResult 8519 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 8520 return SemaRef.MaybeBindToTemporary(E); 8521 } 8522 8523 template<typename Derived> 8524 ExprResult 8525 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) { 8526 return SemaRef.Owned(E); 8527 } 8528 8529 template<typename Derived> 8530 ExprResult 8531 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) { 8532 ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 8533 if (SubExpr.isInvalid()) 8534 return ExprError(); 8535 8536 if (!getDerived().AlwaysRebuild() && 8537 SubExpr.get() == E->getSubExpr()) 8538 return SemaRef.Owned(E); 8539 8540 return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get()); 8541 } 8542 8543 template<typename Derived> 8544 ExprResult 8545 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) { 8546 // Transform each of the elements. 8547 SmallVector<Expr *, 8> Elements; 8548 bool ArgChanged = false; 8549 if (getDerived().TransformExprs(E->getElements(), E->getNumElements(), 8550 /*IsCall=*/false, Elements, &ArgChanged)) 8551 return ExprError(); 8552 8553 if (!getDerived().AlwaysRebuild() && !ArgChanged) 8554 return SemaRef.MaybeBindToTemporary(E); 8555 8556 return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(), 8557 Elements.data(), 8558 Elements.size()); 8559 } 8560 8561 template<typename Derived> 8562 ExprResult 8563 TreeTransform<Derived>::TransformObjCDictionaryLiteral( 8564 ObjCDictionaryLiteral *E) { 8565 // Transform each of the elements. 8566 SmallVector<ObjCDictionaryElement, 8> Elements; 8567 bool ArgChanged = false; 8568 for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) { 8569 ObjCDictionaryElement OrigElement = E->getKeyValueElement(I); 8570 8571 if (OrigElement.isPackExpansion()) { 8572 // This key/value element is a pack expansion. 8573 SmallVector<UnexpandedParameterPack, 2> Unexpanded; 8574 getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded); 8575 getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded); 8576 assert(!Unexpanded.empty() && "Pack expansion without parameter packs?"); 8577 8578 // Determine whether the set of unexpanded parameter packs can 8579 // and should be expanded. 8580 bool Expand = true; 8581 bool RetainExpansion = false; 8582 Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions; 8583 Optional<unsigned> NumExpansions = OrigNumExpansions; 8584 SourceRange PatternRange(OrigElement.Key->getLocStart(), 8585 OrigElement.Value->getLocEnd()); 8586 if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc, 8587 PatternRange, 8588 Unexpanded, 8589 Expand, RetainExpansion, 8590 NumExpansions)) 8591 return ExprError(); 8592 8593 if (!Expand) { 8594 // The transform has determined that we should perform a simple 8595 // transformation on the pack expansion, producing another pack 8596 // expansion. 8597 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1); 8598 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 8599 if (Key.isInvalid()) 8600 return ExprError(); 8601 8602 if (Key.get() != OrigElement.Key) 8603 ArgChanged = true; 8604 8605 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 8606 if (Value.isInvalid()) 8607 return ExprError(); 8608 8609 if (Value.get() != OrigElement.Value) 8610 ArgChanged = true; 8611 8612 ObjCDictionaryElement Expansion = { 8613 Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions 8614 }; 8615 Elements.push_back(Expansion); 8616 continue; 8617 } 8618 8619 // Record right away that the argument was changed. This needs 8620 // to happen even if the array expands to nothing. 8621 ArgChanged = true; 8622 8623 // The transform has determined that we should perform an elementwise 8624 // expansion of the pattern. Do so. 8625 for (unsigned I = 0; I != *NumExpansions; ++I) { 8626 Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I); 8627 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 8628 if (Key.isInvalid()) 8629 return ExprError(); 8630 8631 ExprResult Value = getDerived().TransformExpr(OrigElement.Value); 8632 if (Value.isInvalid()) 8633 return ExprError(); 8634 8635 ObjCDictionaryElement Element = { 8636 Key.get(), Value.get(), SourceLocation(), NumExpansions 8637 }; 8638 8639 // If any unexpanded parameter packs remain, we still have a 8640 // pack expansion. 8641 if (Key.get()->containsUnexpandedParameterPack() || 8642 Value.get()->containsUnexpandedParameterPack()) 8643 Element.EllipsisLoc = OrigElement.EllipsisLoc; 8644 8645 Elements.push_back(Element); 8646 } 8647 8648 // We've finished with this pack expansion. 8649 continue; 8650 } 8651 8652 // Transform and check key. 8653 ExprResult Key = getDerived().TransformExpr(OrigElement.Key); 8654 if (Key.isInvalid()) 8655 return ExprError(); 8656 8657 if (Key.get() != OrigElement.Key) 8658 ArgChanged = true; 8659 8660 // Transform and check value. 8661 ExprResult Value 8662 = getDerived().TransformExpr(OrigElement.Value); 8663 if (Value.isInvalid()) 8664 return ExprError(); 8665 8666 if (Value.get() != OrigElement.Value) 8667 ArgChanged = true; 8668 8669 ObjCDictionaryElement Element = { 8670 Key.get(), Value.get(), SourceLocation(), None 8671 }; 8672 Elements.push_back(Element); 8673 } 8674 8675 if (!getDerived().AlwaysRebuild() && !ArgChanged) 8676 return SemaRef.MaybeBindToTemporary(E); 8677 8678 return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(), 8679 Elements.data(), 8680 Elements.size()); 8681 } 8682 8683 template<typename Derived> 8684 ExprResult 8685 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 8686 TypeSourceInfo *EncodedTypeInfo 8687 = getDerived().TransformType(E->getEncodedTypeSourceInfo()); 8688 if (!EncodedTypeInfo) 8689 return ExprError(); 8690 8691 if (!getDerived().AlwaysRebuild() && 8692 EncodedTypeInfo == E->getEncodedTypeSourceInfo()) 8693 return SemaRef.Owned(E); 8694 8695 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 8696 EncodedTypeInfo, 8697 E->getRParenLoc()); 8698 } 8699 8700 template<typename Derived> 8701 ExprResult TreeTransform<Derived>:: 8702 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) { 8703 // This is a kind of implicit conversion, and it needs to get dropped 8704 // and recomputed for the same general reasons that ImplicitCastExprs 8705 // do, as well a more specific one: this expression is only valid when 8706 // it appears *immediately* as an argument expression. 8707 return getDerived().TransformExpr(E->getSubExpr()); 8708 } 8709 8710 template<typename Derived> 8711 ExprResult TreeTransform<Derived>:: 8712 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) { 8713 TypeSourceInfo *TSInfo 8714 = getDerived().TransformType(E->getTypeInfoAsWritten()); 8715 if (!TSInfo) 8716 return ExprError(); 8717 8718 ExprResult Result = getDerived().TransformExpr(E->getSubExpr()); 8719 if (Result.isInvalid()) 8720 return ExprError(); 8721 8722 if (!getDerived().AlwaysRebuild() && 8723 TSInfo == E->getTypeInfoAsWritten() && 8724 Result.get() == E->getSubExpr()) 8725 return SemaRef.Owned(E); 8726 8727 return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(), 8728 E->getBridgeKeywordLoc(), TSInfo, 8729 Result.get()); 8730 } 8731 8732 template<typename Derived> 8733 ExprResult 8734 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 8735 // Transform arguments. 8736 bool ArgChanged = false; 8737 SmallVector<Expr*, 8> Args; 8738 Args.reserve(E->getNumArgs()); 8739 if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args, 8740 &ArgChanged)) 8741 return ExprError(); 8742 8743 if (E->getReceiverKind() == ObjCMessageExpr::Class) { 8744 // Class message: transform the receiver type. 8745 TypeSourceInfo *ReceiverTypeInfo 8746 = getDerived().TransformType(E->getClassReceiverTypeInfo()); 8747 if (!ReceiverTypeInfo) 8748 return ExprError(); 8749 8750 // If nothing changed, just retain the existing message send. 8751 if (!getDerived().AlwaysRebuild() && 8752 ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged) 8753 return SemaRef.MaybeBindToTemporary(E); 8754 8755 // Build a new class message send. 8756 SmallVector<SourceLocation, 16> SelLocs; 8757 E->getSelectorLocs(SelLocs); 8758 return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo, 8759 E->getSelector(), 8760 SelLocs, 8761 E->getMethodDecl(), 8762 E->getLeftLoc(), 8763 Args, 8764 E->getRightLoc()); 8765 } 8766 8767 // Instance message: transform the receiver 8768 assert(E->getReceiverKind() == ObjCMessageExpr::Instance && 8769 "Only class and instance messages may be instantiated"); 8770 ExprResult Receiver 8771 = getDerived().TransformExpr(E->getInstanceReceiver()); 8772 if (Receiver.isInvalid()) 8773 return ExprError(); 8774 8775 // If nothing changed, just retain the existing message send. 8776 if (!getDerived().AlwaysRebuild() && 8777 Receiver.get() == E->getInstanceReceiver() && !ArgChanged) 8778 return SemaRef.MaybeBindToTemporary(E); 8779 8780 // Build a new instance message send. 8781 SmallVector<SourceLocation, 16> SelLocs; 8782 E->getSelectorLocs(SelLocs); 8783 return getDerived().RebuildObjCMessageExpr(Receiver.get(), 8784 E->getSelector(), 8785 SelLocs, 8786 E->getMethodDecl(), 8787 E->getLeftLoc(), 8788 Args, 8789 E->getRightLoc()); 8790 } 8791 8792 template<typename Derived> 8793 ExprResult 8794 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 8795 return SemaRef.Owned(E); 8796 } 8797 8798 template<typename Derived> 8799 ExprResult 8800 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 8801 return SemaRef.Owned(E); 8802 } 8803 8804 template<typename Derived> 8805 ExprResult 8806 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 8807 // Transform the base expression. 8808 ExprResult Base = getDerived().TransformExpr(E->getBase()); 8809 if (Base.isInvalid()) 8810 return ExprError(); 8811 8812 // We don't need to transform the ivar; it will never change. 8813 8814 // If nothing changed, just retain the existing expression. 8815 if (!getDerived().AlwaysRebuild() && 8816 Base.get() == E->getBase()) 8817 return SemaRef.Owned(E); 8818 8819 return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(), 8820 E->getLocation(), 8821 E->isArrow(), E->isFreeIvar()); 8822 } 8823 8824 template<typename Derived> 8825 ExprResult 8826 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 8827 // 'super' and types never change. Property never changes. Just 8828 // retain the existing expression. 8829 if (!E->isObjectReceiver()) 8830 return SemaRef.Owned(E); 8831 8832 // Transform the base expression. 8833 ExprResult Base = getDerived().TransformExpr(E->getBase()); 8834 if (Base.isInvalid()) 8835 return ExprError(); 8836 8837 // We don't need to transform the property; it will never change. 8838 8839 // If nothing changed, just retain the existing expression. 8840 if (!getDerived().AlwaysRebuild() && 8841 Base.get() == E->getBase()) 8842 return SemaRef.Owned(E); 8843 8844 if (E->isExplicitProperty()) 8845 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 8846 E->getExplicitProperty(), 8847 E->getLocation()); 8848 8849 return getDerived().RebuildObjCPropertyRefExpr(Base.get(), 8850 SemaRef.Context.PseudoObjectTy, 8851 E->getImplicitPropertyGetter(), 8852 E->getImplicitPropertySetter(), 8853 E->getLocation()); 8854 } 8855 8856 template<typename Derived> 8857 ExprResult 8858 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) { 8859 // Transform the base expression. 8860 ExprResult Base = getDerived().TransformExpr(E->getBaseExpr()); 8861 if (Base.isInvalid()) 8862 return ExprError(); 8863 8864 // Transform the key expression. 8865 ExprResult Key = getDerived().TransformExpr(E->getKeyExpr()); 8866 if (Key.isInvalid()) 8867 return ExprError(); 8868 8869 // If nothing changed, just retain the existing expression. 8870 if (!getDerived().AlwaysRebuild() && 8871 Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr()) 8872 return SemaRef.Owned(E); 8873 8874 return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(), 8875 Base.get(), Key.get(), 8876 E->getAtIndexMethodDecl(), 8877 E->setAtIndexMethodDecl()); 8878 } 8879 8880 template<typename Derived> 8881 ExprResult 8882 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 8883 // Transform the base expression. 8884 ExprResult Base = getDerived().TransformExpr(E->getBase()); 8885 if (Base.isInvalid()) 8886 return ExprError(); 8887 8888 // If nothing changed, just retain the existing expression. 8889 if (!getDerived().AlwaysRebuild() && 8890 Base.get() == E->getBase()) 8891 return SemaRef.Owned(E); 8892 8893 return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(), 8894 E->getOpLoc(), 8895 E->isArrow()); 8896 } 8897 8898 template<typename Derived> 8899 ExprResult 8900 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 8901 bool ArgumentChanged = false; 8902 SmallVector<Expr*, 8> SubExprs; 8903 SubExprs.reserve(E->getNumSubExprs()); 8904 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 8905 SubExprs, &ArgumentChanged)) 8906 return ExprError(); 8907 8908 if (!getDerived().AlwaysRebuild() && 8909 !ArgumentChanged) 8910 return SemaRef.Owned(E); 8911 8912 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 8913 SubExprs, 8914 E->getRParenLoc()); 8915 } 8916 8917 template<typename Derived> 8918 ExprResult 8919 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 8920 BlockDecl *oldBlock = E->getBlockDecl(); 8921 8922 SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/0); 8923 BlockScopeInfo *blockScope = SemaRef.getCurBlock(); 8924 8925 blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic()); 8926 blockScope->TheDecl->setBlockMissingReturnType( 8927 oldBlock->blockMissingReturnType()); 8928 8929 SmallVector<ParmVarDecl*, 4> params; 8930 SmallVector<QualType, 4> paramTypes; 8931 8932 // Parameter substitution. 8933 if (getDerived().TransformFunctionTypeParams(E->getCaretLocation(), 8934 oldBlock->param_begin(), 8935 oldBlock->param_size(), 8936 0, paramTypes, ¶ms)) { 8937 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/0); 8938 return ExprError(); 8939 } 8940 8941 const FunctionProtoType *exprFunctionType = E->getFunctionType(); 8942 QualType exprResultType = 8943 getDerived().TransformType(exprFunctionType->getResultType()); 8944 8945 // Don't allow returning a objc interface by value. 8946 if (exprResultType->isObjCObjectType()) { 8947 getSema().Diag(E->getCaretLocation(), 8948 diag::err_object_cannot_be_passed_returned_by_value) 8949 << 0 << exprResultType; 8950 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/0); 8951 return ExprError(); 8952 } 8953 8954 QualType functionType = 8955 getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, 8956 exprFunctionType->getExtProtoInfo()); 8957 blockScope->FunctionType = functionType; 8958 8959 // Set the parameters on the block decl. 8960 if (!params.empty()) 8961 blockScope->TheDecl->setParams(params); 8962 8963 if (!oldBlock->blockMissingReturnType()) { 8964 blockScope->HasImplicitReturnType = false; 8965 blockScope->ReturnType = exprResultType; 8966 } 8967 8968 // Transform the body 8969 StmtResult body = getDerived().TransformStmt(E->getBody()); 8970 if (body.isInvalid()) { 8971 getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/0); 8972 return ExprError(); 8973 } 8974 8975 #ifndef NDEBUG 8976 // In builds with assertions, make sure that we captured everything we 8977 // captured before. 8978 if (!SemaRef.getDiagnostics().hasErrorOccurred()) { 8979 for (BlockDecl::capture_iterator i = oldBlock->capture_begin(), 8980 e = oldBlock->capture_end(); i != e; ++i) { 8981 VarDecl *oldCapture = i->getVariable(); 8982 8983 // Ignore parameter packs. 8984 if (isa<ParmVarDecl>(oldCapture) && 8985 cast<ParmVarDecl>(oldCapture)->isParameterPack()) 8986 continue; 8987 8988 VarDecl *newCapture = 8989 cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(), 8990 oldCapture)); 8991 assert(blockScope->CaptureMap.count(newCapture)); 8992 } 8993 assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured()); 8994 } 8995 #endif 8996 8997 return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(), 8998 /*Scope=*/0); 8999 } 9000 9001 template<typename Derived> 9002 ExprResult 9003 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) { 9004 llvm_unreachable("Cannot transform asType expressions yet"); 9005 } 9006 9007 template<typename Derived> 9008 ExprResult 9009 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) { 9010 QualType RetTy = getDerived().TransformType(E->getType()); 9011 bool ArgumentChanged = false; 9012 SmallVector<Expr*, 8> SubExprs; 9013 SubExprs.reserve(E->getNumSubExprs()); 9014 if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false, 9015 SubExprs, &ArgumentChanged)) 9016 return ExprError(); 9017 9018 if (!getDerived().AlwaysRebuild() && 9019 !ArgumentChanged) 9020 return SemaRef.Owned(E); 9021 9022 return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs, 9023 RetTy, E->getOp(), E->getRParenLoc()); 9024 } 9025 9026 //===----------------------------------------------------------------------===// 9027 // Type reconstruction 9028 //===----------------------------------------------------------------------===// 9029 9030 template<typename Derived> 9031 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType, 9032 SourceLocation Star) { 9033 return SemaRef.BuildPointerType(PointeeType, Star, 9034 getDerived().getBaseEntity()); 9035 } 9036 9037 template<typename Derived> 9038 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType, 9039 SourceLocation Star) { 9040 return SemaRef.BuildBlockPointerType(PointeeType, Star, 9041 getDerived().getBaseEntity()); 9042 } 9043 9044 template<typename Derived> 9045 QualType 9046 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType, 9047 bool WrittenAsLValue, 9048 SourceLocation Sigil) { 9049 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, 9050 Sigil, getDerived().getBaseEntity()); 9051 } 9052 9053 template<typename Derived> 9054 QualType 9055 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 9056 QualType ClassType, 9057 SourceLocation Sigil) { 9058 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 9059 Sigil, getDerived().getBaseEntity()); 9060 } 9061 9062 template<typename Derived> 9063 QualType 9064 TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 9065 ArrayType::ArraySizeModifier SizeMod, 9066 const llvm::APInt *Size, 9067 Expr *SizeExpr, 9068 unsigned IndexTypeQuals, 9069 SourceRange BracketsRange) { 9070 if (SizeExpr || !Size) 9071 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 9072 IndexTypeQuals, BracketsRange, 9073 getDerived().getBaseEntity()); 9074 9075 QualType Types[] = { 9076 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 9077 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 9078 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 9079 }; 9080 const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 9081 QualType SizeType; 9082 for (unsigned I = 0; I != NumTypes; ++I) 9083 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 9084 SizeType = Types[I]; 9085 break; 9086 } 9087 9088 // Note that we can return a VariableArrayType here in the case where 9089 // the element type was a dependent VariableArrayType. 9090 IntegerLiteral *ArraySize 9091 = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType, 9092 /*FIXME*/BracketsRange.getBegin()); 9093 return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize, 9094 IndexTypeQuals, BracketsRange, 9095 getDerived().getBaseEntity()); 9096 } 9097 9098 template<typename Derived> 9099 QualType 9100 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 9101 ArrayType::ArraySizeModifier SizeMod, 9102 const llvm::APInt &Size, 9103 unsigned IndexTypeQuals, 9104 SourceRange BracketsRange) { 9105 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 9106 IndexTypeQuals, BracketsRange); 9107 } 9108 9109 template<typename Derived> 9110 QualType 9111 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 9112 ArrayType::ArraySizeModifier SizeMod, 9113 unsigned IndexTypeQuals, 9114 SourceRange BracketsRange) { 9115 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 9116 IndexTypeQuals, BracketsRange); 9117 } 9118 9119 template<typename Derived> 9120 QualType 9121 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 9122 ArrayType::ArraySizeModifier SizeMod, 9123 Expr *SizeExpr, 9124 unsigned IndexTypeQuals, 9125 SourceRange BracketsRange) { 9126 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 9127 SizeExpr, 9128 IndexTypeQuals, BracketsRange); 9129 } 9130 9131 template<typename Derived> 9132 QualType 9133 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 9134 ArrayType::ArraySizeModifier SizeMod, 9135 Expr *SizeExpr, 9136 unsigned IndexTypeQuals, 9137 SourceRange BracketsRange) { 9138 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 9139 SizeExpr, 9140 IndexTypeQuals, BracketsRange); 9141 } 9142 9143 template<typename Derived> 9144 QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 9145 unsigned NumElements, 9146 VectorType::VectorKind VecKind) { 9147 // FIXME: semantic checking! 9148 return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind); 9149 } 9150 9151 template<typename Derived> 9152 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 9153 unsigned NumElements, 9154 SourceLocation AttributeLoc) { 9155 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 9156 NumElements, true); 9157 IntegerLiteral *VectorSize 9158 = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy, 9159 AttributeLoc); 9160 return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc); 9161 } 9162 9163 template<typename Derived> 9164 QualType 9165 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 9166 Expr *SizeExpr, 9167 SourceLocation AttributeLoc) { 9168 return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc); 9169 } 9170 9171 template<typename Derived> 9172 QualType TreeTransform<Derived>::RebuildFunctionProtoType( 9173 QualType T, 9174 llvm::MutableArrayRef<QualType> ParamTypes, 9175 const FunctionProtoType::ExtProtoInfo &EPI) { 9176 return SemaRef.BuildFunctionType(T, ParamTypes, 9177 getDerived().getBaseLocation(), 9178 getDerived().getBaseEntity(), 9179 EPI); 9180 } 9181 9182 template<typename Derived> 9183 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) { 9184 return SemaRef.Context.getFunctionNoProtoType(T); 9185 } 9186 9187 template<typename Derived> 9188 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(Decl *D) { 9189 assert(D && "no decl found"); 9190 if (D->isInvalidDecl()) return QualType(); 9191 9192 // FIXME: Doesn't account for ObjCInterfaceDecl! 9193 TypeDecl *Ty; 9194 if (isa<UsingDecl>(D)) { 9195 UsingDecl *Using = cast<UsingDecl>(D); 9196 assert(Using->isTypeName() && 9197 "UnresolvedUsingTypenameDecl transformed to non-typename using"); 9198 9199 // A valid resolved using typename decl points to exactly one type decl. 9200 assert(++Using->shadow_begin() == Using->shadow_end()); 9201 Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl()); 9202 9203 } else { 9204 assert(isa<UnresolvedUsingTypenameDecl>(D) && 9205 "UnresolvedUsingTypenameDecl transformed to non-using decl"); 9206 Ty = cast<UnresolvedUsingTypenameDecl>(D); 9207 } 9208 9209 return SemaRef.Context.getTypeDeclType(Ty); 9210 } 9211 9212 template<typename Derived> 9213 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E, 9214 SourceLocation Loc) { 9215 return SemaRef.BuildTypeofExprType(E, Loc); 9216 } 9217 9218 template<typename Derived> 9219 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 9220 return SemaRef.Context.getTypeOfType(Underlying); 9221 } 9222 9223 template<typename Derived> 9224 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, 9225 SourceLocation Loc) { 9226 return SemaRef.BuildDecltypeType(E, Loc); 9227 } 9228 9229 template<typename Derived> 9230 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType, 9231 UnaryTransformType::UTTKind UKind, 9232 SourceLocation Loc) { 9233 return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc); 9234 } 9235 9236 template<typename Derived> 9237 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 9238 TemplateName Template, 9239 SourceLocation TemplateNameLoc, 9240 TemplateArgumentListInfo &TemplateArgs) { 9241 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs); 9242 } 9243 9244 template<typename Derived> 9245 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType, 9246 SourceLocation KWLoc) { 9247 return SemaRef.BuildAtomicType(ValueType, KWLoc); 9248 } 9249 9250 template<typename Derived> 9251 TemplateName 9252 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 9253 bool TemplateKW, 9254 TemplateDecl *Template) { 9255 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW, 9256 Template); 9257 } 9258 9259 template<typename Derived> 9260 TemplateName 9261 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 9262 const IdentifierInfo &Name, 9263 SourceLocation NameLoc, 9264 QualType ObjectType, 9265 NamedDecl *FirstQualifierInScope) { 9266 UnqualifiedId TemplateName; 9267 TemplateName.setIdentifier(&Name, NameLoc); 9268 Sema::TemplateTy Template; 9269 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 9270 getSema().ActOnDependentTemplateName(/*Scope=*/0, 9271 SS, TemplateKWLoc, TemplateName, 9272 ParsedType::make(ObjectType), 9273 /*EnteringContext=*/false, 9274 Template); 9275 return Template.get(); 9276 } 9277 9278 template<typename Derived> 9279 TemplateName 9280 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS, 9281 OverloadedOperatorKind Operator, 9282 SourceLocation NameLoc, 9283 QualType ObjectType) { 9284 UnqualifiedId Name; 9285 // FIXME: Bogus location information. 9286 SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc }; 9287 Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations); 9288 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 9289 Sema::TemplateTy Template; 9290 getSema().ActOnDependentTemplateName(/*Scope=*/0, 9291 SS, TemplateKWLoc, Name, 9292 ParsedType::make(ObjectType), 9293 /*EnteringContext=*/false, 9294 Template); 9295 return Template.template getAsVal<TemplateName>(); 9296 } 9297 9298 template<typename Derived> 9299 ExprResult 9300 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 9301 SourceLocation OpLoc, 9302 Expr *OrigCallee, 9303 Expr *First, 9304 Expr *Second) { 9305 Expr *Callee = OrigCallee->IgnoreParenCasts(); 9306 bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus); 9307 9308 // Determine whether this should be a builtin operation. 9309 if (Op == OO_Subscript) { 9310 if (!First->getType()->isOverloadableType() && 9311 !Second->getType()->isOverloadableType()) 9312 return getSema().CreateBuiltinArraySubscriptExpr(First, 9313 Callee->getLocStart(), 9314 Second, OpLoc); 9315 } else if (Op == OO_Arrow) { 9316 // -> is never a builtin operation. 9317 return SemaRef.BuildOverloadedArrowExpr(0, First, OpLoc); 9318 } else if (Second == 0 || isPostIncDec) { 9319 if (!First->getType()->isOverloadableType()) { 9320 // The argument is not of overloadable type, so try to create a 9321 // built-in unary operation. 9322 UnaryOperatorKind Opc 9323 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 9324 9325 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First); 9326 } 9327 } else { 9328 if (!First->getType()->isOverloadableType() && 9329 !Second->getType()->isOverloadableType()) { 9330 // Neither of the arguments is an overloadable type, so try to 9331 // create a built-in binary operation. 9332 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 9333 ExprResult Result 9334 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second); 9335 if (Result.isInvalid()) 9336 return ExprError(); 9337 9338 return Result; 9339 } 9340 } 9341 9342 // Compute the transformed set of functions (and function templates) to be 9343 // used during overload resolution. 9344 UnresolvedSet<16> Functions; 9345 9346 if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) { 9347 assert(ULE->requiresADL()); 9348 9349 // FIXME: Do we have to check 9350 // IsAcceptableNonMemberOperatorCandidate for each of these? 9351 Functions.append(ULE->decls_begin(), ULE->decls_end()); 9352 } else { 9353 // If we've resolved this to a particular non-member function, just call 9354 // that function. If we resolved it to a member function, 9355 // CreateOverloaded* will find that function for us. 9356 NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl(); 9357 if (!isa<CXXMethodDecl>(ND)) 9358 Functions.addDecl(ND); 9359 } 9360 9361 // Add any functions found via argument-dependent lookup. 9362 Expr *Args[2] = { First, Second }; 9363 unsigned NumArgs = 1 + (Second != 0); 9364 9365 // Create the overloaded operator invocation for unary operators. 9366 if (NumArgs == 1 || isPostIncDec) { 9367 UnaryOperatorKind Opc 9368 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 9369 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First); 9370 } 9371 9372 if (Op == OO_Subscript) { 9373 SourceLocation LBrace; 9374 SourceLocation RBrace; 9375 9376 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) { 9377 DeclarationNameLoc &NameLoc = DRE->getNameInfo().getInfo(); 9378 LBrace = SourceLocation::getFromRawEncoding( 9379 NameLoc.CXXOperatorName.BeginOpNameLoc); 9380 RBrace = SourceLocation::getFromRawEncoding( 9381 NameLoc.CXXOperatorName.EndOpNameLoc); 9382 } else { 9383 LBrace = Callee->getLocStart(); 9384 RBrace = OpLoc; 9385 } 9386 9387 return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace, 9388 First, Second); 9389 } 9390 9391 // Create the overloaded operator invocation for binary operators. 9392 BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op); 9393 ExprResult Result 9394 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 9395 if (Result.isInvalid()) 9396 return ExprError(); 9397 9398 return Result; 9399 } 9400 9401 template<typename Derived> 9402 ExprResult 9403 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base, 9404 SourceLocation OperatorLoc, 9405 bool isArrow, 9406 CXXScopeSpec &SS, 9407 TypeSourceInfo *ScopeType, 9408 SourceLocation CCLoc, 9409 SourceLocation TildeLoc, 9410 PseudoDestructorTypeStorage Destroyed) { 9411 QualType BaseType = Base->getType(); 9412 if (Base->isTypeDependent() || Destroyed.getIdentifier() || 9413 (!isArrow && !BaseType->getAs<RecordType>()) || 9414 (isArrow && BaseType->getAs<PointerType>() && 9415 !BaseType->getAs<PointerType>()->getPointeeType() 9416 ->template getAs<RecordType>())){ 9417 // This pseudo-destructor expression is still a pseudo-destructor. 9418 return SemaRef.BuildPseudoDestructorExpr(Base, OperatorLoc, 9419 isArrow? tok::arrow : tok::period, 9420 SS, ScopeType, CCLoc, TildeLoc, 9421 Destroyed, 9422 /*FIXME?*/true); 9423 } 9424 9425 TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo(); 9426 DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName( 9427 SemaRef.Context.getCanonicalType(DestroyedType->getType()))); 9428 DeclarationNameInfo NameInfo(Name, Destroyed.getLocation()); 9429 NameInfo.setNamedTypeInfo(DestroyedType); 9430 9431 // The scope type is now known to be a valid nested name specifier 9432 // component. Tack it on to the end of the nested name specifier. 9433 if (ScopeType) 9434 SS.Extend(SemaRef.Context, SourceLocation(), 9435 ScopeType->getTypeLoc(), CCLoc); 9436 9437 SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller. 9438 return getSema().BuildMemberReferenceExpr(Base, BaseType, 9439 OperatorLoc, isArrow, 9440 SS, TemplateKWLoc, 9441 /*FIXME: FirstQualifier*/ 0, 9442 NameInfo, 9443 /*TemplateArgs*/ 0); 9444 } 9445 9446 template<typename Derived> 9447 StmtResult 9448 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) { 9449 SourceLocation Loc = S->getLocStart(); 9450 unsigned NumParams = S->getCapturedDecl()->getNumParams(); 9451 getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/0, 9452 S->getCapturedRegionKind(), NumParams); 9453 StmtResult Body = getDerived().TransformStmt(S->getCapturedStmt()); 9454 9455 if (Body.isInvalid()) { 9456 getSema().ActOnCapturedRegionError(); 9457 return StmtError(); 9458 } 9459 9460 return getSema().ActOnCapturedRegionEnd(Body.take()); 9461 } 9462 9463 } // end namespace clang 9464 9465 #endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 9466