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