TreeTransform.h revision 1bb8a45f7386a23871598d05141a07af03067925
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" 18657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor#include "clang/AST/Expr.h" 19b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprCXX.h" 20b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/ExprObjC.h" 21b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Ownership.h" 22b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Parse/Designator.h" 23b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/Lex/Preprocessor.h" 24577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include <algorithm> 25577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 26577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregornamespace clang { 27577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 28577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \brief A semantic tree transformation that allows one to transform one 29577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// abstract syntax tree into another. 30577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 31577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// A new tree transformation is defined by creating a new subclass \c X of 32577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TreeTransform<X> and then overriding certain operations to provide 33577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// behavior specific to that transformation. For example, template 34577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// instantiation is implemented as a tree transformation where the 35577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation of TemplateTypeParmType nodes involves substituting the 36577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template arguments for their corresponding template parameters; a similar 37577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// transformation is performed for non-type template parameters and 38577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// template template parameters. 39577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 40577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// This tree-transformation template uses static polymorphism to allow 41577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// subclasses to customize any of its operations. Thus, a subclass can 42577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// override any of the transformation or rebuild operators by providing an 43577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operation with the same signature as the default implementation. The 44577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// overridding function should not be virtual. 45577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 46577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Semantic tree transformations are split into two stages, either of which 47577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// can be replaced by a subclass. The "transform" step transforms an AST node 48577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// or the parts of an AST node using the various transformation functions, 49577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// then passes the pieces on to the "rebuild" step, which constructs a new AST 50577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// node of the appropriate kind from the pieces. The default transformation 51577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// routines recursively transform the operands to composite AST nodes (e.g., 52577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// the pointee type of a PointerType node) and, if any of those operand nodes 53577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// were changed by the transformation, invokes the rebuild operation to create 54577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// a new AST node. 55577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 56577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// Subclasses can customize the transformation at various levels. The 57670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor/// most coarse-grained transformations involve replacing TransformType(), 58577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(), 59577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// TransformTemplateName(), or TransformTemplateArgument() with entirely 60577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// new implementations. 61577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 62577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// For more fine-grained transformations, subclasses can replace any of the 63577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// \c TransformXXX functions (where XXX is the name of an AST node, e.g., 64577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// PointerType) to alter the transformation. As mentioned previously, 65577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// replacing TransformTemplateTypeParmType() allows template instantiation 66577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// to substitute template arguments for their corresponding template 67577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// parameters. Additionally, subclasses can override the \c RebuildXXX 68577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// functions to control how AST nodes are rebuilt when their operands change. 69577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// By default, \c TreeTransform will invoke semantic analysis to rebuild 70577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// AST nodes. However, certain other tree transformations (e.g, cloning) may 71577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// be able to use more efficient rebuild steps. 72577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 73577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// There are a handful of other functions that can be overridden, allowing one 74577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// to avoid traversing nodes that don't need any transformation 75577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their 76577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// operands have not changed (\c AlwaysRebuild()), and customize the 77577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// default locations and entity names used for type-checking 78577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// (\c getBaseLocation(), \c getBaseEntity()). 79577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// 80577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// FIXME: In the future, TreeTransform will support transformation of 81577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor/// statements and expressions as well as types. 82577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 83577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorclass TreeTransform { 84577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorprotected: 85577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &SemaRef; 86577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 87577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregorpublic: 88b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningStmtResult OwningStmtResult; 89b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::OwningExprResult OwningExprResult; 90b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::StmtArg StmtArg; 91b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::ExprArg ExprArg; 92b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor typedef Sema::MultiExprArg MultiExprArg; 93b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 94577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Initializes a new tree transformer. 95577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { } 96577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 97577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 98577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Derived &getDerived() { return static_cast<Derived&>(*this); } 99577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 100577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the derived class. 101577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const Derived &getDerived() const { 102577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return static_cast<const Derived&>(*this); 103577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 105577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Retrieves a reference to the semantic analysis object used for 106577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this tree transform. 107577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema &getSema() const { return SemaRef; } 108577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 109577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Whether the transformation should always rebuild AST nodes, even 110577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// if none of the children have changed. 111577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 112577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this function to specify when the transformation 113577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// should rebuild all AST nodes. 114577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlwaysRebuild() { return false; } 115577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 116577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the location of the entity being transformed, if that 117577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 118577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 119577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, returns no source-location information. Subclasses can 120577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// provide an alternative implementation that provides better location 121577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information. 122577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation getBaseLocation() { return SourceLocation(); } 123577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 124577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Returns the name of the entity being transformed, if that 125577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// information was not available elsewhere in the AST. 126577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 127577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, returns an empty name. Subclasses can provide an alternative 128577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// implementation with a more precise name. 129577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor DeclarationName getBaseEntity() { return DeclarationName(); } 130577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Sets the "base" location and entity when that 132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// information is known based on another transformation. 133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, the source location and entity are ignored. Subclasses can 135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// override this function to provide a customized implementation. 136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor void setBase(SourceLocation Loc, DeclarationName Entity) { } 137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief RAII object that temporarily sets the base location and entity 139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// used for reporting diagnostics in types. 140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor class TemporaryBase { 141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TreeTransform &Self; 142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OldLocation; 143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName OldEntity; 144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor public: 146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase(TreeTransform &Self, SourceLocation Location, 147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Entity) : Self(Self) 148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldLocation = Self.getDerived().getBaseLocation(); 150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OldEntity = Self.getDerived().getBaseEntity(); 151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(Location, Entity); 152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ~TemporaryBase() { 155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Self.getDerived().setBase(OldLocation, OldEntity); 156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor }; 158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 159577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Determine whether the given type \p T has already been 160577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// transformed. 161577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 162577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses can provide an alternative implementation of this routine 163577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// to short-circuit evaluation when it is known that a given type will 164577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// not change. For example, template instantiation need not traverse 165577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// non-dependent types. 166577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool AlreadyTransformed(QualType T) { 167577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T.isNull(); 168577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 169577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 170577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transforms the given type into another type. 171577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 172577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, this routine transforms a type by delegating to the 173577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// appropriate TransformXXXType to build a new type, then applying 174577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// the qualifiers on \p T to the resulting type with AddTypeQualifiers. 175577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this function (to take over all type 176577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// transformations), some set of the TransformXXXType functions, or 177577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// the AddTypeQualifiers function to alter the transformation. 178577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 179577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \returns the transformed type. 180577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType TransformType(QualType T); 181577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 182577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given type by adding the given set of qualifiers 183577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// and returning the result. 184577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 185577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// FIXME: By default, this routine adds type qualifiers only to types that 186577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// can have qualifiers, and silently suppresses those qualifiers that are 187577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// not permitted (e.g., qualifiers on reference or function types). This 188577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// is the right thing for template instantiation, but probably not for 189577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// other clients. 190577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType AddTypeQualifiers(QualType T, unsigned CVRQualifiers); 191577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 192657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given statement. 193577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 194577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// FIXME: At the moment, subclasses must override this. 195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningStmtResult TransformStmt(Stmt *S); 196657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 197657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// \brief Transform the given expression. 198657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor /// 199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E) { 206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false); 207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Transform the given expression. 210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine transforms an expression by delegating to the 212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// appropriate TransformXXXExpr function to build a new expression. 213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this function to transform expressions using some 214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// other mechanism. 215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \returns the transformed expression. 217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand); 218577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 219577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given declaration, which is referenced from a type 220577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// or expression. 221577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 222dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, acts as the identity function on declarations. Subclasses 223dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// may override this function to provide alternate behavior. 224dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Decl *TransformDecl(Decl *D) { return D; } 225577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 226577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given nested-name-specifier. 227577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 228dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, transforms all of the types and declarations within the 229dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this function to provide 230dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// alternate behavior. 231577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 232577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange Range); 233577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 234577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template name. 235577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 236d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, transforms the template name by transforming the declarations 237d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// and nested-name-specifiers that occur within the template name. 238d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// Subclasses may override this function to provide alternate behavior. 239d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName TransformTemplateName(TemplateName Name); 240577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 241577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Transform the given template argument. 242577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 243670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// By default, this operation transforms the type, expression, or 244670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// declaration stored within the template argument and constructs a 245670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// new template argument from the transformed result. Subclasses may 246670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor /// override this function to provide alternate behavior. 247577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg); 248577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 249577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define ABSTRACT_TYPE(CLASS, PARENT) 250577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT) \ 251577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Transform##CLASS##Type(const CLASS##Type *T); 252577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "clang/AST/TypeNodes.def" 253577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningStmtResult TransformCompoundStmt(Stmt *S, bool IsStmtExpr) { 255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Actually handle this transformation properly. 256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformStmt(S); 257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) 260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Transform##Node(Node *E); 262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define ABSTRACT_EXPR(Node, Parent) 263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 265577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new pointer type given its pointee type. 266577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 267577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the pointer type. 268577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 269577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildPointerType(QualType PointeeType); 270577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 271577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new block pointer type given its pointee type. 272577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 273577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the block pointer 274577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 275577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildBlockPointerType(QualType PointeeType); 276577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 277577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new lvalue reference type given the type it references. 278577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 279577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the lvalue reference 280577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 281577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildLValueReferenceType(QualType ReferentType); 282577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 283577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new rvalue reference type given the type it references. 284577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 285577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the rvalue reference 286577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 287577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildRValueReferenceType(QualType ReferentType); 288577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 289577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new member pointer type given the pointee type and the 290577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// class type it refers into. 291577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 292577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the member pointer 293577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// type. Subclasses may override this routine to provide different behavior. 294577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType); 295577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 296577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new array type given the element type, size 297577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, size of the array (if known), size expression, and index type 298577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 299577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 300577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 301577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 302577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Also by default, all of the other Rebuild*Array 303577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildArrayType(QualType ElementType, 304577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 305577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 306577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 307577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 308577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 309577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 310577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 311577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, and index type qualifiers. 312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 313577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 315577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildConstantArrayType(QualType ElementType, 316577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 317577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 318577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals); 319577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 320577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new constant array type given the element type, size 321577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// modifier, (known) size of the array, size expression, and index type 322577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// qualifiers. 323577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 324577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the array type. 325577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 326577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildConstantArrayWithExprType(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); 332577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 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. 338577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildConstantArrayWithoutExprType(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. 348577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildIncompleteArrayType(QualType ElementType, 349577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 350577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals); 351577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 352577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \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. 357577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildVariableArrayType(QualType ElementType, 358577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 360577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 361577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange); 362577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 363577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \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. 368577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 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); 380577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 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); 388577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 389577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \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. 394577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildDependentSizedExtVectorType(QualType ElementType, 395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 396577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc); 397577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 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, 403577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType *ParamTypes, 404577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 405577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, unsigned Quals); 406577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 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 } 421577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 422577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typeof(expr) type. 423577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 424577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typeof type. 425577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildTypeOfExprType(ExprArg Underlying); 427577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 428577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typeof(type) type. 429577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 430577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypeOfType with the given underlying type. 431577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypeOfType(QualType Underlying); 432577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 433577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new C++0x decltype type. 434577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 435577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the decltype type. 436577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// Subclasses may override this routine to provide different behavior. 437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType RebuildDecltypeType(ExprArg Underlying); 438577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 439577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new template specialization type. 440577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 441577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the template 442577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// specialization type. Subclasses may override this routine to provide 443577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 444577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTemplateSpecializationType(TemplateName Template, 445577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateArgument *Args, 446577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumArgs); 447577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 448577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new qualified name type. 449577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 450577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new QualifiedNameType type from the 451577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// nested-name-specifier and the named type. Subclasses may override 452577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// this routine to provide different behavior. 453577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) { 454577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, Named); 455577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 456577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 457577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to a template-id. 458577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 459577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, builds a new TypenameType type from the nested-name-specifier 460577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// and the given type. Subclasses may override this routine to provide 461577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 462577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) { 463577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NNS->isDependent()) 464577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypenameType(NNS, 465577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor cast<TemplateSpecializationType>(T)); 466577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 467577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getQualifiedNameType(NNS, T); 468577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 469577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 470577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// \brief Build a new typename type that refers to an identifier. 471577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// 472577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// By default, performs semantic analysis when building the typename type 473577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// (or qualified name type). Subclasses may override this routine to provide 474577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /// different behavior. 475577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType RebuildTypenameType(NestedNameSpecifier *NNS, 476577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const IdentifierInfo *Id) { 477577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.CheckTypenameType(NNS, *Id, 478577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange(getDerived().getBaseLocation())); 479dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 480dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 481dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and an 482dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// identifier that names the next step in the nested-name-specifier. 483dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 484dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 485dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 486dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 487dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 488dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 489dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor IdentifierInfo &II); 490dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 491dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 492dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// namespace named in the next step in the nested-name-specifier. 493dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 494dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 495dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 496dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 497dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 498dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 499dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS); 500dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 501dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// \brief Build a new nested-name-specifier given the prefix and the 502dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// type named in the next step in the nested-name-specifier. 503dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// 504dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// By default, performs semantic analysis when building the new 505dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// nested-name-specifier. Subclasses may override this routine to provide 506dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor /// different behavior. 507dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 508dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 509dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 510dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T); 511d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 512d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 513d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and the template 514d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// that the template name refers to. 515d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 516d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 517d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 518d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 519d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 520d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template); 521d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 522d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier, a flag 523d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// indicating whether the "template" keyword was provided, and a set of 524d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// overloaded function templates. 525d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 526d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, builds the new template name directly. Subclasses may override 527d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// this routine to provide different behavior. 528d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 529d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 530d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl); 531d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 532d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// \brief Build a new template name given a nested name specifier and the 533d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// name that is referred to as a template. 534d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// 535d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// By default, performs semantic analysis to determine whether the name can 536d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// be resolved to a specific template, then builds the appropriate kind of 537d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// template name. Subclasses may override this routine to provide different 538d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /// behavior. 539d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier, 540d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor const IdentifierInfo &II); 541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression that references a declaration. 544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDeclRefExpr(NamedDecl *ND, SourceLocation Loc) { 548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildDeclarationNameExpr(Loc, ND, 549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false, 550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*SS=*/0, 551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression in parentheses. 555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen, 559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParen) { 560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr)); 561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary operator expression. 564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc, 568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc, 569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr)); 571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with a type argument. 574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc, 578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R); 580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new sizeof or alignof expression with an expression 583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument. 584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc, 588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isSizeOf, SourceRange R) { 589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(), 591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OpLoc, isSizeOf, R); 592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.release(); 596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new array subscript expression. 600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS, 604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LBracketLoc, 605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS, 606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBracketLoc) { 607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS), 608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LBracketLoc, move(RHS), 609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RBracketLoc); 610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new call expression. 613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc, 617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *CommaLocs, 619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc, 621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), CommaLocs, RParenLoc); 622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member access expression. 625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc, 629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isArrow, SourceLocation MemberLoc, 630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *Member) { 631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isArrow? tok::arrow : tok::period, 633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MemberLoc, 634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/*Member->getIdentifier(), 635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); 636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new binary operator expression. 639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc, 643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc, 644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, ExprArg RHS) { 645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(), 647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)RHS.get()); 648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.release(); 652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.release(); 653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new conditional operator expression. 657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildConditionalOperator(ExprArg Cond, 661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation QuestionLoc, 662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg LHS, 663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ColonLoc, 664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg RHS) { 665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond), 666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new implicit cast expression. 670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new implicit cast without any semantic analysis. 672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind, 674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, bool isLvalue) { 675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ImplicitCastExpr *ICE 676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (getSema().Context) ImplicitCastExpr(T, Kind, 677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (Expr *)SubExpr.release(), 678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor isLvalue); 679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned(ICE); 680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C-style cast expression. 683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc, 687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy, 688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr) { 690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCastExpr(/*Scope=*/0, 691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy.getAsOpaquePtr(), 693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, 694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new compound literal expression. 698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc, 702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc, 704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(), 706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc, move(Init)); 707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new extended vector element access expression. 710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildExtVectorElementExpr(ExprArg Base, 714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AccessorLoc, 716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IdentifierInfo &Accessor) { 717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc, 718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::period, AccessorLoc, 719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Accessor, 720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); 721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new initializer list expression. 724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildInitList(SourceLocation LBraceLoc, 728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Inits, 729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RBraceLoc) { 730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc); 731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new designated initializer expression. 734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildDesignatedInitExpr(Designation &Desig, 738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ArrayExprs, 739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqualOrColonLoc, 740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool GNUSyntax, 741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Init) { 742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax, 744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.release(); 749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new value-initialized expression. 753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds the implicit value initialization without performing 755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// any semantic analysis. Subclasses may override this routine to provide 756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildImplicitValueInitExpr(QualType T) { 758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T)); 759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new \c va_arg expression. 762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr, 766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, SourceLocation RParenLoc) { 767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(), 768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new expression list in parentheses. 772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc, 776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs)); 779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new address-of-label expression. 782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis, using the name of the label 784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// rather than attempting to map the label statement itself. 785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc, 787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LabelLoc, 788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LabelStmt *Label) { 789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID()); 790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new GNU statement expression. 793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc, 797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor StmtArg SubStmt, 798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc); 800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_types_compatible_p expression. 803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc, 807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, QualType T2, 808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnTypesCompatibleExpr(BuiltinLoc, 810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1.getAsOpaquePtr(), 811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2.getAsOpaquePtr(), 812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new __builtin_choose_expr expression. 816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc, 820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Cond, ExprArg LHS, ExprArg RHS, 821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ActOnChooseExpr(BuiltinLoc, 823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new overloaded operator call expression. 828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// The semantic analysis provides the behavior of template instantiation, 831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// copying with transformations that turn what looks like an overloaded 832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// operator call into a use of a builtin operator, performing 833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// argument-dependent lookup, etc. Subclasses may override this routine to 834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second); 840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "named" cast expression, such as static_cast or 842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// reinterpret_cast. 843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, this routine dispatches to one of the more-specific routines 845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// for a particular named case, e.g., RebuildCXXStaticCastExpr(). 846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc, 848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Stmt::StmtClass Class, 849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (Class) { 856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXStaticCastExprClass: 857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T, 858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc, LParenLoc, 859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXDynamicCastExprClass: 862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T, 863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc, LParenLoc, 864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXReinterpretCastExprClass: 867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T, 868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc, LParenLoc, 869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::CXXConstCastExprClass: 873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T, 874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc, LParenLoc, 875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), RParenLoc); 876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor default: 878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Invalid C++ named cast"); 879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor break; 880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ static_cast expression. 886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc, 890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast, 897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ dynamic_cast expression. 902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc, 906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast, 913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ reinterpret_cast expression. 918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc, 922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast, 929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ const_cast expression. 934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc, 938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc, 941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast, 945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, T.getAsOpaquePtr(), RAngleLoc, 946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, move(SubExpr), RParenLoc); 947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ functional-style cast expression. 950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange, 954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SubExpr, 957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Sub = SubExpr.takeAs<Expr>(); 959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(TypeRange, 960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::MultiExprArg(getSema(), 963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (void **)&Sub, 964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1), 965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*CommaLocs=*/0, 966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(type) expression. 970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true, 978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ typeid(expr) expression. 982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc, 986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand, 988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(), 991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ExprError(); 994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership 996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "this" expression. 1000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new "this" expression without performing any 1002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// semantic analysis. Subclasses may override this routine to provide 1003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// different behavior. 1004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc, 1005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ThisType) { 1006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().Owned( 1007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor new (getSema().Context) CXXThisExpr(ThisLoc, ThisType)); 1008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ throw expression. 1011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) { 1015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXThrow(ThrowLoc, move(Sub)); 1016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ default-argument expression. 1019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, builds a new default-argument expression, which does not 1021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// require any semantic analysis. Subclasses may override this routine to 1022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// provide different behavior. 1023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) { 1024f1480eee38b59d15438fb7bc50865ac7c7e22403Anders Carlsson return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param)); 1025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ zero-initialization expression. 1028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc, 1032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc), 1036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), LParenLoc, 1037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg(getSema(), 0, 0), 1038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 0, RParenLoc); 1039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ conditional declaration expression. 1042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc, 1046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation EqLoc, 1047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor VarDecl *Var) { 1048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc, 1049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EqLoc, 1050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var)); 1051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "new" expression. 1054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc, 1058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool UseGlobal, 1059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementLParen, 1060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg PlacementArgs, 1061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation PlacementRParen, 1062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ParenTypeId, 1063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType, 1064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeLoc, 1065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange TypeRange, 1066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg ArraySize, 1067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorLParen, 1068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg ConstructorArgs, 1069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ConstructorRParen) { 1070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildCXXNew(StartLoc, UseGlobal, 1071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementLParen, 1072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(PlacementArgs), 1073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementRParen, 1074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParenTypeId, 1075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 1076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeLoc, 1077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TypeRange, 1078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 1079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorLParen, 1080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ConstructorArgs), 1081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorRParen); 1082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new C++ "delete" expression. 1085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc, 1089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsGlobalDelete, 1090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrayForm, 1091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Operand) { 1092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm, 1093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 1094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new unary type trait expression. 1097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait, 1101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation StartLoc, 1102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc, 1106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), RParenLoc); 1107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new qualified declaration reference expression. 1110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildQualifiedDeclRefExpr(NestedNameSpecifier *NNS, 1114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *ND, 1116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsAddressOfOperand) { 1118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 1121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Location, 1123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ND->getDeclName(), 1124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*Trailing lparen=*/false, 1125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &SS, 1126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IsAddressOfOperand); 1127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new (previously unresolved) declaration reference 1130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// expression. 1131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS, 1135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceRange QualifierRange, 1136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation Location, 1138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsAddressOfOperand) { 1139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setRange(QualifierRange); 1141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SS.setScopeRep(NNS); 1142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnDeclarationNameExpr(/*Scope=*/0, 1143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Location, 1144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 1145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*Trailing lparen=*/false, 1146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &SS, 1147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IsAddressOfOperand); 1148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new template-id expression. 1151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildTemplateIdExpr(TemplateName Template, 1155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TemplateLoc, 1156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LAngleLoc, 1157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgument *TemplateArgs, 1158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumTemplateArgs, 1159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RAngleLoc) { 1160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().BuildTemplateIdExpr(Template, TemplateLoc, 1161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LAngleLoc, 1162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgs, NumTemplateArgs, 1163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RAngleLoc); 1164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXConstructExpr(QualType T, 1171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor, 1172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsElidable, 1173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args) { 1174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = Args.size(); 1175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **ArgsExprs = (Expr **)Args.release(); 1176089c2602ebaccdda271beaabdd32575b354d4d09Anders Carlsson return getSema().Owned(SemaRef.BuildCXXConstructExpr(T, Constructor, 1177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor IsElidable, 1178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgsExprs, 1179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NumArgs)); 1180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc, 1187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc), 1193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new object-construction expression. 1201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc, 1205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg Args, 1208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation *Commas, 1209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc, 1211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME*/LParenLoc), 1212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T.getAsOpaquePtr(), 1213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Args), 1215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Commas, 1216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new member reference expression. 1220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 12230dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE, 1224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool IsArrow, 1225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OperatorLoc, 1226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name, 1227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation MemberLoc) { 12280dec56d4ce737484aff17d4429a6e2e2fbad73e0Douglas Gregor OwningExprResult Base = move(BaseE); 1229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period; 1230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXScopeSpec SS; 1231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base = SemaRef.ActOnCXXEnterMemberScope(0, SS, move(Base), OpKind); 1232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 1233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 1234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Name.getAsIdentifierInfo() && 1236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor "Cannot transform member references with non-identifier members"); 1237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base = SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0, 1238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Base), OperatorLoc, OpKind, 1239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MemberLoc, 1240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor *Name.getAsIdentifierInfo(), 1241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0)); 1242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.ActOnCXXExitMemberScope(0, SS); 1243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Base); 1244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C @encode expression. 1247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc, 1251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T, 1252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T, 1254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 1255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new Objective-C protocol expression. 1258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol, 1262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation AtLoc, 1263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation ProtoLoc, 1264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation LParenLoc, 1265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression( 1267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol->getIdentifier(), 1268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AtLoc, 1269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ProtoLoc, 1270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LParenLoc, 1271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc)); 1272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// \brief Build a new shuffle vector expression. 1275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// 1276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// By default, performs semantic analysis to build the new expression. 1277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /// Subclasses may override this routine to provide different behavior. 1278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc, 1279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor MultiExprArg SubExprs, 1280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation RParenLoc) { 1281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Find the declaration for __builtin_shufflevector 1282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor const IdentifierInfo &Name 1283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.Idents.get("__builtin_shufflevector"); 1284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl(); 1285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name)); 1286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?"); 1287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build a reference to the __builtin_shufflevector builtin 1289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first); 1290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Callee 1291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(), 1292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BuiltinLoc, false, false); 1293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.UsualUnaryConversions(Callee); 1294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Build the CallExpr 1296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumSubExprs = SubExprs.size(); 1297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr **Subs = (Expr **)SubExprs.release(); 1298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee, 1299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Subs, NumSubExprs, 1300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Builtin->getResultType(), 1301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RParenLoc); 1302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult OwnedCall(SemaRef.Owned(TheCall)); 1303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Type-check the __builtin_shufflevector expression. 1305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall); 1306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 1307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 1308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwnedCall.release(); 1310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 1311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1312577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor}; 1313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1314577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1315670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregortemplate<typename Derived> 1316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E, 1317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isAddressOfOperand) { 1318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!E) 1319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E); 1320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor switch (E->getStmtClass()) { 1322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::NoStmtClass: break; 1323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define STMT(Node, Parent) case Stmt::Node##Class: break; 1324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#define EXPR(Node, Parent) \ 1325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E)); 1326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor#include "clang/AST/StmtNodes.def" 1327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 1328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 1329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 1330657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor} 1331657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregor 1332657c1acfc47d5c315ce864f2089b692262532a17Douglas Gregortemplate<typename Derived> 1333dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 1334dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS, 1335dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range) { 1336dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Instantiate the prefix of this nested name specifier. 1337dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NestedNameSpecifier *Prefix = NNS->getPrefix(); 1338dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (Prefix) { 1339dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range); 1340dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!Prefix) 1341dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 1342dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1343dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1344dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor switch (NNS->getKind()) { 1345dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Identifier: 1346dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor assert(Prefix && 1347dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor "Can't have an identifier nested-name-specifier with no prefix"); 1348dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix()) 1349dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 1350dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1351dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1352dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor *NNS->getAsIdentifier()); 1353dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1354dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Namespace: { 1355dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS 1356dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor = cast_or_null<NamespaceDecl>( 1357dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor getDerived().TransformDecl(NNS->getAsNamespace())); 1358dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1359dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1360dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NS == NNS->getAsNamespace()) 1361dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 1362dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1363dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS); 1364dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1365dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1366dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::Global: 1367dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // There is no meaningful transformation that one could perform on the 1368dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // global scope. 1369dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 1370dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1371dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpecWithTemplate: 1372dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor case NestedNameSpecifier::TypeSpec: { 1373dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0)); 1374d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (T.isNull()) 1375d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return 0; 1376d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1377dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (!getDerived().AlwaysRebuild() && 1378dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Prefix == NNS->getPrefix() && 1379dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T == QualType(NNS->getAsType(), 0)) 1380dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NNS; 1381dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1382dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return getDerived().RebuildNestedNameSpecifier(Prefix, Range, 1383dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate, 1384dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T); 1385dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1386dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 1387dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1388dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // Required to silence a GCC warning 1389dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 1390dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 1391dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 1392dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 1393d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName 1394d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::TransformTemplateName(TemplateName Name) { 1395d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) { 1396d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NestedNameSpecifier *NNS 1397d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(), 1398d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1399d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1400d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1401d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1402d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = QTN->getTemplateDecl()) { 1403d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *TransTemplate 1404d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1405d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1406d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1407d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1408d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1409d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1410d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1411d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 1412d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1413d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1414d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate); 1415d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 1416d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1417d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl(); 1418d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 1419d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *TransOvl 1420d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1421d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1422d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1423d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1424d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1425d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == QTN->getQualifier() && 1426d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1427d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 1428d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1429d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(), 1430d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl); 1431d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 1432d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1433d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) { 1434d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NestedNameSpecifier *NNS 1435d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(), 1436d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor /*FIXME:*/SourceRange(getDerived().getBaseLocation())); 1437d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!NNS) 1438d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1439d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1440d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1441d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor NNS == DTN->getQualifier()) 1442d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 1443d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1444d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return getDerived().RebuildTemplateName(NNS, *DTN->getName()); 1445d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 1446d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1447d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TemplateDecl *Template = Name.getAsTemplateDecl()) { 1448d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *TransTemplate 1449d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template)); 1450d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransTemplate) 1451d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1452d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1453d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1454d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransTemplate == Template) 1455d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 1456d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1457d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransTemplate); 1458d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 1459d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1460d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl(); 1461d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor assert(Ovl && "Not a template name or an overload set?"); 1462d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *TransOvl 1463d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl)); 1464d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!TransOvl) 1465d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 1466d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1467d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1468d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TransOvl == Ovl) 1469d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Name; 1470d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1471d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(TransOvl); 1472d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 1473d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 1474d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 1475670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTemplateArgument 1476670444ed30cc8ff66eb4847d921d9af0291a7111Douglas GregorTreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) { 1477670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor switch (Arg.getKind()) { 1478670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Null: 1479670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Integral: 1480670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return Arg; 1481670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1482670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Type: { 1483670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor QualType T = getDerived().TransformType(Arg.getAsType()); 1484670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (T.isNull()) 1485670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1486670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(Arg.getLocation(), T); 1487670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1488670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1489670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Declaration: { 1490670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Decl *D = getDerived().TransformDecl(Arg.getAsDecl()); 1491670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (!D) 1492670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1493670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(Arg.getLocation(), D); 1494670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1495670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1496670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Expression: { 1497670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Template argument expressions are not potentially evaluated. 1498670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(getSema(), 1499670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Action::Unevaluated); 1500670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1501670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr()); 1502670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (E.isInvalid()) 1503670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1504670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(E.takeAs<Expr>()); 1505670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1506670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1507670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor case TemplateArgument::Pack: { 1508670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransformedArgs; 1509670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.reserve(Arg.pack_size()); 1510670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor for (TemplateArgument::pack_iterator A = Arg.pack_begin(), 1511670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor AEnd = Arg.pack_end(); 1512670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor A != AEnd; ++A) { 1513670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument TA = getDerived().TransformTemplateArgument(*A); 1514670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (TA.isNull()) 1515670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TA; 1516670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1517670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TransformedArgs.push_back(TA); 1518670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1519670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor TemplateArgument Result; 1520670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(), 1521670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor true); 1522670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return Result; 1523670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1524670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor } 1525670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1526670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Work around bogus GCC warning 1527670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return TemplateArgument(); 1528670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor} 1529670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 1531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor// Type transformation 1532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 1533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformType(QualType T) { 1536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (getDerived().AlreadyTransformed(T)) 1537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 1538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Result; 1540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor switch (T->getTypeClass()) { 1541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define ABSTRACT_TYPE(CLASS, PARENT) 1542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#define TYPE(CLASS, PARENT) \ 1543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor case Type::CLASS: \ 1544577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Result = getDerived().Transform##CLASS##Type( \ 1545577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor static_cast<CLASS##Type*>(T.getTypePtr())); \ 1546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 1547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#include "clang/AST/TypeNodes.def" 1548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 1549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1550577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Result.isNull() || T == Result) 1551577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return Result; 1552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().AddTypeQualifiers(Result, T.getCVRQualifiers()); 1554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 1558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::AddTypeQualifiers(QualType T, unsigned CVRQualifiers) { 1559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (CVRQualifiers && !T->isFunctionType() && !T->isReferenceType()) 1560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T.getWithAdditionalQualifiers(CVRQualifiers); 1561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return T; 1563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 15641bb8a45f7386a23871598d05141a07af03067925Argyrios Kyrtzidis 1565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformExtQualType(const ExtQualType *T) { 1567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 1568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformBuiltinType(const BuiltinType *T) { 1573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // Nothing to do 1574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFixedWidthIntType( 1579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const FixedWidthIntType *T) { 1580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 1581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformComplexType(const ComplexType *T) { 1586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 1587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1591577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformPointerType(const PointerType *T) { 1592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 1593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 1594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1597577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 1598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildPointerType(PointeeType); 1601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 1605577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformBlockPointerType(const BlockPointerType *T) { 1606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 1607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 1608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1609577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1611577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 1612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildBlockPointerType(PointeeType); 1615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1617577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 1619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformLValueReferenceType( 1620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const LValueReferenceType *T) { 1621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 1622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 1623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 1627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildLValueReferenceType(PointeeType); 1630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 1634577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformRValueReferenceType( 1635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const RValueReferenceType *T) { 1636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 1637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 1638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1640577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType()) 1642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildRValueReferenceType(PointeeType); 1645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 1649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformMemberPointerType(const MemberPointerType *T) { 1650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType PointeeType = getDerived().TransformType(T->getPointeeType()); 1651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (PointeeType.isNull()) 1652577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1653577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ClassType = getDerived().TransformType(QualType(T->getClass(), 0)); 1655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ClassType.isNull()) 1656577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1658577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor PointeeType == T->getPointeeType() && 1660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ClassType == QualType(T->getClass(), 0)) 1661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildMemberPointerType(PointeeType, ClassType); 1664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 1668577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayType(const ConstantArrayType *T) { 1669577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 1670577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 1671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1672577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1673577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 1675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildConstantArrayType(ElementType, 1678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 1679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSize(), 1680577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier()); 1681577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1682577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1683577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1684577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 1685577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayWithExprType( 1686577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const ConstantArrayWithExprType *T) { 1687577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 1688577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 1689577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1690577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1691670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 1692670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 1693670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1694670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 1695670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor if (Size.isInvalid()) 1696670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor return QualType(); 1697670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1698577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1699670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor ElementType == T->getElementType() && 1700670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Size.get() == T->getSizeExpr()) 1701577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1702577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1703577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildConstantArrayWithExprType(ElementType, 1704577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 1705577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSize(), 1706670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor Size.takeAs<Expr>(), 1707577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier(), 1708577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getBracketsRange()); 1709577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1710577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1711577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1712577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 1713577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformConstantArrayWithoutExprType( 1714577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const ConstantArrayWithoutExprType *T) { 1715577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 1716577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 1717577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1718577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1719577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1720577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 1721577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1722577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1723577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildConstantArrayWithoutExprType(ElementType, 1724577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 1725577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSize(), 1726577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier()); 1727577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1728577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1729577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1730577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformIncompleteArrayType( 1731577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const IncompleteArrayType *T) { 1732577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 1733577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 1734577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1735577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1736577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1737577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 1738577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1739577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1740577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildIncompleteArrayType(ElementType, 1741577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 1742577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier()); 1743577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1744577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1745577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1746577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformVariableArrayType( 1747577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const VariableArrayType *T) { 1748577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 1749577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 1750577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1751577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1752670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 1753670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 1754670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1755577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 1756577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 1757577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1758577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1759577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1760577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType() && 1761577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.get() == T->getSizeExpr()) { 1762577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.take(); 1763577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1764577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 1765577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1766577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildVariableArrayType(ElementType, 1767577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 1768577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 1769577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier(), 1770577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getBracketsRange()); 1771577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1772577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1773577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1774577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedArrayType( 1775577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const DependentSizedArrayType *T) { 1776577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 1777577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 1778577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1779577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1780670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Array bounds are not potentially evaluated contexts 1781670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 1782670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1783577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 1784577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 1785577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1786577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1787577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1788577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType() && 1789577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.get() == T->getSizeExpr()) { 1790577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.take(); 1791577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1792577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 1793577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1794577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildDependentSizedArrayType(ElementType, 1795577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getSizeModifier(), 1796577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 1797577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getIndexTypeQualifier(), 1798577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getBracketsRange()); 1799577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1800577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1801577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1802577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDependentSizedExtVectorType( 1803577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const DependentSizedExtVectorType *T) { 1804577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 1805577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 1806577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1807577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1808670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // Vector sizes are not potentially evaluated contexts 1809670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 1810670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1811577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr()); 1812577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size.isInvalid()) 1813577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1814577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1815577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1816577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType() && 1817577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.get() == T->getSizeExpr()) { 1818577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Size.take(); 1819577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1820577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 1821577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1822577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildDependentSizedExtVectorType(ElementType, 1823577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor move(Size), 1824577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getAttributeLoc()); 1825577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1826577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1827577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1828577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformVectorType(const VectorType *T) { 1829577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 1830577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 1831577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1832577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1833577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1834577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 1835577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1836577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1837577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildVectorType(ElementType, T->getNumElements()); 1838577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1839577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1840577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1841577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 1842577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::TransformExtVectorType(const ExtVectorType *T) { 1843577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType = getDerived().TransformType(T->getElementType()); 1844577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ElementType.isNull()) 1845577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1846577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1847577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1848577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ElementType == T->getElementType()) 1849577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1850577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1851577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildExtVectorType(ElementType, T->getNumElements(), 1852577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor /*FIXME*/SourceLocation()); 1853577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1854577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1855577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1856577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionProtoType( 1857577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const FunctionProtoType *T) { 1858577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ResultType = getDerived().TransformType(T->getResultType()); 1859577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (ResultType.isNull()) 1860577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1861577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1862577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<QualType, 4> ParamTypes; 1863577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(), 1864577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ParamEnd = T->arg_type_end(); 1865577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Param != ParamEnd; ++Param) { 1866577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType P = getDerived().TransformType(*Param); 1867577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (P.isNull()) 1868577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1869577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1870577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ParamTypes.push_back(P); 1871577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 1872577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1873577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1874577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ResultType == T->getResultType() && 1875577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) 1876577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1877577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1878577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildFunctionProtoType(ResultType, ParamTypes.data(), 1879577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ParamTypes.size(), T->isVariadic(), 1880577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor T->getTypeQuals()); 1881577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1882577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1883577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1884577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformFunctionNoProtoType( 1885577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const FunctionNoProtoType *T) { 1886577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 1887577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1888577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1889577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1890577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1891577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypedefType(const TypedefType *T) { 1892577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TypedefDecl *Typedef 1893577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl())); 1894577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Typedef) 1895577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1896577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1897577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1898577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Typedef == T->getDecl()) 1899577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1900577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1901577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypedefType(Typedef); 1902577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1903577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1904577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1905577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypeOfExprType( 1906577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TypeOfExprType *T) { 1907670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // typeof expressions are not potentially evaluated contexts 1908670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 1909670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1910577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 1911577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 1912577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1913577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1914577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1915577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.get() == T->getUnderlyingExpr()) { 1916577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.take(); 1917577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1918577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 1919577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1920577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypeOfExprType(move(E)); 1921577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1922577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1923577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1924577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypeOfType(const TypeOfType *T) { 1925577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Underlying = getDerived().TransformType(T->getUnderlyingType()); 1926577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Underlying.isNull()) 1927577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1928577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1929577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1930577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Underlying == T->getUnderlyingType()) 1931577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1932577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1933577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypeOfType(Underlying); 1934577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1935577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1936577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1937577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformDecltypeType(const DecltypeType *T) { 1938670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor // decltype expressions are not potentially evaluated contexts 1939670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 1940670444ed30cc8ff66eb4847d921d9af0291a7111Douglas Gregor 1941577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr()); 1942577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (E.isInvalid()) 1943577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1944577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1945577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1946577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.get() == T->getUnderlyingExpr()) { 1947577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor E.take(); 1948577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1949577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 1950577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1951577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildDecltypeType(move(E)); 1952577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1953577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1954577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1955577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformRecordType(const RecordType *T) { 1956577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor RecordDecl *Record 1957577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl())); 1958577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Record) 1959577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1960577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1961577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1962577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Record == T->getDecl()) 1963577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1964577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1965577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildRecordType(Record); 1966577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1967577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1968577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1969577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformEnumType(const EnumType *T) { 1970577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor EnumDecl *Enum 1971577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl())); 1972577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!Enum) 1973577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1974577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1975577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 1976577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Enum == T->getDecl()) 1977577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1978577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1979577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildEnumType(Enum); 1980577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1981577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1982577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1983577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateTypeParmType( 1984577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateTypeParmType *T) { 1985577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // Nothing to do 1986577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 1987577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 1988577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1989577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 1990577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTemplateSpecializationType( 1991577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateSpecializationType *T) { 1992577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateName Template 1993577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformTemplateName(T->getTemplateName()); 1994577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Template.isNull()) 1995577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 1996577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 1997577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs; 1998577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.reserve(T->getNumArgs()); 1999577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end(); 2000577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Arg != ArgEnd; ++Arg) { 2001577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg); 2002577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewArg.isNull()) 2003577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2004577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2005577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.push_back(NewArg); 2006577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2007577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2008577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: early abort if all of the template arguments and such are the 2009577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // same. 2010577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2011577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: We're missing the locations of the template name, '<', and '>'. 2012577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTemplateSpecializationType(Template, 2013577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.data(), 2014577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateArgs.size()); 2015577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2016577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2017577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2018577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformQualifiedNameType( 2019577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const QualifiedNameType *T) { 2020577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2021577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 2022577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange()); 2023577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2024577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2025577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2026577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Named = getDerived().TransformType(T->getNamedType()); 2027577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Named.isNull()) 2028577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2029577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2030577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2031577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2032577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Named == T->getNamedType()) 2033577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2034577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2035577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildQualifiedNameType(NNS, Named); 2036577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2037577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2038577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2039577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformTypenameType(const TypenameType *T) { 2040577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NestedNameSpecifier *NNS 2041577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformNestedNameSpecifier(T->getQualifier(), 20424a959d8788179d654df6b213b08d2b064989211dDouglas Gregor SourceRange(/*FIXME:*/getDerived().getBaseLocation())); 2043577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!NNS) 2044577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2045577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2046577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) { 2047577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType NewTemplateId 2048577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = getDerived().TransformType(QualType(TemplateId, 0)); 2049577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (NewTemplateId.isNull()) 2050577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(); 2051577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2052577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (!getDerived().AlwaysRebuild() && 2053577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NNS == T->getQualifier() && 2054577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NewTemplateId == QualType(TemplateId, 0)) 2055577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2056577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2057577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypenameType(NNS, NewTemplateId); 2058577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 2059577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2060577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildTypenameType(NNS, T->getIdentifier()); 2061577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2062577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2063577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2064577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCInterfaceType( 2065577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const ObjCInterfaceType *T) { 2066577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 2067577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2068577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2069577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2070577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2071577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::TransformObjCObjectPointerType( 2072577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const ObjCObjectPointerType *T) { 2073577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Implement 2074577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return QualType(T, 0); 2075577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2076577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 2077577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Expression transformation 2079577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor//===----------------------------------------------------------------------===// 2080577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) { 2083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2084577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2086577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 2087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) { 2089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *ND 2090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 2091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 2092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && ND == E->getDecl()) 2095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDeclRefExpr(ND, E->getLocation()); 2098577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) { 2103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2104577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 2105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) { 2109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) { 2115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) { 2121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) { 2127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenExpr(ParenExpr *E) { 2133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 2138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(), 2141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParen()); 2142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) { 2147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr()) 2152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryOperator(E->getOperatorLoc(), 2155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOpcode(), 2156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 2157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { 2162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isArgumentType()) { 2163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getArgumentType()); 2164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 2165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && T == E->getArgumentType()) 2168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(), 2171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 2172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 2173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::OwningExprResult SubExpr(SemaRef); 2176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 2177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // C++0x [expr.sizeof]p1: 2178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The operand is either an expression, which is an unevaluated operand 2179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // [...] 2180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated); 2181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr = getDerived().TransformExpr(E->getArgumentExpr()); 2183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr()) 2187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(), 2191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isSizeOf(), 2192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSourceRange()); 2193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) { 2198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 2199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 2200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 2203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 2204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 2209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 2210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildArraySubscriptExpr(move(LHS), 2213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLHS()->getLocStart(), 2214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS), 2215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBracketLoc()); 2216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCallExpr(CallExpr *E) { 2221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the callee. 2222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 2223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 2224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform arguments. 2227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgChanged = false; 2228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 2229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 4> FakeCommaLocs; 2230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) { 2231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I)); 2232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 2233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the ','. 2236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 2237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd())); 2238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgChanged = ArgChanged || Arg.get() != E->getArg(I); 2240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(Arg.takeAs<Expr>()); 2241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 2245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgChanged) 2246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Wrong source location information for the '('. 2249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 2250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = ((Expr *)Callee.get())->getSourceRange().getBegin(); 2251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc, 2252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 2253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 2254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 2255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) { 2260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 2261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 2262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *Member 2265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl())); 2266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Member) 2267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 2271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Member == E->getMemberDecl()) 2272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus source location for the operator 2275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 2276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd()); 2277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc, 2279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 2280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc(), 2281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Member); 2282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCastExpr(CastExpr *E) { 2287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 2288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) { 2294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 2295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 2296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 2299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 2300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 2304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 2305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(), 2308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), move(RHS)); 2309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundAssignOperator( 2314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CompoundAssignOperator *E) { 2315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformBinaryOperator(E); 2316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) { 2321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 2322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 2323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 2326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 2327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 2330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 2331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 2335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 2336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 2337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXM: ? and : locations are broken. 2340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeQuestionLoc = E->getCond()->getLocEnd(); 2341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeColonLoc = E->getFalseExpr()->getLocStart(); 2342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildConditionalOperator(move(Cond), 2343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeQuestionLoc, 2344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(LHS), 2345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeColonLoc, 2346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(RHS)); 2347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) { 2352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 2353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 2354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 2362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 2363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(), 2366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 2367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isLvalueCast()); 2368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) { 2373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform abstract class"); 2374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) { 2380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 2381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 2382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 2383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeStartLoc 2384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 2385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 2386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getTypeAsWritten()); 2388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 2389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 2398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 2399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T, 2402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc(), 2403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr)); 2404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) { 2409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 2410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 2411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 2412b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeTypeLoc 2413b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc()); 2414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName()); 2415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 2417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 2418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInitializer()); 2422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 2423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 2427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInitializer()) 2428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T, 2431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getInitializer()->getLocEnd(), 2432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Init)); 2433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) { 2438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 2439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 2440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase()) 2444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad source location 2447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeOperatorLoc 2448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd()); 2449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc, 2450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessorLoc(), 2451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAccessor()); 2452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) { 2457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool InitChanged = false; 2458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 2460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) { 2461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit(I)); 2462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 2463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor InitChanged = InitChanged || Init.get() != E->getInit(I); 2466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 2467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && !InitChanged) 2470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits), 2473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRBraceLoc()); 2474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) { 2479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Designation Desig; 2480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Instantiate the initializer value 2482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getInit()); 2483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 2484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Instantiate the designators. 2487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef); 2488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ExprChanged = false; 2489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (DesignatedInitExpr::designators_iterator D = E->designators_begin(), 2490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DEnd = E->designators_end(); 2491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D != DEnd; ++D) { 2492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isFieldDesignator()) { 2493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getField(D->getFieldName(), 2494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getDotLoc(), 2495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getFieldLoc())); 2496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 2497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (D->isArrayDesignator()) { 2500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D)); 2501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Index.isInvalid()) 2502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2503b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2504b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getArray(Index.get(), 2505b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc())); 2506b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2507b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D); 2508b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Index.release()); 2509b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor continue; 2510b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2511b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2512b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(D->isArrayRangeDesignator() && "New kind of designator?"); 2513b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Start 2514b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformExpr(E->getArrayRangeStart(*D)); 2515b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Start.isInvalid()) 2516b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2517b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2518b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D)); 2519b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (End.isInvalid()) 2520b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2521b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2522b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Desig.AddDesignator(Designator::getArrayRange(Start.get(), 2523b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get(), 2524b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getLBracketLoc(), 2525b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor D->getEllipsisLoc())); 2526b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2527b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) || 2528b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor End.get() != E->getArrayRangeEnd(*D); 2529b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2530b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(Start.release()); 2531b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArrayExprs.push_back(End.release()); 2532b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2533b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2534b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2535b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Init.get() == E->getInit() && 2536b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ExprChanged) 2537b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2538b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2539b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs), 2540b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getEqualOrColonLoc(), 2541b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->usesGNUSyntax(), move(Init)); 2542b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2543b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2544b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2545b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2546b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformImplicitValueInitExpr( 2547b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ImplicitValueInitExpr *E) { 2548b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 2549b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 2550b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2551b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2552b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2553b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 2554b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2555b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2556b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildImplicitValueInitExpr(T); 2557b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2558b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2559b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2560b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2561b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) { 2562b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we want the type as written? 2563b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T; 2564b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2565b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 2566b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 2567b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 2568b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T = getDerived().TransformType(E->getType()); 2569b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 2570b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2571b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2572b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2573b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2574b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2575b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2576b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2577b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2578b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 2579b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 2580b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2581b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2582b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr), 2583b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, E->getRParenLoc()); 2584b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2585b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2586b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2587b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2588b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) { 2589b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 2590b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef); 2591b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) { 2592b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I)); 2593b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Init.isInvalid()) 2594b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2595b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2596b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I); 2597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Inits.push_back(Init.takeAs<Expr>()); 2598b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2599b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2600b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildParenListExpr(E->getLParenLoc(), 2601b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Inits), 2602b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 2603b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2604b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2605b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform an address-of-label expression. 2606b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 2607b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// By default, the transformation of an address-of-label expression always 2608b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// rebuilds the expression, so that the label identifier can be resolved to 2609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the corresponding label statement by semantic analysis. 2610b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2611b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2612b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) { 2613b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(), 2614b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLabel()); 2615b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2616b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2617b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2618b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) { 2619b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningStmtResult SubStmt 2620b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformCompoundStmt(E->getSubStmt(), true); 2621b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubStmt.isInvalid()) 2622b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2623b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2624b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2625b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubStmt.get() == E->getSubStmt()) 2626b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2627b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2628b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildStmtExpr(E->getLParenLoc(), 2629b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubStmt), 2630b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 2631b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2632b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2633b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2634b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2635b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) { 2636b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T1, T2; 2637b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 2638b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 2639b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName()); 2640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2641b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 = getDerived().TransformType(E->getArgType1()); 2642b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T1.isNull()) 2643b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2644b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2645b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 = getDerived().TransformType(E->getArgType2()); 2646b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T2.isNull()) 2647b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2648b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2649b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2650b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2651b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1 == E->getArgType1() && 2652b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T2 == E->getArgType2()) 2653b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2654b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2655b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(), 2656b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T1, T2, E->getRParenLoc()); 2657b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2659b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2660b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2661b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) { 2662b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Cond = getDerived().TransformExpr(E->getCond()); 2663b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Cond.isInvalid()) 2664b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2665b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2666b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult LHS = getDerived().TransformExpr(E->getLHS()); 2667b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (LHS.isInvalid()) 2668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2669b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2670b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult RHS = getDerived().TransformExpr(E->getRHS()); 2671b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (RHS.isInvalid()) 2672b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2673b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2674b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2675b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Cond.get() == E->getCond() && 2676b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor LHS.get() == E->getLHS() && 2677b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor RHS.get() == E->getRHS()) 2678b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2679b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2680b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildChooseExpr(E->getBuiltinLoc(), 2681b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Cond), move(LHS), move(RHS), 2682b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 2683b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2684b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2685b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2686b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2687b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) { 2688b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2689b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2690b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2691b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2692b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2693b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) { 2694b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Callee = getDerived().TransformExpr(E->getCallee()); 2695b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Callee.isInvalid()) 2696b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2697b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2698b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult First = getDerived().TransformExpr(E->getArg(0)); 2699b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (First.isInvalid()) 2700b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2701b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2702b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Second(SemaRef); 2703b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->getNumArgs() == 2) { 2704b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second = getDerived().TransformExpr(E->getArg(1)); 2705b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Second.isInvalid()) 2706b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2707b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2708b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2709b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2710b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Callee.get() == E->getCallee() && 2711b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.get() == E->getArg(0) && 2712b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor (E->getNumArgs() != 2 || Second.get() == E->getArg(1))) 2713b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2714b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2715b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(), 2716b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 2717b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Callee), 2718b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(First), 2719b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Second)); 2720b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2721b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2722b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2723b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2724b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) { 2725b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCallExpr(E); 2726b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2727b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2728b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2729b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2730b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) { 2731b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 2732b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 2733b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Source location isn't quite accurate. 2734b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation TypeStartLoc 2735b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 2736b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName()); 2737b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2738b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 2739b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 2740b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2741b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2742b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2743b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2744b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2745b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2746b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2747b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2748b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 2749b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 2750b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2751b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2752b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Poor source location information here. 2753b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLAngleLoc 2754b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc()); 2755b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin(); 2756b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeRParenLoc 2757b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken( 2758b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getSubExpr()->getSourceRange().getEnd()); 2759b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(), 2760b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getStmtClass(), 2761b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeLAngleLoc, 2762b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 2763b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 2764b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRAngleLoc, 2765b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 2766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeRParenLoc); 2767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) { 2772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 2773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) { 2778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 2779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXReinterpretCastExpr( 2784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXReinterpretCastExpr *E) { 2785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 2786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) { 2791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().TransformCXXNamedCastExpr(E); 2792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXFunctionalCastExpr( 2797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXFunctionalCastExpr *E) { 2798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType ExplicitTy; 2799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor { 2800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 2801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy = getDerived().TransformType(E->getTypeAsWritten()); 2803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ExplicitTy.isNull()) 2804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy == E->getTypeAsWritten() && 2813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 2814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: The end of the type's source range is wrong 2817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXFunctionalCastExpr( 2818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(E->getTypeBeginLoc()), 2819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExplicitTy, 2820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getSubExpr()->getLocStart(), 2821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 2822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 2823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) { 2828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (E->isTypeOperand()) { 2829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 2830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeOperand()); 2832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 2833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeOperand()) 2837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 2840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 2841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 2842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 2843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // We don't know whether the expression is potentially evaluated until 2846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // after we perform semantic analysis, so the expression is potentially 2847b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // potentially evaluated. 2848b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EnterExpressionEvaluationContext Unevaluated(SemaRef, 2849b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Action::PotentiallyPotentiallyEvaluated); 2850b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2851b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand()); 2852b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2853b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2854b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2855b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2856b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getExprOperand()) 2857b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2858b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2859b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTypeidExpr(E->getLocStart(), 2860b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 2861b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(SubExpr), 2862b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 2863b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2864b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2865b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2866b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2867b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { 2868b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2869b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2870b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2871b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2872b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2873b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNullPtrLiteralExpr( 2874b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXNullPtrLiteralExpr *E) { 2875b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2876b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2877b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2878b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2879b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2880b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) { 2881b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 2882b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2883b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 2884b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 2885b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2886b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2887b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2888b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 2889b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2890b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2891b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThisExpr(E->getLocStart(), T); 2892b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2893b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2894b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2895b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2896b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) { 2897b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 2898b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 2899b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2900b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2901b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2902b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExpr.get() == E->getSubExpr()) 2903b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2904b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2905b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr)); 2906b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2907b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2908b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2909b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2910b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) { 2911b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ParmVarDecl *Param 2912b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam())); 2913b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Param) 2914b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2915b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2916b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (getDerived().AlwaysRebuild() && 2917b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Param == E->getParam()) 2918b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2919b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2920b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDefaultArgExpr(Param); 2921b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2922b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2923b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2924b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2925b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { 2926b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 2927b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2928b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 2929b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 2930b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2931b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2932b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2933b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType()) 2934b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2935b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2936b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(), 2937b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 2938b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 2939b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 2940b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2941b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2942b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2943b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2944b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) { 2945b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor VarDecl *Var 2946b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<VarDecl>(getDerived().TransformDecl(E->getVarDecl())); 2947b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Var) 2948b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2949b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2950b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2951b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var == E->getVarDecl()) 2952b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 2953b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2954b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(), 2955b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getStartLoc(), 2956b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Var); 2957b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 2958b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2959b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 2960b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 2961b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) { 2962b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the type that we're allocating 2963b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName()); 2964b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType AllocType = getDerived().TransformType(E->getAllocatedType()); 2965b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (AllocType.isNull()) 2966b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2967b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2968b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the size of the array we're allocating (if any). 2969b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize()); 2970b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (ArraySize.isInvalid()) 2971b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2972b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2973b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the placement arguments (if any). 2974b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 2975b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef); 2976b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) { 2977b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I)); 2978b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 2979b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2980b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2981b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I); 2982b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor PlacementArgs.push_back(Arg.take()); 2983b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2984b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2985b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Instantiate the constructor arguments (if any). 2986b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef); 2987b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) { 2988b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I)); 2989b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Arg.isInvalid()) 2990b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 2991b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2992b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I); 2993b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ConstructorArgs.push_back(Arg.take()); 2994b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 2995b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 2996b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 2997b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType == E->getAllocatedType() && 2998b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArraySize.get() == E->getArraySize() && 2999b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 3000b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3001b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3002b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXNewExpr(E->getLocStart(), 3003b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalNew(), 3004b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3005b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(PlacementArgs), 3006b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3007b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isParenTypeId(), 3008b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor AllocType, 3009b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3010b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/SourceRange(), 3011b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(ArraySize), 3012b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getLocStart(), 3013b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(ConstructorArgs), 3014b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 3015b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3016b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3017b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3018b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3019b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) { 3020b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Operand = getDerived().TransformExpr(E->getArgument()); 3021b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Operand.isInvalid()) 3022b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3023b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3024b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3025b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Operand.get() == E->getArgument()) 3026b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3027b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3028b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXDeleteExpr(E->getLocStart(), 3029b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isGlobalDelete(), 3030b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrayForm(), 3031b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move(Operand)); 3032b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3033b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3034b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3035b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3036b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedFunctionNameExpr( 3037b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnresolvedFunctionNameExpr *E) { 3038b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // There is no transformation we can apply to an unresolved function name. 3039b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3040b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3041b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3042b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3043b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3044b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) { 3045b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 3046b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3047b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getQueriedType()); 3048b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3049b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3050b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3051b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3052b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getQueriedType()) 3053b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3054b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3055b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bad location information 3056b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation FakeLParenLoc 3057b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(E->getLocStart()); 3058b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3059b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnaryTypeTrait(E->getTrait(), 3060b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocStart(), 3061b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/FakeLParenLoc, 3062b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 3063b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 3064b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3065b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3066b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3067b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3068b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) { 3069b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 3070b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3071b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange()); 3072b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 3073b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3074b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3075b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NamedDecl *ND 3076b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl())); 3077b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!ND) 3078b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3079b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3080b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3081b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NNS == E->getQualifier() && 3082b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ND == E->getDecl()) 3083b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3084b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3085b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildQualifiedDeclRefExpr(NNS, 3086b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange(), 3087b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ND, 3088b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocation(), 3089b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 3090b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3091b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3092b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3093b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3094b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformUnresolvedDeclRefExpr( 3095b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnresolvedDeclRefExpr *E) { 3096b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NestedNameSpecifier *NNS 3097b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformNestedNameSpecifier(E->getQualifier(), 3098b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange()); 3099b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!NNS) 3100b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3101b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3102b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Transform the declaration name 3103b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name = E->getDeclName(); 3104b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3105b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3106b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor NNS == E->getQualifier() && 3107b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name == E->getDeclName()) 3108b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3109b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3110b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildUnresolvedDeclRefExpr(NNS, 3111b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getQualifierRange(), 3112b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name, 3113b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocation(), 3114b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/false); 3115b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3116b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3117b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3118b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3119b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) { 3120b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateName Template 3121b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformTemplateName(E->getTemplateName()); 3122b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Template.isNull()) 3123b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3124b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3125b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<TemplateArgument, 4> TransArgs; 3126b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) { 3127b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemplateArgument TransArg 3128b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]); 3129b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isNull()) 3130b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3131b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3132b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.push_back(TransArg); 3133b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3134b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3135b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Would like to avoid rebuilding if nothing changed, but we can't 3136b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // compare template arguments (yet). 3137b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3138b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: It's possible that we'll find out now that the template name 3139b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // actually refers to a type, in which case the caller is actually dealing 3140b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // with a functional cast. Give a reasonable error message! 3141b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildTemplateIdExpr(Template, E->getTemplateNameLoc(), 3142b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLAngleLoc(), 3143b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.data(), 3144b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TransArgs.size(), 3145b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRAngleLoc()); 3146b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3147b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3148b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3149b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3150b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) { 3151b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName()); 3152b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3153b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3154b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3155b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3156b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3157b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 3158b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 3159b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 3160b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 3161b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3162b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3163b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 3164b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3165b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(), 3166b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 3167b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 3168b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 3169b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 3170b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3171b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3172b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 3173b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 3174b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3175b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3176b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3177b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3178b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 3179b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 3180b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3181b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3182b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(), 3183b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args)); 3184b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3185b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3186b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ temporary-binding expression. 3187b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 3188b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// The transformation of a temporary-binding expression always attempts to 3189b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// bind a new temporary variable to its subexpression, even if the 3190b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because the temporary variable itself 3191b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// must be unique. 3192b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3193b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3194b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) { 3195b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3196b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3197b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3198b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3199b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>()); 3200b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3201b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3202b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// \brief Transform a C++ expression that contains temporaries that should 3203b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// be destroyed after the expression is evaluated. 3204b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// 3205b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// The transformation of a full expression always attempts to build a new 3206b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// CXXExprWithTemporaries expression, even if the 3207b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// subexpression itself did not change, because it will need to capture the 3208b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor/// the new temporary variables introduced in the subexpression. 3209b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3210b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3211b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXExprWithTemporaries( 3212b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXExprWithTemporaries *E) { 3213b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr()); 3214b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3215b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3216b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3217b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned( 3218b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(), 3219b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->shouldDestroyTemporaries())); 3220b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3221b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3222b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3223b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3224b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXTemporaryObjectExpr( 3225b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXTemporaryObjectExpr *E) { 3226b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 3227b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getType()); 3228b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3229b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3230b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3231b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXConstructorDecl *Constructor 3232b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<CXXConstructorDecl>( 3233b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getConstructor())); 3234b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Constructor) 3235b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3236b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3237b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 3238b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3239b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.reserve(E->getNumArgs()); 3240b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(), 3241b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 3242b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 3243b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 3244b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 3245b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3246b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3247b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 3248b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back((Expr *)TransArg.release()); 3249b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3250b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3251b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3252b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getType() && 3253b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Constructor == E->getConstructor() && 3254b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 3255b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3256b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3257b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Bogus location information 3258b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation CommaLoc; 3259b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Args.size() > 1) { 3260b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *First = (Expr *)Args[0]; 3261b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CommaLoc 3262b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd()); 3263b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3264b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(), 3265b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 3266b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getTypeBeginLoc(), 3267b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3268b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor &CommaLoc, 3269b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLocEnd()); 3270b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3271b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3272b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3273b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3274b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedConstructExpr( 3275b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXUnresolvedConstructExpr *E) { 3276b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName()); 3277b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType T = getDerived().TransformType(E->getTypeAsWritten()); 3278b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (T.isNull()) 3279b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3280b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3281b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 3282b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef); 3283b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor llvm::SmallVector<SourceLocation, 8> FakeCommaLocs; 3284b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(), 3285b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgEnd = E->arg_end(); 3286b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Arg != ArgEnd; ++Arg) { 3287b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult TransArg = getDerived().TransformExpr(*Arg); 3288b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (TransArg.isInvalid()) 3289b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3290b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3291b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg; 3292b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.push_back( 3293b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd())); 3294b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Args.push_back(TransArg.takeAs<Expr>()); 3295b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3296b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3297b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3298b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T == E->getTypeAsWritten() && 3299b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 3300b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3301b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3302b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: we're faking the locations of the commas 3303b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(), 3304b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor T, 3305b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getLParenLoc(), 3306b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(Args), 3307b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FakeCommaLocs.data(), 3308b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3309b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3310b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3311b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3312b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3313b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformCXXUnresolvedMemberExpr( 3314b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor CXXUnresolvedMemberExpr *E) { 3315b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Transform the base of the expression. 3316b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Base = getDerived().TransformExpr(E->getBase()); 3317b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Base.isInvalid()) 3318b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3319b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3320b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Transform the declaration name 3321b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName Name = E->getMember(); 3322b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3323b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3324b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Base.get() == E->getBase() && 3325b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Name == E->getMember()) 3326b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3327b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3328b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base), 3329b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->isArrow(), 3330b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getOperatorLoc(), 3331b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMember(), 3332b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getMemberLoc()); 3333b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3334b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3335b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3336b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3337b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) { 3338b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3339b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3340b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3341b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3342b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3343b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) { 3344b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: poor source location 3345b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName()); 3346b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor QualType EncodedType = getDerived().TransformType(E->getEncodedType()); 3347b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (EncodedType.isNull()) 3348b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3349b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3350b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3351b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType == E->getEncodedType()) 3352b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3353b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3354b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(), 3355b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor EncodedType, 3356b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3357b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3358b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3359b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3360b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3361b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) { 3362b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 3363b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 3364b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3365b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3366b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3367b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3368b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3369b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) { 3370b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3371b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3372b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3373b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3374b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3375b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) { 3376b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ObjCProtocolDecl *Protocol 3377b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast_or_null<ObjCProtocolDecl>( 3378b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().TransformDecl(E->getProtocol())); 3379b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!Protocol) 3380b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3381b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3382b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3383b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Protocol == E->getProtocol()) 3384b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3385b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3386b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildObjCProtocolExpr(Protocol, 3387b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getAtLoc(), 3388b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 3389b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor /*FIXME:*/E->getAtLoc(), 3390b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3391b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3392b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3393b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3394b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3395b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3396b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) { 3397b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 3398b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 3399b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3400b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3401b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3402b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3403b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3404b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) { 3405b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 3406b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 3407b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3408b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3409b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3410b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3411b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3412154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz JahanianTreeTransform<Derived>::TransformObjCImplctSetterGetterRefExpr( 3413154440e6a8fa6ac5bca395876d79b530b39a2c1cFariborz Jahanian ObjCImplctSetterGetterRefExpr *E) { 3414b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 3415b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 3416b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3417b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3418b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3419b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3420b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3421b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) { 3422b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 3423b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 3424b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3425b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3426b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3427b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3428b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3429b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) { 3430b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 3431b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform Objective-C expressions yet"); 3432b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3433b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3434b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3435b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3436b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3437b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) { 3438b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool ArgumentChanged = false; 3439b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef); 3440b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) { 3441b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I)); 3442b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SubExpr.isInvalid()) 3443b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3444b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3445b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I); 3446b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SubExprs.push_back(SubExpr.takeAs<Expr>()); 3447b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3448b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3449b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!getDerived().AlwaysRebuild() && 3450b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !ArgumentChanged) 3451b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3452b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3453b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(), 3454b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor move_arg(SubExprs), 3455b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor E->getRParenLoc()); 3456b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3457b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3458b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3459b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3460b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) { 3461b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 3462b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block expressions yet"); 3463b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3464b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3465b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3466b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3467b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3468b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) { 3469b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Implement this! 3470b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor assert(false && "Cannot transform block-related expressions yet"); 3471b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.Owned(E->Retain()); 3472b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3473b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3474b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 3475b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor// Type reconstruction 3476b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor//===----------------------------------------------------------------------===// 3477b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3478b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3479b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) { 3480b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.BuildPointerType(PointeeType, 0, 3481b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 3482b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 3483b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3484b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3485b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3486b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) { 3487b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.BuildBlockPointerType(PointeeType, 0, 3488b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 3489b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 3490b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3491b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3492b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3493b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType 3494b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) { 3495b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.BuildReferenceType(ReferentType, true, 0, 3496b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseLocation(), 3497b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor getDerived().getBaseEntity()); 3498b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3499b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3500b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3501b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType 3502b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) { 3503577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildReferenceType(ReferentType, false, 0, 3504577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 3505577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 3506577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3507577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3508577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3509577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType, 3510577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ClassType) { 3511577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildMemberPointerType(PointeeType, ClassType, 0, 3512577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 3513577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 3514577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3515577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3516577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3517577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 3518577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildArrayType(QualType ElementType, 3519577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 3520577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt *Size, 3521577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 3522577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 3523577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 3524577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeExpr || !Size) 3525577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr, 3526577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 3527577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 3528577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3529577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType Types[] = { 3530577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy, 3531577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy, 3532577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty 3533577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor }; 3534577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const unsigned NumTypes = sizeof(Types) / sizeof(QualType); 3535577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType SizeType; 3536577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor for (unsigned I = 0; I != NumTypes; ++I) 3537577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) { 3538577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = Types[I]; 3539577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor break; 3540577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor } 3541577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3542577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor if (SizeType.isNull()) 3543577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false); 3544577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3545577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin()); 3546577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize, 3547577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange, 3548577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 3549577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3550577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3551577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3552577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 3553577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType, 3554577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 3555577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 3556577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals) { 3557577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 3558577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, SourceRange()); 3559577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3560577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3561577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3562577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 3563577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayWithExprType(QualType ElementType, 3564577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 3565577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 3566577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Expr *SizeExpr, 3567577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 3568577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 3569577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr, 3570577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 3571577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3572577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3573577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3574577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 3575577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildConstantArrayWithoutExprType( 3576577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType ElementType, 3577577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 3578577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const llvm::APInt &Size, 3579577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals) { 3580577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0, 3581577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, SourceRange()); 3582577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3583577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3584577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3585577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 3586577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType, 3587577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 3588577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals) { 3589577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0, 3590577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, SourceRange()); 3591577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3592577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3593577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3594577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 3595577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType, 3596577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 3597b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 3598577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 3599577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 3600577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 3601577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 3602577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 3603577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3604577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3605577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3606577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 3607577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType, 3608577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor ArrayType::ArraySizeModifier SizeMod, 3609b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 3610577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned IndexTypeQuals, 3611577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceRange BracketsRange) { 3612577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 3613577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SizeExpr.takeAs<Expr>(), 3614577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IndexTypeQuals, BracketsRange); 3615577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3616577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3617577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3618577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType, 3619577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements) { 3620577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: semantic checking! 3621577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getVectorType(ElementType, NumElements); 3622577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3623577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3624577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3625577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType, 3626577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumElements, 3627577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 3628577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy), 3629577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor NumElements, true); 3630577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor IntegerLiteral *VectorSize 3631577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy, 3632577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 3633577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize), 3634577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor AttributeLoc); 3635577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3636577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3637577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3638577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType 3639577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorTreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType, 3640b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg SizeExpr, 3641577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation AttributeLoc) { 3642577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc); 3643577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3644577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3645577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3646577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T, 3647577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor QualType *ParamTypes, 3648577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumParamTypes, 3649577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor bool Variadic, 3650577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned Quals) { 3651577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic, 3652577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor Quals, 3653577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseLocation(), 3654577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor getDerived().getBaseEntity()); 3655577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3656577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3657577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3658b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) { 3659577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildTypeofExprType(E.takeAs<Expr>()); 3660577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3661577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3662577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3663577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) { 3664577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.Context.getTypeOfType(Underlying); 3665577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3666577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3667577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3668b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorQualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) { 3669577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.BuildDecltypeType(E.takeAs<Expr>()); 3670577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3671577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3672577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregortemplate<typename Derived> 3673577f75a7498e9e2536434da0ef0da0eea390d18bDouglas GregorQualType TreeTransform<Derived>::RebuildTemplateSpecializationType( 3674577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor TemplateName Template, 3675577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor const TemplateArgument *Args, 3676577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor unsigned NumArgs) { 3677577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor // FIXME: Missing source locations for the template name, <, >. 3678577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(), 3679577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation(), Args, NumArgs, 3680577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor SourceLocation()); 3681577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} 3682577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3683dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 3684dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 3685dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 3686dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 3687dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor IdentifierInfo &II) { 3688dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor CXXScopeSpec SS; 3689dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor // FIXME: The source location information is all wrong. 3690dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setRange(Range); 3691dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SS.setScopeRep(Prefix); 3692dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return static_cast<NestedNameSpecifier *>( 3693dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.ActOnCXXNestedNameSpecifier(0, SS, Range.getEnd(), 3694dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor Range.getEnd(), II)); 3695dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 3696dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 3697dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 3698dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 3699dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 3700dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 3701dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor NamespaceDecl *NS) { 3702dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS); 3703dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 3704dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 3705dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregortemplate<typename Derived> 3706dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorNestedNameSpecifier * 3707dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas GregorTreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix, 3708dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SourceRange Range, 3709dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor bool TemplateKW, 3710dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor QualType T) { 3711dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor if (T->isDependentType() || T->isRecordType() || 3712dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) { 3713dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor assert(T.getCVRQualifiers() == 0 && "Can't get cv-qualifiers here"); 3714dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW, 3715dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor T.getTypePtr()); 3716dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor } 3717dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 3718dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T; 3719dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor return 0; 3720dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor} 3721dcee1a12c83a6cbc9b5bf42df5d4efbc502664e7Douglas Gregor 3722d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 3723d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName 3724d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 3725d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 3726d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateDecl *Template) { 3727d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, 3728d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Template); 3729d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 3730d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 3731d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 3732d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName 3733d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 3734d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor bool TemplateKW, 3735d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor OverloadedFunctionDecl *Ovl) { 3736d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl); 3737d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 3738d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 3739d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregortemplate<typename Derived> 3740d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTemplateName 3741d1067e5a0a6e2aee7260c392452df9553034c92bDouglas GregorTreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier, 3742d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor const IdentifierInfo &II) { 3743d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (Qualifier->isDependent()) 3744d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return SemaRef.Context.getDependentTemplateName(Qualifier, &II); 3745d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 3746d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor // Somewhat redundant with ActOnDependentTemplateName. 3747d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor CXXScopeSpec SS; 3748d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setRange(SourceRange(getDerived().getBaseLocation())); 3749d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SS.setScopeRep(Qualifier); 3750d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor Sema::TemplateTy Template; 3751d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor TemplateNameKind TNK = SemaRef.isTemplateName(II, 0, Template, &SS); 3752d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor if (TNK == TNK_Non_template) { 3753d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SemaRef.Diag(getDerived().getBaseLocation(), 3754d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor diag::err_template_kw_refers_to_non_template) 3755d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor << &II; 3756d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 3757d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } else if (TNK == TNK_Function_template) { 3758d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor SemaRef.Diag(getDerived().getBaseLocation(), 3759d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor diag::err_template_kw_refers_to_non_template) 3760d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor << &II; 3761d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return TemplateName(); 3762d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor } 3763d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 3764d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor return Template.getAsVal<TemplateName>(); 3765d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor} 3766b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3767b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregortemplate<typename Derived> 3768b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorSema::OwningExprResult 3769b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas GregorTreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op, 3770b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SourceLocation OpLoc, 3771b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Callee, 3772b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg First, 3773b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor ExprArg Second) { 3774b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *FirstExpr = (Expr *)First.get(); 3775b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *SecondExpr = (Expr *)Second.get(); 3776b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus); 3777b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3778b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Determine whether this should be a builtin operation. 3779b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (SecondExpr == 0 || isPostIncDec) { 3780b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType()) { 3781b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // The argument is not of overloadable type, so try to create a 3782b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // built-in unary operation. 3783b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc 3784b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 3785b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3786b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First)); 3787b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3788b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } else { 3789b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (!FirstExpr->getType()->isOverloadableType() && 3790b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor !SecondExpr->getType()->isOverloadableType()) { 3791b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Neither of the arguments is an overloadable type, so try to 3792b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // create a built-in binary operation. 3793b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op); 3794b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 3795b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr); 3796b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 3797b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3798b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3799b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 3800b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 3801b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 3802b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3803b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3804b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3805b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Compute the transformed set of functions (and function templates) to be 3806b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // used during overload resolution. 3807b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Sema::FunctionSet Functions; 3808b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3809b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclRefExpr *DRE = cast<DeclRefExpr>((Expr *)Callee.get()); 3810b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OverloadedFunctionDecl *Overloads 3811b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = cast<OverloadedFunctionDecl>(DRE->getDecl()); 3812b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3813b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // FIXME: Do we have to check 3814b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // IsAcceptableNonMemberOperatorCandidate for each of these? 3815b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor for (OverloadedFunctionDecl::function_iterator 3816b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor F = Overloads->function_begin(), 3817b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor FEnd = Overloads->function_end(); 3818b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor F != FEnd; ++F) 3819b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Functions.insert(*F); 3820b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3821b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Add any functions found via argument-dependent lookup. 3822b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Expr *Args[2] = { FirstExpr, SecondExpr }; 3823b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor unsigned NumArgs = 1 + (SecondExpr != 0); 3824b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor DeclarationName OpName 3825b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op); 3826b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions); 3827b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3828b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for unary operators. 3829b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (NumArgs == 1 || isPostIncDec) { 3830b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor UnaryOperator::Opcode Opc 3831b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec); 3832b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First)); 3833b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor } 3834b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3835b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor // Create the overloaded operator invocation for binary operators. 3836b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::Opcode Opc = 3837b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor BinaryOperator::getOverloadedOpcode(Op); 3838b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor OwningExprResult Result 3839b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]); 3840b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor if (Result.isInvalid()) 3841b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return SemaRef.ExprError(); 3842b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor 3843b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor First.release(); 3844b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor Second.release(); 3845b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor return move(Result); 3846b98b1991c7ad1eaedb863bdbdd784ec164277675Douglas Gregor} 3847d1067e5a0a6e2aee7260c392452df9553034c92bDouglas Gregor 3848577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor} // end namespace clang 3849577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor 3850577f75a7498e9e2536434da0ef0da0eea390d18bDouglas Gregor#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H 3851