blob: f7838c2b4061fc71023de80b9e2d567469c21dae [file] [log] [blame]
John McCall550e0c22009-10-21 00:40:46 +00001//===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===/
Douglas Gregord6ff3322009-08-04 16:50:30 +00002//
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"
John McCall550e0c22009-10-21 00:40:46 +000025#include "clang/AST/TypeLocBuilder.h"
Douglas Gregora16548e2009-08-11 05:31:07 +000026#include "clang/Parse/Ownership.h"
27#include "clang/Parse/Designator.h"
28#include "clang/Lex/Preprocessor.h"
John McCall550e0c22009-10-21 00:40:46 +000029#include "llvm/Support/ErrorHandling.h"
Douglas Gregord6ff3322009-08-04 16:50:30 +000030#include <algorithm>
31
32namespace clang {
Mike Stump11289f42009-09-09 15:08:12 +000033
Douglas Gregord6ff3322009-08-04 16:50:30 +000034/// \brief A semantic tree transformation that allows one to transform one
35/// abstract syntax tree into another.
36///
Mike Stump11289f42009-09-09 15:08:12 +000037/// A new tree transformation is defined by creating a new subclass \c X of
38/// \c TreeTransform<X> and then overriding certain operations to provide
39/// behavior specific to that transformation. For example, template
Douglas Gregord6ff3322009-08-04 16:50:30 +000040/// instantiation is implemented as a tree transformation where the
41/// transformation of TemplateTypeParmType nodes involves substituting the
42/// template arguments for their corresponding template parameters; a similar
43/// transformation is performed for non-type template parameters and
44/// template template parameters.
45///
46/// This tree-transformation template uses static polymorphism to allow
Mike Stump11289f42009-09-09 15:08:12 +000047/// subclasses to customize any of its operations. Thus, a subclass can
Douglas Gregord6ff3322009-08-04 16:50:30 +000048/// override any of the transformation or rebuild operators by providing an
49/// operation with the same signature as the default implementation. The
50/// overridding function should not be virtual.
51///
52/// Semantic tree transformations are split into two stages, either of which
53/// can be replaced by a subclass. The "transform" step transforms an AST node
54/// or the parts of an AST node using the various transformation functions,
55/// then passes the pieces on to the "rebuild" step, which constructs a new AST
56/// node of the appropriate kind from the pieces. The default transformation
57/// routines recursively transform the operands to composite AST nodes (e.g.,
58/// the pointee type of a PointerType node) and, if any of those operand nodes
59/// were changed by the transformation, invokes the rebuild operation to create
60/// a new AST node.
61///
Mike Stump11289f42009-09-09 15:08:12 +000062/// Subclasses can customize the transformation at various levels. The
Douglas Gregore922c772009-08-04 22:27:00 +000063/// most coarse-grained transformations involve replacing TransformType(),
Douglas Gregord6ff3322009-08-04 16:50:30 +000064/// TransformExpr(), TransformDecl(), TransformNestedNameSpecifier(),
65/// TransformTemplateName(), or TransformTemplateArgument() with entirely
66/// new implementations.
67///
68/// For more fine-grained transformations, subclasses can replace any of the
69/// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
Douglas Gregorebe10102009-08-20 07:17:43 +000070/// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
Douglas Gregord6ff3322009-08-04 16:50:30 +000071/// replacing TransformTemplateTypeParmType() allows template instantiation
Mike Stump11289f42009-09-09 15:08:12 +000072/// to substitute template arguments for their corresponding template
Douglas Gregord6ff3322009-08-04 16:50:30 +000073/// parameters. Additionally, subclasses can override the \c RebuildXXX
74/// functions to control how AST nodes are rebuilt when their operands change.
75/// By default, \c TreeTransform will invoke semantic analysis to rebuild
76/// AST nodes. However, certain other tree transformations (e.g, cloning) may
77/// be able to use more efficient rebuild steps.
78///
79/// There are a handful of other functions that can be overridden, allowing one
Mike Stump11289f42009-09-09 15:08:12 +000080/// to avoid traversing nodes that don't need any transformation
Douglas Gregord6ff3322009-08-04 16:50:30 +000081/// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
82/// operands have not changed (\c AlwaysRebuild()), and customize the
83/// default locations and entity names used for type-checking
84/// (\c getBaseLocation(), \c getBaseEntity()).
Douglas Gregord6ff3322009-08-04 16:50:30 +000085template<typename Derived>
86class TreeTransform {
87protected:
88 Sema &SemaRef;
Mike Stump11289f42009-09-09 15:08:12 +000089
90public:
Douglas Gregora16548e2009-08-11 05:31:07 +000091 typedef Sema::OwningStmtResult OwningStmtResult;
92 typedef Sema::OwningExprResult OwningExprResult;
93 typedef Sema::StmtArg StmtArg;
94 typedef Sema::ExprArg ExprArg;
95 typedef Sema::MultiExprArg MultiExprArg;
Douglas Gregorebe10102009-08-20 07:17:43 +000096 typedef Sema::MultiStmtArg MultiStmtArg;
Mike Stump11289f42009-09-09 15:08:12 +000097
Douglas Gregord6ff3322009-08-04 16:50:30 +000098 /// \brief Initializes a new tree transformer.
99 TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
Mike Stump11289f42009-09-09 15:08:12 +0000100
Douglas Gregord6ff3322009-08-04 16:50:30 +0000101 /// \brief Retrieves a reference to the derived class.
102 Derived &getDerived() { return static_cast<Derived&>(*this); }
103
104 /// \brief Retrieves a reference to the derived class.
Mike Stump11289f42009-09-09 15:08:12 +0000105 const Derived &getDerived() const {
106 return static_cast<const Derived&>(*this);
Douglas Gregord6ff3322009-08-04 16:50:30 +0000107 }
108
109 /// \brief Retrieves a reference to the semantic analysis object used for
110 /// this tree transform.
111 Sema &getSema() const { return SemaRef; }
Mike Stump11289f42009-09-09 15:08:12 +0000112
Douglas Gregord6ff3322009-08-04 16:50:30 +0000113 /// \brief Whether the transformation should always rebuild AST nodes, even
114 /// if none of the children have changed.
115 ///
116 /// Subclasses may override this function to specify when the transformation
117 /// should rebuild all AST nodes.
118 bool AlwaysRebuild() { return false; }
Mike Stump11289f42009-09-09 15:08:12 +0000119
Douglas Gregord6ff3322009-08-04 16:50:30 +0000120 /// \brief Returns the location of the entity being transformed, if that
121 /// information was not available elsewhere in the AST.
122 ///
Mike Stump11289f42009-09-09 15:08:12 +0000123 /// By default, returns no source-location information. Subclasses can
Douglas Gregord6ff3322009-08-04 16:50:30 +0000124 /// provide an alternative implementation that provides better location
125 /// information.
126 SourceLocation getBaseLocation() { return SourceLocation(); }
Mike Stump11289f42009-09-09 15:08:12 +0000127
Douglas Gregord6ff3322009-08-04 16:50:30 +0000128 /// \brief Returns the name of the entity being transformed, if that
129 /// information was not available elsewhere in the AST.
130 ///
131 /// By default, returns an empty name. Subclasses can provide an alternative
132 /// implementation with a more precise name.
133 DeclarationName getBaseEntity() { return DeclarationName(); }
134
Douglas Gregora16548e2009-08-11 05:31:07 +0000135 /// \brief Sets the "base" location and entity when that
136 /// information is known based on another transformation.
137 ///
138 /// By default, the source location and entity are ignored. Subclasses can
139 /// override this function to provide a customized implementation.
140 void setBase(SourceLocation Loc, DeclarationName Entity) { }
Mike Stump11289f42009-09-09 15:08:12 +0000141
Douglas Gregora16548e2009-08-11 05:31:07 +0000142 /// \brief RAII object that temporarily sets the base location and entity
143 /// used for reporting diagnostics in types.
144 class TemporaryBase {
145 TreeTransform &Self;
146 SourceLocation OldLocation;
147 DeclarationName OldEntity;
Mike Stump11289f42009-09-09 15:08:12 +0000148
Douglas Gregora16548e2009-08-11 05:31:07 +0000149 public:
150 TemporaryBase(TreeTransform &Self, SourceLocation Location,
Mike Stump11289f42009-09-09 15:08:12 +0000151 DeclarationName Entity) : Self(Self) {
Douglas Gregora16548e2009-08-11 05:31:07 +0000152 OldLocation = Self.getDerived().getBaseLocation();
153 OldEntity = Self.getDerived().getBaseEntity();
154 Self.getDerived().setBase(Location, Entity);
155 }
Mike Stump11289f42009-09-09 15:08:12 +0000156
Douglas Gregora16548e2009-08-11 05:31:07 +0000157 ~TemporaryBase() {
158 Self.getDerived().setBase(OldLocation, OldEntity);
159 }
160 };
Mike Stump11289f42009-09-09 15:08:12 +0000161
162 /// \brief Determine whether the given type \p T has already been
Douglas Gregord6ff3322009-08-04 16:50:30 +0000163 /// transformed.
164 ///
165 /// Subclasses can provide an alternative implementation of this routine
Mike Stump11289f42009-09-09 15:08:12 +0000166 /// to short-circuit evaluation when it is known that a given type will
Douglas Gregord6ff3322009-08-04 16:50:30 +0000167 /// not change. For example, template instantiation need not traverse
168 /// non-dependent types.
169 bool AlreadyTransformed(QualType T) {
170 return T.isNull();
171 }
172
173 /// \brief Transforms the given type into another type.
174 ///
John McCall550e0c22009-10-21 00:40:46 +0000175 /// By default, this routine transforms a type by creating a
176 /// DeclaratorInfo for it and delegating to the appropriate
177 /// function. This is expensive, but we don't mind, because
178 /// this method is deprecated anyway; all users should be
179 /// switched to storing DeclaratorInfos.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000180 ///
181 /// \returns the transformed type.
182 QualType TransformType(QualType T);
Mike Stump11289f42009-09-09 15:08:12 +0000183
John McCall550e0c22009-10-21 00:40:46 +0000184 /// \brief Transforms the given type-with-location into a new
185 /// type-with-location.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000186 ///
John McCall550e0c22009-10-21 00:40:46 +0000187 /// By default, this routine transforms a type by delegating to the
188 /// appropriate TransformXXXType to build a new type. Subclasses
189 /// may override this function (to take over all type
190 /// transformations) or some set of the TransformXXXType functions
191 /// to alter the transformation.
192 DeclaratorInfo *TransformType(DeclaratorInfo *DI);
193
194 /// \brief Transform the given type-with-location into a new
195 /// type, collecting location information in the given builder
196 /// as necessary.
197 ///
198 QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
Mike Stump11289f42009-09-09 15:08:12 +0000199
Douglas Gregor766b0bb2009-08-06 22:17:10 +0000200 /// \brief Transform the given statement.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000201 ///
Mike Stump11289f42009-09-09 15:08:12 +0000202 /// By default, this routine transforms a statement by delegating to the
Douglas Gregorebe10102009-08-20 07:17:43 +0000203 /// appropriate TransformXXXStmt function to transform a specific kind of
204 /// statement or the TransformExpr() function to transform an expression.
205 /// Subclasses may override this function to transform statements using some
206 /// other mechanism.
207 ///
208 /// \returns the transformed statement.
Douglas Gregora16548e2009-08-11 05:31:07 +0000209 OwningStmtResult TransformStmt(Stmt *S);
Mike Stump11289f42009-09-09 15:08:12 +0000210
Douglas Gregor766b0bb2009-08-06 22:17:10 +0000211 /// \brief Transform the given expression.
212 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000213 /// By default, this routine transforms an expression by delegating to the
214 /// appropriate TransformXXXExpr function to build a new expression.
215 /// Subclasses may override this function to transform expressions using some
216 /// other mechanism.
217 ///
218 /// \returns the transformed expression.
219 OwningExprResult TransformExpr(Expr *E) {
220 return getDerived().TransformExpr(E, /*isAddressOfOperand=*/false);
221 }
222
223 /// \brief Transform the given expression.
224 ///
225 /// By default, this routine transforms an expression by delegating to the
226 /// appropriate TransformXXXExpr function to build a new expression.
227 /// Subclasses may override this function to transform expressions using some
228 /// other mechanism.
229 ///
230 /// \returns the transformed expression.
231 OwningExprResult TransformExpr(Expr *E, bool isAddressOfOperand);
Mike Stump11289f42009-09-09 15:08:12 +0000232
Douglas Gregord6ff3322009-08-04 16:50:30 +0000233 /// \brief Transform the given declaration, which is referenced from a type
234 /// or expression.
235 ///
Douglas Gregor1135c352009-08-06 05:28:30 +0000236 /// By default, acts as the identity function on declarations. Subclasses
237 /// may override this function to provide alternate behavior.
238 Decl *TransformDecl(Decl *D) { return D; }
Douglas Gregorebe10102009-08-20 07:17:43 +0000239
240 /// \brief Transform the definition of the given declaration.
241 ///
Mike Stump11289f42009-09-09 15:08:12 +0000242 /// By default, invokes TransformDecl() to transform the declaration.
Douglas Gregorebe10102009-08-20 07:17:43 +0000243 /// Subclasses may override this function to provide alternate behavior.
244 Decl *TransformDefinition(Decl *D) { return getDerived().TransformDecl(D); }
Mike Stump11289f42009-09-09 15:08:12 +0000245
Douglas Gregora5cb6da2009-10-20 05:58:46 +0000246 /// \brief Transform the given declaration, which was the first part of a
247 /// nested-name-specifier in a member access expression.
248 ///
249 /// This specific declaration transformation only applies to the first
250 /// identifier in a nested-name-specifier of a member access expression, e.g.,
251 /// the \c T in \c x->T::member
252 ///
253 /// By default, invokes TransformDecl() to transform the declaration.
254 /// Subclasses may override this function to provide alternate behavior.
255 NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
256 return cast_or_null<NamedDecl>(getDerived().TransformDecl(D));
257 }
258
Douglas Gregord6ff3322009-08-04 16:50:30 +0000259 /// \brief Transform the given nested-name-specifier.
260 ///
Mike Stump11289f42009-09-09 15:08:12 +0000261 /// By default, transforms all of the types and declarations within the
Douglas Gregor1135c352009-08-06 05:28:30 +0000262 /// nested-name-specifier. Subclasses may override this function to provide
263 /// alternate behavior.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000264 NestedNameSpecifier *TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
Douglas Gregorc26e0f62009-09-03 16:14:30 +0000265 SourceRange Range,
Douglas Gregor2b6ca462009-09-03 21:38:09 +0000266 QualType ObjectType = QualType(),
267 NamedDecl *FirstQualifierInScope = 0);
Mike Stump11289f42009-09-09 15:08:12 +0000268
Douglas Gregorf816bd72009-09-03 22:13:48 +0000269 /// \brief Transform the given declaration name.
270 ///
271 /// By default, transforms the types of conversion function, constructor,
272 /// and destructor names and then (if needed) rebuilds the declaration name.
273 /// Identifiers and selectors are returned unmodified. Sublcasses may
274 /// override this function to provide alternate behavior.
275 DeclarationName TransformDeclarationName(DeclarationName Name,
Douglas Gregorc59e5612009-10-19 22:04:39 +0000276 SourceLocation Loc,
277 QualType ObjectType = QualType());
Mike Stump11289f42009-09-09 15:08:12 +0000278
Douglas Gregord6ff3322009-08-04 16:50:30 +0000279 /// \brief Transform the given template name.
Mike Stump11289f42009-09-09 15:08:12 +0000280 ///
Douglas Gregor71dc5092009-08-06 06:41:21 +0000281 /// By default, transforms the template name by transforming the declarations
Mike Stump11289f42009-09-09 15:08:12 +0000282 /// and nested-name-specifiers that occur within the template name.
Douglas Gregor71dc5092009-08-06 06:41:21 +0000283 /// Subclasses may override this function to provide alternate behavior.
Douglas Gregor308047d2009-09-09 00:23:06 +0000284 TemplateName TransformTemplateName(TemplateName Name,
285 QualType ObjectType = QualType());
Mike Stump11289f42009-09-09 15:08:12 +0000286
Douglas Gregord6ff3322009-08-04 16:50:30 +0000287 /// \brief Transform the given template argument.
288 ///
Mike Stump11289f42009-09-09 15:08:12 +0000289 /// By default, this operation transforms the type, expression, or
290 /// declaration stored within the template argument and constructs a
Douglas Gregore922c772009-08-04 22:27:00 +0000291 /// new template argument from the transformed result. Subclasses may
292 /// override this function to provide alternate behavior.
John McCall0ad16662009-10-29 08:12:44 +0000293 ///
294 /// Returns true if there was an error.
295 bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
296 TemplateArgumentLoc &Output);
297
298 /// \brief Fakes up a TemplateArgumentLoc for a given TemplateArgument.
299 void InventTemplateArgumentLoc(const TemplateArgument &Arg,
300 TemplateArgumentLoc &ArgLoc);
301
302 /// \brief Fakes up a DeclaratorInfo for a type.
303 DeclaratorInfo *InventDeclaratorInfo(QualType T) {
304 return SemaRef.Context.getTrivialDeclaratorInfo(T,
305 getDerived().getBaseLocation());
306 }
Mike Stump11289f42009-09-09 15:08:12 +0000307
John McCall550e0c22009-10-21 00:40:46 +0000308#define ABSTRACT_TYPELOC(CLASS, PARENT)
309#define TYPELOC(CLASS, PARENT) \
310 QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
311#include "clang/AST/TypeLocNodes.def"
Douglas Gregord6ff3322009-08-04 16:50:30 +0000312
Douglas Gregorc59e5612009-10-19 22:04:39 +0000313 QualType
314 TransformTemplateSpecializationType(const TemplateSpecializationType *T,
315 QualType ObjectType);
John McCall0ad16662009-10-29 08:12:44 +0000316
317 QualType
318 TransformTemplateSpecializationType(TypeLocBuilder &TLB,
319 TemplateSpecializationTypeLoc TL,
320 QualType ObjectType);
Douglas Gregorc59e5612009-10-19 22:04:39 +0000321
Douglas Gregorebe10102009-08-20 07:17:43 +0000322 OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
Mike Stump11289f42009-09-09 15:08:12 +0000323
Douglas Gregorebe10102009-08-20 07:17:43 +0000324#define STMT(Node, Parent) \
325 OwningStmtResult Transform##Node(Node *S);
Douglas Gregora16548e2009-08-11 05:31:07 +0000326#define EXPR(Node, Parent) \
327 OwningExprResult Transform##Node(Node *E);
328#define ABSTRACT_EXPR(Node, Parent)
329#include "clang/AST/StmtNodes.def"
Mike Stump11289f42009-09-09 15:08:12 +0000330
Douglas Gregord6ff3322009-08-04 16:50:30 +0000331 /// \brief Build a new pointer type given its pointee type.
332 ///
333 /// By default, performs semantic analysis when building the pointer type.
334 /// Subclasses may override this routine to provide different behavior.
335 QualType RebuildPointerType(QualType PointeeType);
336
337 /// \brief Build a new block pointer type given its pointee type.
338 ///
Mike Stump11289f42009-09-09 15:08:12 +0000339 /// By default, performs semantic analysis when building the block pointer
Douglas Gregord6ff3322009-08-04 16:50:30 +0000340 /// type. Subclasses may override this routine to provide different behavior.
341 QualType RebuildBlockPointerType(QualType PointeeType);
342
343 /// \brief Build a new lvalue reference type given the type it references.
344 ///
345 /// By default, performs semantic analysis when building the lvalue reference
346 /// type. Subclasses may override this routine to provide different behavior.
347 QualType RebuildLValueReferenceType(QualType ReferentType);
348
349 /// \brief Build a new rvalue reference type given the type it references.
350 ///
351 /// By default, performs semantic analysis when building the rvalue reference
352 /// type. Subclasses may override this routine to provide different behavior.
353 QualType RebuildRValueReferenceType(QualType ReferentType);
Mike Stump11289f42009-09-09 15:08:12 +0000354
Douglas Gregord6ff3322009-08-04 16:50:30 +0000355 /// \brief Build a new member pointer type given the pointee type and the
356 /// class type it refers into.
357 ///
358 /// By default, performs semantic analysis when building the member pointer
359 /// type. Subclasses may override this routine to provide different behavior.
360 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType);
Mike Stump11289f42009-09-09 15:08:12 +0000361
John McCall550e0c22009-10-21 00:40:46 +0000362 /// \brief Build a new Objective C object pointer type.
363 QualType RebuildObjCObjectPointerType(QualType PointeeType);
364
Douglas Gregord6ff3322009-08-04 16:50:30 +0000365 /// \brief Build a new array type given the element type, size
366 /// modifier, size of the array (if known), size expression, and index type
367 /// qualifiers.
368 ///
369 /// By default, performs semantic analysis when building the array type.
370 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000371 /// Also by default, all of the other Rebuild*Array
Douglas Gregord6ff3322009-08-04 16:50:30 +0000372 QualType RebuildArrayType(QualType ElementType,
373 ArrayType::ArraySizeModifier SizeMod,
374 const llvm::APInt *Size,
375 Expr *SizeExpr,
376 unsigned IndexTypeQuals,
377 SourceRange BracketsRange);
Mike Stump11289f42009-09-09 15:08:12 +0000378
Douglas Gregord6ff3322009-08-04 16:50:30 +0000379 /// \brief Build a new constant array type given the element type, size
380 /// modifier, (known) size of the array, and index type qualifiers.
381 ///
382 /// By default, performs semantic analysis when building the array type.
383 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000384 QualType RebuildConstantArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000385 ArrayType::ArraySizeModifier SizeMod,
386 const llvm::APInt &Size,
387 unsigned IndexTypeQuals);
388
Douglas Gregord6ff3322009-08-04 16:50:30 +0000389 /// \brief Build a new incomplete array type given the element type, size
390 /// modifier, and index type qualifiers.
391 ///
392 /// By default, performs semantic analysis when building the array type.
393 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000394 QualType RebuildIncompleteArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000395 ArrayType::ArraySizeModifier SizeMod,
396 unsigned IndexTypeQuals);
397
Mike Stump11289f42009-09-09 15:08:12 +0000398 /// \brief Build a new variable-length array type given the element type,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000399 /// size modifier, size expression, and index type qualifiers.
400 ///
401 /// By default, performs semantic analysis when building the array type.
402 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000403 QualType RebuildVariableArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000404 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +0000405 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000406 unsigned IndexTypeQuals,
407 SourceRange BracketsRange);
408
Mike Stump11289f42009-09-09 15:08:12 +0000409 /// \brief Build a new dependent-sized array type given the element type,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000410 /// size modifier, size expression, and index type qualifiers.
411 ///
412 /// By default, performs semantic analysis when building the array type.
413 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000414 QualType RebuildDependentSizedArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000415 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +0000416 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000417 unsigned IndexTypeQuals,
418 SourceRange BracketsRange);
419
420 /// \brief Build a new vector type given the element type and
421 /// number of elements.
422 ///
423 /// By default, performs semantic analysis when building the vector type.
424 /// Subclasses may override this routine to provide different behavior.
425 QualType RebuildVectorType(QualType ElementType, unsigned NumElements);
Mike Stump11289f42009-09-09 15:08:12 +0000426
Douglas Gregord6ff3322009-08-04 16:50:30 +0000427 /// \brief Build a new extended vector type given the element type and
428 /// number of elements.
429 ///
430 /// By default, performs semantic analysis when building the vector type.
431 /// Subclasses may override this routine to provide different behavior.
432 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
433 SourceLocation AttributeLoc);
Mike Stump11289f42009-09-09 15:08:12 +0000434
435 /// \brief Build a new potentially dependently-sized extended vector type
Douglas Gregord6ff3322009-08-04 16:50:30 +0000436 /// given the element type and number of elements.
437 ///
438 /// By default, performs semantic analysis when building the vector type.
439 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000440 QualType RebuildDependentSizedExtVectorType(QualType ElementType,
Douglas Gregora16548e2009-08-11 05:31:07 +0000441 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000442 SourceLocation AttributeLoc);
Mike Stump11289f42009-09-09 15:08:12 +0000443
Douglas Gregord6ff3322009-08-04 16:50:30 +0000444 /// \brief Build a new function type.
445 ///
446 /// By default, performs semantic analysis when building the function type.
447 /// Subclasses may override this routine to provide different behavior.
448 QualType RebuildFunctionProtoType(QualType T,
Mike Stump11289f42009-09-09 15:08:12 +0000449 QualType *ParamTypes,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000450 unsigned NumParamTypes,
451 bool Variadic, unsigned Quals);
Mike Stump11289f42009-09-09 15:08:12 +0000452
John McCall550e0c22009-10-21 00:40:46 +0000453 /// \brief Build a new unprototyped function type.
454 QualType RebuildFunctionNoProtoType(QualType ResultType);
455
Douglas Gregord6ff3322009-08-04 16:50:30 +0000456 /// \brief Build a new typedef type.
457 QualType RebuildTypedefType(TypedefDecl *Typedef) {
458 return SemaRef.Context.getTypeDeclType(Typedef);
459 }
460
461 /// \brief Build a new class/struct/union type.
462 QualType RebuildRecordType(RecordDecl *Record) {
463 return SemaRef.Context.getTypeDeclType(Record);
464 }
465
466 /// \brief Build a new Enum type.
467 QualType RebuildEnumType(EnumDecl *Enum) {
468 return SemaRef.Context.getTypeDeclType(Enum);
469 }
John McCallfcc33b02009-09-05 00:15:47 +0000470
471 /// \brief Build a new elaborated type.
472 QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
473 return SemaRef.Context.getElaboratedType(T, Tag);
474 }
Mike Stump11289f42009-09-09 15:08:12 +0000475
476 /// \brief Build a new typeof(expr) type.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000477 ///
478 /// By default, performs semantic analysis when building the typeof type.
479 /// Subclasses may override this routine to provide different behavior.
Douglas Gregora16548e2009-08-11 05:31:07 +0000480 QualType RebuildTypeOfExprType(ExprArg Underlying);
Douglas Gregord6ff3322009-08-04 16:50:30 +0000481
Mike Stump11289f42009-09-09 15:08:12 +0000482 /// \brief Build a new typeof(type) type.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000483 ///
484 /// By default, builds a new TypeOfType with the given underlying type.
485 QualType RebuildTypeOfType(QualType Underlying);
486
Mike Stump11289f42009-09-09 15:08:12 +0000487 /// \brief Build a new C++0x decltype type.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000488 ///
489 /// By default, performs semantic analysis when building the decltype type.
490 /// Subclasses may override this routine to provide different behavior.
Douglas Gregora16548e2009-08-11 05:31:07 +0000491 QualType RebuildDecltypeType(ExprArg Underlying);
Mike Stump11289f42009-09-09 15:08:12 +0000492
Douglas Gregord6ff3322009-08-04 16:50:30 +0000493 /// \brief Build a new template specialization type.
494 ///
495 /// By default, performs semantic analysis when building the template
496 /// specialization type. Subclasses may override this routine to provide
497 /// different behavior.
498 QualType RebuildTemplateSpecializationType(TemplateName Template,
John McCall0ad16662009-10-29 08:12:44 +0000499 SourceLocation TemplateLoc,
500 SourceLocation LAngleLoc,
501 const TemplateArgumentLoc *Args,
502 unsigned NumArgs,
503 SourceLocation RAngleLoc);
Mike Stump11289f42009-09-09 15:08:12 +0000504
Douglas Gregord6ff3322009-08-04 16:50:30 +0000505 /// \brief Build a new qualified name type.
506 ///
Mike Stump11289f42009-09-09 15:08:12 +0000507 /// By default, builds a new QualifiedNameType type from the
508 /// nested-name-specifier and the named type. Subclasses may override
Douglas Gregord6ff3322009-08-04 16:50:30 +0000509 /// this routine to provide different behavior.
510 QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
511 return SemaRef.Context.getQualifiedNameType(NNS, Named);
Mike Stump11289f42009-09-09 15:08:12 +0000512 }
Douglas Gregord6ff3322009-08-04 16:50:30 +0000513
514 /// \brief Build a new typename type that refers to a template-id.
515 ///
516 /// By default, builds a new TypenameType type from the nested-name-specifier
Mike Stump11289f42009-09-09 15:08:12 +0000517 /// and the given type. Subclasses may override this routine to provide
Douglas Gregord6ff3322009-08-04 16:50:30 +0000518 /// different behavior.
519 QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
520 if (NNS->isDependent())
Mike Stump11289f42009-09-09 15:08:12 +0000521 return SemaRef.Context.getTypenameType(NNS,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000522 cast<TemplateSpecializationType>(T));
Mike Stump11289f42009-09-09 15:08:12 +0000523
Douglas Gregord6ff3322009-08-04 16:50:30 +0000524 return SemaRef.Context.getQualifiedNameType(NNS, T);
Mike Stump11289f42009-09-09 15:08:12 +0000525 }
Douglas Gregord6ff3322009-08-04 16:50:30 +0000526
527 /// \brief Build a new typename type that refers to an identifier.
528 ///
529 /// By default, performs semantic analysis when building the typename type
Mike Stump11289f42009-09-09 15:08:12 +0000530 /// (or qualified name type). Subclasses may override this routine to provide
Douglas Gregord6ff3322009-08-04 16:50:30 +0000531 /// different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000532 QualType RebuildTypenameType(NestedNameSpecifier *NNS,
John McCall0ad16662009-10-29 08:12:44 +0000533 const IdentifierInfo *Id,
534 SourceRange SR) {
535 return SemaRef.CheckTypenameType(NNS, *Id, SR);
Douglas Gregor1135c352009-08-06 05:28:30 +0000536 }
Mike Stump11289f42009-09-09 15:08:12 +0000537
Douglas Gregor1135c352009-08-06 05:28:30 +0000538 /// \brief Build a new nested-name-specifier given the prefix and an
539 /// identifier that names the next step in the nested-name-specifier.
540 ///
541 /// By default, performs semantic analysis when building the new
542 /// nested-name-specifier. Subclasses may override this routine to provide
543 /// different behavior.
544 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
545 SourceRange Range,
Douglas Gregorc26e0f62009-09-03 16:14:30 +0000546 IdentifierInfo &II,
Douglas Gregor2b6ca462009-09-03 21:38:09 +0000547 QualType ObjectType,
548 NamedDecl *FirstQualifierInScope);
Douglas Gregor1135c352009-08-06 05:28:30 +0000549
550 /// \brief Build a new nested-name-specifier given the prefix and the
551 /// namespace named in the next step in the nested-name-specifier.
552 ///
553 /// By default, performs semantic analysis when building the new
554 /// nested-name-specifier. Subclasses may override this routine to provide
555 /// different behavior.
556 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
557 SourceRange Range,
558 NamespaceDecl *NS);
559
560 /// \brief Build a new nested-name-specifier given the prefix and the
561 /// type named in the next step in the nested-name-specifier.
562 ///
563 /// By default, performs semantic analysis when building the new
564 /// nested-name-specifier. Subclasses may override this routine to provide
565 /// different behavior.
566 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
567 SourceRange Range,
568 bool TemplateKW,
569 QualType T);
Douglas Gregor71dc5092009-08-06 06:41:21 +0000570
571 /// \brief Build a new template name given a nested name specifier, a flag
572 /// indicating whether the "template" keyword was provided, and the template
573 /// that the template name refers to.
574 ///
575 /// By default, builds the new template name directly. Subclasses may override
576 /// this routine to provide different behavior.
577 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
578 bool TemplateKW,
579 TemplateDecl *Template);
580
581 /// \brief Build a new template name given a nested name specifier, a flag
582 /// indicating whether the "template" keyword was provided, and a set of
583 /// overloaded function templates.
584 ///
585 /// By default, builds the new template name directly. Subclasses may override
586 /// this routine to provide different behavior.
587 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
588 bool TemplateKW,
589 OverloadedFunctionDecl *Ovl);
Mike Stump11289f42009-09-09 15:08:12 +0000590
Douglas Gregor71dc5092009-08-06 06:41:21 +0000591 /// \brief Build a new template name given a nested name specifier and the
592 /// name that is referred to as a template.
593 ///
594 /// By default, performs semantic analysis to determine whether the name can
595 /// be resolved to a specific template, then builds the appropriate kind of
596 /// template name. Subclasses may override this routine to provide different
597 /// behavior.
598 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
Douglas Gregor308047d2009-09-09 00:23:06 +0000599 const IdentifierInfo &II,
600 QualType ObjectType);
Mike Stump11289f42009-09-09 15:08:12 +0000601
602
Douglas Gregorebe10102009-08-20 07:17:43 +0000603 /// \brief Build a new compound statement.
604 ///
605 /// By default, performs semantic analysis to build the new statement.
606 /// Subclasses may override this routine to provide different behavior.
607 OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
608 MultiStmtArg Statements,
609 SourceLocation RBraceLoc,
610 bool IsStmtExpr) {
611 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
612 IsStmtExpr);
613 }
614
615 /// \brief Build a new case statement.
616 ///
617 /// By default, performs semantic analysis to build the new statement.
618 /// Subclasses may override this routine to provide different behavior.
619 OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
620 ExprArg LHS,
621 SourceLocation EllipsisLoc,
622 ExprArg RHS,
623 SourceLocation ColonLoc) {
Mike Stump11289f42009-09-09 15:08:12 +0000624 return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
Douglas Gregorebe10102009-08-20 07:17:43 +0000625 ColonLoc);
626 }
Mike Stump11289f42009-09-09 15:08:12 +0000627
Douglas Gregorebe10102009-08-20 07:17:43 +0000628 /// \brief Attach the body to a new case statement.
629 ///
630 /// By default, performs semantic analysis to build the new statement.
631 /// Subclasses may override this routine to provide different behavior.
632 OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
633 getSema().ActOnCaseStmtBody(S.get(), move(Body));
634 return move(S);
635 }
Mike Stump11289f42009-09-09 15:08:12 +0000636
Douglas Gregorebe10102009-08-20 07:17:43 +0000637 /// \brief Build a new default statement.
638 ///
639 /// By default, performs semantic analysis to build the new statement.
640 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000641 OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000642 SourceLocation ColonLoc,
643 StmtArg SubStmt) {
Mike Stump11289f42009-09-09 15:08:12 +0000644 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
Douglas Gregorebe10102009-08-20 07:17:43 +0000645 /*CurScope=*/0);
646 }
Mike Stump11289f42009-09-09 15:08:12 +0000647
Douglas Gregorebe10102009-08-20 07:17:43 +0000648 /// \brief Build a new label statement.
649 ///
650 /// By default, performs semantic analysis to build the new statement.
651 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000652 OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000653 IdentifierInfo *Id,
654 SourceLocation ColonLoc,
655 StmtArg SubStmt) {
656 return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
657 }
Mike Stump11289f42009-09-09 15:08:12 +0000658
Douglas Gregorebe10102009-08-20 07:17:43 +0000659 /// \brief Build a new "if" statement.
660 ///
661 /// By default, performs semantic analysis to build the new statement.
662 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000663 OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
664 StmtArg Then, SourceLocation ElseLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000665 StmtArg Else) {
666 return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else));
667 }
Mike Stump11289f42009-09-09 15:08:12 +0000668
Douglas Gregorebe10102009-08-20 07:17:43 +0000669 /// \brief Start building a new switch statement.
670 ///
671 /// By default, performs semantic analysis to build the new statement.
672 /// Subclasses may override this routine to provide different behavior.
673 OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) {
674 return getSema().ActOnStartOfSwitchStmt(move(Cond));
675 }
Mike Stump11289f42009-09-09 15:08:12 +0000676
Douglas Gregorebe10102009-08-20 07:17:43 +0000677 /// \brief Attach the body to the switch statement.
678 ///
679 /// By default, performs semantic analysis to build the new statement.
680 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000681 OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000682 StmtArg Switch, StmtArg Body) {
683 return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
684 move(Body));
685 }
686
687 /// \brief Build a new while statement.
688 ///
689 /// By default, performs semantic analysis to build the new statement.
690 /// Subclasses may override this routine to provide different behavior.
691 OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
692 Sema::FullExprArg Cond,
693 StmtArg Body) {
694 return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body));
695 }
Mike Stump11289f42009-09-09 15:08:12 +0000696
Douglas Gregorebe10102009-08-20 07:17:43 +0000697 /// \brief Build a new do-while statement.
698 ///
699 /// By default, performs semantic analysis to build the new statement.
700 /// Subclasses may override this routine to provide different behavior.
701 OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
702 SourceLocation WhileLoc,
703 SourceLocation LParenLoc,
704 ExprArg Cond,
705 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +0000706 return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000707 move(Cond), RParenLoc);
708 }
709
710 /// \brief Build a new for statement.
711 ///
712 /// By default, performs semantic analysis to build the new statement.
713 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000714 OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000715 SourceLocation LParenLoc,
716 StmtArg Init, ExprArg Cond, ExprArg Inc,
717 SourceLocation RParenLoc, StmtArg Body) {
Mike Stump11289f42009-09-09 15:08:12 +0000718 return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond),
Douglas Gregorebe10102009-08-20 07:17:43 +0000719 move(Inc), RParenLoc, move(Body));
720 }
Mike Stump11289f42009-09-09 15:08:12 +0000721
Douglas Gregorebe10102009-08-20 07:17:43 +0000722 /// \brief Build a new goto statement.
723 ///
724 /// By default, performs semantic analysis to build the new statement.
725 /// Subclasses may override this routine to provide different behavior.
726 OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
727 SourceLocation LabelLoc,
728 LabelStmt *Label) {
729 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
730 }
731
732 /// \brief Build a new indirect goto statement.
733 ///
734 /// By default, performs semantic analysis to build the new statement.
735 /// Subclasses may override this routine to provide different behavior.
736 OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
737 SourceLocation StarLoc,
738 ExprArg Target) {
739 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
740 }
Mike Stump11289f42009-09-09 15:08:12 +0000741
Douglas Gregorebe10102009-08-20 07:17:43 +0000742 /// \brief Build a new return statement.
743 ///
744 /// By default, performs semantic analysis to build the new statement.
745 /// Subclasses may override this routine to provide different behavior.
746 OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
747 ExprArg Result) {
Mike Stump11289f42009-09-09 15:08:12 +0000748
Douglas Gregorebe10102009-08-20 07:17:43 +0000749 return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
750 }
Mike Stump11289f42009-09-09 15:08:12 +0000751
Douglas Gregorebe10102009-08-20 07:17:43 +0000752 /// \brief Build a new declaration statement.
753 ///
754 /// By default, performs semantic analysis to build the new statement.
755 /// Subclasses may override this routine to provide different behavior.
756 OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
Mike Stump11289f42009-09-09 15:08:12 +0000757 SourceLocation StartLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000758 SourceLocation EndLoc) {
759 return getSema().Owned(
760 new (getSema().Context) DeclStmt(
761 DeclGroupRef::Create(getSema().Context,
762 Decls, NumDecls),
763 StartLoc, EndLoc));
764 }
Mike Stump11289f42009-09-09 15:08:12 +0000765
Douglas Gregorebe10102009-08-20 07:17:43 +0000766 /// \brief Build a new C++ exception declaration.
767 ///
768 /// By default, performs semantic analysis to build the new decaration.
769 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000770 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
Douglas Gregorebe10102009-08-20 07:17:43 +0000771 DeclaratorInfo *Declarator,
772 IdentifierInfo *Name,
773 SourceLocation Loc,
774 SourceRange TypeRange) {
Mike Stump11289f42009-09-09 15:08:12 +0000775 return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000776 TypeRange);
777 }
778
779 /// \brief Build a new C++ catch statement.
780 ///
781 /// By default, performs semantic analysis to build the new statement.
782 /// Subclasses may override this routine to provide different behavior.
783 OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
784 VarDecl *ExceptionDecl,
785 StmtArg Handler) {
786 return getSema().Owned(
Mike Stump11289f42009-09-09 15:08:12 +0000787 new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
Douglas Gregorebe10102009-08-20 07:17:43 +0000788 Handler.takeAs<Stmt>()));
789 }
Mike Stump11289f42009-09-09 15:08:12 +0000790
Douglas Gregorebe10102009-08-20 07:17:43 +0000791 /// \brief Build a new C++ try statement.
792 ///
793 /// By default, performs semantic analysis to build the new statement.
794 /// Subclasses may override this routine to provide different behavior.
795 OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
796 StmtArg TryBlock,
797 MultiStmtArg Handlers) {
798 return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
799 }
Mike Stump11289f42009-09-09 15:08:12 +0000800
Douglas Gregora16548e2009-08-11 05:31:07 +0000801 /// \brief Build a new expression that references a declaration.
802 ///
803 /// By default, performs semantic analysis to build the new expression.
804 /// Subclasses may override this routine to provide different behavior.
Douglas Gregor4bd90e52009-10-23 18:54:35 +0000805 OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
806 SourceRange QualifierRange,
807 NamedDecl *ND, SourceLocation Loc) {
808 CXXScopeSpec SS;
809 SS.setScopeRep(Qualifier);
810 SS.setRange(QualifierRange);
Douglas Gregora16548e2009-08-11 05:31:07 +0000811 return getSema().BuildDeclarationNameExpr(Loc, ND,
812 /*FIXME:*/false,
Douglas Gregor4bd90e52009-10-23 18:54:35 +0000813 &SS,
Douglas Gregora16548e2009-08-11 05:31:07 +0000814 /*FIXME:*/false);
815 }
Mike Stump11289f42009-09-09 15:08:12 +0000816
Douglas Gregora16548e2009-08-11 05:31:07 +0000817 /// \brief Build a new expression in parentheses.
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 RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
822 SourceLocation RParen) {
823 return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
824 }
825
Douglas Gregorad8a3362009-09-04 17:36:40 +0000826 /// \brief Build a new pseudo-destructor expression.
Mike Stump11289f42009-09-09 15:08:12 +0000827 ///
Douglas Gregorad8a3362009-09-04 17:36:40 +0000828 /// By default, performs semantic analysis to build the new expression.
829 /// Subclasses may override this routine to provide different behavior.
830 OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
831 SourceLocation OperatorLoc,
832 bool isArrow,
833 SourceLocation DestroyedTypeLoc,
834 QualType DestroyedType,
835 NestedNameSpecifier *Qualifier,
836 SourceRange QualifierRange) {
837 CXXScopeSpec SS;
838 if (Qualifier) {
839 SS.setRange(QualifierRange);
840 SS.setScopeRep(Qualifier);
841 }
842
Mike Stump11289f42009-09-09 15:08:12 +0000843 DeclarationName Name
Douglas Gregorad8a3362009-09-04 17:36:40 +0000844 = SemaRef.Context.DeclarationNames.getCXXDestructorName(
845 SemaRef.Context.getCanonicalType(DestroyedType));
Mike Stump11289f42009-09-09 15:08:12 +0000846
847 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
Douglas Gregorad8a3362009-09-04 17:36:40 +0000848 OperatorLoc,
849 isArrow? tok::arrow : tok::period,
850 DestroyedTypeLoc,
851 Name,
852 Sema::DeclPtrTy::make((Decl *)0),
853 &SS);
Mike Stump11289f42009-09-09 15:08:12 +0000854 }
855
Douglas Gregora16548e2009-08-11 05:31:07 +0000856 /// \brief Build a new unary operator expression.
Mike Stump11289f42009-09-09 15:08:12 +0000857 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000858 /// By default, performs semantic analysis to build the new expression.
859 /// Subclasses may override this routine to provide different behavior.
860 OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
861 UnaryOperator::Opcode Opc,
862 ExprArg SubExpr) {
863 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr));
864 }
Mike Stump11289f42009-09-09 15:08:12 +0000865
Douglas Gregora16548e2009-08-11 05:31:07 +0000866 /// \brief Build a new sizeof or alignof expression with a type argument.
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 RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc,
871 bool isSizeOf, SourceRange R) {
872 return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R);
873 }
874
Mike Stump11289f42009-09-09 15:08:12 +0000875 /// \brief Build a new sizeof or alignof expression with an expression
Douglas Gregora16548e2009-08-11 05:31:07 +0000876 /// argument.
Mike Stump11289f42009-09-09 15:08:12 +0000877 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000878 /// By default, performs semantic analysis to build the new expression.
879 /// Subclasses may override this routine to provide different behavior.
880 OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
881 bool isSizeOf, SourceRange R) {
Mike Stump11289f42009-09-09 15:08:12 +0000882 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +0000883 = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
884 OpLoc, isSizeOf, R);
885 if (Result.isInvalid())
886 return getSema().ExprError();
Mike Stump11289f42009-09-09 15:08:12 +0000887
Douglas Gregora16548e2009-08-11 05:31:07 +0000888 SubExpr.release();
889 return move(Result);
890 }
Mike Stump11289f42009-09-09 15:08:12 +0000891
Douglas Gregora16548e2009-08-11 05:31:07 +0000892 /// \brief Build a new array subscript expression.
Mike Stump11289f42009-09-09 15:08:12 +0000893 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000894 /// By default, performs semantic analysis to build the new expression.
895 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000896 OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
Douglas Gregora16548e2009-08-11 05:31:07 +0000897 SourceLocation LBracketLoc,
898 ExprArg RHS,
899 SourceLocation RBracketLoc) {
900 return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
Mike Stump11289f42009-09-09 15:08:12 +0000901 LBracketLoc, move(RHS),
Douglas Gregora16548e2009-08-11 05:31:07 +0000902 RBracketLoc);
903 }
904
905 /// \brief Build a new call expression.
Mike Stump11289f42009-09-09 15:08:12 +0000906 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000907 /// By default, performs semantic analysis to build the new expression.
908 /// Subclasses may override this routine to provide different behavior.
909 OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
910 MultiExprArg Args,
911 SourceLocation *CommaLocs,
912 SourceLocation RParenLoc) {
913 return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
914 move(Args), CommaLocs, RParenLoc);
915 }
916
917 /// \brief Build a new member access expression.
Mike Stump11289f42009-09-09 15:08:12 +0000918 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000919 /// By default, performs semantic analysis to build the new expression.
920 /// Subclasses may override this routine to provide different behavior.
921 OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
Mike Stump11289f42009-09-09 15:08:12 +0000922 bool isArrow,
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000923 NestedNameSpecifier *Qualifier,
924 SourceRange QualifierRange,
925 SourceLocation MemberLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +0000926 NamedDecl *Member) {
Anders Carlsson5da84842009-09-01 04:26:58 +0000927 if (!Member->getDeclName()) {
928 // We have a reference to an unnamed field.
929 assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
Mike Stump11289f42009-09-09 15:08:12 +0000930
931 MemberExpr *ME =
Anders Carlsson5da84842009-09-01 04:26:58 +0000932 new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow,
933 Member, MemberLoc,
934 cast<FieldDecl>(Member)->getType());
935 return getSema().Owned(ME);
936 }
Mike Stump11289f42009-09-09 15:08:12 +0000937
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000938 CXXScopeSpec SS;
939 if (Qualifier) {
940 SS.setRange(QualifierRange);
941 SS.setScopeRep(Qualifier);
942 }
943
Douglas Gregorf14b46f2009-08-31 20:00:26 +0000944 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +0000945 isArrow? tok::arrow : tok::period,
946 MemberLoc,
Douglas Gregorf14b46f2009-08-31 20:00:26 +0000947 Member->getDeclName(),
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000948 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
949 &SS);
Douglas Gregora16548e2009-08-11 05:31:07 +0000950 }
Mike Stump11289f42009-09-09 15:08:12 +0000951
Douglas Gregora16548e2009-08-11 05:31:07 +0000952 /// \brief Build a new binary operator expression.
Mike Stump11289f42009-09-09 15:08:12 +0000953 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000954 /// By default, performs semantic analysis to build the new expression.
955 /// Subclasses may override this routine to provide different behavior.
956 OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
957 BinaryOperator::Opcode Opc,
958 ExprArg LHS, ExprArg RHS) {
959 OwningExprResult Result
Mike Stump11289f42009-09-09 15:08:12 +0000960 = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +0000961 (Expr *)RHS.get());
962 if (Result.isInvalid())
963 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +0000964
Douglas Gregora16548e2009-08-11 05:31:07 +0000965 LHS.release();
966 RHS.release();
967 return move(Result);
968 }
969
970 /// \brief Build a new conditional operator expression.
Mike Stump11289f42009-09-09 15:08:12 +0000971 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000972 /// By default, performs semantic analysis to build the new expression.
973 /// Subclasses may override this routine to provide different behavior.
974 OwningExprResult RebuildConditionalOperator(ExprArg Cond,
975 SourceLocation QuestionLoc,
976 ExprArg LHS,
977 SourceLocation ColonLoc,
978 ExprArg RHS) {
Mike Stump11289f42009-09-09 15:08:12 +0000979 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
Douglas Gregora16548e2009-08-11 05:31:07 +0000980 move(LHS), move(RHS));
981 }
982
983 /// \brief Build a new implicit cast expression.
Mike Stump11289f42009-09-09 15:08:12 +0000984 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000985 /// By default, builds a new implicit cast without any semantic analysis.
986 /// Subclasses may override this routine to provide different behavior.
987 OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
988 ExprArg SubExpr, bool isLvalue) {
989 ImplicitCastExpr *ICE
Mike Stump11289f42009-09-09 15:08:12 +0000990 = new (getSema().Context) ImplicitCastExpr(T, Kind,
Douglas Gregora16548e2009-08-11 05:31:07 +0000991 (Expr *)SubExpr.release(),
992 isLvalue);
993 return getSema().Owned(ICE);
994 }
995
996 /// \brief Build a new C-style cast expression.
Mike Stump11289f42009-09-09 15:08:12 +0000997 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000998 /// By default, performs semantic analysis to build the new expression.
999 /// Subclasses may override this routine to provide different behavior.
1000 OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
1001 QualType ExplicitTy,
1002 SourceLocation RParenLoc,
1003 ExprArg SubExpr) {
1004 return getSema().ActOnCastExpr(/*Scope=*/0,
1005 LParenLoc,
1006 ExplicitTy.getAsOpaquePtr(),
1007 RParenLoc,
1008 move(SubExpr));
1009 }
Mike Stump11289f42009-09-09 15:08:12 +00001010
Douglas Gregora16548e2009-08-11 05:31:07 +00001011 /// \brief Build a new compound literal expression.
Mike Stump11289f42009-09-09 15:08:12 +00001012 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001013 /// By default, performs semantic analysis to build the new expression.
1014 /// Subclasses may override this routine to provide different behavior.
1015 OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1016 QualType T,
1017 SourceLocation RParenLoc,
1018 ExprArg Init) {
1019 return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
1020 RParenLoc, move(Init));
1021 }
Mike Stump11289f42009-09-09 15:08:12 +00001022
Douglas Gregora16548e2009-08-11 05:31:07 +00001023 /// \brief Build a new extended vector element access expression.
Mike Stump11289f42009-09-09 15:08:12 +00001024 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001025 /// By default, performs semantic analysis to build the new expression.
1026 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001027 OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
Douglas Gregora16548e2009-08-11 05:31:07 +00001028 SourceLocation OpLoc,
1029 SourceLocation AccessorLoc,
1030 IdentifierInfo &Accessor) {
1031 return getSema().ActOnMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
1032 tok::period, AccessorLoc,
1033 Accessor,
1034 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1035 }
Mike Stump11289f42009-09-09 15:08:12 +00001036
Douglas Gregora16548e2009-08-11 05:31:07 +00001037 /// \brief Build a new initializer list expression.
Mike Stump11289f42009-09-09 15:08:12 +00001038 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001039 /// By default, performs semantic analysis to build the new expression.
1040 /// Subclasses may override this routine to provide different behavior.
1041 OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1042 MultiExprArg Inits,
1043 SourceLocation RBraceLoc) {
1044 return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1045 }
Mike Stump11289f42009-09-09 15:08:12 +00001046
Douglas Gregora16548e2009-08-11 05:31:07 +00001047 /// \brief Build a new designated initializer expression.
Mike Stump11289f42009-09-09 15:08:12 +00001048 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001049 /// By default, performs semantic analysis to build the new expression.
1050 /// Subclasses may override this routine to provide different behavior.
1051 OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1052 MultiExprArg ArrayExprs,
1053 SourceLocation EqualOrColonLoc,
1054 bool GNUSyntax,
1055 ExprArg Init) {
1056 OwningExprResult Result
1057 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1058 move(Init));
1059 if (Result.isInvalid())
1060 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001061
Douglas Gregora16548e2009-08-11 05:31:07 +00001062 ArrayExprs.release();
1063 return move(Result);
1064 }
Mike Stump11289f42009-09-09 15:08:12 +00001065
Douglas Gregora16548e2009-08-11 05:31:07 +00001066 /// \brief Build a new value-initialized expression.
Mike Stump11289f42009-09-09 15:08:12 +00001067 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001068 /// By default, builds the implicit value initialization without performing
1069 /// any semantic analysis. Subclasses may override this routine to provide
1070 /// different behavior.
1071 OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1072 return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1073 }
Mike Stump11289f42009-09-09 15:08:12 +00001074
Douglas Gregora16548e2009-08-11 05:31:07 +00001075 /// \brief Build a new \c va_arg expression.
Mike Stump11289f42009-09-09 15:08:12 +00001076 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001077 /// By default, performs semantic analysis to build the new expression.
1078 /// Subclasses may override this routine to provide different behavior.
1079 OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1080 QualType T, SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001081 return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
Douglas Gregora16548e2009-08-11 05:31:07 +00001082 RParenLoc);
1083 }
1084
1085 /// \brief Build a new expression list in parentheses.
Mike Stump11289f42009-09-09 15:08:12 +00001086 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001087 /// By default, performs semantic analysis to build the new expression.
1088 /// Subclasses may override this routine to provide different behavior.
1089 OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1090 MultiExprArg SubExprs,
1091 SourceLocation RParenLoc) {
1092 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
1093 }
Mike Stump11289f42009-09-09 15:08:12 +00001094
Douglas Gregora16548e2009-08-11 05:31:07 +00001095 /// \brief Build a new address-of-label expression.
Mike Stump11289f42009-09-09 15:08:12 +00001096 ///
1097 /// By default, performs semantic analysis, using the name of the label
Douglas Gregora16548e2009-08-11 05:31:07 +00001098 /// rather than attempting to map the label statement itself.
1099 /// Subclasses may override this routine to provide different behavior.
1100 OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1101 SourceLocation LabelLoc,
1102 LabelStmt *Label) {
1103 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1104 }
Mike Stump11289f42009-09-09 15:08:12 +00001105
Douglas Gregora16548e2009-08-11 05:31:07 +00001106 /// \brief Build a new GNU statement expression.
Mike Stump11289f42009-09-09 15:08:12 +00001107 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001108 /// By default, performs semantic analysis to build the new expression.
1109 /// Subclasses may override this routine to provide different behavior.
1110 OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1111 StmtArg SubStmt,
1112 SourceLocation RParenLoc) {
1113 return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1114 }
Mike Stump11289f42009-09-09 15:08:12 +00001115
Douglas Gregora16548e2009-08-11 05:31:07 +00001116 /// \brief Build a new __builtin_types_compatible_p expression.
1117 ///
1118 /// By default, performs semantic analysis to build the new expression.
1119 /// Subclasses may override this routine to provide different behavior.
1120 OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1121 QualType T1, QualType T2,
1122 SourceLocation RParenLoc) {
1123 return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1124 T1.getAsOpaquePtr(),
1125 T2.getAsOpaquePtr(),
1126 RParenLoc);
1127 }
Mike Stump11289f42009-09-09 15:08:12 +00001128
Douglas Gregora16548e2009-08-11 05:31:07 +00001129 /// \brief Build a new __builtin_choose_expr expression.
1130 ///
1131 /// By default, performs semantic analysis to build the new expression.
1132 /// Subclasses may override this routine to provide different behavior.
1133 OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1134 ExprArg Cond, ExprArg LHS, ExprArg RHS,
1135 SourceLocation RParenLoc) {
1136 return SemaRef.ActOnChooseExpr(BuiltinLoc,
1137 move(Cond), move(LHS), move(RHS),
1138 RParenLoc);
1139 }
Mike Stump11289f42009-09-09 15:08:12 +00001140
Douglas Gregora16548e2009-08-11 05:31:07 +00001141 /// \brief Build a new overloaded operator call expression.
1142 ///
1143 /// By default, performs semantic analysis to build the new expression.
1144 /// The semantic analysis provides the behavior of template instantiation,
1145 /// copying with transformations that turn what looks like an overloaded
Mike Stump11289f42009-09-09 15:08:12 +00001146 /// operator call into a use of a builtin operator, performing
Douglas Gregora16548e2009-08-11 05:31:07 +00001147 /// argument-dependent lookup, etc. Subclasses may override this routine to
1148 /// provide different behavior.
1149 OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1150 SourceLocation OpLoc,
1151 ExprArg Callee,
1152 ExprArg First,
1153 ExprArg Second);
Mike Stump11289f42009-09-09 15:08:12 +00001154
1155 /// \brief Build a new C++ "named" cast expression, such as static_cast or
Douglas Gregora16548e2009-08-11 05:31:07 +00001156 /// reinterpret_cast.
1157 ///
1158 /// By default, this routine dispatches to one of the more-specific routines
Mike Stump11289f42009-09-09 15:08:12 +00001159 /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
Douglas Gregora16548e2009-08-11 05:31:07 +00001160 /// Subclasses may override this routine to provide different behavior.
1161 OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1162 Stmt::StmtClass Class,
1163 SourceLocation LAngleLoc,
1164 QualType T,
1165 SourceLocation RAngleLoc,
1166 SourceLocation LParenLoc,
1167 ExprArg SubExpr,
1168 SourceLocation RParenLoc) {
1169 switch (Class) {
1170 case Stmt::CXXStaticCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001171 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
1172 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001173 move(SubExpr), RParenLoc);
1174
1175 case Stmt::CXXDynamicCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001176 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
1177 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001178 move(SubExpr), RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001179
Douglas Gregora16548e2009-08-11 05:31:07 +00001180 case Stmt::CXXReinterpretCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001181 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
1182 RAngleLoc, LParenLoc,
1183 move(SubExpr),
Douglas Gregora16548e2009-08-11 05:31:07 +00001184 RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001185
Douglas Gregora16548e2009-08-11 05:31:07 +00001186 case Stmt::CXXConstCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001187 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
1188 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001189 move(SubExpr), RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001190
Douglas Gregora16548e2009-08-11 05:31:07 +00001191 default:
1192 assert(false && "Invalid C++ named cast");
1193 break;
1194 }
Mike Stump11289f42009-09-09 15:08:12 +00001195
Douglas Gregora16548e2009-08-11 05:31:07 +00001196 return getSema().ExprError();
1197 }
Mike Stump11289f42009-09-09 15:08:12 +00001198
Douglas Gregora16548e2009-08-11 05:31:07 +00001199 /// \brief Build a new C++ static_cast expression.
1200 ///
1201 /// By default, performs semantic analysis to build the new expression.
1202 /// Subclasses may override this routine to provide different behavior.
1203 OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1204 SourceLocation LAngleLoc,
1205 QualType T,
1206 SourceLocation RAngleLoc,
1207 SourceLocation LParenLoc,
1208 ExprArg SubExpr,
1209 SourceLocation RParenLoc) {
1210 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
Mike Stump11289f42009-09-09 15:08:12 +00001211 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001212 LParenLoc, move(SubExpr), RParenLoc);
1213 }
1214
1215 /// \brief Build a new C++ dynamic_cast expression.
1216 ///
1217 /// By default, performs semantic analysis to build the new expression.
1218 /// Subclasses may override this routine to provide different behavior.
1219 OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1220 SourceLocation LAngleLoc,
1221 QualType T,
1222 SourceLocation RAngleLoc,
1223 SourceLocation LParenLoc,
1224 ExprArg SubExpr,
1225 SourceLocation RParenLoc) {
1226 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
Mike Stump11289f42009-09-09 15:08:12 +00001227 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001228 LParenLoc, move(SubExpr), RParenLoc);
1229 }
1230
1231 /// \brief Build a new C++ reinterpret_cast expression.
1232 ///
1233 /// By default, performs semantic analysis to build the new expression.
1234 /// Subclasses may override this routine to provide different behavior.
1235 OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1236 SourceLocation LAngleLoc,
1237 QualType T,
1238 SourceLocation RAngleLoc,
1239 SourceLocation LParenLoc,
1240 ExprArg SubExpr,
1241 SourceLocation RParenLoc) {
1242 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1243 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1244 LParenLoc, move(SubExpr), RParenLoc);
1245 }
1246
1247 /// \brief Build a new C++ const_cast expression.
1248 ///
1249 /// By default, performs semantic analysis to build the new expression.
1250 /// Subclasses may override this routine to provide different behavior.
1251 OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1252 SourceLocation LAngleLoc,
1253 QualType T,
1254 SourceLocation RAngleLoc,
1255 SourceLocation LParenLoc,
1256 ExprArg SubExpr,
1257 SourceLocation RParenLoc) {
1258 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
Mike Stump11289f42009-09-09 15:08:12 +00001259 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001260 LParenLoc, move(SubExpr), RParenLoc);
1261 }
Mike Stump11289f42009-09-09 15:08:12 +00001262
Douglas Gregora16548e2009-08-11 05:31:07 +00001263 /// \brief Build a new C++ functional-style cast expression.
1264 ///
1265 /// By default, performs semantic analysis to build the new expression.
1266 /// Subclasses may override this routine to provide different behavior.
1267 OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
1268 QualType T,
1269 SourceLocation LParenLoc,
1270 ExprArg SubExpr,
1271 SourceLocation RParenLoc) {
Chris Lattnerdca19592009-08-24 05:19:01 +00001272 void *Sub = SubExpr.takeAs<Expr>();
Douglas Gregora16548e2009-08-11 05:31:07 +00001273 return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1274 T.getAsOpaquePtr(),
1275 LParenLoc,
Chris Lattnerdca19592009-08-24 05:19:01 +00001276 Sema::MultiExprArg(getSema(), &Sub, 1),
Mike Stump11289f42009-09-09 15:08:12 +00001277 /*CommaLocs=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001278 RParenLoc);
1279 }
Mike Stump11289f42009-09-09 15:08:12 +00001280
Douglas Gregora16548e2009-08-11 05:31:07 +00001281 /// \brief Build a new C++ typeid(type) expression.
1282 ///
1283 /// By default, performs semantic analysis to build the new expression.
1284 /// Subclasses may override this routine to provide different behavior.
1285 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1286 SourceLocation LParenLoc,
1287 QualType T,
1288 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001289 return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
Douglas Gregora16548e2009-08-11 05:31:07 +00001290 T.getAsOpaquePtr(), RParenLoc);
1291 }
Mike Stump11289f42009-09-09 15:08:12 +00001292
Douglas Gregora16548e2009-08-11 05:31:07 +00001293 /// \brief Build a new C++ typeid(expr) expression.
1294 ///
1295 /// By default, performs semantic analysis to build the new expression.
1296 /// Subclasses may override this routine to provide different behavior.
1297 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1298 SourceLocation LParenLoc,
1299 ExprArg Operand,
1300 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001301 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00001302 = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1303 RParenLoc);
1304 if (Result.isInvalid())
1305 return getSema().ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001306
Douglas Gregora16548e2009-08-11 05:31:07 +00001307 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1308 return move(Result);
Mike Stump11289f42009-09-09 15:08:12 +00001309 }
1310
Douglas Gregora16548e2009-08-11 05:31:07 +00001311 /// \brief Build a new C++ "this" expression.
1312 ///
1313 /// By default, builds a new "this" expression without performing any
Mike Stump11289f42009-09-09 15:08:12 +00001314 /// semantic analysis. Subclasses may override this routine to provide
Douglas Gregora16548e2009-08-11 05:31:07 +00001315 /// different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001316 OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001317 QualType ThisType) {
1318 return getSema().Owned(
1319 new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1320 }
1321
1322 /// \brief Build a new C++ throw expression.
1323 ///
1324 /// By default, performs semantic analysis to build the new expression.
1325 /// Subclasses may override this routine to provide different behavior.
1326 OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1327 return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1328 }
1329
1330 /// \brief Build a new C++ default-argument expression.
1331 ///
1332 /// By default, builds a new default-argument expression, which does not
1333 /// require any semantic analysis. Subclasses may override this routine to
1334 /// provide different behavior.
1335 OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
Anders Carlssone8271232009-08-14 18:30:22 +00001336 return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
Douglas Gregora16548e2009-08-11 05:31:07 +00001337 }
1338
1339 /// \brief Build a new C++ zero-initialization expression.
1340 ///
1341 /// By default, performs semantic analysis to build the new expression.
1342 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001343 OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001344 SourceLocation LParenLoc,
1345 QualType T,
1346 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001347 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1348 T.getAsOpaquePtr(), LParenLoc,
1349 MultiExprArg(getSema(), 0, 0),
Douglas Gregora16548e2009-08-11 05:31:07 +00001350 0, RParenLoc);
1351 }
Mike Stump11289f42009-09-09 15:08:12 +00001352
Douglas Gregora16548e2009-08-11 05:31:07 +00001353 /// \brief Build a new C++ conditional declaration expression.
1354 ///
1355 /// By default, performs semantic analysis to build the new expression.
1356 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001357 OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001358 SourceLocation EqLoc,
1359 VarDecl *Var) {
1360 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1361 EqLoc,
1362 Var));
1363 }
Mike Stump11289f42009-09-09 15:08:12 +00001364
Douglas Gregora16548e2009-08-11 05:31:07 +00001365 /// \brief Build a new C++ "new" expression.
1366 ///
1367 /// By default, performs semantic analysis to build the new expression.
1368 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001369 OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001370 bool UseGlobal,
1371 SourceLocation PlacementLParen,
1372 MultiExprArg PlacementArgs,
1373 SourceLocation PlacementRParen,
Mike Stump11289f42009-09-09 15:08:12 +00001374 bool ParenTypeId,
Douglas Gregora16548e2009-08-11 05:31:07 +00001375 QualType AllocType,
1376 SourceLocation TypeLoc,
1377 SourceRange TypeRange,
1378 ExprArg ArraySize,
1379 SourceLocation ConstructorLParen,
1380 MultiExprArg ConstructorArgs,
1381 SourceLocation ConstructorRParen) {
Mike Stump11289f42009-09-09 15:08:12 +00001382 return getSema().BuildCXXNew(StartLoc, UseGlobal,
Douglas Gregora16548e2009-08-11 05:31:07 +00001383 PlacementLParen,
1384 move(PlacementArgs),
1385 PlacementRParen,
1386 ParenTypeId,
1387 AllocType,
1388 TypeLoc,
1389 TypeRange,
1390 move(ArraySize),
1391 ConstructorLParen,
1392 move(ConstructorArgs),
1393 ConstructorRParen);
1394 }
Mike Stump11289f42009-09-09 15:08:12 +00001395
Douglas Gregora16548e2009-08-11 05:31:07 +00001396 /// \brief Build a new C++ "delete" expression.
1397 ///
1398 /// By default, performs semantic analysis to build the new expression.
1399 /// Subclasses may override this routine to provide different behavior.
1400 OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1401 bool IsGlobalDelete,
1402 bool IsArrayForm,
1403 ExprArg Operand) {
1404 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1405 move(Operand));
1406 }
Mike Stump11289f42009-09-09 15:08:12 +00001407
Douglas Gregora16548e2009-08-11 05:31:07 +00001408 /// \brief Build a new unary type trait expression.
1409 ///
1410 /// By default, performs semantic analysis to build the new expression.
1411 /// Subclasses may override this routine to provide different behavior.
1412 OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1413 SourceLocation StartLoc,
1414 SourceLocation LParenLoc,
1415 QualType T,
1416 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001417 return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001418 T.getAsOpaquePtr(), RParenLoc);
1419 }
1420
Mike Stump11289f42009-09-09 15:08:12 +00001421 /// \brief Build a new (previously unresolved) declaration reference
Douglas Gregora16548e2009-08-11 05:31:07 +00001422 /// expression.
1423 ///
1424 /// By default, performs semantic analysis to build the new expression.
1425 /// Subclasses may override this routine to provide different behavior.
1426 OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1427 SourceRange QualifierRange,
1428 DeclarationName Name,
1429 SourceLocation Location,
1430 bool IsAddressOfOperand) {
1431 CXXScopeSpec SS;
1432 SS.setRange(QualifierRange);
1433 SS.setScopeRep(NNS);
Mike Stump11289f42009-09-09 15:08:12 +00001434 return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001435 Location,
1436 Name,
1437 /*Trailing lparen=*/false,
1438 &SS,
1439 IsAddressOfOperand);
1440 }
1441
1442 /// \brief Build a new template-id expression.
1443 ///
1444 /// By default, performs semantic analysis to build the new expression.
1445 /// Subclasses may override this routine to provide different behavior.
Douglas Gregord019ff62009-10-22 17:20:55 +00001446 OwningExprResult RebuildTemplateIdExpr(NestedNameSpecifier *Qualifier,
1447 SourceRange QualifierRange,
1448 TemplateName Template,
Douglas Gregora16548e2009-08-11 05:31:07 +00001449 SourceLocation TemplateLoc,
1450 SourceLocation LAngleLoc,
John McCall0ad16662009-10-29 08:12:44 +00001451 TemplateArgumentLoc *TemplateArgs,
Douglas Gregora16548e2009-08-11 05:31:07 +00001452 unsigned NumTemplateArgs,
1453 SourceLocation RAngleLoc) {
Douglas Gregord019ff62009-10-22 17:20:55 +00001454 return getSema().BuildTemplateIdExpr(Qualifier, QualifierRange,
1455 Template, TemplateLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001456 LAngleLoc,
1457 TemplateArgs, NumTemplateArgs,
1458 RAngleLoc);
1459 }
1460
1461 /// \brief Build a new object-construction expression.
1462 ///
1463 /// By default, performs semantic analysis to build the new expression.
1464 /// Subclasses may override this routine to provide different behavior.
1465 OwningExprResult RebuildCXXConstructExpr(QualType T,
1466 CXXConstructorDecl *Constructor,
1467 bool IsElidable,
1468 MultiExprArg Args) {
Anders Carlsson1b4ebfa2009-09-05 07:40:38 +00001469 return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/
1470 SourceLocation(),
1471 T, Constructor, IsElidable,
Anders Carlsson5995a3e2009-09-07 22:23:31 +00001472 move(Args));
Douglas Gregora16548e2009-08-11 05:31:07 +00001473 }
1474
1475 /// \brief Build a new object-construction expression.
1476 ///
1477 /// By default, performs semantic analysis to build the new expression.
1478 /// Subclasses may override this routine to provide different behavior.
1479 OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1480 QualType T,
1481 SourceLocation LParenLoc,
1482 MultiExprArg Args,
1483 SourceLocation *Commas,
1484 SourceLocation RParenLoc) {
1485 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1486 T.getAsOpaquePtr(),
1487 LParenLoc,
1488 move(Args),
1489 Commas,
1490 RParenLoc);
1491 }
1492
1493 /// \brief Build a new object-construction expression.
1494 ///
1495 /// By default, performs semantic analysis to build the new expression.
1496 /// Subclasses may override this routine to provide different behavior.
1497 OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1498 QualType T,
1499 SourceLocation LParenLoc,
1500 MultiExprArg Args,
1501 SourceLocation *Commas,
1502 SourceLocation RParenLoc) {
1503 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1504 /*FIXME*/LParenLoc),
1505 T.getAsOpaquePtr(),
1506 LParenLoc,
1507 move(Args),
1508 Commas,
1509 RParenLoc);
1510 }
Mike Stump11289f42009-09-09 15:08:12 +00001511
Douglas Gregora16548e2009-08-11 05:31:07 +00001512 /// \brief Build a new member reference expression.
1513 ///
1514 /// By default, performs semantic analysis to build the new expression.
1515 /// Subclasses may override this routine to provide different behavior.
Douglas Gregor2168a9f2009-08-11 15:56:57 +00001516 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
Douglas Gregora16548e2009-08-11 05:31:07 +00001517 bool IsArrow,
1518 SourceLocation OperatorLoc,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001519 NestedNameSpecifier *Qualifier,
1520 SourceRange QualifierRange,
Douglas Gregora16548e2009-08-11 05:31:07 +00001521 DeclarationName Name,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001522 SourceLocation MemberLoc,
1523 NamedDecl *FirstQualifierInScope) {
Douglas Gregor2168a9f2009-08-11 15:56:57 +00001524 OwningExprResult Base = move(BaseE);
Douglas Gregora16548e2009-08-11 05:31:07 +00001525 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001526
Douglas Gregora16548e2009-08-11 05:31:07 +00001527 CXXScopeSpec SS;
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001528 SS.setRange(QualifierRange);
1529 SS.setScopeRep(Qualifier);
Mike Stump11289f42009-09-09 15:08:12 +00001530
Douglas Gregor308047d2009-09-09 00:23:06 +00001531 return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001532 move(Base), OperatorLoc, OpKind,
Douglas Gregorf14b46f2009-08-31 20:00:26 +00001533 MemberLoc,
1534 Name,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001535 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001536 &SS,
1537 FirstQualifierInScope);
Douglas Gregora16548e2009-08-11 05:31:07 +00001538 }
1539
Douglas Gregor308047d2009-09-09 00:23:06 +00001540 /// \brief Build a new member reference expression with explicit template
1541 /// arguments.
1542 ///
1543 /// By default, performs semantic analysis to build the new expression.
1544 /// Subclasses may override this routine to provide different behavior.
1545 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
1546 bool IsArrow,
1547 SourceLocation OperatorLoc,
1548 NestedNameSpecifier *Qualifier,
1549 SourceRange QualifierRange,
1550 TemplateName Template,
1551 SourceLocation TemplateNameLoc,
1552 NamedDecl *FirstQualifierInScope,
1553 SourceLocation LAngleLoc,
John McCall0ad16662009-10-29 08:12:44 +00001554 const TemplateArgumentLoc *TemplateArgs,
Douglas Gregor308047d2009-09-09 00:23:06 +00001555 unsigned NumTemplateArgs,
1556 SourceLocation RAngleLoc) {
1557 OwningExprResult Base = move(BaseE);
1558 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
Mike Stump11289f42009-09-09 15:08:12 +00001559
Douglas Gregor308047d2009-09-09 00:23:06 +00001560 CXXScopeSpec SS;
1561 SS.setRange(QualifierRange);
1562 SS.setScopeRep(Qualifier);
Mike Stump11289f42009-09-09 15:08:12 +00001563
Douglas Gregor308047d2009-09-09 00:23:06 +00001564 // FIXME: We're going to end up looking up the template based on its name,
1565 // twice! Also, duplicates part of Sema::ActOnMemberTemplateIdReferenceExpr.
1566 DeclarationName Name;
1567 if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl())
1568 Name = ActualTemplate->getDeclName();
Mike Stump11289f42009-09-09 15:08:12 +00001569 else if (OverloadedFunctionDecl *Ovl
Douglas Gregor308047d2009-09-09 00:23:06 +00001570 = Template.getAsOverloadedFunctionDecl())
1571 Name = Ovl->getDeclName();
1572 else
1573 Name = Template.getAsDependentTemplateName()->getName();
Mike Stump11289f42009-09-09 15:08:12 +00001574
1575 return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
Douglas Gregor308047d2009-09-09 00:23:06 +00001576 OperatorLoc, OpKind,
1577 TemplateNameLoc, Name, true,
1578 LAngleLoc, TemplateArgs,
1579 NumTemplateArgs, RAngleLoc,
1580 Sema::DeclPtrTy(), &SS);
1581 }
Mike Stump11289f42009-09-09 15:08:12 +00001582
Douglas Gregora16548e2009-08-11 05:31:07 +00001583 /// \brief Build a new Objective-C @encode expression.
1584 ///
1585 /// By default, performs semantic analysis to build the new expression.
1586 /// Subclasses may override this routine to provide different behavior.
1587 OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1588 QualType T,
1589 SourceLocation RParenLoc) {
1590 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1591 RParenLoc));
Mike Stump11289f42009-09-09 15:08:12 +00001592 }
Douglas Gregora16548e2009-08-11 05:31:07 +00001593
1594 /// \brief Build a new Objective-C protocol expression.
1595 ///
1596 /// By default, performs semantic analysis to build the new expression.
1597 /// Subclasses may override this routine to provide different behavior.
1598 OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1599 SourceLocation AtLoc,
1600 SourceLocation ProtoLoc,
1601 SourceLocation LParenLoc,
1602 SourceLocation RParenLoc) {
1603 return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1604 Protocol->getIdentifier(),
1605 AtLoc,
1606 ProtoLoc,
1607 LParenLoc,
Mike Stump11289f42009-09-09 15:08:12 +00001608 RParenLoc));
Douglas Gregora16548e2009-08-11 05:31:07 +00001609 }
Mike Stump11289f42009-09-09 15:08:12 +00001610
Douglas Gregora16548e2009-08-11 05:31:07 +00001611 /// \brief Build a new shuffle vector expression.
1612 ///
1613 /// By default, performs semantic analysis to build the new expression.
1614 /// Subclasses may override this routine to provide different behavior.
1615 OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1616 MultiExprArg SubExprs,
1617 SourceLocation RParenLoc) {
1618 // Find the declaration for __builtin_shufflevector
Mike Stump11289f42009-09-09 15:08:12 +00001619 const IdentifierInfo &Name
Douglas Gregora16548e2009-08-11 05:31:07 +00001620 = SemaRef.Context.Idents.get("__builtin_shufflevector");
1621 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1622 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1623 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
Mike Stump11289f42009-09-09 15:08:12 +00001624
Douglas Gregora16548e2009-08-11 05:31:07 +00001625 // Build a reference to the __builtin_shufflevector builtin
1626 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
Mike Stump11289f42009-09-09 15:08:12 +00001627 Expr *Callee
Douglas Gregora16548e2009-08-11 05:31:07 +00001628 = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1629 BuiltinLoc, false, false);
1630 SemaRef.UsualUnaryConversions(Callee);
Mike Stump11289f42009-09-09 15:08:12 +00001631
1632 // Build the CallExpr
Douglas Gregora16548e2009-08-11 05:31:07 +00001633 unsigned NumSubExprs = SubExprs.size();
1634 Expr **Subs = (Expr **)SubExprs.release();
1635 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1636 Subs, NumSubExprs,
1637 Builtin->getResultType(),
1638 RParenLoc);
1639 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
Mike Stump11289f42009-09-09 15:08:12 +00001640
Douglas Gregora16548e2009-08-11 05:31:07 +00001641 // Type-check the __builtin_shufflevector expression.
1642 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1643 if (Result.isInvalid())
1644 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001645
Douglas Gregora16548e2009-08-11 05:31:07 +00001646 OwnedCall.release();
Mike Stump11289f42009-09-09 15:08:12 +00001647 return move(Result);
Douglas Gregora16548e2009-08-11 05:31:07 +00001648 }
Douglas Gregord6ff3322009-08-04 16:50:30 +00001649};
Douglas Gregora16548e2009-08-11 05:31:07 +00001650
Douglas Gregorebe10102009-08-20 07:17:43 +00001651template<typename Derived>
1652Sema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
1653 if (!S)
1654 return SemaRef.Owned(S);
Mike Stump11289f42009-09-09 15:08:12 +00001655
Douglas Gregorebe10102009-08-20 07:17:43 +00001656 switch (S->getStmtClass()) {
1657 case Stmt::NoStmtClass: break;
Mike Stump11289f42009-09-09 15:08:12 +00001658
Douglas Gregorebe10102009-08-20 07:17:43 +00001659 // Transform individual statement nodes
1660#define STMT(Node, Parent) \
1661 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
1662#define EXPR(Node, Parent)
1663#include "clang/AST/StmtNodes.def"
Mike Stump11289f42009-09-09 15:08:12 +00001664
Douglas Gregorebe10102009-08-20 07:17:43 +00001665 // Transform expressions by calling TransformExpr.
1666#define STMT(Node, Parent)
1667#define EXPR(Node, Parent) case Stmt::Node##Class:
1668#include "clang/AST/StmtNodes.def"
1669 {
1670 Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
1671 if (E.isInvalid())
1672 return getSema().StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00001673
Douglas Gregorebe10102009-08-20 07:17:43 +00001674 return getSema().Owned(E.takeAs<Stmt>());
1675 }
Mike Stump11289f42009-09-09 15:08:12 +00001676 }
1677
Douglas Gregorebe10102009-08-20 07:17:43 +00001678 return SemaRef.Owned(S->Retain());
1679}
Mike Stump11289f42009-09-09 15:08:12 +00001680
1681
Douglas Gregore922c772009-08-04 22:27:00 +00001682template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00001683Sema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1684 bool isAddressOfOperand) {
1685 if (!E)
1686 return SemaRef.Owned(E);
1687
1688 switch (E->getStmtClass()) {
1689 case Stmt::NoStmtClass: break;
1690#define STMT(Node, Parent) case Stmt::Node##Class: break;
1691#define EXPR(Node, Parent) \
1692 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1693#include "clang/AST/StmtNodes.def"
Mike Stump11289f42009-09-09 15:08:12 +00001694 }
1695
Douglas Gregora16548e2009-08-11 05:31:07 +00001696 return SemaRef.Owned(E->Retain());
Douglas Gregor766b0bb2009-08-06 22:17:10 +00001697}
1698
1699template<typename Derived>
Douglas Gregor1135c352009-08-06 05:28:30 +00001700NestedNameSpecifier *
1701TreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001702 SourceRange Range,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001703 QualType ObjectType,
1704 NamedDecl *FirstQualifierInScope) {
Douglas Gregor96ee7892009-08-31 21:41:48 +00001705 if (!NNS)
1706 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001707
Douglas Gregorebe10102009-08-20 07:17:43 +00001708 // Transform the prefix of this nested name specifier.
Douglas Gregor1135c352009-08-06 05:28:30 +00001709 NestedNameSpecifier *Prefix = NNS->getPrefix();
1710 if (Prefix) {
Mike Stump11289f42009-09-09 15:08:12 +00001711 Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001712 ObjectType,
1713 FirstQualifierInScope);
Douglas Gregor1135c352009-08-06 05:28:30 +00001714 if (!Prefix)
1715 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001716
1717 // Clear out the object type and the first qualifier in scope; they only
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001718 // apply to the first element in the nested-name-specifier.
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001719 ObjectType = QualType();
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001720 FirstQualifierInScope = 0;
Douglas Gregor1135c352009-08-06 05:28:30 +00001721 }
Mike Stump11289f42009-09-09 15:08:12 +00001722
Douglas Gregor1135c352009-08-06 05:28:30 +00001723 switch (NNS->getKind()) {
1724 case NestedNameSpecifier::Identifier:
Mike Stump11289f42009-09-09 15:08:12 +00001725 assert((Prefix || !ObjectType.isNull()) &&
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001726 "Identifier nested-name-specifier with no prefix or object type");
1727 if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1728 ObjectType.isNull())
Douglas Gregor1135c352009-08-06 05:28:30 +00001729 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001730
1731 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001732 *NNS->getAsIdentifier(),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001733 ObjectType,
1734 FirstQualifierInScope);
Mike Stump11289f42009-09-09 15:08:12 +00001735
Douglas Gregor1135c352009-08-06 05:28:30 +00001736 case NestedNameSpecifier::Namespace: {
Mike Stump11289f42009-09-09 15:08:12 +00001737 NamespaceDecl *NS
Douglas Gregor1135c352009-08-06 05:28:30 +00001738 = cast_or_null<NamespaceDecl>(
1739 getDerived().TransformDecl(NNS->getAsNamespace()));
Mike Stump11289f42009-09-09 15:08:12 +00001740 if (!getDerived().AlwaysRebuild() &&
Douglas Gregor1135c352009-08-06 05:28:30 +00001741 Prefix == NNS->getPrefix() &&
1742 NS == NNS->getAsNamespace())
1743 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001744
Douglas Gregor1135c352009-08-06 05:28:30 +00001745 return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1746 }
Mike Stump11289f42009-09-09 15:08:12 +00001747
Douglas Gregor1135c352009-08-06 05:28:30 +00001748 case NestedNameSpecifier::Global:
1749 // There is no meaningful transformation that one could perform on the
1750 // global scope.
1751 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001752
Douglas Gregor1135c352009-08-06 05:28:30 +00001753 case NestedNameSpecifier::TypeSpecWithTemplate:
1754 case NestedNameSpecifier::TypeSpec: {
1755 QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
Douglas Gregor71dc5092009-08-06 06:41:21 +00001756 if (T.isNull())
1757 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001758
Douglas Gregor1135c352009-08-06 05:28:30 +00001759 if (!getDerived().AlwaysRebuild() &&
1760 Prefix == NNS->getPrefix() &&
1761 T == QualType(NNS->getAsType(), 0))
1762 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001763
1764 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1765 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
Douglas Gregor1135c352009-08-06 05:28:30 +00001766 T);
1767 }
1768 }
Mike Stump11289f42009-09-09 15:08:12 +00001769
Douglas Gregor1135c352009-08-06 05:28:30 +00001770 // Required to silence a GCC warning
Mike Stump11289f42009-09-09 15:08:12 +00001771 return 0;
Douglas Gregor1135c352009-08-06 05:28:30 +00001772}
1773
1774template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001775DeclarationName
Douglas Gregorf816bd72009-09-03 22:13:48 +00001776TreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
Douglas Gregorc59e5612009-10-19 22:04:39 +00001777 SourceLocation Loc,
1778 QualType ObjectType) {
Douglas Gregorf816bd72009-09-03 22:13:48 +00001779 if (!Name)
1780 return Name;
1781
1782 switch (Name.getNameKind()) {
1783 case DeclarationName::Identifier:
1784 case DeclarationName::ObjCZeroArgSelector:
1785 case DeclarationName::ObjCOneArgSelector:
1786 case DeclarationName::ObjCMultiArgSelector:
1787 case DeclarationName::CXXOperatorName:
1788 case DeclarationName::CXXUsingDirective:
1789 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001790
Douglas Gregorf816bd72009-09-03 22:13:48 +00001791 case DeclarationName::CXXConstructorName:
1792 case DeclarationName::CXXDestructorName:
1793 case DeclarationName::CXXConversionFunctionName: {
1794 TemporaryBase Rebase(*this, Loc, Name);
Douglas Gregorc59e5612009-10-19 22:04:39 +00001795 QualType T;
1796 if (!ObjectType.isNull() &&
1797 isa<TemplateSpecializationType>(Name.getCXXNameType())) {
1798 TemplateSpecializationType *SpecType
1799 = cast<TemplateSpecializationType>(Name.getCXXNameType());
1800 T = TransformTemplateSpecializationType(SpecType, ObjectType);
1801 } else
1802 T = getDerived().TransformType(Name.getCXXNameType());
Douglas Gregorf816bd72009-09-03 22:13:48 +00001803 if (T.isNull())
1804 return DeclarationName();
Mike Stump11289f42009-09-09 15:08:12 +00001805
Douglas Gregorf816bd72009-09-03 22:13:48 +00001806 return SemaRef.Context.DeclarationNames.getCXXSpecialName(
Mike Stump11289f42009-09-09 15:08:12 +00001807 Name.getNameKind(),
Douglas Gregorf816bd72009-09-03 22:13:48 +00001808 SemaRef.Context.getCanonicalType(T));
Douglas Gregorf816bd72009-09-03 22:13:48 +00001809 }
Mike Stump11289f42009-09-09 15:08:12 +00001810 }
1811
Douglas Gregorf816bd72009-09-03 22:13:48 +00001812 return DeclarationName();
1813}
1814
1815template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001816TemplateName
Douglas Gregor308047d2009-09-09 00:23:06 +00001817TreeTransform<Derived>::TransformTemplateName(TemplateName Name,
1818 QualType ObjectType) {
Douglas Gregor71dc5092009-08-06 06:41:21 +00001819 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
Mike Stump11289f42009-09-09 15:08:12 +00001820 NestedNameSpecifier *NNS
Douglas Gregor71dc5092009-08-06 06:41:21 +00001821 = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1822 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1823 if (!NNS)
1824 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001825
Douglas Gregor71dc5092009-08-06 06:41:21 +00001826 if (TemplateDecl *Template = QTN->getTemplateDecl()) {
Mike Stump11289f42009-09-09 15:08:12 +00001827 TemplateDecl *TransTemplate
Douglas Gregor71dc5092009-08-06 06:41:21 +00001828 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1829 if (!TransTemplate)
1830 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001831
Douglas Gregor71dc5092009-08-06 06:41:21 +00001832 if (!getDerived().AlwaysRebuild() &&
1833 NNS == QTN->getQualifier() &&
1834 TransTemplate == Template)
1835 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001836
Douglas Gregor71dc5092009-08-06 06:41:21 +00001837 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1838 TransTemplate);
1839 }
Mike Stump11289f42009-09-09 15:08:12 +00001840
Douglas Gregor71dc5092009-08-06 06:41:21 +00001841 OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1842 assert(Ovl && "Not a template name or an overload set?");
Mike Stump11289f42009-09-09 15:08:12 +00001843 OverloadedFunctionDecl *TransOvl
Douglas Gregor71dc5092009-08-06 06:41:21 +00001844 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1845 if (!TransOvl)
1846 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001847
Douglas Gregor71dc5092009-08-06 06:41:21 +00001848 if (!getDerived().AlwaysRebuild() &&
1849 NNS == QTN->getQualifier() &&
1850 TransOvl == Ovl)
1851 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001852
Douglas Gregor71dc5092009-08-06 06:41:21 +00001853 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1854 TransOvl);
1855 }
Mike Stump11289f42009-09-09 15:08:12 +00001856
Douglas Gregor71dc5092009-08-06 06:41:21 +00001857 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
Mike Stump11289f42009-09-09 15:08:12 +00001858 NestedNameSpecifier *NNS
Douglas Gregor71dc5092009-08-06 06:41:21 +00001859 = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1860 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
Douglas Gregor308047d2009-09-09 00:23:06 +00001861 if (!NNS && DTN->getQualifier())
Douglas Gregor71dc5092009-08-06 06:41:21 +00001862 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001863
Douglas Gregor71dc5092009-08-06 06:41:21 +00001864 if (!getDerived().AlwaysRebuild() &&
Douglas Gregorc59e5612009-10-19 22:04:39 +00001865 NNS == DTN->getQualifier() &&
1866 ObjectType.isNull())
Douglas Gregor71dc5092009-08-06 06:41:21 +00001867 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001868
Douglas Gregor308047d2009-09-09 00:23:06 +00001869 return getDerived().RebuildTemplateName(NNS, *DTN->getName(), ObjectType);
Douglas Gregor71dc5092009-08-06 06:41:21 +00001870 }
Mike Stump11289f42009-09-09 15:08:12 +00001871
Douglas Gregor71dc5092009-08-06 06:41:21 +00001872 if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
Mike Stump11289f42009-09-09 15:08:12 +00001873 TemplateDecl *TransTemplate
Douglas Gregor71dc5092009-08-06 06:41:21 +00001874 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1875 if (!TransTemplate)
1876 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001877
Douglas Gregor71dc5092009-08-06 06:41:21 +00001878 if (!getDerived().AlwaysRebuild() &&
1879 TransTemplate == Template)
1880 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001881
Douglas Gregor71dc5092009-08-06 06:41:21 +00001882 return TemplateName(TransTemplate);
1883 }
Mike Stump11289f42009-09-09 15:08:12 +00001884
Douglas Gregor71dc5092009-08-06 06:41:21 +00001885 OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1886 assert(Ovl && "Not a template name or an overload set?");
Mike Stump11289f42009-09-09 15:08:12 +00001887 OverloadedFunctionDecl *TransOvl
Douglas Gregor71dc5092009-08-06 06:41:21 +00001888 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1889 if (!TransOvl)
1890 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001891
Douglas Gregor71dc5092009-08-06 06:41:21 +00001892 if (!getDerived().AlwaysRebuild() &&
1893 TransOvl == Ovl)
1894 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001895
Douglas Gregor71dc5092009-08-06 06:41:21 +00001896 return TemplateName(TransOvl);
1897}
1898
1899template<typename Derived>
John McCall0ad16662009-10-29 08:12:44 +00001900void TreeTransform<Derived>::InventTemplateArgumentLoc(
1901 const TemplateArgument &Arg,
1902 TemplateArgumentLoc &Output) {
1903 SourceLocation Loc = getDerived().getBaseLocation();
1904 switch (Arg.getKind()) {
1905 case TemplateArgument::Null:
1906 llvm::llvm_unreachable("null template argument in TreeTransform");
1907 break;
1908
1909 case TemplateArgument::Type:
1910 Output = TemplateArgumentLoc(Arg,
1911 SemaRef.Context.getTrivialDeclaratorInfo(Arg.getAsType(), Loc));
1912
1913 break;
1914
1915 case TemplateArgument::Expression:
1916 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
1917 break;
1918
1919 case TemplateArgument::Declaration:
1920 case TemplateArgument::Integral:
1921 case TemplateArgument::Pack:
John McCall0d07eb32009-10-29 18:45:58 +00001922 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
John McCall0ad16662009-10-29 08:12:44 +00001923 break;
1924 }
1925}
1926
1927template<typename Derived>
1928bool TreeTransform<Derived>::TransformTemplateArgument(
1929 const TemplateArgumentLoc &Input,
1930 TemplateArgumentLoc &Output) {
1931 const TemplateArgument &Arg = Input.getArgument();
Douglas Gregore922c772009-08-04 22:27:00 +00001932 switch (Arg.getKind()) {
1933 case TemplateArgument::Null:
1934 case TemplateArgument::Integral:
John McCall0ad16662009-10-29 08:12:44 +00001935 Output = Input;
1936 return false;
Mike Stump11289f42009-09-09 15:08:12 +00001937
Douglas Gregore922c772009-08-04 22:27:00 +00001938 case TemplateArgument::Type: {
John McCall0ad16662009-10-29 08:12:44 +00001939 DeclaratorInfo *DI = Input.getSourceDeclaratorInfo();
1940 if (DI == NULL)
1941 DI = InventDeclaratorInfo(Input.getArgument().getAsType());
1942
1943 DI = getDerived().TransformType(DI);
1944 if (!DI) return true;
1945
1946 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
1947 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00001948 }
Mike Stump11289f42009-09-09 15:08:12 +00001949
Douglas Gregore922c772009-08-04 22:27:00 +00001950 case TemplateArgument::Declaration: {
John McCall0ad16662009-10-29 08:12:44 +00001951 // FIXME: we should never have to transform one of these.
Douglas Gregoref6ab412009-10-27 06:26:26 +00001952 DeclarationName Name;
1953 if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
1954 Name = ND->getDeclName();
John McCall0ad16662009-10-29 08:12:44 +00001955 TemporaryBase Rebase(*this, SourceLocation(), Name);
Douglas Gregore922c772009-08-04 22:27:00 +00001956 Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
John McCall0ad16662009-10-29 08:12:44 +00001957 if (!D) return true;
1958
John McCall0d07eb32009-10-29 18:45:58 +00001959 Expr *SourceExpr = Input.getSourceDeclExpression();
1960 if (SourceExpr) {
1961 EnterExpressionEvaluationContext Unevaluated(getSema(),
1962 Action::Unevaluated);
1963 Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
1964 if (E.isInvalid())
1965 SourceExpr = NULL;
1966 else {
1967 SourceExpr = E.takeAs<Expr>();
1968 SourceExpr->Retain();
1969 }
1970 }
1971
1972 Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
John McCall0ad16662009-10-29 08:12:44 +00001973 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00001974 }
Mike Stump11289f42009-09-09 15:08:12 +00001975
Douglas Gregore922c772009-08-04 22:27:00 +00001976 case TemplateArgument::Expression: {
1977 // Template argument expressions are not potentially evaluated.
Mike Stump11289f42009-09-09 15:08:12 +00001978 EnterExpressionEvaluationContext Unevaluated(getSema(),
Douglas Gregore922c772009-08-04 22:27:00 +00001979 Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00001980
John McCall0ad16662009-10-29 08:12:44 +00001981 Expr *InputExpr = Input.getSourceExpression();
1982 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
1983
1984 Sema::OwningExprResult E
1985 = getDerived().TransformExpr(InputExpr);
1986 if (E.isInvalid()) return true;
1987
1988 Expr *ETaken = E.takeAs<Expr>();
John McCall0d07eb32009-10-29 18:45:58 +00001989 ETaken->Retain();
John McCall0ad16662009-10-29 08:12:44 +00001990 Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
1991 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00001992 }
Mike Stump11289f42009-09-09 15:08:12 +00001993
Douglas Gregore922c772009-08-04 22:27:00 +00001994 case TemplateArgument::Pack: {
1995 llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
1996 TransformedArgs.reserve(Arg.pack_size());
Mike Stump11289f42009-09-09 15:08:12 +00001997 for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
Douglas Gregore922c772009-08-04 22:27:00 +00001998 AEnd = Arg.pack_end();
1999 A != AEnd; ++A) {
Mike Stump11289f42009-09-09 15:08:12 +00002000
John McCall0ad16662009-10-29 08:12:44 +00002001 // FIXME: preserve source information here when we start
2002 // caring about parameter packs.
2003
John McCall0d07eb32009-10-29 18:45:58 +00002004 TemplateArgumentLoc InputArg;
2005 TemplateArgumentLoc OutputArg;
2006 getDerived().InventTemplateArgumentLoc(*A, InputArg);
2007 if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
John McCall0ad16662009-10-29 08:12:44 +00002008 return true;
2009
John McCall0d07eb32009-10-29 18:45:58 +00002010 TransformedArgs.push_back(OutputArg.getArgument());
Douglas Gregore922c772009-08-04 22:27:00 +00002011 }
2012 TemplateArgument Result;
Mike Stump11289f42009-09-09 15:08:12 +00002013 Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
Douglas Gregore922c772009-08-04 22:27:00 +00002014 true);
John McCall0d07eb32009-10-29 18:45:58 +00002015 Output = TemplateArgumentLoc(Result, Input.getLocInfo());
John McCall0ad16662009-10-29 08:12:44 +00002016 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00002017 }
2018 }
Mike Stump11289f42009-09-09 15:08:12 +00002019
Douglas Gregore922c772009-08-04 22:27:00 +00002020 // Work around bogus GCC warning
John McCall0ad16662009-10-29 08:12:44 +00002021 return true;
Douglas Gregore922c772009-08-04 22:27:00 +00002022}
2023
Douglas Gregord6ff3322009-08-04 16:50:30 +00002024//===----------------------------------------------------------------------===//
2025// Type transformation
2026//===----------------------------------------------------------------------===//
2027
2028template<typename Derived>
2029QualType TreeTransform<Derived>::TransformType(QualType T) {
2030 if (getDerived().AlreadyTransformed(T))
2031 return T;
Mike Stump11289f42009-09-09 15:08:12 +00002032
John McCall550e0c22009-10-21 00:40:46 +00002033 // Temporary workaround. All of these transformations should
2034 // eventually turn into transformations on TypeLocs.
2035 DeclaratorInfo *DI = getSema().Context.CreateDeclaratorInfo(T);
John McCallde889892009-10-21 00:44:26 +00002036 DI->getTypeLoc().initialize(getDerived().getBaseLocation());
John McCall550e0c22009-10-21 00:40:46 +00002037
2038 DeclaratorInfo *NewDI = getDerived().TransformType(DI);
John McCall8ccfcb52009-09-24 19:53:00 +00002039
John McCall550e0c22009-10-21 00:40:46 +00002040 if (!NewDI)
2041 return QualType();
2042
2043 return NewDI->getType();
2044}
2045
2046template<typename Derived>
2047DeclaratorInfo *TreeTransform<Derived>::TransformType(DeclaratorInfo *DI) {
2048 if (getDerived().AlreadyTransformed(DI->getType()))
2049 return DI;
2050
2051 TypeLocBuilder TLB;
2052
2053 TypeLoc TL = DI->getTypeLoc();
2054 TLB.reserve(TL.getFullDataSize());
2055
2056 QualType Result = getDerived().TransformType(TLB, TL);
2057 if (Result.isNull())
2058 return 0;
2059
2060 return TLB.getDeclaratorInfo(SemaRef.Context, Result);
2061}
2062
2063template<typename Derived>
2064QualType
2065TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
2066 switch (T.getTypeLocClass()) {
2067#define ABSTRACT_TYPELOC(CLASS, PARENT)
2068#define TYPELOC(CLASS, PARENT) \
2069 case TypeLoc::CLASS: \
2070 return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
2071#include "clang/AST/TypeLocNodes.def"
Douglas Gregord6ff3322009-08-04 16:50:30 +00002072 }
Mike Stump11289f42009-09-09 15:08:12 +00002073
John McCall550e0c22009-10-21 00:40:46 +00002074 llvm::llvm_unreachable("unhandled type loc!");
2075 return QualType();
2076}
2077
2078/// FIXME: By default, this routine adds type qualifiers only to types
2079/// that can have qualifiers, and silently suppresses those qualifiers
2080/// that are not permitted (e.g., qualifiers on reference or function
2081/// types). This is the right thing for template instantiation, but
2082/// probably not for other clients.
2083template<typename Derived>
2084QualType
2085TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2086 QualifiedTypeLoc T) {
2087 Qualifiers Quals = T.getType().getQualifiers();
2088
2089 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
2090 if (Result.isNull())
2091 return QualType();
2092
2093 // Silently suppress qualifiers if the result type can't be qualified.
2094 // FIXME: this is the right thing for template instantiation, but
2095 // probably not for other clients.
2096 if (Result->isFunctionType() || Result->isReferenceType())
Douglas Gregord6ff3322009-08-04 16:50:30 +00002097 return Result;
Mike Stump11289f42009-09-09 15:08:12 +00002098
John McCall550e0c22009-10-21 00:40:46 +00002099 Result = SemaRef.Context.getQualifiedType(Result, Quals);
2100
2101 TLB.push<QualifiedTypeLoc>(Result);
2102
2103 // No location information to preserve.
2104
2105 return Result;
2106}
2107
2108template <class TyLoc> static inline
2109QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2110 TyLoc NewT = TLB.push<TyLoc>(T.getType());
2111 NewT.setNameLoc(T.getNameLoc());
2112 return T.getType();
2113}
2114
2115// Ugly metaprogramming macros because I couldn't be bothered to make
2116// the equivalent template version work.
2117#define TransformPointerLikeType(TypeClass) do { \
2118 QualType PointeeType \
2119 = getDerived().TransformType(TLB, TL.getPointeeLoc()); \
2120 if (PointeeType.isNull()) \
2121 return QualType(); \
2122 \
2123 QualType Result = TL.getType(); \
2124 if (getDerived().AlwaysRebuild() || \
2125 PointeeType != TL.getPointeeLoc().getType()) { \
2126 Result = getDerived().Rebuild##TypeClass(PointeeType); \
2127 if (Result.isNull()) \
2128 return QualType(); \
2129 } \
2130 \
2131 TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result); \
2132 NewT.setSigilLoc(TL.getSigilLoc()); \
2133 \
2134 return Result; \
2135} while(0)
2136
2137// Reference collapsing forces us to transform reference types
2138// differently from the other pointer-like types.
2139#define TransformReferenceType(TypeClass) do { \
2140 QualType PointeeType \
2141 = getDerived().TransformType(TLB, TL.getPointeeLoc()); \
2142 if (PointeeType.isNull()) \
2143 return QualType(); \
2144 \
2145 QualType Result = TL.getType(); \
2146 if (getDerived().AlwaysRebuild() || \
2147 PointeeType != TL.getPointeeLoc().getType()) { \
2148 Result = getDerived().Rebuild##TypeClass(PointeeType); \
2149 if (Result.isNull()) \
2150 return QualType(); \
2151 } \
2152 \
2153 /* Workaround: rebuild doesn't always change the type */ \
2154 /* FIXME: avoid losing this location information. */ \
2155 if (Result == PointeeType) \
2156 return Result; \
2157 ReferenceTypeLoc NewTL; \
2158 if (isa<LValueReferenceType>(Result)) \
2159 NewTL = TLB.push<LValueReferenceTypeLoc>(Result); \
2160 else \
2161 NewTL = TLB.push<RValueReferenceTypeLoc>(Result); \
2162 NewTL.setSigilLoc(TL.getSigilLoc()); \
2163 return Result; \
2164} while (0)
2165
2166template<typename Derived>
2167QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2168 BuiltinTypeLoc T) {
2169 return TransformTypeSpecType(TLB, T);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002170}
Mike Stump11289f42009-09-09 15:08:12 +00002171
Douglas Gregord6ff3322009-08-04 16:50:30 +00002172template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002173QualType
John McCall550e0c22009-10-21 00:40:46 +00002174TreeTransform<Derived>::TransformFixedWidthIntType(TypeLocBuilder &TLB,
2175 FixedWidthIntTypeLoc T) {
2176 return TransformTypeSpecType(TLB, T);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002177}
Argyrios Kyrtzidise9189262009-08-19 01:28:17 +00002178
Douglas Gregord6ff3322009-08-04 16:50:30 +00002179template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002180QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2181 ComplexTypeLoc T) {
2182 // FIXME: recurse?
2183 return TransformTypeSpecType(TLB, T);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002184}
Mike Stump11289f42009-09-09 15:08:12 +00002185
Douglas Gregord6ff3322009-08-04 16:50:30 +00002186template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002187QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2188 PointerTypeLoc TL) {
2189 TransformPointerLikeType(PointerType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002190}
Mike Stump11289f42009-09-09 15:08:12 +00002191
2192template<typename Derived>
2193QualType
John McCall550e0c22009-10-21 00:40:46 +00002194TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2195 BlockPointerTypeLoc TL) {
2196 TransformPointerLikeType(BlockPointerType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002197}
2198
Mike Stump11289f42009-09-09 15:08:12 +00002199template<typename Derived>
2200QualType
John McCall550e0c22009-10-21 00:40:46 +00002201TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2202 LValueReferenceTypeLoc TL) {
2203 TransformReferenceType(LValueReferenceType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002204}
2205
Mike Stump11289f42009-09-09 15:08:12 +00002206template<typename Derived>
2207QualType
John McCall550e0c22009-10-21 00:40:46 +00002208TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2209 RValueReferenceTypeLoc TL) {
2210 TransformReferenceType(RValueReferenceType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002211}
Mike Stump11289f42009-09-09 15:08:12 +00002212
Douglas Gregord6ff3322009-08-04 16:50:30 +00002213template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002214QualType
John McCall550e0c22009-10-21 00:40:46 +00002215TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2216 MemberPointerTypeLoc TL) {
2217 MemberPointerType *T = TL.getTypePtr();
2218
2219 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002220 if (PointeeType.isNull())
2221 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002222
John McCall550e0c22009-10-21 00:40:46 +00002223 // TODO: preserve source information for this.
2224 QualType ClassType
2225 = getDerived().TransformType(QualType(T->getClass(), 0));
Douglas Gregord6ff3322009-08-04 16:50:30 +00002226 if (ClassType.isNull())
2227 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002228
John McCall550e0c22009-10-21 00:40:46 +00002229 QualType Result = TL.getType();
2230 if (getDerived().AlwaysRebuild() ||
2231 PointeeType != T->getPointeeType() ||
2232 ClassType != QualType(T->getClass(), 0)) {
2233 Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType);
2234 if (Result.isNull())
2235 return QualType();
2236 }
Douglas Gregord6ff3322009-08-04 16:50:30 +00002237
John McCall550e0c22009-10-21 00:40:46 +00002238 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2239 NewTL.setSigilLoc(TL.getSigilLoc());
2240
2241 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002242}
2243
Mike Stump11289f42009-09-09 15:08:12 +00002244template<typename Derived>
2245QualType
John McCall550e0c22009-10-21 00:40:46 +00002246TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2247 ConstantArrayTypeLoc TL) {
2248 ConstantArrayType *T = TL.getTypePtr();
2249 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002250 if (ElementType.isNull())
2251 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002252
John McCall550e0c22009-10-21 00:40:46 +00002253 QualType Result = TL.getType();
2254 if (getDerived().AlwaysRebuild() ||
2255 ElementType != T->getElementType()) {
2256 Result = getDerived().RebuildConstantArrayType(ElementType,
2257 T->getSizeModifier(),
2258 T->getSize(),
2259 T->getIndexTypeCVRQualifiers());
2260 if (Result.isNull())
2261 return QualType();
2262 }
2263
2264 ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2265 NewTL.setLBracketLoc(TL.getLBracketLoc());
2266 NewTL.setRBracketLoc(TL.getRBracketLoc());
Mike Stump11289f42009-09-09 15:08:12 +00002267
John McCall550e0c22009-10-21 00:40:46 +00002268 Expr *Size = TL.getSizeExpr();
2269 if (Size) {
2270 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2271 Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2272 }
2273 NewTL.setSizeExpr(Size);
2274
2275 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002276}
Mike Stump11289f42009-09-09 15:08:12 +00002277
Douglas Gregord6ff3322009-08-04 16:50:30 +00002278template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002279QualType TreeTransform<Derived>::TransformIncompleteArrayType(
John McCall550e0c22009-10-21 00:40:46 +00002280 TypeLocBuilder &TLB,
2281 IncompleteArrayTypeLoc TL) {
2282 IncompleteArrayType *T = TL.getTypePtr();
2283 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002284 if (ElementType.isNull())
2285 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002286
John McCall550e0c22009-10-21 00:40:46 +00002287 QualType Result = TL.getType();
2288 if (getDerived().AlwaysRebuild() ||
2289 ElementType != T->getElementType()) {
2290 Result = getDerived().RebuildIncompleteArrayType(ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00002291 T->getSizeModifier(),
John McCall550e0c22009-10-21 00:40:46 +00002292 T->getIndexTypeCVRQualifiers());
2293 if (Result.isNull())
2294 return QualType();
2295 }
2296
2297 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2298 NewTL.setLBracketLoc(TL.getLBracketLoc());
2299 NewTL.setRBracketLoc(TL.getRBracketLoc());
2300 NewTL.setSizeExpr(0);
2301
2302 return Result;
2303}
2304
2305template<typename Derived>
2306QualType
2307TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2308 VariableArrayTypeLoc TL) {
2309 VariableArrayType *T = TL.getTypePtr();
2310 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2311 if (ElementType.isNull())
2312 return QualType();
2313
2314 // Array bounds are not potentially evaluated contexts
2315 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2316
2317 Sema::OwningExprResult SizeResult
2318 = getDerived().TransformExpr(T->getSizeExpr());
2319 if (SizeResult.isInvalid())
2320 return QualType();
2321
2322 Expr *Size = static_cast<Expr*>(SizeResult.get());
2323
2324 QualType Result = TL.getType();
2325 if (getDerived().AlwaysRebuild() ||
2326 ElementType != T->getElementType() ||
2327 Size != T->getSizeExpr()) {
2328 Result = getDerived().RebuildVariableArrayType(ElementType,
2329 T->getSizeModifier(),
2330 move(SizeResult),
2331 T->getIndexTypeCVRQualifiers(),
2332 T->getBracketsRange());
2333 if (Result.isNull())
2334 return QualType();
2335 }
2336 else SizeResult.take();
2337
2338 VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2339 NewTL.setLBracketLoc(TL.getLBracketLoc());
2340 NewTL.setRBracketLoc(TL.getRBracketLoc());
2341 NewTL.setSizeExpr(Size);
2342
2343 return Result;
2344}
2345
2346template<typename Derived>
2347QualType
2348TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2349 DependentSizedArrayTypeLoc TL) {
2350 DependentSizedArrayType *T = TL.getTypePtr();
2351 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2352 if (ElementType.isNull())
2353 return QualType();
2354
2355 // Array bounds are not potentially evaluated contexts
2356 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2357
2358 Sema::OwningExprResult SizeResult
2359 = getDerived().TransformExpr(T->getSizeExpr());
2360 if (SizeResult.isInvalid())
2361 return QualType();
2362
2363 Expr *Size = static_cast<Expr*>(SizeResult.get());
2364
2365 QualType Result = TL.getType();
2366 if (getDerived().AlwaysRebuild() ||
2367 ElementType != T->getElementType() ||
2368 Size != T->getSizeExpr()) {
2369 Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2370 T->getSizeModifier(),
2371 move(SizeResult),
2372 T->getIndexTypeCVRQualifiers(),
2373 T->getBracketsRange());
2374 if (Result.isNull())
2375 return QualType();
2376 }
2377 else SizeResult.take();
2378
2379 // We might have any sort of array type now, but fortunately they
2380 // all have the same location layout.
2381 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2382 NewTL.setLBracketLoc(TL.getLBracketLoc());
2383 NewTL.setRBracketLoc(TL.getRBracketLoc());
2384 NewTL.setSizeExpr(Size);
2385
2386 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002387}
Mike Stump11289f42009-09-09 15:08:12 +00002388
2389template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002390QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
John McCall550e0c22009-10-21 00:40:46 +00002391 TypeLocBuilder &TLB,
2392 DependentSizedExtVectorTypeLoc TL) {
2393 DependentSizedExtVectorType *T = TL.getTypePtr();
2394
2395 // FIXME: ext vector locs should be nested
Douglas Gregord6ff3322009-08-04 16:50:30 +00002396 QualType ElementType = getDerived().TransformType(T->getElementType());
2397 if (ElementType.isNull())
2398 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002399
Douglas Gregore922c772009-08-04 22:27:00 +00002400 // Vector sizes are not potentially evaluated contexts
2401 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2402
Douglas Gregord6ff3322009-08-04 16:50:30 +00002403 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2404 if (Size.isInvalid())
2405 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002406
John McCall550e0c22009-10-21 00:40:46 +00002407 QualType Result = TL.getType();
2408 if (getDerived().AlwaysRebuild() ||
John McCall24e7cb62009-10-23 17:55:45 +00002409 ElementType != T->getElementType() ||
2410 Size.get() != T->getSizeExpr()) {
John McCall550e0c22009-10-21 00:40:46 +00002411 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00002412 move(Size),
2413 T->getAttributeLoc());
John McCall550e0c22009-10-21 00:40:46 +00002414 if (Result.isNull())
2415 return QualType();
2416 }
2417 else Size.take();
2418
2419 // Result might be dependent or not.
2420 if (isa<DependentSizedExtVectorType>(Result)) {
2421 DependentSizedExtVectorTypeLoc NewTL
2422 = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2423 NewTL.setNameLoc(TL.getNameLoc());
2424 } else {
2425 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2426 NewTL.setNameLoc(TL.getNameLoc());
2427 }
2428
2429 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002430}
Mike Stump11289f42009-09-09 15:08:12 +00002431
2432template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002433QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2434 VectorTypeLoc TL) {
2435 VectorType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002436 QualType ElementType = getDerived().TransformType(T->getElementType());
2437 if (ElementType.isNull())
2438 return QualType();
2439
John McCall550e0c22009-10-21 00:40:46 +00002440 QualType Result = TL.getType();
2441 if (getDerived().AlwaysRebuild() ||
2442 ElementType != T->getElementType()) {
2443 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements());
2444 if (Result.isNull())
2445 return QualType();
2446 }
2447
2448 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2449 NewTL.setNameLoc(TL.getNameLoc());
Mike Stump11289f42009-09-09 15:08:12 +00002450
John McCall550e0c22009-10-21 00:40:46 +00002451 return Result;
2452}
2453
2454template<typename Derived>
2455QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2456 ExtVectorTypeLoc TL) {
2457 VectorType *T = TL.getTypePtr();
2458 QualType ElementType = getDerived().TransformType(T->getElementType());
2459 if (ElementType.isNull())
2460 return QualType();
2461
2462 QualType Result = TL.getType();
2463 if (getDerived().AlwaysRebuild() ||
2464 ElementType != T->getElementType()) {
2465 Result = getDerived().RebuildExtVectorType(ElementType,
2466 T->getNumElements(),
2467 /*FIXME*/ SourceLocation());
2468 if (Result.isNull())
2469 return QualType();
2470 }
2471
2472 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2473 NewTL.setNameLoc(TL.getNameLoc());
2474
2475 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002476}
Mike Stump11289f42009-09-09 15:08:12 +00002477
2478template<typename Derived>
2479QualType
John McCall550e0c22009-10-21 00:40:46 +00002480TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
2481 FunctionProtoTypeLoc TL) {
2482 FunctionProtoType *T = TL.getTypePtr();
2483 QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002484 if (ResultType.isNull())
2485 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002486
John McCall550e0c22009-10-21 00:40:46 +00002487 // Transform the parameters.
Douglas Gregord6ff3322009-08-04 16:50:30 +00002488 llvm::SmallVector<QualType, 4> ParamTypes;
John McCall550e0c22009-10-21 00:40:46 +00002489 llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
2490 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2491 ParmVarDecl *OldParm = TL.getArg(i);
Mike Stump11289f42009-09-09 15:08:12 +00002492
John McCall550e0c22009-10-21 00:40:46 +00002493 QualType NewType;
2494 ParmVarDecl *NewParm;
2495
2496 if (OldParm) {
2497 DeclaratorInfo *OldDI = OldParm->getDeclaratorInfo();
2498 assert(OldDI->getType() == T->getArgType(i));
2499
2500 DeclaratorInfo *NewDI = getDerived().TransformType(OldDI);
2501 if (!NewDI)
2502 return QualType();
2503
2504 if (NewDI == OldDI)
2505 NewParm = OldParm;
2506 else
2507 NewParm = ParmVarDecl::Create(SemaRef.Context,
2508 OldParm->getDeclContext(),
2509 OldParm->getLocation(),
2510 OldParm->getIdentifier(),
2511 NewDI->getType(),
2512 NewDI,
2513 OldParm->getStorageClass(),
2514 /* DefArg */ NULL);
2515 NewType = NewParm->getType();
2516
2517 // Deal with the possibility that we don't have a parameter
2518 // declaration for this parameter.
2519 } else {
2520 NewParm = 0;
2521
2522 QualType OldType = T->getArgType(i);
2523 NewType = getDerived().TransformType(OldType);
2524 if (NewType.isNull())
2525 return QualType();
2526 }
2527
2528 ParamTypes.push_back(NewType);
2529 ParamDecls.push_back(NewParm);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002530 }
Mike Stump11289f42009-09-09 15:08:12 +00002531
John McCall550e0c22009-10-21 00:40:46 +00002532 QualType Result = TL.getType();
2533 if (getDerived().AlwaysRebuild() ||
2534 ResultType != T->getResultType() ||
2535 !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2536 Result = getDerived().RebuildFunctionProtoType(ResultType,
2537 ParamTypes.data(),
2538 ParamTypes.size(),
2539 T->isVariadic(),
2540 T->getTypeQuals());
2541 if (Result.isNull())
2542 return QualType();
2543 }
Mike Stump11289f42009-09-09 15:08:12 +00002544
John McCall550e0c22009-10-21 00:40:46 +00002545 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2546 NewTL.setLParenLoc(TL.getLParenLoc());
2547 NewTL.setRParenLoc(TL.getRParenLoc());
2548 for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2549 NewTL.setArg(i, ParamDecls[i]);
2550
2551 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002552}
Mike Stump11289f42009-09-09 15:08:12 +00002553
Douglas Gregord6ff3322009-08-04 16:50:30 +00002554template<typename Derived>
2555QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
John McCall550e0c22009-10-21 00:40:46 +00002556 TypeLocBuilder &TLB,
2557 FunctionNoProtoTypeLoc TL) {
2558 FunctionNoProtoType *T = TL.getTypePtr();
2559 QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2560 if (ResultType.isNull())
2561 return QualType();
2562
2563 QualType Result = TL.getType();
2564 if (getDerived().AlwaysRebuild() ||
2565 ResultType != T->getResultType())
2566 Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2567
2568 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2569 NewTL.setLParenLoc(TL.getLParenLoc());
2570 NewTL.setRParenLoc(TL.getRParenLoc());
2571
2572 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002573}
Mike Stump11289f42009-09-09 15:08:12 +00002574
Douglas Gregord6ff3322009-08-04 16:50:30 +00002575template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002576QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2577 TypedefTypeLoc TL) {
2578 TypedefType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002579 TypedefDecl *Typedef
2580 = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2581 if (!Typedef)
2582 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002583
John McCall550e0c22009-10-21 00:40:46 +00002584 QualType Result = TL.getType();
2585 if (getDerived().AlwaysRebuild() ||
2586 Typedef != T->getDecl()) {
2587 Result = getDerived().RebuildTypedefType(Typedef);
2588 if (Result.isNull())
2589 return QualType();
2590 }
Mike Stump11289f42009-09-09 15:08:12 +00002591
John McCall550e0c22009-10-21 00:40:46 +00002592 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
2593 NewTL.setNameLoc(TL.getNameLoc());
2594
2595 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002596}
Mike Stump11289f42009-09-09 15:08:12 +00002597
Douglas Gregord6ff3322009-08-04 16:50:30 +00002598template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002599QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
2600 TypeOfExprTypeLoc TL) {
2601 TypeOfExprType *T = TL.getTypePtr();
2602
Douglas Gregore922c772009-08-04 22:27:00 +00002603 // typeof expressions are not potentially evaluated contexts
2604 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002605
Douglas Gregord6ff3322009-08-04 16:50:30 +00002606 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2607 if (E.isInvalid())
2608 return QualType();
2609
John McCall550e0c22009-10-21 00:40:46 +00002610 QualType Result = TL.getType();
2611 if (getDerived().AlwaysRebuild() ||
2612 E.get() != T->getUnderlyingExpr()) {
2613 Result = getDerived().RebuildTypeOfExprType(move(E));
2614 if (Result.isNull())
2615 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002616 }
John McCall550e0c22009-10-21 00:40:46 +00002617 else E.take();
Mike Stump11289f42009-09-09 15:08:12 +00002618
John McCall550e0c22009-10-21 00:40:46 +00002619 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
2620 NewTL.setNameLoc(TL.getNameLoc());
2621
2622 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002623}
Mike Stump11289f42009-09-09 15:08:12 +00002624
2625template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002626QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
2627 TypeOfTypeLoc TL) {
2628 TypeOfType *T = TL.getTypePtr();
2629
2630 // FIXME: should be an inner type, or at least have a DeclaratorInfo.
Douglas Gregord6ff3322009-08-04 16:50:30 +00002631 QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2632 if (Underlying.isNull())
2633 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002634
John McCall550e0c22009-10-21 00:40:46 +00002635 QualType Result = TL.getType();
2636 if (getDerived().AlwaysRebuild() ||
2637 Underlying != T->getUnderlyingType()) {
2638 Result = getDerived().RebuildTypeOfType(Underlying);
2639 if (Result.isNull())
2640 return QualType();
2641 }
Mike Stump11289f42009-09-09 15:08:12 +00002642
John McCall550e0c22009-10-21 00:40:46 +00002643 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
2644 NewTL.setNameLoc(TL.getNameLoc());
2645
2646 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002647}
Mike Stump11289f42009-09-09 15:08:12 +00002648
2649template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002650QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
2651 DecltypeTypeLoc TL) {
2652 DecltypeType *T = TL.getTypePtr();
2653
Douglas Gregore922c772009-08-04 22:27:00 +00002654 // decltype expressions are not potentially evaluated contexts
2655 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002656
Douglas Gregord6ff3322009-08-04 16:50:30 +00002657 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2658 if (E.isInvalid())
2659 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002660
John McCall550e0c22009-10-21 00:40:46 +00002661 QualType Result = TL.getType();
2662 if (getDerived().AlwaysRebuild() ||
2663 E.get() != T->getUnderlyingExpr()) {
2664 Result = getDerived().RebuildDecltypeType(move(E));
2665 if (Result.isNull())
2666 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002667 }
John McCall550e0c22009-10-21 00:40:46 +00002668 else E.take();
Mike Stump11289f42009-09-09 15:08:12 +00002669
John McCall550e0c22009-10-21 00:40:46 +00002670 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
2671 NewTL.setNameLoc(TL.getNameLoc());
2672
2673 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002674}
2675
2676template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002677QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
2678 RecordTypeLoc TL) {
2679 RecordType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002680 RecordDecl *Record
John McCall550e0c22009-10-21 00:40:46 +00002681 = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
Douglas Gregord6ff3322009-08-04 16:50:30 +00002682 if (!Record)
2683 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002684
John McCall550e0c22009-10-21 00:40:46 +00002685 QualType Result = TL.getType();
2686 if (getDerived().AlwaysRebuild() ||
2687 Record != T->getDecl()) {
2688 Result = getDerived().RebuildRecordType(Record);
2689 if (Result.isNull())
2690 return QualType();
2691 }
Mike Stump11289f42009-09-09 15:08:12 +00002692
John McCall550e0c22009-10-21 00:40:46 +00002693 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
2694 NewTL.setNameLoc(TL.getNameLoc());
2695
2696 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002697}
Mike Stump11289f42009-09-09 15:08:12 +00002698
2699template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002700QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
2701 EnumTypeLoc TL) {
2702 EnumType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002703 EnumDecl *Enum
John McCall550e0c22009-10-21 00:40:46 +00002704 = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
Douglas Gregord6ff3322009-08-04 16:50:30 +00002705 if (!Enum)
2706 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002707
John McCall550e0c22009-10-21 00:40:46 +00002708 QualType Result = TL.getType();
2709 if (getDerived().AlwaysRebuild() ||
2710 Enum != T->getDecl()) {
2711 Result = getDerived().RebuildEnumType(Enum);
2712 if (Result.isNull())
2713 return QualType();
2714 }
Mike Stump11289f42009-09-09 15:08:12 +00002715
John McCall550e0c22009-10-21 00:40:46 +00002716 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
2717 NewTL.setNameLoc(TL.getNameLoc());
2718
2719 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002720}
John McCallfcc33b02009-09-05 00:15:47 +00002721
2722template <typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002723QualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
2724 ElaboratedTypeLoc TL) {
2725 ElaboratedType *T = TL.getTypePtr();
2726
2727 // FIXME: this should be a nested type.
John McCallfcc33b02009-09-05 00:15:47 +00002728 QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2729 if (Underlying.isNull())
2730 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002731
John McCall550e0c22009-10-21 00:40:46 +00002732 QualType Result = TL.getType();
2733 if (getDerived().AlwaysRebuild() ||
2734 Underlying != T->getUnderlyingType()) {
2735 Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
2736 if (Result.isNull())
2737 return QualType();
2738 }
Mike Stump11289f42009-09-09 15:08:12 +00002739
John McCall550e0c22009-10-21 00:40:46 +00002740 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
2741 NewTL.setNameLoc(TL.getNameLoc());
2742
2743 return Result;
John McCallfcc33b02009-09-05 00:15:47 +00002744}
Mike Stump11289f42009-09-09 15:08:12 +00002745
2746
Douglas Gregord6ff3322009-08-04 16:50:30 +00002747template<typename Derived>
2748QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
John McCall550e0c22009-10-21 00:40:46 +00002749 TypeLocBuilder &TLB,
2750 TemplateTypeParmTypeLoc TL) {
2751 return TransformTypeSpecType(TLB, TL);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002752}
2753
Mike Stump11289f42009-09-09 15:08:12 +00002754template<typename Derived>
John McCallcebee162009-10-18 09:09:24 +00002755QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
John McCall550e0c22009-10-21 00:40:46 +00002756 TypeLocBuilder &TLB,
2757 SubstTemplateTypeParmTypeLoc TL) {
2758 return TransformTypeSpecType(TLB, TL);
John McCallcebee162009-10-18 09:09:24 +00002759}
2760
2761template<typename Derived>
Douglas Gregorc59e5612009-10-19 22:04:39 +00002762inline QualType
2763TreeTransform<Derived>::TransformTemplateSpecializationType(
John McCall550e0c22009-10-21 00:40:46 +00002764 TypeLocBuilder &TLB,
2765 TemplateSpecializationTypeLoc TL) {
John McCall0ad16662009-10-29 08:12:44 +00002766 return TransformTemplateSpecializationType(TLB, TL, QualType());
2767}
John McCall550e0c22009-10-21 00:40:46 +00002768
John McCall0ad16662009-10-29 08:12:44 +00002769template<typename Derived>
2770QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2771 const TemplateSpecializationType *TST,
2772 QualType ObjectType) {
2773 // FIXME: this entire method is a temporary workaround; callers
2774 // should be rewritten to provide real type locs.
John McCall550e0c22009-10-21 00:40:46 +00002775
John McCall0ad16662009-10-29 08:12:44 +00002776 // Fake up a TemplateSpecializationTypeLoc.
2777 TypeLocBuilder TLB;
2778 TemplateSpecializationTypeLoc TL
2779 = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
2780
John McCall0d07eb32009-10-29 18:45:58 +00002781 SourceLocation BaseLoc = getDerived().getBaseLocation();
2782
2783 TL.setTemplateNameLoc(BaseLoc);
2784 TL.setLAngleLoc(BaseLoc);
2785 TL.setRAngleLoc(BaseLoc);
John McCall0ad16662009-10-29 08:12:44 +00002786 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2787 const TemplateArgument &TA = TST->getArg(i);
2788 TemplateArgumentLoc TAL;
2789 getDerived().InventTemplateArgumentLoc(TA, TAL);
2790 TL.setArgLocInfo(i, TAL.getLocInfo());
2791 }
2792
2793 TypeLocBuilder IgnoredTLB;
2794 return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
Douglas Gregorc59e5612009-10-19 22:04:39 +00002795}
2796
2797template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002798QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
John McCall0ad16662009-10-29 08:12:44 +00002799 TypeLocBuilder &TLB,
2800 TemplateSpecializationTypeLoc TL,
2801 QualType ObjectType) {
2802 const TemplateSpecializationType *T = TL.getTypePtr();
2803
Mike Stump11289f42009-09-09 15:08:12 +00002804 TemplateName Template
Douglas Gregorc59e5612009-10-19 22:04:39 +00002805 = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002806 if (Template.isNull())
2807 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002808
John McCall0ad16662009-10-29 08:12:44 +00002809 llvm::SmallVector<TemplateArgumentLoc, 4> NewTemplateArgs(T->getNumArgs());
2810 for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i)
2811 if (getDerived().TransformTemplateArgument(TL.getArgLoc(i),
2812 NewTemplateArgs[i]))
Douglas Gregord6ff3322009-08-04 16:50:30 +00002813 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002814
John McCall0ad16662009-10-29 08:12:44 +00002815 // FIXME: maybe don't rebuild if all the template arguments are the same.
2816
2817 QualType Result =
2818 getDerived().RebuildTemplateSpecializationType(Template,
2819 TL.getTemplateNameLoc(),
2820 TL.getLAngleLoc(),
2821 NewTemplateArgs.data(),
2822 NewTemplateArgs.size(),
2823 TL.getRAngleLoc());
2824
2825 if (!Result.isNull()) {
2826 TemplateSpecializationTypeLoc NewTL
2827 = TLB.push<TemplateSpecializationTypeLoc>(Result);
2828 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
2829 NewTL.setLAngleLoc(TL.getLAngleLoc());
2830 NewTL.setRAngleLoc(TL.getRAngleLoc());
2831 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
2832 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002833 }
Mike Stump11289f42009-09-09 15:08:12 +00002834
John McCall0ad16662009-10-29 08:12:44 +00002835 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002836}
Mike Stump11289f42009-09-09 15:08:12 +00002837
2838template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002839QualType
2840TreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB,
2841 QualifiedNameTypeLoc TL) {
2842 QualifiedNameType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002843 NestedNameSpecifier *NNS
2844 = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2845 SourceRange());
2846 if (!NNS)
2847 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002848
Douglas Gregord6ff3322009-08-04 16:50:30 +00002849 QualType Named = getDerived().TransformType(T->getNamedType());
2850 if (Named.isNull())
2851 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002852
John McCall550e0c22009-10-21 00:40:46 +00002853 QualType Result = TL.getType();
2854 if (getDerived().AlwaysRebuild() ||
2855 NNS != T->getQualifier() ||
2856 Named != T->getNamedType()) {
2857 Result = getDerived().RebuildQualifiedNameType(NNS, Named);
2858 if (Result.isNull())
2859 return QualType();
2860 }
Douglas Gregord6ff3322009-08-04 16:50:30 +00002861
John McCall550e0c22009-10-21 00:40:46 +00002862 QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result);
2863 NewTL.setNameLoc(TL.getNameLoc());
2864
2865 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002866}
Mike Stump11289f42009-09-09 15:08:12 +00002867
2868template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002869QualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB,
2870 TypenameTypeLoc TL) {
2871 TypenameType *T = TL.getTypePtr();
John McCall0ad16662009-10-29 08:12:44 +00002872
2873 /* FIXME: preserve source information better than this */
2874 SourceRange SR(TL.getNameLoc());
2875
Douglas Gregord6ff3322009-08-04 16:50:30 +00002876 NestedNameSpecifier *NNS
John McCall0ad16662009-10-29 08:12:44 +00002877 = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002878 if (!NNS)
2879 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002880
John McCall550e0c22009-10-21 00:40:46 +00002881 QualType Result;
2882
Douglas Gregord6ff3322009-08-04 16:50:30 +00002883 if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
Mike Stump11289f42009-09-09 15:08:12 +00002884 QualType NewTemplateId
Douglas Gregord6ff3322009-08-04 16:50:30 +00002885 = getDerived().TransformType(QualType(TemplateId, 0));
2886 if (NewTemplateId.isNull())
2887 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002888
Douglas Gregord6ff3322009-08-04 16:50:30 +00002889 if (!getDerived().AlwaysRebuild() &&
2890 NNS == T->getQualifier() &&
2891 NewTemplateId == QualType(TemplateId, 0))
2892 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002893
John McCall550e0c22009-10-21 00:40:46 +00002894 Result = getDerived().RebuildTypenameType(NNS, NewTemplateId);
2895 } else {
John McCall0ad16662009-10-29 08:12:44 +00002896 Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002897 }
John McCall550e0c22009-10-21 00:40:46 +00002898 if (Result.isNull())
2899 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002900
John McCall550e0c22009-10-21 00:40:46 +00002901 TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result);
2902 NewTL.setNameLoc(TL.getNameLoc());
2903
2904 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002905}
Mike Stump11289f42009-09-09 15:08:12 +00002906
Douglas Gregord6ff3322009-08-04 16:50:30 +00002907template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002908QualType
2909TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
2910 ObjCInterfaceTypeLoc TL) {
John McCallfc93cf92009-10-22 22:37:11 +00002911 assert(false && "TransformObjCInterfaceType unimplemented");
2912 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002913}
Mike Stump11289f42009-09-09 15:08:12 +00002914
2915template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002916QualType
2917TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
2918 ObjCObjectPointerTypeLoc TL) {
John McCallfc93cf92009-10-22 22:37:11 +00002919 assert(false && "TransformObjCObjectPointerType unimplemented");
2920 return QualType();
Argyrios Kyrtzidisa7a36df2009-09-29 19:42:55 +00002921}
2922
Douglas Gregord6ff3322009-08-04 16:50:30 +00002923//===----------------------------------------------------------------------===//
Douglas Gregorebe10102009-08-20 07:17:43 +00002924// Statement transformation
2925//===----------------------------------------------------------------------===//
2926template<typename Derived>
2927Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002928TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
2929 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002930}
2931
2932template<typename Derived>
2933Sema::OwningStmtResult
2934TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
2935 return getDerived().TransformCompoundStmt(S, false);
2936}
2937
2938template<typename Derived>
2939Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002940TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
Douglas Gregorebe10102009-08-20 07:17:43 +00002941 bool IsStmtExpr) {
2942 bool SubStmtChanged = false;
2943 ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
2944 for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
2945 B != BEnd; ++B) {
2946 OwningStmtResult Result = getDerived().TransformStmt(*B);
2947 if (Result.isInvalid())
2948 return getSema().StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002949
Douglas Gregorebe10102009-08-20 07:17:43 +00002950 SubStmtChanged = SubStmtChanged || Result.get() != *B;
2951 Statements.push_back(Result.takeAs<Stmt>());
2952 }
Mike Stump11289f42009-09-09 15:08:12 +00002953
Douglas Gregorebe10102009-08-20 07:17:43 +00002954 if (!getDerived().AlwaysRebuild() &&
2955 !SubStmtChanged)
Mike Stump11289f42009-09-09 15:08:12 +00002956 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002957
2958 return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
2959 move_arg(Statements),
2960 S->getRBracLoc(),
2961 IsStmtExpr);
2962}
Mike Stump11289f42009-09-09 15:08:12 +00002963
Douglas Gregorebe10102009-08-20 07:17:43 +00002964template<typename Derived>
2965Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002966TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00002967 // The case value expressions are not potentially evaluated.
2968 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002969
Douglas Gregorebe10102009-08-20 07:17:43 +00002970 // Transform the left-hand case value.
2971 OwningExprResult LHS = getDerived().TransformExpr(S->getLHS());
2972 if (LHS.isInvalid())
2973 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002974
Douglas Gregorebe10102009-08-20 07:17:43 +00002975 // Transform the right-hand case value (for the GNU case-range extension).
2976 OwningExprResult RHS = getDerived().TransformExpr(S->getRHS());
2977 if (RHS.isInvalid())
2978 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002979
Douglas Gregorebe10102009-08-20 07:17:43 +00002980 // Build the case statement.
2981 // Case statements are always rebuilt so that they will attached to their
2982 // transformed switch statement.
2983 OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
2984 move(LHS),
2985 S->getEllipsisLoc(),
2986 move(RHS),
2987 S->getColonLoc());
2988 if (Case.isInvalid())
2989 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002990
Douglas Gregorebe10102009-08-20 07:17:43 +00002991 // Transform the statement following the case
2992 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
2993 if (SubStmt.isInvalid())
2994 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002995
Douglas Gregorebe10102009-08-20 07:17:43 +00002996 // Attach the body to the case statement
2997 return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
2998}
2999
3000template<typename Derived>
3001Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003002TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003003 // Transform the statement following the default case
3004 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3005 if (SubStmt.isInvalid())
3006 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003007
Douglas Gregorebe10102009-08-20 07:17:43 +00003008 // Default statements are always rebuilt
3009 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
3010 move(SubStmt));
3011}
Mike Stump11289f42009-09-09 15:08:12 +00003012
Douglas Gregorebe10102009-08-20 07:17:43 +00003013template<typename Derived>
3014Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003015TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003016 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3017 if (SubStmt.isInvalid())
3018 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003019
Douglas Gregorebe10102009-08-20 07:17:43 +00003020 // FIXME: Pass the real colon location in.
3021 SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
3022 return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
3023 move(SubStmt));
3024}
Mike Stump11289f42009-09-09 15:08:12 +00003025
Douglas Gregorebe10102009-08-20 07:17:43 +00003026template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003027Sema::OwningStmtResult
3028TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003029 // Transform the condition
3030 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3031 if (Cond.isInvalid())
3032 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003033
Douglas Gregorebe10102009-08-20 07:17:43 +00003034 Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
Mike Stump11289f42009-09-09 15:08:12 +00003035
Douglas Gregorebe10102009-08-20 07:17:43 +00003036 // Transform the "then" branch.
3037 OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
3038 if (Then.isInvalid())
3039 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003040
Douglas Gregorebe10102009-08-20 07:17:43 +00003041 // Transform the "else" branch.
3042 OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
3043 if (Else.isInvalid())
3044 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003045
Douglas Gregorebe10102009-08-20 07:17:43 +00003046 if (!getDerived().AlwaysRebuild() &&
3047 FullCond->get() == S->getCond() &&
3048 Then.get() == S->getThen() &&
3049 Else.get() == S->getElse())
Mike Stump11289f42009-09-09 15:08:12 +00003050 return SemaRef.Owned(S->Retain());
3051
Douglas Gregorebe10102009-08-20 07:17:43 +00003052 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then),
Mike Stump11289f42009-09-09 15:08:12 +00003053 S->getElseLoc(), move(Else));
Douglas Gregorebe10102009-08-20 07:17:43 +00003054}
3055
3056template<typename Derived>
3057Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003058TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003059 // Transform the condition.
3060 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3061 if (Cond.isInvalid())
3062 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003063
Douglas Gregorebe10102009-08-20 07:17:43 +00003064 // Rebuild the switch statement.
3065 OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond));
3066 if (Switch.isInvalid())
3067 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003068
Douglas Gregorebe10102009-08-20 07:17:43 +00003069 // Transform the body of the switch statement.
3070 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3071 if (Body.isInvalid())
3072 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003073
Douglas Gregorebe10102009-08-20 07:17:43 +00003074 // Complete the switch statement.
3075 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
3076 move(Body));
3077}
Mike Stump11289f42009-09-09 15:08:12 +00003078
Douglas Gregorebe10102009-08-20 07:17:43 +00003079template<typename Derived>
3080Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003081TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003082 // Transform the condition
3083 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3084 if (Cond.isInvalid())
3085 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003086
Douglas Gregorebe10102009-08-20 07:17:43 +00003087 Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
Mike Stump11289f42009-09-09 15:08:12 +00003088
Douglas Gregorebe10102009-08-20 07:17:43 +00003089 // Transform the body
3090 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3091 if (Body.isInvalid())
3092 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003093
Douglas Gregorebe10102009-08-20 07:17:43 +00003094 if (!getDerived().AlwaysRebuild() &&
3095 FullCond->get() == S->getCond() &&
3096 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00003097 return SemaRef.Owned(S->Retain());
3098
Douglas Gregorebe10102009-08-20 07:17:43 +00003099 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body));
3100}
Mike Stump11289f42009-09-09 15:08:12 +00003101
Douglas Gregorebe10102009-08-20 07:17:43 +00003102template<typename Derived>
3103Sema::OwningStmtResult
3104TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
3105 // Transform the condition
3106 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3107 if (Cond.isInvalid())
3108 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003109
Douglas Gregorebe10102009-08-20 07:17:43 +00003110 // Transform the body
3111 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3112 if (Body.isInvalid())
3113 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003114
Douglas Gregorebe10102009-08-20 07:17:43 +00003115 if (!getDerived().AlwaysRebuild() &&
3116 Cond.get() == S->getCond() &&
3117 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00003118 return SemaRef.Owned(S->Retain());
3119
Douglas Gregorebe10102009-08-20 07:17:43 +00003120 return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
3121 /*FIXME:*/S->getWhileLoc(), move(Cond),
3122 S->getRParenLoc());
3123}
Mike Stump11289f42009-09-09 15:08:12 +00003124
Douglas Gregorebe10102009-08-20 07:17:43 +00003125template<typename Derived>
3126Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003127TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003128 // Transform the initialization statement
3129 OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
3130 if (Init.isInvalid())
3131 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003132
Douglas Gregorebe10102009-08-20 07:17:43 +00003133 // Transform the condition
3134 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3135 if (Cond.isInvalid())
3136 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003137
Douglas Gregorebe10102009-08-20 07:17:43 +00003138 // Transform the increment
3139 OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
3140 if (Inc.isInvalid())
3141 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003142
Douglas Gregorebe10102009-08-20 07:17:43 +00003143 // Transform the body
3144 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3145 if (Body.isInvalid())
3146 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003147
Douglas Gregorebe10102009-08-20 07:17:43 +00003148 if (!getDerived().AlwaysRebuild() &&
3149 Init.get() == S->getInit() &&
3150 Cond.get() == S->getCond() &&
3151 Inc.get() == S->getInc() &&
3152 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00003153 return SemaRef.Owned(S->Retain());
3154
Douglas Gregorebe10102009-08-20 07:17:43 +00003155 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
3156 move(Init), move(Cond), move(Inc),
3157 S->getRParenLoc(), move(Body));
3158}
3159
3160template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003161Sema::OwningStmtResult
3162TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003163 // Goto statements must always be rebuilt, to resolve the label.
Mike Stump11289f42009-09-09 15:08:12 +00003164 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
Douglas Gregorebe10102009-08-20 07:17:43 +00003165 S->getLabel());
3166}
3167
3168template<typename Derived>
3169Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003170TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003171 OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
3172 if (Target.isInvalid())
3173 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003174
Douglas Gregorebe10102009-08-20 07:17:43 +00003175 if (!getDerived().AlwaysRebuild() &&
3176 Target.get() == S->getTarget())
Mike Stump11289f42009-09-09 15:08:12 +00003177 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003178
3179 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
3180 move(Target));
3181}
3182
3183template<typename Derived>
3184Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003185TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
3186 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003187}
Mike Stump11289f42009-09-09 15:08:12 +00003188
Douglas Gregorebe10102009-08-20 07:17:43 +00003189template<typename Derived>
3190Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003191TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
3192 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003193}
Mike Stump11289f42009-09-09 15:08:12 +00003194
Douglas Gregorebe10102009-08-20 07:17:43 +00003195template<typename Derived>
3196Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003197TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003198 Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
3199 if (Result.isInvalid())
3200 return SemaRef.StmtError();
3201
Mike Stump11289f42009-09-09 15:08:12 +00003202 // FIXME: We always rebuild the return statement because there is no way
Douglas Gregorebe10102009-08-20 07:17:43 +00003203 // to tell whether the return type of the function has changed.
3204 return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
3205}
Mike Stump11289f42009-09-09 15:08:12 +00003206
Douglas Gregorebe10102009-08-20 07:17:43 +00003207template<typename Derived>
3208Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003209TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003210 bool DeclChanged = false;
3211 llvm::SmallVector<Decl *, 4> Decls;
3212 for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
3213 D != DEnd; ++D) {
3214 Decl *Transformed = getDerived().TransformDefinition(*D);
3215 if (!Transformed)
3216 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003217
Douglas Gregorebe10102009-08-20 07:17:43 +00003218 if (Transformed != *D)
3219 DeclChanged = true;
Mike Stump11289f42009-09-09 15:08:12 +00003220
Douglas Gregorebe10102009-08-20 07:17:43 +00003221 Decls.push_back(Transformed);
3222 }
Mike Stump11289f42009-09-09 15:08:12 +00003223
Douglas Gregorebe10102009-08-20 07:17:43 +00003224 if (!getDerived().AlwaysRebuild() && !DeclChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003225 return SemaRef.Owned(S->Retain());
3226
3227 return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
Douglas Gregorebe10102009-08-20 07:17:43 +00003228 S->getStartLoc(), S->getEndLoc());
3229}
Mike Stump11289f42009-09-09 15:08:12 +00003230
Douglas Gregorebe10102009-08-20 07:17:43 +00003231template<typename Derived>
3232Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003233TreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003234 assert(false && "SwitchCase is abstract and cannot be transformed");
Mike Stump11289f42009-09-09 15:08:12 +00003235 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003236}
3237
3238template<typename Derived>
3239Sema::OwningStmtResult
3240TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
3241 // FIXME: Implement!
3242 assert(false && "Inline assembly cannot be transformed");
Mike Stump11289f42009-09-09 15:08:12 +00003243 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003244}
3245
3246
3247template<typename Derived>
3248Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003249TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003250 // FIXME: Implement this
3251 assert(false && "Cannot transform an Objective-C @try statement");
Mike Stump11289f42009-09-09 15:08:12 +00003252 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003253}
Mike Stump11289f42009-09-09 15:08:12 +00003254
Douglas Gregorebe10102009-08-20 07:17:43 +00003255template<typename Derived>
3256Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003257TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003258 // FIXME: Implement this
3259 assert(false && "Cannot transform an Objective-C @catch statement");
3260 return SemaRef.Owned(S->Retain());
3261}
Mike Stump11289f42009-09-09 15:08:12 +00003262
Douglas Gregorebe10102009-08-20 07:17:43 +00003263template<typename Derived>
3264Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003265TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003266 // FIXME: Implement this
3267 assert(false && "Cannot transform an Objective-C @finally statement");
Mike Stump11289f42009-09-09 15:08:12 +00003268 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003269}
Mike Stump11289f42009-09-09 15:08:12 +00003270
Douglas Gregorebe10102009-08-20 07:17:43 +00003271template<typename Derived>
3272Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003273TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003274 // FIXME: Implement this
3275 assert(false && "Cannot transform an Objective-C @throw statement");
Mike Stump11289f42009-09-09 15:08:12 +00003276 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003277}
Mike Stump11289f42009-09-09 15:08:12 +00003278
Douglas Gregorebe10102009-08-20 07:17:43 +00003279template<typename Derived>
3280Sema::OwningStmtResult
3281TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
Mike Stump11289f42009-09-09 15:08:12 +00003282 ObjCAtSynchronizedStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003283 // FIXME: Implement this
3284 assert(false && "Cannot transform an Objective-C @synchronized statement");
Mike Stump11289f42009-09-09 15:08:12 +00003285 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003286}
3287
3288template<typename Derived>
3289Sema::OwningStmtResult
3290TreeTransform<Derived>::TransformObjCForCollectionStmt(
Mike Stump11289f42009-09-09 15:08:12 +00003291 ObjCForCollectionStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003292 // FIXME: Implement this
3293 assert(false && "Cannot transform an Objective-C for-each statement");
Mike Stump11289f42009-09-09 15:08:12 +00003294 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003295}
3296
3297
3298template<typename Derived>
3299Sema::OwningStmtResult
3300TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
3301 // Transform the exception declaration, if any.
3302 VarDecl *Var = 0;
3303 if (S->getExceptionDecl()) {
3304 VarDecl *ExceptionDecl = S->getExceptionDecl();
3305 TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
3306 ExceptionDecl->getDeclName());
3307
3308 QualType T = getDerived().TransformType(ExceptionDecl->getType());
3309 if (T.isNull())
3310 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003311
Douglas Gregorebe10102009-08-20 07:17:43 +00003312 Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
3313 T,
3314 ExceptionDecl->getDeclaratorInfo(),
3315 ExceptionDecl->getIdentifier(),
3316 ExceptionDecl->getLocation(),
3317 /*FIXME: Inaccurate*/
3318 SourceRange(ExceptionDecl->getLocation()));
3319 if (!Var || Var->isInvalidDecl()) {
3320 if (Var)
3321 Var->Destroy(SemaRef.Context);
3322 return SemaRef.StmtError();
3323 }
3324 }
Mike Stump11289f42009-09-09 15:08:12 +00003325
Douglas Gregorebe10102009-08-20 07:17:43 +00003326 // Transform the actual exception handler.
3327 OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
3328 if (Handler.isInvalid()) {
3329 if (Var)
3330 Var->Destroy(SemaRef.Context);
3331 return SemaRef.StmtError();
3332 }
Mike Stump11289f42009-09-09 15:08:12 +00003333
Douglas Gregorebe10102009-08-20 07:17:43 +00003334 if (!getDerived().AlwaysRebuild() &&
3335 !Var &&
3336 Handler.get() == S->getHandlerBlock())
Mike Stump11289f42009-09-09 15:08:12 +00003337 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003338
3339 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
3340 Var,
3341 move(Handler));
3342}
Mike Stump11289f42009-09-09 15:08:12 +00003343
Douglas Gregorebe10102009-08-20 07:17:43 +00003344template<typename Derived>
3345Sema::OwningStmtResult
3346TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
3347 // Transform the try block itself.
Mike Stump11289f42009-09-09 15:08:12 +00003348 OwningStmtResult TryBlock
Douglas Gregorebe10102009-08-20 07:17:43 +00003349 = getDerived().TransformCompoundStmt(S->getTryBlock());
3350 if (TryBlock.isInvalid())
3351 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003352
Douglas Gregorebe10102009-08-20 07:17:43 +00003353 // Transform the handlers.
3354 bool HandlerChanged = false;
3355 ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
3356 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
Mike Stump11289f42009-09-09 15:08:12 +00003357 OwningStmtResult Handler
Douglas Gregorebe10102009-08-20 07:17:43 +00003358 = getDerived().TransformCXXCatchStmt(S->getHandler(I));
3359 if (Handler.isInvalid())
3360 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003361
Douglas Gregorebe10102009-08-20 07:17:43 +00003362 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
3363 Handlers.push_back(Handler.takeAs<Stmt>());
3364 }
Mike Stump11289f42009-09-09 15:08:12 +00003365
Douglas Gregorebe10102009-08-20 07:17:43 +00003366 if (!getDerived().AlwaysRebuild() &&
3367 TryBlock.get() == S->getTryBlock() &&
3368 !HandlerChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003369 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003370
3371 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
Mike Stump11289f42009-09-09 15:08:12 +00003372 move_arg(Handlers));
Douglas Gregorebe10102009-08-20 07:17:43 +00003373}
Mike Stump11289f42009-09-09 15:08:12 +00003374
Douglas Gregorebe10102009-08-20 07:17:43 +00003375//===----------------------------------------------------------------------===//
Douglas Gregora16548e2009-08-11 05:31:07 +00003376// Expression transformation
3377//===----------------------------------------------------------------------===//
Mike Stump11289f42009-09-09 15:08:12 +00003378template<typename Derived>
3379Sema::OwningExprResult
3380TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
3381 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003382}
Mike Stump11289f42009-09-09 15:08:12 +00003383
3384template<typename Derived>
3385Sema::OwningExprResult
3386TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003387 NestedNameSpecifier *Qualifier = 0;
3388 if (E->getQualifier()) {
3389 Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3390 E->getQualifierRange());
3391 if (!Qualifier)
3392 return SemaRef.ExprError();
3393 }
3394
Mike Stump11289f42009-09-09 15:08:12 +00003395 NamedDecl *ND
Douglas Gregora16548e2009-08-11 05:31:07 +00003396 = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3397 if (!ND)
3398 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003399
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003400 if (!getDerived().AlwaysRebuild() &&
3401 Qualifier == E->getQualifier() &&
3402 ND == E->getDecl() &&
3403 !E->hasExplicitTemplateArgumentList())
Mike Stump11289f42009-09-09 15:08:12 +00003404 return SemaRef.Owned(E->Retain());
3405
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003406 // FIXME: We're losing the explicit template arguments in this transformation.
3407
John McCall0ad16662009-10-29 08:12:44 +00003408 llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003409 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
John McCall0ad16662009-10-29 08:12:44 +00003410 if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
3411 TransArgs[I]))
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003412 return SemaRef.ExprError();
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003413 }
3414
3415 // FIXME: Pass the qualifier/qualifier range along.
3416 return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
3417 ND, E->getLocation());
Douglas Gregora16548e2009-08-11 05:31:07 +00003418}
Mike Stump11289f42009-09-09 15:08:12 +00003419
Douglas Gregora16548e2009-08-11 05:31:07 +00003420template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003421Sema::OwningExprResult
3422TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
3423 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003424}
Mike Stump11289f42009-09-09 15:08:12 +00003425
Douglas Gregora16548e2009-08-11 05:31:07 +00003426template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003427Sema::OwningExprResult
3428TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
3429 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003430}
Mike Stump11289f42009-09-09 15:08:12 +00003431
Douglas Gregora16548e2009-08-11 05:31:07 +00003432template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003433Sema::OwningExprResult
3434TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
3435 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003436}
Mike Stump11289f42009-09-09 15:08:12 +00003437
Douglas Gregora16548e2009-08-11 05:31:07 +00003438template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003439Sema::OwningExprResult
3440TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
3441 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003442}
Mike Stump11289f42009-09-09 15:08:12 +00003443
Douglas Gregora16548e2009-08-11 05:31:07 +00003444template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003445Sema::OwningExprResult
3446TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
3447 return SemaRef.Owned(E->Retain());
3448}
3449
3450template<typename Derived>
3451Sema::OwningExprResult
3452TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003453 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3454 if (SubExpr.isInvalid())
3455 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003456
Douglas Gregora16548e2009-08-11 05:31:07 +00003457 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003458 return SemaRef.Owned(E->Retain());
3459
3460 return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003461 E->getRParen());
3462}
3463
Mike Stump11289f42009-09-09 15:08:12 +00003464template<typename Derived>
3465Sema::OwningExprResult
3466TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003467 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3468 if (SubExpr.isInvalid())
3469 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003470
Douglas Gregora16548e2009-08-11 05:31:07 +00003471 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003472 return SemaRef.Owned(E->Retain());
3473
Douglas Gregora16548e2009-08-11 05:31:07 +00003474 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
3475 E->getOpcode(),
3476 move(SubExpr));
3477}
Mike Stump11289f42009-09-09 15:08:12 +00003478
Douglas Gregora16548e2009-08-11 05:31:07 +00003479template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003480Sema::OwningExprResult
3481TreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003482 if (E->isArgumentType()) {
Douglas Gregor3da3c062009-10-28 00:29:27 +00003483 TemporaryBase Rebase(*this, E->getOperatorLoc(), DeclarationName());
3484
Douglas Gregora16548e2009-08-11 05:31:07 +00003485 QualType T = getDerived().TransformType(E->getArgumentType());
3486 if (T.isNull())
3487 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003488
Douglas Gregora16548e2009-08-11 05:31:07 +00003489 if (!getDerived().AlwaysRebuild() && T == E->getArgumentType())
3490 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003491
3492 return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(),
3493 E->isSizeOf(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003494 E->getSourceRange());
3495 }
Mike Stump11289f42009-09-09 15:08:12 +00003496
Douglas Gregora16548e2009-08-11 05:31:07 +00003497 Sema::OwningExprResult SubExpr(SemaRef);
Mike Stump11289f42009-09-09 15:08:12 +00003498 {
Douglas Gregora16548e2009-08-11 05:31:07 +00003499 // C++0x [expr.sizeof]p1:
3500 // The operand is either an expression, which is an unevaluated operand
3501 // [...]
3502 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00003503
Douglas Gregora16548e2009-08-11 05:31:07 +00003504 SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3505 if (SubExpr.isInvalid())
3506 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003507
Douglas Gregora16548e2009-08-11 05:31:07 +00003508 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3509 return SemaRef.Owned(E->Retain());
3510 }
Mike Stump11289f42009-09-09 15:08:12 +00003511
Douglas Gregora16548e2009-08-11 05:31:07 +00003512 return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3513 E->isSizeOf(),
3514 E->getSourceRange());
3515}
Mike Stump11289f42009-09-09 15:08:12 +00003516
Douglas Gregora16548e2009-08-11 05:31:07 +00003517template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003518Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003519TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
3520 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3521 if (LHS.isInvalid())
3522 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003523
Douglas Gregora16548e2009-08-11 05:31:07 +00003524 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3525 if (RHS.isInvalid())
3526 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003527
3528
Douglas Gregora16548e2009-08-11 05:31:07 +00003529 if (!getDerived().AlwaysRebuild() &&
3530 LHS.get() == E->getLHS() &&
3531 RHS.get() == E->getRHS())
3532 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003533
Douglas Gregora16548e2009-08-11 05:31:07 +00003534 return getDerived().RebuildArraySubscriptExpr(move(LHS),
3535 /*FIXME:*/E->getLHS()->getLocStart(),
3536 move(RHS),
3537 E->getRBracketLoc());
3538}
Mike Stump11289f42009-09-09 15:08:12 +00003539
3540template<typename Derived>
3541Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003542TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
3543 // Transform the callee.
3544 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3545 if (Callee.isInvalid())
3546 return SemaRef.ExprError();
3547
3548 // Transform arguments.
3549 bool ArgChanged = false;
3550 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3551 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3552 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3553 OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3554 if (Arg.isInvalid())
3555 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003556
Douglas Gregora16548e2009-08-11 05:31:07 +00003557 // FIXME: Wrong source location information for the ','.
3558 FakeCommaLocs.push_back(
3559 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
Mike Stump11289f42009-09-09 15:08:12 +00003560
3561 ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
Douglas Gregora16548e2009-08-11 05:31:07 +00003562 Args.push_back(Arg.takeAs<Expr>());
3563 }
Mike Stump11289f42009-09-09 15:08:12 +00003564
Douglas Gregora16548e2009-08-11 05:31:07 +00003565 if (!getDerived().AlwaysRebuild() &&
3566 Callee.get() == E->getCallee() &&
3567 !ArgChanged)
3568 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003569
Douglas Gregora16548e2009-08-11 05:31:07 +00003570 // FIXME: Wrong source location information for the '('.
Mike Stump11289f42009-09-09 15:08:12 +00003571 SourceLocation FakeLParenLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003572 = ((Expr *)Callee.get())->getSourceRange().getBegin();
3573 return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3574 move_arg(Args),
3575 FakeCommaLocs.data(),
3576 E->getRParenLoc());
3577}
Mike Stump11289f42009-09-09 15:08:12 +00003578
3579template<typename Derived>
3580Sema::OwningExprResult
3581TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003582 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3583 if (Base.isInvalid())
3584 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003585
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003586 NestedNameSpecifier *Qualifier = 0;
3587 if (E->hasQualifier()) {
Mike Stump11289f42009-09-09 15:08:12 +00003588 Qualifier
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003589 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3590 E->getQualifierRange());
Douglas Gregor84f14dd2009-09-01 00:37:14 +00003591 if (Qualifier == 0)
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003592 return SemaRef.ExprError();
3593 }
Mike Stump11289f42009-09-09 15:08:12 +00003594
3595 NamedDecl *Member
Douglas Gregora16548e2009-08-11 05:31:07 +00003596 = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
3597 if (!Member)
3598 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003599
Douglas Gregora16548e2009-08-11 05:31:07 +00003600 if (!getDerived().AlwaysRebuild() &&
3601 Base.get() == E->getBase() &&
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003602 Qualifier == E->getQualifier() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00003603 Member == E->getMemberDecl())
Mike Stump11289f42009-09-09 15:08:12 +00003604 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003605
3606 // FIXME: Bogus source location for the operator
3607 SourceLocation FakeOperatorLoc
3608 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3609
3610 return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3611 E->isArrow(),
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003612 Qualifier,
3613 E->getQualifierRange(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003614 E->getMemberLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00003615 Member);
Douglas Gregora16548e2009-08-11 05:31:07 +00003616}
Mike Stump11289f42009-09-09 15:08:12 +00003617
Douglas Gregora16548e2009-08-11 05:31:07 +00003618template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00003619Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003620TreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
3621 assert(false && "Cannot transform abstract class");
3622 return SemaRef.Owned(E->Retain());
3623}
3624
3625template<typename Derived>
3626Sema::OwningExprResult
3627TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003628 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3629 if (LHS.isInvalid())
3630 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003631
Douglas Gregora16548e2009-08-11 05:31:07 +00003632 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3633 if (RHS.isInvalid())
3634 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003635
Douglas Gregora16548e2009-08-11 05:31:07 +00003636 if (!getDerived().AlwaysRebuild() &&
3637 LHS.get() == E->getLHS() &&
3638 RHS.get() == E->getRHS())
Mike Stump11289f42009-09-09 15:08:12 +00003639 return SemaRef.Owned(E->Retain());
3640
Douglas Gregora16548e2009-08-11 05:31:07 +00003641 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3642 move(LHS), move(RHS));
3643}
3644
Mike Stump11289f42009-09-09 15:08:12 +00003645template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00003646Sema::OwningExprResult
3647TreeTransform<Derived>::TransformCompoundAssignOperator(
3648 CompoundAssignOperator *E) {
3649 return getDerived().TransformBinaryOperator(E);
3650}
Mike Stump11289f42009-09-09 15:08:12 +00003651
Douglas Gregora16548e2009-08-11 05:31:07 +00003652template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003653Sema::OwningExprResult
3654TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003655 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3656 if (Cond.isInvalid())
3657 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003658
Douglas Gregora16548e2009-08-11 05:31:07 +00003659 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3660 if (LHS.isInvalid())
3661 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003662
Douglas Gregora16548e2009-08-11 05:31:07 +00003663 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3664 if (RHS.isInvalid())
3665 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003666
Douglas Gregora16548e2009-08-11 05:31:07 +00003667 if (!getDerived().AlwaysRebuild() &&
3668 Cond.get() == E->getCond() &&
3669 LHS.get() == E->getLHS() &&
3670 RHS.get() == E->getRHS())
3671 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003672
3673 return getDerived().RebuildConditionalOperator(move(Cond),
Douglas Gregor7e112b02009-08-26 14:37:04 +00003674 E->getQuestionLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00003675 move(LHS),
Douglas Gregor7e112b02009-08-26 14:37:04 +00003676 E->getColonLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003677 move(RHS));
3678}
Mike Stump11289f42009-09-09 15:08:12 +00003679
3680template<typename Derived>
3681Sema::OwningExprResult
3682TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
Douglas Gregor3da3c062009-10-28 00:29:27 +00003683 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3684
3685 // FIXME: Will we ever have type information here? It seems like we won't,
3686 // so do we even need to transform the type?
Douglas Gregora16548e2009-08-11 05:31:07 +00003687 QualType T = getDerived().TransformType(E->getType());
3688 if (T.isNull())
3689 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003690
Douglas Gregora16548e2009-08-11 05:31:07 +00003691 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3692 if (SubExpr.isInvalid())
3693 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003694
Douglas Gregora16548e2009-08-11 05:31:07 +00003695 if (!getDerived().AlwaysRebuild() &&
3696 T == E->getType() &&
3697 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003698 return SemaRef.Owned(E->Retain());
3699
Douglas Gregora16548e2009-08-11 05:31:07 +00003700 return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
Mike Stump11289f42009-09-09 15:08:12 +00003701 move(SubExpr),
Douglas Gregora16548e2009-08-11 05:31:07 +00003702 E->isLvalueCast());
3703}
Mike Stump11289f42009-09-09 15:08:12 +00003704
Douglas Gregora16548e2009-08-11 05:31:07 +00003705template<typename Derived>
3706Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003707TreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
3708 assert(false && "Cannot transform abstract class");
3709 return SemaRef.Owned(E->Retain());
3710}
3711
3712template<typename Derived>
3713Sema::OwningExprResult
3714TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003715 QualType T;
3716 {
3717 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00003718 SourceLocation TypeStartLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003719 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3720 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003721
Douglas Gregora16548e2009-08-11 05:31:07 +00003722 T = getDerived().TransformType(E->getTypeAsWritten());
3723 if (T.isNull())
3724 return SemaRef.ExprError();
3725 }
Mike Stump11289f42009-09-09 15:08:12 +00003726
Douglas Gregora16548e2009-08-11 05:31:07 +00003727 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3728 if (SubExpr.isInvalid())
3729 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003730
Douglas Gregora16548e2009-08-11 05:31:07 +00003731 if (!getDerived().AlwaysRebuild() &&
3732 T == E->getTypeAsWritten() &&
3733 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003734 return SemaRef.Owned(E->Retain());
3735
Douglas Gregora16548e2009-08-11 05:31:07 +00003736 return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
3737 E->getRParenLoc(),
3738 move(SubExpr));
3739}
Mike Stump11289f42009-09-09 15:08:12 +00003740
Douglas Gregora16548e2009-08-11 05:31:07 +00003741template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003742Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003743TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
3744 QualType T;
3745 {
3746 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00003747 SourceLocation FakeTypeLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003748 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3749 TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003750
Douglas Gregora16548e2009-08-11 05:31:07 +00003751 T = getDerived().TransformType(E->getType());
3752 if (T.isNull())
3753 return SemaRef.ExprError();
3754 }
Mike Stump11289f42009-09-09 15:08:12 +00003755
Douglas Gregora16548e2009-08-11 05:31:07 +00003756 OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3757 if (Init.isInvalid())
3758 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003759
Douglas Gregora16548e2009-08-11 05:31:07 +00003760 if (!getDerived().AlwaysRebuild() &&
3761 T == E->getType() &&
3762 Init.get() == E->getInitializer())
Mike Stump11289f42009-09-09 15:08:12 +00003763 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003764
3765 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3766 /*FIXME:*/E->getInitializer()->getLocEnd(),
3767 move(Init));
3768}
Mike Stump11289f42009-09-09 15:08:12 +00003769
Douglas Gregora16548e2009-08-11 05:31:07 +00003770template<typename Derived>
3771Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003772TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003773 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3774 if (Base.isInvalid())
3775 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003776
Douglas Gregora16548e2009-08-11 05:31:07 +00003777 if (!getDerived().AlwaysRebuild() &&
3778 Base.get() == E->getBase())
Mike Stump11289f42009-09-09 15:08:12 +00003779 return SemaRef.Owned(E->Retain());
3780
Douglas Gregora16548e2009-08-11 05:31:07 +00003781 // FIXME: Bad source location
Mike Stump11289f42009-09-09 15:08:12 +00003782 SourceLocation FakeOperatorLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003783 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3784 return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3785 E->getAccessorLoc(),
3786 E->getAccessor());
3787}
Mike Stump11289f42009-09-09 15:08:12 +00003788
Douglas Gregora16548e2009-08-11 05:31:07 +00003789template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003790Sema::OwningExprResult
3791TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003792 bool InitChanged = false;
Mike Stump11289f42009-09-09 15:08:12 +00003793
Douglas Gregora16548e2009-08-11 05:31:07 +00003794 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3795 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3796 OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3797 if (Init.isInvalid())
3798 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003799
Douglas Gregora16548e2009-08-11 05:31:07 +00003800 InitChanged = InitChanged || Init.get() != E->getInit(I);
3801 Inits.push_back(Init.takeAs<Expr>());
3802 }
Mike Stump11289f42009-09-09 15:08:12 +00003803
Douglas Gregora16548e2009-08-11 05:31:07 +00003804 if (!getDerived().AlwaysRebuild() && !InitChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003805 return SemaRef.Owned(E->Retain());
3806
Douglas Gregora16548e2009-08-11 05:31:07 +00003807 return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3808 E->getRBraceLoc());
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>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003814 Designation Desig;
Mike Stump11289f42009-09-09 15:08:12 +00003815
Douglas Gregorebe10102009-08-20 07:17:43 +00003816 // transform the initializer value
Douglas Gregora16548e2009-08-11 05:31:07 +00003817 OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3818 if (Init.isInvalid())
3819 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003820
Douglas Gregorebe10102009-08-20 07:17:43 +00003821 // transform the designators.
Douglas Gregora16548e2009-08-11 05:31:07 +00003822 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3823 bool ExprChanged = false;
3824 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3825 DEnd = E->designators_end();
3826 D != DEnd; ++D) {
3827 if (D->isFieldDesignator()) {
3828 Desig.AddDesignator(Designator::getField(D->getFieldName(),
3829 D->getDotLoc(),
3830 D->getFieldLoc()));
3831 continue;
3832 }
Mike Stump11289f42009-09-09 15:08:12 +00003833
Douglas Gregora16548e2009-08-11 05:31:07 +00003834 if (D->isArrayDesignator()) {
3835 OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3836 if (Index.isInvalid())
3837 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003838
3839 Desig.AddDesignator(Designator::getArray(Index.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003840 D->getLBracketLoc()));
Mike Stump11289f42009-09-09 15:08:12 +00003841
Douglas Gregora16548e2009-08-11 05:31:07 +00003842 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3843 ArrayExprs.push_back(Index.release());
3844 continue;
3845 }
Mike Stump11289f42009-09-09 15:08:12 +00003846
Douglas Gregora16548e2009-08-11 05:31:07 +00003847 assert(D->isArrayRangeDesignator() && "New kind of designator?");
Mike Stump11289f42009-09-09 15:08:12 +00003848 OwningExprResult Start
Douglas Gregora16548e2009-08-11 05:31:07 +00003849 = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3850 if (Start.isInvalid())
3851 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003852
Douglas Gregora16548e2009-08-11 05:31:07 +00003853 OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3854 if (End.isInvalid())
3855 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003856
3857 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003858 End.get(),
3859 D->getLBracketLoc(),
3860 D->getEllipsisLoc()));
Mike Stump11289f42009-09-09 15:08:12 +00003861
Douglas Gregora16548e2009-08-11 05:31:07 +00003862 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3863 End.get() != E->getArrayRangeEnd(*D);
Mike Stump11289f42009-09-09 15:08:12 +00003864
Douglas Gregora16548e2009-08-11 05:31:07 +00003865 ArrayExprs.push_back(Start.release());
3866 ArrayExprs.push_back(End.release());
3867 }
Mike Stump11289f42009-09-09 15:08:12 +00003868
Douglas Gregora16548e2009-08-11 05:31:07 +00003869 if (!getDerived().AlwaysRebuild() &&
3870 Init.get() == E->getInit() &&
3871 !ExprChanged)
3872 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003873
Douglas Gregora16548e2009-08-11 05:31:07 +00003874 return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3875 E->getEqualOrColonLoc(),
3876 E->usesGNUSyntax(), move(Init));
3877}
Mike Stump11289f42009-09-09 15:08:12 +00003878
Douglas Gregora16548e2009-08-11 05:31:07 +00003879template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003880Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003881TreeTransform<Derived>::TransformImplicitValueInitExpr(
Mike Stump11289f42009-09-09 15:08:12 +00003882 ImplicitValueInitExpr *E) {
Douglas Gregor3da3c062009-10-28 00:29:27 +00003883 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3884
3885 // FIXME: Will we ever have proper type location here? Will we actually
3886 // need to transform the type?
Douglas Gregora16548e2009-08-11 05:31:07 +00003887 QualType T = getDerived().TransformType(E->getType());
3888 if (T.isNull())
3889 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003890
Douglas Gregora16548e2009-08-11 05:31:07 +00003891 if (!getDerived().AlwaysRebuild() &&
3892 T == E->getType())
Mike Stump11289f42009-09-09 15:08:12 +00003893 return SemaRef.Owned(E->Retain());
3894
Douglas Gregora16548e2009-08-11 05:31:07 +00003895 return getDerived().RebuildImplicitValueInitExpr(T);
3896}
Mike Stump11289f42009-09-09 15:08:12 +00003897
Douglas Gregora16548e2009-08-11 05:31:07 +00003898template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003899Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003900TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
3901 // FIXME: Do we want the type as written?
3902 QualType T;
Mike Stump11289f42009-09-09 15:08:12 +00003903
Douglas Gregora16548e2009-08-11 05:31:07 +00003904 {
3905 // FIXME: Source location isn't quite accurate.
3906 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3907 T = getDerived().TransformType(E->getType());
3908 if (T.isNull())
3909 return SemaRef.ExprError();
3910 }
Mike Stump11289f42009-09-09 15:08:12 +00003911
Douglas Gregora16548e2009-08-11 05:31:07 +00003912 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3913 if (SubExpr.isInvalid())
3914 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003915
Douglas Gregora16548e2009-08-11 05:31:07 +00003916 if (!getDerived().AlwaysRebuild() &&
3917 T == E->getType() &&
3918 SubExpr.get() == E->getSubExpr())
3919 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003920
Douglas Gregora16548e2009-08-11 05:31:07 +00003921 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
3922 T, E->getRParenLoc());
3923}
3924
3925template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003926Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003927TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
3928 bool ArgumentChanged = false;
3929 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3930 for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
3931 OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
3932 if (Init.isInvalid())
3933 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003934
Douglas Gregora16548e2009-08-11 05:31:07 +00003935 ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
3936 Inits.push_back(Init.takeAs<Expr>());
3937 }
Mike Stump11289f42009-09-09 15:08:12 +00003938
Douglas Gregora16548e2009-08-11 05:31:07 +00003939 return getDerived().RebuildParenListExpr(E->getLParenLoc(),
3940 move_arg(Inits),
3941 E->getRParenLoc());
3942}
Mike Stump11289f42009-09-09 15:08:12 +00003943
Douglas Gregora16548e2009-08-11 05:31:07 +00003944/// \brief Transform an address-of-label expression.
3945///
3946/// By default, the transformation of an address-of-label expression always
3947/// rebuilds the expression, so that the label identifier can be resolved to
3948/// the corresponding label statement by semantic analysis.
3949template<typename Derived>
3950Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003951TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003952 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
3953 E->getLabel());
3954}
Mike Stump11289f42009-09-09 15:08:12 +00003955
3956template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00003957Sema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
Mike Stump11289f42009-09-09 15:08:12 +00003958 OwningStmtResult SubStmt
Douglas Gregora16548e2009-08-11 05:31:07 +00003959 = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
3960 if (SubStmt.isInvalid())
3961 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003962
Douglas Gregora16548e2009-08-11 05:31:07 +00003963 if (!getDerived().AlwaysRebuild() &&
3964 SubStmt.get() == E->getSubStmt())
3965 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003966
3967 return getDerived().RebuildStmtExpr(E->getLParenLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003968 move(SubStmt),
3969 E->getRParenLoc());
3970}
Mike Stump11289f42009-09-09 15:08:12 +00003971
Douglas Gregora16548e2009-08-11 05:31:07 +00003972template<typename Derived>
3973Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003974TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003975 QualType T1, T2;
3976 {
3977 // FIXME: Source location isn't quite accurate.
3978 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003979
Douglas Gregora16548e2009-08-11 05:31:07 +00003980 T1 = getDerived().TransformType(E->getArgType1());
3981 if (T1.isNull())
3982 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003983
Douglas Gregora16548e2009-08-11 05:31:07 +00003984 T2 = getDerived().TransformType(E->getArgType2());
3985 if (T2.isNull())
3986 return SemaRef.ExprError();
3987 }
3988
3989 if (!getDerived().AlwaysRebuild() &&
3990 T1 == E->getArgType1() &&
3991 T2 == E->getArgType2())
Mike Stump11289f42009-09-09 15:08:12 +00003992 return SemaRef.Owned(E->Retain());
3993
Douglas Gregora16548e2009-08-11 05:31:07 +00003994 return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
3995 T1, T2, E->getRParenLoc());
3996}
Mike Stump11289f42009-09-09 15:08:12 +00003997
Douglas Gregora16548e2009-08-11 05:31:07 +00003998template<typename Derived>
3999Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004000TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004001 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4002 if (Cond.isInvalid())
4003 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004004
Douglas Gregora16548e2009-08-11 05:31:07 +00004005 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4006 if (LHS.isInvalid())
4007 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004008
Douglas Gregora16548e2009-08-11 05:31:07 +00004009 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4010 if (RHS.isInvalid())
4011 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004012
Douglas Gregora16548e2009-08-11 05:31:07 +00004013 if (!getDerived().AlwaysRebuild() &&
4014 Cond.get() == E->getCond() &&
4015 LHS.get() == E->getLHS() &&
4016 RHS.get() == E->getRHS())
Mike Stump11289f42009-09-09 15:08:12 +00004017 return SemaRef.Owned(E->Retain());
4018
Douglas Gregora16548e2009-08-11 05:31:07 +00004019 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4020 move(Cond), move(LHS), move(RHS),
4021 E->getRParenLoc());
4022}
Mike Stump11289f42009-09-09 15:08:12 +00004023
Douglas Gregora16548e2009-08-11 05:31:07 +00004024template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004025Sema::OwningExprResult
4026TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
4027 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004028}
4029
4030template<typename Derived>
4031Sema::OwningExprResult
4032TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4033 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4034 if (Callee.isInvalid())
4035 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004036
Douglas Gregora16548e2009-08-11 05:31:07 +00004037 OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
4038 if (First.isInvalid())
4039 return SemaRef.ExprError();
4040
4041 OwningExprResult Second(SemaRef);
4042 if (E->getNumArgs() == 2) {
4043 Second = getDerived().TransformExpr(E->getArg(1));
4044 if (Second.isInvalid())
4045 return SemaRef.ExprError();
4046 }
Mike Stump11289f42009-09-09 15:08:12 +00004047
Douglas Gregora16548e2009-08-11 05:31:07 +00004048 if (!getDerived().AlwaysRebuild() &&
4049 Callee.get() == E->getCallee() &&
4050 First.get() == E->getArg(0) &&
Mike Stump11289f42009-09-09 15:08:12 +00004051 (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
4052 return SemaRef.Owned(E->Retain());
4053
Douglas Gregora16548e2009-08-11 05:31:07 +00004054 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4055 E->getOperatorLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00004056 move(Callee),
Douglas Gregora16548e2009-08-11 05:31:07 +00004057 move(First),
4058 move(Second));
4059}
Mike Stump11289f42009-09-09 15:08:12 +00004060
Douglas Gregora16548e2009-08-11 05:31:07 +00004061template<typename Derived>
4062Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004063TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004064 return getDerived().TransformCallExpr(E);
4065}
Mike Stump11289f42009-09-09 15:08:12 +00004066
Douglas Gregora16548e2009-08-11 05:31:07 +00004067template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004068Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004069TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
4070 QualType ExplicitTy;
4071 {
4072 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00004073 SourceLocation TypeStartLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00004074 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4075 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004076
Douglas Gregora16548e2009-08-11 05:31:07 +00004077 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
4078 if (ExplicitTy.isNull())
4079 return SemaRef.ExprError();
4080 }
Mike Stump11289f42009-09-09 15:08:12 +00004081
Douglas Gregora16548e2009-08-11 05:31:07 +00004082 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4083 if (SubExpr.isInvalid())
4084 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004085
Douglas Gregora16548e2009-08-11 05:31:07 +00004086 if (!getDerived().AlwaysRebuild() &&
4087 ExplicitTy == E->getTypeAsWritten() &&
4088 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00004089 return SemaRef.Owned(E->Retain());
4090
Douglas Gregora16548e2009-08-11 05:31:07 +00004091 // FIXME: Poor source location information here.
Mike Stump11289f42009-09-09 15:08:12 +00004092 SourceLocation FakeLAngleLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00004093 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4094 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
4095 SourceLocation FakeRParenLoc
4096 = SemaRef.PP.getLocForEndOfToken(
4097 E->getSubExpr()->getSourceRange().getEnd());
4098 return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00004099 E->getStmtClass(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004100 FakeLAngleLoc,
4101 ExplicitTy,
4102 FakeRAngleLoc,
4103 FakeRAngleLoc,
4104 move(SubExpr),
4105 FakeRParenLoc);
4106}
Mike Stump11289f42009-09-09 15:08:12 +00004107
Douglas Gregora16548e2009-08-11 05:31:07 +00004108template<typename Derived>
4109Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004110TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004111 return getDerived().TransformCXXNamedCastExpr(E);
4112}
Mike Stump11289f42009-09-09 15:08:12 +00004113
4114template<typename Derived>
4115Sema::OwningExprResult
4116TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
4117 return getDerived().TransformCXXNamedCastExpr(E);
4118}
4119
Douglas Gregora16548e2009-08-11 05:31:07 +00004120template<typename Derived>
4121Sema::OwningExprResult
4122TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004123 CXXReinterpretCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004124 return getDerived().TransformCXXNamedCastExpr(E);
4125}
Mike Stump11289f42009-09-09 15:08:12 +00004126
Douglas Gregora16548e2009-08-11 05:31:07 +00004127template<typename Derived>
4128Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004129TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004130 return getDerived().TransformCXXNamedCastExpr(E);
4131}
Mike Stump11289f42009-09-09 15:08:12 +00004132
Douglas Gregora16548e2009-08-11 05:31:07 +00004133template<typename Derived>
4134Sema::OwningExprResult
4135TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004136 CXXFunctionalCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004137 QualType ExplicitTy;
4138 {
4139 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004140
Douglas Gregora16548e2009-08-11 05:31:07 +00004141 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
4142 if (ExplicitTy.isNull())
4143 return SemaRef.ExprError();
4144 }
Mike Stump11289f42009-09-09 15:08:12 +00004145
Douglas Gregora16548e2009-08-11 05:31:07 +00004146 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4147 if (SubExpr.isInvalid())
4148 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004149
Douglas Gregora16548e2009-08-11 05:31:07 +00004150 if (!getDerived().AlwaysRebuild() &&
4151 ExplicitTy == E->getTypeAsWritten() &&
4152 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00004153 return SemaRef.Owned(E->Retain());
4154
Douglas Gregora16548e2009-08-11 05:31:07 +00004155 // FIXME: The end of the type's source range is wrong
4156 return getDerived().RebuildCXXFunctionalCastExpr(
4157 /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
4158 ExplicitTy,
4159 /*FIXME:*/E->getSubExpr()->getLocStart(),
4160 move(SubExpr),
4161 E->getRParenLoc());
4162}
Mike Stump11289f42009-09-09 15:08:12 +00004163
Douglas Gregora16548e2009-08-11 05:31:07 +00004164template<typename Derived>
4165Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004166TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004167 if (E->isTypeOperand()) {
4168 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004169
Douglas Gregora16548e2009-08-11 05:31:07 +00004170 QualType T = getDerived().TransformType(E->getTypeOperand());
4171 if (T.isNull())
4172 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004173
Douglas Gregora16548e2009-08-11 05:31:07 +00004174 if (!getDerived().AlwaysRebuild() &&
4175 T == E->getTypeOperand())
4176 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004177
Douglas Gregora16548e2009-08-11 05:31:07 +00004178 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4179 /*FIXME:*/E->getLocStart(),
4180 T,
4181 E->getLocEnd());
4182 }
Mike Stump11289f42009-09-09 15:08:12 +00004183
Douglas Gregora16548e2009-08-11 05:31:07 +00004184 // We don't know whether the expression is potentially evaluated until
4185 // after we perform semantic analysis, so the expression is potentially
4186 // potentially evaluated.
Mike Stump11289f42009-09-09 15:08:12 +00004187 EnterExpressionEvaluationContext Unevaluated(SemaRef,
Douglas Gregora16548e2009-08-11 05:31:07 +00004188 Action::PotentiallyPotentiallyEvaluated);
Mike Stump11289f42009-09-09 15:08:12 +00004189
Douglas Gregora16548e2009-08-11 05:31:07 +00004190 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
4191 if (SubExpr.isInvalid())
4192 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004193
Douglas Gregora16548e2009-08-11 05:31:07 +00004194 if (!getDerived().AlwaysRebuild() &&
4195 SubExpr.get() == E->getExprOperand())
Mike Stump11289f42009-09-09 15:08:12 +00004196 return SemaRef.Owned(E->Retain());
4197
Douglas Gregora16548e2009-08-11 05:31:07 +00004198 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4199 /*FIXME:*/E->getLocStart(),
4200 move(SubExpr),
4201 E->getLocEnd());
4202}
4203
4204template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004205Sema::OwningExprResult
4206TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
4207 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004208}
Mike Stump11289f42009-09-09 15:08:12 +00004209
Douglas Gregora16548e2009-08-11 05:31:07 +00004210template<typename Derived>
4211Sema::OwningExprResult
4212TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004213 CXXNullPtrLiteralExpr *E) {
4214 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004215}
Mike Stump11289f42009-09-09 15:08:12 +00004216
Douglas Gregora16548e2009-08-11 05:31:07 +00004217template<typename Derived>
4218Sema::OwningExprResult
4219TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
4220 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004221
Douglas Gregora16548e2009-08-11 05:31:07 +00004222 QualType T = getDerived().TransformType(E->getType());
4223 if (T.isNull())
4224 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004225
Douglas Gregora16548e2009-08-11 05:31:07 +00004226 if (!getDerived().AlwaysRebuild() &&
4227 T == E->getType())
4228 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004229
Douglas Gregora16548e2009-08-11 05:31:07 +00004230 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
4231}
Mike Stump11289f42009-09-09 15:08:12 +00004232
Douglas Gregora16548e2009-08-11 05:31:07 +00004233template<typename Derived>
4234Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004235TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004236 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4237 if (SubExpr.isInvalid())
4238 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004239
Douglas Gregora16548e2009-08-11 05:31:07 +00004240 if (!getDerived().AlwaysRebuild() &&
4241 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00004242 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004243
4244 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
4245}
Mike Stump11289f42009-09-09 15:08:12 +00004246
Douglas Gregora16548e2009-08-11 05:31:07 +00004247template<typename Derived>
4248Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004249TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
4250 ParmVarDecl *Param
Douglas Gregora16548e2009-08-11 05:31:07 +00004251 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
4252 if (!Param)
4253 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004254
Douglas Gregora16548e2009-08-11 05:31:07 +00004255 if (getDerived().AlwaysRebuild() &&
4256 Param == E->getParam())
4257 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004258
Douglas Gregora16548e2009-08-11 05:31:07 +00004259 return getDerived().RebuildCXXDefaultArgExpr(Param);
4260}
Mike Stump11289f42009-09-09 15:08:12 +00004261
Douglas Gregora16548e2009-08-11 05:31:07 +00004262template<typename Derived>
4263Sema::OwningExprResult
4264TreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
4265 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4266
4267 QualType T = getDerived().TransformType(E->getType());
4268 if (T.isNull())
4269 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004270
Douglas Gregora16548e2009-08-11 05:31:07 +00004271 if (!getDerived().AlwaysRebuild() &&
4272 T == E->getType())
Mike Stump11289f42009-09-09 15:08:12 +00004273 return SemaRef.Owned(E->Retain());
4274
4275 return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004276 /*FIXME:*/E->getTypeBeginLoc(),
4277 T,
4278 E->getRParenLoc());
4279}
Mike Stump11289f42009-09-09 15:08:12 +00004280
Douglas Gregora16548e2009-08-11 05:31:07 +00004281template<typename Derived>
4282Sema::OwningExprResult
4283TreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
Mike Stump11289f42009-09-09 15:08:12 +00004284 VarDecl *Var
Douglas Gregorebe10102009-08-20 07:17:43 +00004285 = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl()));
Douglas Gregora16548e2009-08-11 05:31:07 +00004286 if (!Var)
4287 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004288
Douglas Gregora16548e2009-08-11 05:31:07 +00004289 if (!getDerived().AlwaysRebuild() &&
Mike Stump11289f42009-09-09 15:08:12 +00004290 Var == E->getVarDecl())
Douglas Gregora16548e2009-08-11 05:31:07 +00004291 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004292
4293 return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004294 /*FIXME:*/E->getStartLoc(),
4295 Var);
4296}
Mike Stump11289f42009-09-09 15:08:12 +00004297
Douglas Gregora16548e2009-08-11 05:31:07 +00004298template<typename Derived>
4299Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004300TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004301 // Transform the type that we're allocating
4302 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4303 QualType AllocType = getDerived().TransformType(E->getAllocatedType());
4304 if (AllocType.isNull())
4305 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004306
Douglas Gregora16548e2009-08-11 05:31:07 +00004307 // Transform the size of the array we're allocating (if any).
4308 OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
4309 if (ArraySize.isInvalid())
4310 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004311
Douglas Gregora16548e2009-08-11 05:31:07 +00004312 // Transform the placement arguments (if any).
4313 bool ArgumentChanged = false;
4314 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
4315 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
4316 OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
4317 if (Arg.isInvalid())
4318 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004319
Douglas Gregora16548e2009-08-11 05:31:07 +00004320 ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
4321 PlacementArgs.push_back(Arg.take());
4322 }
Mike Stump11289f42009-09-09 15:08:12 +00004323
Douglas Gregorebe10102009-08-20 07:17:43 +00004324 // transform the constructor arguments (if any).
Douglas Gregora16548e2009-08-11 05:31:07 +00004325 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
4326 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
4327 OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
4328 if (Arg.isInvalid())
4329 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004330
Douglas Gregora16548e2009-08-11 05:31:07 +00004331 ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
4332 ConstructorArgs.push_back(Arg.take());
4333 }
Mike Stump11289f42009-09-09 15:08:12 +00004334
Douglas Gregora16548e2009-08-11 05:31:07 +00004335 if (!getDerived().AlwaysRebuild() &&
4336 AllocType == E->getAllocatedType() &&
4337 ArraySize.get() == E->getArraySize() &&
4338 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00004339 return SemaRef.Owned(E->Retain());
4340
Douglas Gregora16548e2009-08-11 05:31:07 +00004341 return getDerived().RebuildCXXNewExpr(E->getLocStart(),
4342 E->isGlobalNew(),
4343 /*FIXME:*/E->getLocStart(),
4344 move_arg(PlacementArgs),
4345 /*FIXME:*/E->getLocStart(),
4346 E->isParenTypeId(),
4347 AllocType,
4348 /*FIXME:*/E->getLocStart(),
4349 /*FIXME:*/SourceRange(),
4350 move(ArraySize),
4351 /*FIXME:*/E->getLocStart(),
4352 move_arg(ConstructorArgs),
Mike Stump11289f42009-09-09 15:08:12 +00004353 E->getLocEnd());
Douglas Gregora16548e2009-08-11 05:31:07 +00004354}
Mike Stump11289f42009-09-09 15:08:12 +00004355
Douglas Gregora16548e2009-08-11 05:31:07 +00004356template<typename Derived>
4357Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004358TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004359 OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
4360 if (Operand.isInvalid())
4361 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004362
Douglas Gregora16548e2009-08-11 05:31:07 +00004363 if (!getDerived().AlwaysRebuild() &&
Mike Stump11289f42009-09-09 15:08:12 +00004364 Operand.get() == E->getArgument())
4365 return SemaRef.Owned(E->Retain());
4366
Douglas Gregora16548e2009-08-11 05:31:07 +00004367 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
4368 E->isGlobalDelete(),
4369 E->isArrayForm(),
4370 move(Operand));
4371}
Mike Stump11289f42009-09-09 15:08:12 +00004372
Douglas Gregora16548e2009-08-11 05:31:07 +00004373template<typename Derived>
4374Sema::OwningExprResult
Douglas Gregorad8a3362009-09-04 17:36:40 +00004375TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
4376 CXXPseudoDestructorExpr *E) {
4377 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4378 if (Base.isInvalid())
4379 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004380
Douglas Gregorad8a3362009-09-04 17:36:40 +00004381 NestedNameSpecifier *Qualifier
4382 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4383 E->getQualifierRange());
4384 if (E->getQualifier() && !Qualifier)
4385 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004386
Douglas Gregorad8a3362009-09-04 17:36:40 +00004387 QualType DestroyedType;
4388 {
4389 TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
4390 DestroyedType = getDerived().TransformType(E->getDestroyedType());
4391 if (DestroyedType.isNull())
4392 return SemaRef.ExprError();
4393 }
Mike Stump11289f42009-09-09 15:08:12 +00004394
Douglas Gregorad8a3362009-09-04 17:36:40 +00004395 if (!getDerived().AlwaysRebuild() &&
4396 Base.get() == E->getBase() &&
4397 Qualifier == E->getQualifier() &&
4398 DestroyedType == E->getDestroyedType())
4399 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004400
Douglas Gregorad8a3362009-09-04 17:36:40 +00004401 return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
4402 E->getOperatorLoc(),
4403 E->isArrow(),
4404 E->getDestroyedTypeLoc(),
4405 DestroyedType,
4406 Qualifier,
4407 E->getQualifierRange());
4408}
Mike Stump11289f42009-09-09 15:08:12 +00004409
Douglas Gregorad8a3362009-09-04 17:36:40 +00004410template<typename Derived>
4411Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004412TreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004413 UnresolvedFunctionNameExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004414 // There is no transformation we can apply to an unresolved function name.
Mike Stump11289f42009-09-09 15:08:12 +00004415 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004416}
Mike Stump11289f42009-09-09 15:08:12 +00004417
Douglas Gregora16548e2009-08-11 05:31:07 +00004418template<typename Derived>
4419Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004420TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004421 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004422
Douglas Gregora16548e2009-08-11 05:31:07 +00004423 QualType T = getDerived().TransformType(E->getQueriedType());
4424 if (T.isNull())
4425 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004426
Douglas Gregora16548e2009-08-11 05:31:07 +00004427 if (!getDerived().AlwaysRebuild() &&
4428 T == E->getQueriedType())
4429 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004430
Douglas Gregora16548e2009-08-11 05:31:07 +00004431 // FIXME: Bad location information
4432 SourceLocation FakeLParenLoc
4433 = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
Mike Stump11289f42009-09-09 15:08:12 +00004434
4435 return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004436 E->getLocStart(),
4437 /*FIXME:*/FakeLParenLoc,
4438 T,
4439 E->getLocEnd());
4440}
Mike Stump11289f42009-09-09 15:08:12 +00004441
Douglas Gregora16548e2009-08-11 05:31:07 +00004442template<typename Derived>
4443Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004444TreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004445 UnresolvedDeclRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004446 NestedNameSpecifier *NNS
Douglas Gregord019ff62009-10-22 17:20:55 +00004447 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4448 E->getQualifierRange());
Douglas Gregora16548e2009-08-11 05:31:07 +00004449 if (!NNS)
4450 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004451
4452 DeclarationName Name
Douglas Gregorf816bd72009-09-03 22:13:48 +00004453 = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
4454 if (!Name)
4455 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004456
4457 if (!getDerived().AlwaysRebuild() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00004458 NNS == E->getQualifier() &&
4459 Name == E->getDeclName())
Mike Stump11289f42009-09-09 15:08:12 +00004460 return SemaRef.Owned(E->Retain());
4461
4462 return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
Douglas Gregora16548e2009-08-11 05:31:07 +00004463 E->getQualifierRange(),
4464 Name,
4465 E->getLocation(),
4466 /*FIXME:*/false);
4467}
4468
4469template<typename Derived>
4470Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004471TreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) {
Douglas Gregorba91b892009-10-29 17:56:10 +00004472 TemporaryBase Rebase(*this, E->getTemplateNameLoc(), DeclarationName());
4473
Mike Stump11289f42009-09-09 15:08:12 +00004474 TemplateName Template
Douglas Gregora16548e2009-08-11 05:31:07 +00004475 = getDerived().TransformTemplateName(E->getTemplateName());
4476 if (Template.isNull())
4477 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004478
Douglas Gregord019ff62009-10-22 17:20:55 +00004479 NestedNameSpecifier *Qualifier = 0;
4480 if (E->getQualifier()) {
4481 Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4482 E->getQualifierRange());
4483 if (!Qualifier)
4484 return SemaRef.ExprError();
4485 }
4486
John McCall0ad16662009-10-29 08:12:44 +00004487 llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
Douglas Gregora16548e2009-08-11 05:31:07 +00004488 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
John McCall0ad16662009-10-29 08:12:44 +00004489 if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
4490 TransArgs[I]))
Douglas Gregora16548e2009-08-11 05:31:07 +00004491 return SemaRef.ExprError();
Douglas Gregora16548e2009-08-11 05:31:07 +00004492 }
4493
4494 // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
4495 // compare template arguments (yet).
Mike Stump11289f42009-09-09 15:08:12 +00004496
4497 // FIXME: It's possible that we'll find out now that the template name
Douglas Gregora16548e2009-08-11 05:31:07 +00004498 // actually refers to a type, in which case the caller is actually dealing
4499 // with a functional cast. Give a reasonable error message!
Douglas Gregord019ff62009-10-22 17:20:55 +00004500 return getDerived().RebuildTemplateIdExpr(Qualifier, E->getQualifierRange(),
4501 Template, E->getTemplateNameLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004502 E->getLAngleLoc(),
4503 TransArgs.data(),
4504 TransArgs.size(),
4505 E->getRAngleLoc());
4506}
4507
4508template<typename Derived>
4509Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004510TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004511 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4512
4513 QualType T = getDerived().TransformType(E->getType());
4514 if (T.isNull())
4515 return SemaRef.ExprError();
4516
4517 CXXConstructorDecl *Constructor
4518 = cast_or_null<CXXConstructorDecl>(
4519 getDerived().TransformDecl(E->getConstructor()));
4520 if (!Constructor)
4521 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004522
Douglas Gregora16548e2009-08-11 05:31:07 +00004523 bool ArgumentChanged = false;
4524 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Mike Stump11289f42009-09-09 15:08:12 +00004525 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004526 ArgEnd = E->arg_end();
4527 Arg != ArgEnd; ++Arg) {
4528 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4529 if (TransArg.isInvalid())
4530 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004531
Douglas Gregora16548e2009-08-11 05:31:07 +00004532 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4533 Args.push_back(TransArg.takeAs<Expr>());
4534 }
4535
4536 if (!getDerived().AlwaysRebuild() &&
4537 T == E->getType() &&
4538 Constructor == E->getConstructor() &&
4539 !ArgumentChanged)
4540 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004541
Douglas Gregora16548e2009-08-11 05:31:07 +00004542 return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
4543 move_arg(Args));
4544}
Mike Stump11289f42009-09-09 15:08:12 +00004545
Douglas Gregora16548e2009-08-11 05:31:07 +00004546/// \brief Transform a C++ temporary-binding expression.
4547///
Mike Stump11289f42009-09-09 15:08:12 +00004548/// The transformation of a temporary-binding expression always attempts to
4549/// bind a new temporary variable to its subexpression, even if the
Douglas Gregora16548e2009-08-11 05:31:07 +00004550/// subexpression itself did not change, because the temporary variable itself
4551/// must be unique.
4552template<typename Derived>
4553Sema::OwningExprResult
4554TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4555 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4556 if (SubExpr.isInvalid())
4557 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004558
Douglas Gregora16548e2009-08-11 05:31:07 +00004559 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
4560}
Mike Stump11289f42009-09-09 15:08:12 +00004561
4562/// \brief Transform a C++ expression that contains temporaries that should
Douglas Gregora16548e2009-08-11 05:31:07 +00004563/// be destroyed after the expression is evaluated.
4564///
Mike Stump11289f42009-09-09 15:08:12 +00004565/// The transformation of a full expression always attempts to build a new
4566/// CXXExprWithTemporaries expression, even if the
Douglas Gregora16548e2009-08-11 05:31:07 +00004567/// subexpression itself did not change, because it will need to capture the
4568/// the new temporary variables introduced in the subexpression.
4569template<typename Derived>
4570Sema::OwningExprResult
4571TreeTransform<Derived>::TransformCXXExprWithTemporaries(
Mike Stump11289f42009-09-09 15:08:12 +00004572 CXXExprWithTemporaries *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004573 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4574 if (SubExpr.isInvalid())
4575 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004576
Douglas Gregora16548e2009-08-11 05:31:07 +00004577 return SemaRef.Owned(
4578 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
4579 E->shouldDestroyTemporaries()));
4580}
Mike Stump11289f42009-09-09 15:08:12 +00004581
Douglas Gregora16548e2009-08-11 05:31:07 +00004582template<typename Derived>
4583Sema::OwningExprResult
4584TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004585 CXXTemporaryObjectExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004586 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4587 QualType T = getDerived().TransformType(E->getType());
4588 if (T.isNull())
4589 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004590
Douglas Gregora16548e2009-08-11 05:31:07 +00004591 CXXConstructorDecl *Constructor
4592 = cast_or_null<CXXConstructorDecl>(
4593 getDerived().TransformDecl(E->getConstructor()));
4594 if (!Constructor)
4595 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004596
Douglas Gregora16548e2009-08-11 05:31:07 +00004597 bool ArgumentChanged = false;
4598 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4599 Args.reserve(E->getNumArgs());
Mike Stump11289f42009-09-09 15:08:12 +00004600 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004601 ArgEnd = E->arg_end();
4602 Arg != ArgEnd; ++Arg) {
4603 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4604 if (TransArg.isInvalid())
4605 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004606
Douglas Gregora16548e2009-08-11 05:31:07 +00004607 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4608 Args.push_back((Expr *)TransArg.release());
4609 }
Mike Stump11289f42009-09-09 15:08:12 +00004610
Douglas Gregora16548e2009-08-11 05:31:07 +00004611 if (!getDerived().AlwaysRebuild() &&
4612 T == E->getType() &&
4613 Constructor == E->getConstructor() &&
4614 !ArgumentChanged)
4615 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004616
Douglas Gregora16548e2009-08-11 05:31:07 +00004617 // FIXME: Bogus location information
4618 SourceLocation CommaLoc;
4619 if (Args.size() > 1) {
4620 Expr *First = (Expr *)Args[0];
Mike Stump11289f42009-09-09 15:08:12 +00004621 CommaLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00004622 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4623 }
4624 return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4625 T,
4626 /*FIXME:*/E->getTypeBeginLoc(),
4627 move_arg(Args),
4628 &CommaLoc,
4629 E->getLocEnd());
4630}
Mike Stump11289f42009-09-09 15:08:12 +00004631
Douglas Gregora16548e2009-08-11 05:31:07 +00004632template<typename Derived>
4633Sema::OwningExprResult
4634TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004635 CXXUnresolvedConstructExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004636 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4637 QualType T = getDerived().TransformType(E->getTypeAsWritten());
4638 if (T.isNull())
4639 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004640
Douglas Gregora16548e2009-08-11 05:31:07 +00004641 bool ArgumentChanged = false;
4642 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4643 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4644 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4645 ArgEnd = E->arg_end();
4646 Arg != ArgEnd; ++Arg) {
4647 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4648 if (TransArg.isInvalid())
4649 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004650
Douglas Gregora16548e2009-08-11 05:31:07 +00004651 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4652 FakeCommaLocs.push_back(
4653 SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4654 Args.push_back(TransArg.takeAs<Expr>());
4655 }
Mike Stump11289f42009-09-09 15:08:12 +00004656
Douglas Gregora16548e2009-08-11 05:31:07 +00004657 if (!getDerived().AlwaysRebuild() &&
4658 T == E->getTypeAsWritten() &&
4659 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00004660 return SemaRef.Owned(E->Retain());
4661
Douglas Gregora16548e2009-08-11 05:31:07 +00004662 // FIXME: we're faking the locations of the commas
4663 return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4664 T,
4665 E->getLParenLoc(),
4666 move_arg(Args),
4667 FakeCommaLocs.data(),
4668 E->getRParenLoc());
4669}
Mike Stump11289f42009-09-09 15:08:12 +00004670
Douglas Gregora16548e2009-08-11 05:31:07 +00004671template<typename Derived>
4672Sema::OwningExprResult
4673TreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004674 CXXUnresolvedMemberExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004675 // Transform the base of the expression.
4676 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4677 if (Base.isInvalid())
4678 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004679
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004680 // Start the member reference and compute the object's type.
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004681 Sema::TypeTy *ObjectType = 0;
Mike Stump11289f42009-09-09 15:08:12 +00004682 Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004683 E->getOperatorLoc(),
4684 E->isArrow()? tok::arrow : tok::period,
4685 ObjectType);
4686 if (Base.isInvalid())
4687 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004688
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004689 // Transform the first part of the nested-name-specifier that qualifies
4690 // the member name.
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004691 NamedDecl *FirstQualifierInScope
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004692 = getDerived().TransformFirstQualifierInScope(
4693 E->getFirstQualifierFoundInScope(),
4694 E->getQualifierRange().getBegin());
Mike Stump11289f42009-09-09 15:08:12 +00004695
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004696 NestedNameSpecifier *Qualifier = 0;
4697 if (E->getQualifier()) {
4698 Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4699 E->getQualifierRange(),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004700 QualType::getFromOpaquePtr(ObjectType),
4701 FirstQualifierInScope);
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004702 if (!Qualifier)
4703 return SemaRef.ExprError();
4704 }
Mike Stump11289f42009-09-09 15:08:12 +00004705
4706 DeclarationName Name
Douglas Gregorc59e5612009-10-19 22:04:39 +00004707 = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
4708 QualType::getFromOpaquePtr(ObjectType));
Douglas Gregorf816bd72009-09-03 22:13:48 +00004709 if (!Name)
4710 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004711
Douglas Gregor308047d2009-09-09 00:23:06 +00004712 if (!E->hasExplicitTemplateArgumentList()) {
4713 // This is a reference to a member without an explicitly-specified
4714 // template argument list. Optimize for this common case.
4715 if (!getDerived().AlwaysRebuild() &&
4716 Base.get() == E->getBase() &&
4717 Qualifier == E->getQualifier() &&
4718 Name == E->getMember() &&
4719 FirstQualifierInScope == E->getFirstQualifierFoundInScope())
Mike Stump11289f42009-09-09 15:08:12 +00004720 return SemaRef.Owned(E->Retain());
4721
Douglas Gregor308047d2009-09-09 00:23:06 +00004722 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4723 E->isArrow(),
4724 E->getOperatorLoc(),
4725 Qualifier,
4726 E->getQualifierRange(),
4727 Name,
4728 E->getMemberLoc(),
4729 FirstQualifierInScope);
4730 }
4731
4732 // FIXME: This is an ugly hack, which forces the same template name to
4733 // be looked up multiple times. Yuck!
4734 // FIXME: This also won't work for, e.g., x->template operator+<int>
4735 TemplateName OrigTemplateName
4736 = SemaRef.Context.getDependentTemplateName(0, Name.getAsIdentifierInfo());
Mike Stump11289f42009-09-09 15:08:12 +00004737
4738 TemplateName Template
4739 = getDerived().TransformTemplateName(OrigTemplateName,
Douglas Gregor308047d2009-09-09 00:23:06 +00004740 QualType::getFromOpaquePtr(ObjectType));
4741 if (Template.isNull())
4742 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004743
John McCall0ad16662009-10-29 08:12:44 +00004744 llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
Douglas Gregor308047d2009-09-09 00:23:06 +00004745 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
John McCall0ad16662009-10-29 08:12:44 +00004746 if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
4747 TransArgs[I]))
Douglas Gregor308047d2009-09-09 00:23:06 +00004748 return SemaRef.ExprError();
Douglas Gregor308047d2009-09-09 00:23:06 +00004749 }
Mike Stump11289f42009-09-09 15:08:12 +00004750
Douglas Gregora16548e2009-08-11 05:31:07 +00004751 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4752 E->isArrow(),
4753 E->getOperatorLoc(),
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004754 Qualifier,
4755 E->getQualifierRange(),
Douglas Gregor308047d2009-09-09 00:23:06 +00004756 Template,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004757 E->getMemberLoc(),
Douglas Gregor308047d2009-09-09 00:23:06 +00004758 FirstQualifierInScope,
4759 E->getLAngleLoc(),
4760 TransArgs.data(),
4761 TransArgs.size(),
4762 E->getRAngleLoc());
Douglas Gregora16548e2009-08-11 05:31:07 +00004763}
4764
4765template<typename Derived>
4766Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004767TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
4768 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004769}
4770
Mike Stump11289f42009-09-09 15:08:12 +00004771template<typename Derived>
4772Sema::OwningExprResult
4773TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004774 // FIXME: poor source location
4775 TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
4776 QualType EncodedType = getDerived().TransformType(E->getEncodedType());
4777 if (EncodedType.isNull())
4778 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004779
Douglas Gregora16548e2009-08-11 05:31:07 +00004780 if (!getDerived().AlwaysRebuild() &&
4781 EncodedType == E->getEncodedType())
Mike Stump11289f42009-09-09 15:08:12 +00004782 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004783
4784 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
4785 EncodedType,
4786 E->getRParenLoc());
4787}
Mike Stump11289f42009-09-09 15:08:12 +00004788
Douglas Gregora16548e2009-08-11 05:31:07 +00004789template<typename Derived>
4790Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004791TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004792 // FIXME: Implement this!
4793 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004794 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004795}
4796
Mike Stump11289f42009-09-09 15:08:12 +00004797template<typename Derived>
4798Sema::OwningExprResult
4799TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
4800 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004801}
4802
Mike Stump11289f42009-09-09 15:08:12 +00004803template<typename Derived>
4804Sema::OwningExprResult
4805TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
4806 ObjCProtocolDecl *Protocol
Douglas Gregora16548e2009-08-11 05:31:07 +00004807 = cast_or_null<ObjCProtocolDecl>(
4808 getDerived().TransformDecl(E->getProtocol()));
4809 if (!Protocol)
4810 return SemaRef.ExprError();
4811
4812 if (!getDerived().AlwaysRebuild() &&
4813 Protocol == E->getProtocol())
Mike Stump11289f42009-09-09 15:08:12 +00004814 return SemaRef.Owned(E->Retain());
4815
Douglas Gregora16548e2009-08-11 05:31:07 +00004816 return getDerived().RebuildObjCProtocolExpr(Protocol,
4817 E->getAtLoc(),
4818 /*FIXME:*/E->getAtLoc(),
4819 /*FIXME:*/E->getAtLoc(),
4820 E->getRParenLoc());
Mike Stump11289f42009-09-09 15:08:12 +00004821
Douglas Gregora16548e2009-08-11 05:31:07 +00004822}
4823
Mike Stump11289f42009-09-09 15:08:12 +00004824template<typename Derived>
4825Sema::OwningExprResult
4826TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004827 // FIXME: Implement this!
4828 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004829 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004830}
4831
Mike Stump11289f42009-09-09 15:08:12 +00004832template<typename Derived>
4833Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004834TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
4835 // FIXME: Implement this!
4836 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004837 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004838}
4839
Mike Stump11289f42009-09-09 15:08:12 +00004840template<typename Derived>
4841Sema::OwningExprResult
Fariborz Jahanian9a846652009-08-20 17:02:02 +00004842TreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004843 ObjCImplicitSetterGetterRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004844 // FIXME: Implement this!
4845 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004846 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004847}
4848
Mike Stump11289f42009-09-09 15:08:12 +00004849template<typename Derived>
4850Sema::OwningExprResult
4851TreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004852 // FIXME: Implement this!
4853 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004854 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004855}
4856
Mike Stump11289f42009-09-09 15:08:12 +00004857template<typename Derived>
4858Sema::OwningExprResult
4859TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004860 // FIXME: Implement this!
4861 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004862 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004863}
4864
Mike Stump11289f42009-09-09 15:08:12 +00004865template<typename Derived>
4866Sema::OwningExprResult
4867TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004868 bool ArgumentChanged = false;
4869 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
4870 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
4871 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
4872 if (SubExpr.isInvalid())
4873 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004874
Douglas Gregora16548e2009-08-11 05:31:07 +00004875 ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
4876 SubExprs.push_back(SubExpr.takeAs<Expr>());
4877 }
Mike Stump11289f42009-09-09 15:08:12 +00004878
Douglas Gregora16548e2009-08-11 05:31:07 +00004879 if (!getDerived().AlwaysRebuild() &&
4880 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00004881 return SemaRef.Owned(E->Retain());
4882
Douglas Gregora16548e2009-08-11 05:31:07 +00004883 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
4884 move_arg(SubExprs),
4885 E->getRParenLoc());
4886}
4887
Mike Stump11289f42009-09-09 15:08:12 +00004888template<typename Derived>
4889Sema::OwningExprResult
4890TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004891 // FIXME: Implement this!
4892 assert(false && "Cannot transform block expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004893 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004894}
4895
Mike Stump11289f42009-09-09 15:08:12 +00004896template<typename Derived>
4897Sema::OwningExprResult
4898TreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004899 // FIXME: Implement this!
4900 assert(false && "Cannot transform block-related expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004901 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004902}
Mike Stump11289f42009-09-09 15:08:12 +00004903
Douglas Gregora16548e2009-08-11 05:31:07 +00004904//===----------------------------------------------------------------------===//
Douglas Gregord6ff3322009-08-04 16:50:30 +00004905// Type reconstruction
4906//===----------------------------------------------------------------------===//
4907
Mike Stump11289f42009-09-09 15:08:12 +00004908template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00004909QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType) {
John McCall8ccfcb52009-09-24 19:53:00 +00004910 return SemaRef.BuildPointerType(PointeeType, Qualifiers(),
Douglas Gregord6ff3322009-08-04 16:50:30 +00004911 getDerived().getBaseLocation(),
4912 getDerived().getBaseEntity());
4913}
4914
Mike Stump11289f42009-09-09 15:08:12 +00004915template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00004916QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType) {
John McCall8ccfcb52009-09-24 19:53:00 +00004917 return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(),
Douglas Gregord6ff3322009-08-04 16:50:30 +00004918 getDerived().getBaseLocation(),
4919 getDerived().getBaseEntity());
4920}
4921
Mike Stump11289f42009-09-09 15:08:12 +00004922template<typename Derived>
4923QualType
Douglas Gregord6ff3322009-08-04 16:50:30 +00004924TreeTransform<Derived>::RebuildLValueReferenceType(QualType ReferentType) {
John McCall8ccfcb52009-09-24 19:53:00 +00004925 return SemaRef.BuildReferenceType(ReferentType, true, Qualifiers(),
Douglas Gregord6ff3322009-08-04 16:50:30 +00004926 getDerived().getBaseLocation(),
4927 getDerived().getBaseEntity());
4928}
4929
4930template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004931QualType
4932TreeTransform<Derived>::RebuildRValueReferenceType(QualType ReferentType) {
John McCall8ccfcb52009-09-24 19:53:00 +00004933 return SemaRef.BuildReferenceType(ReferentType, false, Qualifiers(),
Mike Stump11289f42009-09-09 15:08:12 +00004934 getDerived().getBaseLocation(),
4935 getDerived().getBaseEntity());
4936}
4937
4938template<typename Derived>
4939QualType TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004940 QualType ClassType) {
John McCall8ccfcb52009-09-24 19:53:00 +00004941 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
Douglas Gregord6ff3322009-08-04 16:50:30 +00004942 getDerived().getBaseLocation(),
4943 getDerived().getBaseEntity());
4944}
4945
4946template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004947QualType
John McCall550e0c22009-10-21 00:40:46 +00004948TreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType) {
4949 return SemaRef.BuildPointerType(PointeeType, Qualifiers(),
4950 getDerived().getBaseLocation(),
4951 getDerived().getBaseEntity());
4952}
4953
4954template<typename Derived>
4955QualType
Douglas Gregord6ff3322009-08-04 16:50:30 +00004956TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
4957 ArrayType::ArraySizeModifier SizeMod,
4958 const llvm::APInt *Size,
4959 Expr *SizeExpr,
4960 unsigned IndexTypeQuals,
4961 SourceRange BracketsRange) {
4962 if (SizeExpr || !Size)
4963 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
4964 IndexTypeQuals, BracketsRange,
4965 getDerived().getBaseEntity());
Mike Stump11289f42009-09-09 15:08:12 +00004966
4967 QualType Types[] = {
4968 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
4969 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
4970 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
Douglas Gregord6ff3322009-08-04 16:50:30 +00004971 };
4972 const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
4973 QualType SizeType;
4974 for (unsigned I = 0; I != NumTypes; ++I)
4975 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
4976 SizeType = Types[I];
4977 break;
4978 }
Mike Stump11289f42009-09-09 15:08:12 +00004979
Douglas Gregord6ff3322009-08-04 16:50:30 +00004980 if (SizeType.isNull())
4981 SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
Mike Stump11289f42009-09-09 15:08:12 +00004982
Douglas Gregord6ff3322009-08-04 16:50:30 +00004983 IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
Mike Stump11289f42009-09-09 15:08:12 +00004984 return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004985 IndexTypeQuals, BracketsRange,
Mike Stump11289f42009-09-09 15:08:12 +00004986 getDerived().getBaseEntity());
Douglas Gregord6ff3322009-08-04 16:50:30 +00004987}
Mike Stump11289f42009-09-09 15:08:12 +00004988
Douglas Gregord6ff3322009-08-04 16:50:30 +00004989template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004990QualType
4991TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004992 ArrayType::ArraySizeModifier SizeMod,
4993 const llvm::APInt &Size,
4994 unsigned IndexTypeQuals) {
Mike Stump11289f42009-09-09 15:08:12 +00004995 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004996 IndexTypeQuals, SourceRange());
4997}
4998
4999template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005000QualType
Mike Stump11289f42009-09-09 15:08:12 +00005001TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005002 ArrayType::ArraySizeModifier SizeMod,
5003 unsigned IndexTypeQuals) {
Mike Stump11289f42009-09-09 15:08:12 +00005004 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005005 IndexTypeQuals, SourceRange());
5006}
Mike Stump11289f42009-09-09 15:08:12 +00005007
Douglas Gregord6ff3322009-08-04 16:50:30 +00005008template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005009QualType
5010TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005011 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +00005012 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005013 unsigned IndexTypeQuals,
5014 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00005015 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005016 SizeExpr.takeAs<Expr>(),
5017 IndexTypeQuals, BracketsRange);
5018}
5019
5020template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005021QualType
5022TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005023 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +00005024 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005025 unsigned IndexTypeQuals,
5026 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00005027 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005028 SizeExpr.takeAs<Expr>(),
5029 IndexTypeQuals, BracketsRange);
5030}
5031
5032template<typename Derived>
5033QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
5034 unsigned NumElements) {
5035 // FIXME: semantic checking!
5036 return SemaRef.Context.getVectorType(ElementType, NumElements);
5037}
Mike Stump11289f42009-09-09 15:08:12 +00005038
Douglas Gregord6ff3322009-08-04 16:50:30 +00005039template<typename Derived>
5040QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
5041 unsigned NumElements,
5042 SourceLocation AttributeLoc) {
5043 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
5044 NumElements, true);
5045 IntegerLiteral *VectorSize
Mike Stump11289f42009-09-09 15:08:12 +00005046 = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005047 AttributeLoc);
5048 return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
5049 AttributeLoc);
5050}
Mike Stump11289f42009-09-09 15:08:12 +00005051
Douglas Gregord6ff3322009-08-04 16:50:30 +00005052template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005053QualType
5054TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
Douglas Gregora16548e2009-08-11 05:31:07 +00005055 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005056 SourceLocation AttributeLoc) {
5057 return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
5058}
Mike Stump11289f42009-09-09 15:08:12 +00005059
Douglas Gregord6ff3322009-08-04 16:50:30 +00005060template<typename Derived>
5061QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
Mike Stump11289f42009-09-09 15:08:12 +00005062 QualType *ParamTypes,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005063 unsigned NumParamTypes,
Mike Stump11289f42009-09-09 15:08:12 +00005064 bool Variadic,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005065 unsigned Quals) {
Mike Stump11289f42009-09-09 15:08:12 +00005066 return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005067 Quals,
5068 getDerived().getBaseLocation(),
5069 getDerived().getBaseEntity());
5070}
Mike Stump11289f42009-09-09 15:08:12 +00005071
Douglas Gregord6ff3322009-08-04 16:50:30 +00005072template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00005073QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
5074 return SemaRef.Context.getFunctionNoProtoType(T);
5075}
5076
5077template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00005078QualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00005079 return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
5080}
5081
5082template<typename Derived>
5083QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
5084 return SemaRef.Context.getTypeOfType(Underlying);
5085}
5086
5087template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00005088QualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00005089 return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
5090}
5091
5092template<typename Derived>
5093QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
John McCall0ad16662009-10-29 08:12:44 +00005094 TemplateName Template,
5095 SourceLocation TemplateNameLoc,
5096 SourceLocation LAngleLoc,
5097 const TemplateArgumentLoc *Args,
5098 unsigned NumArgs,
5099 SourceLocation RAngleLoc) {
5100 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, LAngleLoc,
5101 Args, NumArgs, RAngleLoc);
Douglas Gregord6ff3322009-08-04 16:50:30 +00005102}
Mike Stump11289f42009-09-09 15:08:12 +00005103
Douglas Gregor1135c352009-08-06 05:28:30 +00005104template<typename Derived>
5105NestedNameSpecifier *
5106TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5107 SourceRange Range,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00005108 IdentifierInfo &II,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00005109 QualType ObjectType,
5110 NamedDecl *FirstQualifierInScope) {
Douglas Gregor1135c352009-08-06 05:28:30 +00005111 CXXScopeSpec SS;
5112 // FIXME: The source location information is all wrong.
5113 SS.setRange(Range);
5114 SS.setScopeRep(Prefix);
5115 return static_cast<NestedNameSpecifier *>(
Mike Stump11289f42009-09-09 15:08:12 +00005116 SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
Douglas Gregore861bac2009-08-25 22:51:20 +00005117 Range.getEnd(), II,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00005118 ObjectType,
5119 FirstQualifierInScope,
Douglas Gregore861bac2009-08-25 22:51:20 +00005120 false));
Douglas Gregor1135c352009-08-06 05:28:30 +00005121}
5122
5123template<typename Derived>
5124NestedNameSpecifier *
5125TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5126 SourceRange Range,
5127 NamespaceDecl *NS) {
5128 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
5129}
5130
5131template<typename Derived>
5132NestedNameSpecifier *
5133TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5134 SourceRange Range,
5135 bool TemplateKW,
5136 QualType T) {
5137 if (T->isDependentType() || T->isRecordType() ||
5138 (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
John McCall8ccfcb52009-09-24 19:53:00 +00005139 assert(!T.hasQualifiers() && "Can't get cv-qualifiers here");
Douglas Gregor1135c352009-08-06 05:28:30 +00005140 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
5141 T.getTypePtr());
5142 }
Mike Stump11289f42009-09-09 15:08:12 +00005143
Douglas Gregor1135c352009-08-06 05:28:30 +00005144 SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
5145 return 0;
5146}
Mike Stump11289f42009-09-09 15:08:12 +00005147
Douglas Gregor71dc5092009-08-06 06:41:21 +00005148template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005149TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00005150TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5151 bool TemplateKW,
5152 TemplateDecl *Template) {
Mike Stump11289f42009-09-09 15:08:12 +00005153 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
Douglas Gregor71dc5092009-08-06 06:41:21 +00005154 Template);
5155}
5156
5157template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005158TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00005159TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5160 bool TemplateKW,
5161 OverloadedFunctionDecl *Ovl) {
5162 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
5163}
5164
5165template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005166TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00005167TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
Douglas Gregor308047d2009-09-09 00:23:06 +00005168 const IdentifierInfo &II,
5169 QualType ObjectType) {
Douglas Gregor71dc5092009-08-06 06:41:21 +00005170 CXXScopeSpec SS;
5171 SS.setRange(SourceRange(getDerived().getBaseLocation()));
Mike Stump11289f42009-09-09 15:08:12 +00005172 SS.setScopeRep(Qualifier);
Douglas Gregor308047d2009-09-09 00:23:06 +00005173 return getSema().ActOnDependentTemplateName(
5174 /*FIXME:*/getDerived().getBaseLocation(),
5175 II,
5176 /*FIXME:*/getDerived().getBaseLocation(),
5177 SS,
5178 ObjectType.getAsOpaquePtr())
5179 .template getAsVal<TemplateName>();
Douglas Gregor71dc5092009-08-06 06:41:21 +00005180}
Mike Stump11289f42009-09-09 15:08:12 +00005181
Douglas Gregora16548e2009-08-11 05:31:07 +00005182template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005183Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00005184TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
5185 SourceLocation OpLoc,
5186 ExprArg Callee,
5187 ExprArg First,
5188 ExprArg Second) {
5189 Expr *FirstExpr = (Expr *)First.get();
5190 Expr *SecondExpr = (Expr *)Second.get();
Sebastian Redladba46e2009-10-29 20:17:01 +00005191 DeclRefExpr *DRE
5192 = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts());
Douglas Gregora16548e2009-08-11 05:31:07 +00005193 bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
Mike Stump11289f42009-09-09 15:08:12 +00005194
Douglas Gregora16548e2009-08-11 05:31:07 +00005195 // Determine whether this should be a builtin operation.
Sebastian Redladba46e2009-10-29 20:17:01 +00005196 if (Op == OO_Subscript) {
5197 if (!FirstExpr->getType()->isOverloadableType() &&
5198 !SecondExpr->getType()->isOverloadableType())
5199 return getSema().CreateBuiltinArraySubscriptExpr(move(First),
5200 DRE->getLocStart(),
5201 move(Second), OpLoc);
5202 } else if (SecondExpr == 0 || isPostIncDec) {
Douglas Gregora16548e2009-08-11 05:31:07 +00005203 if (!FirstExpr->getType()->isOverloadableType()) {
5204 // The argument is not of overloadable type, so try to create a
5205 // built-in unary operation.
Mike Stump11289f42009-09-09 15:08:12 +00005206 UnaryOperator::Opcode Opc
Douglas Gregora16548e2009-08-11 05:31:07 +00005207 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
Mike Stump11289f42009-09-09 15:08:12 +00005208
Douglas Gregora16548e2009-08-11 05:31:07 +00005209 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
5210 }
5211 } else {
Mike Stump11289f42009-09-09 15:08:12 +00005212 if (!FirstExpr->getType()->isOverloadableType() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00005213 !SecondExpr->getType()->isOverloadableType()) {
5214 // Neither of the arguments is an overloadable type, so try to
5215 // create a built-in binary operation.
5216 BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
Mike Stump11289f42009-09-09 15:08:12 +00005217 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00005218 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
5219 if (Result.isInvalid())
5220 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00005221
Douglas Gregora16548e2009-08-11 05:31:07 +00005222 First.release();
5223 Second.release();
5224 return move(Result);
5225 }
5226 }
Mike Stump11289f42009-09-09 15:08:12 +00005227
5228 // Compute the transformed set of functions (and function templates) to be
Douglas Gregora16548e2009-08-11 05:31:07 +00005229 // used during overload resolution.
5230 Sema::FunctionSet Functions;
Mike Stump11289f42009-09-09 15:08:12 +00005231
Douglas Gregora16548e2009-08-11 05:31:07 +00005232 // FIXME: Do we have to check
5233 // IsAcceptableNonMemberOperatorCandidate for each of these?
Douglas Gregor32e2c842009-09-01 16:58:52 +00005234 for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F)
Douglas Gregora16548e2009-08-11 05:31:07 +00005235 Functions.insert(*F);
Mike Stump11289f42009-09-09 15:08:12 +00005236
Douglas Gregora16548e2009-08-11 05:31:07 +00005237 // Add any functions found via argument-dependent lookup.
5238 Expr *Args[2] = { FirstExpr, SecondExpr };
5239 unsigned NumArgs = 1 + (SecondExpr != 0);
Mike Stump11289f42009-09-09 15:08:12 +00005240 DeclarationName OpName
Douglas Gregora16548e2009-08-11 05:31:07 +00005241 = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
Sebastian Redlc057f422009-10-23 19:23:15 +00005242 SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs,
5243 Functions);
Mike Stump11289f42009-09-09 15:08:12 +00005244
Douglas Gregora16548e2009-08-11 05:31:07 +00005245 // Create the overloaded operator invocation for unary operators.
5246 if (NumArgs == 1 || isPostIncDec) {
Mike Stump11289f42009-09-09 15:08:12 +00005247 UnaryOperator::Opcode Opc
Douglas Gregora16548e2009-08-11 05:31:07 +00005248 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
5249 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
5250 }
Mike Stump11289f42009-09-09 15:08:12 +00005251
Sebastian Redladba46e2009-10-29 20:17:01 +00005252 if (Op == OO_Subscript)
5253 return SemaRef.CreateOverloadedArraySubscriptExpr(DRE->getLocStart(), OpLoc,
5254 move(First),move(Second));
5255
Douglas Gregora16548e2009-08-11 05:31:07 +00005256 // Create the overloaded operator invocation for binary operators.
Mike Stump11289f42009-09-09 15:08:12 +00005257 BinaryOperator::Opcode Opc =
Douglas Gregora16548e2009-08-11 05:31:07 +00005258 BinaryOperator::getOverloadedOpcode(Op);
Mike Stump11289f42009-09-09 15:08:12 +00005259 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00005260 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
5261 if (Result.isInvalid())
5262 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00005263
Douglas Gregora16548e2009-08-11 05:31:07 +00005264 First.release();
5265 Second.release();
Mike Stump11289f42009-09-09 15:08:12 +00005266 return move(Result);
Douglas Gregora16548e2009-08-11 05:31:07 +00005267}
Mike Stump11289f42009-09-09 15:08:12 +00005268
Douglas Gregord6ff3322009-08-04 16:50:30 +00005269} // end namespace clang
5270
5271#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H