TreeTransform.h revision dd62b15665a4144c45c1f7c53665414ad5f7f4f2
1//===------- TreeTransform.h - Semantic Tree Transformation ---------------===/ 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#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H 14#define LLVM_CLANG_SEMA_TREETRANSFORM_H 15 16#include "Sema.h" 17#include "clang/Sema/SemaDiagnostic.h" 18#include "clang/AST/Decl.h" 19#include "clang/AST/Expr.h" 20#include "clang/AST/ExprCXX.h" 21#include "clang/AST/ExprObjC.h" 22#include "clang/AST/Stmt.h" 23#include "clang/AST/StmtCXX.h" 24#include "clang/AST/StmtObjC.h" 25#include "clang/Parse/Ownership.h" 26#include "clang/Parse/Designator.h" 27#include "clang/Lex/Preprocessor.h" 28#include <algorithm> 29 30namespace clang { 31 32/// \brief A semantic tree transformation that allows one to transform one 33/// abstract syntax tree into another. 34/// 35/// A new tree transformation is defined by creating a new subclass \c X of 36/// \c TreeTransform<X> and then overriding certain operations to provide 37/// behavior specific to that transformation. For example, template 38/// instantiation is implemented as a tree transformation where the 39/// transformation of TemplateTypeParmType nodes involves substituting the 40/// template arguments for their corresponding template parameters; a similar 41/// transformation is performed for non-type template parameters and 42/// template template parameters. 43/// 44/// This tree-transformation template uses static polymorphism to allow 45/// subclasses to customize any of its operations. Thus, a subclass can 46/// override any of the transformation or rebuild operators by providing an 47/// operation with the same signature as the default implementation. The 48/// overridding function should not be virtual. 49/// 50/// Semantic tree transformations are split into two stages, either of which 51/// can be replaced by a subclass. The "transform" step transforms an AST node 52/// or the parts of an AST node using the various transformation functions, 53/// then passes the pieces on to the "rebuild" step, which constructs a new AST 54/// node of the appropriate kind from the pieces. The default transformation 55/// routines recursively transform the operands to composite AST nodes (e.g., 56/// the pointee type of a PointerType node) and, if any of those operand nodes 57/// were changed by the transformation, invokes the rebuild operation to create 58/// a new AST node. 59/// 60/// Subclasses can customize the transformation at various levels. The 61/// most coarse-grained transformations involve replacing TransformType(), 62/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(), 63/// TransformTemplateName(), or TransformTemplateArgument() with entirely 64/// new implementations. 65/// 66/// For more fine-grained transformations, subclasses can replace any of the 67/// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 68/// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 69/// replacing TransformTemplateTypeParmType() allows template instantiation 70/// to substitute template arguments for their corresponding template 71/// parameters. Additionally, subclasses can override the \c RebuildXXX 72/// functions to control how AST nodes are rebuilt when their operands change. 73/// By default, \c TreeTransform will invoke semantic analysis to rebuild 74/// AST nodes. However, certain other tree transformations (e.g, cloning) may 75/// be able to use more efficient rebuild steps. 76/// 77/// There are a handful of other functions that can be overridden, allowing one 78/// to avoid traversing nodes that don't need any transformation 79/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 80/// operands have not changed (\c AlwaysRebuild()), and customize the 81/// default locations and entity names used for type-checking 82/// (\c getBaseLocation(), \c getBaseEntity()). 83template<typename Derived> 84class TreeTransform { 85protected: 86 Sema &SemaRef; 87 88public: 89 typedef Sema::OwningStmtResult OwningStmtResult; 90 typedef Sema::OwningExprResult OwningExprResult; 91 typedef Sema::StmtArg StmtArg; 92 typedef Sema::ExprArg ExprArg; 93 typedef Sema::MultiExprArg MultiExprArg; 94 typedef Sema::MultiStmtArg MultiStmtArg; 95 96 /// \brief Initializes a new tree transformer. 97 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 98 99 /// \brief Retrieves a reference to the derived class. 100 Derived &getDerived() { return static_cast<Derived&>(*this); } 101 102 /// \brief Retrieves a reference to the derived class. 103 const Derived &getDerived() const { 104 return static_cast<const Derived&>(*this); 105 } 106 107 /// \brief Retrieves a reference to the semantic analysis object used for 108 /// this tree transform. 109 Sema &getSema() const { return SemaRef; } 110 111 /// \brief Whether the transformation should always rebuild AST nodes, even 112 /// if none of the children have changed. 113 /// 114 /// Subclasses may override this function to specify when the transformation 115 /// should rebuild all AST nodes. 116 bool AlwaysRebuild() { return false; } 117 118 /// \brief Returns the location of the entity being transformed, if that 119 /// information was not available elsewhere in the AST. 120 /// 121 /// By default, returns no source-location information. Subclasses can 122 /// provide an alternative implementation that provides better location 123 /// information. 124 SourceLocation getBaseLocation() { return SourceLocation(); } 125 126 /// \brief Returns the name of the entity being transformed, if that 127 /// information was not available elsewhere in the AST. 128 /// 129 /// By default, returns an empty name. Subclasses can provide an alternative 130 /// implementation with a more precise name. 131 DeclarationName getBaseEntity() { return DeclarationName(); } 132 133 /// \brief Sets the "base" location and entity when that 134 /// information is known based on another transformation. 135 /// 136 /// By default, the source location and entity are ignored. Subclasses can 137 /// override this function to provide a customized implementation. 138 void setBase(SourceLocation Loc, DeclarationName Entity) { } 139 140 /// \brief RAII object that temporarily sets the base location and entity 141 /// used for reporting diagnostics in types. 142 class TemporaryBase { 143 TreeTransform &Self; 144 SourceLocation OldLocation; 145 DeclarationName OldEntity; 146 147 public: 148 TemporaryBase(TreeTransform &Self, SourceLocation Location, 149 DeclarationName Entity) : Self(Self) { 150 OldLocation = Self.getDerived().getBaseLocation(); 151 OldEntity = Self.getDerived().getBaseEntity(); 152 Self.getDerived().setBase(Location, Entity); 153 } 154 155 ~TemporaryBase() { 156 Self.getDerived().setBase(OldLocation, OldEntity); 157 } 158 }; 159 160 /// \brief Determine whether the given type \p T has already been 161 /// transformed. 162 /// 163 /// Subclasses can provide an alternative implementation of this routine 164 /// to short-circuit evaluation when it is known that a given type will 165 /// not change. For example, template instantiation need not traverse 166 /// non-dependent types. 167 bool AlreadyTransformed(QualType T) { 168 return T.isNull(); 169 } 170 171 /// \brief Transforms the given type into another type. 172 /// 173 /// By default, this routine transforms a type by delegating to the 174 /// appropriate TransformXXXType to build a new type, then applying 175 /// the qualifiers on \p T to the resulting type with AddTypeQualifiers. 176 /// Subclasses may override this function (to take over all type 177 /// transformations), some set of the TransformXXXType functions, or 178 /// the AddTypeQualifiers function to alter the transformation. 179 /// 180 /// \returns the transformed type. 181 QualType TransformType(QualType T); 182 183 /// \brief Transform the given type by adding the given set of qualifiers 184 /// and returning the result. 185 /// 186 /// FIXME: By default, this routine adds type qualifiers only to types that 187 /// can have qualifiers, and silently suppresses those qualifiers that are 188 /// not permitted (e.g., qualifiers on reference or function types). This 189 /// is the right thing for template instantiation, but probably not for 190 /// other clients. 191 QualType AddTypeQualifiers(QualType T, Qualifiers Qs); 192 193 /// \brief Transform the given statement. 194 /// 195 /// By default, this routine transforms a statement by delegating to the 196 /// appropriate TransformXXXStmt function to transform a specific kind of 197 /// statement or the TransformExpr() function to transform an expression. 198 /// Subclasses may override this function to transform statements using some 199 /// other mechanism. 200 /// 201 /// \returns the transformed statement. 202 OwningStmtResult TransformStmt(Stmt *S); 203 204 /// \brief Transform the given expression. 205 /// 206 /// By default, this routine transforms an expression by delegating to the 207 /// appropriate TransformXXXExpr function to build a new expression. 208 /// Subclasses may override this function to transform expressions using some 209 /// other mechanism. 210 /// 211 /// \returns the transformed expression. 212 OwningExprResult TransformExpr(Expr *E) { 213 return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false); 214 } 215 216 /// \brief Transform the given expression. 217 /// 218 /// By default, this routine transforms an expression by delegating to the 219 /// appropriate TransformXXXExpr function to build a new expression. 220 /// Subclasses may override this function to transform expressions using some 221 /// other mechanism. 222 /// 223 /// \returns the transformed expression. 224 OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand); 225 226 /// \brief Transform the given declaration, which is referenced from a type 227 /// or expression. 228 /// 229 /// By default, acts as the identity function on declarations. Subclasses 230 /// may override this function to provide alternate behavior. 231 Decl *TransformDecl(Decl *D) { return D; } 232 233 /// \brief Transform the definition of the given declaration. 234 /// 235 /// By default, invokes TransformDecl() to transform the declaration. 236 /// Subclasses may override this function to provide alternate behavior. 237 Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); } 238 239 /// \brief Transform the given nested-name-specifier. 240 /// 241 /// By default, transforms all of the types and declarations within the 242 /// nested-name-specifier. Subclasses may override this function to provide 243 /// alternate behavior. 244 NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 245 SourceRange Range, 246 QualType ObjectType = QualType(), 247 NamedDecl *FirstQualifierInScope = 0); 248 249 /// \brief Transform the given declaration name. 250 /// 251 /// By default, transforms the types of conversion function, constructor, 252 /// and destructor names and then (if needed) rebuilds the declaration name. 253 /// Identifiers and selectors are returned unmodified. Sublcasses may 254 /// override this function to provide alternate behavior. 255 DeclarationName TransformDeclarationName(DeclarationName Name, 256 SourceLocation Loc, 257 QualType ObjectType = QualType()); 258 259 /// \brief Transform the given template name. 260 /// 261 /// By default, transforms the template name by transforming the declarations 262 /// and nested-name-specifiers that occur within the template name. 263 /// Subclasses may override this function to provide alternate behavior. 264 TemplateName TransformTemplateName(TemplateName Name, 265 QualType ObjectType = QualType()); 266 267 /// \brief Transform the given template argument. 268 /// 269 /// By default, this operation transforms the type, expression, or 270 /// declaration stored within the template argument and constructs a 271 /// new template argument from the transformed result. Subclasses may 272 /// override this function to provide alternate behavior. 273 TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg); 274 275#define ABSTRACT_TYPE(CLASS, PARENT) 276#define TYPE(CLASS, PARENT) \ 277 QualType Transform##CLASS##Type(const CLASS##Type *T); 278#include "clang/AST/TypeNodes.def" 279 280 QualType 281 TransformTemplateSpecializationType(const TemplateSpecializationType *T, 282 QualType ObjectType); 283 284 OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 285 286#define STMT(Node, Parent) \ 287 OwningStmtResult Transform##Node(Node *S); 288#define EXPR(Node, Parent) \ 289 OwningExprResult Transform##Node(Node *E); 290#define ABSTRACT_EXPR(Node, Parent) 291#include "clang/AST/StmtNodes.def" 292 293 /// \brief Build a new pointer type given its pointee type. 294 /// 295 /// By default, performs semantic analysis when building the pointer type. 296 /// Subclasses may override this routine to provide different behavior. 297 QualType RebuildPointerType(QualType PointeeType); 298 299 /// \brief Build a new block pointer type given its pointee type. 300 /// 301 /// By default, performs semantic analysis when building the block pointer 302 /// type. Subclasses may override this routine to provide different behavior. 303 QualType RebuildBlockPointerType(QualType PointeeType); 304 305 /// \brief Build a new lvalue reference type given the type it references. 306 /// 307 /// By default, performs semantic analysis when building the lvalue reference 308 /// type. Subclasses may override this routine to provide different behavior. 309 QualType RebuildLValueReferenceType(QualType ReferentType); 310 311 /// \brief Build a new rvalue reference type given the type it references. 312 /// 313 /// By default, performs semantic analysis when building the rvalue reference 314 /// type. Subclasses may override this routine to provide different behavior. 315 QualType RebuildRValueReferenceType(QualType ReferentType); 316 317 /// \brief Build a new member pointer type given the pointee type and the 318 /// class type it refers into. 319 /// 320 /// By default, performs semantic analysis when building the member pointer 321 /// type. Subclasses may override this routine to provide different behavior. 322 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType); 323 324 /// \brief Build a new array type given the element type, size 325 /// modifier, size of the array (if known), size expression, and index type 326 /// qualifiers. 327 /// 328 /// By default, performs semantic analysis when building the array type. 329 /// Subclasses may override this routine to provide different behavior. 330 /// Also by default, all of the other Rebuild*Array 331 QualType RebuildArrayType(QualType ElementType, 332 ArrayType::ArraySizeModifier SizeMod, 333 const llvm::APInt *Size, 334 Expr *SizeExpr, 335 unsigned IndexTypeQuals, 336 SourceRange BracketsRange); 337 338 /// \brief Build a new constant array type given the element type, size 339 /// modifier, (known) size of the array, and index type qualifiers. 340 /// 341 /// By default, performs semantic analysis when building the array type. 342 /// Subclasses may override this routine to provide different behavior. 343 QualType RebuildConstantArrayType(QualType ElementType, 344 ArrayType::ArraySizeModifier SizeMod, 345 const llvm::APInt &Size, 346 unsigned IndexTypeQuals); 347 348 /// \brief Build a new incomplete array type given the element type, size 349 /// modifier, and index type qualifiers. 350 /// 351 /// By default, performs semantic analysis when building the array type. 352 /// Subclasses may override this routine to provide different behavior. 353 QualType RebuildIncompleteArrayType(QualType ElementType, 354 ArrayType::ArraySizeModifier SizeMod, 355 unsigned IndexTypeQuals); 356 357 /// \brief Build a new variable-length array type given the element type, 358 /// size modifier, size expression, and index type qualifiers. 359 /// 360 /// By default, performs semantic analysis when building the array type. 361 /// Subclasses may override this routine to provide different behavior. 362 QualType RebuildVariableArrayType(QualType ElementType, 363 ArrayType::ArraySizeModifier SizeMod, 364 ExprArg SizeExpr, 365 unsigned IndexTypeQuals, 366 SourceRange BracketsRange); 367 368 /// \brief Build a new dependent-sized array type given the element type, 369 /// size modifier, size expression, and index type qualifiers. 370 /// 371 /// By default, performs semantic analysis when building the array type. 372 /// Subclasses may override this routine to provide different behavior. 373 QualType RebuildDependentSizedArrayType(QualType ElementType, 374 ArrayType::ArraySizeModifier SizeMod, 375 ExprArg SizeExpr, 376 unsigned IndexTypeQuals, 377 SourceRange BracketsRange); 378 379 /// \brief Build a new vector type given the element type and 380 /// number of elements. 381 /// 382 /// By default, performs semantic analysis when building the vector type. 383 /// Subclasses may override this routine to provide different behavior. 384 QualType RebuildVectorType(QualType ElementType, unsigned NumElements); 385 386 /// \brief Build a new extended vector type given the element type and 387 /// number of elements. 388 /// 389 /// By default, performs semantic analysis when building the vector type. 390 /// Subclasses may override this routine to provide different behavior. 391 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 392 SourceLocation AttributeLoc); 393 394 /// \brief Build a new potentially dependently-sized extended vector type 395 /// given the element type and number of elements. 396 /// 397 /// By default, performs semantic analysis when building the vector type. 398 /// Subclasses may override this routine to provide different behavior. 399 QualType RebuildDependentSizedExtVectorType(QualType ElementType, 400 ExprArg SizeExpr, 401 SourceLocation AttributeLoc); 402 403 /// \brief Build a new function type. 404 /// 405 /// By default, performs semantic analysis when building the function type. 406 /// Subclasses may override this routine to provide different behavior. 407 QualType RebuildFunctionProtoType(QualType T, 408 QualType *ParamTypes, 409 unsigned NumParamTypes, 410 bool Variadic, unsigned Quals); 411 412 /// \brief Build a new typedef type. 413 QualType RebuildTypedefType(TypedefDecl *Typedef) { 414 return SemaRef.Context.getTypeDeclType(Typedef); 415 } 416 417 /// \brief Build a new class/struct/union type. 418 QualType RebuildRecordType(RecordDecl *Record) { 419 return SemaRef.Context.getTypeDeclType(Record); 420 } 421 422 /// \brief Build a new Enum type. 423 QualType RebuildEnumType(EnumDecl *Enum) { 424 return SemaRef.Context.getTypeDeclType(Enum); 425 } 426 427 /// \brief Build a new elaborated type. 428 QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) { 429 return SemaRef.Context.getElaboratedType(T, Tag); 430 } 431 432 /// \brief Build a new typeof(expr) type. 433 /// 434 /// By default, performs semantic analysis when building the typeof type. 435 /// Subclasses may override this routine to provide different behavior. 436 QualType RebuildTypeOfExprType(ExprArg Underlying); 437 438 /// \brief Build a new typeof(type) type. 439 /// 440 /// By default, builds a new TypeOfType with the given underlying type. 441 QualType RebuildTypeOfType(QualType Underlying); 442 443 /// \brief Build a new C++0x decltype type. 444 /// 445 /// By default, performs semantic analysis when building the decltype type. 446 /// Subclasses may override this routine to provide different behavior. 447 QualType RebuildDecltypeType(ExprArg Underlying); 448 449 /// \brief Build a new template specialization type. 450 /// 451 /// By default, performs semantic analysis when building the template 452 /// specialization type. Subclasses may override this routine to provide 453 /// different behavior. 454 QualType RebuildTemplateSpecializationType(TemplateName Template, 455 const TemplateArgument *Args, 456 unsigned NumArgs); 457 458 /// \brief Build a new qualified name type. 459 /// 460 /// By default, builds a new QualifiedNameType type from the 461 /// nested-name-specifier and the named type. Subclasses may override 462 /// this routine to provide different behavior. 463 QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 464 return SemaRef.Context.getQualifiedNameType(NNS, Named); 465 } 466 467 /// \brief Build a new typename type that refers to a template-id. 468 /// 469 /// By default, builds a new TypenameType type from the nested-name-specifier 470 /// and the given type. Subclasses may override this routine to provide 471 /// different behavior. 472 QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) { 473 if (NNS->isDependent()) 474 return SemaRef.Context.getTypenameType(NNS, 475 cast<TemplateSpecializationType>(T)); 476 477 return SemaRef.Context.getQualifiedNameType(NNS, T); 478 } 479 480 /// \brief Build a new typename type that refers to an identifier. 481 /// 482 /// By default, performs semantic analysis when building the typename type 483 /// (or qualified name type). Subclasses may override this routine to provide 484 /// different behavior. 485 QualType RebuildTypenameType(NestedNameSpecifier *NNS, 486 const IdentifierInfo *Id) { 487 return SemaRef.CheckTypenameType(NNS, *Id, 488 SourceRange(getDerived().getBaseLocation())); 489 } 490 491 /// \brief Build a new nested-name-specifier given the prefix and an 492 /// identifier that names the next step in the nested-name-specifier. 493 /// 494 /// By default, performs semantic analysis when building the new 495 /// nested-name-specifier. Subclasses may override this routine to provide 496 /// different behavior. 497 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 498 SourceRange Range, 499 IdentifierInfo &II, 500 QualType ObjectType, 501 NamedDecl *FirstQualifierInScope); 502 503 /// \brief Build a new nested-name-specifier given the prefix and the 504 /// namespace named in the next step in the nested-name-specifier. 505 /// 506 /// By default, performs semantic analysis when building the new 507 /// nested-name-specifier. Subclasses may override this routine to provide 508 /// different behavior. 509 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 510 SourceRange Range, 511 NamespaceDecl *NS); 512 513 /// \brief Build a new nested-name-specifier given the prefix and the 514 /// type named in the next step in the nested-name-specifier. 515 /// 516 /// By default, performs semantic analysis when building the new 517 /// nested-name-specifier. Subclasses may override this routine to provide 518 /// different behavior. 519 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 520 SourceRange Range, 521 bool TemplateKW, 522 QualType T); 523 524 /// \brief Build a new template name given a nested name specifier, a flag 525 /// indicating whether the "template" keyword was provided, and the template 526 /// that the template name refers to. 527 /// 528 /// By default, builds the new template name directly. Subclasses may override 529 /// this routine to provide different behavior. 530 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 531 bool TemplateKW, 532 TemplateDecl *Template); 533 534 /// \brief Build a new template name given a nested name specifier, a flag 535 /// indicating whether the "template" keyword was provided, and a set of 536 /// overloaded function templates. 537 /// 538 /// By default, builds the new template name directly. Subclasses may override 539 /// this routine to provide different behavior. 540 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 541 bool TemplateKW, 542 OverloadedFunctionDecl *Ovl); 543 544 /// \brief Build a new template name given a nested name specifier and the 545 /// name that is referred to as a template. 546 /// 547 /// By default, performs semantic analysis to determine whether the name can 548 /// be resolved to a specific template, then builds the appropriate kind of 549 /// template name. Subclasses may override this routine to provide different 550 /// behavior. 551 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 552 const IdentifierInfo &II, 553 QualType ObjectType); 554 555 556 /// \brief Build a new compound statement. 557 /// 558 /// By default, performs semantic analysis to build the new statement. 559 /// Subclasses may override this routine to provide different behavior. 560 OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 561 MultiStmtArg Statements, 562 SourceLocation RBraceLoc, 563 bool IsStmtExpr) { 564 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements), 565 IsStmtExpr); 566 } 567 568 /// \brief Build a new case statement. 569 /// 570 /// By default, performs semantic analysis to build the new statement. 571 /// Subclasses may override this routine to provide different behavior. 572 OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc, 573 ExprArg LHS, 574 SourceLocation EllipsisLoc, 575 ExprArg RHS, 576 SourceLocation ColonLoc) { 577 return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS), 578 ColonLoc); 579 } 580 581 /// \brief Attach the body to a new case statement. 582 /// 583 /// By default, performs semantic analysis to build the new statement. 584 /// Subclasses may override this routine to provide different behavior. 585 OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) { 586 getSema().ActOnCaseStmtBody(S.get(), move(Body)); 587 return move(S); 588 } 589 590 /// \brief Build a new default statement. 591 /// 592 /// By default, performs semantic analysis to build the new statement. 593 /// Subclasses may override this routine to provide different behavior. 594 OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 595 SourceLocation ColonLoc, 596 StmtArg SubStmt) { 597 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt), 598 /*CurScope=*/0); 599 } 600 601 /// \brief Build a new label statement. 602 /// 603 /// By default, performs semantic analysis to build the new statement. 604 /// Subclasses may override this routine to provide different behavior. 605 OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc, 606 IdentifierInfo *Id, 607 SourceLocation ColonLoc, 608 StmtArg SubStmt) { 609 return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt)); 610 } 611 612 /// \brief Build a new "if" statement. 613 /// 614 /// By default, performs semantic analysis to build the new statement. 615 /// Subclasses may override this routine to provide different behavior. 616 OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 617 StmtArg Then, SourceLocation ElseLoc, 618 StmtArg Else) { 619 return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else)); 620 } 621 622 /// \brief Start building a new switch statement. 623 /// 624 /// By default, performs semantic analysis to build the new statement. 625 /// Subclasses may override this routine to provide different behavior. 626 OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) { 627 return getSema().ActOnStartOfSwitchStmt(move(Cond)); 628 } 629 630 /// \brief Attach the body to the switch statement. 631 /// 632 /// By default, performs semantic analysis to build the new statement. 633 /// Subclasses may override this routine to provide different behavior. 634 OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 635 StmtArg Switch, StmtArg Body) { 636 return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch), 637 move(Body)); 638 } 639 640 /// \brief Build a new while statement. 641 /// 642 /// By default, performs semantic analysis to build the new statement. 643 /// Subclasses may override this routine to provide different behavior. 644 OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc, 645 Sema::FullExprArg Cond, 646 StmtArg Body) { 647 return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body)); 648 } 649 650 /// \brief Build a new do-while statement. 651 /// 652 /// By default, performs semantic analysis to build the new statement. 653 /// Subclasses may override this routine to provide different behavior. 654 OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body, 655 SourceLocation WhileLoc, 656 SourceLocation LParenLoc, 657 ExprArg Cond, 658 SourceLocation RParenLoc) { 659 return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc, 660 move(Cond), RParenLoc); 661 } 662 663 /// \brief Build a new for statement. 664 /// 665 /// By default, performs semantic analysis to build the new statement. 666 /// Subclasses may override this routine to provide different behavior. 667 OwningStmtResult RebuildForStmt(SourceLocation ForLoc, 668 SourceLocation LParenLoc, 669 StmtArg Init, ExprArg Cond, ExprArg Inc, 670 SourceLocation RParenLoc, StmtArg Body) { 671 return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond), 672 move(Inc), RParenLoc, move(Body)); 673 } 674 675 /// \brief Build a new goto statement. 676 /// 677 /// By default, performs semantic analysis to build the new statement. 678 /// Subclasses may override this routine to provide different behavior. 679 OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc, 680 SourceLocation LabelLoc, 681 LabelStmt *Label) { 682 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID()); 683 } 684 685 /// \brief Build a new indirect goto statement. 686 /// 687 /// By default, performs semantic analysis to build the new statement. 688 /// Subclasses may override this routine to provide different behavior. 689 OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 690 SourceLocation StarLoc, 691 ExprArg Target) { 692 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target)); 693 } 694 695 /// \brief Build a new return statement. 696 /// 697 /// By default, performs semantic analysis to build the new statement. 698 /// Subclasses may override this routine to provide different behavior. 699 OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc, 700 ExprArg Result) { 701 702 return getSema().ActOnReturnStmt(ReturnLoc, move(Result)); 703 } 704 705 /// \brief Build a new declaration statement. 706 /// 707 /// By default, performs semantic analysis to build the new statement. 708 /// Subclasses may override this routine to provide different behavior. 709 OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 710 SourceLocation StartLoc, 711 SourceLocation EndLoc) { 712 return getSema().Owned( 713 new (getSema().Context) DeclStmt( 714 DeclGroupRef::Create(getSema().Context, 715 Decls, NumDecls), 716 StartLoc, EndLoc)); 717 } 718 719 /// \brief Build a new C++ exception declaration. 720 /// 721 /// By default, performs semantic analysis to build the new decaration. 722 /// Subclasses may override this routine to provide different behavior. 723 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T, 724 DeclaratorInfo *Declarator, 725 IdentifierInfo *Name, 726 SourceLocation Loc, 727 SourceRange TypeRange) { 728 return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc, 729 TypeRange); 730 } 731 732 /// \brief Build a new C++ catch statement. 733 /// 734 /// By default, performs semantic analysis to build the new statement. 735 /// Subclasses may override this routine to provide different behavior. 736 OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 737 VarDecl *ExceptionDecl, 738 StmtArg Handler) { 739 return getSema().Owned( 740 new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 741 Handler.takeAs<Stmt>())); 742 } 743 744 /// \brief Build a new C++ try statement. 745 /// 746 /// By default, performs semantic analysis to build the new statement. 747 /// Subclasses may override this routine to provide different behavior. 748 OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 749 StmtArg TryBlock, 750 MultiStmtArg Handlers) { 751 return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers)); 752 } 753 754 /// \brief Build a new expression that references a declaration. 755 /// 756 /// By default, performs semantic analysis to build the new expression. 757 /// Subclasses may override this routine to provide different behavior. 758 OwningExprResult RebuildDeclRefExpr(NamedDecl *ND, SourceLocation Loc) { 759 return getSema().BuildDeclarationNameExpr(Loc, ND, 760 /*FIXME:*/false, 761 /*SS=*/0, 762 /*FIXME:*/false); 763 } 764 765 /// \brief Build a new expression in parentheses. 766 /// 767 /// By default, performs semantic analysis to build the new expression. 768 /// Subclasses may override this routine to provide different behavior. 769 OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 770 SourceLocation RParen) { 771 return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 772 } 773 774 /// \brief Build a new pseudo-destructor expression. 775 /// 776 /// By default, performs semantic analysis to build the new expression. 777 /// Subclasses may override this routine to provide different behavior. 778 OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base, 779 SourceLocation OperatorLoc, 780 bool isArrow, 781 SourceLocation DestroyedTypeLoc, 782 QualType DestroyedType, 783 NestedNameSpecifier *Qualifier, 784 SourceRange QualifierRange) { 785 CXXScopeSpec SS; 786 if (Qualifier) { 787 SS.setRange(QualifierRange); 788 SS.setScopeRep(Qualifier); 789 } 790 791 DeclarationName Name 792 = SemaRef.Context.DeclarationNames.getCXXDestructorName( 793 SemaRef.Context.getCanonicalType(DestroyedType)); 794 795 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 796 OperatorLoc, 797 isArrow? tok::arrow : tok::period, 798 DestroyedTypeLoc, 799 Name, 800 Sema::DeclPtrTy::make((Decl *)0), 801 &SS); 802 } 803 804 /// \brief Build a new unary operator expression. 805 /// 806 /// By default, performs semantic analysis to build the new expression. 807 /// Subclasses may override this routine to provide different behavior. 808 OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 809 UnaryOperator::Opcode Opc, 810 ExprArg SubExpr) { 811 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr)); 812 } 813 814 /// \brief Build a new sizeof or alignof expression with a type argument. 815 /// 816 /// By default, performs semantic analysis to build the new expression. 817 /// Subclasses may override this routine to provide different behavior. 818 OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc, 819 bool isSizeOf, SourceRange R) { 820 return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R); 821 } 822 823 /// \brief Build a new sizeof or alignof expression with an expression 824 /// argument. 825 /// 826 /// By default, performs semantic analysis to build the new expression. 827 /// Subclasses may override this routine to provide different behavior. 828 OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 829 bool isSizeOf, SourceRange R) { 830 OwningExprResult Result 831 = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 832 OpLoc, isSizeOf, R); 833 if (Result.isInvalid()) 834 return getSema().ExprError(); 835 836 SubExpr.release(); 837 return move(Result); 838 } 839 840 /// \brief Build a new array subscript expression. 841 /// 842 /// By default, performs semantic analysis to build the new expression. 843 /// Subclasses may override this routine to provide different behavior. 844 OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 845 SourceLocation LBracketLoc, 846 ExprArg RHS, 847 SourceLocation RBracketLoc) { 848 return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 849 LBracketLoc, move(RHS), 850 RBracketLoc); 851 } 852 853 /// \brief Build a new call expression. 854 /// 855 /// By default, performs semantic analysis to build the new expression. 856 /// Subclasses may override this routine to provide different behavior. 857 OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 858 MultiExprArg Args, 859 SourceLocation *CommaLocs, 860 SourceLocation RParenLoc) { 861 return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 862 move(Args), CommaLocs, RParenLoc); 863 } 864 865 /// \brief Build a new member access expression. 866 /// 867 /// By default, performs semantic analysis to build the new expression. 868 /// Subclasses may override this routine to provide different behavior. 869 OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 870 bool isArrow, 871 NestedNameSpecifier *Qualifier, 872 SourceRange QualifierRange, 873 SourceLocation MemberLoc, 874 NamedDecl *Member) { 875 if (!Member->getDeclName()) { 876 // We have a reference to an unnamed field. 877 assert(!Qualifier && "Can't have an unnamed field with a qualifier!"); 878 879 MemberExpr *ME = 880 new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow, 881 Member, MemberLoc, 882 cast<FieldDecl>(Member)->getType()); 883 return getSema().Owned(ME); 884 } 885 886 CXXScopeSpec SS; 887 if (Qualifier) { 888 SS.setRange(QualifierRange); 889 SS.setScopeRep(Qualifier); 890 } 891 892 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 893 isArrow? tok::arrow : tok::period, 894 MemberLoc, 895 Member->getDeclName(), 896 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 897 &SS); 898 } 899 900 /// \brief Build a new binary operator expression. 901 /// 902 /// By default, performs semantic analysis to build the new expression. 903 /// Subclasses may override this routine to provide different behavior. 904 OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 905 BinaryOperator::Opcode Opc, 906 ExprArg LHS, ExprArg RHS) { 907 OwningExprResult Result 908 = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(), 909 (Expr *)RHS.get()); 910 if (Result.isInvalid()) 911 return SemaRef.ExprError(); 912 913 LHS.release(); 914 RHS.release(); 915 return move(Result); 916 } 917 918 /// \brief Build a new conditional operator expression. 919 /// 920 /// By default, performs semantic analysis to build the new expression. 921 /// Subclasses may override this routine to provide different behavior. 922 OwningExprResult RebuildConditionalOperator(ExprArg Cond, 923 SourceLocation QuestionLoc, 924 ExprArg LHS, 925 SourceLocation ColonLoc, 926 ExprArg RHS) { 927 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 928 move(LHS), move(RHS)); 929 } 930 931 /// \brief Build a new implicit cast expression. 932 /// 933 /// By default, builds a new implicit cast without any semantic analysis. 934 /// Subclasses may override this routine to provide different behavior. 935 OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind, 936 ExprArg SubExpr, bool isLvalue) { 937 ImplicitCastExpr *ICE 938 = new (getSema().Context) ImplicitCastExpr(T, Kind, 939 (Expr *)SubExpr.release(), 940 isLvalue); 941 return getSema().Owned(ICE); 942 } 943 944 /// \brief Build a new C-style cast expression. 945 /// 946 /// By default, performs semantic analysis to build the new expression. 947 /// Subclasses may override this routine to provide different behavior. 948 OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc, 949 QualType ExplicitTy, 950 SourceLocation RParenLoc, 951 ExprArg SubExpr) { 952 return getSema().ActOnCastExpr(/*Scope=*/0, 953 LParenLoc, 954 ExplicitTy.getAsOpaquePtr(), 955 RParenLoc, 956 move(SubExpr)); 957 } 958 959 /// \brief Build a new compound literal expression. 960 /// 961 /// By default, performs semantic analysis to build the new expression. 962 /// Subclasses may override this routine to provide different behavior. 963 OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 964 QualType T, 965 SourceLocation RParenLoc, 966 ExprArg Init) { 967 return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(), 968 RParenLoc, move(Init)); 969 } 970 971 /// \brief Build a new extended vector element access expression. 972 /// 973 /// By default, performs semantic analysis to build the new expression. 974 /// Subclasses may override this routine to provide different behavior. 975 OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 976 SourceLocation OpLoc, 977 SourceLocation AccessorLoc, 978 IdentifierInfo &Accessor) { 979 return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 980 tok::period, AccessorLoc, 981 Accessor, 982 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); 983 } 984 985 /// \brief Build a new initializer list expression. 986 /// 987 /// By default, performs semantic analysis to build the new expression. 988 /// Subclasses may override this routine to provide different behavior. 989 OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 990 MultiExprArg Inits, 991 SourceLocation RBraceLoc) { 992 return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 993 } 994 995 /// \brief Build a new designated initializer expression. 996 /// 997 /// By default, performs semantic analysis to build the new expression. 998 /// Subclasses may override this routine to provide different behavior. 999 OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 1000 MultiExprArg ArrayExprs, 1001 SourceLocation EqualOrColonLoc, 1002 bool GNUSyntax, 1003 ExprArg Init) { 1004 OwningExprResult Result 1005 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1006 move(Init)); 1007 if (Result.isInvalid()) 1008 return SemaRef.ExprError(); 1009 1010 ArrayExprs.release(); 1011 return move(Result); 1012 } 1013 1014 /// \brief Build a new value-initialized expression. 1015 /// 1016 /// By default, builds the implicit value initialization without performing 1017 /// any semantic analysis. Subclasses may override this routine to provide 1018 /// different behavior. 1019 OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1020 return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1021 } 1022 1023 /// \brief Build a new \c va_arg expression. 1024 /// 1025 /// By default, performs semantic analysis to build the new expression. 1026 /// Subclasses may override this routine to provide different behavior. 1027 OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1028 QualType T, SourceLocation RParenLoc) { 1029 return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1030 RParenLoc); 1031 } 1032 1033 /// \brief Build a new expression list in parentheses. 1034 /// 1035 /// By default, performs semantic analysis to build the new expression. 1036 /// Subclasses may override this routine to provide different behavior. 1037 OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1038 MultiExprArg SubExprs, 1039 SourceLocation RParenLoc) { 1040 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs)); 1041 } 1042 1043 /// \brief Build a new address-of-label expression. 1044 /// 1045 /// By default, performs semantic analysis, using the name of the label 1046 /// rather than attempting to map the label statement itself. 1047 /// Subclasses may override this routine to provide different behavior. 1048 OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1049 SourceLocation LabelLoc, 1050 LabelStmt *Label) { 1051 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1052 } 1053 1054 /// \brief Build a new GNU statement expression. 1055 /// 1056 /// By default, performs semantic analysis to build the new expression. 1057 /// Subclasses may override this routine to provide different behavior. 1058 OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1059 StmtArg SubStmt, 1060 SourceLocation RParenLoc) { 1061 return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1062 } 1063 1064 /// \brief Build a new __builtin_types_compatible_p expression. 1065 /// 1066 /// By default, performs semantic analysis to build the new expression. 1067 /// Subclasses may override this routine to provide different behavior. 1068 OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1069 QualType T1, QualType T2, 1070 SourceLocation RParenLoc) { 1071 return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1072 T1.getAsOpaquePtr(), 1073 T2.getAsOpaquePtr(), 1074 RParenLoc); 1075 } 1076 1077 /// \brief Build a new __builtin_choose_expr expression. 1078 /// 1079 /// By default, performs semantic analysis to build the new expression. 1080 /// Subclasses may override this routine to provide different behavior. 1081 OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1082 ExprArg Cond, ExprArg LHS, ExprArg RHS, 1083 SourceLocation RParenLoc) { 1084 return SemaRef.ActOnChooseExpr(BuiltinLoc, 1085 move(Cond), move(LHS), move(RHS), 1086 RParenLoc); 1087 } 1088 1089 /// \brief Build a new overloaded operator call expression. 1090 /// 1091 /// By default, performs semantic analysis to build the new expression. 1092 /// The semantic analysis provides the behavior of template instantiation, 1093 /// copying with transformations that turn what looks like an overloaded 1094 /// operator call into a use of a builtin operator, performing 1095 /// argument-dependent lookup, etc. Subclasses may override this routine to 1096 /// provide different behavior. 1097 OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1098 SourceLocation OpLoc, 1099 ExprArg Callee, 1100 ExprArg First, 1101 ExprArg Second); 1102 1103 /// \brief Build a new C++ "named" cast expression, such as static_cast or 1104 /// reinterpret_cast. 1105 /// 1106 /// By default, this routine dispatches to one of the more-specific routines 1107 /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1108 /// Subclasses may override this routine to provide different behavior. 1109 OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1110 Stmt::StmtClass Class, 1111 SourceLocation LAngleLoc, 1112 QualType T, 1113 SourceLocation RAngleLoc, 1114 SourceLocation LParenLoc, 1115 ExprArg SubExpr, 1116 SourceLocation RParenLoc) { 1117 switch (Class) { 1118 case Stmt::CXXStaticCastExprClass: 1119 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T, 1120 RAngleLoc, LParenLoc, 1121 move(SubExpr), RParenLoc); 1122 1123 case Stmt::CXXDynamicCastExprClass: 1124 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T, 1125 RAngleLoc, LParenLoc, 1126 move(SubExpr), RParenLoc); 1127 1128 case Stmt::CXXReinterpretCastExprClass: 1129 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T, 1130 RAngleLoc, LParenLoc, 1131 move(SubExpr), 1132 RParenLoc); 1133 1134 case Stmt::CXXConstCastExprClass: 1135 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T, 1136 RAngleLoc, LParenLoc, 1137 move(SubExpr), RParenLoc); 1138 1139 default: 1140 assert(false && "Invalid C++ named cast"); 1141 break; 1142 } 1143 1144 return getSema().ExprError(); 1145 } 1146 1147 /// \brief Build a new C++ static_cast expression. 1148 /// 1149 /// By default, performs semantic analysis to build the new expression. 1150 /// Subclasses may override this routine to provide different behavior. 1151 OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1152 SourceLocation LAngleLoc, 1153 QualType T, 1154 SourceLocation RAngleLoc, 1155 SourceLocation LParenLoc, 1156 ExprArg SubExpr, 1157 SourceLocation RParenLoc) { 1158 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast, 1159 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1160 LParenLoc, move(SubExpr), RParenLoc); 1161 } 1162 1163 /// \brief Build a new C++ dynamic_cast expression. 1164 /// 1165 /// By default, performs semantic analysis to build the new expression. 1166 /// Subclasses may override this routine to provide different behavior. 1167 OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1168 SourceLocation LAngleLoc, 1169 QualType T, 1170 SourceLocation RAngleLoc, 1171 SourceLocation LParenLoc, 1172 ExprArg SubExpr, 1173 SourceLocation RParenLoc) { 1174 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 1175 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1176 LParenLoc, move(SubExpr), RParenLoc); 1177 } 1178 1179 /// \brief Build a new C++ reinterpret_cast expression. 1180 /// 1181 /// By default, performs semantic analysis to build the new expression. 1182 /// Subclasses may override this routine to provide different behavior. 1183 OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1184 SourceLocation LAngleLoc, 1185 QualType T, 1186 SourceLocation RAngleLoc, 1187 SourceLocation LParenLoc, 1188 ExprArg SubExpr, 1189 SourceLocation RParenLoc) { 1190 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1191 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1192 LParenLoc, move(SubExpr), RParenLoc); 1193 } 1194 1195 /// \brief Build a new C++ const_cast expression. 1196 /// 1197 /// By default, performs semantic analysis to build the new expression. 1198 /// Subclasses may override this routine to provide different behavior. 1199 OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1200 SourceLocation LAngleLoc, 1201 QualType T, 1202 SourceLocation RAngleLoc, 1203 SourceLocation LParenLoc, 1204 ExprArg SubExpr, 1205 SourceLocation RParenLoc) { 1206 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast, 1207 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1208 LParenLoc, move(SubExpr), RParenLoc); 1209 } 1210 1211 /// \brief Build a new C++ functional-style cast expression. 1212 /// 1213 /// By default, performs semantic analysis to build the new expression. 1214 /// Subclasses may override this routine to provide different behavior. 1215 OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 1216 QualType T, 1217 SourceLocation LParenLoc, 1218 ExprArg SubExpr, 1219 SourceLocation RParenLoc) { 1220 void *Sub = SubExpr.takeAs<Expr>(); 1221 return getSema().ActOnCXXTypeConstructExpr(TypeRange, 1222 T.getAsOpaquePtr(), 1223 LParenLoc, 1224 Sema::MultiExprArg(getSema(), &Sub, 1), 1225 /*CommaLocs=*/0, 1226 RParenLoc); 1227 } 1228 1229 /// \brief Build a new C++ typeid(type) expression. 1230 /// 1231 /// By default, performs semantic analysis to build the new expression. 1232 /// Subclasses may override this routine to provide different behavior. 1233 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1234 SourceLocation LParenLoc, 1235 QualType T, 1236 SourceLocation RParenLoc) { 1237 return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 1238 T.getAsOpaquePtr(), RParenLoc); 1239 } 1240 1241 /// \brief Build a new C++ typeid(expr) expression. 1242 /// 1243 /// By default, performs semantic analysis to build the new expression. 1244 /// Subclasses may override this routine to provide different behavior. 1245 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1246 SourceLocation LParenLoc, 1247 ExprArg Operand, 1248 SourceLocation RParenLoc) { 1249 OwningExprResult Result 1250 = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 1251 RParenLoc); 1252 if (Result.isInvalid()) 1253 return getSema().ExprError(); 1254 1255 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 1256 return move(Result); 1257 } 1258 1259 /// \brief Build a new C++ "this" expression. 1260 /// 1261 /// By default, builds a new "this" expression without performing any 1262 /// semantic analysis. Subclasses may override this routine to provide 1263 /// different behavior. 1264 OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1265 QualType ThisType) { 1266 return getSema().Owned( 1267 new (getSema().Context) CXXThisExpr(ThisLoc, ThisType)); 1268 } 1269 1270 /// \brief Build a new C++ throw expression. 1271 /// 1272 /// By default, performs semantic analysis to build the new expression. 1273 /// Subclasses may override this routine to provide different behavior. 1274 OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1275 return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1276 } 1277 1278 /// \brief Build a new C++ default-argument expression. 1279 /// 1280 /// By default, builds a new default-argument expression, which does not 1281 /// require any semantic analysis. Subclasses may override this routine to 1282 /// provide different behavior. 1283 OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) { 1284 return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param)); 1285 } 1286 1287 /// \brief Build a new C++ zero-initialization expression. 1288 /// 1289 /// By default, performs semantic analysis to build the new expression. 1290 /// Subclasses may override this routine to provide different behavior. 1291 OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1292 SourceLocation LParenLoc, 1293 QualType T, 1294 SourceLocation RParenLoc) { 1295 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 1296 T.getAsOpaquePtr(), LParenLoc, 1297 MultiExprArg(getSema(), 0, 0), 1298 0, RParenLoc); 1299 } 1300 1301 /// \brief Build a new C++ conditional declaration expression. 1302 /// 1303 /// By default, performs semantic analysis to build the new expression. 1304 /// Subclasses may override this routine to provide different behavior. 1305 OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc, 1306 SourceLocation EqLoc, 1307 VarDecl *Var) { 1308 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc, 1309 EqLoc, 1310 Var)); 1311 } 1312 1313 /// \brief Build a new C++ "new" expression. 1314 /// 1315 /// By default, performs semantic analysis to build the new expression. 1316 /// Subclasses may override this routine to provide different behavior. 1317 OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1318 bool UseGlobal, 1319 SourceLocation PlacementLParen, 1320 MultiExprArg PlacementArgs, 1321 SourceLocation PlacementRParen, 1322 bool ParenTypeId, 1323 QualType AllocType, 1324 SourceLocation TypeLoc, 1325 SourceRange TypeRange, 1326 ExprArg ArraySize, 1327 SourceLocation ConstructorLParen, 1328 MultiExprArg ConstructorArgs, 1329 SourceLocation ConstructorRParen) { 1330 return getSema().BuildCXXNew(StartLoc, UseGlobal, 1331 PlacementLParen, 1332 move(PlacementArgs), 1333 PlacementRParen, 1334 ParenTypeId, 1335 AllocType, 1336 TypeLoc, 1337 TypeRange, 1338 move(ArraySize), 1339 ConstructorLParen, 1340 move(ConstructorArgs), 1341 ConstructorRParen); 1342 } 1343 1344 /// \brief Build a new C++ "delete" expression. 1345 /// 1346 /// By default, performs semantic analysis to build the new expression. 1347 /// Subclasses may override this routine to provide different behavior. 1348 OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1349 bool IsGlobalDelete, 1350 bool IsArrayForm, 1351 ExprArg Operand) { 1352 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1353 move(Operand)); 1354 } 1355 1356 /// \brief Build a new unary type trait expression. 1357 /// 1358 /// By default, performs semantic analysis to build the new expression. 1359 /// Subclasses may override this routine to provide different behavior. 1360 OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1361 SourceLocation StartLoc, 1362 SourceLocation LParenLoc, 1363 QualType T, 1364 SourceLocation RParenLoc) { 1365 return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1366 T.getAsOpaquePtr(), RParenLoc); 1367 } 1368 1369 /// \brief Build a new qualified declaration reference expression. 1370 /// 1371 /// By default, performs semantic analysis to build the new expression. 1372 /// Subclasses may override this routine to provide different behavior. 1373 OwningExprResult RebuildQualifiedDeclRefExpr(NestedNameSpecifier *NNS, 1374 SourceRange QualifierRange, 1375 NamedDecl *ND, 1376 SourceLocation Location, 1377 bool IsAddressOfOperand) { 1378 CXXScopeSpec SS; 1379 SS.setRange(QualifierRange); 1380 SS.setScopeRep(NNS); 1381 return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1382 Location, 1383 ND->getDeclName(), 1384 /*Trailing lparen=*/false, 1385 &SS, 1386 IsAddressOfOperand); 1387 } 1388 1389 /// \brief Build a new (previously unresolved) declaration reference 1390 /// expression. 1391 /// 1392 /// By default, performs semantic analysis to build the new expression. 1393 /// Subclasses may override this routine to provide different behavior. 1394 OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS, 1395 SourceRange QualifierRange, 1396 DeclarationName Name, 1397 SourceLocation Location, 1398 bool IsAddressOfOperand) { 1399 CXXScopeSpec SS; 1400 SS.setRange(QualifierRange); 1401 SS.setScopeRep(NNS); 1402 return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1403 Location, 1404 Name, 1405 /*Trailing lparen=*/false, 1406 &SS, 1407 IsAddressOfOperand); 1408 } 1409 1410 /// \brief Build a new template-id expression. 1411 /// 1412 /// By default, performs semantic analysis to build the new expression. 1413 /// Subclasses may override this routine to provide different behavior. 1414 OwningExprResult RebuildTemplateIdExpr(TemplateName Template, 1415 SourceLocation TemplateLoc, 1416 SourceLocation LAngleLoc, 1417 TemplateArgument *TemplateArgs, 1418 unsigned NumTemplateArgs, 1419 SourceLocation RAngleLoc) { 1420 return getSema().BuildTemplateIdExpr(Template, TemplateLoc, 1421 LAngleLoc, 1422 TemplateArgs, NumTemplateArgs, 1423 RAngleLoc); 1424 } 1425 1426 /// \brief Build a new object-construction expression. 1427 /// 1428 /// By default, performs semantic analysis to build the new expression. 1429 /// Subclasses may override this routine to provide different behavior. 1430 OwningExprResult RebuildCXXConstructExpr(QualType T, 1431 CXXConstructorDecl *Constructor, 1432 bool IsElidable, 1433 MultiExprArg Args) { 1434 return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/ 1435 SourceLocation(), 1436 T, Constructor, IsElidable, 1437 move(Args)); 1438 } 1439 1440 /// \brief Build a new object-construction expression. 1441 /// 1442 /// By default, performs semantic analysis to build the new expression. 1443 /// Subclasses may override this routine to provide different behavior. 1444 OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1445 QualType T, 1446 SourceLocation LParenLoc, 1447 MultiExprArg Args, 1448 SourceLocation *Commas, 1449 SourceLocation RParenLoc) { 1450 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1451 T.getAsOpaquePtr(), 1452 LParenLoc, 1453 move(Args), 1454 Commas, 1455 RParenLoc); 1456 } 1457 1458 /// \brief Build a new object-construction expression. 1459 /// 1460 /// By default, performs semantic analysis to build the new expression. 1461 /// Subclasses may override this routine to provide different behavior. 1462 OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1463 QualType T, 1464 SourceLocation LParenLoc, 1465 MultiExprArg Args, 1466 SourceLocation *Commas, 1467 SourceLocation RParenLoc) { 1468 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1469 /*FIXME*/LParenLoc), 1470 T.getAsOpaquePtr(), 1471 LParenLoc, 1472 move(Args), 1473 Commas, 1474 RParenLoc); 1475 } 1476 1477 /// \brief Build a new member reference expression. 1478 /// 1479 /// By default, performs semantic analysis to build the new expression. 1480 /// Subclasses may override this routine to provide different behavior. 1481 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 1482 bool IsArrow, 1483 SourceLocation OperatorLoc, 1484 NestedNameSpecifier *Qualifier, 1485 SourceRange QualifierRange, 1486 DeclarationName Name, 1487 SourceLocation MemberLoc, 1488 NamedDecl *FirstQualifierInScope) { 1489 OwningExprResult Base = move(BaseE); 1490 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 1491 1492 CXXScopeSpec SS; 1493 SS.setRange(QualifierRange); 1494 SS.setScopeRep(Qualifier); 1495 1496 return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, 1497 move(Base), OperatorLoc, OpKind, 1498 MemberLoc, 1499 Name, 1500 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 1501 &SS, 1502 FirstQualifierInScope); 1503 } 1504 1505 /// \brief Build a new member reference expression with explicit template 1506 /// arguments. 1507 /// 1508 /// By default, performs semantic analysis to build the new expression. 1509 /// Subclasses may override this routine to provide different behavior. 1510 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 1511 bool IsArrow, 1512 SourceLocation OperatorLoc, 1513 NestedNameSpecifier *Qualifier, 1514 SourceRange QualifierRange, 1515 TemplateName Template, 1516 SourceLocation TemplateNameLoc, 1517 NamedDecl *FirstQualifierInScope, 1518 SourceLocation LAngleLoc, 1519 const TemplateArgument *TemplateArgs, 1520 unsigned NumTemplateArgs, 1521 SourceLocation RAngleLoc) { 1522 OwningExprResult Base = move(BaseE); 1523 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 1524 1525 CXXScopeSpec SS; 1526 SS.setRange(QualifierRange); 1527 SS.setScopeRep(Qualifier); 1528 1529 // FIXME: We're going to end up looking up the template based on its name, 1530 // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr. 1531 DeclarationName Name; 1532 if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl()) 1533 Name = ActualTemplate->getDeclName(); 1534 else if (OverloadedFunctionDecl *Ovl 1535 = Template.getAsOverloadedFunctionDecl()) 1536 Name = Ovl->getDeclName(); 1537 else 1538 Name = Template.getAsDependentTemplateName()->getName(); 1539 1540 return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 1541 OperatorLoc, OpKind, 1542 TemplateNameLoc, Name, true, 1543 LAngleLoc, TemplateArgs, 1544 NumTemplateArgs, RAngleLoc, 1545 Sema::DeclPtrTy(), &SS); 1546 } 1547 1548 /// \brief Build a new Objective-C @encode expression. 1549 /// 1550 /// By default, performs semantic analysis to build the new expression. 1551 /// Subclasses may override this routine to provide different behavior. 1552 OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1553 QualType T, 1554 SourceLocation RParenLoc) { 1555 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1556 RParenLoc)); 1557 } 1558 1559 /// \brief Build a new Objective-C protocol expression. 1560 /// 1561 /// By default, performs semantic analysis to build the new expression. 1562 /// Subclasses may override this routine to provide different behavior. 1563 OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1564 SourceLocation AtLoc, 1565 SourceLocation ProtoLoc, 1566 SourceLocation LParenLoc, 1567 SourceLocation RParenLoc) { 1568 return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1569 Protocol->getIdentifier(), 1570 AtLoc, 1571 ProtoLoc, 1572 LParenLoc, 1573 RParenLoc)); 1574 } 1575 1576 /// \brief Build a new shuffle vector expression. 1577 /// 1578 /// By default, performs semantic analysis to build the new expression. 1579 /// Subclasses may override this routine to provide different behavior. 1580 OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1581 MultiExprArg SubExprs, 1582 SourceLocation RParenLoc) { 1583 // Find the declaration for __builtin_shufflevector 1584 const IdentifierInfo &Name 1585 = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1586 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1587 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1588 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 1589 1590 // Build a reference to the __builtin_shufflevector builtin 1591 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 1592 Expr *Callee 1593 = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 1594 BuiltinLoc, false, false); 1595 SemaRef.UsualUnaryConversions(Callee); 1596 1597 // Build the CallExpr 1598 unsigned NumSubExprs = SubExprs.size(); 1599 Expr **Subs = (Expr **)SubExprs.release(); 1600 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1601 Subs, NumSubExprs, 1602 Builtin->getResultType(), 1603 RParenLoc); 1604 OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 1605 1606 // Type-check the __builtin_shufflevector expression. 1607 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1608 if (Result.isInvalid()) 1609 return SemaRef.ExprError(); 1610 1611 OwnedCall.release(); 1612 return move(Result); 1613 } 1614}; 1615 1616template<typename Derived> 1617Sema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 1618 if (!S) 1619 return SemaRef.Owned(S); 1620 1621 switch (S->getStmtClass()) { 1622 case Stmt::NoStmtClass: break; 1623 1624 // Transform individual statement nodes 1625#define STMT(Node, Parent) \ 1626 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 1627#define EXPR(Node, Parent) 1628#include "clang/AST/StmtNodes.def" 1629 1630 // Transform expressions by calling TransformExpr. 1631#define STMT(Node, Parent) 1632#define EXPR(Node, Parent) case Stmt::Node##Class: 1633#include "clang/AST/StmtNodes.def" 1634 { 1635 Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 1636 if (E.isInvalid()) 1637 return getSema().StmtError(); 1638 1639 return getSema().Owned(E.takeAs<Stmt>()); 1640 } 1641 } 1642 1643 return SemaRef.Owned(S->Retain()); 1644} 1645 1646 1647template<typename Derived> 1648Sema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E, 1649 bool isAddressOfOperand) { 1650 if (!E) 1651 return SemaRef.Owned(E); 1652 1653 switch (E->getStmtClass()) { 1654 case Stmt::NoStmtClass: break; 1655#define STMT(Node, Parent) case Stmt::Node##Class: break; 1656#define EXPR(Node, Parent) \ 1657 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 1658#include "clang/AST/StmtNodes.def" 1659 } 1660 1661 return SemaRef.Owned(E->Retain()); 1662} 1663 1664template<typename Derived> 1665NestedNameSpecifier * 1666TreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1667 SourceRange Range, 1668 QualType ObjectType, 1669 NamedDecl *FirstQualifierInScope) { 1670 if (!NNS) 1671 return 0; 1672 1673 // Transform the prefix of this nested name specifier. 1674 NestedNameSpecifier *Prefix = NNS->getPrefix(); 1675 if (Prefix) { 1676 Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 1677 ObjectType, 1678 FirstQualifierInScope); 1679 if (!Prefix) 1680 return 0; 1681 1682 // Clear out the object type and the first qualifier in scope; they only 1683 // apply to the first element in the nested-name-specifier. 1684 ObjectType = QualType(); 1685 FirstQualifierInScope = 0; 1686 } 1687 1688 switch (NNS->getKind()) { 1689 case NestedNameSpecifier::Identifier: 1690 assert((Prefix || !ObjectType.isNull()) && 1691 "Identifier nested-name-specifier with no prefix or object type"); 1692 if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 1693 ObjectType.isNull()) 1694 return NNS; 1695 1696 return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1697 *NNS->getAsIdentifier(), 1698 ObjectType, 1699 FirstQualifierInScope); 1700 1701 case NestedNameSpecifier::Namespace: { 1702 NamespaceDecl *NS 1703 = cast_or_null<NamespaceDecl>( 1704 getDerived().TransformDecl(NNS->getAsNamespace())); 1705 if (!getDerived().AlwaysRebuild() && 1706 Prefix == NNS->getPrefix() && 1707 NS == NNS->getAsNamespace()) 1708 return NNS; 1709 1710 return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1711 } 1712 1713 case NestedNameSpecifier::Global: 1714 // There is no meaningful transformation that one could perform on the 1715 // global scope. 1716 return NNS; 1717 1718 case NestedNameSpecifier::TypeSpecWithTemplate: 1719 case NestedNameSpecifier::TypeSpec: { 1720 QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0)); 1721 if (T.isNull()) 1722 return 0; 1723 1724 if (!getDerived().AlwaysRebuild() && 1725 Prefix == NNS->getPrefix() && 1726 T == QualType(NNS->getAsType(), 0)) 1727 return NNS; 1728 1729 return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1730 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1731 T); 1732 } 1733 } 1734 1735 // Required to silence a GCC warning 1736 return 0; 1737} 1738 1739template<typename Derived> 1740DeclarationName 1741TreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 1742 SourceLocation Loc, 1743 QualType ObjectType) { 1744 if (!Name) 1745 return Name; 1746 1747 switch (Name.getNameKind()) { 1748 case DeclarationName::Identifier: 1749 case DeclarationName::ObjCZeroArgSelector: 1750 case DeclarationName::ObjCOneArgSelector: 1751 case DeclarationName::ObjCMultiArgSelector: 1752 case DeclarationName::CXXOperatorName: 1753 case DeclarationName::CXXUsingDirective: 1754 return Name; 1755 1756 case DeclarationName::CXXConstructorName: 1757 case DeclarationName::CXXDestructorName: 1758 case DeclarationName::CXXConversionFunctionName: { 1759 TemporaryBase Rebase(*this, Loc, Name); 1760 QualType T; 1761 if (!ObjectType.isNull() && 1762 isa<TemplateSpecializationType>(Name.getCXXNameType())) { 1763 TemplateSpecializationType *SpecType 1764 = cast<TemplateSpecializationType>(Name.getCXXNameType()); 1765 T = TransformTemplateSpecializationType(SpecType, ObjectType); 1766 } else 1767 T = getDerived().TransformType(Name.getCXXNameType()); 1768 if (T.isNull()) 1769 return DeclarationName(); 1770 1771 return SemaRef.Context.DeclarationNames.getCXXSpecialName( 1772 Name.getNameKind(), 1773 SemaRef.Context.getCanonicalType(T)); 1774 } 1775 } 1776 1777 return DeclarationName(); 1778} 1779 1780template<typename Derived> 1781TemplateName 1782TreeTransform<Derived>::TransformTemplateName(TemplateName Name, 1783 QualType ObjectType) { 1784 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 1785 NestedNameSpecifier *NNS 1786 = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1787 /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1788 if (!NNS) 1789 return TemplateName(); 1790 1791 if (TemplateDecl *Template = QTN->getTemplateDecl()) { 1792 TemplateDecl *TransTemplate 1793 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1794 if (!TransTemplate) 1795 return TemplateName(); 1796 1797 if (!getDerived().AlwaysRebuild() && 1798 NNS == QTN->getQualifier() && 1799 TransTemplate == Template) 1800 return Name; 1801 1802 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1803 TransTemplate); 1804 } 1805 1806 OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl(); 1807 assert(Ovl && "Not a template name or an overload set?"); 1808 OverloadedFunctionDecl *TransOvl 1809 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1810 if (!TransOvl) 1811 return TemplateName(); 1812 1813 if (!getDerived().AlwaysRebuild() && 1814 NNS == QTN->getQualifier() && 1815 TransOvl == Ovl) 1816 return Name; 1817 1818 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1819 TransOvl); 1820 } 1821 1822 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 1823 NestedNameSpecifier *NNS 1824 = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1825 /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1826 if (!NNS && DTN->getQualifier()) 1827 return TemplateName(); 1828 1829 if (!getDerived().AlwaysRebuild() && 1830 NNS == DTN->getQualifier() && 1831 ObjectType.isNull()) 1832 return Name; 1833 1834 return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType); 1835 } 1836 1837 if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 1838 TemplateDecl *TransTemplate 1839 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1840 if (!TransTemplate) 1841 return TemplateName(); 1842 1843 if (!getDerived().AlwaysRebuild() && 1844 TransTemplate == Template) 1845 return Name; 1846 1847 return TemplateName(TransTemplate); 1848 } 1849 1850 OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl(); 1851 assert(Ovl && "Not a template name or an overload set?"); 1852 OverloadedFunctionDecl *TransOvl 1853 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1854 if (!TransOvl) 1855 return TemplateName(); 1856 1857 if (!getDerived().AlwaysRebuild() && 1858 TransOvl == Ovl) 1859 return Name; 1860 1861 return TemplateName(TransOvl); 1862} 1863 1864template<typename Derived> 1865TemplateArgument 1866TreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) { 1867 switch (Arg.getKind()) { 1868 case TemplateArgument::Null: 1869 case TemplateArgument::Integral: 1870 return Arg; 1871 1872 case TemplateArgument::Type: { 1873 QualType T = getDerived().TransformType(Arg.getAsType()); 1874 if (T.isNull()) 1875 return TemplateArgument(); 1876 return TemplateArgument(Arg.getLocation(), T); 1877 } 1878 1879 case TemplateArgument::Declaration: { 1880 Decl *D = getDerived().TransformDecl(Arg.getAsDecl()); 1881 if (!D) 1882 return TemplateArgument(); 1883 return TemplateArgument(Arg.getLocation(), D); 1884 } 1885 1886 case TemplateArgument::Expression: { 1887 // Template argument expressions are not potentially evaluated. 1888 EnterExpressionEvaluationContext Unevaluated(getSema(), 1889 Action::Unevaluated); 1890 1891 Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr()); 1892 if (E.isInvalid()) 1893 return TemplateArgument(); 1894 return TemplateArgument(E.takeAs<Expr>()); 1895 } 1896 1897 case TemplateArgument::Pack: { 1898 llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 1899 TransformedArgs.reserve(Arg.pack_size()); 1900 for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 1901 AEnd = Arg.pack_end(); 1902 A != AEnd; ++A) { 1903 TemplateArgument TA = getDerived().TransformTemplateArgument(*A); 1904 if (TA.isNull()) 1905 return TA; 1906 1907 TransformedArgs.push_back(TA); 1908 } 1909 TemplateArgument Result; 1910 Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 1911 true); 1912 return Result; 1913 } 1914 } 1915 1916 // Work around bogus GCC warning 1917 return TemplateArgument(); 1918} 1919 1920//===----------------------------------------------------------------------===// 1921// Type transformation 1922//===----------------------------------------------------------------------===// 1923 1924template<typename Derived> 1925QualType TreeTransform<Derived>::TransformType(QualType T) { 1926 if (getDerived().AlreadyTransformed(T)) 1927 return T; 1928 1929 QualifierCollector Qs; 1930 const Type *Ty = Qs.strip(T); 1931 1932 QualType Result; 1933 switch (Ty->getTypeClass()) { 1934#define ABSTRACT_TYPE(CLASS, PARENT) 1935#define TYPE(CLASS, PARENT) \ 1936 case Type::CLASS: \ 1937 Result = getDerived().Transform##CLASS##Type( \ 1938 static_cast<const CLASS##Type*>(Ty)); \ 1939 break; 1940#include "clang/AST/TypeNodes.def" 1941 } 1942 1943 if (Result.isNull() || T == Result) 1944 return Result; 1945 1946 return getDerived().AddTypeQualifiers(Result, Qs); 1947} 1948 1949template<typename Derived> 1950QualType 1951TreeTransform<Derived>::AddTypeQualifiers(QualType T, Qualifiers Quals) { 1952 if (!Quals.empty() && !T->isFunctionType() && !T->isReferenceType()) 1953 return SemaRef.Context.getQualifiedType(T, Quals); 1954 1955 return T; 1956} 1957 1958template<typename Derived> 1959QualType TreeTransform<Derived>::TransformBuiltinType(const BuiltinType *T) { 1960 // Nothing to do 1961 return QualType(T, 0); 1962} 1963 1964template<typename Derived> 1965QualType TreeTransform<Derived>::TransformFixedWidthIntType( 1966 const FixedWidthIntType *T) { 1967 // FIXME: Implement 1968 return QualType(T, 0); 1969} 1970 1971template<typename Derived> 1972QualType TreeTransform<Derived>::TransformComplexType(const ComplexType *T) { 1973 // FIXME: Implement 1974 return QualType(T, 0); 1975} 1976 1977template<typename Derived> 1978QualType TreeTransform<Derived>::TransformPointerType(const PointerType *T) { 1979 QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 1980 if (PointeeType.isNull()) 1981 return QualType(); 1982 1983 if (!getDerived().AlwaysRebuild() && 1984 PointeeType == T->getPointeeType()) 1985 return QualType(T, 0); 1986 1987 return getDerived().RebuildPointerType(PointeeType); 1988} 1989 1990template<typename Derived> 1991QualType 1992TreeTransform<Derived>::TransformBlockPointerType(const BlockPointerType *T) { 1993 QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 1994 if (PointeeType.isNull()) 1995 return QualType(); 1996 1997 if (!getDerived().AlwaysRebuild() && 1998 PointeeType == T->getPointeeType()) 1999 return QualType(T, 0); 2000 2001 return getDerived().RebuildBlockPointerType(PointeeType); 2002} 2003 2004template<typename Derived> 2005QualType 2006TreeTransform<Derived>::TransformLValueReferenceType( 2007 const LValueReferenceType *T) { 2008 QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 2009 if (PointeeType.isNull()) 2010 return QualType(); 2011 2012 if (!getDerived().AlwaysRebuild() && 2013 PointeeType == T->getPointeeType()) 2014 return QualType(T, 0); 2015 2016 return getDerived().RebuildLValueReferenceType(PointeeType); 2017} 2018 2019template<typename Derived> 2020QualType 2021TreeTransform<Derived>::TransformRValueReferenceType( 2022 const RValueReferenceType *T) { 2023 QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 2024 if (PointeeType.isNull()) 2025 return QualType(); 2026 2027 if (!getDerived().AlwaysRebuild() && 2028 PointeeType == T->getPointeeType()) 2029 return QualType(T, 0); 2030 2031 return getDerived().RebuildRValueReferenceType(PointeeType); 2032} 2033 2034template<typename Derived> 2035QualType 2036TreeTransform<Derived>::TransformMemberPointerType(const MemberPointerType *T) { 2037 QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 2038 if (PointeeType.isNull()) 2039 return QualType(); 2040 2041 QualType ClassType = getDerived().TransformType(QualType(T->getClass(), 0)); 2042 if (ClassType.isNull()) 2043 return QualType(); 2044 2045 if (!getDerived().AlwaysRebuild() && 2046 PointeeType == T->getPointeeType() && 2047 ClassType == QualType(T->getClass(), 0)) 2048 return QualType(T, 0); 2049 2050 return getDerived().RebuildMemberPointerType(PointeeType, ClassType); 2051} 2052 2053template<typename Derived> 2054QualType 2055TreeTransform<Derived>::TransformConstantArrayType(const ConstantArrayType *T) { 2056 QualType ElementType = getDerived().TransformType(T->getElementType()); 2057 if (ElementType.isNull()) 2058 return QualType(); 2059 2060 if (!getDerived().AlwaysRebuild() && 2061 ElementType == T->getElementType()) 2062 return QualType(T, 0); 2063 2064 return getDerived().RebuildConstantArrayType(ElementType, 2065 T->getSizeModifier(), 2066 T->getSize(), 2067 T->getIndexTypeCVRQualifiers()); 2068} 2069 2070template<typename Derived> 2071QualType TreeTransform<Derived>::TransformIncompleteArrayType( 2072 const IncompleteArrayType *T) { 2073 QualType ElementType = getDerived().TransformType(T->getElementType()); 2074 if (ElementType.isNull()) 2075 return QualType(); 2076 2077 if (!getDerived().AlwaysRebuild() && 2078 ElementType == T->getElementType()) 2079 return QualType(T, 0); 2080 2081 return getDerived().RebuildIncompleteArrayType(ElementType, 2082 T->getSizeModifier(), 2083 T->getIndexTypeCVRQualifiers()); 2084} 2085 2086template<typename Derived> 2087QualType TreeTransform<Derived>::TransformVariableArrayType( 2088 const VariableArrayType *T) { 2089 QualType ElementType = getDerived().TransformType(T->getElementType()); 2090 if (ElementType.isNull()) 2091 return QualType(); 2092 2093 // Array bounds are not potentially evaluated contexts 2094 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2095 2096 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2097 if (Size.isInvalid()) 2098 return QualType(); 2099 2100 if (!getDerived().AlwaysRebuild() && 2101 ElementType == T->getElementType() && 2102 Size.get() == T->getSizeExpr()) { 2103 Size.take(); 2104 return QualType(T, 0); 2105 } 2106 2107 return getDerived().RebuildVariableArrayType(ElementType, 2108 T->getSizeModifier(), 2109 move(Size), 2110 T->getIndexTypeCVRQualifiers(), 2111 T->getBracketsRange()); 2112} 2113 2114template<typename Derived> 2115QualType TreeTransform<Derived>::TransformDependentSizedArrayType( 2116 const DependentSizedArrayType *T) { 2117 QualType ElementType = getDerived().TransformType(T->getElementType()); 2118 if (ElementType.isNull()) 2119 return QualType(); 2120 2121 // Array bounds are not potentially evaluated contexts 2122 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2123 2124 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2125 if (Size.isInvalid()) 2126 return QualType(); 2127 2128 if (!getDerived().AlwaysRebuild() && 2129 ElementType == T->getElementType() && 2130 Size.get() == T->getSizeExpr()) { 2131 Size.take(); 2132 return QualType(T, 0); 2133 } 2134 2135 return getDerived().RebuildDependentSizedArrayType(ElementType, 2136 T->getSizeModifier(), 2137 move(Size), 2138 T->getIndexTypeCVRQualifiers(), 2139 T->getBracketsRange()); 2140} 2141 2142template<typename Derived> 2143QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 2144 const DependentSizedExtVectorType *T) { 2145 QualType ElementType = getDerived().TransformType(T->getElementType()); 2146 if (ElementType.isNull()) 2147 return QualType(); 2148 2149 // Vector sizes are not potentially evaluated contexts 2150 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2151 2152 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2153 if (Size.isInvalid()) 2154 return QualType(); 2155 2156 if (!getDerived().AlwaysRebuild() && 2157 ElementType == T->getElementType() && 2158 Size.get() == T->getSizeExpr()) { 2159 Size.take(); 2160 return QualType(T, 0); 2161 } 2162 2163 return getDerived().RebuildDependentSizedExtVectorType(ElementType, 2164 move(Size), 2165 T->getAttributeLoc()); 2166} 2167 2168template<typename Derived> 2169QualType TreeTransform<Derived>::TransformVectorType(const VectorType *T) { 2170 QualType ElementType = getDerived().TransformType(T->getElementType()); 2171 if (ElementType.isNull()) 2172 return QualType(); 2173 2174 if (!getDerived().AlwaysRebuild() && 2175 ElementType == T->getElementType()) 2176 return QualType(T, 0); 2177 2178 return getDerived().RebuildVectorType(ElementType, T->getNumElements()); 2179} 2180 2181template<typename Derived> 2182QualType 2183TreeTransform<Derived>::TransformExtVectorType(const ExtVectorType *T) { 2184 QualType ElementType = getDerived().TransformType(T->getElementType()); 2185 if (ElementType.isNull()) 2186 return QualType(); 2187 2188 if (!getDerived().AlwaysRebuild() && 2189 ElementType == T->getElementType()) 2190 return QualType(T, 0); 2191 2192 return getDerived().RebuildExtVectorType(ElementType, T->getNumElements(), 2193 /*FIXME*/SourceLocation()); 2194} 2195 2196template<typename Derived> 2197QualType TreeTransform<Derived>::TransformFunctionProtoType( 2198 const FunctionProtoType *T) { 2199 QualType ResultType = getDerived().TransformType(T->getResultType()); 2200 if (ResultType.isNull()) 2201 return QualType(); 2202 2203 llvm::SmallVector<QualType, 4> ParamTypes; 2204 for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(), 2205 ParamEnd = T->arg_type_end(); 2206 Param != ParamEnd; ++Param) { 2207 QualType P = getDerived().TransformType(*Param); 2208 if (P.isNull()) 2209 return QualType(); 2210 2211 ParamTypes.push_back(P); 2212 } 2213 2214 if (!getDerived().AlwaysRebuild() && 2215 ResultType == T->getResultType() && 2216 std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) 2217 return QualType(T, 0); 2218 2219 return getDerived().RebuildFunctionProtoType(ResultType, ParamTypes.data(), 2220 ParamTypes.size(), T->isVariadic(), 2221 T->getTypeQuals()); 2222} 2223 2224template<typename Derived> 2225QualType TreeTransform<Derived>::TransformFunctionNoProtoType( 2226 const FunctionNoProtoType *T) { 2227 // FIXME: Implement 2228 return QualType(T, 0); 2229} 2230 2231template<typename Derived> 2232QualType TreeTransform<Derived>::TransformTypedefType(const TypedefType *T) { 2233 TypedefDecl *Typedef 2234 = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl())); 2235 if (!Typedef) 2236 return QualType(); 2237 2238 if (!getDerived().AlwaysRebuild() && 2239 Typedef == T->getDecl()) 2240 return QualType(T, 0); 2241 2242 return getDerived().RebuildTypedefType(Typedef); 2243} 2244 2245template<typename Derived> 2246QualType TreeTransform<Derived>::TransformTypeOfExprType( 2247 const TypeOfExprType *T) { 2248 // typeof expressions are not potentially evaluated contexts 2249 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2250 2251 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2252 if (E.isInvalid()) 2253 return QualType(); 2254 2255 if (!getDerived().AlwaysRebuild() && 2256 E.get() == T->getUnderlyingExpr()) { 2257 E.take(); 2258 return QualType(T, 0); 2259 } 2260 2261 return getDerived().RebuildTypeOfExprType(move(E)); 2262} 2263 2264template<typename Derived> 2265QualType TreeTransform<Derived>::TransformTypeOfType(const TypeOfType *T) { 2266 QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 2267 if (Underlying.isNull()) 2268 return QualType(); 2269 2270 if (!getDerived().AlwaysRebuild() && 2271 Underlying == T->getUnderlyingType()) 2272 return QualType(T, 0); 2273 2274 return getDerived().RebuildTypeOfType(Underlying); 2275} 2276 2277template<typename Derived> 2278QualType TreeTransform<Derived>::TransformDecltypeType(const DecltypeType *T) { 2279 // decltype expressions are not potentially evaluated contexts 2280 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2281 2282 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2283 if (E.isInvalid()) 2284 return QualType(); 2285 2286 if (!getDerived().AlwaysRebuild() && 2287 E.get() == T->getUnderlyingExpr()) { 2288 E.take(); 2289 return QualType(T, 0); 2290 } 2291 2292 return getDerived().RebuildDecltypeType(move(E)); 2293} 2294 2295template<typename Derived> 2296QualType TreeTransform<Derived>::TransformRecordType(const RecordType *T) { 2297 RecordDecl *Record 2298 = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl())); 2299 if (!Record) 2300 return QualType(); 2301 2302 if (!getDerived().AlwaysRebuild() && 2303 Record == T->getDecl()) 2304 return QualType(T, 0); 2305 2306 return getDerived().RebuildRecordType(Record); 2307} 2308 2309template<typename Derived> 2310QualType TreeTransform<Derived>::TransformEnumType(const EnumType *T) { 2311 EnumDecl *Enum 2312 = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl())); 2313 if (!Enum) 2314 return QualType(); 2315 2316 if (!getDerived().AlwaysRebuild() && 2317 Enum == T->getDecl()) 2318 return QualType(T, 0); 2319 2320 return getDerived().RebuildEnumType(Enum); 2321} 2322 2323template <typename Derived> 2324QualType TreeTransform<Derived>::TransformElaboratedType( 2325 const ElaboratedType *T) { 2326 QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 2327 if (Underlying.isNull()) 2328 return QualType(); 2329 2330 if (!getDerived().AlwaysRebuild() && 2331 Underlying == T->getUnderlyingType()) 2332 return QualType(T, 0); 2333 2334 return getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 2335} 2336 2337 2338template<typename Derived> 2339QualType TreeTransform<Derived>::TransformTemplateTypeParmType( 2340 const TemplateTypeParmType *T) { 2341 // Nothing to do 2342 return QualType(T, 0); 2343} 2344 2345template<typename Derived> 2346QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 2347 const SubstTemplateTypeParmType *T) { 2348 // Nothing to do 2349 return QualType(T, 0); 2350} 2351 2352template<typename Derived> 2353inline QualType 2354TreeTransform<Derived>::TransformTemplateSpecializationType( 2355 const TemplateSpecializationType *T) { 2356 return TransformTemplateSpecializationType(T, QualType()); 2357} 2358 2359template<typename Derived> 2360QualType TreeTransform<Derived>::TransformTemplateSpecializationType( 2361 const TemplateSpecializationType *T, 2362 QualType ObjectType) { 2363 TemplateName Template 2364 = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType); 2365 if (Template.isNull()) 2366 return QualType(); 2367 2368 llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs; 2369 NewTemplateArgs.reserve(T->getNumArgs()); 2370 for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end(); 2371 Arg != ArgEnd; ++Arg) { 2372 TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg); 2373 if (NewArg.isNull()) 2374 return QualType(); 2375 2376 NewTemplateArgs.push_back(NewArg); 2377 } 2378 2379 // FIXME: early abort if all of the template arguments and such are the 2380 // same. 2381 2382 // FIXME: We're missing the locations of the template name, '<', and '>'. 2383 return getDerived().RebuildTemplateSpecializationType(Template, 2384 NewTemplateArgs.data(), 2385 NewTemplateArgs.size()); 2386} 2387 2388template<typename Derived> 2389QualType TreeTransform<Derived>::TransformQualifiedNameType( 2390 const QualifiedNameType *T) { 2391 NestedNameSpecifier *NNS 2392 = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2393 SourceRange()); 2394 if (!NNS) 2395 return QualType(); 2396 2397 QualType Named = getDerived().TransformType(T->getNamedType()); 2398 if (Named.isNull()) 2399 return QualType(); 2400 2401 if (!getDerived().AlwaysRebuild() && 2402 NNS == T->getQualifier() && 2403 Named == T->getNamedType()) 2404 return QualType(T, 0); 2405 2406 return getDerived().RebuildQualifiedNameType(NNS, Named); 2407} 2408 2409template<typename Derived> 2410QualType TreeTransform<Derived>::TransformTypenameType(const TypenameType *T) { 2411 NestedNameSpecifier *NNS 2412 = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2413 SourceRange(/*FIXME:*/getDerived().getBaseLocation())); 2414 if (!NNS) 2415 return QualType(); 2416 2417 if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 2418 QualType NewTemplateId 2419 = getDerived().TransformType(QualType(TemplateId, 0)); 2420 if (NewTemplateId.isNull()) 2421 return QualType(); 2422 2423 if (!getDerived().AlwaysRebuild() && 2424 NNS == T->getQualifier() && 2425 NewTemplateId == QualType(TemplateId, 0)) 2426 return QualType(T, 0); 2427 2428 return getDerived().RebuildTypenameType(NNS, NewTemplateId); 2429 } 2430 2431 return getDerived().RebuildTypenameType(NNS, T->getIdentifier()); 2432} 2433 2434template<typename Derived> 2435QualType TreeTransform<Derived>::TransformObjCInterfaceType( 2436 const ObjCInterfaceType *T) { 2437 // FIXME: Implement 2438 return QualType(T, 0); 2439} 2440 2441template<typename Derived> 2442QualType TreeTransform<Derived>::TransformObjCObjectPointerType( 2443 const ObjCObjectPointerType *T) { 2444 // FIXME: Implement 2445 return QualType(T, 0); 2446} 2447 2448template<typename Derived> 2449QualType TreeTransform<Derived>::TransformObjCProtocolListType( 2450 const ObjCProtocolListType *T) { 2451 assert(false && "Should not see ObjCProtocolList types"); 2452 return QualType(T, 0); 2453} 2454 2455//===----------------------------------------------------------------------===// 2456// Statement transformation 2457//===----------------------------------------------------------------------===// 2458template<typename Derived> 2459Sema::OwningStmtResult 2460TreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 2461 return SemaRef.Owned(S->Retain()); 2462} 2463 2464template<typename Derived> 2465Sema::OwningStmtResult 2466TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 2467 return getDerived().TransformCompoundStmt(S, false); 2468} 2469 2470template<typename Derived> 2471Sema::OwningStmtResult 2472TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 2473 bool IsStmtExpr) { 2474 bool SubStmtChanged = false; 2475 ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 2476 for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 2477 B != BEnd; ++B) { 2478 OwningStmtResult Result = getDerived().TransformStmt(*B); 2479 if (Result.isInvalid()) 2480 return getSema().StmtError(); 2481 2482 SubStmtChanged = SubStmtChanged || Result.get() != *B; 2483 Statements.push_back(Result.takeAs<Stmt>()); 2484 } 2485 2486 if (!getDerived().AlwaysRebuild() && 2487 !SubStmtChanged) 2488 return SemaRef.Owned(S->Retain()); 2489 2490 return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 2491 move_arg(Statements), 2492 S->getRBracLoc(), 2493 IsStmtExpr); 2494} 2495 2496template<typename Derived> 2497Sema::OwningStmtResult 2498TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 2499 // The case value expressions are not potentially evaluated. 2500 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2501 2502 // Transform the left-hand case value. 2503 OwningExprResult LHS = getDerived().TransformExpr(S->getLHS()); 2504 if (LHS.isInvalid()) 2505 return SemaRef.StmtError(); 2506 2507 // Transform the right-hand case value (for the GNU case-range extension). 2508 OwningExprResult RHS = getDerived().TransformExpr(S->getRHS()); 2509 if (RHS.isInvalid()) 2510 return SemaRef.StmtError(); 2511 2512 // Build the case statement. 2513 // Case statements are always rebuilt so that they will attached to their 2514 // transformed switch statement. 2515 OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 2516 move(LHS), 2517 S->getEllipsisLoc(), 2518 move(RHS), 2519 S->getColonLoc()); 2520 if (Case.isInvalid()) 2521 return SemaRef.StmtError(); 2522 2523 // Transform the statement following the case 2524 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 2525 if (SubStmt.isInvalid()) 2526 return SemaRef.StmtError(); 2527 2528 // Attach the body to the case statement 2529 return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 2530} 2531 2532template<typename Derived> 2533Sema::OwningStmtResult 2534TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 2535 // Transform the statement following the default case 2536 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 2537 if (SubStmt.isInvalid()) 2538 return SemaRef.StmtError(); 2539 2540 // Default statements are always rebuilt 2541 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 2542 move(SubStmt)); 2543} 2544 2545template<typename Derived> 2546Sema::OwningStmtResult 2547TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 2548 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 2549 if (SubStmt.isInvalid()) 2550 return SemaRef.StmtError(); 2551 2552 // FIXME: Pass the real colon location in. 2553 SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 2554 return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 2555 move(SubStmt)); 2556} 2557 2558template<typename Derived> 2559Sema::OwningStmtResult 2560TreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 2561 // Transform the condition 2562 OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 2563 if (Cond.isInvalid()) 2564 return SemaRef.StmtError(); 2565 2566 Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 2567 2568 // Transform the "then" branch. 2569 OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 2570 if (Then.isInvalid()) 2571 return SemaRef.StmtError(); 2572 2573 // Transform the "else" branch. 2574 OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 2575 if (Else.isInvalid()) 2576 return SemaRef.StmtError(); 2577 2578 if (!getDerived().AlwaysRebuild() && 2579 FullCond->get() == S->getCond() && 2580 Then.get() == S->getThen() && 2581 Else.get() == S->getElse()) 2582 return SemaRef.Owned(S->Retain()); 2583 2584 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then), 2585 S->getElseLoc(), move(Else)); 2586} 2587 2588template<typename Derived> 2589Sema::OwningStmtResult 2590TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 2591 // Transform the condition. 2592 OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 2593 if (Cond.isInvalid()) 2594 return SemaRef.StmtError(); 2595 2596 // Rebuild the switch statement. 2597 OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond)); 2598 if (Switch.isInvalid()) 2599 return SemaRef.StmtError(); 2600 2601 // Transform the body of the switch statement. 2602 OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 2603 if (Body.isInvalid()) 2604 return SemaRef.StmtError(); 2605 2606 // Complete the switch statement. 2607 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 2608 move(Body)); 2609} 2610 2611template<typename Derived> 2612Sema::OwningStmtResult 2613TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 2614 // Transform the condition 2615 OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 2616 if (Cond.isInvalid()) 2617 return SemaRef.StmtError(); 2618 2619 Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 2620 2621 // Transform the body 2622 OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 2623 if (Body.isInvalid()) 2624 return SemaRef.StmtError(); 2625 2626 if (!getDerived().AlwaysRebuild() && 2627 FullCond->get() == S->getCond() && 2628 Body.get() == S->getBody()) 2629 return SemaRef.Owned(S->Retain()); 2630 2631 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body)); 2632} 2633 2634template<typename Derived> 2635Sema::OwningStmtResult 2636TreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 2637 // Transform the condition 2638 OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 2639 if (Cond.isInvalid()) 2640 return SemaRef.StmtError(); 2641 2642 // Transform the body 2643 OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 2644 if (Body.isInvalid()) 2645 return SemaRef.StmtError(); 2646 2647 if (!getDerived().AlwaysRebuild() && 2648 Cond.get() == S->getCond() && 2649 Body.get() == S->getBody()) 2650 return SemaRef.Owned(S->Retain()); 2651 2652 return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 2653 /*FIXME:*/S->getWhileLoc(), move(Cond), 2654 S->getRParenLoc()); 2655} 2656 2657template<typename Derived> 2658Sema::OwningStmtResult 2659TreeTransform<Derived>::TransformForStmt(ForStmt *S) { 2660 // Transform the initialization statement 2661 OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 2662 if (Init.isInvalid()) 2663 return SemaRef.StmtError(); 2664 2665 // Transform the condition 2666 OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 2667 if (Cond.isInvalid()) 2668 return SemaRef.StmtError(); 2669 2670 // Transform the increment 2671 OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 2672 if (Inc.isInvalid()) 2673 return SemaRef.StmtError(); 2674 2675 // Transform the body 2676 OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 2677 if (Body.isInvalid()) 2678 return SemaRef.StmtError(); 2679 2680 if (!getDerived().AlwaysRebuild() && 2681 Init.get() == S->getInit() && 2682 Cond.get() == S->getCond() && 2683 Inc.get() == S->getInc() && 2684 Body.get() == S->getBody()) 2685 return SemaRef.Owned(S->Retain()); 2686 2687 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 2688 move(Init), move(Cond), move(Inc), 2689 S->getRParenLoc(), move(Body)); 2690} 2691 2692template<typename Derived> 2693Sema::OwningStmtResult 2694TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 2695 // Goto statements must always be rebuilt, to resolve the label. 2696 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 2697 S->getLabel()); 2698} 2699 2700template<typename Derived> 2701Sema::OwningStmtResult 2702TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 2703 OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 2704 if (Target.isInvalid()) 2705 return SemaRef.StmtError(); 2706 2707 if (!getDerived().AlwaysRebuild() && 2708 Target.get() == S->getTarget()) 2709 return SemaRef.Owned(S->Retain()); 2710 2711 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 2712 move(Target)); 2713} 2714 2715template<typename Derived> 2716Sema::OwningStmtResult 2717TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 2718 return SemaRef.Owned(S->Retain()); 2719} 2720 2721template<typename Derived> 2722Sema::OwningStmtResult 2723TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 2724 return SemaRef.Owned(S->Retain()); 2725} 2726 2727template<typename Derived> 2728Sema::OwningStmtResult 2729TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 2730 Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 2731 if (Result.isInvalid()) 2732 return SemaRef.StmtError(); 2733 2734 // FIXME: We always rebuild the return statement because there is no way 2735 // to tell whether the return type of the function has changed. 2736 return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 2737} 2738 2739template<typename Derived> 2740Sema::OwningStmtResult 2741TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 2742 bool DeclChanged = false; 2743 llvm::SmallVector<Decl *, 4> Decls; 2744 for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 2745 D != DEnd; ++D) { 2746 Decl *Transformed = getDerived().TransformDefinition(*D); 2747 if (!Transformed) 2748 return SemaRef.StmtError(); 2749 2750 if (Transformed != *D) 2751 DeclChanged = true; 2752 2753 Decls.push_back(Transformed); 2754 } 2755 2756 if (!getDerived().AlwaysRebuild() && !DeclChanged) 2757 return SemaRef.Owned(S->Retain()); 2758 2759 return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 2760 S->getStartLoc(), S->getEndLoc()); 2761} 2762 2763template<typename Derived> 2764Sema::OwningStmtResult 2765TreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 2766 assert(false && "SwitchCase is abstract and cannot be transformed"); 2767 return SemaRef.Owned(S->Retain()); 2768} 2769 2770template<typename Derived> 2771Sema::OwningStmtResult 2772TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 2773 // FIXME: Implement! 2774 assert(false && "Inline assembly cannot be transformed"); 2775 return SemaRef.Owned(S->Retain()); 2776} 2777 2778 2779template<typename Derived> 2780Sema::OwningStmtResult 2781TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 2782 // FIXME: Implement this 2783 assert(false && "Cannot transform an Objective-C @try statement"); 2784 return SemaRef.Owned(S->Retain()); 2785} 2786 2787template<typename Derived> 2788Sema::OwningStmtResult 2789TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 2790 // FIXME: Implement this 2791 assert(false && "Cannot transform an Objective-C @catch statement"); 2792 return SemaRef.Owned(S->Retain()); 2793} 2794 2795template<typename Derived> 2796Sema::OwningStmtResult 2797TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 2798 // FIXME: Implement this 2799 assert(false && "Cannot transform an Objective-C @finally statement"); 2800 return SemaRef.Owned(S->Retain()); 2801} 2802 2803template<typename Derived> 2804Sema::OwningStmtResult 2805TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 2806 // FIXME: Implement this 2807 assert(false && "Cannot transform an Objective-C @throw statement"); 2808 return SemaRef.Owned(S->Retain()); 2809} 2810 2811template<typename Derived> 2812Sema::OwningStmtResult 2813TreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 2814 ObjCAtSynchronizedStmt *S) { 2815 // FIXME: Implement this 2816 assert(false && "Cannot transform an Objective-C @synchronized statement"); 2817 return SemaRef.Owned(S->Retain()); 2818} 2819 2820template<typename Derived> 2821Sema::OwningStmtResult 2822TreeTransform<Derived>::TransformObjCForCollectionStmt( 2823 ObjCForCollectionStmt *S) { 2824 // FIXME: Implement this 2825 assert(false && "Cannot transform an Objective-C for-each statement"); 2826 return SemaRef.Owned(S->Retain()); 2827} 2828 2829 2830template<typename Derived> 2831Sema::OwningStmtResult 2832TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 2833 // Transform the exception declaration, if any. 2834 VarDecl *Var = 0; 2835 if (S->getExceptionDecl()) { 2836 VarDecl *ExceptionDecl = S->getExceptionDecl(); 2837 TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 2838 ExceptionDecl->getDeclName()); 2839 2840 QualType T = getDerived().TransformType(ExceptionDecl->getType()); 2841 if (T.isNull()) 2842 return SemaRef.StmtError(); 2843 2844 Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 2845 T, 2846 ExceptionDecl->getDeclaratorInfo(), 2847 ExceptionDecl->getIdentifier(), 2848 ExceptionDecl->getLocation(), 2849 /*FIXME: Inaccurate*/ 2850 SourceRange(ExceptionDecl->getLocation())); 2851 if (!Var || Var->isInvalidDecl()) { 2852 if (Var) 2853 Var->Destroy(SemaRef.Context); 2854 return SemaRef.StmtError(); 2855 } 2856 } 2857 2858 // Transform the actual exception handler. 2859 OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 2860 if (Handler.isInvalid()) { 2861 if (Var) 2862 Var->Destroy(SemaRef.Context); 2863 return SemaRef.StmtError(); 2864 } 2865 2866 if (!getDerived().AlwaysRebuild() && 2867 !Var && 2868 Handler.get() == S->getHandlerBlock()) 2869 return SemaRef.Owned(S->Retain()); 2870 2871 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 2872 Var, 2873 move(Handler)); 2874} 2875 2876template<typename Derived> 2877Sema::OwningStmtResult 2878TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 2879 // Transform the try block itself. 2880 OwningStmtResult TryBlock 2881 = getDerived().TransformCompoundStmt(S->getTryBlock()); 2882 if (TryBlock.isInvalid()) 2883 return SemaRef.StmtError(); 2884 2885 // Transform the handlers. 2886 bool HandlerChanged = false; 2887 ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 2888 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 2889 OwningStmtResult Handler 2890 = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 2891 if (Handler.isInvalid()) 2892 return SemaRef.StmtError(); 2893 2894 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 2895 Handlers.push_back(Handler.takeAs<Stmt>()); 2896 } 2897 2898 if (!getDerived().AlwaysRebuild() && 2899 TryBlock.get() == S->getTryBlock() && 2900 !HandlerChanged) 2901 return SemaRef.Owned(S->Retain()); 2902 2903 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 2904 move_arg(Handlers)); 2905} 2906 2907//===----------------------------------------------------------------------===// 2908// Expression transformation 2909//===----------------------------------------------------------------------===// 2910template<typename Derived> 2911Sema::OwningExprResult 2912TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 2913 return SemaRef.Owned(E->Retain()); 2914} 2915 2916template<typename Derived> 2917Sema::OwningExprResult 2918TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 2919 NamedDecl *ND 2920 = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 2921 if (!ND) 2922 return SemaRef.ExprError(); 2923 2924 if (!getDerived().AlwaysRebuild() && ND == E->getDecl()) 2925 return SemaRef.Owned(E->Retain()); 2926 2927 return getDerived().RebuildDeclRefExpr(ND, E->getLocation()); 2928} 2929 2930template<typename Derived> 2931Sema::OwningExprResult 2932TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 2933 return SemaRef.Owned(E->Retain()); 2934} 2935 2936template<typename Derived> 2937Sema::OwningExprResult 2938TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 2939 return SemaRef.Owned(E->Retain()); 2940} 2941 2942template<typename Derived> 2943Sema::OwningExprResult 2944TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 2945 return SemaRef.Owned(E->Retain()); 2946} 2947 2948template<typename Derived> 2949Sema::OwningExprResult 2950TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 2951 return SemaRef.Owned(E->Retain()); 2952} 2953 2954template<typename Derived> 2955Sema::OwningExprResult 2956TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 2957 return SemaRef.Owned(E->Retain()); 2958} 2959 2960template<typename Derived> 2961Sema::OwningExprResult 2962TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 2963 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2964 if (SubExpr.isInvalid()) 2965 return SemaRef.ExprError(); 2966 2967 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 2968 return SemaRef.Owned(E->Retain()); 2969 2970 return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 2971 E->getRParen()); 2972} 2973 2974template<typename Derived> 2975Sema::OwningExprResult 2976TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 2977 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2978 if (SubExpr.isInvalid()) 2979 return SemaRef.ExprError(); 2980 2981 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 2982 return SemaRef.Owned(E->Retain()); 2983 2984 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 2985 E->getOpcode(), 2986 move(SubExpr)); 2987} 2988 2989template<typename Derived> 2990Sema::OwningExprResult 2991TreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 2992 if (E->isArgumentType()) { 2993 QualType T = getDerived().TransformType(E->getArgumentType()); 2994 if (T.isNull()) 2995 return SemaRef.ExprError(); 2996 2997 if (!getDerived().AlwaysRebuild() && T == E->getArgumentType()) 2998 return SemaRef.Owned(E->Retain()); 2999 3000 return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(), 3001 E->isSizeOf(), 3002 E->getSourceRange()); 3003 } 3004 3005 Sema::OwningExprResult SubExpr(SemaRef); 3006 { 3007 // C++0x [expr.sizeof]p1: 3008 // The operand is either an expression, which is an unevaluated operand 3009 // [...] 3010 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 3011 3012 SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 3013 if (SubExpr.isInvalid()) 3014 return SemaRef.ExprError(); 3015 3016 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 3017 return SemaRef.Owned(E->Retain()); 3018 } 3019 3020 return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 3021 E->isSizeOf(), 3022 E->getSourceRange()); 3023} 3024 3025template<typename Derived> 3026Sema::OwningExprResult 3027TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 3028 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3029 if (LHS.isInvalid()) 3030 return SemaRef.ExprError(); 3031 3032 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3033 if (RHS.isInvalid()) 3034 return SemaRef.ExprError(); 3035 3036 3037 if (!getDerived().AlwaysRebuild() && 3038 LHS.get() == E->getLHS() && 3039 RHS.get() == E->getRHS()) 3040 return SemaRef.Owned(E->Retain()); 3041 3042 return getDerived().RebuildArraySubscriptExpr(move(LHS), 3043 /*FIXME:*/E->getLHS()->getLocStart(), 3044 move(RHS), 3045 E->getRBracketLoc()); 3046} 3047 3048template<typename Derived> 3049Sema::OwningExprResult 3050TreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 3051 // Transform the callee. 3052 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3053 if (Callee.isInvalid()) 3054 return SemaRef.ExprError(); 3055 3056 // Transform arguments. 3057 bool ArgChanged = false; 3058 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3059 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 3060 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 3061 OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 3062 if (Arg.isInvalid()) 3063 return SemaRef.ExprError(); 3064 3065 // FIXME: Wrong source location information for the ','. 3066 FakeCommaLocs.push_back( 3067 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 3068 3069 ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 3070 Args.push_back(Arg.takeAs<Expr>()); 3071 } 3072 3073 if (!getDerived().AlwaysRebuild() && 3074 Callee.get() == E->getCallee() && 3075 !ArgChanged) 3076 return SemaRef.Owned(E->Retain()); 3077 3078 // FIXME: Wrong source location information for the '('. 3079 SourceLocation FakeLParenLoc 3080 = ((Expr *)Callee.get())->getSourceRange().getBegin(); 3081 return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 3082 move_arg(Args), 3083 FakeCommaLocs.data(), 3084 E->getRParenLoc()); 3085} 3086 3087template<typename Derived> 3088Sema::OwningExprResult 3089TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 3090 OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3091 if (Base.isInvalid()) 3092 return SemaRef.ExprError(); 3093 3094 NestedNameSpecifier *Qualifier = 0; 3095 if (E->hasQualifier()) { 3096 Qualifier 3097 = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3098 E->getQualifierRange()); 3099 if (Qualifier == 0) 3100 return SemaRef.ExprError(); 3101 } 3102 3103 NamedDecl *Member 3104 = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl())); 3105 if (!Member) 3106 return SemaRef.ExprError(); 3107 3108 if (!getDerived().AlwaysRebuild() && 3109 Base.get() == E->getBase() && 3110 Qualifier == E->getQualifier() && 3111 Member == E->getMemberDecl()) 3112 return SemaRef.Owned(E->Retain()); 3113 3114 // FIXME: Bogus source location for the operator 3115 SourceLocation FakeOperatorLoc 3116 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 3117 3118 return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 3119 E->isArrow(), 3120 Qualifier, 3121 E->getQualifierRange(), 3122 E->getMemberLoc(), 3123 Member); 3124} 3125 3126template<typename Derived> 3127Sema::OwningExprResult 3128TreeTransform<Derived>::TransformCastExpr(CastExpr *E) { 3129 assert(false && "Cannot transform abstract class"); 3130 return SemaRef.Owned(E->Retain()); 3131} 3132 3133template<typename Derived> 3134Sema::OwningExprResult 3135TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 3136 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3137 if (LHS.isInvalid()) 3138 return SemaRef.ExprError(); 3139 3140 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3141 if (RHS.isInvalid()) 3142 return SemaRef.ExprError(); 3143 3144 if (!getDerived().AlwaysRebuild() && 3145 LHS.get() == E->getLHS() && 3146 RHS.get() == E->getRHS()) 3147 return SemaRef.Owned(E->Retain()); 3148 3149 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 3150 move(LHS), move(RHS)); 3151} 3152 3153template<typename Derived> 3154Sema::OwningExprResult 3155TreeTransform<Derived>::TransformCompoundAssignOperator( 3156 CompoundAssignOperator *E) { 3157 return getDerived().TransformBinaryOperator(E); 3158} 3159 3160template<typename Derived> 3161Sema::OwningExprResult 3162TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 3163 OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3164 if (Cond.isInvalid()) 3165 return SemaRef.ExprError(); 3166 3167 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3168 if (LHS.isInvalid()) 3169 return SemaRef.ExprError(); 3170 3171 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3172 if (RHS.isInvalid()) 3173 return SemaRef.ExprError(); 3174 3175 if (!getDerived().AlwaysRebuild() && 3176 Cond.get() == E->getCond() && 3177 LHS.get() == E->getLHS() && 3178 RHS.get() == E->getRHS()) 3179 return SemaRef.Owned(E->Retain()); 3180 3181 return getDerived().RebuildConditionalOperator(move(Cond), 3182 E->getQuestionLoc(), 3183 move(LHS), 3184 E->getColonLoc(), 3185 move(RHS)); 3186} 3187 3188template<typename Derived> 3189Sema::OwningExprResult 3190TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 3191 QualType T = getDerived().TransformType(E->getType()); 3192 if (T.isNull()) 3193 return SemaRef.ExprError(); 3194 3195 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3196 if (SubExpr.isInvalid()) 3197 return SemaRef.ExprError(); 3198 3199 if (!getDerived().AlwaysRebuild() && 3200 T == E->getType() && 3201 SubExpr.get() == E->getSubExpr()) 3202 return SemaRef.Owned(E->Retain()); 3203 3204 return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(), 3205 move(SubExpr), 3206 E->isLvalueCast()); 3207} 3208 3209template<typename Derived> 3210Sema::OwningExprResult 3211TreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) { 3212 assert(false && "Cannot transform abstract class"); 3213 return SemaRef.Owned(E->Retain()); 3214} 3215 3216template<typename Derived> 3217Sema::OwningExprResult 3218TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 3219 QualType T; 3220 { 3221 // FIXME: Source location isn't quite accurate. 3222 SourceLocation TypeStartLoc 3223 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3224 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 3225 3226 T = getDerived().TransformType(E->getTypeAsWritten()); 3227 if (T.isNull()) 3228 return SemaRef.ExprError(); 3229 } 3230 3231 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3232 if (SubExpr.isInvalid()) 3233 return SemaRef.ExprError(); 3234 3235 if (!getDerived().AlwaysRebuild() && 3236 T == E->getTypeAsWritten() && 3237 SubExpr.get() == E->getSubExpr()) 3238 return SemaRef.Owned(E->Retain()); 3239 3240 return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T, 3241 E->getRParenLoc(), 3242 move(SubExpr)); 3243} 3244 3245template<typename Derived> 3246Sema::OwningExprResult 3247TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 3248 QualType T; 3249 { 3250 // FIXME: Source location isn't quite accurate. 3251 SourceLocation FakeTypeLoc 3252 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3253 TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName()); 3254 3255 T = getDerived().TransformType(E->getType()); 3256 if (T.isNull()) 3257 return SemaRef.ExprError(); 3258 } 3259 3260 OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 3261 if (Init.isInvalid()) 3262 return SemaRef.ExprError(); 3263 3264 if (!getDerived().AlwaysRebuild() && 3265 T == E->getType() && 3266 Init.get() == E->getInitializer()) 3267 return SemaRef.Owned(E->Retain()); 3268 3269 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T, 3270 /*FIXME:*/E->getInitializer()->getLocEnd(), 3271 move(Init)); 3272} 3273 3274template<typename Derived> 3275Sema::OwningExprResult 3276TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 3277 OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3278 if (Base.isInvalid()) 3279 return SemaRef.ExprError(); 3280 3281 if (!getDerived().AlwaysRebuild() && 3282 Base.get() == E->getBase()) 3283 return SemaRef.Owned(E->Retain()); 3284 3285 // FIXME: Bad source location 3286 SourceLocation FakeOperatorLoc 3287 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 3288 return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 3289 E->getAccessorLoc(), 3290 E->getAccessor()); 3291} 3292 3293template<typename Derived> 3294Sema::OwningExprResult 3295TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 3296 bool InitChanged = false; 3297 3298 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3299 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 3300 OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 3301 if (Init.isInvalid()) 3302 return SemaRef.ExprError(); 3303 3304 InitChanged = InitChanged || Init.get() != E->getInit(I); 3305 Inits.push_back(Init.takeAs<Expr>()); 3306 } 3307 3308 if (!getDerived().AlwaysRebuild() && !InitChanged) 3309 return SemaRef.Owned(E->Retain()); 3310 3311 return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 3312 E->getRBraceLoc()); 3313} 3314 3315template<typename Derived> 3316Sema::OwningExprResult 3317TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 3318 Designation Desig; 3319 3320 // transform the initializer value 3321 OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 3322 if (Init.isInvalid()) 3323 return SemaRef.ExprError(); 3324 3325 // transform the designators. 3326 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 3327 bool ExprChanged = false; 3328 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 3329 DEnd = E->designators_end(); 3330 D != DEnd; ++D) { 3331 if (D->isFieldDesignator()) { 3332 Desig.AddDesignator(Designator::getField(D->getFieldName(), 3333 D->getDotLoc(), 3334 D->getFieldLoc())); 3335 continue; 3336 } 3337 3338 if (D->isArrayDesignator()) { 3339 OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 3340 if (Index.isInvalid()) 3341 return SemaRef.ExprError(); 3342 3343 Desig.AddDesignator(Designator::getArray(Index.get(), 3344 D->getLBracketLoc())); 3345 3346 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 3347 ArrayExprs.push_back(Index.release()); 3348 continue; 3349 } 3350 3351 assert(D->isArrayRangeDesignator() && "New kind of designator?"); 3352 OwningExprResult Start 3353 = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 3354 if (Start.isInvalid()) 3355 return SemaRef.ExprError(); 3356 3357 OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 3358 if (End.isInvalid()) 3359 return SemaRef.ExprError(); 3360 3361 Desig.AddDesignator(Designator::getArrayRange(Start.get(), 3362 End.get(), 3363 D->getLBracketLoc(), 3364 D->getEllipsisLoc())); 3365 3366 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 3367 End.get() != E->getArrayRangeEnd(*D); 3368 3369 ArrayExprs.push_back(Start.release()); 3370 ArrayExprs.push_back(End.release()); 3371 } 3372 3373 if (!getDerived().AlwaysRebuild() && 3374 Init.get() == E->getInit() && 3375 !ExprChanged) 3376 return SemaRef.Owned(E->Retain()); 3377 3378 return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 3379 E->getEqualOrColonLoc(), 3380 E->usesGNUSyntax(), move(Init)); 3381} 3382 3383template<typename Derived> 3384Sema::OwningExprResult 3385TreeTransform<Derived>::TransformImplicitValueInitExpr( 3386 ImplicitValueInitExpr *E) { 3387 QualType T = getDerived().TransformType(E->getType()); 3388 if (T.isNull()) 3389 return SemaRef.ExprError(); 3390 3391 if (!getDerived().AlwaysRebuild() && 3392 T == E->getType()) 3393 return SemaRef.Owned(E->Retain()); 3394 3395 return getDerived().RebuildImplicitValueInitExpr(T); 3396} 3397 3398template<typename Derived> 3399Sema::OwningExprResult 3400TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 3401 // FIXME: Do we want the type as written? 3402 QualType T; 3403 3404 { 3405 // FIXME: Source location isn't quite accurate. 3406 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 3407 T = getDerived().TransformType(E->getType()); 3408 if (T.isNull()) 3409 return SemaRef.ExprError(); 3410 } 3411 3412 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3413 if (SubExpr.isInvalid()) 3414 return SemaRef.ExprError(); 3415 3416 if (!getDerived().AlwaysRebuild() && 3417 T == E->getType() && 3418 SubExpr.get() == E->getSubExpr()) 3419 return SemaRef.Owned(E->Retain()); 3420 3421 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 3422 T, E->getRParenLoc()); 3423} 3424 3425template<typename Derived> 3426Sema::OwningExprResult 3427TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 3428 bool ArgumentChanged = false; 3429 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3430 for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 3431 OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 3432 if (Init.isInvalid()) 3433 return SemaRef.ExprError(); 3434 3435 ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 3436 Inits.push_back(Init.takeAs<Expr>()); 3437 } 3438 3439 return getDerived().RebuildParenListExpr(E->getLParenLoc(), 3440 move_arg(Inits), 3441 E->getRParenLoc()); 3442} 3443 3444/// \brief Transform an address-of-label expression. 3445/// 3446/// By default, the transformation of an address-of-label expression always 3447/// rebuilds the expression, so that the label identifier can be resolved to 3448/// the corresponding label statement by semantic analysis. 3449template<typename Derived> 3450Sema::OwningExprResult 3451TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 3452 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 3453 E->getLabel()); 3454} 3455 3456template<typename Derived> 3457Sema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 3458 OwningStmtResult SubStmt 3459 = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 3460 if (SubStmt.isInvalid()) 3461 return SemaRef.ExprError(); 3462 3463 if (!getDerived().AlwaysRebuild() && 3464 SubStmt.get() == E->getSubStmt()) 3465 return SemaRef.Owned(E->Retain()); 3466 3467 return getDerived().RebuildStmtExpr(E->getLParenLoc(), 3468 move(SubStmt), 3469 E->getRParenLoc()); 3470} 3471 3472template<typename Derived> 3473Sema::OwningExprResult 3474TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) { 3475 QualType T1, T2; 3476 { 3477 // FIXME: Source location isn't quite accurate. 3478 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 3479 3480 T1 = getDerived().TransformType(E->getArgType1()); 3481 if (T1.isNull()) 3482 return SemaRef.ExprError(); 3483 3484 T2 = getDerived().TransformType(E->getArgType2()); 3485 if (T2.isNull()) 3486 return SemaRef.ExprError(); 3487 } 3488 3489 if (!getDerived().AlwaysRebuild() && 3490 T1 == E->getArgType1() && 3491 T2 == E->getArgType2()) 3492 return SemaRef.Owned(E->Retain()); 3493 3494 return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 3495 T1, T2, E->getRParenLoc()); 3496} 3497 3498template<typename Derived> 3499Sema::OwningExprResult 3500TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 3501 OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3502 if (Cond.isInvalid()) 3503 return SemaRef.ExprError(); 3504 3505 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3506 if (LHS.isInvalid()) 3507 return SemaRef.ExprError(); 3508 3509 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3510 if (RHS.isInvalid()) 3511 return SemaRef.ExprError(); 3512 3513 if (!getDerived().AlwaysRebuild() && 3514 Cond.get() == E->getCond() && 3515 LHS.get() == E->getLHS() && 3516 RHS.get() == E->getRHS()) 3517 return SemaRef.Owned(E->Retain()); 3518 3519 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 3520 move(Cond), move(LHS), move(RHS), 3521 E->getRParenLoc()); 3522} 3523 3524template<typename Derived> 3525Sema::OwningExprResult 3526TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 3527 return SemaRef.Owned(E->Retain()); 3528} 3529 3530template<typename Derived> 3531Sema::OwningExprResult 3532TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 3533 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3534 if (Callee.isInvalid()) 3535 return SemaRef.ExprError(); 3536 3537 OwningExprResult First = getDerived().TransformExpr(E->getArg(0)); 3538 if (First.isInvalid()) 3539 return SemaRef.ExprError(); 3540 3541 OwningExprResult Second(SemaRef); 3542 if (E->getNumArgs() == 2) { 3543 Second = getDerived().TransformExpr(E->getArg(1)); 3544 if (Second.isInvalid()) 3545 return SemaRef.ExprError(); 3546 } 3547 3548 if (!getDerived().AlwaysRebuild() && 3549 Callee.get() == E->getCallee() && 3550 First.get() == E->getArg(0) && 3551 (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 3552 return SemaRef.Owned(E->Retain()); 3553 3554 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 3555 E->getOperatorLoc(), 3556 move(Callee), 3557 move(First), 3558 move(Second)); 3559} 3560 3561template<typename Derived> 3562Sema::OwningExprResult 3563TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 3564 return getDerived().TransformCallExpr(E); 3565} 3566 3567template<typename Derived> 3568Sema::OwningExprResult 3569TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 3570 QualType ExplicitTy; 3571 { 3572 // FIXME: Source location isn't quite accurate. 3573 SourceLocation TypeStartLoc 3574 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 3575 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 3576 3577 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 3578 if (ExplicitTy.isNull()) 3579 return SemaRef.ExprError(); 3580 } 3581 3582 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3583 if (SubExpr.isInvalid()) 3584 return SemaRef.ExprError(); 3585 3586 if (!getDerived().AlwaysRebuild() && 3587 ExplicitTy == E->getTypeAsWritten() && 3588 SubExpr.get() == E->getSubExpr()) 3589 return SemaRef.Owned(E->Retain()); 3590 3591 // FIXME: Poor source location information here. 3592 SourceLocation FakeLAngleLoc 3593 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 3594 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 3595 SourceLocation FakeRParenLoc 3596 = SemaRef.PP.getLocForEndOfToken( 3597 E->getSubExpr()->getSourceRange().getEnd()); 3598 return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 3599 E->getStmtClass(), 3600 FakeLAngleLoc, 3601 ExplicitTy, 3602 FakeRAngleLoc, 3603 FakeRAngleLoc, 3604 move(SubExpr), 3605 FakeRParenLoc); 3606} 3607 3608template<typename Derived> 3609Sema::OwningExprResult 3610TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 3611 return getDerived().TransformCXXNamedCastExpr(E); 3612} 3613 3614template<typename Derived> 3615Sema::OwningExprResult 3616TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 3617 return getDerived().TransformCXXNamedCastExpr(E); 3618} 3619 3620template<typename Derived> 3621Sema::OwningExprResult 3622TreeTransform<Derived>::TransformCXXReinterpretCastExpr( 3623 CXXReinterpretCastExpr *E) { 3624 return getDerived().TransformCXXNamedCastExpr(E); 3625} 3626 3627template<typename Derived> 3628Sema::OwningExprResult 3629TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 3630 return getDerived().TransformCXXNamedCastExpr(E); 3631} 3632 3633template<typename Derived> 3634Sema::OwningExprResult 3635TreeTransform<Derived>::TransformCXXFunctionalCastExpr( 3636 CXXFunctionalCastExpr *E) { 3637 QualType ExplicitTy; 3638 { 3639 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 3640 3641 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 3642 if (ExplicitTy.isNull()) 3643 return SemaRef.ExprError(); 3644 } 3645 3646 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3647 if (SubExpr.isInvalid()) 3648 return SemaRef.ExprError(); 3649 3650 if (!getDerived().AlwaysRebuild() && 3651 ExplicitTy == E->getTypeAsWritten() && 3652 SubExpr.get() == E->getSubExpr()) 3653 return SemaRef.Owned(E->Retain()); 3654 3655 // FIXME: The end of the type's source range is wrong 3656 return getDerived().RebuildCXXFunctionalCastExpr( 3657 /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 3658 ExplicitTy, 3659 /*FIXME:*/E->getSubExpr()->getLocStart(), 3660 move(SubExpr), 3661 E->getRParenLoc()); 3662} 3663 3664template<typename Derived> 3665Sema::OwningExprResult 3666TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 3667 if (E->isTypeOperand()) { 3668 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 3669 3670 QualType T = getDerived().TransformType(E->getTypeOperand()); 3671 if (T.isNull()) 3672 return SemaRef.ExprError(); 3673 3674 if (!getDerived().AlwaysRebuild() && 3675 T == E->getTypeOperand()) 3676 return SemaRef.Owned(E->Retain()); 3677 3678 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 3679 /*FIXME:*/E->getLocStart(), 3680 T, 3681 E->getLocEnd()); 3682 } 3683 3684 // We don't know whether the expression is potentially evaluated until 3685 // after we perform semantic analysis, so the expression is potentially 3686 // potentially evaluated. 3687 EnterExpressionEvaluationContext Unevaluated(SemaRef, 3688 Action::PotentiallyPotentiallyEvaluated); 3689 3690 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 3691 if (SubExpr.isInvalid()) 3692 return SemaRef.ExprError(); 3693 3694 if (!getDerived().AlwaysRebuild() && 3695 SubExpr.get() == E->getExprOperand()) 3696 return SemaRef.Owned(E->Retain()); 3697 3698 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 3699 /*FIXME:*/E->getLocStart(), 3700 move(SubExpr), 3701 E->getLocEnd()); 3702} 3703 3704template<typename Derived> 3705Sema::OwningExprResult 3706TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 3707 return SemaRef.Owned(E->Retain()); 3708} 3709 3710template<typename Derived> 3711Sema::OwningExprResult 3712TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 3713 CXXNullPtrLiteralExpr *E) { 3714 return SemaRef.Owned(E->Retain()); 3715} 3716 3717template<typename Derived> 3718Sema::OwningExprResult 3719TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 3720 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 3721 3722 QualType T = getDerived().TransformType(E->getType()); 3723 if (T.isNull()) 3724 return SemaRef.ExprError(); 3725 3726 if (!getDerived().AlwaysRebuild() && 3727 T == E->getType()) 3728 return SemaRef.Owned(E->Retain()); 3729 3730 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T); 3731} 3732 3733template<typename Derived> 3734Sema::OwningExprResult 3735TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 3736 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3737 if (SubExpr.isInvalid()) 3738 return SemaRef.ExprError(); 3739 3740 if (!getDerived().AlwaysRebuild() && 3741 SubExpr.get() == E->getSubExpr()) 3742 return SemaRef.Owned(E->Retain()); 3743 3744 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 3745} 3746 3747template<typename Derived> 3748Sema::OwningExprResult 3749TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 3750 ParmVarDecl *Param 3751 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam())); 3752 if (!Param) 3753 return SemaRef.ExprError(); 3754 3755 if (getDerived().AlwaysRebuild() && 3756 Param == E->getParam()) 3757 return SemaRef.Owned(E->Retain()); 3758 3759 return getDerived().RebuildCXXDefaultArgExpr(Param); 3760} 3761 3762template<typename Derived> 3763Sema::OwningExprResult 3764TreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 3765 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 3766 3767 QualType T = getDerived().TransformType(E->getType()); 3768 if (T.isNull()) 3769 return SemaRef.ExprError(); 3770 3771 if (!getDerived().AlwaysRebuild() && 3772 T == E->getType()) 3773 return SemaRef.Owned(E->Retain()); 3774 3775 return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 3776 /*FIXME:*/E->getTypeBeginLoc(), 3777 T, 3778 E->getRParenLoc()); 3779} 3780 3781template<typename Derived> 3782Sema::OwningExprResult 3783TreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) { 3784 VarDecl *Var 3785 = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl())); 3786 if (!Var) 3787 return SemaRef.ExprError(); 3788 3789 if (!getDerived().AlwaysRebuild() && 3790 Var == E->getVarDecl()) 3791 return SemaRef.Owned(E->Retain()); 3792 3793 return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(), 3794 /*FIXME:*/E->getStartLoc(), 3795 Var); 3796} 3797 3798template<typename Derived> 3799Sema::OwningExprResult 3800TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 3801 // Transform the type that we're allocating 3802 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 3803 QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 3804 if (AllocType.isNull()) 3805 return SemaRef.ExprError(); 3806 3807 // Transform the size of the array we're allocating (if any). 3808 OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 3809 if (ArraySize.isInvalid()) 3810 return SemaRef.ExprError(); 3811 3812 // Transform the placement arguments (if any). 3813 bool ArgumentChanged = false; 3814 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 3815 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 3816 OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 3817 if (Arg.isInvalid()) 3818 return SemaRef.ExprError(); 3819 3820 ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 3821 PlacementArgs.push_back(Arg.take()); 3822 } 3823 3824 // transform the constructor arguments (if any). 3825 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 3826 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 3827 OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 3828 if (Arg.isInvalid()) 3829 return SemaRef.ExprError(); 3830 3831 ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 3832 ConstructorArgs.push_back(Arg.take()); 3833 } 3834 3835 if (!getDerived().AlwaysRebuild() && 3836 AllocType == E->getAllocatedType() && 3837 ArraySize.get() == E->getArraySize() && 3838 !ArgumentChanged) 3839 return SemaRef.Owned(E->Retain()); 3840 3841 return getDerived().RebuildCXXNewExpr(E->getLocStart(), 3842 E->isGlobalNew(), 3843 /*FIXME:*/E->getLocStart(), 3844 move_arg(PlacementArgs), 3845 /*FIXME:*/E->getLocStart(), 3846 E->isParenTypeId(), 3847 AllocType, 3848 /*FIXME:*/E->getLocStart(), 3849 /*FIXME:*/SourceRange(), 3850 move(ArraySize), 3851 /*FIXME:*/E->getLocStart(), 3852 move_arg(ConstructorArgs), 3853 E->getLocEnd()); 3854} 3855 3856template<typename Derived> 3857Sema::OwningExprResult 3858TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 3859 OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 3860 if (Operand.isInvalid()) 3861 return SemaRef.ExprError(); 3862 3863 if (!getDerived().AlwaysRebuild() && 3864 Operand.get() == E->getArgument()) 3865 return SemaRef.Owned(E->Retain()); 3866 3867 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 3868 E->isGlobalDelete(), 3869 E->isArrayForm(), 3870 move(Operand)); 3871} 3872 3873template<typename Derived> 3874Sema::OwningExprResult 3875TreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 3876 CXXPseudoDestructorExpr *E) { 3877 OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3878 if (Base.isInvalid()) 3879 return SemaRef.ExprError(); 3880 3881 NestedNameSpecifier *Qualifier 3882 = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3883 E->getQualifierRange()); 3884 if (E->getQualifier() && !Qualifier) 3885 return SemaRef.ExprError(); 3886 3887 QualType DestroyedType; 3888 { 3889 TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName()); 3890 DestroyedType = getDerived().TransformType(E->getDestroyedType()); 3891 if (DestroyedType.isNull()) 3892 return SemaRef.ExprError(); 3893 } 3894 3895 if (!getDerived().AlwaysRebuild() && 3896 Base.get() == E->getBase() && 3897 Qualifier == E->getQualifier() && 3898 DestroyedType == E->getDestroyedType()) 3899 return SemaRef.Owned(E->Retain()); 3900 3901 return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 3902 E->getOperatorLoc(), 3903 E->isArrow(), 3904 E->getDestroyedTypeLoc(), 3905 DestroyedType, 3906 Qualifier, 3907 E->getQualifierRange()); 3908} 3909 3910template<typename Derived> 3911Sema::OwningExprResult 3912TreeTransform<Derived>::TransformUnresolvedFunctionNameExpr( 3913 UnresolvedFunctionNameExpr *E) { 3914 // There is no transformation we can apply to an unresolved function name. 3915 return SemaRef.Owned(E->Retain()); 3916} 3917 3918template<typename Derived> 3919Sema::OwningExprResult 3920TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 3921 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 3922 3923 QualType T = getDerived().TransformType(E->getQueriedType()); 3924 if (T.isNull()) 3925 return SemaRef.ExprError(); 3926 3927 if (!getDerived().AlwaysRebuild() && 3928 T == E->getQueriedType()) 3929 return SemaRef.Owned(E->Retain()); 3930 3931 // FIXME: Bad location information 3932 SourceLocation FakeLParenLoc 3933 = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 3934 3935 return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 3936 E->getLocStart(), 3937 /*FIXME:*/FakeLParenLoc, 3938 T, 3939 E->getLocEnd()); 3940} 3941 3942template<typename Derived> 3943Sema::OwningExprResult 3944TreeTransform<Derived>::TransformQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) { 3945 NestedNameSpecifier *NNS 3946 = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3947 E->getQualifierRange()); 3948 if (!NNS) 3949 return SemaRef.ExprError(); 3950 3951 NamedDecl *ND 3952 = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 3953 if (!ND) 3954 return SemaRef.ExprError(); 3955 3956 if (!getDerived().AlwaysRebuild() && 3957 NNS == E->getQualifier() && 3958 ND == E->getDecl()) 3959 return SemaRef.Owned(E->Retain()); 3960 3961 return getDerived().RebuildQualifiedDeclRefExpr(NNS, 3962 E->getQualifierRange(), 3963 ND, 3964 E->getLocation(), 3965 /*FIXME:*/false); 3966} 3967 3968template<typename Derived> 3969Sema::OwningExprResult 3970TreeTransform<Derived>::TransformUnresolvedDeclRefExpr( 3971 UnresolvedDeclRefExpr *E) { 3972 NestedNameSpecifier *NNS 3973 = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3974 E->getQualifierRange()); 3975 if (!NNS) 3976 return SemaRef.ExprError(); 3977 3978 DeclarationName Name 3979 = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 3980 if (!Name) 3981 return SemaRef.ExprError(); 3982 3983 if (!getDerived().AlwaysRebuild() && 3984 NNS == E->getQualifier() && 3985 Name == E->getDeclName()) 3986 return SemaRef.Owned(E->Retain()); 3987 3988 return getDerived().RebuildUnresolvedDeclRefExpr(NNS, 3989 E->getQualifierRange(), 3990 Name, 3991 E->getLocation(), 3992 /*FIXME:*/false); 3993} 3994 3995template<typename Derived> 3996Sema::OwningExprResult 3997TreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) { 3998 TemplateName Template 3999 = getDerived().TransformTemplateName(E->getTemplateName()); 4000 if (Template.isNull()) 4001 return SemaRef.ExprError(); 4002 4003 llvm::SmallVector<TemplateArgument, 4> TransArgs; 4004 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4005 TemplateArgument TransArg 4006 = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]); 4007 if (TransArg.isNull()) 4008 return SemaRef.ExprError(); 4009 4010 TransArgs.push_back(TransArg); 4011 } 4012 4013 // FIXME: Would like to avoid rebuilding if nothing changed, but we can't 4014 // compare template arguments (yet). 4015 4016 // FIXME: It's possible that we'll find out now that the template name 4017 // actually refers to a type, in which case the caller is actually dealing 4018 // with a functional cast. Give a reasonable error message! 4019 return getDerived().RebuildTemplateIdExpr(Template, E->getTemplateNameLoc(), 4020 E->getLAngleLoc(), 4021 TransArgs.data(), 4022 TransArgs.size(), 4023 E->getRAngleLoc()); 4024} 4025 4026template<typename Derived> 4027Sema::OwningExprResult 4028TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 4029 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 4030 4031 QualType T = getDerived().TransformType(E->getType()); 4032 if (T.isNull()) 4033 return SemaRef.ExprError(); 4034 4035 CXXConstructorDecl *Constructor 4036 = cast_or_null<CXXConstructorDecl>( 4037 getDerived().TransformDecl(E->getConstructor())); 4038 if (!Constructor) 4039 return SemaRef.ExprError(); 4040 4041 bool ArgumentChanged = false; 4042 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4043 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 4044 ArgEnd = E->arg_end(); 4045 Arg != ArgEnd; ++Arg) { 4046 OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4047 if (TransArg.isInvalid()) 4048 return SemaRef.ExprError(); 4049 4050 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4051 Args.push_back(TransArg.takeAs<Expr>()); 4052 } 4053 4054 if (!getDerived().AlwaysRebuild() && 4055 T == E->getType() && 4056 Constructor == E->getConstructor() && 4057 !ArgumentChanged) 4058 return SemaRef.Owned(E->Retain()); 4059 4060 return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(), 4061 move_arg(Args)); 4062} 4063 4064/// \brief Transform a C++ temporary-binding expression. 4065/// 4066/// The transformation of a temporary-binding expression always attempts to 4067/// bind a new temporary variable to its subexpression, even if the 4068/// subexpression itself did not change, because the temporary variable itself 4069/// must be unique. 4070template<typename Derived> 4071Sema::OwningExprResult 4072TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 4073 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4074 if (SubExpr.isInvalid()) 4075 return SemaRef.ExprError(); 4076 4077 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>()); 4078} 4079 4080/// \brief Transform a C++ expression that contains temporaries that should 4081/// be destroyed after the expression is evaluated. 4082/// 4083/// The transformation of a full expression always attempts to build a new 4084/// CXXExprWithTemporaries expression, even if the 4085/// subexpression itself did not change, because it will need to capture the 4086/// the new temporary variables introduced in the subexpression. 4087template<typename Derived> 4088Sema::OwningExprResult 4089TreeTransform<Derived>::TransformCXXExprWithTemporaries( 4090 CXXExprWithTemporaries *E) { 4091 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4092 if (SubExpr.isInvalid()) 4093 return SemaRef.ExprError(); 4094 4095 return SemaRef.Owned( 4096 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(), 4097 E->shouldDestroyTemporaries())); 4098} 4099 4100template<typename Derived> 4101Sema::OwningExprResult 4102TreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 4103 CXXTemporaryObjectExpr *E) { 4104 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4105 QualType T = getDerived().TransformType(E->getType()); 4106 if (T.isNull()) 4107 return SemaRef.ExprError(); 4108 4109 CXXConstructorDecl *Constructor 4110 = cast_or_null<CXXConstructorDecl>( 4111 getDerived().TransformDecl(E->getConstructor())); 4112 if (!Constructor) 4113 return SemaRef.ExprError(); 4114 4115 bool ArgumentChanged = false; 4116 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4117 Args.reserve(E->getNumArgs()); 4118 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 4119 ArgEnd = E->arg_end(); 4120 Arg != ArgEnd; ++Arg) { 4121 OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4122 if (TransArg.isInvalid()) 4123 return SemaRef.ExprError(); 4124 4125 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4126 Args.push_back((Expr *)TransArg.release()); 4127 } 4128 4129 if (!getDerived().AlwaysRebuild() && 4130 T == E->getType() && 4131 Constructor == E->getConstructor() && 4132 !ArgumentChanged) 4133 return SemaRef.Owned(E->Retain()); 4134 4135 // FIXME: Bogus location information 4136 SourceLocation CommaLoc; 4137 if (Args.size() > 1) { 4138 Expr *First = (Expr *)Args[0]; 4139 CommaLoc 4140 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 4141 } 4142 return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 4143 T, 4144 /*FIXME:*/E->getTypeBeginLoc(), 4145 move_arg(Args), 4146 &CommaLoc, 4147 E->getLocEnd()); 4148} 4149 4150template<typename Derived> 4151Sema::OwningExprResult 4152TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 4153 CXXUnresolvedConstructExpr *E) { 4154 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4155 QualType T = getDerived().TransformType(E->getTypeAsWritten()); 4156 if (T.isNull()) 4157 return SemaRef.ExprError(); 4158 4159 bool ArgumentChanged = false; 4160 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4161 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 4162 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 4163 ArgEnd = E->arg_end(); 4164 Arg != ArgEnd; ++Arg) { 4165 OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4166 if (TransArg.isInvalid()) 4167 return SemaRef.ExprError(); 4168 4169 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4170 FakeCommaLocs.push_back( 4171 SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 4172 Args.push_back(TransArg.takeAs<Expr>()); 4173 } 4174 4175 if (!getDerived().AlwaysRebuild() && 4176 T == E->getTypeAsWritten() && 4177 !ArgumentChanged) 4178 return SemaRef.Owned(E->Retain()); 4179 4180 // FIXME: we're faking the locations of the commas 4181 return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 4182 T, 4183 E->getLParenLoc(), 4184 move_arg(Args), 4185 FakeCommaLocs.data(), 4186 E->getRParenLoc()); 4187} 4188 4189template<typename Derived> 4190Sema::OwningExprResult 4191TreeTransform<Derived>::TransformCXXUnresolvedMemberExpr( 4192 CXXUnresolvedMemberExpr *E) { 4193 // Transform the base of the expression. 4194 OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4195 if (Base.isInvalid()) 4196 return SemaRef.ExprError(); 4197 4198 Sema::TypeTy *ObjectType = 0; 4199 Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 4200 E->getOperatorLoc(), 4201 E->isArrow()? tok::arrow : tok::period, 4202 ObjectType); 4203 if (Base.isInvalid()) 4204 return SemaRef.ExprError(); 4205 4206 // FIXME: The first qualifier found might be a template type parameter, 4207 // in which case there is no transformed declaration to refer to (it might 4208 // refer to a built-in type!). 4209 NamedDecl *FirstQualifierInScope 4210 = cast_or_null<NamedDecl>( 4211 getDerived().TransformDecl(E->getFirstQualifierFoundInScope())); 4212 4213 NestedNameSpecifier *Qualifier = 0; 4214 if (E->getQualifier()) { 4215 Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4216 E->getQualifierRange(), 4217 QualType::getFromOpaquePtr(ObjectType), 4218 FirstQualifierInScope); 4219 if (!Qualifier) 4220 return SemaRef.ExprError(); 4221 } 4222 4223 DeclarationName Name 4224 = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(), 4225 QualType::getFromOpaquePtr(ObjectType)); 4226 if (!Name) 4227 return SemaRef.ExprError(); 4228 4229 if (!E->hasExplicitTemplateArgumentList()) { 4230 // This is a reference to a member without an explicitly-specified 4231 // template argument list. Optimize for this common case. 4232 if (!getDerived().AlwaysRebuild() && 4233 Base.get() == E->getBase() && 4234 Qualifier == E->getQualifier() && 4235 Name == E->getMember() && 4236 FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 4237 return SemaRef.Owned(E->Retain()); 4238 4239 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 4240 E->isArrow(), 4241 E->getOperatorLoc(), 4242 Qualifier, 4243 E->getQualifierRange(), 4244 Name, 4245 E->getMemberLoc(), 4246 FirstQualifierInScope); 4247 } 4248 4249 // FIXME: This is an ugly hack, which forces the same template name to 4250 // be looked up multiple times. Yuck! 4251 // FIXME: This also won't work for, e.g., x->template operator+<int> 4252 TemplateName OrigTemplateName 4253 = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo()); 4254 4255 TemplateName Template 4256 = getDerived().TransformTemplateName(OrigTemplateName, 4257 QualType::getFromOpaquePtr(ObjectType)); 4258 if (Template.isNull()) 4259 return SemaRef.ExprError(); 4260 4261 llvm::SmallVector<TemplateArgument, 4> TransArgs; 4262 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 4263 TemplateArgument TransArg 4264 = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]); 4265 if (TransArg.isNull()) 4266 return SemaRef.ExprError(); 4267 4268 TransArgs.push_back(TransArg); 4269 } 4270 4271 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 4272 E->isArrow(), 4273 E->getOperatorLoc(), 4274 Qualifier, 4275 E->getQualifierRange(), 4276 Template, 4277 E->getMemberLoc(), 4278 FirstQualifierInScope, 4279 E->getLAngleLoc(), 4280 TransArgs.data(), 4281 TransArgs.size(), 4282 E->getRAngleLoc()); 4283} 4284 4285template<typename Derived> 4286Sema::OwningExprResult 4287TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 4288 return SemaRef.Owned(E->Retain()); 4289} 4290 4291template<typename Derived> 4292Sema::OwningExprResult 4293TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 4294 // FIXME: poor source location 4295 TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 4296 QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 4297 if (EncodedType.isNull()) 4298 return SemaRef.ExprError(); 4299 4300 if (!getDerived().AlwaysRebuild() && 4301 EncodedType == E->getEncodedType()) 4302 return SemaRef.Owned(E->Retain()); 4303 4304 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 4305 EncodedType, 4306 E->getRParenLoc()); 4307} 4308 4309template<typename Derived> 4310Sema::OwningExprResult 4311TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 4312 // FIXME: Implement this! 4313 assert(false && "Cannot transform Objective-C expressions yet"); 4314 return SemaRef.Owned(E->Retain()); 4315} 4316 4317template<typename Derived> 4318Sema::OwningExprResult 4319TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 4320 return SemaRef.Owned(E->Retain()); 4321} 4322 4323template<typename Derived> 4324Sema::OwningExprResult 4325TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 4326 ObjCProtocolDecl *Protocol 4327 = cast_or_null<ObjCProtocolDecl>( 4328 getDerived().TransformDecl(E->getProtocol())); 4329 if (!Protocol) 4330 return SemaRef.ExprError(); 4331 4332 if (!getDerived().AlwaysRebuild() && 4333 Protocol == E->getProtocol()) 4334 return SemaRef.Owned(E->Retain()); 4335 4336 return getDerived().RebuildObjCProtocolExpr(Protocol, 4337 E->getAtLoc(), 4338 /*FIXME:*/E->getAtLoc(), 4339 /*FIXME:*/E->getAtLoc(), 4340 E->getRParenLoc()); 4341 4342} 4343 4344template<typename Derived> 4345Sema::OwningExprResult 4346TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 4347 // FIXME: Implement this! 4348 assert(false && "Cannot transform Objective-C expressions yet"); 4349 return SemaRef.Owned(E->Retain()); 4350} 4351 4352template<typename Derived> 4353Sema::OwningExprResult 4354TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 4355 // FIXME: Implement this! 4356 assert(false && "Cannot transform Objective-C expressions yet"); 4357 return SemaRef.Owned(E->Retain()); 4358} 4359 4360template<typename Derived> 4361Sema::OwningExprResult 4362TreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 4363 ObjCImplicitSetterGetterRefExpr *E) { 4364 // FIXME: Implement this! 4365 assert(false && "Cannot transform Objective-C expressions yet"); 4366 return SemaRef.Owned(E->Retain()); 4367} 4368 4369template<typename Derived> 4370Sema::OwningExprResult 4371TreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) { 4372 // FIXME: Implement this! 4373 assert(false && "Cannot transform Objective-C expressions yet"); 4374 return SemaRef.Owned(E->Retain()); 4375} 4376 4377template<typename Derived> 4378Sema::OwningExprResult 4379TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 4380 // FIXME: Implement this! 4381 assert(false && "Cannot transform Objective-C expressions yet"); 4382 return SemaRef.Owned(E->Retain()); 4383} 4384 4385template<typename Derived> 4386Sema::OwningExprResult 4387TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 4388 bool ArgumentChanged = false; 4389 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 4390 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 4391 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 4392 if (SubExpr.isInvalid()) 4393 return SemaRef.ExprError(); 4394 4395 ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 4396 SubExprs.push_back(SubExpr.takeAs<Expr>()); 4397 } 4398 4399 if (!getDerived().AlwaysRebuild() && 4400 !ArgumentChanged) 4401 return SemaRef.Owned(E->Retain()); 4402 4403 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 4404 move_arg(SubExprs), 4405 E->getRParenLoc()); 4406} 4407 4408template<typename Derived> 4409Sema::OwningExprResult 4410TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 4411 // FIXME: Implement this! 4412 assert(false && "Cannot transform block expressions yet"); 4413 return SemaRef.Owned(E->Retain()); 4414} 4415 4416template<typename Derived> 4417Sema::OwningExprResult 4418TreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 4419 // FIXME: Implement this! 4420 assert(false && "Cannot transform block-related expressions yet"); 4421 return SemaRef.Owned(E->Retain()); 4422} 4423 4424//===----------------------------------------------------------------------===// 4425// Type reconstruction 4426//===----------------------------------------------------------------------===// 4427 4428template<typename Derived> 4429QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) { 4430 return SemaRef.BuildPointerType(PointeeType, Qualifiers(), 4431 getDerived().getBaseLocation(), 4432 getDerived().getBaseEntity()); 4433} 4434 4435template<typename Derived> 4436QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) { 4437 return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), 4438 getDerived().getBaseLocation(), 4439 getDerived().getBaseEntity()); 4440} 4441 4442template<typename Derived> 4443QualType 4444TreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) { 4445 return SemaRef.BuildReferenceType(ReferentType, true, Qualifiers(), 4446 getDerived().getBaseLocation(), 4447 getDerived().getBaseEntity()); 4448} 4449 4450template<typename Derived> 4451QualType 4452TreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) { 4453 return SemaRef.BuildReferenceType(ReferentType, false, Qualifiers(), 4454 getDerived().getBaseLocation(), 4455 getDerived().getBaseEntity()); 4456} 4457 4458template<typename Derived> 4459QualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 4460 QualType ClassType) { 4461 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(), 4462 getDerived().getBaseLocation(), 4463 getDerived().getBaseEntity()); 4464} 4465 4466template<typename Derived> 4467QualType 4468TreeTransform<Derived>::RebuildArrayType(QualType ElementType, 4469 ArrayType::ArraySizeModifier SizeMod, 4470 const llvm::APInt *Size, 4471 Expr *SizeExpr, 4472 unsigned IndexTypeQuals, 4473 SourceRange BracketsRange) { 4474 if (SizeExpr || !Size) 4475 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 4476 IndexTypeQuals, BracketsRange, 4477 getDerived().getBaseEntity()); 4478 4479 QualType Types[] = { 4480 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 4481 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 4482 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 4483 }; 4484 const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 4485 QualType SizeType; 4486 for (unsigned I = 0; I != NumTypes; ++I) 4487 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 4488 SizeType = Types[I]; 4489 break; 4490 } 4491 4492 if (SizeType.isNull()) 4493 SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false); 4494 4495 IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 4496 return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 4497 IndexTypeQuals, BracketsRange, 4498 getDerived().getBaseEntity()); 4499} 4500 4501template<typename Derived> 4502QualType 4503TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 4504 ArrayType::ArraySizeModifier SizeMod, 4505 const llvm::APInt &Size, 4506 unsigned IndexTypeQuals) { 4507 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 4508 IndexTypeQuals, SourceRange()); 4509} 4510 4511template<typename Derived> 4512QualType 4513TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 4514 ArrayType::ArraySizeModifier SizeMod, 4515 unsigned IndexTypeQuals) { 4516 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 4517 IndexTypeQuals, SourceRange()); 4518} 4519 4520template<typename Derived> 4521QualType 4522TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 4523 ArrayType::ArraySizeModifier SizeMod, 4524 ExprArg SizeExpr, 4525 unsigned IndexTypeQuals, 4526 SourceRange BracketsRange) { 4527 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 4528 SizeExpr.takeAs<Expr>(), 4529 IndexTypeQuals, BracketsRange); 4530} 4531 4532template<typename Derived> 4533QualType 4534TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 4535 ArrayType::ArraySizeModifier SizeMod, 4536 ExprArg SizeExpr, 4537 unsigned IndexTypeQuals, 4538 SourceRange BracketsRange) { 4539 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 4540 SizeExpr.takeAs<Expr>(), 4541 IndexTypeQuals, BracketsRange); 4542} 4543 4544template<typename Derived> 4545QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 4546 unsigned NumElements) { 4547 // FIXME: semantic checking! 4548 return SemaRef.Context.getVectorType(ElementType, NumElements); 4549} 4550 4551template<typename Derived> 4552QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 4553 unsigned NumElements, 4554 SourceLocation AttributeLoc) { 4555 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 4556 NumElements, true); 4557 IntegerLiteral *VectorSize 4558 = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 4559 AttributeLoc); 4560 return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 4561 AttributeLoc); 4562} 4563 4564template<typename Derived> 4565QualType 4566TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 4567 ExprArg SizeExpr, 4568 SourceLocation AttributeLoc) { 4569 return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 4570} 4571 4572template<typename Derived> 4573QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 4574 QualType *ParamTypes, 4575 unsigned NumParamTypes, 4576 bool Variadic, 4577 unsigned Quals) { 4578 return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 4579 Quals, 4580 getDerived().getBaseLocation(), 4581 getDerived().getBaseEntity()); 4582} 4583 4584template<typename Derived> 4585QualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 4586 return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 4587} 4588 4589template<typename Derived> 4590QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 4591 return SemaRef.Context.getTypeOfType(Underlying); 4592} 4593 4594template<typename Derived> 4595QualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 4596 return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 4597} 4598 4599template<typename Derived> 4600QualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 4601 TemplateName Template, 4602 const TemplateArgument *Args, 4603 unsigned NumArgs) { 4604 // FIXME: Missing source locations for the template name, <, >. 4605 return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(), 4606 SourceLocation(), Args, NumArgs, 4607 SourceLocation()); 4608} 4609 4610template<typename Derived> 4611NestedNameSpecifier * 4612TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 4613 SourceRange Range, 4614 IdentifierInfo &II, 4615 QualType ObjectType, 4616 NamedDecl *FirstQualifierInScope) { 4617 CXXScopeSpec SS; 4618 // FIXME: The source location information is all wrong. 4619 SS.setRange(Range); 4620 SS.setScopeRep(Prefix); 4621 return static_cast<NestedNameSpecifier *>( 4622 SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 4623 Range.getEnd(), II, 4624 ObjectType, 4625 FirstQualifierInScope, 4626 false)); 4627} 4628 4629template<typename Derived> 4630NestedNameSpecifier * 4631TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 4632 SourceRange Range, 4633 NamespaceDecl *NS) { 4634 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 4635} 4636 4637template<typename Derived> 4638NestedNameSpecifier * 4639TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 4640 SourceRange Range, 4641 bool TemplateKW, 4642 QualType T) { 4643 if (T->isDependentType() || T->isRecordType() || 4644 (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 4645 assert(!T.hasQualifiers() && "Can't get cv-qualifiers here"); 4646 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 4647 T.getTypePtr()); 4648 } 4649 4650 SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 4651 return 0; 4652} 4653 4654template<typename Derived> 4655TemplateName 4656TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 4657 bool TemplateKW, 4658 TemplateDecl *Template) { 4659 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 4660 Template); 4661} 4662 4663template<typename Derived> 4664TemplateName 4665TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 4666 bool TemplateKW, 4667 OverloadedFunctionDecl *Ovl) { 4668 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl); 4669} 4670 4671template<typename Derived> 4672TemplateName 4673TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 4674 const IdentifierInfo &II, 4675 QualType ObjectType) { 4676 CXXScopeSpec SS; 4677 SS.setRange(SourceRange(getDerived().getBaseLocation())); 4678 SS.setScopeRep(Qualifier); 4679 return getSema().ActOnDependentTemplateName( 4680 /*FIXME:*/getDerived().getBaseLocation(), 4681 II, 4682 /*FIXME:*/getDerived().getBaseLocation(), 4683 SS, 4684 ObjectType.getAsOpaquePtr()) 4685 .template getAsVal<TemplateName>(); 4686} 4687 4688template<typename Derived> 4689Sema::OwningExprResult 4690TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 4691 SourceLocation OpLoc, 4692 ExprArg Callee, 4693 ExprArg First, 4694 ExprArg Second) { 4695 Expr *FirstExpr = (Expr *)First.get(); 4696 Expr *SecondExpr = (Expr *)Second.get(); 4697 bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 4698 4699 // Determine whether this should be a builtin operation. 4700 if (SecondExpr == 0 || isPostIncDec) { 4701 if (!FirstExpr->getType()->isOverloadableType()) { 4702 // The argument is not of overloadable type, so try to create a 4703 // built-in unary operation. 4704 UnaryOperator::Opcode Opc 4705 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 4706 4707 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 4708 } 4709 } else { 4710 if (!FirstExpr->getType()->isOverloadableType() && 4711 !SecondExpr->getType()->isOverloadableType()) { 4712 // Neither of the arguments is an overloadable type, so try to 4713 // create a built-in binary operation. 4714 BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 4715 OwningExprResult Result 4716 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 4717 if (Result.isInvalid()) 4718 return SemaRef.ExprError(); 4719 4720 First.release(); 4721 Second.release(); 4722 return move(Result); 4723 } 4724 } 4725 4726 // Compute the transformed set of functions (and function templates) to be 4727 // used during overload resolution. 4728 Sema::FunctionSet Functions; 4729 4730 DeclRefExpr *DRE 4731 = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts()); 4732 4733 // FIXME: Do we have to check 4734 // IsAcceptableNonMemberOperatorCandidate for each of these? 4735 for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F) 4736 Functions.insert(*F); 4737 4738 // Add any functions found via argument-dependent lookup. 4739 Expr *Args[2] = { FirstExpr, SecondExpr }; 4740 unsigned NumArgs = 1 + (SecondExpr != 0); 4741 DeclarationName OpName 4742 = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); 4743 SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions); 4744 4745 // Create the overloaded operator invocation for unary operators. 4746 if (NumArgs == 1 || isPostIncDec) { 4747 UnaryOperator::Opcode Opc 4748 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 4749 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 4750 } 4751 4752 // Create the overloaded operator invocation for binary operators. 4753 BinaryOperator::Opcode Opc = 4754 BinaryOperator::getOverloadedOpcode(Op); 4755 OwningExprResult Result 4756 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 4757 if (Result.isInvalid()) 4758 return SemaRef.ExprError(); 4759 4760 First.release(); 4761 Second.release(); 4762 return move(Result); 4763} 4764 4765} // end namespace clang 4766 4767#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 4768