TreeTransform.h revision 49a832bd499d6f61c23655f1fac99f0dd229756e
1577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===------- TreeTransform.h - Semantic Tree Transformation ---------------===/ 2577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 3577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// The LLVM Compiler Infrastructure 4577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 5577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// This file is distributed under the University of Illinois Open Source 6577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// License. See LICENSE.TXT for details. 7577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/ 8577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 9577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// This file implements a semantic tree transformation that takes a given 10577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// AST and rebuilds it, possibly transforming some nodes in the process. 11577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// 12577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===/ 13577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H 14577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define LLVM_CLANG_SEMA_TREETRANSFORM_H 15577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 16577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "Sema.h" 17dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor#include "clang/Sema/SemaDiagnostic.h" 18c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor#include "clang/AST/Decl.h" 19657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h" 20b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h" 21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h" 2243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/Stmt.h" 2343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtCXX.h" 2443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtObjC.h" 25b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h" 26b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h" 27b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h" 28577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm> 29577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 30577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang { 311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one 33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another. 34577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// A new tree transformation is defined by creating a new subclass \c X of 361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \c TreeTransform<X> and then overriding certain operations to provide 371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// behavior specific to that transformation. For example, template 38577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the 39577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the 40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar 41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and 42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters. 43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow 451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// subclasses to customize any of its operations. Thus, a subclass can 46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an 47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The 48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual. 49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which 51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node 52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions, 53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST 54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation 55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g., 56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes 57577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create 58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node. 59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// Subclasses can customize the transformation at various levels. The 61670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(), 62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(), 63577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely 64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations. 65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the 67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 6843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor/// PointerType, StmtExpr) to alter the transformation. As mentioned previously, 69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation 701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to substitute template arguments for their corresponding template 71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX 72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change. 73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild 74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may 75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps. 76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// to avoid traversing nodes that don't need any transformation 79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the 81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking 82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()). 83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform { 85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected: 86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &SemaRef; 871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumppublic: 89b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningStmtResult OwningStmtResult; 90b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningExprResult OwningExprResult; 91b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::StmtArg StmtArg; 92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::ExprArg ExprArg; 93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::MultiExprArg MultiExprArg; 9443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor typedef Sema::MultiStmtArg MultiStmtArg; 951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 96577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Initializes a new tree transformer. 97577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Derived &getDerived() { return static_cast<Derived&>(*this); } 101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Derived &getDerived() const { 1041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return static_cast<const Derived&>(*this); 105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the semantic analysis object used for 108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this tree transform. 109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &getSema() const { return SemaRef; } 1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Whether the transformation should always rebuild AST nodes, even 112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// if none of the children have changed. 113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this function to specify when the transformation 115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// should rebuild all AST nodes. 116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlwaysRebuild() { return false; } 1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the location of the entity being transformed, if that 119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, returns no source-location information. Subclasses can 122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// provide an alternative implementation that provides better location 123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information. 124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation getBaseLocation() { return SourceLocation(); } 1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the name of the entity being transformed, if that 127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, returns an empty name. Subclasses can provide an alternative 130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// implementation with a more precise name. 131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor DeclarationName getBaseEntity() { return DeclarationName(); } 132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Sets the "base" location and entity when that 134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// information is known based on another transformation. 135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, the source location and entity are ignored. Subclasses can 137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// override this function to provide a customized implementation. 138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor void setBase(SourceLocation Loc, DeclarationName Entity) { } 1391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief RAII object that temporarily sets the base location and entity 141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// used for reporting diagnostics in types. 142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor class TemporaryBase { 143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TreeTransform &Self; 144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OldLocation; 145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName OldEntity; 1461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor public: 148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase(TreeTransform &Self, SourceLocation Location, 1491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Entity) : Self(Self) { 150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldLocation = Self.getDerived().getBaseLocation(); 151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldEntity = Self.getDerived().getBaseEntity(); 152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(Location, Entity); 153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ~TemporaryBase() { 156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(OldLocation, OldEntity); 157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor }; 1591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Determine whether the given type \p T has already been 161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// transformed. 162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses can provide an alternative implementation of this routine 1641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// to short-circuit evaluation when it is known that a given type will 165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// not change. For example, template instantiation need not traverse 166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// non-dependent types. 167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlreadyTransformed(QualType T) { 168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T.isNull(); 169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transforms the given type into another type. 172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, this routine transforms a type by delegating to the 1741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// appropriate TransformXXXType to build a new type, then applying 1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// the qualifiers on \p T to the resulting type with AddTypeQualifiers. 1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// Subclasses may override this function (to take over all type 177577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// transformations), some set of the TransformXXXType functions, or 178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// the AddTypeQualifiers function to alter the transformation. 179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \returns the transformed type. 181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType TransformType(QualType T); 1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given type by adding the given set of qualifiers 184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// and returning the result. 185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// FIXME: By default, this routine adds type qualifiers only to types that 187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// can have qualifiers, and silently suppresses those qualifiers that are 188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// not permitted (e.g., qualifiers on reference or function types). This 189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// is the right thing for template instantiation, but probably not for 190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// other clients. 1910953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualType AddTypeQualifiers(QualType T, Qualifiers Qs); 1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 193657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given statement. 194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 1951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this routine transforms a statement by delegating to the 19643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// appropriate TransformXXXStmt function to transform a specific kind of 19743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// statement or the TransformExpr() function to transform an expression. 19843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to transform statements using some 19943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// other mechanism. 20043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 20143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \returns the transformed statement. 202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningStmtResult TransformStmt(Stmt *S); 2031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 204657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given expression. 205657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// 206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E) { 213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false); 214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Transform the given expression. 217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand); 2251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given declaration, which is referenced from a type 227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// or expression. 228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 229dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, acts as the identity function on declarations. Subclasses 230dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// may override this function to provide alternate behavior. 231dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Decl *TransformDecl(Decl *D) { return D; } 23243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 23343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Transform the definition of the given declaration. 23443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, invokes TransformDecl() to transform the declaration. 23643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 23743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); } 2381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 239577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given nested-name-specifier. 240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, transforms all of the types and declarations within the 242dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this function to provide 243dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// alternate behavior. 244577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 245a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 246c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType = QualType(), 247c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope = 0); 2481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// \brief Transform the given declaration name. 25081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// 25181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// By default, transforms the types of conversion function, constructor, 25281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// and destructor names and then (if needed) rebuilds the declaration name. 25381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// Identifiers and selectors are returned unmodified. Sublcasses may 25481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor /// override this function to provide alternate behavior. 25581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor DeclarationName TransformDeclarationName(DeclarationName Name, 25681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SourceLocation Loc); 2571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template name. 2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 260d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, transforms the template name by transforming the declarations 2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and nested-name-specifiers that occur within the template name. 262d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 2633b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName TransformTemplateName(TemplateName Name, 2643b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType = QualType()); 2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template argument. 267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, this operation transforms the type, expression, or 2691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// declaration stored within the template argument and constructs a 270670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// new template argument from the transformed result. Subclasses may 271670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// override this function to provide alternate behavior. 272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg); 2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define ABSTRACT_TYPE(CLASS, PARENT) 275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT) \ 276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Transform##CLASS##Type(const CLASS##Type *T); 2771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include "clang/AST/TypeNodes.def" 278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 27943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr); 2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 28243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Transform##Node(Node *S); 283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Transform##Node(Node *E); 285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent) 286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 2871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildPointerType(QualType PointeeType); 293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 2961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis when building the block pointer 297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildBlockPointerType(QualType PointeeType); 299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new lvalue reference type given the type it references. 301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the lvalue reference 303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildLValueReferenceType(QualType ReferentType); 305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new rvalue reference type given the type it references. 307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the rvalue reference 309577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRValueReferenceType(QualType ReferentType); 3111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType); 3181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// Also by default, all of the other Rebuild*Array 326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 328577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 331577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 3321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 333577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 334577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 335577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 336577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 337577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildConstantArrayType(QualType ElementType, 339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 340577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 341577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals); 342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new incomplete array type given the element type, size 344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, and index type qualifiers. 345577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildIncompleteArrayType(QualType ElementType, 349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals); 351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new variable-length array type given the element type, 353577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 356577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildVariableArrayType(QualType ElementType, 358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new dependent-sized array type given the element type, 364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// size modifier, size expression, and index type qualifiers. 365577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 366577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedArrayType(QualType ElementType, 369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 374577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new vector type given the element type and 375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 378577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildVectorType(QualType ElementType, unsigned NumElements); 3801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new extended vector type given the element type and 382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// number of elements. 383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 386577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements, 387577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new potentially dependently-sized extended vector type 390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// given the element type and number of elements. 391577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the vector type. 393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 3941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildDependentSizedExtVectorType(QualType ElementType, 395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 3971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new function type. 399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 400577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the function type. 401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildFunctionProtoType(QualType T, 4031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, unsigned Quals); 4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typedef type. 408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypedefType(TypedefDecl *Typedef) { 409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Typedef); 410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 411577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new class/struct/union type. 413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRecordType(RecordDecl *Record) { 414577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Record); 415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 416577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new Enum type. 418577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildEnumType(EnumDecl *Enum) { 419577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeDeclType(Enum); 420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 4217da2431c23ef1ee8acb114e39692246e1801afc2John McCall 4227da2431c23ef1ee8acb114e39692246e1801afc2John McCall /// \brief Build a new elaborated type. 4237da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) { 4247da2431c23ef1ee8acb114e39692246e1801afc2John McCall return SemaRef.Context.getElaboratedType(T, Tag); 4257da2431c23ef1ee8acb114e39692246e1801afc2John McCall } 4261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(expr) type. 428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildTypeOfExprType(ExprArg Underlying); 432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new typeof(type) type. 434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++0x decltype type. 439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildDecltypeType(ExprArg Underlying); 4431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateArgument *Args, 451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumArgs); 4521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 4551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, builds a new QualifiedNameType type from the 4561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// nested-name-specifier and the named type. Subclasses may override 457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this routine to provide different behavior. 458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, Named); 4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypenameType type from the nested-name-specifier 4651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// and the given type. Subclasses may override this routine to provide 466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) { 468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NNS->isDependent()) 4691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getTypenameType(NNS, 470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor cast<TemplateSpecializationType>(T)); 4711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, T); 4731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 4781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// (or qualified name type). Subclasses may override this routine to provide 479577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 4801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType RebuildTypenameType(NestedNameSpecifier *NNS, 481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const IdentifierInfo *Id) { 482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.CheckTypenameType(NNS, *Id, 483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange(getDerived().getBaseLocation())); 484dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 4851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 486dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 487dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 488dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 489dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 490dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 491dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 492dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 493dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 494a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 495c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 496c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope); 497dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 498dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 499dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 500dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 501dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 502dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 503dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 504dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 505dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 506dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 507dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 508dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 509dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 510dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 511dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 512dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 513dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 514dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 515dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 516dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 517dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T); 518d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 519d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 520d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 521d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 522d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 523d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 524d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 525d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 526d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 527d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 528d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 529d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 530d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and a set of 531d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// overloaded function templates. 532d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 533d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 534d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 535d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 536d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 537d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl); 5381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 539d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 540d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 541d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 542d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 543d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 544d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 545d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 546d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 5473b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 5483b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType); 5491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 5501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 55143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new compound statement. 55243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 55343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 55443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 55543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc, 55643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Statements, 55743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RBraceLoc, 55843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 55943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements), 56043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 56143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 56243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 56343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new case statement. 56443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 56543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 56643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 56743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc, 56843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg LHS, 56943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EllipsisLoc, 57043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg RHS, 57143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc) { 5721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS), 57343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ColonLoc); 57443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 5751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 57643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to a new case statement. 57743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 57843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 57943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 58043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) { 58143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor getSema().ActOnCaseStmtBody(S.get(), move(Body)); 58243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return move(S); 58343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 5841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 58543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new default statement. 58643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 58743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 58843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 5891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc, 59043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 59143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 5921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt), 59343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*CurScope=*/0); 59443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 5951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 59643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new label statement. 59743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 59843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 59943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc, 60143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Id, 60243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc, 60343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg SubStmt) { 60443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt)); 60543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 60743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new "if" statement. 60843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 60943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 61043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond, 6121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump StmtArg Then, SourceLocation ElseLoc, 61343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Else) { 61443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else)); 61543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 61743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Start building a new switch statement. 61843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 61943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 62043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 62143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) { 62243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnStartOfSwitchStmt(move(Cond)); 62343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 62543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Attach the body to the switch statement. 62643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 62743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 62843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc, 63043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Switch, StmtArg Body) { 63143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch), 63243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 63343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 63443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 63543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new while statement. 63643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 63743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 63843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 63943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc, 64043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg Cond, 64143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Body) { 64243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body)); 64343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 64543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new do-while statement. 64643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 64743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 64843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 64943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body, 65043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation WhileLoc, 65143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 65243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Cond, 65343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc) { 6541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc, 65543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Cond), RParenLoc); 65643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 65743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 65843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new for statement. 65943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 66043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 66143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 6621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult RebuildForStmt(SourceLocation ForLoc, 66343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LParenLoc, 66443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Init, ExprArg Cond, ExprArg Inc, 66543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation RParenLoc, StmtArg Body) { 6661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond), 66743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Inc), RParenLoc, move(Body)); 66843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 67043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new goto statement. 67143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 67243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 67343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 67443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc, 67543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation LabelLoc, 67643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor LabelStmt *Label) { 67743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID()); 67843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 67943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 68043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new indirect goto statement. 68143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 68243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 68343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 68443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc, 68543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation StarLoc, 68643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Target) { 68743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target)); 68843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new return statement. 69143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 69243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 69343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 69443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc, 69543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExprArg Result) { 6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 69743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnReturnStmt(ReturnLoc, move(Result)); 69843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 6991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 70043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new declaration statement. 70143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 70243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 70343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 70443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls, 7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation StartLoc, 70643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation EndLoc) { 70743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 70843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor new (getSema().Context) DeclStmt( 70943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclGroupRef::Create(getSema().Context, 71043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls, NumDecls), 71143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StartLoc, EndLoc)); 71243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 71443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ exception declaration. 71543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 71643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new decaration. 71743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 7181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T, 71943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclaratorInfo *Declarator, 72043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IdentifierInfo *Name, 72143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation Loc, 72243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange TypeRange) { 7231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc, 72443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TypeRange); 72543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 72643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 72743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ catch statement. 72843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 72943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 73043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 73143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc, 73243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl, 73343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg Handler) { 73443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned( 7351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl, 73643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.takeAs<Stmt>())); 73743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 73943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// \brief Build a new C++ try statement. 74043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// 74143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// By default, performs semantic analysis to build the new statement. 74243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /// Subclasses may override this routine to provide different behavior. 74343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc, 74443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor StmtArg TryBlock, 74543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor MultiStmtArg Handlers) { 74643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers)); 74743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 7481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDeclRefExpr(NamedDecl *ND, SourceLocation Loc) { 754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildDeclarationNameExpr(Loc, ND, 755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false, 756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*SS=*/0, 757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 7591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 7611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 769a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// \brief Build a new pseudo-destructor expression. 7701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 771a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// By default, performs semantic analysis to build the new expression. 772a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor /// Subclasses may override this routine to provide different behavior. 773a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base, 774a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation OperatorLoc, 775a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor bool isArrow, 776a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceLocation DestroyedTypeLoc, 777a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType, 778a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier, 779a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SourceRange QualifierRange) { 780a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXScopeSpec SS; 781a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Qualifier) { 782a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setRange(QualifierRange); 783a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SS.setScopeRep(Qualifier); 784a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 785a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor 7861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 787a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXDestructorName( 788a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor SemaRef.Context.getCanonicalType(DestroyedType)); 7891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 791a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OperatorLoc, 792a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor isArrow? tok::arrow : tok::period, 793a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedTypeLoc, 794a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Name, 795a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Sema::DeclPtrTy::make((Decl *)0), 796a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor &SS); 7971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 8001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc, 805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr)); 807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 8101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc, 814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R); 816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 8181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new sizeof or alignof expression with an expression 819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 8201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 8251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OpLoc, isSizeOf, R); 828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 8301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.release(); 832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 8361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 8391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS, 842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 8441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LBracketLoc, move(RHS), 845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 8491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *CommaLocs, 855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), CommaLocs, RParenLoc); 858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 8611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 8651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool isArrow, 86683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier, 86783f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceRange QualifierRange, 86883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SourceLocation MemberLoc, 869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *Member) { 870d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson if (!Member->getDeclName()) { 871d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson // We have a reference to an unnamed field. 872d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson assert(!Qualifier && "Can't have an unnamed field with a qualifier!"); 8731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MemberExpr *ME = 875d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow, 876d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson Member, MemberLoc, 877d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson cast<FieldDecl>(Member)->getType()); 878d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson return getSema().Owned(ME); 879d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson } 8801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 88183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor CXXScopeSpec SS; 88283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (Qualifier) { 88383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setRange(QualifierRange); 88483f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor SS.setScopeRep(Qualifier); 88583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 88683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor 887017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isArrow? tok::arrow : tok::period, 889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MemberLoc, 890017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Member->getDeclName(), 89183f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 89283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor &SS); 893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 8941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 8961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc, 901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, ExprArg RHS) { 902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 9031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(), 904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)RHS.get()); 905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 9071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.release(); 909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.release(); 910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 9141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildConditionalOperator(ExprArg Cond, 918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation QuestionLoc, 919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, 920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ColonLoc, 921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS) { 9221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new implicit cast expression. 9271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new implicit cast without any semantic analysis. 929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind, 931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, bool isLvalue) { 932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ImplicitCastExpr *ICE 9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (getSema().Context) ImplicitCastExpr(T, Kind, 934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)SubExpr.release(), 935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isLvalue); 936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned(ICE); 937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 9401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc, 944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy, 945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCastExpr(/*Scope=*/0, 948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy.getAsOpaquePtr(), 950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, 951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 9551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(), 963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, move(Init)); 964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 9671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 9701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::period, AccessorLoc, 976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Accessor, 977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); 978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 9811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBraceLoc) { 987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 9891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 10041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 10101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 10191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 10241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 10291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs)); 1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 10391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 10401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// By default, performs semantic analysis, using the name of the label 1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 10501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// 1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 1073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 10831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 10891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// operator call into a use of a builtin operator, performing 1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new C++ "named" cast expression, such as static_cast or 1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 11021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 11141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T, 11151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 11191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T, 11201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 11221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 11241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T, 11251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 11261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 11281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 11301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T, 11311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RAngleLoc, LParenLoc, 1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 11331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 11411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast, 11541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 11701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast, 12021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 121588650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner void *Sub = SubExpr.takeAs<Expr>(); 1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 121988650c371187e5a1eed0f05abc4019f93938ff79Chris Lattner Sema::MultiExprArg(getSema(), &Sub, 1), 12201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /*CommaLocs=*/0, 1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 12321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 12441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 12491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 12521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 12531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 12571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// semantic analysis. Subclasses may override this routine to provide 1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 12591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ThisType) { 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType)); 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) { 1279f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param)); 1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 12861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 12901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 12911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump T.getAsOpaquePtr(), LParenLoc, 12921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump MultiExprArg(getSema(), 0, 0), 1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 12951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ conditional declaration expression. 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc, 1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqLoc, 1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor VarDecl *Var) { 1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc, 1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EqLoc, 1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var)); 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 13171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool ParenTypeId, 1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 13251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().BuildCXXNew(StartLoc, UseGlobal, 1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 13501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 13601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new qualified declaration reference expression. 1365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildQualifiedDeclRefExpr(NestedNameSpecifier *NNS, 1369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *ND, 1371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsAddressOfOperand) { 1373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 13761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Location, 1378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ND->getDeclName(), 1379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*Trailing lparen=*/false, 1380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &SS, 1381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IsAddressOfOperand); 1382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 13841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /// \brief Build a new (previously unresolved) declaration reference 1385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS, 1390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsAddressOfOperand) { 1394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 13971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Location, 1399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 1400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*Trailing lparen=*/false, 1401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &SS, 1402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IsAddressOfOperand); 1403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTemplateIdExpr(TemplateName Template, 1410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TemplateLoc, 1411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgument *TemplateArgs, 1413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumTemplateArgs, 1414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc) { 1415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildTemplateIdExpr(Template, TemplateLoc, 1416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, 1417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgs, NumTemplateArgs, 1418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc); 1419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 1426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 1429ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/ 1430ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson SourceLocation(), 1431ec8e5ea799412a9d2aac4814c9c62cc32b3faad5Anders Carlsson T, Constructor, IsElidable, 1432f47511ab0575b8c4752e33cdc4b82a84dcc4d263Anders Carlsson move(Args)); 1433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 14711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 14760dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 1477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1479a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier, 1480a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange QualifierRange, 1481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1482c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor SourceLocation MemberLoc, 1483c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 14840dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult Base = move(BaseE); 1485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 1486a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor 1487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1488a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setRange(QualifierRange); 1489a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SS.setScopeRep(Qualifier); 14901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 14913b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, 1492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Base), OperatorLoc, OpKind, 1493017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor MemberLoc, 1494017dde547d359a66ec38b80a098a5ddbef087048Douglas Gregor Name, 1495a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0), 1496c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor &SS, 1497c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 15003b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// \brief Build a new member reference expression with explicit template 15013b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// arguments. 15023b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// 15033b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// By default, performs semantic analysis to build the new expression. 15043b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /// Subclasses may override this routine to provide different behavior. 15053b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 15063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor bool IsArrow, 15073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation OperatorLoc, 15083b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NestedNameSpecifier *Qualifier, 15093b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceRange QualifierRange, 15103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName Template, 15113b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation TemplateNameLoc, 15123b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NamedDecl *FirstQualifierInScope, 15133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation LAngleLoc, 15143b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const TemplateArgument *TemplateArgs, 15153b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor unsigned NumTemplateArgs, 15163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SourceLocation RAngleLoc) { 15173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OwningExprResult Base = move(BaseE); 15183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 15191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor CXXScopeSpec SS; 15213b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setRange(QualifierRange); 15223b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS.setScopeRep(Qualifier); 15231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: We're going to end up looking up the template based on its name, 15253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr. 15263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor DeclarationName Name; 15273b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl()) 15283b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = ActualTemplate->getDeclName(); 15291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else if (OverloadedFunctionDecl *Ovl 15303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = Template.getAsOverloadedFunctionDecl()) 15313b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = Ovl->getDeclName(); 15323b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor else 15333b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name = Template.getAsDependentTemplateName()->getName(); 15341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base), 15363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor OperatorLoc, OpKind, 15373b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateNameLoc, Name, true, 15383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor LAngleLoc, TemplateArgs, 15393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor NumTemplateArgs, RAngleLoc, 15403b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Sema::DeclPtrTy(), &SS); 15413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 15421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 15521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 1553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C protocol expression. 1555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AtLoc, 1560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ProtoLoc, 1561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol->getIdentifier(), 1565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AtLoc, 1566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ProtoLoc, 1567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 15681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump RParenLoc)); 1569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 15701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 15791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IdentifierInfo &Name 1580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 15841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 15871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Expr *Callee 1588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 1589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BuiltinLoc, false, false); 1590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 15911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 15921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Build the CallExpr 1593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 16001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 16051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 16071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 1608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 161143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 161243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) { 161343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!S) 161443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S); 16151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 161643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor switch (S->getStmtClass()) { 161743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::NoStmtClass: break; 16181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 161943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform individual statement nodes 162043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) \ 162143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S)); 162243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) 162343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 16241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 162543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform expressions by calling TransformExpr. 162643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define STMT(Node, Parent) 162743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#define EXPR(Node, Parent) case Stmt::Node##Class: 162843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor#include "clang/AST/StmtNodes.def" 162943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor { 163043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S)); 163143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (E.isInvalid()) 163243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 16331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 163443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().Owned(E.takeAs<Stmt>()); 163543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 16361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 163843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 163943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 16401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1642670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E, 1644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isAddressOfOperand) { 1645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 1651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 1653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 16541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 16551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1657657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1658657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1659657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1660dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1661dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1662a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor SourceRange Range, 1663c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 1664c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 16650979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor if (!NNS) 16660979c805475d1ba49b5d6ef93c4d2ce6d2eab6edDouglas Gregor return 0; 16671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 166843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the prefix of this nested name specifier. 1669dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 1670dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 16711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range, 1672c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1673c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 1674dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 1675dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 16761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Clear out the object type and the first qualifier in scope; they only 1678c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor // apply to the first element in the nested-name-specifier. 1679a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType = QualType(); 1680c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope = 0; 1681dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 16821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1683dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 1684dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 16851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert((Prefix || !ObjectType.isNull()) && 1686a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor "Identifier nested-name-specifier with no prefix or object type"); 1687a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() && 1688a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType.isNull()) 1689dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 16901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 16911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1692a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor *NNS->getAsIdentifier(), 1693c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 1694c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 16951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1696dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 16971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamespaceDecl *NS 1698dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 1699dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor getDerived().TransformDecl(NNS->getAsNamespace())); 17001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 1701dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1702dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 1703dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1705dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1708dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 1709dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 1710dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 1711dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1713dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 1714dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 1715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0)); 1716d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 1717d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 17181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1719dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 1722dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 17231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 17251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1726dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T); 1727dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1728dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 17291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1730dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 17311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 0; 1732dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 1733dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1734dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 17351eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpDeclarationName 173681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas GregorTreeTransform<Derived>::TransformDeclarationName(DeclarationName Name, 173781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SourceLocation Loc) { 173881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 173981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 174081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 174181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor switch (Name.getNameKind()) { 174281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::Identifier: 174381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCZeroArgSelector: 174481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCOneArgSelector: 174581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::ObjCMultiArgSelector: 174681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXOperatorName: 174781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXUsingDirective: 174881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return Name; 17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 175081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConstructorName: 175181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXDestructorName: 175281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor case DeclarationName::CXXConversionFunctionName: { 175381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor TemporaryBase Rebase(*this, Loc, Name); 175481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor QualType T = getDerived().TransformType(Name.getCXXNameType()); 175581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (T.isNull()) 175681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 17571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 175881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.Context.DeclarationNames.getCXXSpecialName( 17591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Name.getNameKind(), 176081499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor SemaRef.Context.getCanonicalType(T)); 176181499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor } 17621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 17631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 176481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return DeclarationName(); 176581499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor} 176681499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor 176781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregortemplate<typename Derived> 17681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 17693b6afbb99a1c44b4076f8e15fb7311405941b306Douglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name, 17703b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 1771d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 17721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1773d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1774d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1775d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1776d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 17771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1778d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 17791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1780d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1781d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1782d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 17831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1784d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1785d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1786d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1787d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 17881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1789d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1790d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 1791d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 17921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1793d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl(); 1794d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 17951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OverloadedFunctionDecl *TransOvl 1796d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1797d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1798d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 17991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1800d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1801d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1802d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1803d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1805d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1806d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl); 1807d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1809d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 18101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NestedNameSpecifier *NNS 1811d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1812d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 18133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!NNS && DTN->getQualifier()) 1814d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1816d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1817d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == DTN->getQualifier()) 1818d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 18203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType); 1821d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1823d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 18241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateDecl *TransTemplate 1825d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1826d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1827d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1829d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1830d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1831d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1833d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 1834d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 18351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1836d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl(); 1837d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 18381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OverloadedFunctionDecl *TransOvl 1839d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1840d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1841d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 18421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1843d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1844d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1845d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 18461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransOvl); 1848d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 1849d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1850d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 18511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateArgument 1852670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) { 1853670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 1854670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 1855670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 1856670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return Arg; 18571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1858670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 1859670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor QualType T = getDerived().TransformType(Arg.getAsType()); 1860670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (T.isNull()) 1861670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1862670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(Arg.getLocation(), T); 1863670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 18641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1865670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 1866670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Decl *D = getDerived().TransformDecl(Arg.getAsDecl()); 1867670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (!D) 1868670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1869670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(Arg.getLocation(), D); 1870670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 18711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1872670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 1873670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 18741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(getSema(), 1875670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 18761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1877670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr()); 1878670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (E.isInvalid()) 1879670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1880670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(E.takeAs<Expr>()); 1881670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 18821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1883670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 1884670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 1885670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 18861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 1887670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 1888670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 1889670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument TA = getDerived().TransformTemplateArgument(*A); 1890670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (TA.isNull()) 1891670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TA; 18921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1893670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.push_back(TA); 1894670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1895670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 18961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 1897670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 1898670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return Result; 1899670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1900670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 19011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1902670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 1903670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1904670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 1905670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1906577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 1907577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 1908577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 1909577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1910577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1911577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) { 1912577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 1913577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 19141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19150953e767ff7817f97b3ab20896b229891eeff45bJohn McCall QualifierCollector Qs; 19160953e767ff7817f97b3ab20896b229891eeff45bJohn McCall const Type *Ty = Qs.strip(T); 19170953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 1918577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Result; 19190953e767ff7817f97b3ab20896b229891eeff45bJohn McCall switch (Ty->getTypeClass()) { 19201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#define ABSTRACT_TYPE(CLASS, PARENT) 1921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT) \ 1922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor case Type::CLASS: \ 1923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Result = getDerived().Transform##CLASS##Type( \ 19240953e767ff7817f97b3ab20896b229891eeff45bJohn McCall static_cast<const CLASS##Type*>(Ty)); \ 1925577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 19261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include "clang/AST/TypeNodes.def" 1927577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 19281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1929577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Result.isNull() || T == Result) 1930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return Result; 19311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return getDerived().AddTypeQualifiers(Result, Qs); 1933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 19341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 19361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 19370953e767ff7817f97b3ab20896b229891eeff45bJohn McCallTreeTransform<Derived>::AddTypeQualifiers(QualType T, Qualifiers Quals) { 19380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (!Quals.empty() && !T->isFunctionType() && !T->isReferenceType()) 19390953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.Context.getQualifiedType(T, Quals); 19401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 1942577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 19431bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 19441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 19451eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformBuiltinType(const BuiltinType *T) { 1946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // Nothing to do 19471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 1948577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 19491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 1951577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFixedWidthIntType( 19521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const FixedWidthIntType *T) { 1953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 19541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 1955577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 19561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1957577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 19581eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformComplexType(const ComplexType *T) { 1959577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 19601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 1961577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 19621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 1964577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformPointerType(const PointerType *T) { 1965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 1966577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 1967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 19681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 1971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1972577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1973577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildPointerType(PointeeType); 1974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 19751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 19761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 19771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 19781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockPointerType(const BlockPointerType *T) { 1979577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 1980577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 1981577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 19821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1984577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 1985577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 19861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildBlockPointerType(PointeeType); 1988577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 19901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 19911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 1992577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformLValueReferenceType( 19931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const LValueReferenceType *T) { 1994577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 1995577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 1996577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 19971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1998577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1999577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 2000577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 20011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2002577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildLValueReferenceType(PointeeType); 2003577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2004577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 20051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 20061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 2007577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformRValueReferenceType( 20081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const RValueReferenceType *T) { 2009577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 2010577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2011577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 20121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2014577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 2015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 20161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2017577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildRValueReferenceType(PointeeType); 2018577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2020577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 20211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 20221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformMemberPointerType(const MemberPointerType *T) { 2023577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 2024577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 2025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 20261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ClassType = getDerived().TransformType(QualType(T->getClass(), 0)); 2028577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 2029577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 20301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType() && 2033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ClassType == QualType(T->getClass(), 0)) 2034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildMemberPointerType(PointeeType, ClassType); 2037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 20391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 20401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 20411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformConstantArrayType(const ConstantArrayType *T) { 2042577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2043577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 20451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2047577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 2048577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 20491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildConstantArrayType(ElementType, 2051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 2052577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSize(), 20530953e767ff7817f97b3ab20896b229891eeff45bJohn McCall T->getIndexTypeCVRQualifiers()); 2054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 20581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const IncompleteArrayType *T) { 2059577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2060577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 20621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 2065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2067577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildIncompleteArrayType(ElementType, 2068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 20690953e767ff7817f97b3ab20896b229891eeff45bJohn McCall T->getIndexTypeCVRQualifiers()); 2070577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2072577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2073577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformVariableArrayType( 20741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const VariableArrayType *T) { 2075577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 20781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2079670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2080670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2081670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2082577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2083577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2084577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 20851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2086577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2087577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType() && 2088577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.get() == T->getSizeExpr()) { 2089577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.take(); 2090577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2091577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 20921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 20931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildVariableArrayType(ElementType, 2094577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 2095577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 20960953e767ff7817f97b3ab20896b229891eeff45bJohn McCall T->getIndexTypeCVRQualifiers(), 2097577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getBracketsRange()); 2098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 20991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedArrayType( 21021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const DependentSizedArrayType *T) { 2103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2107670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 2108670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 21091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType() && 2116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.get() == T->getSizeExpr()) { 2117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.take(); 2118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 21201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDependentSizedArrayType(ElementType, 2122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 2123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 21240953e767ff7817f97b3ab20896b229891eeff45bJohn McCall T->getIndexTypeCVRQualifiers(), 2125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getBracketsRange()); 2126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 21271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 21301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const DependentSizedExtVectorType *T) { 2131577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2132577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2133577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2135670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 2136670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2137670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 2138577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 2139577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 2140577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2142577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2143577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType() && 2144577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.get() == T->getSizeExpr()) { 2145577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.take(); 2146577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2147577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 21481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDependentSizedExtVectorType(ElementType, 2150577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 2151577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 2152577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 21531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformVectorType(const VectorType *T) { 2156577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2157577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2158577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2159577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 2162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 21631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildVectorType(ElementType, T->getNumElements()); 2165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 21661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 21671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 21681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 21691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExtVectorType(const ExtVectorType *T) { 2170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 2171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 2172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2175577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 2176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 21771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildExtVectorType(ElementType, T->getNumElements(), 2179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /*FIXME*/SourceLocation()); 2180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 21821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionProtoType( 21841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const FunctionProtoType *T) { 2185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ResultType = getDerived().TransformType(T->getResultType()); 2186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ResultType.isNull()) 2187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<QualType, 4> ParamTypes; 2190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(), 21911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParamEnd = T->arg_type_end(); 2192577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Param != ParamEnd; ++Param) { 2193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType P = getDerived().TransformType(*Param); 2194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (P.isNull()) 2195577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 21961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2197577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ParamTypes.push_back(P); 2198577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 21991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2200577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2201577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ResultType == T->getResultType() && 2202577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) 2203577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 22041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildFunctionProtoType(ResultType, ParamTypes.data(), 2206577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ParamTypes.size(), T->isVariadic(), 2207577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getTypeQuals()); 2208577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2210577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2211577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 22121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const FunctionNoProtoType *T) { 2213577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 22141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 2215577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2217577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 22181eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformTypedefType(const TypedefType *T) { 2219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 2220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl())); 2221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 2222577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2224577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Typedef == T->getDecl()) 2226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 22271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2228577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypedefType(Typedef); 2229577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypeOfExprType( 22331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const TypeOfExprType *T) { 2234670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 2235670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 22361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2237577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2238577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2239577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2242577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.get() == T->getUnderlyingExpr()) { 2243577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.take(); 2244577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2245577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 22461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypeOfExprType(move(E)); 2248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22511eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformTypeOfType(const TypeOfType *T) { 2252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 2253577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Underlying.isNull()) 2254577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2256577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2257577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Underlying == T->getUnderlyingType()) 2258577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 22591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2260577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypeOfType(Underlying); 2261577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformDecltypeType(const DecltypeType *T) { 2265670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 2266670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 22671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 2269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 2270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.get() == T->getUnderlyingExpr()) { 2274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.take(); 2275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 22771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildDecltypeType(move(E)); 2279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 22821eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformRecordType(const RecordType *T) { 2283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 2284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl())); 2285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 2286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 22871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Record == T->getDecl()) 2290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 22911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildRecordType(Record); 2293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 22941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 22951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 22961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::TransformEnumType(const EnumType *T) { 2297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 2298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl())); 2299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 2300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Enum == T->getDecl()) 2304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 23051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildEnumType(Enum); 2307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23087da2431c23ef1ee8acb114e39692246e1801afc2John McCall 23097da2431c23ef1ee8acb114e39692246e1801afc2John McCalltemplate <typename Derived> 23107da2431c23ef1ee8acb114e39692246e1801afc2John McCallQualType TreeTransform<Derived>::TransformElaboratedType( 23117da2431c23ef1ee8acb114e39692246e1801afc2John McCall const ElaboratedType *T) { 23127da2431c23ef1ee8acb114e39692246e1801afc2John McCall QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 23137da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (Underlying.isNull()) 23147da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(); 23151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23167da2431c23ef1ee8acb114e39692246e1801afc2John McCall if (!getDerived().AlwaysRebuild() && 23177da2431c23ef1ee8acb114e39692246e1801afc2John McCall Underlying == T->getUnderlyingType()) 23187da2431c23ef1ee8acb114e39692246e1801afc2John McCall return QualType(T, 0); 23191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23207da2431c23ef1ee8acb114e39692246e1801afc2John McCall return getDerived().RebuildElaboratedType(Underlying, T->getTagKind()); 23217da2431c23ef1ee8acb114e39692246e1801afc2John McCall} 23221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 23261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const TemplateTypeParmType *T) { 2327577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // Nothing to do 23281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 2329577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2330577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 23311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 233249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallQualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType( 233349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall const SubstTemplateTypeParmType *T) { 233449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall // Nothing to do 233549a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall return QualType(T, 0); 233649a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall} 233749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 233849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCalltemplate<typename Derived> 2339577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 23401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const TemplateSpecializationType *T) { 23411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 2342577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformTemplateName(T->getTemplateName()); 2343577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 2344577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2346577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs; 2347577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.reserve(T->getNumArgs()); 2348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end(); 2349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Arg != ArgEnd; ++Arg) { 2350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg); 2351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewArg.isNull()) 2352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2354577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.push_back(NewArg); 2355577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 23561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: early abort if all of the template arguments and such are the 2358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // same. 23591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: We're missing the locations of the template name, '<', and '>'. 2361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTemplateSpecializationType(Template, 2362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.data(), 2363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.size()); 2364577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2367577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformQualifiedNameType( 2368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const QualifiedNameType *T) { 2369577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2370577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2371577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange()); 2372577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2373577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2375577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 2376577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 2377577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2379577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2381577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Named == T->getNamedType()) 2382577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2383577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2384577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildQualifiedNameType(NNS, Named); 2385577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 23861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 23871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypenameType(const TypenameType *T) { 2389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2390577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 23914a959d8788179d654df6b213b08d2b064989211dDouglas Gregor SourceRange(/*FIXME:*/getDerived().getBaseLocation())); 2392577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2393577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 23941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2395577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 23961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType NewTemplateId 2397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 2398577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 2399577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 24001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2401577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2402577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 2404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 24051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypenameType(NNS, NewTemplateId); 2407577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2408577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2409577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypenameType(NNS, T->getIdentifier()); 2410577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2412577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2413577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCInterfaceType( 24141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const ObjCInterfaceType *T) { 2415577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 24161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 2417577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 24181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 24191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 2420577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCObjectPointerType( 24211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const ObjCObjectPointerType *T) { 2422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 24231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return QualType(T, 0); 2424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 242624fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidistemplate<typename Derived> 242724fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios KyrtzidisQualType TreeTransform<Derived>::TransformObjCProtocolListType( 242824fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis const ObjCProtocolListType *T) { 242924fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis assert(false && "Should not see ObjCProtocolList types"); 243024fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis return QualType(T, 0); 243124fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis} 243224fab41057e4b67ed69a6b4027d5ae0f2f6934dcArgyrios Kyrtzidis 2433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 243443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor// Statement transformation 243543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 243643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 243743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 24381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformNullStmt(NullStmt *S) { 24391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 244043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 244143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 244243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 244343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 244443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) { 244543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().TransformCompoundStmt(S, false); 244643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 244743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 244843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 244943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 24501eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S, 245143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool IsStmtExpr) { 245243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool SubStmtChanged = false; 245343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema()); 245443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end(); 245543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor B != BEnd; ++B) { 245643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Result = getDerived().TransformStmt(*B); 245743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 245843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getSema().StmtError(); 24591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 246043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SubStmtChanged = SubStmtChanged || Result.get() != *B; 246143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Statements.push_back(Result.takeAs<Stmt>()); 246243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 24631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 246443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 246543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !SubStmtChanged) 24661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 246743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 246843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCompoundStmt(S->getLBracLoc(), 246943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move_arg(Statements), 247043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRBracLoc(), 247143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor IsStmtExpr); 247243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 24731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 247443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 247543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 24761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) { 247743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // The case value expressions are not potentially evaluated. 247843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 24791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 248043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the left-hand case value. 248143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult LHS = getDerived().TransformExpr(S->getLHS()); 248243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (LHS.isInvalid()) 248343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 24841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 248543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the right-hand case value (for the GNU case-range extension). 248643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult RHS = getDerived().TransformExpr(S->getRHS()); 248743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (RHS.isInvalid()) 248843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 24891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 249043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Build the case statement. 249143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Case statements are always rebuilt so that they will attached to their 249243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transformed switch statement. 249343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(), 249443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(LHS), 249543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getEllipsisLoc(), 249643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(RHS), 249743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getColonLoc()); 249843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Case.isInvalid()) 249943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 25001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 250143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the case 250243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 250343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 250443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 25051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 250643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Attach the body to the case statement 250743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt)); 250843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 250943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 251043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 251143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 25121eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) { 251343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the statement following the default case 251443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 251543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 251643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 25171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 251843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Default statements are always rebuilt 251943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(), 252043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 252143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 25221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 252343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 252443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 25251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) { 252643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt()); 252743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (SubStmt.isInvalid()) 252843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 25291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 253043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Pass the real colon location in. 253143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc()); 253243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc, 253343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(SubStmt)); 253443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 25351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 253643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 25371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 25381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIfStmt(IfStmt *S) { 253943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 254043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 254143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 254243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 25431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 254443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 25451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 254643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "then" branch. 254743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Then = getDerived().TransformStmt(S->getThen()); 254843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Then.isInvalid()) 254943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 25501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 255143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the "else" branch. 255243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Else = getDerived().TransformStmt(S->getElse()); 255343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Else.isInvalid()) 255443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 25551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 255643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 255743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 255843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Then.get() == S->getThen() && 255943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Else.get() == S->getElse()) 25601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 25611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 256243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then), 25631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump S->getElseLoc(), move(Else)); 256443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 256543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 256643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 256743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 25681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) { 256943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition. 257043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 257143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 257243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 25731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 257443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Rebuild the switch statement. 257543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond)); 257643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Switch.isInvalid()) 257743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 25781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 257943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body of the switch statement. 258043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 258143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 258243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 25831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 258443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Complete the switch statement. 258543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch), 258643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Body)); 258743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 25881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 258943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 259043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 25911eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) { 259243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 259343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 259443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 259543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 25961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 259743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::FullExprArg FullCond(getSema().FullExpr(Cond)); 25981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 259943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 260043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 260143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 260243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 26031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 260443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 260543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor FullCond->get() == S->getCond() && 260643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 26071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 26081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 260943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body)); 261043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 26111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 261243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 261343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 261443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformDoStmt(DoStmt *S) { 261543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 261643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 261743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 261843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 26191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 262043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 262143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 262243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 262343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 26241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 262543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 262643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 262743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 26281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 26291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 263043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(), 263143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME:*/S->getWhileLoc(), move(Cond), 263243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc()); 263343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 26341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 263543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 263643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 26371eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformForStmt(ForStmt *S) { 263843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the initialization statement 263943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Init = getDerived().TransformStmt(S->getInit()); 264043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Init.isInvalid()) 264143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 26421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 264343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the condition 264443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Cond = getDerived().TransformExpr(S->getCond()); 264543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Cond.isInvalid()) 264643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 26471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 264843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the increment 264943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Inc = getDerived().TransformExpr(S->getInc()); 265043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Inc.isInvalid()) 265143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 26521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 265343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the body 265443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Body = getDerived().TransformStmt(S->getBody()); 265543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Body.isInvalid()) 265643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 26571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 265843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 265943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Init.get() == S->getInit() && 266043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Cond.get() == S->getCond() && 266143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Inc.get() == S->getInc() && 266243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Body.get() == S->getBody()) 26631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 26641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 266543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(), 266643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Init), move(Cond), move(Inc), 266743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getRParenLoc(), move(Body)); 266843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 266943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 267043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 26711eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningStmtResult 26721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) { 267343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Goto statements must always be rebuilt, to resolve the label. 26741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(), 267543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getLabel()); 267643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 267743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 267843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 267943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 26801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) { 268143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningExprResult Target = getDerived().TransformExpr(S->getTarget()); 268243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Target.isInvalid()) 268343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 26841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 268543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 268643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Target.get() == S->getTarget()) 26871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 268843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 268943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(), 269043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Target)); 269143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 269243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 269343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 269443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 26951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) { 26961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 269743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 26981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 269943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 270043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 27011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) { 27021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 270343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 27041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 270543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 270643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 27071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) { 270843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue()); 270943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Result.isInvalid()) 271043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 271143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 27121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: We always rebuild the return statement because there is no way 271343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // to tell whether the return type of the function has changed. 271443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result)); 271543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 27161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 271743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 271843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 27191eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) { 272043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool DeclChanged = false; 272143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor llvm::SmallVector<Decl *, 4> Decls; 272243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end(); 272343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor D != DEnd; ++D) { 272443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decl *Transformed = getDerived().TransformDefinition(*D); 272543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Transformed) 272643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 27271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 272843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Transformed != *D) 272943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor DeclChanged = true; 27301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 273143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Decls.push_back(Transformed); 273243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 27331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 273443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && !DeclChanged) 27351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 27361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 27371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(), 273843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor S->getStartLoc(), S->getEndLoc()); 273943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 27401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 274143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 274243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 27431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) { 274443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "SwitchCase is abstract and cannot be transformed"); 27451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 274643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 274743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 274843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 274943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 275043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) { 275143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement! 275243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Inline assembly cannot be transformed"); 27531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 275443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 275543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 275643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 275743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 275843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 27591eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) { 276043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 276143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @try statement"); 27621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 276343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 27641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 276543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 276643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 27671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) { 276843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 276943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @catch statement"); 277043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.Owned(S->Retain()); 277143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 27721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 277343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 277443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 27751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) { 277643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 277743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @finally statement"); 27781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 277943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 27801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 278143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 278243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 27831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) { 278443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 278543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @throw statement"); 27861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 278743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 27881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 278943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 279043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 279143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCAtSynchronizedStmt( 27921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCAtSynchronizedStmt *S) { 279343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 279443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C @synchronized statement"); 27951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 279643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 279743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 279843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 279943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 280043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformObjCForCollectionStmt( 28011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCForCollectionStmt *S) { 280243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // FIXME: Implement this 280343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor assert(false && "Cannot transform an Objective-C for-each statement"); 28041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 280543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 280643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 280743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 280843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 280943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 281043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) { 281143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the exception declaration, if any. 281243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *Var = 0; 281343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (S->getExceptionDecl()) { 281443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor VarDecl *ExceptionDecl = S->getExceptionDecl(); 281543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TemporaryBase Rebase(*this, ExceptionDecl->getLocation(), 281643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclName()); 281743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 281843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor QualType T = getDerived().TransformType(ExceptionDecl->getType()); 281943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (T.isNull()) 282043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 28211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 282243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var = getDerived().RebuildExceptionDecl(ExceptionDecl, 282343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor T, 282443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getDeclaratorInfo(), 282543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getIdentifier(), 282643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ExceptionDecl->getLocation(), 282743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor /*FIXME: Inaccurate*/ 282843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor SourceRange(ExceptionDecl->getLocation())); 282943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!Var || Var->isInvalidDecl()) { 283043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 283143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 283243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 283343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 283443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 28351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 283643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the actual exception handler. 283743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock()); 283843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) { 283943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Var) 284043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var->Destroy(SemaRef.Context); 284143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 284243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 28431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 284443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 284543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !Var && 284643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handler.get() == S->getHandlerBlock()) 28471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 284843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 284943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), 285043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Var, 285143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor move(Handler)); 285243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 28531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 285443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregortemplate<typename Derived> 285543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorSema::OwningStmtResult 285643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas GregorTreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) { 285743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the try block itself. 28581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult TryBlock 285943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCompoundStmt(S->getTryBlock()); 286043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (TryBlock.isInvalid()) 286143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 28621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 286343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // Transform the handlers. 286443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor bool HandlerChanged = false; 286543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef); 286643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) { 28671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult Handler 286843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = getDerived().TransformCXXCatchStmt(S->getHandler(I)); 286943959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (Handler.isInvalid()) 287043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return SemaRef.StmtError(); 28711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 287243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I); 287343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor Handlers.push_back(Handler.takeAs<Stmt>()); 287443959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor } 28751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 287643959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor if (!getDerived().AlwaysRebuild() && 287743959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor TryBlock.get() == S->getTryBlock() && 287843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor !HandlerChanged) 28791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(S->Retain()); 288043959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor 288143959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock), 28821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move_arg(Handlers)); 288343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor} 28841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 288543959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor//===----------------------------------------------------------------------===// 2886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 2887577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 28881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 28891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 28901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 28911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 28921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 28931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 28941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 28951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 28961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 28971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *ND 2898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 2899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 2900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 29011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && ND == E->getDecl()) 29031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 29041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDeclRefExpr(ND, E->getLocation()); 2906577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 29091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 29101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 29111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 2912577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 29131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 29151eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 29161eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 29171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 2918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 29191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 29211eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 29221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 29231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 2924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 29251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 29271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 29281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 29291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 2930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 29311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 29331eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 29341eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 29351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 2936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 29371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 29391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 29401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 2941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 29441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 29461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 29471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 2949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 2950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 29521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 29531eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 29541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 2955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 29581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 29601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 29611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 2963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 2964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 2965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 29661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 29681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 29691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 2970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 2971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getArgumentType()); 2972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 2973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 29741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && T == E->getArgumentType()) 2976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 29771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 29781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(), 29791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->isSizeOf(), 2980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 2981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 29821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 29841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 2985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 2986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 2987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 2988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 29891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 2991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 29931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 2995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 29971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 2999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 3000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 3001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 30021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 30041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 3006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 30091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 30131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 30191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 3021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 3022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 3023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 3024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 30251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 30271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 3029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 3030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 3035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 3036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 3038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 3039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 3040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 30421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 3044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 3045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 30461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 3048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 3049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 30501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 3054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 30551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 30571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLParenLoc 3058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 3059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 3060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 3062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 30641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 30661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 30671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 3068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 30711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 307283f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor NestedNameSpecifier *Qualifier = 0; 307383f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor if (E->hasQualifier()) { 30741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Qualifier 307583f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 307683f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange()); 3077c4bf26fbdff42967d660f505a83f75a4df2cc752Douglas Gregor if (Qualifier == 0) 307883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor return SemaRef.ExprError(); 307983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor } 30801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 30811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *Member 3082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl())); 3083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 3084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 30851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 308883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier == E->getQualifier() && 3089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Member == E->getMemberDecl()) 30901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 3093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 3094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 3095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 3097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 309883f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor Qualifier, 309983f6faf37d9bf58986bedc9bc0ea897a56b4dbadDouglas Gregor E->getQualifierRange(), 3100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 31011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Member); 3102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 31031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 31051eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 31061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCastExpr(CastExpr *E) { 3107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 31081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 31101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 31131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 3114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 31171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 31211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 31251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 31261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 3128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 3129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 31311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 3134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CompoundAssignOperator *E) { 3135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformBinaryOperator(E); 3136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 31371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 31391eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 31401eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 3141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 31441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 31481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 31521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 3157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 31581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildConditionalOperator(move(Cond), 316047e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getQuestionLoc(), 31611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(LHS), 316247e1f7c68bf375cac470fdb2b599ddbb395aeb52Douglas Gregor E->getColonLoc(), 3163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 3164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 31651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 31661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 31671eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 31681eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 3169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 31721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 31761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 31801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 31811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(), 31831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(SubExpr), 3184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isLvalueCast()); 3185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 31861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 31881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 31891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) { 3190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 31911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 31931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 31961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 3197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 32001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 3201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 32031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getTypeAsWritten()); 3205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 32081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 32121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 3215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 32161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 32171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T, 3219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 3220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 3221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 32221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 32241eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 3226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 3227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 32291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeTypeLoc 3230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 3231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName()); 32321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 32371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 3239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 32411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 32451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T, 3248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 3249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 3250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 32511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 32541eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 3255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 32581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 32611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 32621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 32641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeOperatorLoc 3265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 3266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 3267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 3268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 3269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 32701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 32721eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 32731eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 3274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 32751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 3278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 3279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 32811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 3283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 32851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 32871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 32881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 3290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBraceLoc()); 3291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 32921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 32951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 3296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 32971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 329843959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the initializer value 3299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 3300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 33021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 330343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the designators. 3304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 3305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 3306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 3307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 3308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 3309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 3310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 3311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 3312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 3313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 33151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 3317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 3318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 3319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 33201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArray(Index.get(), 3322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 33231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 3325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 3326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 3327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 33281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 33301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Start 3331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 3332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 3333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 33341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 3336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 3337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 33381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 33391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Desig.AddDesignator(Designator::getArrayRange(Start.get(), 3340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 3341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 3342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 33431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 3345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 33461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 3348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 3349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 33501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 3353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 3354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 33551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 3357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 3358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 3359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 33601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 33621eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 33641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ImplicitValueInitExpr *E) { 3365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 33681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 33711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 33721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 3374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 33751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 33771eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 3379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 3380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 33811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 3385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 3386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 33891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 33931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 3397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 33981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 3400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 3401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 34041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 3406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 3407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 3408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 3409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 3410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 3411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 3414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 3415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 34161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 3418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 3419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 3423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 3424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 3425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 3426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 3427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 34291eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 3430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 3431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 3432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 3435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 34361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningStmtResult SubStmt 3437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 3438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 3439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 3443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 34441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildStmtExpr(E->getLParenLoc(), 3446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 3447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 34521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) { 3453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 3454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 3456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 34571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 3459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 3460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 3463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 3464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 3469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 34701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 3473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 3474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 34751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 34781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 3479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 3480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 3481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 3484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 3488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 34901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 3493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 3494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 34951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 34961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 3498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 3499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35031eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 35041eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 35051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 3511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 3512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 3513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult First = getDerived().TransformExpr(E->getArg(0)); 3516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 3517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 3520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 3521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 3522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 3523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 3528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 35291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 35301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 3533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 35341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump move(Callee), 3535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 3536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 3537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 35411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 3542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCallExpr(E); 3543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35461eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 3547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 3548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 3549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 35511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation TypeStartLoc 3552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 3553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 35541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 3556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 3557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 35591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 35631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 3566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 35671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 35681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 35701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation FakeLAngleLoc 3571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 3572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 3573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 3574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 3575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 3576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 35771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getStmtClass(), 3578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 3579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 3580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 3581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 3582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 3583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 3584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 35871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 35881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 3589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 3590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 35941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 3595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 3596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 35971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 36011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXReinterpretCastExpr *E) { 3602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 3603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 36071eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 3608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 3609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 36141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXFunctionalCastExpr *E) { 3615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 3616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 3617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 36181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 3620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 3621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 3630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 36311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 36321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 3634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 3635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 3636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 3637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 3638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 3639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 36441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 3645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 3646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 36471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeOperand()); 3649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeOperand()) 3654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 36551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 3657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 3659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 3660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 36611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 3663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 3664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 36651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump EnterExpressionEvaluationContext Unevaluated(SemaRef, 3666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 36671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 3669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 36711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 36741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 36751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 3677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 3679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 3680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 36831eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 36841eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 36851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 36911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXNullPtrLiteralExpr *E) { 36921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 36941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 3698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 36991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 3706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 37071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T); 3709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 37131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 3714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 37201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 3723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 37271eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 37281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ParmVarDecl *Param 3729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam())); 3730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 3731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (getDerived().AlwaysRebuild() && 3734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 3735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 37361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(Param); 3738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 3743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 3744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 37511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 37521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 3754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 3755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 3756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) { 37621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump VarDecl *Var 376343959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl())); 3764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Var) 3765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 37681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Var == E->getVarDecl()) 3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 37701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(), 3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getStartLoc(), 3773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var); 3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 37751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 37781eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 3779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 37971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 3800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 380243959a93c6aba8b03b09116fe077f4ce8e80005eDouglas Gregor // transform the constructor arguments (if any). 3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 3804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 38121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 38171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 3828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 38311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump E->getLocEnd()); 3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 38361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 38401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 38421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Operand.get() == E->getArgument()) 38431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 38441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 3847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 3848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 3849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3853a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorTreeTransform<Derived>::TransformCXXPseudoDestructorExpr( 3854a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor CXXPseudoDestructorExpr *E) { 3855a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3856a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (Base.isInvalid()) 3857a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 38581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3859a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor NestedNameSpecifier *Qualifier 3860a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3861a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 3862a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (E->getQualifier() && !Qualifier) 3863a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 38641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3865a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor QualType DestroyedType; 3866a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor { 3867a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName()); 3868a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType = getDerived().TransformType(E->getDestroyedType()); 3869a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (DestroyedType.isNull()) 3870a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.ExprError(); 3871a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor } 38721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3873a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor if (!getDerived().AlwaysRebuild() && 3874a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Base.get() == E->getBase() && 3875a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier == E->getQualifier() && 3876a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType == E->getDestroyedType()) 3877a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return SemaRef.Owned(E->Retain()); 38781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3879a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor return getDerived().RebuildCXXPseudoDestructorExpr(move(Base), 3880a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getOperatorLoc(), 3881a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->isArrow(), 3882a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getDestroyedTypeLoc(), 3883a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor DestroyedType, 3884a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor Qualifier, 3885a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor E->getQualifierRange()); 3886a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregor} 38871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3888a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas Gregortemplate<typename Derived> 3889a71d819bb8f50c28938db0f2867d3fb6e2ce5910Douglas GregorSema::OwningExprResult 3890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedFunctionNameExpr( 38911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnresolvedFunctionNameExpr *E) { 3892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // There is no transformation we can apply to an unresolved function name. 38931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 3894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 38951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 38981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 3899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 39001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 3902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 3907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 39081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 3910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 3911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 39121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 3914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 3915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 3916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 3917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 3918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) { 3923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 3924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange()); 3926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 3927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump NamedDecl *ND 3930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 3931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 3932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 3935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NNS == E->getQualifier() && 3936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ND == E->getDecl()) 39371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildQualifiedDeclRefExpr(NNS, 3940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange(), 3941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ND, 3942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocation(), 3943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 3944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 39451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedDeclRefExpr( 39491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnresolvedDeclRefExpr *E) { 3950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 3951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange()); 3953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 3954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 395781499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation()); 395881499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 395981499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 39601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!getDerived().AlwaysRebuild() && 3962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NNS == E->getQualifier() && 3963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name == E->getDeclName()) 39641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 39651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildUnresolvedDeclRefExpr(NNS, 3967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange(), 3968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 3969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocation(), 3970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 3971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 39751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) { 39761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 3977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformTemplateName(E->getTemplateName()); 3978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Template.isNull()) 3979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 39801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransArgs; 3982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 39831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateArgument TransArg 3984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]); 3985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isNull()) 3986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.push_back(TransArg); 3989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Would like to avoid rebuilding if nothing changed, but we can't 3992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // compare template arguments (yet). 39931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 39941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // FIXME: It's possible that we'll find out now that the template name 3995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // actually refers to a type, in which case the caller is actually dealing 3996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // with a functional cast. Give a reasonable error message! 3997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTemplateIdExpr(Template, E->getTemplateNameLoc(), 3998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLAngleLoc(), 3999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.data(), 4000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.size(), 4001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRAngleLoc()); 4002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 40061eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 4007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 4008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 40211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 4022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 40371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(), 4039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 4040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 4043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 40441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a temporary-binding expression always attempts to 40451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// bind a new temporary variable to its subexpression, even if the 4046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself 4047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique. 4048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 4051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>()); 4056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 40581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// \brief Transform a C++ expression that contains temporaries that should 4059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 4060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 40611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// The transformation of a full expression always attempts to build a new 40621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/// CXXExprWithTemporaries expression, even if the 4063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the 4064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression. 4065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 40681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXExprWithTemporaries *E) { 4069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 4070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned( 4074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(), 4075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->shouldDestroyTemporaries())); 4076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 40771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 40811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXTemporaryObjectExpr *E) { 4082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 4084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 4088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 4089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 4090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 4091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 40921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 40961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 4097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 4105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 4109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 4110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 4111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 41121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 4114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 4115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 4116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 41171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CommaLoc 4118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 4119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 4121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 4123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 4125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 4126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 41311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXUnresolvedConstructExpr *E) { 4132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 4133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 4134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 4135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 4139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 4140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 4141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 4142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 4143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 4144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 4145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 4148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 4149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 4150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 4151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 41521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 4155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 41561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 41571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 4159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 4160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 4161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 4162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 4163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 4164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 41661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 4169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedMemberExpr( 41701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CXXUnresolvedMemberExpr *E) { 4171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 4172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 4173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 4174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 41751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4176a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Sema::TypeTy *ObjectType = 0; 41771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base), 4178a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getOperatorLoc(), 4179a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->isArrow()? tok::arrow : tok::period, 4180a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor ObjectType); 4181a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (Base.isInvalid()) 4182a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 41831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 41843b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: The first qualifier found might be a template type parameter, 41853b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // in which case there is no transformed declaration to refer to (it might 41863b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // refer to a built-in type!). 4187c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope 4188c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor = cast_or_null<NamedDecl>( 4189c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor getDerived().TransformDecl(E->getFirstQualifierFoundInScope())); 41901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4191a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor NestedNameSpecifier *Qualifier = 0; 4192a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (E->getQualifier()) { 4193a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 4194a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 4195c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType::getFromOpaquePtr(ObjectType), 4196c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope); 4197a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor if (!Qualifier) 4198a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor return SemaRef.ExprError(); 4199a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor } 42001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName Name 420281499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc()); 420381499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor if (!Name) 420481499bbeb2bd157a77b60364676ac434aca7a4dfDouglas Gregor return SemaRef.ExprError(); 42051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42063b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!E->hasExplicitTemplateArgumentList()) { 42073b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // This is a reference to a member without an explicitly-specified 42083b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // template argument list. Optimize for this common case. 42093b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (!getDerived().AlwaysRebuild() && 42103b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Base.get() == E->getBase() && 42113b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier == E->getQualifier() && 42123b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name == E->getMember() && 42133b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope == E->getFirstQualifierFoundInScope()) 42141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 42151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42163b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 42173b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->isArrow(), 42183b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getOperatorLoc(), 42193b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Qualifier, 42203b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getQualifierRange(), 42213b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Name, 42223b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getMemberLoc(), 42233b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope); 42243b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 42253b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor 42263b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: This is an ugly hack, which forces the same template name to 42273b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // be looked up multiple times. Yuck! 42283b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor // FIXME: This also won't work for, e.g., x->template operator+<int> 42293b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TemplateName OrigTemplateName 42303b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo()); 42311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateName Template 42331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = getDerived().TransformTemplateName(OrigTemplateName, 42343b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType::getFromOpaquePtr(ObjectType)); 42353b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (Template.isNull()) 42363b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 42371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42383b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransArgs; 42393b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 42401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump TemplateArgument TransArg 42413b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]); 42423b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor if (TransArg.isNull()) 42433b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return SemaRef.ExprError(); 42441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 42453b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.push_back(TransArg); 42463b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor } 42471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 4249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 4250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 4251a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor Qualifier, 4252a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor E->getQualifierRange(), 42533b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor Template, 4254c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor E->getMemberLoc(), 42553b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor FirstQualifierInScope, 42563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getLAngleLoc(), 42573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.data(), 42583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor TransArgs.size(), 42593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor E->getRAngleLoc()); 4260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 42641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 42651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 42681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 42691eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 42701eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 4271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: poor source location 4272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 4273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 4274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (EncodedType.isNull()) 4275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 42761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType == E->getEncodedType()) 42791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 4282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType, 4283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 42851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 4287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 42881eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 4289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 42911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 42941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 42951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 42961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 42971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 43001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 43011eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 43021eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 43031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCProtocolDecl *Protocol 4304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ObjCProtocolDecl>( 4305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getProtocol())); 4306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Protocol) 4307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 4308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 4309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol == E->getProtocol()) 43111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCProtocolExpr(Protocol, 4314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAtLoc(), 4315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 4317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 43181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 43211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 43221eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 43231eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 4324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 43261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 43291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 43301eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 4332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 43341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 43371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 43381eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 433909105f52b1f28cbb1374c27c3c70f5517e2c465dFariborz JahanianTreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr( 43401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ObjCImplicitSetterGetterRefExpr *E) { 4341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 43431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 43461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 43471eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 43481eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) { 4349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 43511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 43541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 43551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 43561eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 4357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 43591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 43621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 43631eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 43641eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 4365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 4366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 4367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 4368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 4369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 4370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 43711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 4373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 4374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 43751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 4377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 43781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 43791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 4381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 4382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 4383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 43851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 43861eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 43871eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 4388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 43901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 43931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 43941eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 43951eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 4396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 4397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 43981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Owned(E->Retain()); 4399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 44001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 4402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 4403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 4404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 44051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) { 44070953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildPointerType(PointeeType, Qualifiers(), 4408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 4409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 4410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 44121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 4413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) { 44140953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), 4415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 4416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 4417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 44191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 44201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 4421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) { 44220953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildReferenceType(ReferentType, true, Qualifiers(), 4423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 4424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 4425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 4426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 44271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumptemplate<typename Derived> 44281eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 4429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) { 44300953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildReferenceType(ReferentType, false, Qualifiers(), 4431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 4432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 4433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 44361eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 4437577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ClassType) { 44380953e767ff7817f97b3ab20896b229891eeff45bJohn McCall return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(), 4439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 4440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 4441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 44441eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 4445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 4446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 4448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 4449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 4450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 4451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 4452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 4453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 4454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 44551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 44561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType Types[] = { 44571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 44581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 44591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 4460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 4461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 4462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 4463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 4464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 4465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 4466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 4467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 44681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeType.isNull()) 4470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false); 44711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 44731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 4474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 44751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump getDerived().getBaseEntity()); 4476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 44771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 44791eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 44801eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 4481577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4482577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 4483577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals) { 44841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 4485577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, SourceRange()); 4486577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4487577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4488577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 44891eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 44901eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 4491577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4492577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals) { 44931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 4494577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, SourceRange()); 4495577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 44961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4497577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 44981eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 44991eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 4500577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 4502577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 4503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 45041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 4505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 4506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 4507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 45101eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 45111eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 4512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 4513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 4514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 4515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 45161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 4517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 4518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 4519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 4523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements) { 4524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 4525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getVectorType(ElementType, NumElements); 4526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 45271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 4530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 4531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 4532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 4533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 4534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 45351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 4536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 4537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 4538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 4539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 45401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 45421eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpQualType 45431eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 4544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 4545577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 4546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 4547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 45481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4550577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 45511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump QualType *ParamTypes, 4552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 45531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool Variadic, 4554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 45551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 4556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 4557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 4558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 4559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 45601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 4563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 4564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 4568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 4569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 4573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 4574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 4575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 4577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 4578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateName Template, 4579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateArgument *Args, 4580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumArgs) { 4581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Missing source locations for the template name, <, >. 4582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(), 45831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation(), Args, NumArgs, 45841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SourceLocation()); 4585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 45861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4587dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 4588dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 4589dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 4590dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 4591a38c687ef5354678b9d76a7b29354159f2b83736Douglas Gregor IdentifierInfo &II, 4592c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor QualType ObjectType, 4593c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor NamedDecl *FirstQualifierInScope) { 4594dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 4595dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 4596dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 4597dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 4598dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 45991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(), 4600495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor Range.getEnd(), II, 4601c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor ObjectType, 4602c68afe2cbe7f875a9243c411077602fb5f5dc74bDouglas Gregor FirstQualifierInScope, 4603495c35d291da48c4f5655bbb54d15128ddde0d4dDouglas Gregor false)); 4604dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 4605dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 4606dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 4607dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 4608dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 4609dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 4610dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 4611dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 4612dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 4613dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 4614dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 4615dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 4616dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 4617dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 4618dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 4619dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T) { 4620dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (T->isDependentType() || T->isRecordType() || 4621dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 46220953e767ff7817f97b3ab20896b229891eeff45bJohn McCall assert(!T.hasQualifiers() && "Can't get cv-qualifiers here"); 4623dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 4624dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 4625dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 46261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4627dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 4628dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 4629dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 46301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4631d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 46321eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 4633d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 4634d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 4635d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 46361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 4637d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 4638d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 4639d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 4640d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 46411eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 4642d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 4643d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 4644d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl) { 4645d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl); 4646d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 4647d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 4648d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 46491eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTemplateName 4650d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 46513b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor const IdentifierInfo &II, 46523b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor QualType ObjectType) { 4653d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 4654d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 46551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump SS.setScopeRep(Qualifier); 46563b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor return getSema().ActOnDependentTemplateName( 46573b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 46583b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor II, 46593b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor /*FIXME:*/getDerived().getBaseLocation(), 46603b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor SS, 46613b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor ObjectType.getAsOpaquePtr()) 46623b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor .template getAsVal<TemplateName>(); 4663d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 46641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 46661eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpSema::OwningExprResult 4667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 4668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 4669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 4670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 4671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 4672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 4673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 4674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 46751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 4677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SecondExpr == 0 || isPostIncDec) { 4678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 4679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 4680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 46811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 4682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 46831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 4685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 46871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!FirstExpr->getType()->isOverloadableType() && 4688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 4689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 4690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 4691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 46921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 4693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 4694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 4695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 46961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 4698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 4699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 4700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 4701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 47021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // Compute the transformed set of functions (and function templates) to be 4704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 4705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::FunctionSet Functions; 47061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclRefExpr *DRE 47088f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts()); 47091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we have to check 4711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // IsAcceptableNonMemberOperatorCandidate for each of these? 47128f1d89e40ac853903916b88b850fb9638609173dDouglas Gregor for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F) 4713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Functions.insert(*F); 47141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 4716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 4717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 47181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump DeclarationName OpName 4719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); 4720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions); 47211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 4723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 47241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump UnaryOperator::Opcode Opc 4725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 4726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 4727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 47281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 47301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump BinaryOperator::Opcode Opc = 4731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 47321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump OwningExprResult Result 4733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 4734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 4735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 47361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 4738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 47391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return move(Result); 4740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 47411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4742577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 4743577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 4744577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 4745