blob: fb0e2b1ae9baf8db36c88aa5bc19de25ffd61c14 [file] [log] [blame]
Douglas Gregord6ff3322009-08-04 16:50:30 +00001//===------- TreeTransform.h - Semantic Tree Transformation ---------------===/
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//===----------------------------------------------------------------------===/
8//
9// This file implements a semantic tree transformation that takes a given
10// AST and rebuilds it, possibly transforming some nodes in the process.
11//
12//===----------------------------------------------------------------------===/
13#ifndef LLVM_CLANG_SEMA_TREETRANSFORM_H
14#define LLVM_CLANG_SEMA_TREETRANSFORM_H
15
16#include "Sema.h"
Douglas Gregor1135c352009-08-06 05:28:30 +000017#include "clang/Sema/SemaDiagnostic.h"
Douglas Gregor2b6ca462009-09-03 21:38:09 +000018#include "clang/AST/Decl.h"
Douglas Gregor766b0bb2009-08-06 22:17:10 +000019#include "clang/AST/Expr.h"
Douglas Gregora16548e2009-08-11 05:31:07 +000020#include "clang/AST/ExprCXX.h"
21#include "clang/AST/ExprObjC.h"
Douglas Gregorebe10102009-08-20 07:17:43 +000022#include "clang/AST/Stmt.h"
23#include "clang/AST/StmtCXX.h"
24#include "clang/AST/StmtObjC.h"
Douglas Gregora16548e2009-08-11 05:31:07 +000025#include "clang/Parse/Ownership.h"
26#include "clang/Parse/Designator.h"
27#include "clang/Lex/Preprocessor.h"
Douglas Gregord6ff3322009-08-04 16:50:30 +000028#include <algorithm>
29
30namespace clang {
Mike Stump11289f42009-09-09 15:08:12 +000031
Douglas Gregord6ff3322009-08-04 16:50:30 +000032/// \brief A semantic tree transformation that allows one to transform one
33/// abstract syntax tree into another.
34///
Mike Stump11289f42009-09-09 15:08:12 +000035/// A new tree transformation is defined by creating a new subclass \c X of
36/// \c TreeTransform<X> and then overriding certain operations to provide
37/// behavior specific to that transformation. For example, template
Douglas Gregord6ff3322009-08-04 16:50:30 +000038/// instantiation is implemented as a tree transformation where the
39/// transformation of TemplateTypeParmType nodes involves substituting the
40/// template arguments for their corresponding template parameters; a similar
41/// transformation is performed for non-type template parameters and
42/// template template parameters.
43///
44/// This tree-transformation template uses static polymorphism to allow
Mike Stump11289f42009-09-09 15:08:12 +000045/// subclasses to customize any of its operations. Thus, a subclass can
Douglas Gregord6ff3322009-08-04 16:50:30 +000046/// override any of the transformation or rebuild operators by providing an
47/// operation with the same signature as the default implementation. The
48/// overridding function should not be virtual.
49///
50/// Semantic tree transformations are split into two stages, either of which
51/// can be replaced by a subclass. The "transform" step transforms an AST node
52/// or the parts of an AST node using the various transformation functions,
53/// then passes the pieces on to the "rebuild" step, which constructs a new AST
54/// node of the appropriate kind from the pieces. The default transformation
55/// routines recursively transform the operands to composite AST nodes (e.g.,
56/// the pointee type of a PointerType node) and, if any of those operand nodes
57/// were changed by the transformation, invokes the rebuild operation to create
58/// a new AST node.
59///
Mike Stump11289f42009-09-09 15:08:12 +000060/// Subclasses can customize the transformation at various levels. The
Douglas Gregore922c772009-08-04 22:27:00 +000061/// most coarse-grained transformations involve replacing TransformType(),
Douglas Gregord6ff3322009-08-04 16:50:30 +000062/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
63/// TransformTemplateName(), or TransformTemplateArgument() with entirely
64/// new implementations.
65///
66/// For more fine-grained transformations, subclasses can replace any of the
67/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
Douglas Gregorebe10102009-08-20 07:17:43 +000068/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
Douglas Gregord6ff3322009-08-04 16:50:30 +000069/// replacing TransformTemplateTypeParmType() allows template instantiation
Mike Stump11289f42009-09-09 15:08:12 +000070/// to substitute template arguments for their corresponding template
Douglas Gregord6ff3322009-08-04 16:50:30 +000071/// parameters. Additionally, subclasses can override the \c RebuildXXX
72/// functions to control how AST nodes are rebuilt when their operands change.
73/// By default, \c TreeTransform will invoke semantic analysis to rebuild
74/// AST nodes. However, certain other tree transformations (e.g, cloning) may
75/// be able to use more efficient rebuild steps.
76///
77/// There are a handful of other functions that can be overridden, allowing one
Mike Stump11289f42009-09-09 15:08:12 +000078/// to avoid traversing nodes that don't need any transformation
Douglas Gregord6ff3322009-08-04 16:50:30 +000079/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
80/// operands have not changed (\c AlwaysRebuild()), and customize the
81/// default locations and entity names used for type-checking
82/// (\c getBaseLocation(), \c getBaseEntity()).
Douglas Gregord6ff3322009-08-04 16:50:30 +000083template<typename Derived>
84class TreeTransform {
85protected:
86 Sema &SemaRef;
Mike Stump11289f42009-09-09 15:08:12 +000087
88public:
Douglas Gregora16548e2009-08-11 05:31:07 +000089 typedef Sema::OwningStmtResult OwningStmtResult;
90 typedef Sema::OwningExprResult OwningExprResult;
91 typedef Sema::StmtArg StmtArg;
92 typedef Sema::ExprArg ExprArg;
93 typedef Sema::MultiExprArg MultiExprArg;
Douglas Gregorebe10102009-08-20 07:17:43 +000094 typedef Sema::MultiStmtArg MultiStmtArg;
Mike Stump11289f42009-09-09 15:08:12 +000095
Douglas Gregord6ff3322009-08-04 16:50:30 +000096 /// \brief Initializes a new tree transformer.
97 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
Mike Stump11289f42009-09-09 15:08:12 +000098
Douglas Gregord6ff3322009-08-04 16:50:30 +000099 /// \brief Retrieves a reference to the derived class.
100 Derived &getDerived() { return static_cast<Derived&>(*this); }
101
102 /// \brief Retrieves a reference to the derived class.
Mike Stump11289f42009-09-09 15:08:12 +0000103 const Derived &getDerived() const {
104 return static_cast<const Derived&>(*this);
Douglas Gregord6ff3322009-08-04 16:50:30 +0000105 }
106
107 /// \brief Retrieves a reference to the semantic analysis object used for
108 /// this tree transform.
109 Sema &getSema() const { return SemaRef; }
Mike Stump11289f42009-09-09 15:08:12 +0000110
Douglas Gregord6ff3322009-08-04 16:50:30 +0000111 /// \brief Whether the transformation should always rebuild AST nodes, even
112 /// if none of the children have changed.
113 ///
114 /// Subclasses may override this function to specify when the transformation
115 /// should rebuild all AST nodes.
116 bool AlwaysRebuild() { return false; }
Mike Stump11289f42009-09-09 15:08:12 +0000117
Douglas Gregord6ff3322009-08-04 16:50:30 +0000118 /// \brief Returns the location of the entity being transformed, if that
119 /// information was not available elsewhere in the AST.
120 ///
Mike Stump11289f42009-09-09 15:08:12 +0000121 /// By default, returns no source-location information. Subclasses can
Douglas Gregord6ff3322009-08-04 16:50:30 +0000122 /// provide an alternative implementation that provides better location
123 /// information.
124 SourceLocation getBaseLocation() { return SourceLocation(); }
Mike Stump11289f42009-09-09 15:08:12 +0000125
Douglas Gregord6ff3322009-08-04 16:50:30 +0000126 /// \brief Returns the name of the entity being transformed, if that
127 /// information was not available elsewhere in the AST.
128 ///
129 /// By default, returns an empty name. Subclasses can provide an alternative
130 /// implementation with a more precise name.
131 DeclarationName getBaseEntity() { return DeclarationName(); }
132
Douglas Gregora16548e2009-08-11 05:31:07 +0000133 /// \brief Sets the "base" location and entity when that
134 /// information is known based on another transformation.
135 ///
136 /// By default, the source location and entity are ignored. Subclasses can
137 /// override this function to provide a customized implementation.
138 void setBase(SourceLocation Loc, DeclarationName Entity) { }
Mike Stump11289f42009-09-09 15:08:12 +0000139
Douglas Gregora16548e2009-08-11 05:31:07 +0000140 /// \brief RAII object that temporarily sets the base location and entity
141 /// used for reporting diagnostics in types.
142 class TemporaryBase {
143 TreeTransform &Self;
144 SourceLocation OldLocation;
145 DeclarationName OldEntity;
Mike Stump11289f42009-09-09 15:08:12 +0000146
Douglas Gregora16548e2009-08-11 05:31:07 +0000147 public:
148 TemporaryBase(TreeTransform &Self, SourceLocation Location,
Mike Stump11289f42009-09-09 15:08:12 +0000149 DeclarationName Entity) : Self(Self) {
Douglas Gregora16548e2009-08-11 05:31:07 +0000150 OldLocation = Self.getDerived().getBaseLocation();
151 OldEntity = Self.getDerived().getBaseEntity();
152 Self.getDerived().setBase(Location, Entity);
153 }
Mike Stump11289f42009-09-09 15:08:12 +0000154
Douglas Gregora16548e2009-08-11 05:31:07 +0000155 ~TemporaryBase() {
156 Self.getDerived().setBase(OldLocation, OldEntity);
157 }
158 };
Mike Stump11289f42009-09-09 15:08:12 +0000159
160 /// \brief Determine whether the given type \p T has already been
Douglas Gregord6ff3322009-08-04 16:50:30 +0000161 /// transformed.
162 ///
163 /// Subclasses can provide an alternative implementation of this routine
Mike Stump11289f42009-09-09 15:08:12 +0000164 /// to short-circuit evaluation when it is known that a given type will
Douglas Gregord6ff3322009-08-04 16:50:30 +0000165 /// not change. For example, template instantiation need not traverse
166 /// non-dependent types.
167 bool AlreadyTransformed(QualType T) {
168 return T.isNull();
169 }
170
171 /// \brief Transforms the given type into another type.
172 ///
173 /// By default, this routine transforms a type by delegating to the
Mike Stump11289f42009-09-09 15:08:12 +0000174 /// appropriate TransformXXXType to build a new type, then applying
175 /// the qualifiers on \p T to the resulting type with AddTypeQualifiers.
176 /// Subclasses may override this function (to take over all type
Douglas Gregord6ff3322009-08-04 16:50:30 +0000177 /// transformations), some set of the TransformXXXType functions, or
178 /// the AddTypeQualifiers function to alter the transformation.
179 ///
180 /// \returns the transformed type.
181 QualType TransformType(QualType T);
Mike Stump11289f42009-09-09 15:08:12 +0000182
Douglas Gregord6ff3322009-08-04 16:50:30 +0000183 /// \brief Transform the given type by adding the given set of qualifiers
184 /// and returning the result.
185 ///
186 /// FIXME: By default, this routine adds type qualifiers only to types that
187 /// can have qualifiers, and silently suppresses those qualifiers that are
188 /// not permitted (e.g., qualifiers on reference or function types). This
189 /// is the right thing for template instantiation, but probably not for
190 /// other clients.
John McCall8ccfcb52009-09-24 19:53:00 +0000191 QualType AddTypeQualifiers(QualType T, Qualifiers Qs);
Mike Stump11289f42009-09-09 15:08:12 +0000192
Douglas Gregor766b0bb2009-08-06 22:17:10 +0000193 /// \brief Transform the given statement.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000194 ///
Mike Stump11289f42009-09-09 15:08:12 +0000195 /// By default, this routine transforms a statement by delegating to the
Douglas Gregorebe10102009-08-20 07:17:43 +0000196 /// appropriate TransformXXXStmt function to transform a specific kind of
197 /// statement or the TransformExpr() function to transform an expression.
198 /// Subclasses may override this function to transform statements using some
199 /// other mechanism.
200 ///
201 /// \returns the transformed statement.
Douglas Gregora16548e2009-08-11 05:31:07 +0000202 OwningStmtResult TransformStmt(Stmt *S);
Mike Stump11289f42009-09-09 15:08:12 +0000203
Douglas Gregor766b0bb2009-08-06 22:17:10 +0000204 /// \brief Transform the given expression.
205 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000206 /// By default, this routine transforms an expression by delegating to the
207 /// appropriate TransformXXXExpr function to build a new expression.
208 /// Subclasses may override this function to transform expressions using some
209 /// other mechanism.
210 ///
211 /// \returns the transformed expression.
212 OwningExprResult TransformExpr(Expr *E) {
213 return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false);
214 }
215
216 /// \brief Transform the given expression.
217 ///
218 /// By default, this routine transforms an expression by delegating to the
219 /// appropriate TransformXXXExpr function to build a new expression.
220 /// Subclasses may override this function to transform expressions using some
221 /// other mechanism.
222 ///
223 /// \returns the transformed expression.
224 OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand);
Mike Stump11289f42009-09-09 15:08:12 +0000225
Douglas Gregord6ff3322009-08-04 16:50:30 +0000226 /// \brief Transform the given declaration, which is referenced from a type
227 /// or expression.
228 ///
Douglas Gregor1135c352009-08-06 05:28:30 +0000229 /// By default, acts as the identity function on declarations. Subclasses
230 /// may override this function to provide alternate behavior.
231 Decl *TransformDecl(Decl *D) { return D; }
Douglas Gregorebe10102009-08-20 07:17:43 +0000232
233 /// \brief Transform the definition of the given declaration.
234 ///
Mike Stump11289f42009-09-09 15:08:12 +0000235 /// By default, invokes TransformDecl() to transform the declaration.
Douglas Gregorebe10102009-08-20 07:17:43 +0000236 /// Subclasses may override this function to provide alternate behavior.
237 Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); }
Mike Stump11289f42009-09-09 15:08:12 +0000238
Douglas Gregora5cb6da2009-10-20 05:58:46 +0000239 /// \brief Transform the given declaration, which was the first part of a
240 /// nested-name-specifier in a member access expression.
241 ///
242 /// This specific declaration transformation only applies to the first
243 /// identifier in a nested-name-specifier of a member access expression, e.g.,
244 /// the \c T in \c x->T::member
245 ///
246 /// By default, invokes TransformDecl() to transform the declaration.
247 /// Subclasses may override this function to provide alternate behavior.
248 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
249 return cast_or_null<NamedDecl>(getDerived().TransformDecl(D));
250 }
251
Douglas Gregord6ff3322009-08-04 16:50:30 +0000252 /// \brief Transform the given nested-name-specifier.
253 ///
Mike Stump11289f42009-09-09 15:08:12 +0000254 /// By default, transforms all of the types and declarations within the
Douglas Gregor1135c352009-08-06 05:28:30 +0000255 /// nested-name-specifier. Subclasses may override this function to provide
256 /// alternate behavior.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000257 NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
Douglas Gregorc26e0f62009-09-03 16:14:30 +0000258 SourceRange Range,
Douglas Gregor2b6ca462009-09-03 21:38:09 +0000259 QualType ObjectType = QualType(),
260 NamedDecl *FirstQualifierInScope = 0);
Mike Stump11289f42009-09-09 15:08:12 +0000261
Douglas Gregorf816bd72009-09-03 22:13:48 +0000262 /// \brief Transform the given declaration name.
263 ///
264 /// By default, transforms the types of conversion function, constructor,
265 /// and destructor names and then (if needed) rebuilds the declaration name.
266 /// Identifiers and selectors are returned unmodified. Sublcasses may
267 /// override this function to provide alternate behavior.
268 DeclarationName TransformDeclarationName(DeclarationName Name,
Douglas Gregorc59e5612009-10-19 22:04:39 +0000269 SourceLocation Loc,
270 QualType ObjectType = QualType());
Mike Stump11289f42009-09-09 15:08:12 +0000271
Douglas Gregord6ff3322009-08-04 16:50:30 +0000272 /// \brief Transform the given template name.
Mike Stump11289f42009-09-09 15:08:12 +0000273 ///
Douglas Gregor71dc5092009-08-06 06:41:21 +0000274 /// By default, transforms the template name by transforming the declarations
Mike Stump11289f42009-09-09 15:08:12 +0000275 /// and nested-name-specifiers that occur within the template name.
Douglas Gregor71dc5092009-08-06 06:41:21 +0000276 /// Subclasses may override this function to provide alternate behavior.
Douglas Gregor308047d2009-09-09 00:23:06 +0000277 TemplateName TransformTemplateName(TemplateName Name,
278 QualType ObjectType = QualType());
Mike Stump11289f42009-09-09 15:08:12 +0000279
Douglas Gregord6ff3322009-08-04 16:50:30 +0000280 /// \brief Transform the given template argument.
281 ///
Mike Stump11289f42009-09-09 15:08:12 +0000282 /// By default, this operation transforms the type, expression, or
283 /// declaration stored within the template argument and constructs a
Douglas Gregore922c772009-08-04 22:27:00 +0000284 /// new template argument from the transformed result. Subclasses may
285 /// override this function to provide alternate behavior.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000286 TemplateArgument TransformTemplateArgument(const TemplateArgument &Arg);
Mike Stump11289f42009-09-09 15:08:12 +0000287
Douglas Gregord6ff3322009-08-04 16:50:30 +0000288#define ABSTRACT_TYPE(CLASS, PARENT)
289#define TYPE(CLASS, PARENT) \
290 QualType Transform##CLASS##Type(const CLASS##Type *T);
Mike Stump11289f42009-09-09 15:08:12 +0000291#include "clang/AST/TypeNodes.def"
Douglas Gregord6ff3322009-08-04 16:50:30 +0000292
Douglas Gregorc59e5612009-10-19 22:04:39 +0000293 QualType
294 TransformTemplateSpecializationType(const TemplateSpecializationType *T,
295 QualType ObjectType);
296
Douglas Gregorebe10102009-08-20 07:17:43 +0000297 OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
Mike Stump11289f42009-09-09 15:08:12 +0000298
Douglas Gregorebe10102009-08-20 07:17:43 +0000299#define STMT(Node, Parent) \
300 OwningStmtResult Transform##Node(Node *S);
Douglas Gregora16548e2009-08-11 05:31:07 +0000301#define EXPR(Node, Parent) \
302 OwningExprResult Transform##Node(Node *E);
303#define ABSTRACT_EXPR(Node, Parent)
304#include "clang/AST/StmtNodes.def"
Mike Stump11289f42009-09-09 15:08:12 +0000305
Douglas Gregord6ff3322009-08-04 16:50:30 +0000306 /// \brief Build a new pointer type given its pointee type.
307 ///
308 /// By default, performs semantic analysis when building the pointer type.
309 /// Subclasses may override this routine to provide different behavior.
310 QualType RebuildPointerType(QualType PointeeType);
311
312 /// \brief Build a new block pointer type given its pointee type.
313 ///
Mike Stump11289f42009-09-09 15:08:12 +0000314 /// By default, performs semantic analysis when building the block pointer
Douglas Gregord6ff3322009-08-04 16:50:30 +0000315 /// type. Subclasses may override this routine to provide different behavior.
316 QualType RebuildBlockPointerType(QualType PointeeType);
317
318 /// \brief Build a new lvalue reference type given the type it references.
319 ///
320 /// By default, performs semantic analysis when building the lvalue reference
321 /// type. Subclasses may override this routine to provide different behavior.
322 QualType RebuildLValueReferenceType(QualType ReferentType);
323
324 /// \brief Build a new rvalue reference type given the type it references.
325 ///
326 /// By default, performs semantic analysis when building the rvalue reference
327 /// type. Subclasses may override this routine to provide different behavior.
328 QualType RebuildRValueReferenceType(QualType ReferentType);
Mike Stump11289f42009-09-09 15:08:12 +0000329
Douglas Gregord6ff3322009-08-04 16:50:30 +0000330 /// \brief Build a new member pointer type given the pointee type and the
331 /// class type it refers into.
332 ///
333 /// By default, performs semantic analysis when building the member pointer
334 /// type. Subclasses may override this routine to provide different behavior.
335 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType);
Mike Stump11289f42009-09-09 15:08:12 +0000336
Douglas Gregord6ff3322009-08-04 16:50:30 +0000337 /// \brief Build a new array type given the element type, size
338 /// modifier, size of the array (if known), size expression, and index type
339 /// qualifiers.
340 ///
341 /// By default, performs semantic analysis when building the array type.
342 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000343 /// Also by default, all of the other Rebuild*Array
Douglas Gregord6ff3322009-08-04 16:50:30 +0000344 QualType RebuildArrayType(QualType ElementType,
345 ArrayType::ArraySizeModifier SizeMod,
346 const llvm::APInt *Size,
347 Expr *SizeExpr,
348 unsigned IndexTypeQuals,
349 SourceRange BracketsRange);
Mike Stump11289f42009-09-09 15:08:12 +0000350
Douglas Gregord6ff3322009-08-04 16:50:30 +0000351 /// \brief Build a new constant array type given the element type, size
352 /// modifier, (known) size of the array, and index type qualifiers.
353 ///
354 /// By default, performs semantic analysis when building the array type.
355 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000356 QualType RebuildConstantArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000357 ArrayType::ArraySizeModifier SizeMod,
358 const llvm::APInt &Size,
359 unsigned IndexTypeQuals);
360
Douglas Gregord6ff3322009-08-04 16:50:30 +0000361 /// \brief Build a new incomplete array type given the element type, size
362 /// modifier, and index type qualifiers.
363 ///
364 /// By default, performs semantic analysis when building the array type.
365 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000366 QualType RebuildIncompleteArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000367 ArrayType::ArraySizeModifier SizeMod,
368 unsigned IndexTypeQuals);
369
Mike Stump11289f42009-09-09 15:08:12 +0000370 /// \brief Build a new variable-length array type given the element type,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000371 /// size modifier, size expression, and index type qualifiers.
372 ///
373 /// By default, performs semantic analysis when building the array type.
374 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000375 QualType RebuildVariableArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000376 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +0000377 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000378 unsigned IndexTypeQuals,
379 SourceRange BracketsRange);
380
Mike Stump11289f42009-09-09 15:08:12 +0000381 /// \brief Build a new dependent-sized array type given the element type,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000382 /// size modifier, size expression, and index type qualifiers.
383 ///
384 /// By default, performs semantic analysis when building the array type.
385 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000386 QualType RebuildDependentSizedArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000387 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +0000388 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000389 unsigned IndexTypeQuals,
390 SourceRange BracketsRange);
391
392 /// \brief Build a new vector type given the element type and
393 /// number of elements.
394 ///
395 /// By default, performs semantic analysis when building the vector type.
396 /// Subclasses may override this routine to provide different behavior.
397 QualType RebuildVectorType(QualType ElementType, unsigned NumElements);
Mike Stump11289f42009-09-09 15:08:12 +0000398
Douglas Gregord6ff3322009-08-04 16:50:30 +0000399 /// \brief Build a new extended vector type given the element type and
400 /// number of elements.
401 ///
402 /// By default, performs semantic analysis when building the vector type.
403 /// Subclasses may override this routine to provide different behavior.
404 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
405 SourceLocation AttributeLoc);
Mike Stump11289f42009-09-09 15:08:12 +0000406
407 /// \brief Build a new potentially dependently-sized extended vector type
Douglas Gregord6ff3322009-08-04 16:50:30 +0000408 /// given the element type and number of elements.
409 ///
410 /// By default, performs semantic analysis when building the vector type.
411 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000412 QualType RebuildDependentSizedExtVectorType(QualType ElementType,
Douglas Gregora16548e2009-08-11 05:31:07 +0000413 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000414 SourceLocation AttributeLoc);
Mike Stump11289f42009-09-09 15:08:12 +0000415
Douglas Gregord6ff3322009-08-04 16:50:30 +0000416 /// \brief Build a new function type.
417 ///
418 /// By default, performs semantic analysis when building the function type.
419 /// Subclasses may override this routine to provide different behavior.
420 QualType RebuildFunctionProtoType(QualType T,
Mike Stump11289f42009-09-09 15:08:12 +0000421 QualType *ParamTypes,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000422 unsigned NumParamTypes,
423 bool Variadic, unsigned Quals);
Mike Stump11289f42009-09-09 15:08:12 +0000424
Douglas Gregord6ff3322009-08-04 16:50:30 +0000425 /// \brief Build a new typedef type.
426 QualType RebuildTypedefType(TypedefDecl *Typedef) {
427 return SemaRef.Context.getTypeDeclType(Typedef);
428 }
429
430 /// \brief Build a new class/struct/union type.
431 QualType RebuildRecordType(RecordDecl *Record) {
432 return SemaRef.Context.getTypeDeclType(Record);
433 }
434
435 /// \brief Build a new Enum type.
436 QualType RebuildEnumType(EnumDecl *Enum) {
437 return SemaRef.Context.getTypeDeclType(Enum);
438 }
John McCallfcc33b02009-09-05 00:15:47 +0000439
440 /// \brief Build a new elaborated type.
441 QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
442 return SemaRef.Context.getElaboratedType(T, Tag);
443 }
Mike Stump11289f42009-09-09 15:08:12 +0000444
445 /// \brief Build a new typeof(expr) type.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000446 ///
447 /// By default, performs semantic analysis when building the typeof type.
448 /// Subclasses may override this routine to provide different behavior.
Douglas Gregora16548e2009-08-11 05:31:07 +0000449 QualType RebuildTypeOfExprType(ExprArg Underlying);
Douglas Gregord6ff3322009-08-04 16:50:30 +0000450
Mike Stump11289f42009-09-09 15:08:12 +0000451 /// \brief Build a new typeof(type) type.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000452 ///
453 /// By default, builds a new TypeOfType with the given underlying type.
454 QualType RebuildTypeOfType(QualType Underlying);
455
Mike Stump11289f42009-09-09 15:08:12 +0000456 /// \brief Build a new C++0x decltype type.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000457 ///
458 /// By default, performs semantic analysis when building the decltype type.
459 /// Subclasses may override this routine to provide different behavior.
Douglas Gregora16548e2009-08-11 05:31:07 +0000460 QualType RebuildDecltypeType(ExprArg Underlying);
Mike Stump11289f42009-09-09 15:08:12 +0000461
Douglas Gregord6ff3322009-08-04 16:50:30 +0000462 /// \brief Build a new template specialization type.
463 ///
464 /// By default, performs semantic analysis when building the template
465 /// specialization type. Subclasses may override this routine to provide
466 /// different behavior.
467 QualType RebuildTemplateSpecializationType(TemplateName Template,
468 const TemplateArgument *Args,
469 unsigned NumArgs);
Mike Stump11289f42009-09-09 15:08:12 +0000470
Douglas Gregord6ff3322009-08-04 16:50:30 +0000471 /// \brief Build a new qualified name type.
472 ///
Mike Stump11289f42009-09-09 15:08:12 +0000473 /// By default, builds a new QualifiedNameType type from the
474 /// nested-name-specifier and the named type. Subclasses may override
Douglas Gregord6ff3322009-08-04 16:50:30 +0000475 /// this routine to provide different behavior.
476 QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
477 return SemaRef.Context.getQualifiedNameType(NNS, Named);
Mike Stump11289f42009-09-09 15:08:12 +0000478 }
Douglas Gregord6ff3322009-08-04 16:50:30 +0000479
480 /// \brief Build a new typename type that refers to a template-id.
481 ///
482 /// By default, builds a new TypenameType type from the nested-name-specifier
Mike Stump11289f42009-09-09 15:08:12 +0000483 /// and the given type. Subclasses may override this routine to provide
Douglas Gregord6ff3322009-08-04 16:50:30 +0000484 /// different behavior.
485 QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
486 if (NNS->isDependent())
Mike Stump11289f42009-09-09 15:08:12 +0000487 return SemaRef.Context.getTypenameType(NNS,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000488 cast<TemplateSpecializationType>(T));
Mike Stump11289f42009-09-09 15:08:12 +0000489
Douglas Gregord6ff3322009-08-04 16:50:30 +0000490 return SemaRef.Context.getQualifiedNameType(NNS, T);
Mike Stump11289f42009-09-09 15:08:12 +0000491 }
Douglas Gregord6ff3322009-08-04 16:50:30 +0000492
493 /// \brief Build a new typename type that refers to an identifier.
494 ///
495 /// By default, performs semantic analysis when building the typename type
Mike Stump11289f42009-09-09 15:08:12 +0000496 /// (or qualified name type). Subclasses may override this routine to provide
Douglas Gregord6ff3322009-08-04 16:50:30 +0000497 /// different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000498 QualType RebuildTypenameType(NestedNameSpecifier *NNS,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000499 const IdentifierInfo *Id) {
500 return SemaRef.CheckTypenameType(NNS, *Id,
501 SourceRange(getDerived().getBaseLocation()));
Douglas Gregor1135c352009-08-06 05:28:30 +0000502 }
Mike Stump11289f42009-09-09 15:08:12 +0000503
Douglas Gregor1135c352009-08-06 05:28:30 +0000504 /// \brief Build a new nested-name-specifier given the prefix and an
505 /// identifier that names the next step in the nested-name-specifier.
506 ///
507 /// By default, performs semantic analysis when building the new
508 /// nested-name-specifier. Subclasses may override this routine to provide
509 /// different behavior.
510 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
511 SourceRange Range,
Douglas Gregorc26e0f62009-09-03 16:14:30 +0000512 IdentifierInfo &II,
Douglas Gregor2b6ca462009-09-03 21:38:09 +0000513 QualType ObjectType,
514 NamedDecl *FirstQualifierInScope);
Douglas Gregor1135c352009-08-06 05:28:30 +0000515
516 /// \brief Build a new nested-name-specifier given the prefix and the
517 /// namespace named in the next step in the nested-name-specifier.
518 ///
519 /// By default, performs semantic analysis when building the new
520 /// nested-name-specifier. Subclasses may override this routine to provide
521 /// different behavior.
522 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
523 SourceRange Range,
524 NamespaceDecl *NS);
525
526 /// \brief Build a new nested-name-specifier given the prefix and the
527 /// type named in the next step in the nested-name-specifier.
528 ///
529 /// By default, performs semantic analysis when building the new
530 /// nested-name-specifier. Subclasses may override this routine to provide
531 /// different behavior.
532 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
533 SourceRange Range,
534 bool TemplateKW,
535 QualType T);
Douglas Gregor71dc5092009-08-06 06:41:21 +0000536
537 /// \brief Build a new template name given a nested name specifier, a flag
538 /// indicating whether the "template" keyword was provided, and the template
539 /// that the template name refers to.
540 ///
541 /// By default, builds the new template name directly. Subclasses may override
542 /// this routine to provide different behavior.
543 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
544 bool TemplateKW,
545 TemplateDecl *Template);
546
547 /// \brief Build a new template name given a nested name specifier, a flag
548 /// indicating whether the "template" keyword was provided, and a set of
549 /// overloaded function templates.
550 ///
551 /// By default, builds the new template name directly. Subclasses may override
552 /// this routine to provide different behavior.
553 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
554 bool TemplateKW,
555 OverloadedFunctionDecl *Ovl);
Mike Stump11289f42009-09-09 15:08:12 +0000556
Douglas Gregor71dc5092009-08-06 06:41:21 +0000557 /// \brief Build a new template name given a nested name specifier and the
558 /// name that is referred to as a template.
559 ///
560 /// By default, performs semantic analysis to determine whether the name can
561 /// be resolved to a specific template, then builds the appropriate kind of
562 /// template name. Subclasses may override this routine to provide different
563 /// behavior.
564 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
Douglas Gregor308047d2009-09-09 00:23:06 +0000565 const IdentifierInfo &II,
566 QualType ObjectType);
Mike Stump11289f42009-09-09 15:08:12 +0000567
568
Douglas Gregorebe10102009-08-20 07:17:43 +0000569 /// \brief Build a new compound statement.
570 ///
571 /// By default, performs semantic analysis to build the new statement.
572 /// Subclasses may override this routine to provide different behavior.
573 OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
574 MultiStmtArg Statements,
575 SourceLocation RBraceLoc,
576 bool IsStmtExpr) {
577 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
578 IsStmtExpr);
579 }
580
581 /// \brief Build a new case statement.
582 ///
583 /// By default, performs semantic analysis to build the new statement.
584 /// Subclasses may override this routine to provide different behavior.
585 OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
586 ExprArg LHS,
587 SourceLocation EllipsisLoc,
588 ExprArg RHS,
589 SourceLocation ColonLoc) {
Mike Stump11289f42009-09-09 15:08:12 +0000590 return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
Douglas Gregorebe10102009-08-20 07:17:43 +0000591 ColonLoc);
592 }
Mike Stump11289f42009-09-09 15:08:12 +0000593
Douglas Gregorebe10102009-08-20 07:17:43 +0000594 /// \brief Attach the body to a new case statement.
595 ///
596 /// By default, performs semantic analysis to build the new statement.
597 /// Subclasses may override this routine to provide different behavior.
598 OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
599 getSema().ActOnCaseStmtBody(S.get(), move(Body));
600 return move(S);
601 }
Mike Stump11289f42009-09-09 15:08:12 +0000602
Douglas Gregorebe10102009-08-20 07:17:43 +0000603 /// \brief Build a new default statement.
604 ///
605 /// By default, performs semantic analysis to build the new statement.
606 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000607 OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000608 SourceLocation ColonLoc,
609 StmtArg SubStmt) {
Mike Stump11289f42009-09-09 15:08:12 +0000610 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
Douglas Gregorebe10102009-08-20 07:17:43 +0000611 /*CurScope=*/0);
612 }
Mike Stump11289f42009-09-09 15:08:12 +0000613
Douglas Gregorebe10102009-08-20 07:17:43 +0000614 /// \brief Build a new label statement.
615 ///
616 /// By default, performs semantic analysis to build the new statement.
617 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000618 OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000619 IdentifierInfo *Id,
620 SourceLocation ColonLoc,
621 StmtArg SubStmt) {
622 return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
623 }
Mike Stump11289f42009-09-09 15:08:12 +0000624
Douglas Gregorebe10102009-08-20 07:17:43 +0000625 /// \brief Build a new "if" statement.
626 ///
627 /// By default, performs semantic analysis to build the new statement.
628 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000629 OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
630 StmtArg Then, SourceLocation ElseLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000631 StmtArg Else) {
632 return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else));
633 }
Mike Stump11289f42009-09-09 15:08:12 +0000634
Douglas Gregorebe10102009-08-20 07:17:43 +0000635 /// \brief Start building a new switch statement.
636 ///
637 /// By default, performs semantic analysis to build the new statement.
638 /// Subclasses may override this routine to provide different behavior.
639 OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) {
640 return getSema().ActOnStartOfSwitchStmt(move(Cond));
641 }
Mike Stump11289f42009-09-09 15:08:12 +0000642
Douglas Gregorebe10102009-08-20 07:17:43 +0000643 /// \brief Attach the body to the switch statement.
644 ///
645 /// By default, performs semantic analysis to build the new statement.
646 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000647 OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000648 StmtArg Switch, StmtArg Body) {
649 return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
650 move(Body));
651 }
652
653 /// \brief Build a new while statement.
654 ///
655 /// By default, performs semantic analysis to build the new statement.
656 /// Subclasses may override this routine to provide different behavior.
657 OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
658 Sema::FullExprArg Cond,
659 StmtArg Body) {
660 return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body));
661 }
Mike Stump11289f42009-09-09 15:08:12 +0000662
Douglas Gregorebe10102009-08-20 07:17:43 +0000663 /// \brief Build a new do-while statement.
664 ///
665 /// By default, performs semantic analysis to build the new statement.
666 /// Subclasses may override this routine to provide different behavior.
667 OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
668 SourceLocation WhileLoc,
669 SourceLocation LParenLoc,
670 ExprArg Cond,
671 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +0000672 return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000673 move(Cond), RParenLoc);
674 }
675
676 /// \brief Build a new for statement.
677 ///
678 /// By default, performs semantic analysis to build the new statement.
679 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000680 OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000681 SourceLocation LParenLoc,
682 StmtArg Init, ExprArg Cond, ExprArg Inc,
683 SourceLocation RParenLoc, StmtArg Body) {
Mike Stump11289f42009-09-09 15:08:12 +0000684 return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond),
Douglas Gregorebe10102009-08-20 07:17:43 +0000685 move(Inc), RParenLoc, move(Body));
686 }
Mike Stump11289f42009-09-09 15:08:12 +0000687
Douglas Gregorebe10102009-08-20 07:17:43 +0000688 /// \brief Build a new goto statement.
689 ///
690 /// By default, performs semantic analysis to build the new statement.
691 /// Subclasses may override this routine to provide different behavior.
692 OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
693 SourceLocation LabelLoc,
694 LabelStmt *Label) {
695 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
696 }
697
698 /// \brief Build a new indirect goto statement.
699 ///
700 /// By default, performs semantic analysis to build the new statement.
701 /// Subclasses may override this routine to provide different behavior.
702 OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
703 SourceLocation StarLoc,
704 ExprArg Target) {
705 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
706 }
Mike Stump11289f42009-09-09 15:08:12 +0000707
Douglas Gregorebe10102009-08-20 07:17:43 +0000708 /// \brief Build a new return statement.
709 ///
710 /// By default, performs semantic analysis to build the new statement.
711 /// Subclasses may override this routine to provide different behavior.
712 OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
713 ExprArg Result) {
Mike Stump11289f42009-09-09 15:08:12 +0000714
Douglas Gregorebe10102009-08-20 07:17:43 +0000715 return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
716 }
Mike Stump11289f42009-09-09 15:08:12 +0000717
Douglas Gregorebe10102009-08-20 07:17:43 +0000718 /// \brief Build a new declaration statement.
719 ///
720 /// By default, performs semantic analysis to build the new statement.
721 /// Subclasses may override this routine to provide different behavior.
722 OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
Mike Stump11289f42009-09-09 15:08:12 +0000723 SourceLocation StartLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000724 SourceLocation EndLoc) {
725 return getSema().Owned(
726 new (getSema().Context) DeclStmt(
727 DeclGroupRef::Create(getSema().Context,
728 Decls, NumDecls),
729 StartLoc, EndLoc));
730 }
Mike Stump11289f42009-09-09 15:08:12 +0000731
Douglas Gregorebe10102009-08-20 07:17:43 +0000732 /// \brief Build a new C++ exception declaration.
733 ///
734 /// By default, performs semantic analysis to build the new decaration.
735 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000736 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
Douglas Gregorebe10102009-08-20 07:17:43 +0000737 DeclaratorInfo *Declarator,
738 IdentifierInfo *Name,
739 SourceLocation Loc,
740 SourceRange TypeRange) {
Mike Stump11289f42009-09-09 15:08:12 +0000741 return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000742 TypeRange);
743 }
744
745 /// \brief Build a new C++ catch statement.
746 ///
747 /// By default, performs semantic analysis to build the new statement.
748 /// Subclasses may override this routine to provide different behavior.
749 OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
750 VarDecl *ExceptionDecl,
751 StmtArg Handler) {
752 return getSema().Owned(
Mike Stump11289f42009-09-09 15:08:12 +0000753 new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
Douglas Gregorebe10102009-08-20 07:17:43 +0000754 Handler.takeAs<Stmt>()));
755 }
Mike Stump11289f42009-09-09 15:08:12 +0000756
Douglas Gregorebe10102009-08-20 07:17:43 +0000757 /// \brief Build a new C++ try statement.
758 ///
759 /// By default, performs semantic analysis to build the new statement.
760 /// Subclasses may override this routine to provide different behavior.
761 OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
762 StmtArg TryBlock,
763 MultiStmtArg Handlers) {
764 return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
765 }
Mike Stump11289f42009-09-09 15:08:12 +0000766
Douglas Gregora16548e2009-08-11 05:31:07 +0000767 /// \brief Build a new expression that references a declaration.
768 ///
769 /// By default, performs semantic analysis to build the new expression.
770 /// Subclasses may override this routine to provide different behavior.
771 OwningExprResult RebuildDeclRefExpr(NamedDecl *ND, SourceLocation Loc) {
772 return getSema().BuildDeclarationNameExpr(Loc, ND,
773 /*FIXME:*/false,
774 /*SS=*/0,
775 /*FIXME:*/false);
776 }
Mike Stump11289f42009-09-09 15:08:12 +0000777
Douglas Gregora16548e2009-08-11 05:31:07 +0000778 /// \brief Build a new expression in parentheses.
Mike Stump11289f42009-09-09 15:08:12 +0000779 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000780 /// By default, performs semantic analysis to build the new expression.
781 /// Subclasses may override this routine to provide different behavior.
782 OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
783 SourceLocation RParen) {
784 return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
785 }
786
Douglas Gregorad8a3362009-09-04 17:36:40 +0000787 /// \brief Build a new pseudo-destructor expression.
Mike Stump11289f42009-09-09 15:08:12 +0000788 ///
Douglas Gregorad8a3362009-09-04 17:36:40 +0000789 /// By default, performs semantic analysis to build the new expression.
790 /// Subclasses may override this routine to provide different behavior.
791 OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
792 SourceLocation OperatorLoc,
793 bool isArrow,
794 SourceLocation DestroyedTypeLoc,
795 QualType DestroyedType,
796 NestedNameSpecifier *Qualifier,
797 SourceRange QualifierRange) {
798 CXXScopeSpec SS;
799 if (Qualifier) {
800 SS.setRange(QualifierRange);
801 SS.setScopeRep(Qualifier);
802 }
803
Mike Stump11289f42009-09-09 15:08:12 +0000804 DeclarationName Name
Douglas Gregorad8a3362009-09-04 17:36:40 +0000805 = SemaRef.Context.DeclarationNames.getCXXDestructorName(
806 SemaRef.Context.getCanonicalType(DestroyedType));
Mike Stump11289f42009-09-09 15:08:12 +0000807
808 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
Douglas Gregorad8a3362009-09-04 17:36:40 +0000809 OperatorLoc,
810 isArrow? tok::arrow : tok::period,
811 DestroyedTypeLoc,
812 Name,
813 Sema::DeclPtrTy::make((Decl *)0),
814 &SS);
Mike Stump11289f42009-09-09 15:08:12 +0000815 }
816
Douglas Gregora16548e2009-08-11 05:31:07 +0000817 /// \brief Build a new unary operator expression.
Mike Stump11289f42009-09-09 15:08:12 +0000818 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000819 /// By default, performs semantic analysis to build the new expression.
820 /// Subclasses may override this routine to provide different behavior.
821 OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
822 UnaryOperator::Opcode Opc,
823 ExprArg SubExpr) {
824 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr));
825 }
Mike Stump11289f42009-09-09 15:08:12 +0000826
Douglas Gregora16548e2009-08-11 05:31:07 +0000827 /// \brief Build a new sizeof or alignof expression with a type argument.
Mike Stump11289f42009-09-09 15:08:12 +0000828 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000829 /// By default, performs semantic analysis to build the new expression.
830 /// Subclasses may override this routine to provide different behavior.
831 OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc,
832 bool isSizeOf, SourceRange R) {
833 return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R);
834 }
835
Mike Stump11289f42009-09-09 15:08:12 +0000836 /// \brief Build a new sizeof or alignof expression with an expression
Douglas Gregora16548e2009-08-11 05:31:07 +0000837 /// argument.
Mike Stump11289f42009-09-09 15:08:12 +0000838 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000839 /// By default, performs semantic analysis to build the new expression.
840 /// Subclasses may override this routine to provide different behavior.
841 OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
842 bool isSizeOf, SourceRange R) {
Mike Stump11289f42009-09-09 15:08:12 +0000843 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +0000844 = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
845 OpLoc, isSizeOf, R);
846 if (Result.isInvalid())
847 return getSema().ExprError();
Mike Stump11289f42009-09-09 15:08:12 +0000848
Douglas Gregora16548e2009-08-11 05:31:07 +0000849 SubExpr.release();
850 return move(Result);
851 }
Mike Stump11289f42009-09-09 15:08:12 +0000852
Douglas Gregora16548e2009-08-11 05:31:07 +0000853 /// \brief Build a new array subscript expression.
Mike Stump11289f42009-09-09 15:08:12 +0000854 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000855 /// By default, performs semantic analysis to build the new expression.
856 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000857 OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
Douglas Gregora16548e2009-08-11 05:31:07 +0000858 SourceLocation LBracketLoc,
859 ExprArg RHS,
860 SourceLocation RBracketLoc) {
861 return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
Mike Stump11289f42009-09-09 15:08:12 +0000862 LBracketLoc, move(RHS),
Douglas Gregora16548e2009-08-11 05:31:07 +0000863 RBracketLoc);
864 }
865
866 /// \brief Build a new call expression.
Mike Stump11289f42009-09-09 15:08:12 +0000867 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000868 /// By default, performs semantic analysis to build the new expression.
869 /// Subclasses may override this routine to provide different behavior.
870 OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
871 MultiExprArg Args,
872 SourceLocation *CommaLocs,
873 SourceLocation RParenLoc) {
874 return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
875 move(Args), CommaLocs, RParenLoc);
876 }
877
878 /// \brief Build a new member access expression.
Mike Stump11289f42009-09-09 15:08:12 +0000879 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000880 /// By default, performs semantic analysis to build the new expression.
881 /// Subclasses may override this routine to provide different behavior.
882 OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
Mike Stump11289f42009-09-09 15:08:12 +0000883 bool isArrow,
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000884 NestedNameSpecifier *Qualifier,
885 SourceRange QualifierRange,
886 SourceLocation MemberLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +0000887 NamedDecl *Member) {
Anders Carlsson5da84842009-09-01 04:26:58 +0000888 if (!Member->getDeclName()) {
889 // We have a reference to an unnamed field.
890 assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
Mike Stump11289f42009-09-09 15:08:12 +0000891
892 MemberExpr *ME =
Anders Carlsson5da84842009-09-01 04:26:58 +0000893 new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow,
894 Member, MemberLoc,
895 cast<FieldDecl>(Member)->getType());
896 return getSema().Owned(ME);
897 }
Mike Stump11289f42009-09-09 15:08:12 +0000898
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000899 CXXScopeSpec SS;
900 if (Qualifier) {
901 SS.setRange(QualifierRange);
902 SS.setScopeRep(Qualifier);
903 }
904
Douglas Gregorf14b46f2009-08-31 20:00:26 +0000905 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +0000906 isArrow? tok::arrow : tok::period,
907 MemberLoc,
Douglas Gregorf14b46f2009-08-31 20:00:26 +0000908 Member->getDeclName(),
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000909 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
910 &SS);
Douglas Gregora16548e2009-08-11 05:31:07 +0000911 }
Mike Stump11289f42009-09-09 15:08:12 +0000912
Douglas Gregora16548e2009-08-11 05:31:07 +0000913 /// \brief Build a new binary operator expression.
Mike Stump11289f42009-09-09 15:08:12 +0000914 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000915 /// By default, performs semantic analysis to build the new expression.
916 /// Subclasses may override this routine to provide different behavior.
917 OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
918 BinaryOperator::Opcode Opc,
919 ExprArg LHS, ExprArg RHS) {
920 OwningExprResult Result
Mike Stump11289f42009-09-09 15:08:12 +0000921 = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +0000922 (Expr *)RHS.get());
923 if (Result.isInvalid())
924 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +0000925
Douglas Gregora16548e2009-08-11 05:31:07 +0000926 LHS.release();
927 RHS.release();
928 return move(Result);
929 }
930
931 /// \brief Build a new conditional operator expression.
Mike Stump11289f42009-09-09 15:08:12 +0000932 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000933 /// By default, performs semantic analysis to build the new expression.
934 /// Subclasses may override this routine to provide different behavior.
935 OwningExprResult RebuildConditionalOperator(ExprArg Cond,
936 SourceLocation QuestionLoc,
937 ExprArg LHS,
938 SourceLocation ColonLoc,
939 ExprArg RHS) {
Mike Stump11289f42009-09-09 15:08:12 +0000940 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
Douglas Gregora16548e2009-08-11 05:31:07 +0000941 move(LHS), move(RHS));
942 }
943
944 /// \brief Build a new implicit cast expression.
Mike Stump11289f42009-09-09 15:08:12 +0000945 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000946 /// By default, builds a new implicit cast without any semantic analysis.
947 /// Subclasses may override this routine to provide different behavior.
948 OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
949 ExprArg SubExpr, bool isLvalue) {
950 ImplicitCastExpr *ICE
Mike Stump11289f42009-09-09 15:08:12 +0000951 = new (getSema().Context) ImplicitCastExpr(T, Kind,
Douglas Gregora16548e2009-08-11 05:31:07 +0000952 (Expr *)SubExpr.release(),
953 isLvalue);
954 return getSema().Owned(ICE);
955 }
956
957 /// \brief Build a new C-style cast expression.
Mike Stump11289f42009-09-09 15:08:12 +0000958 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000959 /// By default, performs semantic analysis to build the new expression.
960 /// Subclasses may override this routine to provide different behavior.
961 OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
962 QualType ExplicitTy,
963 SourceLocation RParenLoc,
964 ExprArg SubExpr) {
965 return getSema().ActOnCastExpr(/*Scope=*/0,
966 LParenLoc,
967 ExplicitTy.getAsOpaquePtr(),
968 RParenLoc,
969 move(SubExpr));
970 }
Mike Stump11289f42009-09-09 15:08:12 +0000971
Douglas Gregora16548e2009-08-11 05:31:07 +0000972 /// \brief Build a new compound literal expression.
Mike Stump11289f42009-09-09 15:08:12 +0000973 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000974 /// By default, performs semantic analysis to build the new expression.
975 /// Subclasses may override this routine to provide different behavior.
976 OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
977 QualType T,
978 SourceLocation RParenLoc,
979 ExprArg Init) {
980 return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
981 RParenLoc, move(Init));
982 }
Mike Stump11289f42009-09-09 15:08:12 +0000983
Douglas Gregora16548e2009-08-11 05:31:07 +0000984 /// \brief Build a new extended vector element access expression.
Mike Stump11289f42009-09-09 15:08:12 +0000985 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000986 /// By default, performs semantic analysis to build the new expression.
987 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000988 OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
Douglas Gregora16548e2009-08-11 05:31:07 +0000989 SourceLocation OpLoc,
990 SourceLocation AccessorLoc,
991 IdentifierInfo &Accessor) {
992 return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
993 tok::period, AccessorLoc,
994 Accessor,
995 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
996 }
Mike Stump11289f42009-09-09 15:08:12 +0000997
Douglas Gregora16548e2009-08-11 05:31:07 +0000998 /// \brief Build a new initializer list expression.
Mike Stump11289f42009-09-09 15:08:12 +0000999 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001000 /// By default, performs semantic analysis to build the new expression.
1001 /// Subclasses may override this routine to provide different behavior.
1002 OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1003 MultiExprArg Inits,
1004 SourceLocation RBraceLoc) {
1005 return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1006 }
Mike Stump11289f42009-09-09 15:08:12 +00001007
Douglas Gregora16548e2009-08-11 05:31:07 +00001008 /// \brief Build a new designated initializer expression.
Mike Stump11289f42009-09-09 15:08:12 +00001009 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001010 /// By default, performs semantic analysis to build the new expression.
1011 /// Subclasses may override this routine to provide different behavior.
1012 OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1013 MultiExprArg ArrayExprs,
1014 SourceLocation EqualOrColonLoc,
1015 bool GNUSyntax,
1016 ExprArg Init) {
1017 OwningExprResult Result
1018 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1019 move(Init));
1020 if (Result.isInvalid())
1021 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001022
Douglas Gregora16548e2009-08-11 05:31:07 +00001023 ArrayExprs.release();
1024 return move(Result);
1025 }
Mike Stump11289f42009-09-09 15:08:12 +00001026
Douglas Gregora16548e2009-08-11 05:31:07 +00001027 /// \brief Build a new value-initialized expression.
Mike Stump11289f42009-09-09 15:08:12 +00001028 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001029 /// By default, builds the implicit value initialization without performing
1030 /// any semantic analysis. Subclasses may override this routine to provide
1031 /// different behavior.
1032 OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1033 return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1034 }
Mike Stump11289f42009-09-09 15:08:12 +00001035
Douglas Gregora16548e2009-08-11 05:31:07 +00001036 /// \brief Build a new \c va_arg expression.
Mike Stump11289f42009-09-09 15:08:12 +00001037 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001038 /// By default, performs semantic analysis to build the new expression.
1039 /// Subclasses may override this routine to provide different behavior.
1040 OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1041 QualType T, SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001042 return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
Douglas Gregora16548e2009-08-11 05:31:07 +00001043 RParenLoc);
1044 }
1045
1046 /// \brief Build a new expression list in parentheses.
Mike Stump11289f42009-09-09 15:08:12 +00001047 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001048 /// By default, performs semantic analysis to build the new expression.
1049 /// Subclasses may override this routine to provide different behavior.
1050 OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1051 MultiExprArg SubExprs,
1052 SourceLocation RParenLoc) {
1053 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
1054 }
Mike Stump11289f42009-09-09 15:08:12 +00001055
Douglas Gregora16548e2009-08-11 05:31:07 +00001056 /// \brief Build a new address-of-label expression.
Mike Stump11289f42009-09-09 15:08:12 +00001057 ///
1058 /// By default, performs semantic analysis, using the name of the label
Douglas Gregora16548e2009-08-11 05:31:07 +00001059 /// rather than attempting to map the label statement itself.
1060 /// Subclasses may override this routine to provide different behavior.
1061 OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1062 SourceLocation LabelLoc,
1063 LabelStmt *Label) {
1064 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1065 }
Mike Stump11289f42009-09-09 15:08:12 +00001066
Douglas Gregora16548e2009-08-11 05:31:07 +00001067 /// \brief Build a new GNU statement expression.
Mike Stump11289f42009-09-09 15:08:12 +00001068 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001069 /// By default, performs semantic analysis to build the new expression.
1070 /// Subclasses may override this routine to provide different behavior.
1071 OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1072 StmtArg SubStmt,
1073 SourceLocation RParenLoc) {
1074 return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1075 }
Mike Stump11289f42009-09-09 15:08:12 +00001076
Douglas Gregora16548e2009-08-11 05:31:07 +00001077 /// \brief Build a new __builtin_types_compatible_p expression.
1078 ///
1079 /// By default, performs semantic analysis to build the new expression.
1080 /// Subclasses may override this routine to provide different behavior.
1081 OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1082 QualType T1, QualType T2,
1083 SourceLocation RParenLoc) {
1084 return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1085 T1.getAsOpaquePtr(),
1086 T2.getAsOpaquePtr(),
1087 RParenLoc);
1088 }
Mike Stump11289f42009-09-09 15:08:12 +00001089
Douglas Gregora16548e2009-08-11 05:31:07 +00001090 /// \brief Build a new __builtin_choose_expr expression.
1091 ///
1092 /// By default, performs semantic analysis to build the new expression.
1093 /// Subclasses may override this routine to provide different behavior.
1094 OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1095 ExprArg Cond, ExprArg LHS, ExprArg RHS,
1096 SourceLocation RParenLoc) {
1097 return SemaRef.ActOnChooseExpr(BuiltinLoc,
1098 move(Cond), move(LHS), move(RHS),
1099 RParenLoc);
1100 }
Mike Stump11289f42009-09-09 15:08:12 +00001101
Douglas Gregora16548e2009-08-11 05:31:07 +00001102 /// \brief Build a new overloaded operator call expression.
1103 ///
1104 /// By default, performs semantic analysis to build the new expression.
1105 /// The semantic analysis provides the behavior of template instantiation,
1106 /// copying with transformations that turn what looks like an overloaded
Mike Stump11289f42009-09-09 15:08:12 +00001107 /// operator call into a use of a builtin operator, performing
Douglas Gregora16548e2009-08-11 05:31:07 +00001108 /// argument-dependent lookup, etc. Subclasses may override this routine to
1109 /// provide different behavior.
1110 OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1111 SourceLocation OpLoc,
1112 ExprArg Callee,
1113 ExprArg First,
1114 ExprArg Second);
Mike Stump11289f42009-09-09 15:08:12 +00001115
1116 /// \brief Build a new C++ "named" cast expression, such as static_cast or
Douglas Gregora16548e2009-08-11 05:31:07 +00001117 /// reinterpret_cast.
1118 ///
1119 /// By default, this routine dispatches to one of the more-specific routines
Mike Stump11289f42009-09-09 15:08:12 +00001120 /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
Douglas Gregora16548e2009-08-11 05:31:07 +00001121 /// Subclasses may override this routine to provide different behavior.
1122 OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1123 Stmt::StmtClass Class,
1124 SourceLocation LAngleLoc,
1125 QualType T,
1126 SourceLocation RAngleLoc,
1127 SourceLocation LParenLoc,
1128 ExprArg SubExpr,
1129 SourceLocation RParenLoc) {
1130 switch (Class) {
1131 case Stmt::CXXStaticCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001132 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
1133 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001134 move(SubExpr), RParenLoc);
1135
1136 case Stmt::CXXDynamicCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001137 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
1138 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001139 move(SubExpr), RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001140
Douglas Gregora16548e2009-08-11 05:31:07 +00001141 case Stmt::CXXReinterpretCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001142 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
1143 RAngleLoc, LParenLoc,
1144 move(SubExpr),
Douglas Gregora16548e2009-08-11 05:31:07 +00001145 RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001146
Douglas Gregora16548e2009-08-11 05:31:07 +00001147 case Stmt::CXXConstCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001148 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
1149 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001150 move(SubExpr), RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001151
Douglas Gregora16548e2009-08-11 05:31:07 +00001152 default:
1153 assert(false && "Invalid C++ named cast");
1154 break;
1155 }
Mike Stump11289f42009-09-09 15:08:12 +00001156
Douglas Gregora16548e2009-08-11 05:31:07 +00001157 return getSema().ExprError();
1158 }
Mike Stump11289f42009-09-09 15:08:12 +00001159
Douglas Gregora16548e2009-08-11 05:31:07 +00001160 /// \brief Build a new C++ static_cast expression.
1161 ///
1162 /// By default, performs semantic analysis to build the new expression.
1163 /// Subclasses may override this routine to provide different behavior.
1164 OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1165 SourceLocation LAngleLoc,
1166 QualType T,
1167 SourceLocation RAngleLoc,
1168 SourceLocation LParenLoc,
1169 ExprArg SubExpr,
1170 SourceLocation RParenLoc) {
1171 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
Mike Stump11289f42009-09-09 15:08:12 +00001172 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001173 LParenLoc, move(SubExpr), RParenLoc);
1174 }
1175
1176 /// \brief Build a new C++ dynamic_cast expression.
1177 ///
1178 /// By default, performs semantic analysis to build the new expression.
1179 /// Subclasses may override this routine to provide different behavior.
1180 OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1181 SourceLocation LAngleLoc,
1182 QualType T,
1183 SourceLocation RAngleLoc,
1184 SourceLocation LParenLoc,
1185 ExprArg SubExpr,
1186 SourceLocation RParenLoc) {
1187 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
Mike Stump11289f42009-09-09 15:08:12 +00001188 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001189 LParenLoc, move(SubExpr), RParenLoc);
1190 }
1191
1192 /// \brief Build a new C++ reinterpret_cast expression.
1193 ///
1194 /// By default, performs semantic analysis to build the new expression.
1195 /// Subclasses may override this routine to provide different behavior.
1196 OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1197 SourceLocation LAngleLoc,
1198 QualType T,
1199 SourceLocation RAngleLoc,
1200 SourceLocation LParenLoc,
1201 ExprArg SubExpr,
1202 SourceLocation RParenLoc) {
1203 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1204 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1205 LParenLoc, move(SubExpr), RParenLoc);
1206 }
1207
1208 /// \brief Build a new C++ const_cast expression.
1209 ///
1210 /// By default, performs semantic analysis to build the new expression.
1211 /// Subclasses may override this routine to provide different behavior.
1212 OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1213 SourceLocation LAngleLoc,
1214 QualType T,
1215 SourceLocation RAngleLoc,
1216 SourceLocation LParenLoc,
1217 ExprArg SubExpr,
1218 SourceLocation RParenLoc) {
1219 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
Mike Stump11289f42009-09-09 15:08:12 +00001220 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001221 LParenLoc, move(SubExpr), RParenLoc);
1222 }
Mike Stump11289f42009-09-09 15:08:12 +00001223
Douglas Gregora16548e2009-08-11 05:31:07 +00001224 /// \brief Build a new C++ functional-style cast expression.
1225 ///
1226 /// By default, performs semantic analysis to build the new expression.
1227 /// Subclasses may override this routine to provide different behavior.
1228 OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
1229 QualType T,
1230 SourceLocation LParenLoc,
1231 ExprArg SubExpr,
1232 SourceLocation RParenLoc) {
Chris Lattnerdca19592009-08-24 05:19:01 +00001233 void *Sub = SubExpr.takeAs<Expr>();
Douglas Gregora16548e2009-08-11 05:31:07 +00001234 return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1235 T.getAsOpaquePtr(),
1236 LParenLoc,
Chris Lattnerdca19592009-08-24 05:19:01 +00001237 Sema::MultiExprArg(getSema(), &Sub, 1),
Mike Stump11289f42009-09-09 15:08:12 +00001238 /*CommaLocs=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001239 RParenLoc);
1240 }
Mike Stump11289f42009-09-09 15:08:12 +00001241
Douglas Gregora16548e2009-08-11 05:31:07 +00001242 /// \brief Build a new C++ typeid(type) expression.
1243 ///
1244 /// By default, performs semantic analysis to build the new expression.
1245 /// Subclasses may override this routine to provide different behavior.
1246 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1247 SourceLocation LParenLoc,
1248 QualType T,
1249 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001250 return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
Douglas Gregora16548e2009-08-11 05:31:07 +00001251 T.getAsOpaquePtr(), RParenLoc);
1252 }
Mike Stump11289f42009-09-09 15:08:12 +00001253
Douglas Gregora16548e2009-08-11 05:31:07 +00001254 /// \brief Build a new C++ typeid(expr) expression.
1255 ///
1256 /// By default, performs semantic analysis to build the new expression.
1257 /// Subclasses may override this routine to provide different behavior.
1258 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1259 SourceLocation LParenLoc,
1260 ExprArg Operand,
1261 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001262 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00001263 = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1264 RParenLoc);
1265 if (Result.isInvalid())
1266 return getSema().ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001267
Douglas Gregora16548e2009-08-11 05:31:07 +00001268 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1269 return move(Result);
Mike Stump11289f42009-09-09 15:08:12 +00001270 }
1271
Douglas Gregora16548e2009-08-11 05:31:07 +00001272 /// \brief Build a new C++ "this" expression.
1273 ///
1274 /// By default, builds a new "this" expression without performing any
Mike Stump11289f42009-09-09 15:08:12 +00001275 /// semantic analysis. Subclasses may override this routine to provide
Douglas Gregora16548e2009-08-11 05:31:07 +00001276 /// different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001277 OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001278 QualType ThisType) {
1279 return getSema().Owned(
1280 new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1281 }
1282
1283 /// \brief Build a new C++ throw expression.
1284 ///
1285 /// By default, performs semantic analysis to build the new expression.
1286 /// Subclasses may override this routine to provide different behavior.
1287 OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1288 return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1289 }
1290
1291 /// \brief Build a new C++ default-argument expression.
1292 ///
1293 /// By default, builds a new default-argument expression, which does not
1294 /// require any semantic analysis. Subclasses may override this routine to
1295 /// provide different behavior.
1296 OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
Anders Carlssone8271232009-08-14 18:30:22 +00001297 return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
Douglas Gregora16548e2009-08-11 05:31:07 +00001298 }
1299
1300 /// \brief Build a new C++ zero-initialization expression.
1301 ///
1302 /// By default, performs semantic analysis to build the new expression.
1303 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001304 OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001305 SourceLocation LParenLoc,
1306 QualType T,
1307 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001308 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1309 T.getAsOpaquePtr(), LParenLoc,
1310 MultiExprArg(getSema(), 0, 0),
Douglas Gregora16548e2009-08-11 05:31:07 +00001311 0, RParenLoc);
1312 }
Mike Stump11289f42009-09-09 15:08:12 +00001313
Douglas Gregora16548e2009-08-11 05:31:07 +00001314 /// \brief Build a new C++ conditional declaration expression.
1315 ///
1316 /// By default, performs semantic analysis to build the new expression.
1317 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001318 OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001319 SourceLocation EqLoc,
1320 VarDecl *Var) {
1321 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1322 EqLoc,
1323 Var));
1324 }
Mike Stump11289f42009-09-09 15:08:12 +00001325
Douglas Gregora16548e2009-08-11 05:31:07 +00001326 /// \brief Build a new C++ "new" expression.
1327 ///
1328 /// By default, performs semantic analysis to build the new expression.
1329 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001330 OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001331 bool UseGlobal,
1332 SourceLocation PlacementLParen,
1333 MultiExprArg PlacementArgs,
1334 SourceLocation PlacementRParen,
Mike Stump11289f42009-09-09 15:08:12 +00001335 bool ParenTypeId,
Douglas Gregora16548e2009-08-11 05:31:07 +00001336 QualType AllocType,
1337 SourceLocation TypeLoc,
1338 SourceRange TypeRange,
1339 ExprArg ArraySize,
1340 SourceLocation ConstructorLParen,
1341 MultiExprArg ConstructorArgs,
1342 SourceLocation ConstructorRParen) {
Mike Stump11289f42009-09-09 15:08:12 +00001343 return getSema().BuildCXXNew(StartLoc, UseGlobal,
Douglas Gregora16548e2009-08-11 05:31:07 +00001344 PlacementLParen,
1345 move(PlacementArgs),
1346 PlacementRParen,
1347 ParenTypeId,
1348 AllocType,
1349 TypeLoc,
1350 TypeRange,
1351 move(ArraySize),
1352 ConstructorLParen,
1353 move(ConstructorArgs),
1354 ConstructorRParen);
1355 }
Mike Stump11289f42009-09-09 15:08:12 +00001356
Douglas Gregora16548e2009-08-11 05:31:07 +00001357 /// \brief Build a new C++ "delete" expression.
1358 ///
1359 /// By default, performs semantic analysis to build the new expression.
1360 /// Subclasses may override this routine to provide different behavior.
1361 OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1362 bool IsGlobalDelete,
1363 bool IsArrayForm,
1364 ExprArg Operand) {
1365 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1366 move(Operand));
1367 }
Mike Stump11289f42009-09-09 15:08:12 +00001368
Douglas Gregora16548e2009-08-11 05:31:07 +00001369 /// \brief Build a new unary type trait expression.
1370 ///
1371 /// By default, performs semantic analysis to build the new expression.
1372 /// Subclasses may override this routine to provide different behavior.
1373 OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1374 SourceLocation StartLoc,
1375 SourceLocation LParenLoc,
1376 QualType T,
1377 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001378 return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001379 T.getAsOpaquePtr(), RParenLoc);
1380 }
1381
1382 /// \brief Build a new qualified declaration reference expression.
1383 ///
1384 /// By default, performs semantic analysis to build the new expression.
1385 /// Subclasses may override this routine to provide different behavior.
1386 OwningExprResult RebuildQualifiedDeclRefExpr(NestedNameSpecifier *NNS,
1387 SourceRange QualifierRange,
1388 NamedDecl *ND,
1389 SourceLocation Location,
1390 bool IsAddressOfOperand) {
1391 CXXScopeSpec SS;
1392 SS.setRange(QualifierRange);
1393 SS.setScopeRep(NNS);
Mike Stump11289f42009-09-09 15:08:12 +00001394 return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001395 Location,
1396 ND->getDeclName(),
1397 /*Trailing lparen=*/false,
1398 &SS,
1399 IsAddressOfOperand);
1400 }
1401
Mike Stump11289f42009-09-09 15:08:12 +00001402 /// \brief Build a new (previously unresolved) declaration reference
Douglas Gregora16548e2009-08-11 05:31:07 +00001403 /// expression.
1404 ///
1405 /// By default, performs semantic analysis to build the new expression.
1406 /// Subclasses may override this routine to provide different behavior.
1407 OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1408 SourceRange QualifierRange,
1409 DeclarationName Name,
1410 SourceLocation Location,
1411 bool IsAddressOfOperand) {
1412 CXXScopeSpec SS;
1413 SS.setRange(QualifierRange);
1414 SS.setScopeRep(NNS);
Mike Stump11289f42009-09-09 15:08:12 +00001415 return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001416 Location,
1417 Name,
1418 /*Trailing lparen=*/false,
1419 &SS,
1420 IsAddressOfOperand);
1421 }
1422
1423 /// \brief Build a new template-id expression.
1424 ///
1425 /// By default, performs semantic analysis to build the new expression.
1426 /// Subclasses may override this routine to provide different behavior.
1427 OwningExprResult RebuildTemplateIdExpr(TemplateName Template,
1428 SourceLocation TemplateLoc,
1429 SourceLocation LAngleLoc,
1430 TemplateArgument *TemplateArgs,
1431 unsigned NumTemplateArgs,
1432 SourceLocation RAngleLoc) {
1433 return getSema().BuildTemplateIdExpr(Template, TemplateLoc,
1434 LAngleLoc,
1435 TemplateArgs, NumTemplateArgs,
1436 RAngleLoc);
1437 }
1438
1439 /// \brief Build a new object-construction expression.
1440 ///
1441 /// By default, performs semantic analysis to build the new expression.
1442 /// Subclasses may override this routine to provide different behavior.
1443 OwningExprResult RebuildCXXConstructExpr(QualType T,
1444 CXXConstructorDecl *Constructor,
1445 bool IsElidable,
1446 MultiExprArg Args) {
Anders Carlsson1b4ebfa2009-09-05 07:40:38 +00001447 return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/
1448 SourceLocation(),
1449 T, Constructor, IsElidable,
Anders Carlsson5995a3e2009-09-07 22:23:31 +00001450 move(Args));
Douglas Gregora16548e2009-08-11 05:31:07 +00001451 }
1452
1453 /// \brief Build a new object-construction expression.
1454 ///
1455 /// By default, performs semantic analysis to build the new expression.
1456 /// Subclasses may override this routine to provide different behavior.
1457 OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1458 QualType T,
1459 SourceLocation LParenLoc,
1460 MultiExprArg Args,
1461 SourceLocation *Commas,
1462 SourceLocation RParenLoc) {
1463 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1464 T.getAsOpaquePtr(),
1465 LParenLoc,
1466 move(Args),
1467 Commas,
1468 RParenLoc);
1469 }
1470
1471 /// \brief Build a new object-construction expression.
1472 ///
1473 /// By default, performs semantic analysis to build the new expression.
1474 /// Subclasses may override this routine to provide different behavior.
1475 OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1476 QualType T,
1477 SourceLocation LParenLoc,
1478 MultiExprArg Args,
1479 SourceLocation *Commas,
1480 SourceLocation RParenLoc) {
1481 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1482 /*FIXME*/LParenLoc),
1483 T.getAsOpaquePtr(),
1484 LParenLoc,
1485 move(Args),
1486 Commas,
1487 RParenLoc);
1488 }
Mike Stump11289f42009-09-09 15:08:12 +00001489
Douglas Gregora16548e2009-08-11 05:31:07 +00001490 /// \brief Build a new member reference expression.
1491 ///
1492 /// By default, performs semantic analysis to build the new expression.
1493 /// Subclasses may override this routine to provide different behavior.
Douglas Gregor2168a9f2009-08-11 15:56:57 +00001494 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
Douglas Gregora16548e2009-08-11 05:31:07 +00001495 bool IsArrow,
1496 SourceLocation OperatorLoc,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001497 NestedNameSpecifier *Qualifier,
1498 SourceRange QualifierRange,
Douglas Gregora16548e2009-08-11 05:31:07 +00001499 DeclarationName Name,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001500 SourceLocation MemberLoc,
1501 NamedDecl *FirstQualifierInScope) {
Douglas Gregor2168a9f2009-08-11 15:56:57 +00001502 OwningExprResult Base = move(BaseE);
Douglas Gregora16548e2009-08-11 05:31:07 +00001503 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001504
Douglas Gregora16548e2009-08-11 05:31:07 +00001505 CXXScopeSpec SS;
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001506 SS.setRange(QualifierRange);
1507 SS.setScopeRep(Qualifier);
Mike Stump11289f42009-09-09 15:08:12 +00001508
Douglas Gregor308047d2009-09-09 00:23:06 +00001509 return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001510 move(Base), OperatorLoc, OpKind,
Douglas Gregorf14b46f2009-08-31 20:00:26 +00001511 MemberLoc,
1512 Name,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001513 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001514 &SS,
1515 FirstQualifierInScope);
Douglas Gregora16548e2009-08-11 05:31:07 +00001516 }
1517
Douglas Gregor308047d2009-09-09 00:23:06 +00001518 /// \brief Build a new member reference expression with explicit template
1519 /// arguments.
1520 ///
1521 /// By default, performs semantic analysis to build the new expression.
1522 /// Subclasses may override this routine to provide different behavior.
1523 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
1524 bool IsArrow,
1525 SourceLocation OperatorLoc,
1526 NestedNameSpecifier *Qualifier,
1527 SourceRange QualifierRange,
1528 TemplateName Template,
1529 SourceLocation TemplateNameLoc,
1530 NamedDecl *FirstQualifierInScope,
1531 SourceLocation LAngleLoc,
1532 const TemplateArgument *TemplateArgs,
1533 unsigned NumTemplateArgs,
1534 SourceLocation RAngleLoc) {
1535 OwningExprResult Base = move(BaseE);
1536 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
Mike Stump11289f42009-09-09 15:08:12 +00001537
Douglas Gregor308047d2009-09-09 00:23:06 +00001538 CXXScopeSpec SS;
1539 SS.setRange(QualifierRange);
1540 SS.setScopeRep(Qualifier);
Mike Stump11289f42009-09-09 15:08:12 +00001541
Douglas Gregor308047d2009-09-09 00:23:06 +00001542 // FIXME: We're going to end up looking up the template based on its name,
1543 // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr.
1544 DeclarationName Name;
1545 if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl())
1546 Name = ActualTemplate->getDeclName();
Mike Stump11289f42009-09-09 15:08:12 +00001547 else if (OverloadedFunctionDecl *Ovl
Douglas Gregor308047d2009-09-09 00:23:06 +00001548 = Template.getAsOverloadedFunctionDecl())
1549 Name = Ovl->getDeclName();
1550 else
1551 Name = Template.getAsDependentTemplateName()->getName();
Mike Stump11289f42009-09-09 15:08:12 +00001552
1553 return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
Douglas Gregor308047d2009-09-09 00:23:06 +00001554 OperatorLoc, OpKind,
1555 TemplateNameLoc, Name, true,
1556 LAngleLoc, TemplateArgs,
1557 NumTemplateArgs, RAngleLoc,
1558 Sema::DeclPtrTy(), &SS);
1559 }
Mike Stump11289f42009-09-09 15:08:12 +00001560
Douglas Gregora16548e2009-08-11 05:31:07 +00001561 /// \brief Build a new Objective-C @encode expression.
1562 ///
1563 /// By default, performs semantic analysis to build the new expression.
1564 /// Subclasses may override this routine to provide different behavior.
1565 OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1566 QualType T,
1567 SourceLocation RParenLoc) {
1568 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1569 RParenLoc));
Mike Stump11289f42009-09-09 15:08:12 +00001570 }
Douglas Gregora16548e2009-08-11 05:31:07 +00001571
1572 /// \brief Build a new Objective-C protocol expression.
1573 ///
1574 /// By default, performs semantic analysis to build the new expression.
1575 /// Subclasses may override this routine to provide different behavior.
1576 OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1577 SourceLocation AtLoc,
1578 SourceLocation ProtoLoc,
1579 SourceLocation LParenLoc,
1580 SourceLocation RParenLoc) {
1581 return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1582 Protocol->getIdentifier(),
1583 AtLoc,
1584 ProtoLoc,
1585 LParenLoc,
Mike Stump11289f42009-09-09 15:08:12 +00001586 RParenLoc));
Douglas Gregora16548e2009-08-11 05:31:07 +00001587 }
Mike Stump11289f42009-09-09 15:08:12 +00001588
Douglas Gregora16548e2009-08-11 05:31:07 +00001589 /// \brief Build a new shuffle vector expression.
1590 ///
1591 /// By default, performs semantic analysis to build the new expression.
1592 /// Subclasses may override this routine to provide different behavior.
1593 OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1594 MultiExprArg SubExprs,
1595 SourceLocation RParenLoc) {
1596 // Find the declaration for __builtin_shufflevector
Mike Stump11289f42009-09-09 15:08:12 +00001597 const IdentifierInfo &Name
Douglas Gregora16548e2009-08-11 05:31:07 +00001598 = SemaRef.Context.Idents.get("__builtin_shufflevector");
1599 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1600 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1601 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
Mike Stump11289f42009-09-09 15:08:12 +00001602
Douglas Gregora16548e2009-08-11 05:31:07 +00001603 // Build a reference to the __builtin_shufflevector builtin
1604 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
Mike Stump11289f42009-09-09 15:08:12 +00001605 Expr *Callee
Douglas Gregora16548e2009-08-11 05:31:07 +00001606 = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1607 BuiltinLoc, false, false);
1608 SemaRef.UsualUnaryConversions(Callee);
Mike Stump11289f42009-09-09 15:08:12 +00001609
1610 // Build the CallExpr
Douglas Gregora16548e2009-08-11 05:31:07 +00001611 unsigned NumSubExprs = SubExprs.size();
1612 Expr **Subs = (Expr **)SubExprs.release();
1613 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1614 Subs, NumSubExprs,
1615 Builtin->getResultType(),
1616 RParenLoc);
1617 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
Mike Stump11289f42009-09-09 15:08:12 +00001618
Douglas Gregora16548e2009-08-11 05:31:07 +00001619 // Type-check the __builtin_shufflevector expression.
1620 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1621 if (Result.isInvalid())
1622 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001623
Douglas Gregora16548e2009-08-11 05:31:07 +00001624 OwnedCall.release();
Mike Stump11289f42009-09-09 15:08:12 +00001625 return move(Result);
Douglas Gregora16548e2009-08-11 05:31:07 +00001626 }
Douglas Gregord6ff3322009-08-04 16:50:30 +00001627};
Douglas Gregora16548e2009-08-11 05:31:07 +00001628
Douglas Gregorebe10102009-08-20 07:17:43 +00001629template<typename Derived>
1630Sema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
1631 if (!S)
1632 return SemaRef.Owned(S);
Mike Stump11289f42009-09-09 15:08:12 +00001633
Douglas Gregorebe10102009-08-20 07:17:43 +00001634 switch (S->getStmtClass()) {
1635 case Stmt::NoStmtClass: break;
Mike Stump11289f42009-09-09 15:08:12 +00001636
Douglas Gregorebe10102009-08-20 07:17:43 +00001637 // Transform individual statement nodes
1638#define STMT(Node, Parent) \
1639 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
1640#define EXPR(Node, Parent)
1641#include "clang/AST/StmtNodes.def"
Mike Stump11289f42009-09-09 15:08:12 +00001642
Douglas Gregorebe10102009-08-20 07:17:43 +00001643 // Transform expressions by calling TransformExpr.
1644#define STMT(Node, Parent)
1645#define EXPR(Node, Parent) case Stmt::Node##Class:
1646#include "clang/AST/StmtNodes.def"
1647 {
1648 Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
1649 if (E.isInvalid())
1650 return getSema().StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00001651
Douglas Gregorebe10102009-08-20 07:17:43 +00001652 return getSema().Owned(E.takeAs<Stmt>());
1653 }
Mike Stump11289f42009-09-09 15:08:12 +00001654 }
1655
Douglas Gregorebe10102009-08-20 07:17:43 +00001656 return SemaRef.Owned(S->Retain());
1657}
Mike Stump11289f42009-09-09 15:08:12 +00001658
1659
Douglas Gregore922c772009-08-04 22:27:00 +00001660template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00001661Sema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1662 bool isAddressOfOperand) {
1663 if (!E)
1664 return SemaRef.Owned(E);
1665
1666 switch (E->getStmtClass()) {
1667 case Stmt::NoStmtClass: break;
1668#define STMT(Node, Parent) case Stmt::Node##Class: break;
1669#define EXPR(Node, Parent) \
1670 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1671#include "clang/AST/StmtNodes.def"
Mike Stump11289f42009-09-09 15:08:12 +00001672 }
1673
Douglas Gregora16548e2009-08-11 05:31:07 +00001674 return SemaRef.Owned(E->Retain());
Douglas Gregor766b0bb2009-08-06 22:17:10 +00001675}
1676
1677template<typename Derived>
Douglas Gregor1135c352009-08-06 05:28:30 +00001678NestedNameSpecifier *
1679TreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001680 SourceRange Range,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001681 QualType ObjectType,
1682 NamedDecl *FirstQualifierInScope) {
Douglas Gregor96ee7892009-08-31 21:41:48 +00001683 if (!NNS)
1684 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001685
Douglas Gregorebe10102009-08-20 07:17:43 +00001686 // Transform the prefix of this nested name specifier.
Douglas Gregor1135c352009-08-06 05:28:30 +00001687 NestedNameSpecifier *Prefix = NNS->getPrefix();
1688 if (Prefix) {
Mike Stump11289f42009-09-09 15:08:12 +00001689 Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001690 ObjectType,
1691 FirstQualifierInScope);
Douglas Gregor1135c352009-08-06 05:28:30 +00001692 if (!Prefix)
1693 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001694
1695 // Clear out the object type and the first qualifier in scope; they only
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001696 // apply to the first element in the nested-name-specifier.
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001697 ObjectType = QualType();
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001698 FirstQualifierInScope = 0;
Douglas Gregor1135c352009-08-06 05:28:30 +00001699 }
Mike Stump11289f42009-09-09 15:08:12 +00001700
Douglas Gregor1135c352009-08-06 05:28:30 +00001701 switch (NNS->getKind()) {
1702 case NestedNameSpecifier::Identifier:
Mike Stump11289f42009-09-09 15:08:12 +00001703 assert((Prefix || !ObjectType.isNull()) &&
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001704 "Identifier nested-name-specifier with no prefix or object type");
1705 if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1706 ObjectType.isNull())
Douglas Gregor1135c352009-08-06 05:28:30 +00001707 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001708
1709 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001710 *NNS->getAsIdentifier(),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001711 ObjectType,
1712 FirstQualifierInScope);
Mike Stump11289f42009-09-09 15:08:12 +00001713
Douglas Gregor1135c352009-08-06 05:28:30 +00001714 case NestedNameSpecifier::Namespace: {
Mike Stump11289f42009-09-09 15:08:12 +00001715 NamespaceDecl *NS
Douglas Gregor1135c352009-08-06 05:28:30 +00001716 = cast_or_null<NamespaceDecl>(
1717 getDerived().TransformDecl(NNS->getAsNamespace()));
Mike Stump11289f42009-09-09 15:08:12 +00001718 if (!getDerived().AlwaysRebuild() &&
Douglas Gregor1135c352009-08-06 05:28:30 +00001719 Prefix == NNS->getPrefix() &&
1720 NS == NNS->getAsNamespace())
1721 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001722
Douglas Gregor1135c352009-08-06 05:28:30 +00001723 return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1724 }
Mike Stump11289f42009-09-09 15:08:12 +00001725
Douglas Gregor1135c352009-08-06 05:28:30 +00001726 case NestedNameSpecifier::Global:
1727 // There is no meaningful transformation that one could perform on the
1728 // global scope.
1729 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001730
Douglas Gregor1135c352009-08-06 05:28:30 +00001731 case NestedNameSpecifier::TypeSpecWithTemplate:
1732 case NestedNameSpecifier::TypeSpec: {
1733 QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
Douglas Gregor71dc5092009-08-06 06:41:21 +00001734 if (T.isNull())
1735 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001736
Douglas Gregor1135c352009-08-06 05:28:30 +00001737 if (!getDerived().AlwaysRebuild() &&
1738 Prefix == NNS->getPrefix() &&
1739 T == QualType(NNS->getAsType(), 0))
1740 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001741
1742 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1743 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
Douglas Gregor1135c352009-08-06 05:28:30 +00001744 T);
1745 }
1746 }
Mike Stump11289f42009-09-09 15:08:12 +00001747
Douglas Gregor1135c352009-08-06 05:28:30 +00001748 // Required to silence a GCC warning
Mike Stump11289f42009-09-09 15:08:12 +00001749 return 0;
Douglas Gregor1135c352009-08-06 05:28:30 +00001750}
1751
1752template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001753DeclarationName
Douglas Gregorf816bd72009-09-03 22:13:48 +00001754TreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
Douglas Gregorc59e5612009-10-19 22:04:39 +00001755 SourceLocation Loc,
1756 QualType ObjectType) {
Douglas Gregorf816bd72009-09-03 22:13:48 +00001757 if (!Name)
1758 return Name;
1759
1760 switch (Name.getNameKind()) {
1761 case DeclarationName::Identifier:
1762 case DeclarationName::ObjCZeroArgSelector:
1763 case DeclarationName::ObjCOneArgSelector:
1764 case DeclarationName::ObjCMultiArgSelector:
1765 case DeclarationName::CXXOperatorName:
1766 case DeclarationName::CXXUsingDirective:
1767 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001768
Douglas Gregorf816bd72009-09-03 22:13:48 +00001769 case DeclarationName::CXXConstructorName:
1770 case DeclarationName::CXXDestructorName:
1771 case DeclarationName::CXXConversionFunctionName: {
1772 TemporaryBase Rebase(*this, Loc, Name);
Douglas Gregorc59e5612009-10-19 22:04:39 +00001773 QualType T;
1774 if (!ObjectType.isNull() &&
1775 isa<TemplateSpecializationType>(Name.getCXXNameType())) {
1776 TemplateSpecializationType *SpecType
1777 = cast<TemplateSpecializationType>(Name.getCXXNameType());
1778 T = TransformTemplateSpecializationType(SpecType, ObjectType);
1779 } else
1780 T = getDerived().TransformType(Name.getCXXNameType());
Douglas Gregorf816bd72009-09-03 22:13:48 +00001781 if (T.isNull())
1782 return DeclarationName();
Mike Stump11289f42009-09-09 15:08:12 +00001783
Douglas Gregorf816bd72009-09-03 22:13:48 +00001784 return SemaRef.Context.DeclarationNames.getCXXSpecialName(
Mike Stump11289f42009-09-09 15:08:12 +00001785 Name.getNameKind(),
Douglas Gregorf816bd72009-09-03 22:13:48 +00001786 SemaRef.Context.getCanonicalType(T));
Douglas Gregorf816bd72009-09-03 22:13:48 +00001787 }
Mike Stump11289f42009-09-09 15:08:12 +00001788 }
1789
Douglas Gregorf816bd72009-09-03 22:13:48 +00001790 return DeclarationName();
1791}
1792
1793template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001794TemplateName
Douglas Gregor308047d2009-09-09 00:23:06 +00001795TreeTransform<Derived>::TransformTemplateName(TemplateName Name,
1796 QualType ObjectType) {
Douglas Gregor71dc5092009-08-06 06:41:21 +00001797 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
Mike Stump11289f42009-09-09 15:08:12 +00001798 NestedNameSpecifier *NNS
Douglas Gregor71dc5092009-08-06 06:41:21 +00001799 = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1800 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1801 if (!NNS)
1802 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001803
Douglas Gregor71dc5092009-08-06 06:41:21 +00001804 if (TemplateDecl *Template = QTN->getTemplateDecl()) {
Mike Stump11289f42009-09-09 15:08:12 +00001805 TemplateDecl *TransTemplate
Douglas Gregor71dc5092009-08-06 06:41:21 +00001806 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1807 if (!TransTemplate)
1808 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001809
Douglas Gregor71dc5092009-08-06 06:41:21 +00001810 if (!getDerived().AlwaysRebuild() &&
1811 NNS == QTN->getQualifier() &&
1812 TransTemplate == Template)
1813 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001814
Douglas Gregor71dc5092009-08-06 06:41:21 +00001815 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1816 TransTemplate);
1817 }
Mike Stump11289f42009-09-09 15:08:12 +00001818
Douglas Gregor71dc5092009-08-06 06:41:21 +00001819 OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1820 assert(Ovl && "Not a template name or an overload set?");
Mike Stump11289f42009-09-09 15:08:12 +00001821 OverloadedFunctionDecl *TransOvl
Douglas Gregor71dc5092009-08-06 06:41:21 +00001822 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1823 if (!TransOvl)
1824 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001825
Douglas Gregor71dc5092009-08-06 06:41:21 +00001826 if (!getDerived().AlwaysRebuild() &&
1827 NNS == QTN->getQualifier() &&
1828 TransOvl == Ovl)
1829 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001830
Douglas Gregor71dc5092009-08-06 06:41:21 +00001831 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1832 TransOvl);
1833 }
Mike Stump11289f42009-09-09 15:08:12 +00001834
Douglas Gregor71dc5092009-08-06 06:41:21 +00001835 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
Mike Stump11289f42009-09-09 15:08:12 +00001836 NestedNameSpecifier *NNS
Douglas Gregor71dc5092009-08-06 06:41:21 +00001837 = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1838 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
Douglas Gregor308047d2009-09-09 00:23:06 +00001839 if (!NNS && DTN->getQualifier())
Douglas Gregor71dc5092009-08-06 06:41:21 +00001840 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001841
Douglas Gregor71dc5092009-08-06 06:41:21 +00001842 if (!getDerived().AlwaysRebuild() &&
Douglas Gregorc59e5612009-10-19 22:04:39 +00001843 NNS == DTN->getQualifier() &&
1844 ObjectType.isNull())
Douglas Gregor71dc5092009-08-06 06:41:21 +00001845 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001846
Douglas Gregor308047d2009-09-09 00:23:06 +00001847 return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType);
Douglas Gregor71dc5092009-08-06 06:41:21 +00001848 }
Mike Stump11289f42009-09-09 15:08:12 +00001849
Douglas Gregor71dc5092009-08-06 06:41:21 +00001850 if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
Mike Stump11289f42009-09-09 15:08:12 +00001851 TemplateDecl *TransTemplate
Douglas Gregor71dc5092009-08-06 06:41:21 +00001852 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1853 if (!TransTemplate)
1854 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001855
Douglas Gregor71dc5092009-08-06 06:41:21 +00001856 if (!getDerived().AlwaysRebuild() &&
1857 TransTemplate == Template)
1858 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001859
Douglas Gregor71dc5092009-08-06 06:41:21 +00001860 return TemplateName(TransTemplate);
1861 }
Mike Stump11289f42009-09-09 15:08:12 +00001862
Douglas Gregor71dc5092009-08-06 06:41:21 +00001863 OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1864 assert(Ovl && "Not a template name or an overload set?");
Mike Stump11289f42009-09-09 15:08:12 +00001865 OverloadedFunctionDecl *TransOvl
Douglas Gregor71dc5092009-08-06 06:41:21 +00001866 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1867 if (!TransOvl)
1868 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001869
Douglas Gregor71dc5092009-08-06 06:41:21 +00001870 if (!getDerived().AlwaysRebuild() &&
1871 TransOvl == Ovl)
1872 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001873
Douglas Gregor71dc5092009-08-06 06:41:21 +00001874 return TemplateName(TransOvl);
1875}
1876
1877template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001878TemplateArgument
Douglas Gregore922c772009-08-04 22:27:00 +00001879TreeTransform<Derived>::TransformTemplateArgument(const TemplateArgument &Arg) {
1880 switch (Arg.getKind()) {
1881 case TemplateArgument::Null:
1882 case TemplateArgument::Integral:
1883 return Arg;
Mike Stump11289f42009-09-09 15:08:12 +00001884
Douglas Gregore922c772009-08-04 22:27:00 +00001885 case TemplateArgument::Type: {
1886 QualType T = getDerived().TransformType(Arg.getAsType());
1887 if (T.isNull())
1888 return TemplateArgument();
1889 return TemplateArgument(Arg.getLocation(), T);
1890 }
Mike Stump11289f42009-09-09 15:08:12 +00001891
Douglas Gregore922c772009-08-04 22:27:00 +00001892 case TemplateArgument::Declaration: {
1893 Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
1894 if (!D)
1895 return TemplateArgument();
1896 return TemplateArgument(Arg.getLocation(), D);
1897 }
Mike Stump11289f42009-09-09 15:08:12 +00001898
Douglas Gregore922c772009-08-04 22:27:00 +00001899 case TemplateArgument::Expression: {
1900 // Template argument expressions are not potentially evaluated.
Mike Stump11289f42009-09-09 15:08:12 +00001901 EnterExpressionEvaluationContext Unevaluated(getSema(),
Douglas Gregore922c772009-08-04 22:27:00 +00001902 Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00001903
Douglas Gregore922c772009-08-04 22:27:00 +00001904 Sema::OwningExprResult E = getDerived().TransformExpr(Arg.getAsExpr());
1905 if (E.isInvalid())
1906 return TemplateArgument();
1907 return TemplateArgument(E.takeAs<Expr>());
1908 }
Mike Stump11289f42009-09-09 15:08:12 +00001909
Douglas Gregore922c772009-08-04 22:27:00 +00001910 case TemplateArgument::Pack: {
1911 llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
1912 TransformedArgs.reserve(Arg.pack_size());
Mike Stump11289f42009-09-09 15:08:12 +00001913 for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
Douglas Gregore922c772009-08-04 22:27:00 +00001914 AEnd = Arg.pack_end();
1915 A != AEnd; ++A) {
1916 TemplateArgument TA = getDerived().TransformTemplateArgument(*A);
1917 if (TA.isNull())
1918 return TA;
Mike Stump11289f42009-09-09 15:08:12 +00001919
Douglas Gregore922c772009-08-04 22:27:00 +00001920 TransformedArgs.push_back(TA);
1921 }
1922 TemplateArgument Result;
Mike Stump11289f42009-09-09 15:08:12 +00001923 Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
Douglas Gregore922c772009-08-04 22:27:00 +00001924 true);
1925 return Result;
1926 }
1927 }
Mike Stump11289f42009-09-09 15:08:12 +00001928
Douglas Gregore922c772009-08-04 22:27:00 +00001929 // Work around bogus GCC warning
1930 return TemplateArgument();
1931}
1932
Douglas Gregord6ff3322009-08-04 16:50:30 +00001933//===----------------------------------------------------------------------===//
1934// Type transformation
1935//===----------------------------------------------------------------------===//
1936
1937template<typename Derived>
1938QualType TreeTransform<Derived>::TransformType(QualType T) {
1939 if (getDerived().AlreadyTransformed(T))
1940 return T;
Mike Stump11289f42009-09-09 15:08:12 +00001941
John McCall8ccfcb52009-09-24 19:53:00 +00001942 QualifierCollector Qs;
1943 const Type *Ty = Qs.strip(T);
1944
Douglas Gregord6ff3322009-08-04 16:50:30 +00001945 QualType Result;
John McCall8ccfcb52009-09-24 19:53:00 +00001946 switch (Ty->getTypeClass()) {
Mike Stump11289f42009-09-09 15:08:12 +00001947#define ABSTRACT_TYPE(CLASS, PARENT)
Douglas Gregord6ff3322009-08-04 16:50:30 +00001948#define TYPE(CLASS, PARENT) \
1949 case Type::CLASS: \
1950 Result = getDerived().Transform##CLASS##Type( \
John McCall8ccfcb52009-09-24 19:53:00 +00001951 static_cast<const CLASS##Type*>(Ty)); \
Douglas Gregord6ff3322009-08-04 16:50:30 +00001952 break;
Mike Stump11289f42009-09-09 15:08:12 +00001953#include "clang/AST/TypeNodes.def"
Douglas Gregord6ff3322009-08-04 16:50:30 +00001954 }
Mike Stump11289f42009-09-09 15:08:12 +00001955
Douglas Gregord6ff3322009-08-04 16:50:30 +00001956 if (Result.isNull() || T == Result)
1957 return Result;
Mike Stump11289f42009-09-09 15:08:12 +00001958
John McCall8ccfcb52009-09-24 19:53:00 +00001959 return getDerived().AddTypeQualifiers(Result, Qs);
Douglas Gregord6ff3322009-08-04 16:50:30 +00001960}
Mike Stump11289f42009-09-09 15:08:12 +00001961
Douglas Gregord6ff3322009-08-04 16:50:30 +00001962template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001963QualType
John McCall8ccfcb52009-09-24 19:53:00 +00001964TreeTransform<Derived>::AddTypeQualifiers(QualType T, Qualifiers Quals) {
1965 if (!Quals.empty() && !T->isFunctionType() && !T->isReferenceType())
1966 return SemaRef.Context.getQualifiedType(T, Quals);
Mike Stump11289f42009-09-09 15:08:12 +00001967
Douglas Gregord6ff3322009-08-04 16:50:30 +00001968 return T;
1969}
Argyrios Kyrtzidise9189262009-08-19 01:28:17 +00001970
Douglas Gregord6ff3322009-08-04 16:50:30 +00001971template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001972QualType TreeTransform<Derived>::TransformBuiltinType(const BuiltinType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00001973 // Nothing to do
Mike Stump11289f42009-09-09 15:08:12 +00001974 return QualType(T, 0);
Douglas Gregord6ff3322009-08-04 16:50:30 +00001975}
Mike Stump11289f42009-09-09 15:08:12 +00001976
Douglas Gregord6ff3322009-08-04 16:50:30 +00001977template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001978QualType TreeTransform<Derived>::TransformFixedWidthIntType(
1979 const FixedWidthIntType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00001980 // FIXME: Implement
Mike Stump11289f42009-09-09 15:08:12 +00001981 return QualType(T, 0);
Douglas Gregord6ff3322009-08-04 16:50:30 +00001982}
Mike Stump11289f42009-09-09 15:08:12 +00001983
1984template<typename Derived>
1985QualType TreeTransform<Derived>::TransformComplexType(const ComplexType *T) {
1986 // FIXME: Implement
1987 return QualType(T, 0);
1988}
1989
1990template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00001991QualType TreeTransform<Derived>::TransformPointerType(const PointerType *T) {
1992 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
1993 if (PointeeType.isNull())
1994 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00001995
Douglas Gregord6ff3322009-08-04 16:50:30 +00001996 if (!getDerived().AlwaysRebuild() &&
1997 PointeeType == T->getPointeeType())
1998 return QualType(T, 0);
1999
2000 return getDerived().RebuildPointerType(PointeeType);
2001}
Mike Stump11289f42009-09-09 15:08:12 +00002002
2003template<typename Derived>
2004QualType
2005TreeTransform<Derived>::TransformBlockPointerType(const BlockPointerType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002006 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2007 if (PointeeType.isNull())
2008 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002009
Douglas Gregord6ff3322009-08-04 16:50:30 +00002010 if (!getDerived().AlwaysRebuild() &&
2011 PointeeType == T->getPointeeType())
2012 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002013
Douglas Gregord6ff3322009-08-04 16:50:30 +00002014 return getDerived().RebuildBlockPointerType(PointeeType);
2015}
2016
Mike Stump11289f42009-09-09 15:08:12 +00002017template<typename Derived>
2018QualType
Douglas Gregord6ff3322009-08-04 16:50:30 +00002019TreeTransform<Derived>::TransformLValueReferenceType(
Mike Stump11289f42009-09-09 15:08:12 +00002020 const LValueReferenceType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002021 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2022 if (PointeeType.isNull())
2023 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002024
Douglas Gregord6ff3322009-08-04 16:50:30 +00002025 if (!getDerived().AlwaysRebuild() &&
2026 PointeeType == T->getPointeeType())
2027 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002028
Douglas Gregord6ff3322009-08-04 16:50:30 +00002029 return getDerived().RebuildLValueReferenceType(PointeeType);
2030}
2031
Mike Stump11289f42009-09-09 15:08:12 +00002032template<typename Derived>
2033QualType
Douglas Gregord6ff3322009-08-04 16:50:30 +00002034TreeTransform<Derived>::TransformRValueReferenceType(
Mike Stump11289f42009-09-09 15:08:12 +00002035 const RValueReferenceType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002036 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2037 if (PointeeType.isNull())
2038 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002039
Douglas Gregord6ff3322009-08-04 16:50:30 +00002040 if (!getDerived().AlwaysRebuild() &&
2041 PointeeType == T->getPointeeType())
2042 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002043
Douglas Gregord6ff3322009-08-04 16:50:30 +00002044 return getDerived().RebuildRValueReferenceType(PointeeType);
2045}
Mike Stump11289f42009-09-09 15:08:12 +00002046
Douglas Gregord6ff3322009-08-04 16:50:30 +00002047template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002048QualType
2049TreeTransform<Derived>::TransformMemberPointerType(const MemberPointerType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002050 QualType PointeeType = getDerived().TransformType(T->getPointeeType());
2051 if (PointeeType.isNull())
2052 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002053
Douglas Gregord6ff3322009-08-04 16:50:30 +00002054 QualType ClassType = getDerived().TransformType(QualType(T->getClass(), 0));
2055 if (ClassType.isNull())
2056 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002057
Douglas Gregord6ff3322009-08-04 16:50:30 +00002058 if (!getDerived().AlwaysRebuild() &&
2059 PointeeType == T->getPointeeType() &&
2060 ClassType == QualType(T->getClass(), 0))
2061 return QualType(T, 0);
2062
2063 return getDerived().RebuildMemberPointerType(PointeeType, ClassType);
2064}
2065
Mike Stump11289f42009-09-09 15:08:12 +00002066template<typename Derived>
2067QualType
2068TreeTransform<Derived>::TransformConstantArrayType(const ConstantArrayType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002069 QualType ElementType = getDerived().TransformType(T->getElementType());
2070 if (ElementType.isNull())
2071 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002072
Douglas Gregord6ff3322009-08-04 16:50:30 +00002073 if (!getDerived().AlwaysRebuild() &&
2074 ElementType == T->getElementType())
2075 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002076
2077 return getDerived().RebuildConstantArrayType(ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00002078 T->getSizeModifier(),
2079 T->getSize(),
John McCall8ccfcb52009-09-24 19:53:00 +00002080 T->getIndexTypeCVRQualifiers());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002081}
Mike Stump11289f42009-09-09 15:08:12 +00002082
Douglas Gregord6ff3322009-08-04 16:50:30 +00002083template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002084QualType TreeTransform<Derived>::TransformIncompleteArrayType(
Mike Stump11289f42009-09-09 15:08:12 +00002085 const IncompleteArrayType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002086 QualType ElementType = getDerived().TransformType(T->getElementType());
2087 if (ElementType.isNull())
2088 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002089
Douglas Gregord6ff3322009-08-04 16:50:30 +00002090 if (!getDerived().AlwaysRebuild() &&
2091 ElementType == T->getElementType())
2092 return QualType(T, 0);
2093
2094 return getDerived().RebuildIncompleteArrayType(ElementType,
2095 T->getSizeModifier(),
John McCall8ccfcb52009-09-24 19:53:00 +00002096 T->getIndexTypeCVRQualifiers());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002097}
Mike Stump11289f42009-09-09 15:08:12 +00002098
Douglas Gregord6ff3322009-08-04 16:50:30 +00002099template<typename Derived>
2100QualType TreeTransform<Derived>::TransformVariableArrayType(
Mike Stump11289f42009-09-09 15:08:12 +00002101 const VariableArrayType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002102 QualType ElementType = getDerived().TransformType(T->getElementType());
2103 if (ElementType.isNull())
2104 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002105
Douglas Gregore922c772009-08-04 22:27:00 +00002106 // Array bounds are not potentially evaluated contexts
2107 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2108
Douglas Gregord6ff3322009-08-04 16:50:30 +00002109 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2110 if (Size.isInvalid())
2111 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002112
Douglas Gregord6ff3322009-08-04 16:50:30 +00002113 if (!getDerived().AlwaysRebuild() &&
2114 ElementType == T->getElementType() &&
2115 Size.get() == T->getSizeExpr()) {
2116 Size.take();
2117 return QualType(T, 0);
2118 }
Mike Stump11289f42009-09-09 15:08:12 +00002119
2120 return getDerived().RebuildVariableArrayType(ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00002121 T->getSizeModifier(),
2122 move(Size),
John McCall8ccfcb52009-09-24 19:53:00 +00002123 T->getIndexTypeCVRQualifiers(),
Douglas Gregord6ff3322009-08-04 16:50:30 +00002124 T->getBracketsRange());
2125}
Mike Stump11289f42009-09-09 15:08:12 +00002126
2127template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002128QualType TreeTransform<Derived>::TransformDependentSizedArrayType(
Mike Stump11289f42009-09-09 15:08:12 +00002129 const DependentSizedArrayType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002130 QualType ElementType = getDerived().TransformType(T->getElementType());
2131 if (ElementType.isNull())
2132 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002133
Douglas Gregore922c772009-08-04 22:27:00 +00002134 // Array bounds are not potentially evaluated contexts
2135 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002136
Douglas Gregord6ff3322009-08-04 16:50:30 +00002137 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2138 if (Size.isInvalid())
2139 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002140
Douglas Gregord6ff3322009-08-04 16:50:30 +00002141 if (!getDerived().AlwaysRebuild() &&
2142 ElementType == T->getElementType() &&
2143 Size.get() == T->getSizeExpr()) {
2144 Size.take();
2145 return QualType(T, 0);
2146 }
Mike Stump11289f42009-09-09 15:08:12 +00002147
2148 return getDerived().RebuildDependentSizedArrayType(ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00002149 T->getSizeModifier(),
2150 move(Size),
John McCall8ccfcb52009-09-24 19:53:00 +00002151 T->getIndexTypeCVRQualifiers(),
Douglas Gregord6ff3322009-08-04 16:50:30 +00002152 T->getBracketsRange());
2153}
Mike Stump11289f42009-09-09 15:08:12 +00002154
2155template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002156QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
Mike Stump11289f42009-09-09 15:08:12 +00002157 const DependentSizedExtVectorType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002158 QualType ElementType = getDerived().TransformType(T->getElementType());
2159 if (ElementType.isNull())
2160 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002161
Douglas Gregore922c772009-08-04 22:27:00 +00002162 // Vector sizes are not potentially evaluated contexts
2163 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2164
Douglas Gregord6ff3322009-08-04 16:50:30 +00002165 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2166 if (Size.isInvalid())
2167 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002168
Douglas Gregord6ff3322009-08-04 16:50:30 +00002169 if (!getDerived().AlwaysRebuild() &&
2170 ElementType == T->getElementType() &&
2171 Size.get() == T->getSizeExpr()) {
2172 Size.take();
2173 return QualType(T, 0);
2174 }
Mike Stump11289f42009-09-09 15:08:12 +00002175
2176 return getDerived().RebuildDependentSizedExtVectorType(ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00002177 move(Size),
2178 T->getAttributeLoc());
2179}
Mike Stump11289f42009-09-09 15:08:12 +00002180
2181template<typename Derived>
2182QualType TreeTransform<Derived>::TransformVectorType(const VectorType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002183 QualType ElementType = getDerived().TransformType(T->getElementType());
2184 if (ElementType.isNull())
2185 return QualType();
2186
2187 if (!getDerived().AlwaysRebuild() &&
2188 ElementType == T->getElementType())
2189 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002190
Douglas Gregord6ff3322009-08-04 16:50:30 +00002191 return getDerived().RebuildVectorType(ElementType, T->getNumElements());
2192}
Mike Stump11289f42009-09-09 15:08:12 +00002193
2194template<typename Derived>
2195QualType
2196TreeTransform<Derived>::TransformExtVectorType(const ExtVectorType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002197 QualType ElementType = getDerived().TransformType(T->getElementType());
2198 if (ElementType.isNull())
2199 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002200
Douglas Gregord6ff3322009-08-04 16:50:30 +00002201 if (!getDerived().AlwaysRebuild() &&
2202 ElementType == T->getElementType())
2203 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002204
Douglas Gregord6ff3322009-08-04 16:50:30 +00002205 return getDerived().RebuildExtVectorType(ElementType, T->getNumElements(),
2206 /*FIXME*/SourceLocation());
2207}
2208
Mike Stump11289f42009-09-09 15:08:12 +00002209template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002210QualType TreeTransform<Derived>::TransformFunctionProtoType(
Mike Stump11289f42009-09-09 15:08:12 +00002211 const FunctionProtoType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002212 QualType ResultType = getDerived().TransformType(T->getResultType());
2213 if (ResultType.isNull())
2214 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002215
Douglas Gregord6ff3322009-08-04 16:50:30 +00002216 llvm::SmallVector<QualType, 4> ParamTypes;
2217 for (FunctionProtoType::arg_type_iterator Param = T->arg_type_begin(),
Mike Stump11289f42009-09-09 15:08:12 +00002218 ParamEnd = T->arg_type_end();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002219 Param != ParamEnd; ++Param) {
2220 QualType P = getDerived().TransformType(*Param);
2221 if (P.isNull())
2222 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002223
Douglas Gregord6ff3322009-08-04 16:50:30 +00002224 ParamTypes.push_back(P);
2225 }
Mike Stump11289f42009-09-09 15:08:12 +00002226
Douglas Gregord6ff3322009-08-04 16:50:30 +00002227 if (!getDerived().AlwaysRebuild() &&
2228 ResultType == T->getResultType() &&
2229 std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin()))
2230 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002231
2232 return getDerived().RebuildFunctionProtoType(ResultType, ParamTypes.data(),
Douglas Gregord6ff3322009-08-04 16:50:30 +00002233 ParamTypes.size(), T->isVariadic(),
2234 T->getTypeQuals());
2235}
Mike Stump11289f42009-09-09 15:08:12 +00002236
Douglas Gregord6ff3322009-08-04 16:50:30 +00002237template<typename Derived>
2238QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
Mike Stump11289f42009-09-09 15:08:12 +00002239 const FunctionNoProtoType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002240 // FIXME: Implement
Mike Stump11289f42009-09-09 15:08:12 +00002241 return QualType(T, 0);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002242}
Mike Stump11289f42009-09-09 15:08:12 +00002243
Douglas Gregord6ff3322009-08-04 16:50:30 +00002244template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002245QualType TreeTransform<Derived>::TransformTypedefType(const TypedefType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002246 TypedefDecl *Typedef
2247 = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2248 if (!Typedef)
2249 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002250
Douglas Gregord6ff3322009-08-04 16:50:30 +00002251 if (!getDerived().AlwaysRebuild() &&
2252 Typedef == T->getDecl())
2253 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002254
Douglas Gregord6ff3322009-08-04 16:50:30 +00002255 return getDerived().RebuildTypedefType(Typedef);
2256}
Mike Stump11289f42009-09-09 15:08:12 +00002257
Douglas Gregord6ff3322009-08-04 16:50:30 +00002258template<typename Derived>
2259QualType TreeTransform<Derived>::TransformTypeOfExprType(
Mike Stump11289f42009-09-09 15:08:12 +00002260 const TypeOfExprType *T) {
Douglas Gregore922c772009-08-04 22:27:00 +00002261 // typeof expressions are not potentially evaluated contexts
2262 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002263
Douglas Gregord6ff3322009-08-04 16:50:30 +00002264 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2265 if (E.isInvalid())
2266 return QualType();
2267
2268 if (!getDerived().AlwaysRebuild() &&
2269 E.get() == T->getUnderlyingExpr()) {
2270 E.take();
2271 return QualType(T, 0);
2272 }
Mike Stump11289f42009-09-09 15:08:12 +00002273
Douglas Gregord6ff3322009-08-04 16:50:30 +00002274 return getDerived().RebuildTypeOfExprType(move(E));
2275}
Mike Stump11289f42009-09-09 15:08:12 +00002276
2277template<typename Derived>
2278QualType TreeTransform<Derived>::TransformTypeOfType(const TypeOfType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002279 QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2280 if (Underlying.isNull())
2281 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002282
Douglas Gregord6ff3322009-08-04 16:50:30 +00002283 if (!getDerived().AlwaysRebuild() &&
2284 Underlying == T->getUnderlyingType())
2285 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002286
Douglas Gregord6ff3322009-08-04 16:50:30 +00002287 return getDerived().RebuildTypeOfType(Underlying);
2288}
Mike Stump11289f42009-09-09 15:08:12 +00002289
2290template<typename Derived>
2291QualType TreeTransform<Derived>::TransformDecltypeType(const DecltypeType *T) {
Douglas Gregore922c772009-08-04 22:27:00 +00002292 // decltype expressions are not potentially evaluated contexts
2293 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002294
Douglas Gregord6ff3322009-08-04 16:50:30 +00002295 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2296 if (E.isInvalid())
2297 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002298
Douglas Gregord6ff3322009-08-04 16:50:30 +00002299 if (!getDerived().AlwaysRebuild() &&
2300 E.get() == T->getUnderlyingExpr()) {
2301 E.take();
2302 return QualType(T, 0);
2303 }
Mike Stump11289f42009-09-09 15:08:12 +00002304
Douglas Gregord6ff3322009-08-04 16:50:30 +00002305 return getDerived().RebuildDecltypeType(move(E));
2306}
2307
2308template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002309QualType TreeTransform<Derived>::TransformRecordType(const RecordType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002310 RecordDecl *Record
2311 = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
2312 if (!Record)
2313 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002314
Douglas Gregord6ff3322009-08-04 16:50:30 +00002315 if (!getDerived().AlwaysRebuild() &&
2316 Record == T->getDecl())
2317 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002318
Douglas Gregord6ff3322009-08-04 16:50:30 +00002319 return getDerived().RebuildRecordType(Record);
2320}
Mike Stump11289f42009-09-09 15:08:12 +00002321
2322template<typename Derived>
2323QualType TreeTransform<Derived>::TransformEnumType(const EnumType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002324 EnumDecl *Enum
2325 = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
2326 if (!Enum)
2327 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002328
Douglas Gregord6ff3322009-08-04 16:50:30 +00002329 if (!getDerived().AlwaysRebuild() &&
2330 Enum == T->getDecl())
2331 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002332
Douglas Gregord6ff3322009-08-04 16:50:30 +00002333 return getDerived().RebuildEnumType(Enum);
2334}
John McCallfcc33b02009-09-05 00:15:47 +00002335
2336template <typename Derived>
2337QualType TreeTransform<Derived>::TransformElaboratedType(
2338 const ElaboratedType *T) {
2339 QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2340 if (Underlying.isNull())
2341 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002342
John McCallfcc33b02009-09-05 00:15:47 +00002343 if (!getDerived().AlwaysRebuild() &&
2344 Underlying == T->getUnderlyingType())
2345 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002346
John McCallfcc33b02009-09-05 00:15:47 +00002347 return getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
2348}
Mike Stump11289f42009-09-09 15:08:12 +00002349
2350
Douglas Gregord6ff3322009-08-04 16:50:30 +00002351template<typename Derived>
2352QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
Mike Stump11289f42009-09-09 15:08:12 +00002353 const TemplateTypeParmType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002354 // Nothing to do
Mike Stump11289f42009-09-09 15:08:12 +00002355 return QualType(T, 0);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002356}
2357
Mike Stump11289f42009-09-09 15:08:12 +00002358template<typename Derived>
John McCallcebee162009-10-18 09:09:24 +00002359QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
2360 const SubstTemplateTypeParmType *T) {
2361 // Nothing to do
2362 return QualType(T, 0);
2363}
2364
2365template<typename Derived>
Douglas Gregorc59e5612009-10-19 22:04:39 +00002366inline QualType
2367TreeTransform<Derived>::TransformTemplateSpecializationType(
2368 const TemplateSpecializationType *T) {
2369 return TransformTemplateSpecializationType(T, QualType());
2370}
2371
2372template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002373QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
Douglas Gregorc59e5612009-10-19 22:04:39 +00002374 const TemplateSpecializationType *T,
2375 QualType ObjectType) {
Mike Stump11289f42009-09-09 15:08:12 +00002376 TemplateName Template
Douglas Gregorc59e5612009-10-19 22:04:39 +00002377 = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002378 if (Template.isNull())
2379 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002380
Douglas Gregord6ff3322009-08-04 16:50:30 +00002381 llvm::SmallVector<TemplateArgument, 4> NewTemplateArgs;
2382 NewTemplateArgs.reserve(T->getNumArgs());
2383 for (TemplateSpecializationType::iterator Arg = T->begin(), ArgEnd = T->end();
2384 Arg != ArgEnd; ++Arg) {
2385 TemplateArgument NewArg = getDerived().TransformTemplateArgument(*Arg);
2386 if (NewArg.isNull())
2387 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002388
Douglas Gregord6ff3322009-08-04 16:50:30 +00002389 NewTemplateArgs.push_back(NewArg);
2390 }
Mike Stump11289f42009-09-09 15:08:12 +00002391
Douglas Gregord6ff3322009-08-04 16:50:30 +00002392 // FIXME: early abort if all of the template arguments and such are the
2393 // same.
Mike Stump11289f42009-09-09 15:08:12 +00002394
Douglas Gregord6ff3322009-08-04 16:50:30 +00002395 // FIXME: We're missing the locations of the template name, '<', and '>'.
2396 return getDerived().RebuildTemplateSpecializationType(Template,
2397 NewTemplateArgs.data(),
2398 NewTemplateArgs.size());
2399}
Mike Stump11289f42009-09-09 15:08:12 +00002400
2401template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002402QualType TreeTransform<Derived>::TransformQualifiedNameType(
2403 const QualifiedNameType *T) {
2404 NestedNameSpecifier *NNS
2405 = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2406 SourceRange());
2407 if (!NNS)
2408 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002409
Douglas Gregord6ff3322009-08-04 16:50:30 +00002410 QualType Named = getDerived().TransformType(T->getNamedType());
2411 if (Named.isNull())
2412 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002413
Douglas Gregord6ff3322009-08-04 16:50:30 +00002414 if (!getDerived().AlwaysRebuild() &&
2415 NNS == T->getQualifier() &&
2416 Named == T->getNamedType())
2417 return QualType(T, 0);
2418
2419 return getDerived().RebuildQualifiedNameType(NNS, Named);
2420}
Mike Stump11289f42009-09-09 15:08:12 +00002421
2422template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002423QualType TreeTransform<Derived>::TransformTypenameType(const TypenameType *T) {
2424 NestedNameSpecifier *NNS
2425 = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
Douglas Gregor15acfb92009-08-06 16:20:37 +00002426 SourceRange(/*FIXME:*/getDerived().getBaseLocation()));
Douglas Gregord6ff3322009-08-04 16:50:30 +00002427 if (!NNS)
2428 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002429
Douglas Gregord6ff3322009-08-04 16:50:30 +00002430 if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
Mike Stump11289f42009-09-09 15:08:12 +00002431 QualType NewTemplateId
Douglas Gregord6ff3322009-08-04 16:50:30 +00002432 = getDerived().TransformType(QualType(TemplateId, 0));
2433 if (NewTemplateId.isNull())
2434 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002435
Douglas Gregord6ff3322009-08-04 16:50:30 +00002436 if (!getDerived().AlwaysRebuild() &&
2437 NNS == T->getQualifier() &&
2438 NewTemplateId == QualType(TemplateId, 0))
2439 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002440
Douglas Gregord6ff3322009-08-04 16:50:30 +00002441 return getDerived().RebuildTypenameType(NNS, NewTemplateId);
2442 }
2443
2444 return getDerived().RebuildTypenameType(NNS, T->getIdentifier());
2445}
Mike Stump11289f42009-09-09 15:08:12 +00002446
Douglas Gregord6ff3322009-08-04 16:50:30 +00002447template<typename Derived>
2448QualType TreeTransform<Derived>::TransformObjCInterfaceType(
Mike Stump11289f42009-09-09 15:08:12 +00002449 const ObjCInterfaceType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002450 // FIXME: Implement
Mike Stump11289f42009-09-09 15:08:12 +00002451 return QualType(T, 0);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002452}
Mike Stump11289f42009-09-09 15:08:12 +00002453
2454template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002455QualType TreeTransform<Derived>::TransformObjCObjectPointerType(
Mike Stump11289f42009-09-09 15:08:12 +00002456 const ObjCObjectPointerType *T) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00002457 // FIXME: Implement
Mike Stump11289f42009-09-09 15:08:12 +00002458 return QualType(T, 0);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002459}
2460
Argyrios Kyrtzidisa7a36df2009-09-29 19:42:55 +00002461template<typename Derived>
2462QualType TreeTransform<Derived>::TransformObjCProtocolListType(
2463 const ObjCProtocolListType *T) {
2464 assert(false && "Should not see ObjCProtocolList types");
2465 return QualType(T, 0);
2466}
2467
Douglas Gregord6ff3322009-08-04 16:50:30 +00002468//===----------------------------------------------------------------------===//
Douglas Gregorebe10102009-08-20 07:17:43 +00002469// Statement transformation
2470//===----------------------------------------------------------------------===//
2471template<typename Derived>
2472Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002473TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
2474 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002475}
2476
2477template<typename Derived>
2478Sema::OwningStmtResult
2479TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
2480 return getDerived().TransformCompoundStmt(S, false);
2481}
2482
2483template<typename Derived>
2484Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002485TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
Douglas Gregorebe10102009-08-20 07:17:43 +00002486 bool IsStmtExpr) {
2487 bool SubStmtChanged = false;
2488 ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
2489 for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
2490 B != BEnd; ++B) {
2491 OwningStmtResult Result = getDerived().TransformStmt(*B);
2492 if (Result.isInvalid())
2493 return getSema().StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002494
Douglas Gregorebe10102009-08-20 07:17:43 +00002495 SubStmtChanged = SubStmtChanged || Result.get() != *B;
2496 Statements.push_back(Result.takeAs<Stmt>());
2497 }
Mike Stump11289f42009-09-09 15:08:12 +00002498
Douglas Gregorebe10102009-08-20 07:17:43 +00002499 if (!getDerived().AlwaysRebuild() &&
2500 !SubStmtChanged)
Mike Stump11289f42009-09-09 15:08:12 +00002501 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002502
2503 return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
2504 move_arg(Statements),
2505 S->getRBracLoc(),
2506 IsStmtExpr);
2507}
Mike Stump11289f42009-09-09 15:08:12 +00002508
Douglas Gregorebe10102009-08-20 07:17:43 +00002509template<typename Derived>
2510Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002511TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002512 // The case value expressions are not potentially evaluated.
2513 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002514
Douglas Gregorebe10102009-08-20 07:17:43 +00002515 // Transform the left-hand case value.
2516 OwningExprResult LHS = getDerived().TransformExpr(S->getLHS());
2517 if (LHS.isInvalid())
2518 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002519
Douglas Gregorebe10102009-08-20 07:17:43 +00002520 // Transform the right-hand case value (for the GNU case-range extension).
2521 OwningExprResult RHS = getDerived().TransformExpr(S->getRHS());
2522 if (RHS.isInvalid())
2523 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002524
Douglas Gregorebe10102009-08-20 07:17:43 +00002525 // Build the case statement.
2526 // Case statements are always rebuilt so that they will attached to their
2527 // transformed switch statement.
2528 OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
2529 move(LHS),
2530 S->getEllipsisLoc(),
2531 move(RHS),
2532 S->getColonLoc());
2533 if (Case.isInvalid())
2534 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002535
Douglas Gregorebe10102009-08-20 07:17:43 +00002536 // Transform the statement following the case
2537 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
2538 if (SubStmt.isInvalid())
2539 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002540
Douglas Gregorebe10102009-08-20 07:17:43 +00002541 // Attach the body to the case statement
2542 return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
2543}
2544
2545template<typename Derived>
2546Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002547TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002548 // Transform the statement following the default case
2549 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
2550 if (SubStmt.isInvalid())
2551 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002552
Douglas Gregorebe10102009-08-20 07:17:43 +00002553 // Default statements are always rebuilt
2554 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
2555 move(SubStmt));
2556}
Mike Stump11289f42009-09-09 15:08:12 +00002557
Douglas Gregorebe10102009-08-20 07:17:43 +00002558template<typename Derived>
2559Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002560TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002561 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
2562 if (SubStmt.isInvalid())
2563 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002564
Douglas Gregorebe10102009-08-20 07:17:43 +00002565 // FIXME: Pass the real colon location in.
2566 SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
2567 return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
2568 move(SubStmt));
2569}
Mike Stump11289f42009-09-09 15:08:12 +00002570
Douglas Gregorebe10102009-08-20 07:17:43 +00002571template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002572Sema::OwningStmtResult
2573TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002574 // Transform the condition
2575 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2576 if (Cond.isInvalid())
2577 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002578
Douglas Gregorebe10102009-08-20 07:17:43 +00002579 Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
Mike Stump11289f42009-09-09 15:08:12 +00002580
Douglas Gregorebe10102009-08-20 07:17:43 +00002581 // Transform the "then" branch.
2582 OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
2583 if (Then.isInvalid())
2584 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002585
Douglas Gregorebe10102009-08-20 07:17:43 +00002586 // Transform the "else" branch.
2587 OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
2588 if (Else.isInvalid())
2589 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002590
Douglas Gregorebe10102009-08-20 07:17:43 +00002591 if (!getDerived().AlwaysRebuild() &&
2592 FullCond->get() == S->getCond() &&
2593 Then.get() == S->getThen() &&
2594 Else.get() == S->getElse())
Mike Stump11289f42009-09-09 15:08:12 +00002595 return SemaRef.Owned(S->Retain());
2596
Douglas Gregorebe10102009-08-20 07:17:43 +00002597 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then),
Mike Stump11289f42009-09-09 15:08:12 +00002598 S->getElseLoc(), move(Else));
Douglas Gregorebe10102009-08-20 07:17:43 +00002599}
2600
2601template<typename Derived>
2602Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002603TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002604 // Transform the condition.
2605 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2606 if (Cond.isInvalid())
2607 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002608
Douglas Gregorebe10102009-08-20 07:17:43 +00002609 // Rebuild the switch statement.
2610 OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond));
2611 if (Switch.isInvalid())
2612 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002613
Douglas Gregorebe10102009-08-20 07:17:43 +00002614 // Transform the body of the switch statement.
2615 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2616 if (Body.isInvalid())
2617 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002618
Douglas Gregorebe10102009-08-20 07:17:43 +00002619 // Complete the switch statement.
2620 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
2621 move(Body));
2622}
Mike Stump11289f42009-09-09 15:08:12 +00002623
Douglas Gregorebe10102009-08-20 07:17:43 +00002624template<typename Derived>
2625Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002626TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002627 // Transform the condition
2628 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2629 if (Cond.isInvalid())
2630 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002631
Douglas Gregorebe10102009-08-20 07:17:43 +00002632 Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
Mike Stump11289f42009-09-09 15:08:12 +00002633
Douglas Gregorebe10102009-08-20 07:17:43 +00002634 // Transform the body
2635 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2636 if (Body.isInvalid())
2637 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002638
Douglas Gregorebe10102009-08-20 07:17:43 +00002639 if (!getDerived().AlwaysRebuild() &&
2640 FullCond->get() == S->getCond() &&
2641 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00002642 return SemaRef.Owned(S->Retain());
2643
Douglas Gregorebe10102009-08-20 07:17:43 +00002644 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body));
2645}
Mike Stump11289f42009-09-09 15:08:12 +00002646
Douglas Gregorebe10102009-08-20 07:17:43 +00002647template<typename Derived>
2648Sema::OwningStmtResult
2649TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
2650 // Transform the condition
2651 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2652 if (Cond.isInvalid())
2653 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002654
Douglas Gregorebe10102009-08-20 07:17:43 +00002655 // Transform the body
2656 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2657 if (Body.isInvalid())
2658 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002659
Douglas Gregorebe10102009-08-20 07:17:43 +00002660 if (!getDerived().AlwaysRebuild() &&
2661 Cond.get() == S->getCond() &&
2662 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00002663 return SemaRef.Owned(S->Retain());
2664
Douglas Gregorebe10102009-08-20 07:17:43 +00002665 return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
2666 /*FIXME:*/S->getWhileLoc(), move(Cond),
2667 S->getRParenLoc());
2668}
Mike Stump11289f42009-09-09 15:08:12 +00002669
Douglas Gregorebe10102009-08-20 07:17:43 +00002670template<typename Derived>
2671Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002672TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002673 // Transform the initialization statement
2674 OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
2675 if (Init.isInvalid())
2676 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002677
Douglas Gregorebe10102009-08-20 07:17:43 +00002678 // Transform the condition
2679 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
2680 if (Cond.isInvalid())
2681 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002682
Douglas Gregorebe10102009-08-20 07:17:43 +00002683 // Transform the increment
2684 OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
2685 if (Inc.isInvalid())
2686 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002687
Douglas Gregorebe10102009-08-20 07:17:43 +00002688 // Transform the body
2689 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
2690 if (Body.isInvalid())
2691 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002692
Douglas Gregorebe10102009-08-20 07:17:43 +00002693 if (!getDerived().AlwaysRebuild() &&
2694 Init.get() == S->getInit() &&
2695 Cond.get() == S->getCond() &&
2696 Inc.get() == S->getInc() &&
2697 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00002698 return SemaRef.Owned(S->Retain());
2699
Douglas Gregorebe10102009-08-20 07:17:43 +00002700 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
2701 move(Init), move(Cond), move(Inc),
2702 S->getRParenLoc(), move(Body));
2703}
2704
2705template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002706Sema::OwningStmtResult
2707TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002708 // Goto statements must always be rebuilt, to resolve the label.
Mike Stump11289f42009-09-09 15:08:12 +00002709 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
Douglas Gregorebe10102009-08-20 07:17:43 +00002710 S->getLabel());
2711}
2712
2713template<typename Derived>
2714Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002715TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002716 OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
2717 if (Target.isInvalid())
2718 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002719
Douglas Gregorebe10102009-08-20 07:17:43 +00002720 if (!getDerived().AlwaysRebuild() &&
2721 Target.get() == S->getTarget())
Mike Stump11289f42009-09-09 15:08:12 +00002722 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002723
2724 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
2725 move(Target));
2726}
2727
2728template<typename Derived>
2729Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002730TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
2731 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002732}
Mike Stump11289f42009-09-09 15:08:12 +00002733
Douglas Gregorebe10102009-08-20 07:17:43 +00002734template<typename Derived>
2735Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002736TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
2737 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002738}
Mike Stump11289f42009-09-09 15:08:12 +00002739
Douglas Gregorebe10102009-08-20 07:17:43 +00002740template<typename Derived>
2741Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002742TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002743 Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
2744 if (Result.isInvalid())
2745 return SemaRef.StmtError();
2746
Mike Stump11289f42009-09-09 15:08:12 +00002747 // FIXME: We always rebuild the return statement because there is no way
Douglas Gregorebe10102009-08-20 07:17:43 +00002748 // to tell whether the return type of the function has changed.
2749 return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
2750}
Mike Stump11289f42009-09-09 15:08:12 +00002751
Douglas Gregorebe10102009-08-20 07:17:43 +00002752template<typename Derived>
2753Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002754TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002755 bool DeclChanged = false;
2756 llvm::SmallVector<Decl *, 4> Decls;
2757 for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
2758 D != DEnd; ++D) {
2759 Decl *Transformed = getDerived().TransformDefinition(*D);
2760 if (!Transformed)
2761 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002762
Douglas Gregorebe10102009-08-20 07:17:43 +00002763 if (Transformed != *D)
2764 DeclChanged = true;
Mike Stump11289f42009-09-09 15:08:12 +00002765
Douglas Gregorebe10102009-08-20 07:17:43 +00002766 Decls.push_back(Transformed);
2767 }
Mike Stump11289f42009-09-09 15:08:12 +00002768
Douglas Gregorebe10102009-08-20 07:17:43 +00002769 if (!getDerived().AlwaysRebuild() && !DeclChanged)
Mike Stump11289f42009-09-09 15:08:12 +00002770 return SemaRef.Owned(S->Retain());
2771
2772 return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
Douglas Gregorebe10102009-08-20 07:17:43 +00002773 S->getStartLoc(), S->getEndLoc());
2774}
Mike Stump11289f42009-09-09 15:08:12 +00002775
Douglas Gregorebe10102009-08-20 07:17:43 +00002776template<typename Derived>
2777Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002778TreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002779 assert(false && "SwitchCase is abstract and cannot be transformed");
Mike Stump11289f42009-09-09 15:08:12 +00002780 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002781}
2782
2783template<typename Derived>
2784Sema::OwningStmtResult
2785TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
2786 // FIXME: Implement!
2787 assert(false && "Inline assembly cannot be transformed");
Mike Stump11289f42009-09-09 15:08:12 +00002788 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002789}
2790
2791
2792template<typename Derived>
2793Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002794TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002795 // FIXME: Implement this
2796 assert(false && "Cannot transform an Objective-C @try statement");
Mike Stump11289f42009-09-09 15:08:12 +00002797 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002798}
Mike Stump11289f42009-09-09 15:08:12 +00002799
Douglas Gregorebe10102009-08-20 07:17:43 +00002800template<typename Derived>
2801Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002802TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002803 // FIXME: Implement this
2804 assert(false && "Cannot transform an Objective-C @catch statement");
2805 return SemaRef.Owned(S->Retain());
2806}
Mike Stump11289f42009-09-09 15:08:12 +00002807
Douglas Gregorebe10102009-08-20 07:17:43 +00002808template<typename Derived>
2809Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002810TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002811 // FIXME: Implement this
2812 assert(false && "Cannot transform an Objective-C @finally statement");
Mike Stump11289f42009-09-09 15:08:12 +00002813 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002814}
Mike Stump11289f42009-09-09 15:08:12 +00002815
Douglas Gregorebe10102009-08-20 07:17:43 +00002816template<typename Derived>
2817Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002818TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002819 // FIXME: Implement this
2820 assert(false && "Cannot transform an Objective-C @throw statement");
Mike Stump11289f42009-09-09 15:08:12 +00002821 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002822}
Mike Stump11289f42009-09-09 15:08:12 +00002823
Douglas Gregorebe10102009-08-20 07:17:43 +00002824template<typename Derived>
2825Sema::OwningStmtResult
2826TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
Mike Stump11289f42009-09-09 15:08:12 +00002827 ObjCAtSynchronizedStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002828 // FIXME: Implement this
2829 assert(false && "Cannot transform an Objective-C @synchronized statement");
Mike Stump11289f42009-09-09 15:08:12 +00002830 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002831}
2832
2833template<typename Derived>
2834Sema::OwningStmtResult
2835TreeTransform<Derived>::TransformObjCForCollectionStmt(
Mike Stump11289f42009-09-09 15:08:12 +00002836 ObjCForCollectionStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002837 // FIXME: Implement this
2838 assert(false && "Cannot transform an Objective-C for-each statement");
Mike Stump11289f42009-09-09 15:08:12 +00002839 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002840}
2841
2842
2843template<typename Derived>
2844Sema::OwningStmtResult
2845TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
2846 // Transform the exception declaration, if any.
2847 VarDecl *Var = 0;
2848 if (S->getExceptionDecl()) {
2849 VarDecl *ExceptionDecl = S->getExceptionDecl();
2850 TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
2851 ExceptionDecl->getDeclName());
2852
2853 QualType T = getDerived().TransformType(ExceptionDecl->getType());
2854 if (T.isNull())
2855 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002856
Douglas Gregorebe10102009-08-20 07:17:43 +00002857 Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
2858 T,
2859 ExceptionDecl->getDeclaratorInfo(),
2860 ExceptionDecl->getIdentifier(),
2861 ExceptionDecl->getLocation(),
2862 /*FIXME: Inaccurate*/
2863 SourceRange(ExceptionDecl->getLocation()));
2864 if (!Var || Var->isInvalidDecl()) {
2865 if (Var)
2866 Var->Destroy(SemaRef.Context);
2867 return SemaRef.StmtError();
2868 }
2869 }
Mike Stump11289f42009-09-09 15:08:12 +00002870
Douglas Gregorebe10102009-08-20 07:17:43 +00002871 // Transform the actual exception handler.
2872 OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
2873 if (Handler.isInvalid()) {
2874 if (Var)
2875 Var->Destroy(SemaRef.Context);
2876 return SemaRef.StmtError();
2877 }
Mike Stump11289f42009-09-09 15:08:12 +00002878
Douglas Gregorebe10102009-08-20 07:17:43 +00002879 if (!getDerived().AlwaysRebuild() &&
2880 !Var &&
2881 Handler.get() == S->getHandlerBlock())
Mike Stump11289f42009-09-09 15:08:12 +00002882 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002883
2884 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
2885 Var,
2886 move(Handler));
2887}
Mike Stump11289f42009-09-09 15:08:12 +00002888
Douglas Gregorebe10102009-08-20 07:17:43 +00002889template<typename Derived>
2890Sema::OwningStmtResult
2891TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
2892 // Transform the try block itself.
Mike Stump11289f42009-09-09 15:08:12 +00002893 OwningStmtResult TryBlock
Douglas Gregorebe10102009-08-20 07:17:43 +00002894 = getDerived().TransformCompoundStmt(S->getTryBlock());
2895 if (TryBlock.isInvalid())
2896 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002897
Douglas Gregorebe10102009-08-20 07:17:43 +00002898 // Transform the handlers.
2899 bool HandlerChanged = false;
2900 ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
2901 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
Mike Stump11289f42009-09-09 15:08:12 +00002902 OwningStmtResult Handler
Douglas Gregorebe10102009-08-20 07:17:43 +00002903 = getDerived().TransformCXXCatchStmt(S->getHandler(I));
2904 if (Handler.isInvalid())
2905 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002906
Douglas Gregorebe10102009-08-20 07:17:43 +00002907 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
2908 Handlers.push_back(Handler.takeAs<Stmt>());
2909 }
Mike Stump11289f42009-09-09 15:08:12 +00002910
Douglas Gregorebe10102009-08-20 07:17:43 +00002911 if (!getDerived().AlwaysRebuild() &&
2912 TryBlock.get() == S->getTryBlock() &&
2913 !HandlerChanged)
Mike Stump11289f42009-09-09 15:08:12 +00002914 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002915
2916 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
Mike Stump11289f42009-09-09 15:08:12 +00002917 move_arg(Handlers));
Douglas Gregorebe10102009-08-20 07:17:43 +00002918}
Mike Stump11289f42009-09-09 15:08:12 +00002919
Douglas Gregorebe10102009-08-20 07:17:43 +00002920//===----------------------------------------------------------------------===//
Douglas Gregora16548e2009-08-11 05:31:07 +00002921// Expression transformation
2922//===----------------------------------------------------------------------===//
Mike Stump11289f42009-09-09 15:08:12 +00002923template<typename Derived>
2924Sema::OwningExprResult
2925TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
2926 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00002927}
Mike Stump11289f42009-09-09 15:08:12 +00002928
2929template<typename Derived>
2930Sema::OwningExprResult
2931TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
2932 NamedDecl *ND
Douglas Gregora16548e2009-08-11 05:31:07 +00002933 = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
2934 if (!ND)
2935 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00002936
Douglas Gregora16548e2009-08-11 05:31:07 +00002937 if (!getDerived().AlwaysRebuild() && ND == E->getDecl())
Mike Stump11289f42009-09-09 15:08:12 +00002938 return SemaRef.Owned(E->Retain());
2939
Douglas Gregora16548e2009-08-11 05:31:07 +00002940 return getDerived().RebuildDeclRefExpr(ND, E->getLocation());
2941}
Mike Stump11289f42009-09-09 15:08:12 +00002942
Douglas Gregora16548e2009-08-11 05:31:07 +00002943template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002944Sema::OwningExprResult
2945TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
2946 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00002947}
Mike Stump11289f42009-09-09 15:08:12 +00002948
Douglas Gregora16548e2009-08-11 05:31:07 +00002949template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002950Sema::OwningExprResult
2951TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
2952 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00002953}
Mike Stump11289f42009-09-09 15:08:12 +00002954
Douglas Gregora16548e2009-08-11 05:31:07 +00002955template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002956Sema::OwningExprResult
2957TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
2958 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00002959}
Mike Stump11289f42009-09-09 15:08:12 +00002960
Douglas Gregora16548e2009-08-11 05:31:07 +00002961template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002962Sema::OwningExprResult
2963TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
2964 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00002965}
Mike Stump11289f42009-09-09 15:08:12 +00002966
Douglas Gregora16548e2009-08-11 05:31:07 +00002967template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002968Sema::OwningExprResult
2969TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
2970 return SemaRef.Owned(E->Retain());
2971}
2972
2973template<typename Derived>
2974Sema::OwningExprResult
2975TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00002976 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2977 if (SubExpr.isInvalid())
2978 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00002979
Douglas Gregora16548e2009-08-11 05:31:07 +00002980 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00002981 return SemaRef.Owned(E->Retain());
2982
2983 return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
Douglas Gregora16548e2009-08-11 05:31:07 +00002984 E->getRParen());
2985}
2986
Mike Stump11289f42009-09-09 15:08:12 +00002987template<typename Derived>
2988Sema::OwningExprResult
2989TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00002990 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
2991 if (SubExpr.isInvalid())
2992 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00002993
Douglas Gregora16548e2009-08-11 05:31:07 +00002994 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00002995 return SemaRef.Owned(E->Retain());
2996
Douglas Gregora16548e2009-08-11 05:31:07 +00002997 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
2998 E->getOpcode(),
2999 move(SubExpr));
3000}
Mike Stump11289f42009-09-09 15:08:12 +00003001
Douglas Gregora16548e2009-08-11 05:31:07 +00003002template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003003Sema::OwningExprResult
3004TreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003005 if (E->isArgumentType()) {
3006 QualType T = getDerived().TransformType(E->getArgumentType());
3007 if (T.isNull())
3008 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003009
Douglas Gregora16548e2009-08-11 05:31:07 +00003010 if (!getDerived().AlwaysRebuild() && T == E->getArgumentType())
3011 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003012
3013 return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(),
3014 E->isSizeOf(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003015 E->getSourceRange());
3016 }
Mike Stump11289f42009-09-09 15:08:12 +00003017
Douglas Gregora16548e2009-08-11 05:31:07 +00003018 Sema::OwningExprResult SubExpr(SemaRef);
Mike Stump11289f42009-09-09 15:08:12 +00003019 {
Douglas Gregora16548e2009-08-11 05:31:07 +00003020 // C++0x [expr.sizeof]p1:
3021 // The operand is either an expression, which is an unevaluated operand
3022 // [...]
3023 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00003024
Douglas Gregora16548e2009-08-11 05:31:07 +00003025 SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3026 if (SubExpr.isInvalid())
3027 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003028
Douglas Gregora16548e2009-08-11 05:31:07 +00003029 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3030 return SemaRef.Owned(E->Retain());
3031 }
Mike Stump11289f42009-09-09 15:08:12 +00003032
Douglas Gregora16548e2009-08-11 05:31:07 +00003033 return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3034 E->isSizeOf(),
3035 E->getSourceRange());
3036}
Mike Stump11289f42009-09-09 15:08:12 +00003037
Douglas Gregora16548e2009-08-11 05:31:07 +00003038template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003039Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003040TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
3041 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3042 if (LHS.isInvalid())
3043 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003044
Douglas Gregora16548e2009-08-11 05:31:07 +00003045 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3046 if (RHS.isInvalid())
3047 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003048
3049
Douglas Gregora16548e2009-08-11 05:31:07 +00003050 if (!getDerived().AlwaysRebuild() &&
3051 LHS.get() == E->getLHS() &&
3052 RHS.get() == E->getRHS())
3053 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003054
Douglas Gregora16548e2009-08-11 05:31:07 +00003055 return getDerived().RebuildArraySubscriptExpr(move(LHS),
3056 /*FIXME:*/E->getLHS()->getLocStart(),
3057 move(RHS),
3058 E->getRBracketLoc());
3059}
Mike Stump11289f42009-09-09 15:08:12 +00003060
3061template<typename Derived>
3062Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003063TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
3064 // Transform the callee.
3065 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3066 if (Callee.isInvalid())
3067 return SemaRef.ExprError();
3068
3069 // Transform arguments.
3070 bool ArgChanged = false;
3071 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3072 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3073 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3074 OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3075 if (Arg.isInvalid())
3076 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003077
Douglas Gregora16548e2009-08-11 05:31:07 +00003078 // FIXME: Wrong source location information for the ','.
3079 FakeCommaLocs.push_back(
3080 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
Mike Stump11289f42009-09-09 15:08:12 +00003081
3082 ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
Douglas Gregora16548e2009-08-11 05:31:07 +00003083 Args.push_back(Arg.takeAs<Expr>());
3084 }
Mike Stump11289f42009-09-09 15:08:12 +00003085
Douglas Gregora16548e2009-08-11 05:31:07 +00003086 if (!getDerived().AlwaysRebuild() &&
3087 Callee.get() == E->getCallee() &&
3088 !ArgChanged)
3089 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003090
Douglas Gregora16548e2009-08-11 05:31:07 +00003091 // FIXME: Wrong source location information for the '('.
Mike Stump11289f42009-09-09 15:08:12 +00003092 SourceLocation FakeLParenLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003093 = ((Expr *)Callee.get())->getSourceRange().getBegin();
3094 return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3095 move_arg(Args),
3096 FakeCommaLocs.data(),
3097 E->getRParenLoc());
3098}
Mike Stump11289f42009-09-09 15:08:12 +00003099
3100template<typename Derived>
3101Sema::OwningExprResult
3102TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003103 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3104 if (Base.isInvalid())
3105 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003106
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003107 NestedNameSpecifier *Qualifier = 0;
3108 if (E->hasQualifier()) {
Mike Stump11289f42009-09-09 15:08:12 +00003109 Qualifier
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003110 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3111 E->getQualifierRange());
Douglas Gregor84f14dd2009-09-01 00:37:14 +00003112 if (Qualifier == 0)
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003113 return SemaRef.ExprError();
3114 }
Mike Stump11289f42009-09-09 15:08:12 +00003115
3116 NamedDecl *Member
Douglas Gregora16548e2009-08-11 05:31:07 +00003117 = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
3118 if (!Member)
3119 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003120
Douglas Gregora16548e2009-08-11 05:31:07 +00003121 if (!getDerived().AlwaysRebuild() &&
3122 Base.get() == E->getBase() &&
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003123 Qualifier == E->getQualifier() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00003124 Member == E->getMemberDecl())
Mike Stump11289f42009-09-09 15:08:12 +00003125 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003126
3127 // FIXME: Bogus source location for the operator
3128 SourceLocation FakeOperatorLoc
3129 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3130
3131 return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3132 E->isArrow(),
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003133 Qualifier,
3134 E->getQualifierRange(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003135 E->getMemberLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00003136 Member);
Douglas Gregora16548e2009-08-11 05:31:07 +00003137}
Mike Stump11289f42009-09-09 15:08:12 +00003138
Douglas Gregora16548e2009-08-11 05:31:07 +00003139template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00003140Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003141TreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
3142 assert(false && "Cannot transform abstract class");
3143 return SemaRef.Owned(E->Retain());
3144}
3145
3146template<typename Derived>
3147Sema::OwningExprResult
3148TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003149 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3150 if (LHS.isInvalid())
3151 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003152
Douglas Gregora16548e2009-08-11 05:31:07 +00003153 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3154 if (RHS.isInvalid())
3155 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003156
Douglas Gregora16548e2009-08-11 05:31:07 +00003157 if (!getDerived().AlwaysRebuild() &&
3158 LHS.get() == E->getLHS() &&
3159 RHS.get() == E->getRHS())
Mike Stump11289f42009-09-09 15:08:12 +00003160 return SemaRef.Owned(E->Retain());
3161
Douglas Gregora16548e2009-08-11 05:31:07 +00003162 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3163 move(LHS), move(RHS));
3164}
3165
Mike Stump11289f42009-09-09 15:08:12 +00003166template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00003167Sema::OwningExprResult
3168TreeTransform<Derived>::TransformCompoundAssignOperator(
3169 CompoundAssignOperator *E) {
3170 return getDerived().TransformBinaryOperator(E);
3171}
Mike Stump11289f42009-09-09 15:08:12 +00003172
Douglas Gregora16548e2009-08-11 05:31:07 +00003173template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003174Sema::OwningExprResult
3175TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003176 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3177 if (Cond.isInvalid())
3178 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003179
Douglas Gregora16548e2009-08-11 05:31:07 +00003180 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3181 if (LHS.isInvalid())
3182 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003183
Douglas Gregora16548e2009-08-11 05:31:07 +00003184 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3185 if (RHS.isInvalid())
3186 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003187
Douglas Gregora16548e2009-08-11 05:31:07 +00003188 if (!getDerived().AlwaysRebuild() &&
3189 Cond.get() == E->getCond() &&
3190 LHS.get() == E->getLHS() &&
3191 RHS.get() == E->getRHS())
3192 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003193
3194 return getDerived().RebuildConditionalOperator(move(Cond),
Douglas Gregor7e112b02009-08-26 14:37:04 +00003195 E->getQuestionLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00003196 move(LHS),
Douglas Gregor7e112b02009-08-26 14:37:04 +00003197 E->getColonLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003198 move(RHS));
3199}
Mike Stump11289f42009-09-09 15:08:12 +00003200
3201template<typename Derived>
3202Sema::OwningExprResult
3203TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003204 QualType T = getDerived().TransformType(E->getType());
3205 if (T.isNull())
3206 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003207
Douglas Gregora16548e2009-08-11 05:31:07 +00003208 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3209 if (SubExpr.isInvalid())
3210 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003211
Douglas Gregora16548e2009-08-11 05:31:07 +00003212 if (!getDerived().AlwaysRebuild() &&
3213 T == E->getType() &&
3214 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003215 return SemaRef.Owned(E->Retain());
3216
Douglas Gregora16548e2009-08-11 05:31:07 +00003217 return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
Mike Stump11289f42009-09-09 15:08:12 +00003218 move(SubExpr),
Douglas Gregora16548e2009-08-11 05:31:07 +00003219 E->isLvalueCast());
3220}
Mike Stump11289f42009-09-09 15:08:12 +00003221
Douglas Gregora16548e2009-08-11 05:31:07 +00003222template<typename Derived>
3223Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003224TreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
3225 assert(false && "Cannot transform abstract class");
3226 return SemaRef.Owned(E->Retain());
3227}
3228
3229template<typename Derived>
3230Sema::OwningExprResult
3231TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003232 QualType T;
3233 {
3234 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00003235 SourceLocation TypeStartLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003236 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3237 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003238
Douglas Gregora16548e2009-08-11 05:31:07 +00003239 T = getDerived().TransformType(E->getTypeAsWritten());
3240 if (T.isNull())
3241 return SemaRef.ExprError();
3242 }
Mike Stump11289f42009-09-09 15:08:12 +00003243
Douglas Gregora16548e2009-08-11 05:31:07 +00003244 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3245 if (SubExpr.isInvalid())
3246 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003247
Douglas Gregora16548e2009-08-11 05:31:07 +00003248 if (!getDerived().AlwaysRebuild() &&
3249 T == E->getTypeAsWritten() &&
3250 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003251 return SemaRef.Owned(E->Retain());
3252
Douglas Gregora16548e2009-08-11 05:31:07 +00003253 return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
3254 E->getRParenLoc(),
3255 move(SubExpr));
3256}
Mike Stump11289f42009-09-09 15:08:12 +00003257
Douglas Gregora16548e2009-08-11 05:31:07 +00003258template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003259Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003260TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
3261 QualType T;
3262 {
3263 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00003264 SourceLocation FakeTypeLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003265 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3266 TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003267
Douglas Gregora16548e2009-08-11 05:31:07 +00003268 T = getDerived().TransformType(E->getType());
3269 if (T.isNull())
3270 return SemaRef.ExprError();
3271 }
Mike Stump11289f42009-09-09 15:08:12 +00003272
Douglas Gregora16548e2009-08-11 05:31:07 +00003273 OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3274 if (Init.isInvalid())
3275 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003276
Douglas Gregora16548e2009-08-11 05:31:07 +00003277 if (!getDerived().AlwaysRebuild() &&
3278 T == E->getType() &&
3279 Init.get() == E->getInitializer())
Mike Stump11289f42009-09-09 15:08:12 +00003280 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003281
3282 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3283 /*FIXME:*/E->getInitializer()->getLocEnd(),
3284 move(Init));
3285}
Mike Stump11289f42009-09-09 15:08:12 +00003286
Douglas Gregora16548e2009-08-11 05:31:07 +00003287template<typename Derived>
3288Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003289TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003290 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3291 if (Base.isInvalid())
3292 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003293
Douglas Gregora16548e2009-08-11 05:31:07 +00003294 if (!getDerived().AlwaysRebuild() &&
3295 Base.get() == E->getBase())
Mike Stump11289f42009-09-09 15:08:12 +00003296 return SemaRef.Owned(E->Retain());
3297
Douglas Gregora16548e2009-08-11 05:31:07 +00003298 // FIXME: Bad source location
Mike Stump11289f42009-09-09 15:08:12 +00003299 SourceLocation FakeOperatorLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003300 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3301 return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3302 E->getAccessorLoc(),
3303 E->getAccessor());
3304}
Mike Stump11289f42009-09-09 15:08:12 +00003305
Douglas Gregora16548e2009-08-11 05:31:07 +00003306template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003307Sema::OwningExprResult
3308TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003309 bool InitChanged = false;
Mike Stump11289f42009-09-09 15:08:12 +00003310
Douglas Gregora16548e2009-08-11 05:31:07 +00003311 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3312 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3313 OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3314 if (Init.isInvalid())
3315 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003316
Douglas Gregora16548e2009-08-11 05:31:07 +00003317 InitChanged = InitChanged || Init.get() != E->getInit(I);
3318 Inits.push_back(Init.takeAs<Expr>());
3319 }
Mike Stump11289f42009-09-09 15:08:12 +00003320
Douglas Gregora16548e2009-08-11 05:31:07 +00003321 if (!getDerived().AlwaysRebuild() && !InitChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003322 return SemaRef.Owned(E->Retain());
3323
Douglas Gregora16548e2009-08-11 05:31:07 +00003324 return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3325 E->getRBraceLoc());
3326}
Mike Stump11289f42009-09-09 15:08:12 +00003327
Douglas Gregora16548e2009-08-11 05:31:07 +00003328template<typename Derived>
3329Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003330TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003331 Designation Desig;
Mike Stump11289f42009-09-09 15:08:12 +00003332
Douglas Gregorebe10102009-08-20 07:17:43 +00003333 // transform the initializer value
Douglas Gregora16548e2009-08-11 05:31:07 +00003334 OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3335 if (Init.isInvalid())
3336 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003337
Douglas Gregorebe10102009-08-20 07:17:43 +00003338 // transform the designators.
Douglas Gregora16548e2009-08-11 05:31:07 +00003339 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3340 bool ExprChanged = false;
3341 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3342 DEnd = E->designators_end();
3343 D != DEnd; ++D) {
3344 if (D->isFieldDesignator()) {
3345 Desig.AddDesignator(Designator::getField(D->getFieldName(),
3346 D->getDotLoc(),
3347 D->getFieldLoc()));
3348 continue;
3349 }
Mike Stump11289f42009-09-09 15:08:12 +00003350
Douglas Gregora16548e2009-08-11 05:31:07 +00003351 if (D->isArrayDesignator()) {
3352 OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3353 if (Index.isInvalid())
3354 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003355
3356 Desig.AddDesignator(Designator::getArray(Index.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003357 D->getLBracketLoc()));
Mike Stump11289f42009-09-09 15:08:12 +00003358
Douglas Gregora16548e2009-08-11 05:31:07 +00003359 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3360 ArrayExprs.push_back(Index.release());
3361 continue;
3362 }
Mike Stump11289f42009-09-09 15:08:12 +00003363
Douglas Gregora16548e2009-08-11 05:31:07 +00003364 assert(D->isArrayRangeDesignator() && "New kind of designator?");
Mike Stump11289f42009-09-09 15:08:12 +00003365 OwningExprResult Start
Douglas Gregora16548e2009-08-11 05:31:07 +00003366 = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3367 if (Start.isInvalid())
3368 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003369
Douglas Gregora16548e2009-08-11 05:31:07 +00003370 OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3371 if (End.isInvalid())
3372 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003373
3374 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003375 End.get(),
3376 D->getLBracketLoc(),
3377 D->getEllipsisLoc()));
Mike Stump11289f42009-09-09 15:08:12 +00003378
Douglas Gregora16548e2009-08-11 05:31:07 +00003379 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3380 End.get() != E->getArrayRangeEnd(*D);
Mike Stump11289f42009-09-09 15:08:12 +00003381
Douglas Gregora16548e2009-08-11 05:31:07 +00003382 ArrayExprs.push_back(Start.release());
3383 ArrayExprs.push_back(End.release());
3384 }
Mike Stump11289f42009-09-09 15:08:12 +00003385
Douglas Gregora16548e2009-08-11 05:31:07 +00003386 if (!getDerived().AlwaysRebuild() &&
3387 Init.get() == E->getInit() &&
3388 !ExprChanged)
3389 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003390
Douglas Gregora16548e2009-08-11 05:31:07 +00003391 return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3392 E->getEqualOrColonLoc(),
3393 E->usesGNUSyntax(), move(Init));
3394}
Mike Stump11289f42009-09-09 15:08:12 +00003395
Douglas Gregora16548e2009-08-11 05:31:07 +00003396template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003397Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003398TreeTransform<Derived>::TransformImplicitValueInitExpr(
Mike Stump11289f42009-09-09 15:08:12 +00003399 ImplicitValueInitExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003400 QualType T = getDerived().TransformType(E->getType());
3401 if (T.isNull())
3402 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003403
Douglas Gregora16548e2009-08-11 05:31:07 +00003404 if (!getDerived().AlwaysRebuild() &&
3405 T == E->getType())
Mike Stump11289f42009-09-09 15:08:12 +00003406 return SemaRef.Owned(E->Retain());
3407
Douglas Gregora16548e2009-08-11 05:31:07 +00003408 return getDerived().RebuildImplicitValueInitExpr(T);
3409}
Mike Stump11289f42009-09-09 15:08:12 +00003410
Douglas Gregora16548e2009-08-11 05:31:07 +00003411template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003412Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003413TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
3414 // FIXME: Do we want the type as written?
3415 QualType T;
Mike Stump11289f42009-09-09 15:08:12 +00003416
Douglas Gregora16548e2009-08-11 05:31:07 +00003417 {
3418 // FIXME: Source location isn't quite accurate.
3419 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3420 T = getDerived().TransformType(E->getType());
3421 if (T.isNull())
3422 return SemaRef.ExprError();
3423 }
Mike Stump11289f42009-09-09 15:08:12 +00003424
Douglas Gregora16548e2009-08-11 05:31:07 +00003425 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3426 if (SubExpr.isInvalid())
3427 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003428
Douglas Gregora16548e2009-08-11 05:31:07 +00003429 if (!getDerived().AlwaysRebuild() &&
3430 T == E->getType() &&
3431 SubExpr.get() == E->getSubExpr())
3432 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003433
Douglas Gregora16548e2009-08-11 05:31:07 +00003434 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
3435 T, E->getRParenLoc());
3436}
3437
3438template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003439Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003440TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
3441 bool ArgumentChanged = false;
3442 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3443 for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
3444 OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
3445 if (Init.isInvalid())
3446 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003447
Douglas Gregora16548e2009-08-11 05:31:07 +00003448 ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
3449 Inits.push_back(Init.takeAs<Expr>());
3450 }
Mike Stump11289f42009-09-09 15:08:12 +00003451
Douglas Gregora16548e2009-08-11 05:31:07 +00003452 return getDerived().RebuildParenListExpr(E->getLParenLoc(),
3453 move_arg(Inits),
3454 E->getRParenLoc());
3455}
Mike Stump11289f42009-09-09 15:08:12 +00003456
Douglas Gregora16548e2009-08-11 05:31:07 +00003457/// \brief Transform an address-of-label expression.
3458///
3459/// By default, the transformation of an address-of-label expression always
3460/// rebuilds the expression, so that the label identifier can be resolved to
3461/// the corresponding label statement by semantic analysis.
3462template<typename Derived>
3463Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003464TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003465 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
3466 E->getLabel());
3467}
Mike Stump11289f42009-09-09 15:08:12 +00003468
3469template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00003470Sema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
Mike Stump11289f42009-09-09 15:08:12 +00003471 OwningStmtResult SubStmt
Douglas Gregora16548e2009-08-11 05:31:07 +00003472 = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
3473 if (SubStmt.isInvalid())
3474 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003475
Douglas Gregora16548e2009-08-11 05:31:07 +00003476 if (!getDerived().AlwaysRebuild() &&
3477 SubStmt.get() == E->getSubStmt())
3478 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003479
3480 return getDerived().RebuildStmtExpr(E->getLParenLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003481 move(SubStmt),
3482 E->getRParenLoc());
3483}
Mike Stump11289f42009-09-09 15:08:12 +00003484
Douglas Gregora16548e2009-08-11 05:31:07 +00003485template<typename Derived>
3486Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003487TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003488 QualType T1, T2;
3489 {
3490 // FIXME: Source location isn't quite accurate.
3491 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003492
Douglas Gregora16548e2009-08-11 05:31:07 +00003493 T1 = getDerived().TransformType(E->getArgType1());
3494 if (T1.isNull())
3495 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003496
Douglas Gregora16548e2009-08-11 05:31:07 +00003497 T2 = getDerived().TransformType(E->getArgType2());
3498 if (T2.isNull())
3499 return SemaRef.ExprError();
3500 }
3501
3502 if (!getDerived().AlwaysRebuild() &&
3503 T1 == E->getArgType1() &&
3504 T2 == E->getArgType2())
Mike Stump11289f42009-09-09 15:08:12 +00003505 return SemaRef.Owned(E->Retain());
3506
Douglas Gregora16548e2009-08-11 05:31:07 +00003507 return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
3508 T1, T2, E->getRParenLoc());
3509}
Mike Stump11289f42009-09-09 15:08:12 +00003510
Douglas Gregora16548e2009-08-11 05:31:07 +00003511template<typename Derived>
3512Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003513TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003514 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3515 if (Cond.isInvalid())
3516 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003517
Douglas Gregora16548e2009-08-11 05:31:07 +00003518 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3519 if (LHS.isInvalid())
3520 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003521
Douglas Gregora16548e2009-08-11 05:31:07 +00003522 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3523 if (RHS.isInvalid())
3524 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003525
Douglas Gregora16548e2009-08-11 05:31:07 +00003526 if (!getDerived().AlwaysRebuild() &&
3527 Cond.get() == E->getCond() &&
3528 LHS.get() == E->getLHS() &&
3529 RHS.get() == E->getRHS())
Mike Stump11289f42009-09-09 15:08:12 +00003530 return SemaRef.Owned(E->Retain());
3531
Douglas Gregora16548e2009-08-11 05:31:07 +00003532 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
3533 move(Cond), move(LHS), move(RHS),
3534 E->getRParenLoc());
3535}
Mike Stump11289f42009-09-09 15:08:12 +00003536
Douglas Gregora16548e2009-08-11 05:31:07 +00003537template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003538Sema::OwningExprResult
3539TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
3540 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003541}
3542
3543template<typename Derived>
3544Sema::OwningExprResult
3545TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
3546 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3547 if (Callee.isInvalid())
3548 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003549
Douglas Gregora16548e2009-08-11 05:31:07 +00003550 OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
3551 if (First.isInvalid())
3552 return SemaRef.ExprError();
3553
3554 OwningExprResult Second(SemaRef);
3555 if (E->getNumArgs() == 2) {
3556 Second = getDerived().TransformExpr(E->getArg(1));
3557 if (Second.isInvalid())
3558 return SemaRef.ExprError();
3559 }
Mike Stump11289f42009-09-09 15:08:12 +00003560
Douglas Gregora16548e2009-08-11 05:31:07 +00003561 if (!getDerived().AlwaysRebuild() &&
3562 Callee.get() == E->getCallee() &&
3563 First.get() == E->getArg(0) &&
Mike Stump11289f42009-09-09 15:08:12 +00003564 (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
3565 return SemaRef.Owned(E->Retain());
3566
Douglas Gregora16548e2009-08-11 05:31:07 +00003567 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
3568 E->getOperatorLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00003569 move(Callee),
Douglas Gregora16548e2009-08-11 05:31:07 +00003570 move(First),
3571 move(Second));
3572}
Mike Stump11289f42009-09-09 15:08:12 +00003573
Douglas Gregora16548e2009-08-11 05:31:07 +00003574template<typename Derived>
3575Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003576TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003577 return getDerived().TransformCallExpr(E);
3578}
Mike Stump11289f42009-09-09 15:08:12 +00003579
Douglas Gregora16548e2009-08-11 05:31:07 +00003580template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003581Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003582TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
3583 QualType ExplicitTy;
3584 {
3585 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00003586 SourceLocation TypeStartLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003587 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3588 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003589
Douglas Gregora16548e2009-08-11 05:31:07 +00003590 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
3591 if (ExplicitTy.isNull())
3592 return SemaRef.ExprError();
3593 }
Mike Stump11289f42009-09-09 15:08:12 +00003594
Douglas Gregora16548e2009-08-11 05:31:07 +00003595 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3596 if (SubExpr.isInvalid())
3597 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003598
Douglas Gregora16548e2009-08-11 05:31:07 +00003599 if (!getDerived().AlwaysRebuild() &&
3600 ExplicitTy == E->getTypeAsWritten() &&
3601 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003602 return SemaRef.Owned(E->Retain());
3603
Douglas Gregora16548e2009-08-11 05:31:07 +00003604 // FIXME: Poor source location information here.
Mike Stump11289f42009-09-09 15:08:12 +00003605 SourceLocation FakeLAngleLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003606 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
3607 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
3608 SourceLocation FakeRParenLoc
3609 = SemaRef.PP.getLocForEndOfToken(
3610 E->getSubExpr()->getSourceRange().getEnd());
3611 return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00003612 E->getStmtClass(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003613 FakeLAngleLoc,
3614 ExplicitTy,
3615 FakeRAngleLoc,
3616 FakeRAngleLoc,
3617 move(SubExpr),
3618 FakeRParenLoc);
3619}
Mike Stump11289f42009-09-09 15:08:12 +00003620
Douglas Gregora16548e2009-08-11 05:31:07 +00003621template<typename Derived>
3622Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003623TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003624 return getDerived().TransformCXXNamedCastExpr(E);
3625}
Mike Stump11289f42009-09-09 15:08:12 +00003626
3627template<typename Derived>
3628Sema::OwningExprResult
3629TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
3630 return getDerived().TransformCXXNamedCastExpr(E);
3631}
3632
Douglas Gregora16548e2009-08-11 05:31:07 +00003633template<typename Derived>
3634Sema::OwningExprResult
3635TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
Mike Stump11289f42009-09-09 15:08:12 +00003636 CXXReinterpretCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003637 return getDerived().TransformCXXNamedCastExpr(E);
3638}
Mike Stump11289f42009-09-09 15:08:12 +00003639
Douglas Gregora16548e2009-08-11 05:31:07 +00003640template<typename Derived>
3641Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003642TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003643 return getDerived().TransformCXXNamedCastExpr(E);
3644}
Mike Stump11289f42009-09-09 15:08:12 +00003645
Douglas Gregora16548e2009-08-11 05:31:07 +00003646template<typename Derived>
3647Sema::OwningExprResult
3648TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
Mike Stump11289f42009-09-09 15:08:12 +00003649 CXXFunctionalCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003650 QualType ExplicitTy;
3651 {
3652 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003653
Douglas Gregora16548e2009-08-11 05:31:07 +00003654 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
3655 if (ExplicitTy.isNull())
3656 return SemaRef.ExprError();
3657 }
Mike Stump11289f42009-09-09 15:08:12 +00003658
Douglas Gregora16548e2009-08-11 05:31:07 +00003659 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3660 if (SubExpr.isInvalid())
3661 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003662
Douglas Gregora16548e2009-08-11 05:31:07 +00003663 if (!getDerived().AlwaysRebuild() &&
3664 ExplicitTy == E->getTypeAsWritten() &&
3665 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003666 return SemaRef.Owned(E->Retain());
3667
Douglas Gregora16548e2009-08-11 05:31:07 +00003668 // FIXME: The end of the type's source range is wrong
3669 return getDerived().RebuildCXXFunctionalCastExpr(
3670 /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
3671 ExplicitTy,
3672 /*FIXME:*/E->getSubExpr()->getLocStart(),
3673 move(SubExpr),
3674 E->getRParenLoc());
3675}
Mike Stump11289f42009-09-09 15:08:12 +00003676
Douglas Gregora16548e2009-08-11 05:31:07 +00003677template<typename Derived>
3678Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003679TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003680 if (E->isTypeOperand()) {
3681 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003682
Douglas Gregora16548e2009-08-11 05:31:07 +00003683 QualType T = getDerived().TransformType(E->getTypeOperand());
3684 if (T.isNull())
3685 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003686
Douglas Gregora16548e2009-08-11 05:31:07 +00003687 if (!getDerived().AlwaysRebuild() &&
3688 T == E->getTypeOperand())
3689 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003690
Douglas Gregora16548e2009-08-11 05:31:07 +00003691 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
3692 /*FIXME:*/E->getLocStart(),
3693 T,
3694 E->getLocEnd());
3695 }
Mike Stump11289f42009-09-09 15:08:12 +00003696
Douglas Gregora16548e2009-08-11 05:31:07 +00003697 // We don't know whether the expression is potentially evaluated until
3698 // after we perform semantic analysis, so the expression is potentially
3699 // potentially evaluated.
Mike Stump11289f42009-09-09 15:08:12 +00003700 EnterExpressionEvaluationContext Unevaluated(SemaRef,
Douglas Gregora16548e2009-08-11 05:31:07 +00003701 Action::PotentiallyPotentiallyEvaluated);
Mike Stump11289f42009-09-09 15:08:12 +00003702
Douglas Gregora16548e2009-08-11 05:31:07 +00003703 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
3704 if (SubExpr.isInvalid())
3705 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003706
Douglas Gregora16548e2009-08-11 05:31:07 +00003707 if (!getDerived().AlwaysRebuild() &&
3708 SubExpr.get() == E->getExprOperand())
Mike Stump11289f42009-09-09 15:08:12 +00003709 return SemaRef.Owned(E->Retain());
3710
Douglas Gregora16548e2009-08-11 05:31:07 +00003711 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
3712 /*FIXME:*/E->getLocStart(),
3713 move(SubExpr),
3714 E->getLocEnd());
3715}
3716
3717template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003718Sema::OwningExprResult
3719TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
3720 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003721}
Mike Stump11289f42009-09-09 15:08:12 +00003722
Douglas Gregora16548e2009-08-11 05:31:07 +00003723template<typename Derived>
3724Sema::OwningExprResult
3725TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
Mike Stump11289f42009-09-09 15:08:12 +00003726 CXXNullPtrLiteralExpr *E) {
3727 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003728}
Mike Stump11289f42009-09-09 15:08:12 +00003729
Douglas Gregora16548e2009-08-11 05:31:07 +00003730template<typename Derived>
3731Sema::OwningExprResult
3732TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
3733 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003734
Douglas Gregora16548e2009-08-11 05:31:07 +00003735 QualType T = getDerived().TransformType(E->getType());
3736 if (T.isNull())
3737 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003738
Douglas Gregora16548e2009-08-11 05:31:07 +00003739 if (!getDerived().AlwaysRebuild() &&
3740 T == E->getType())
3741 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003742
Douglas Gregora16548e2009-08-11 05:31:07 +00003743 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
3744}
Mike Stump11289f42009-09-09 15:08:12 +00003745
Douglas Gregora16548e2009-08-11 05:31:07 +00003746template<typename Derived>
3747Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003748TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003749 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3750 if (SubExpr.isInvalid())
3751 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003752
Douglas Gregora16548e2009-08-11 05:31:07 +00003753 if (!getDerived().AlwaysRebuild() &&
3754 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003755 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003756
3757 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
3758}
Mike Stump11289f42009-09-09 15:08:12 +00003759
Douglas Gregora16548e2009-08-11 05:31:07 +00003760template<typename Derived>
3761Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003762TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
3763 ParmVarDecl *Param
Douglas Gregora16548e2009-08-11 05:31:07 +00003764 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
3765 if (!Param)
3766 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003767
Douglas Gregora16548e2009-08-11 05:31:07 +00003768 if (getDerived().AlwaysRebuild() &&
3769 Param == E->getParam())
3770 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003771
Douglas Gregora16548e2009-08-11 05:31:07 +00003772 return getDerived().RebuildCXXDefaultArgExpr(Param);
3773}
Mike Stump11289f42009-09-09 15:08:12 +00003774
Douglas Gregora16548e2009-08-11 05:31:07 +00003775template<typename Derived>
3776Sema::OwningExprResult
3777TreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
3778 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
3779
3780 QualType T = getDerived().TransformType(E->getType());
3781 if (T.isNull())
3782 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003783
Douglas Gregora16548e2009-08-11 05:31:07 +00003784 if (!getDerived().AlwaysRebuild() &&
3785 T == E->getType())
Mike Stump11289f42009-09-09 15:08:12 +00003786 return SemaRef.Owned(E->Retain());
3787
3788 return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003789 /*FIXME:*/E->getTypeBeginLoc(),
3790 T,
3791 E->getRParenLoc());
3792}
Mike Stump11289f42009-09-09 15:08:12 +00003793
Douglas Gregora16548e2009-08-11 05:31:07 +00003794template<typename Derived>
3795Sema::OwningExprResult
3796TreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
Mike Stump11289f42009-09-09 15:08:12 +00003797 VarDecl *Var
Douglas Gregorebe10102009-08-20 07:17:43 +00003798 = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl()));
Douglas Gregora16548e2009-08-11 05:31:07 +00003799 if (!Var)
3800 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003801
Douglas Gregora16548e2009-08-11 05:31:07 +00003802 if (!getDerived().AlwaysRebuild() &&
Mike Stump11289f42009-09-09 15:08:12 +00003803 Var == E->getVarDecl())
Douglas Gregora16548e2009-08-11 05:31:07 +00003804 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003805
3806 return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003807 /*FIXME:*/E->getStartLoc(),
3808 Var);
3809}
Mike Stump11289f42009-09-09 15:08:12 +00003810
Douglas Gregora16548e2009-08-11 05:31:07 +00003811template<typename Derived>
3812Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003813TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003814 // Transform the type that we're allocating
3815 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3816 QualType AllocType = getDerived().TransformType(E->getAllocatedType());
3817 if (AllocType.isNull())
3818 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003819
Douglas Gregora16548e2009-08-11 05:31:07 +00003820 // Transform the size of the array we're allocating (if any).
3821 OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
3822 if (ArraySize.isInvalid())
3823 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003824
Douglas Gregora16548e2009-08-11 05:31:07 +00003825 // Transform the placement arguments (if any).
3826 bool ArgumentChanged = false;
3827 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
3828 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
3829 OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
3830 if (Arg.isInvalid())
3831 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003832
Douglas Gregora16548e2009-08-11 05:31:07 +00003833 ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
3834 PlacementArgs.push_back(Arg.take());
3835 }
Mike Stump11289f42009-09-09 15:08:12 +00003836
Douglas Gregorebe10102009-08-20 07:17:43 +00003837 // transform the constructor arguments (if any).
Douglas Gregora16548e2009-08-11 05:31:07 +00003838 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
3839 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
3840 OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
3841 if (Arg.isInvalid())
3842 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003843
Douglas Gregora16548e2009-08-11 05:31:07 +00003844 ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
3845 ConstructorArgs.push_back(Arg.take());
3846 }
Mike Stump11289f42009-09-09 15:08:12 +00003847
Douglas Gregora16548e2009-08-11 05:31:07 +00003848 if (!getDerived().AlwaysRebuild() &&
3849 AllocType == E->getAllocatedType() &&
3850 ArraySize.get() == E->getArraySize() &&
3851 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003852 return SemaRef.Owned(E->Retain());
3853
Douglas Gregora16548e2009-08-11 05:31:07 +00003854 return getDerived().RebuildCXXNewExpr(E->getLocStart(),
3855 E->isGlobalNew(),
3856 /*FIXME:*/E->getLocStart(),
3857 move_arg(PlacementArgs),
3858 /*FIXME:*/E->getLocStart(),
3859 E->isParenTypeId(),
3860 AllocType,
3861 /*FIXME:*/E->getLocStart(),
3862 /*FIXME:*/SourceRange(),
3863 move(ArraySize),
3864 /*FIXME:*/E->getLocStart(),
3865 move_arg(ConstructorArgs),
Mike Stump11289f42009-09-09 15:08:12 +00003866 E->getLocEnd());
Douglas Gregora16548e2009-08-11 05:31:07 +00003867}
Mike Stump11289f42009-09-09 15:08:12 +00003868
Douglas Gregora16548e2009-08-11 05:31:07 +00003869template<typename Derived>
3870Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003871TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003872 OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
3873 if (Operand.isInvalid())
3874 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003875
Douglas Gregora16548e2009-08-11 05:31:07 +00003876 if (!getDerived().AlwaysRebuild() &&
Mike Stump11289f42009-09-09 15:08:12 +00003877 Operand.get() == E->getArgument())
3878 return SemaRef.Owned(E->Retain());
3879
Douglas Gregora16548e2009-08-11 05:31:07 +00003880 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
3881 E->isGlobalDelete(),
3882 E->isArrayForm(),
3883 move(Operand));
3884}
Mike Stump11289f42009-09-09 15:08:12 +00003885
Douglas Gregora16548e2009-08-11 05:31:07 +00003886template<typename Derived>
3887Sema::OwningExprResult
Douglas Gregorad8a3362009-09-04 17:36:40 +00003888TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
3889 CXXPseudoDestructorExpr *E) {
3890 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3891 if (Base.isInvalid())
3892 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003893
Douglas Gregorad8a3362009-09-04 17:36:40 +00003894 NestedNameSpecifier *Qualifier
3895 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3896 E->getQualifierRange());
3897 if (E->getQualifier() && !Qualifier)
3898 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003899
Douglas Gregorad8a3362009-09-04 17:36:40 +00003900 QualType DestroyedType;
3901 {
3902 TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
3903 DestroyedType = getDerived().TransformType(E->getDestroyedType());
3904 if (DestroyedType.isNull())
3905 return SemaRef.ExprError();
3906 }
Mike Stump11289f42009-09-09 15:08:12 +00003907
Douglas Gregorad8a3362009-09-04 17:36:40 +00003908 if (!getDerived().AlwaysRebuild() &&
3909 Base.get() == E->getBase() &&
3910 Qualifier == E->getQualifier() &&
3911 DestroyedType == E->getDestroyedType())
3912 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003913
Douglas Gregorad8a3362009-09-04 17:36:40 +00003914 return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
3915 E->getOperatorLoc(),
3916 E->isArrow(),
3917 E->getDestroyedTypeLoc(),
3918 DestroyedType,
3919 Qualifier,
3920 E->getQualifierRange());
3921}
Mike Stump11289f42009-09-09 15:08:12 +00003922
Douglas Gregorad8a3362009-09-04 17:36:40 +00003923template<typename Derived>
3924Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003925TreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
Mike Stump11289f42009-09-09 15:08:12 +00003926 UnresolvedFunctionNameExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003927 // There is no transformation we can apply to an unresolved function name.
Mike Stump11289f42009-09-09 15:08:12 +00003928 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003929}
Mike Stump11289f42009-09-09 15:08:12 +00003930
Douglas Gregora16548e2009-08-11 05:31:07 +00003931template<typename Derived>
3932Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003933TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003934 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003935
Douglas Gregora16548e2009-08-11 05:31:07 +00003936 QualType T = getDerived().TransformType(E->getQueriedType());
3937 if (T.isNull())
3938 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003939
Douglas Gregora16548e2009-08-11 05:31:07 +00003940 if (!getDerived().AlwaysRebuild() &&
3941 T == E->getQueriedType())
3942 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003943
Douglas Gregora16548e2009-08-11 05:31:07 +00003944 // FIXME: Bad location information
3945 SourceLocation FakeLParenLoc
3946 = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
Mike Stump11289f42009-09-09 15:08:12 +00003947
3948 return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003949 E->getLocStart(),
3950 /*FIXME:*/FakeLParenLoc,
3951 T,
3952 E->getLocEnd());
3953}
Mike Stump11289f42009-09-09 15:08:12 +00003954
Douglas Gregora16548e2009-08-11 05:31:07 +00003955template<typename Derived>
3956Sema::OwningExprResult
3957TreeTransform<Derived>::TransformQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
3958 NestedNameSpecifier *NNS
3959 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3960 E->getQualifierRange());
3961 if (!NNS)
3962 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003963
3964 NamedDecl *ND
Douglas Gregora16548e2009-08-11 05:31:07 +00003965 = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3966 if (!ND)
3967 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003968
3969 if (!getDerived().AlwaysRebuild() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00003970 NNS == E->getQualifier() &&
3971 ND == E->getDecl())
Mike Stump11289f42009-09-09 15:08:12 +00003972 return SemaRef.Owned(E->Retain());
3973
3974 return getDerived().RebuildQualifiedDeclRefExpr(NNS,
Douglas Gregora16548e2009-08-11 05:31:07 +00003975 E->getQualifierRange(),
3976 ND,
3977 E->getLocation(),
3978 /*FIXME:*/false);
3979}
Mike Stump11289f42009-09-09 15:08:12 +00003980
Douglas Gregora16548e2009-08-11 05:31:07 +00003981template<typename Derived>
3982Sema::OwningExprResult
3983TreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
Mike Stump11289f42009-09-09 15:08:12 +00003984 UnresolvedDeclRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003985 NestedNameSpecifier *NNS
3986 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3987 E->getQualifierRange());
3988 if (!NNS)
3989 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003990
3991 DeclarationName Name
Douglas Gregorf816bd72009-09-03 22:13:48 +00003992 = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
3993 if (!Name)
3994 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003995
3996 if (!getDerived().AlwaysRebuild() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00003997 NNS == E->getQualifier() &&
3998 Name == E->getDeclName())
Mike Stump11289f42009-09-09 15:08:12 +00003999 return SemaRef.Owned(E->Retain());
4000
4001 return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
Douglas Gregora16548e2009-08-11 05:31:07 +00004002 E->getQualifierRange(),
4003 Name,
4004 E->getLocation(),
4005 /*FIXME:*/false);
4006}
4007
4008template<typename Derived>
4009Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004010TreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) {
4011 TemplateName Template
Douglas Gregora16548e2009-08-11 05:31:07 +00004012 = getDerived().TransformTemplateName(E->getTemplateName());
4013 if (Template.isNull())
4014 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004015
Douglas Gregora16548e2009-08-11 05:31:07 +00004016 llvm::SmallVector<TemplateArgument, 4> TransArgs;
4017 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
Mike Stump11289f42009-09-09 15:08:12 +00004018 TemplateArgument TransArg
Douglas Gregora16548e2009-08-11 05:31:07 +00004019 = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
4020 if (TransArg.isNull())
4021 return SemaRef.ExprError();
4022
4023 TransArgs.push_back(TransArg);
4024 }
4025
4026 // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
4027 // compare template arguments (yet).
Mike Stump11289f42009-09-09 15:08:12 +00004028
4029 // FIXME: It's possible that we'll find out now that the template name
Douglas Gregora16548e2009-08-11 05:31:07 +00004030 // actually refers to a type, in which case the caller is actually dealing
4031 // with a functional cast. Give a reasonable error message!
4032 return getDerived().RebuildTemplateIdExpr(Template, E->getTemplateNameLoc(),
4033 E->getLAngleLoc(),
4034 TransArgs.data(),
4035 TransArgs.size(),
4036 E->getRAngleLoc());
4037}
4038
4039template<typename Derived>
4040Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004041TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004042 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4043
4044 QualType T = getDerived().TransformType(E->getType());
4045 if (T.isNull())
4046 return SemaRef.ExprError();
4047
4048 CXXConstructorDecl *Constructor
4049 = cast_or_null<CXXConstructorDecl>(
4050 getDerived().TransformDecl(E->getConstructor()));
4051 if (!Constructor)
4052 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004053
Douglas Gregora16548e2009-08-11 05:31:07 +00004054 bool ArgumentChanged = false;
4055 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Mike Stump11289f42009-09-09 15:08:12 +00004056 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004057 ArgEnd = E->arg_end();
4058 Arg != ArgEnd; ++Arg) {
4059 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4060 if (TransArg.isInvalid())
4061 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004062
Douglas Gregora16548e2009-08-11 05:31:07 +00004063 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4064 Args.push_back(TransArg.takeAs<Expr>());
4065 }
4066
4067 if (!getDerived().AlwaysRebuild() &&
4068 T == E->getType() &&
4069 Constructor == E->getConstructor() &&
4070 !ArgumentChanged)
4071 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004072
Douglas Gregora16548e2009-08-11 05:31:07 +00004073 return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
4074 move_arg(Args));
4075}
Mike Stump11289f42009-09-09 15:08:12 +00004076
Douglas Gregora16548e2009-08-11 05:31:07 +00004077/// \brief Transform a C++ temporary-binding expression.
4078///
Mike Stump11289f42009-09-09 15:08:12 +00004079/// The transformation of a temporary-binding expression always attempts to
4080/// bind a new temporary variable to its subexpression, even if the
Douglas Gregora16548e2009-08-11 05:31:07 +00004081/// subexpression itself did not change, because the temporary variable itself
4082/// must be unique.
4083template<typename Derived>
4084Sema::OwningExprResult
4085TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4086 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4087 if (SubExpr.isInvalid())
4088 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004089
Douglas Gregora16548e2009-08-11 05:31:07 +00004090 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
4091}
Mike Stump11289f42009-09-09 15:08:12 +00004092
4093/// \brief Transform a C++ expression that contains temporaries that should
Douglas Gregora16548e2009-08-11 05:31:07 +00004094/// be destroyed after the expression is evaluated.
4095///
Mike Stump11289f42009-09-09 15:08:12 +00004096/// The transformation of a full expression always attempts to build a new
4097/// CXXExprWithTemporaries expression, even if the
Douglas Gregora16548e2009-08-11 05:31:07 +00004098/// subexpression itself did not change, because it will need to capture the
4099/// the new temporary variables introduced in the subexpression.
4100template<typename Derived>
4101Sema::OwningExprResult
4102TreeTransform<Derived>::TransformCXXExprWithTemporaries(
Mike Stump11289f42009-09-09 15:08:12 +00004103 CXXExprWithTemporaries *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004104 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4105 if (SubExpr.isInvalid())
4106 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004107
Douglas Gregora16548e2009-08-11 05:31:07 +00004108 return SemaRef.Owned(
4109 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
4110 E->shouldDestroyTemporaries()));
4111}
Mike Stump11289f42009-09-09 15:08:12 +00004112
Douglas Gregora16548e2009-08-11 05:31:07 +00004113template<typename Derived>
4114Sema::OwningExprResult
4115TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004116 CXXTemporaryObjectExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004117 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4118 QualType T = getDerived().TransformType(E->getType());
4119 if (T.isNull())
4120 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004121
Douglas Gregora16548e2009-08-11 05:31:07 +00004122 CXXConstructorDecl *Constructor
4123 = cast_or_null<CXXConstructorDecl>(
4124 getDerived().TransformDecl(E->getConstructor()));
4125 if (!Constructor)
4126 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004127
Douglas Gregora16548e2009-08-11 05:31:07 +00004128 bool ArgumentChanged = false;
4129 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4130 Args.reserve(E->getNumArgs());
Mike Stump11289f42009-09-09 15:08:12 +00004131 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004132 ArgEnd = E->arg_end();
4133 Arg != ArgEnd; ++Arg) {
4134 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4135 if (TransArg.isInvalid())
4136 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004137
Douglas Gregora16548e2009-08-11 05:31:07 +00004138 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4139 Args.push_back((Expr *)TransArg.release());
4140 }
Mike Stump11289f42009-09-09 15:08:12 +00004141
Douglas Gregora16548e2009-08-11 05:31:07 +00004142 if (!getDerived().AlwaysRebuild() &&
4143 T == E->getType() &&
4144 Constructor == E->getConstructor() &&
4145 !ArgumentChanged)
4146 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004147
Douglas Gregora16548e2009-08-11 05:31:07 +00004148 // FIXME: Bogus location information
4149 SourceLocation CommaLoc;
4150 if (Args.size() > 1) {
4151 Expr *First = (Expr *)Args[0];
Mike Stump11289f42009-09-09 15:08:12 +00004152 CommaLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00004153 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4154 }
4155 return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4156 T,
4157 /*FIXME:*/E->getTypeBeginLoc(),
4158 move_arg(Args),
4159 &CommaLoc,
4160 E->getLocEnd());
4161}
Mike Stump11289f42009-09-09 15:08:12 +00004162
Douglas Gregora16548e2009-08-11 05:31:07 +00004163template<typename Derived>
4164Sema::OwningExprResult
4165TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004166 CXXUnresolvedConstructExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004167 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4168 QualType T = getDerived().TransformType(E->getTypeAsWritten());
4169 if (T.isNull())
4170 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004171
Douglas Gregora16548e2009-08-11 05:31:07 +00004172 bool ArgumentChanged = false;
4173 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4174 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4175 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4176 ArgEnd = E->arg_end();
4177 Arg != ArgEnd; ++Arg) {
4178 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4179 if (TransArg.isInvalid())
4180 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004181
Douglas Gregora16548e2009-08-11 05:31:07 +00004182 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4183 FakeCommaLocs.push_back(
4184 SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4185 Args.push_back(TransArg.takeAs<Expr>());
4186 }
Mike Stump11289f42009-09-09 15:08:12 +00004187
Douglas Gregora16548e2009-08-11 05:31:07 +00004188 if (!getDerived().AlwaysRebuild() &&
4189 T == E->getTypeAsWritten() &&
4190 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00004191 return SemaRef.Owned(E->Retain());
4192
Douglas Gregora16548e2009-08-11 05:31:07 +00004193 // FIXME: we're faking the locations of the commas
4194 return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4195 T,
4196 E->getLParenLoc(),
4197 move_arg(Args),
4198 FakeCommaLocs.data(),
4199 E->getRParenLoc());
4200}
Mike Stump11289f42009-09-09 15:08:12 +00004201
Douglas Gregora16548e2009-08-11 05:31:07 +00004202template<typename Derived>
4203Sema::OwningExprResult
4204TreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004205 CXXUnresolvedMemberExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004206 // Transform the base of the expression.
4207 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4208 if (Base.isInvalid())
4209 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004210
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004211 // Start the member reference and compute the object's type.
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004212 Sema::TypeTy *ObjectType = 0;
Mike Stump11289f42009-09-09 15:08:12 +00004213 Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004214 E->getOperatorLoc(),
4215 E->isArrow()? tok::arrow : tok::period,
4216 ObjectType);
4217 if (Base.isInvalid())
4218 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004219
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004220 // Transform the first part of the nested-name-specifier that qualifies
4221 // the member name.
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004222 NamedDecl *FirstQualifierInScope
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004223 = getDerived().TransformFirstQualifierInScope(
4224 E->getFirstQualifierFoundInScope(),
4225 E->getQualifierRange().getBegin());
Mike Stump11289f42009-09-09 15:08:12 +00004226
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004227 NestedNameSpecifier *Qualifier = 0;
4228 if (E->getQualifier()) {
4229 Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4230 E->getQualifierRange(),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004231 QualType::getFromOpaquePtr(ObjectType),
4232 FirstQualifierInScope);
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004233 if (!Qualifier)
4234 return SemaRef.ExprError();
4235 }
Mike Stump11289f42009-09-09 15:08:12 +00004236
4237 DeclarationName Name
Douglas Gregorc59e5612009-10-19 22:04:39 +00004238 = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
4239 QualType::getFromOpaquePtr(ObjectType));
Douglas Gregorf816bd72009-09-03 22:13:48 +00004240 if (!Name)
4241 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004242
Douglas Gregor308047d2009-09-09 00:23:06 +00004243 if (!E->hasExplicitTemplateArgumentList()) {
4244 // This is a reference to a member without an explicitly-specified
4245 // template argument list. Optimize for this common case.
4246 if (!getDerived().AlwaysRebuild() &&
4247 Base.get() == E->getBase() &&
4248 Qualifier == E->getQualifier() &&
4249 Name == E->getMember() &&
4250 FirstQualifierInScope == E->getFirstQualifierFoundInScope())
Mike Stump11289f42009-09-09 15:08:12 +00004251 return SemaRef.Owned(E->Retain());
4252
Douglas Gregor308047d2009-09-09 00:23:06 +00004253 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4254 E->isArrow(),
4255 E->getOperatorLoc(),
4256 Qualifier,
4257 E->getQualifierRange(),
4258 Name,
4259 E->getMemberLoc(),
4260 FirstQualifierInScope);
4261 }
4262
4263 // FIXME: This is an ugly hack, which forces the same template name to
4264 // be looked up multiple times. Yuck!
4265 // FIXME: This also won't work for, e.g., x->template operator+<int>
4266 TemplateName OrigTemplateName
4267 = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo());
Mike Stump11289f42009-09-09 15:08:12 +00004268
4269 TemplateName Template
4270 = getDerived().TransformTemplateName(OrigTemplateName,
Douglas Gregor308047d2009-09-09 00:23:06 +00004271 QualType::getFromOpaquePtr(ObjectType));
4272 if (Template.isNull())
4273 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004274
Douglas Gregor308047d2009-09-09 00:23:06 +00004275 llvm::SmallVector<TemplateArgument, 4> TransArgs;
4276 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
Mike Stump11289f42009-09-09 15:08:12 +00004277 TemplateArgument TransArg
Douglas Gregor308047d2009-09-09 00:23:06 +00004278 = getDerived().TransformTemplateArgument(E->getTemplateArgs()[I]);
4279 if (TransArg.isNull())
4280 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004281
Douglas Gregor308047d2009-09-09 00:23:06 +00004282 TransArgs.push_back(TransArg);
4283 }
Mike Stump11289f42009-09-09 15:08:12 +00004284
Douglas Gregora16548e2009-08-11 05:31:07 +00004285 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4286 E->isArrow(),
4287 E->getOperatorLoc(),
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004288 Qualifier,
4289 E->getQualifierRange(),
Douglas Gregor308047d2009-09-09 00:23:06 +00004290 Template,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004291 E->getMemberLoc(),
Douglas Gregor308047d2009-09-09 00:23:06 +00004292 FirstQualifierInScope,
4293 E->getLAngleLoc(),
4294 TransArgs.data(),
4295 TransArgs.size(),
4296 E->getRAngleLoc());
Douglas Gregora16548e2009-08-11 05:31:07 +00004297}
4298
4299template<typename Derived>
4300Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004301TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
4302 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004303}
4304
Mike Stump11289f42009-09-09 15:08:12 +00004305template<typename Derived>
4306Sema::OwningExprResult
4307TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004308 // FIXME: poor source location
4309 TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
4310 QualType EncodedType = getDerived().TransformType(E->getEncodedType());
4311 if (EncodedType.isNull())
4312 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004313
Douglas Gregora16548e2009-08-11 05:31:07 +00004314 if (!getDerived().AlwaysRebuild() &&
4315 EncodedType == E->getEncodedType())
Mike Stump11289f42009-09-09 15:08:12 +00004316 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004317
4318 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
4319 EncodedType,
4320 E->getRParenLoc());
4321}
Mike Stump11289f42009-09-09 15:08:12 +00004322
Douglas Gregora16548e2009-08-11 05:31:07 +00004323template<typename Derived>
4324Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004325TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004326 // FIXME: Implement this!
4327 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004328 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004329}
4330
Mike Stump11289f42009-09-09 15:08:12 +00004331template<typename Derived>
4332Sema::OwningExprResult
4333TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
4334 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004335}
4336
Mike Stump11289f42009-09-09 15:08:12 +00004337template<typename Derived>
4338Sema::OwningExprResult
4339TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
4340 ObjCProtocolDecl *Protocol
Douglas Gregora16548e2009-08-11 05:31:07 +00004341 = cast_or_null<ObjCProtocolDecl>(
4342 getDerived().TransformDecl(E->getProtocol()));
4343 if (!Protocol)
4344 return SemaRef.ExprError();
4345
4346 if (!getDerived().AlwaysRebuild() &&
4347 Protocol == E->getProtocol())
Mike Stump11289f42009-09-09 15:08:12 +00004348 return SemaRef.Owned(E->Retain());
4349
Douglas Gregora16548e2009-08-11 05:31:07 +00004350 return getDerived().RebuildObjCProtocolExpr(Protocol,
4351 E->getAtLoc(),
4352 /*FIXME:*/E->getAtLoc(),
4353 /*FIXME:*/E->getAtLoc(),
4354 E->getRParenLoc());
Mike Stump11289f42009-09-09 15:08:12 +00004355
Douglas Gregora16548e2009-08-11 05:31:07 +00004356}
4357
Mike Stump11289f42009-09-09 15:08:12 +00004358template<typename Derived>
4359Sema::OwningExprResult
4360TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004361 // FIXME: Implement this!
4362 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004363 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004364}
4365
Mike Stump11289f42009-09-09 15:08:12 +00004366template<typename Derived>
4367Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004368TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
4369 // FIXME: Implement this!
4370 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004371 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004372}
4373
Mike Stump11289f42009-09-09 15:08:12 +00004374template<typename Derived>
4375Sema::OwningExprResult
Fariborz Jahanian9a846652009-08-20 17:02:02 +00004376TreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004377 ObjCImplicitSetterGetterRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004378 // FIXME: Implement this!
4379 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004380 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004381}
4382
Mike Stump11289f42009-09-09 15:08:12 +00004383template<typename Derived>
4384Sema::OwningExprResult
4385TreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004386 // FIXME: Implement this!
4387 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004388 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004389}
4390
Mike Stump11289f42009-09-09 15:08:12 +00004391template<typename Derived>
4392Sema::OwningExprResult
4393TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004394 // FIXME: Implement this!
4395 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004396 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004397}
4398
Mike Stump11289f42009-09-09 15:08:12 +00004399template<typename Derived>
4400Sema::OwningExprResult
4401TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004402 bool ArgumentChanged = false;
4403 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
4404 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
4405 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
4406 if (SubExpr.isInvalid())
4407 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004408
Douglas Gregora16548e2009-08-11 05:31:07 +00004409 ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
4410 SubExprs.push_back(SubExpr.takeAs<Expr>());
4411 }
Mike Stump11289f42009-09-09 15:08:12 +00004412
Douglas Gregora16548e2009-08-11 05:31:07 +00004413 if (!getDerived().AlwaysRebuild() &&
4414 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00004415 return SemaRef.Owned(E->Retain());
4416
Douglas Gregora16548e2009-08-11 05:31:07 +00004417 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
4418 move_arg(SubExprs),
4419 E->getRParenLoc());
4420}
4421
Mike Stump11289f42009-09-09 15:08:12 +00004422template<typename Derived>
4423Sema::OwningExprResult
4424TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004425 // FIXME: Implement this!
4426 assert(false && "Cannot transform block expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004427 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004428}
4429
Mike Stump11289f42009-09-09 15:08:12 +00004430template<typename Derived>
4431Sema::OwningExprResult
4432TreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004433 // FIXME: Implement this!
4434 assert(false && "Cannot transform block-related expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004435 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004436}
Mike Stump11289f42009-09-09 15:08:12 +00004437
Douglas Gregora16548e2009-08-11 05:31:07 +00004438//===----------------------------------------------------------------------===//
Douglas Gregord6ff3322009-08-04 16:50:30 +00004439// Type reconstruction
4440//===----------------------------------------------------------------------===//
4441
Mike Stump11289f42009-09-09 15:08:12 +00004442template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00004443QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) {
John McCall8ccfcb52009-09-24 19:53:00 +00004444 return SemaRef.BuildPointerType(PointeeType, Qualifiers(),
Douglas Gregord6ff3322009-08-04 16:50:30 +00004445 getDerived().getBaseLocation(),
4446 getDerived().getBaseEntity());
4447}
4448
Mike Stump11289f42009-09-09 15:08:12 +00004449template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00004450QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) {
John McCall8ccfcb52009-09-24 19:53:00 +00004451 return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(),
Douglas Gregord6ff3322009-08-04 16:50:30 +00004452 getDerived().getBaseLocation(),
4453 getDerived().getBaseEntity());
4454}
4455
Mike Stump11289f42009-09-09 15:08:12 +00004456template<typename Derived>
4457QualType
Douglas Gregord6ff3322009-08-04 16:50:30 +00004458TreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) {
John McCall8ccfcb52009-09-24 19:53:00 +00004459 return SemaRef.BuildReferenceType(ReferentType, true, Qualifiers(),
Douglas Gregord6ff3322009-08-04 16:50:30 +00004460 getDerived().getBaseLocation(),
4461 getDerived().getBaseEntity());
4462}
4463
4464template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004465QualType
4466TreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) {
John McCall8ccfcb52009-09-24 19:53:00 +00004467 return SemaRef.BuildReferenceType(ReferentType, false, Qualifiers(),
Mike Stump11289f42009-09-09 15:08:12 +00004468 getDerived().getBaseLocation(),
4469 getDerived().getBaseEntity());
4470}
4471
4472template<typename Derived>
4473QualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004474 QualType ClassType) {
John McCall8ccfcb52009-09-24 19:53:00 +00004475 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
Douglas Gregord6ff3322009-08-04 16:50:30 +00004476 getDerived().getBaseLocation(),
4477 getDerived().getBaseEntity());
4478}
4479
4480template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004481QualType
Douglas Gregord6ff3322009-08-04 16:50:30 +00004482TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
4483 ArrayType::ArraySizeModifier SizeMod,
4484 const llvm::APInt *Size,
4485 Expr *SizeExpr,
4486 unsigned IndexTypeQuals,
4487 SourceRange BracketsRange) {
4488 if (SizeExpr || !Size)
4489 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
4490 IndexTypeQuals, BracketsRange,
4491 getDerived().getBaseEntity());
Mike Stump11289f42009-09-09 15:08:12 +00004492
4493 QualType Types[] = {
4494 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
4495 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
4496 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
Douglas Gregord6ff3322009-08-04 16:50:30 +00004497 };
4498 const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
4499 QualType SizeType;
4500 for (unsigned I = 0; I != NumTypes; ++I)
4501 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
4502 SizeType = Types[I];
4503 break;
4504 }
Mike Stump11289f42009-09-09 15:08:12 +00004505
Douglas Gregord6ff3322009-08-04 16:50:30 +00004506 if (SizeType.isNull())
4507 SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
Mike Stump11289f42009-09-09 15:08:12 +00004508
Douglas Gregord6ff3322009-08-04 16:50:30 +00004509 IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
Mike Stump11289f42009-09-09 15:08:12 +00004510 return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004511 IndexTypeQuals, BracketsRange,
Mike Stump11289f42009-09-09 15:08:12 +00004512 getDerived().getBaseEntity());
Douglas Gregord6ff3322009-08-04 16:50:30 +00004513}
Mike Stump11289f42009-09-09 15:08:12 +00004514
Douglas Gregord6ff3322009-08-04 16:50:30 +00004515template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004516QualType
4517TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004518 ArrayType::ArraySizeModifier SizeMod,
4519 const llvm::APInt &Size,
4520 unsigned IndexTypeQuals) {
Mike Stump11289f42009-09-09 15:08:12 +00004521 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004522 IndexTypeQuals, SourceRange());
4523}
4524
4525template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004526QualType
Mike Stump11289f42009-09-09 15:08:12 +00004527TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004528 ArrayType::ArraySizeModifier SizeMod,
4529 unsigned IndexTypeQuals) {
Mike Stump11289f42009-09-09 15:08:12 +00004530 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004531 IndexTypeQuals, SourceRange());
4532}
Mike Stump11289f42009-09-09 15:08:12 +00004533
Douglas Gregord6ff3322009-08-04 16:50:30 +00004534template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004535QualType
4536TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004537 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +00004538 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004539 unsigned IndexTypeQuals,
4540 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00004541 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004542 SizeExpr.takeAs<Expr>(),
4543 IndexTypeQuals, BracketsRange);
4544}
4545
4546template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004547QualType
4548TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004549 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +00004550 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004551 unsigned IndexTypeQuals,
4552 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00004553 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004554 SizeExpr.takeAs<Expr>(),
4555 IndexTypeQuals, BracketsRange);
4556}
4557
4558template<typename Derived>
4559QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
4560 unsigned NumElements) {
4561 // FIXME: semantic checking!
4562 return SemaRef.Context.getVectorType(ElementType, NumElements);
4563}
Mike Stump11289f42009-09-09 15:08:12 +00004564
Douglas Gregord6ff3322009-08-04 16:50:30 +00004565template<typename Derived>
4566QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
4567 unsigned NumElements,
4568 SourceLocation AttributeLoc) {
4569 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
4570 NumElements, true);
4571 IntegerLiteral *VectorSize
Mike Stump11289f42009-09-09 15:08:12 +00004572 = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004573 AttributeLoc);
4574 return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
4575 AttributeLoc);
4576}
Mike Stump11289f42009-09-09 15:08:12 +00004577
Douglas Gregord6ff3322009-08-04 16:50:30 +00004578template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004579QualType
4580TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
Douglas Gregora16548e2009-08-11 05:31:07 +00004581 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004582 SourceLocation AttributeLoc) {
4583 return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
4584}
Mike Stump11289f42009-09-09 15:08:12 +00004585
Douglas Gregord6ff3322009-08-04 16:50:30 +00004586template<typename Derived>
4587QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
Mike Stump11289f42009-09-09 15:08:12 +00004588 QualType *ParamTypes,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004589 unsigned NumParamTypes,
Mike Stump11289f42009-09-09 15:08:12 +00004590 bool Variadic,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004591 unsigned Quals) {
Mike Stump11289f42009-09-09 15:08:12 +00004592 return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004593 Quals,
4594 getDerived().getBaseLocation(),
4595 getDerived().getBaseEntity());
4596}
Mike Stump11289f42009-09-09 15:08:12 +00004597
Douglas Gregord6ff3322009-08-04 16:50:30 +00004598template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00004599QualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00004600 return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
4601}
4602
4603template<typename Derived>
4604QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
4605 return SemaRef.Context.getTypeOfType(Underlying);
4606}
4607
4608template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00004609QualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00004610 return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
4611}
4612
4613template<typename Derived>
4614QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
4615 TemplateName Template,
4616 const TemplateArgument *Args,
4617 unsigned NumArgs) {
4618 // FIXME: Missing source locations for the template name, <, >.
4619 return SemaRef.CheckTemplateIdType(Template, getDerived().getBaseLocation(),
Mike Stump11289f42009-09-09 15:08:12 +00004620 SourceLocation(), Args, NumArgs,
4621 SourceLocation());
Douglas Gregord6ff3322009-08-04 16:50:30 +00004622}
Mike Stump11289f42009-09-09 15:08:12 +00004623
Douglas Gregor1135c352009-08-06 05:28:30 +00004624template<typename Derived>
4625NestedNameSpecifier *
4626TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4627 SourceRange Range,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004628 IdentifierInfo &II,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004629 QualType ObjectType,
4630 NamedDecl *FirstQualifierInScope) {
Douglas Gregor1135c352009-08-06 05:28:30 +00004631 CXXScopeSpec SS;
4632 // FIXME: The source location information is all wrong.
4633 SS.setRange(Range);
4634 SS.setScopeRep(Prefix);
4635 return static_cast<NestedNameSpecifier *>(
Mike Stump11289f42009-09-09 15:08:12 +00004636 SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
Douglas Gregore861bac2009-08-25 22:51:20 +00004637 Range.getEnd(), II,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004638 ObjectType,
4639 FirstQualifierInScope,
Douglas Gregore861bac2009-08-25 22:51:20 +00004640 false));
Douglas Gregor1135c352009-08-06 05:28:30 +00004641}
4642
4643template<typename Derived>
4644NestedNameSpecifier *
4645TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4646 SourceRange Range,
4647 NamespaceDecl *NS) {
4648 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
4649}
4650
4651template<typename Derived>
4652NestedNameSpecifier *
4653TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
4654 SourceRange Range,
4655 bool TemplateKW,
4656 QualType T) {
4657 if (T->isDependentType() || T->isRecordType() ||
4658 (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
John McCall8ccfcb52009-09-24 19:53:00 +00004659 assert(!T.hasQualifiers() && "Can't get cv-qualifiers here");
Douglas Gregor1135c352009-08-06 05:28:30 +00004660 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
4661 T.getTypePtr());
4662 }
Mike Stump11289f42009-09-09 15:08:12 +00004663
Douglas Gregor1135c352009-08-06 05:28:30 +00004664 SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
4665 return 0;
4666}
Mike Stump11289f42009-09-09 15:08:12 +00004667
Douglas Gregor71dc5092009-08-06 06:41:21 +00004668template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004669TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00004670TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4671 bool TemplateKW,
4672 TemplateDecl *Template) {
Mike Stump11289f42009-09-09 15:08:12 +00004673 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
Douglas Gregor71dc5092009-08-06 06:41:21 +00004674 Template);
4675}
4676
4677template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004678TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00004679TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
4680 bool TemplateKW,
4681 OverloadedFunctionDecl *Ovl) {
4682 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
4683}
4684
4685template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004686TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00004687TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
Douglas Gregor308047d2009-09-09 00:23:06 +00004688 const IdentifierInfo &II,
4689 QualType ObjectType) {
Douglas Gregor71dc5092009-08-06 06:41:21 +00004690 CXXScopeSpec SS;
4691 SS.setRange(SourceRange(getDerived().getBaseLocation()));
Mike Stump11289f42009-09-09 15:08:12 +00004692 SS.setScopeRep(Qualifier);
Douglas Gregor308047d2009-09-09 00:23:06 +00004693 return getSema().ActOnDependentTemplateName(
4694 /*FIXME:*/getDerived().getBaseLocation(),
4695 II,
4696 /*FIXME:*/getDerived().getBaseLocation(),
4697 SS,
4698 ObjectType.getAsOpaquePtr())
4699 .template getAsVal<TemplateName>();
Douglas Gregor71dc5092009-08-06 06:41:21 +00004700}
Mike Stump11289f42009-09-09 15:08:12 +00004701
Douglas Gregora16548e2009-08-11 05:31:07 +00004702template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004703Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004704TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
4705 SourceLocation OpLoc,
4706 ExprArg Callee,
4707 ExprArg First,
4708 ExprArg Second) {
4709 Expr *FirstExpr = (Expr *)First.get();
4710 Expr *SecondExpr = (Expr *)Second.get();
4711 bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
Mike Stump11289f42009-09-09 15:08:12 +00004712
Douglas Gregora16548e2009-08-11 05:31:07 +00004713 // Determine whether this should be a builtin operation.
4714 if (SecondExpr == 0 || isPostIncDec) {
4715 if (!FirstExpr->getType()->isOverloadableType()) {
4716 // The argument is not of overloadable type, so try to create a
4717 // built-in unary operation.
Mike Stump11289f42009-09-09 15:08:12 +00004718 UnaryOperator::Opcode Opc
Douglas Gregora16548e2009-08-11 05:31:07 +00004719 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
Mike Stump11289f42009-09-09 15:08:12 +00004720
Douglas Gregora16548e2009-08-11 05:31:07 +00004721 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
4722 }
4723 } else {
Mike Stump11289f42009-09-09 15:08:12 +00004724 if (!FirstExpr->getType()->isOverloadableType() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00004725 !SecondExpr->getType()->isOverloadableType()) {
4726 // Neither of the arguments is an overloadable type, so try to
4727 // create a built-in binary operation.
4728 BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
Mike Stump11289f42009-09-09 15:08:12 +00004729 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00004730 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
4731 if (Result.isInvalid())
4732 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004733
Douglas Gregora16548e2009-08-11 05:31:07 +00004734 First.release();
4735 Second.release();
4736 return move(Result);
4737 }
4738 }
Mike Stump11289f42009-09-09 15:08:12 +00004739
4740 // Compute the transformed set of functions (and function templates) to be
Douglas Gregora16548e2009-08-11 05:31:07 +00004741 // used during overload resolution.
4742 Sema::FunctionSet Functions;
Mike Stump11289f42009-09-09 15:08:12 +00004743
4744 DeclRefExpr *DRE
Douglas Gregor32e2c842009-09-01 16:58:52 +00004745 = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts());
Mike Stump11289f42009-09-09 15:08:12 +00004746
Douglas Gregora16548e2009-08-11 05:31:07 +00004747 // FIXME: Do we have to check
4748 // IsAcceptableNonMemberOperatorCandidate for each of these?
Douglas Gregor32e2c842009-09-01 16:58:52 +00004749 for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F)
Douglas Gregora16548e2009-08-11 05:31:07 +00004750 Functions.insert(*F);
Mike Stump11289f42009-09-09 15:08:12 +00004751
Douglas Gregora16548e2009-08-11 05:31:07 +00004752 // Add any functions found via argument-dependent lookup.
4753 Expr *Args[2] = { FirstExpr, SecondExpr };
4754 unsigned NumArgs = 1 + (SecondExpr != 0);
Mike Stump11289f42009-09-09 15:08:12 +00004755 DeclarationName OpName
Douglas Gregora16548e2009-08-11 05:31:07 +00004756 = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
4757 SemaRef.ArgumentDependentLookup(OpName, Args, NumArgs, Functions);
Mike Stump11289f42009-09-09 15:08:12 +00004758
Douglas Gregora16548e2009-08-11 05:31:07 +00004759 // Create the overloaded operator invocation for unary operators.
4760 if (NumArgs == 1 || isPostIncDec) {
Mike Stump11289f42009-09-09 15:08:12 +00004761 UnaryOperator::Opcode Opc
Douglas Gregora16548e2009-08-11 05:31:07 +00004762 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
4763 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
4764 }
Mike Stump11289f42009-09-09 15:08:12 +00004765
Douglas Gregora16548e2009-08-11 05:31:07 +00004766 // Create the overloaded operator invocation for binary operators.
Mike Stump11289f42009-09-09 15:08:12 +00004767 BinaryOperator::Opcode Opc =
Douglas Gregora16548e2009-08-11 05:31:07 +00004768 BinaryOperator::getOverloadedOpcode(Op);
Mike Stump11289f42009-09-09 15:08:12 +00004769 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00004770 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
4771 if (Result.isInvalid())
4772 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004773
Douglas Gregora16548e2009-08-11 05:31:07 +00004774 First.release();
4775 Second.release();
Mike Stump11289f42009-09-09 15:08:12 +00004776 return move(Result);
Douglas Gregora16548e2009-08-11 05:31:07 +00004777}
Mike Stump11289f42009-09-09 15:08:12 +00004778
Douglas Gregord6ff3322009-08-04 16:50:30 +00004779} // end namespace clang
4780
4781#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H