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