blob: 8a5699e7ec048461d1203d15e66811af6b67c906 [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
John McCall70dd5f62009-10-30 00:06:24 +0000313 QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
314
Douglas Gregorc59e5612009-10-19 22:04:39 +0000315 QualType
316 TransformTemplateSpecializationType(const TemplateSpecializationType *T,
317 QualType ObjectType);
John McCall0ad16662009-10-29 08:12:44 +0000318
319 QualType
320 TransformTemplateSpecializationType(TypeLocBuilder &TLB,
321 TemplateSpecializationTypeLoc TL,
322 QualType ObjectType);
Douglas Gregorc59e5612009-10-19 22:04:39 +0000323
Douglas Gregorebe10102009-08-20 07:17:43 +0000324 OwningStmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
Mike Stump11289f42009-09-09 15:08:12 +0000325
Douglas Gregorebe10102009-08-20 07:17:43 +0000326#define STMT(Node, Parent) \
327 OwningStmtResult Transform##Node(Node *S);
Douglas Gregora16548e2009-08-11 05:31:07 +0000328#define EXPR(Node, Parent) \
329 OwningExprResult Transform##Node(Node *E);
330#define ABSTRACT_EXPR(Node, Parent)
331#include "clang/AST/StmtNodes.def"
Mike Stump11289f42009-09-09 15:08:12 +0000332
Douglas Gregord6ff3322009-08-04 16:50:30 +0000333 /// \brief Build a new pointer type given its pointee type.
334 ///
335 /// By default, performs semantic analysis when building the pointer type.
336 /// Subclasses may override this routine to provide different behavior.
John McCall70dd5f62009-10-30 00:06:24 +0000337 QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
Douglas Gregord6ff3322009-08-04 16:50:30 +0000338
339 /// \brief Build a new block pointer type given its pointee type.
340 ///
Mike Stump11289f42009-09-09 15:08:12 +0000341 /// By default, performs semantic analysis when building the block pointer
Douglas Gregord6ff3322009-08-04 16:50:30 +0000342 /// type. Subclasses may override this routine to provide different behavior.
John McCall70dd5f62009-10-30 00:06:24 +0000343 QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
Douglas Gregord6ff3322009-08-04 16:50:30 +0000344
John McCall70dd5f62009-10-30 00:06:24 +0000345 /// \brief Build a new reference type given the type it references.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000346 ///
John McCall70dd5f62009-10-30 00:06:24 +0000347 /// By default, performs semantic analysis when building the
348 /// reference type. Subclasses may override this routine to provide
349 /// different behavior.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000350 ///
John McCall70dd5f62009-10-30 00:06:24 +0000351 /// \param LValue whether the type was written with an lvalue sigil
352 /// or an rvalue sigil.
353 QualType RebuildReferenceType(QualType ReferentType,
354 bool LValue,
355 SourceLocation Sigil);
Mike Stump11289f42009-09-09 15:08:12 +0000356
Douglas Gregord6ff3322009-08-04 16:50:30 +0000357 /// \brief Build a new member pointer type given the pointee type and the
358 /// class type it refers into.
359 ///
360 /// By default, performs semantic analysis when building the member pointer
361 /// type. Subclasses may override this routine to provide different behavior.
John McCall70dd5f62009-10-30 00:06:24 +0000362 QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
363 SourceLocation Sigil);
Mike Stump11289f42009-09-09 15:08:12 +0000364
John McCall550e0c22009-10-21 00:40:46 +0000365 /// \brief Build a new Objective C object pointer type.
John McCall70dd5f62009-10-30 00:06:24 +0000366 QualType RebuildObjCObjectPointerType(QualType PointeeType,
367 SourceLocation Sigil);
John McCall550e0c22009-10-21 00:40:46 +0000368
Douglas Gregord6ff3322009-08-04 16:50:30 +0000369 /// \brief Build a new array type given the element type, size
370 /// modifier, size of the array (if known), size expression, and index type
371 /// qualifiers.
372 ///
373 /// By default, performs semantic analysis when building the array type.
374 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000375 /// Also by default, all of the other Rebuild*Array
Douglas Gregord6ff3322009-08-04 16:50:30 +0000376 QualType RebuildArrayType(QualType ElementType,
377 ArrayType::ArraySizeModifier SizeMod,
378 const llvm::APInt *Size,
379 Expr *SizeExpr,
380 unsigned IndexTypeQuals,
381 SourceRange BracketsRange);
Mike Stump11289f42009-09-09 15:08:12 +0000382
Douglas Gregord6ff3322009-08-04 16:50:30 +0000383 /// \brief Build a new constant array type given the element type, size
384 /// modifier, (known) size of the array, and index type qualifiers.
385 ///
386 /// By default, performs semantic analysis when building the array type.
387 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000388 QualType RebuildConstantArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000389 ArrayType::ArraySizeModifier SizeMod,
390 const llvm::APInt &Size,
John McCall70dd5f62009-10-30 00:06:24 +0000391 unsigned IndexTypeQuals,
392 SourceRange BracketsRange);
Douglas Gregord6ff3322009-08-04 16:50:30 +0000393
Douglas Gregord6ff3322009-08-04 16:50:30 +0000394 /// \brief Build a new incomplete array type given the element type, size
395 /// modifier, and index type qualifiers.
396 ///
397 /// By default, performs semantic analysis when building the array type.
398 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000399 QualType RebuildIncompleteArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000400 ArrayType::ArraySizeModifier SizeMod,
John McCall70dd5f62009-10-30 00:06:24 +0000401 unsigned IndexTypeQuals,
402 SourceRange BracketsRange);
Douglas Gregord6ff3322009-08-04 16:50:30 +0000403
Mike Stump11289f42009-09-09 15:08:12 +0000404 /// \brief Build a new variable-length array type given the element type,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000405 /// size modifier, size expression, and index type qualifiers.
406 ///
407 /// By default, performs semantic analysis when building the array type.
408 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000409 QualType RebuildVariableArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000410 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +0000411 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000412 unsigned IndexTypeQuals,
413 SourceRange BracketsRange);
414
Mike Stump11289f42009-09-09 15:08:12 +0000415 /// \brief Build a new dependent-sized array type given the element type,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000416 /// size modifier, size expression, and index type qualifiers.
417 ///
418 /// By default, performs semantic analysis when building the array type.
419 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000420 QualType RebuildDependentSizedArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000421 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +0000422 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000423 unsigned IndexTypeQuals,
424 SourceRange BracketsRange);
425
426 /// \brief Build a new vector type given the element type and
427 /// number of elements.
428 ///
429 /// By default, performs semantic analysis when building the vector type.
430 /// Subclasses may override this routine to provide different behavior.
431 QualType RebuildVectorType(QualType ElementType, unsigned NumElements);
Mike Stump11289f42009-09-09 15:08:12 +0000432
Douglas Gregord6ff3322009-08-04 16:50:30 +0000433 /// \brief Build a new extended vector type given the element type and
434 /// number of elements.
435 ///
436 /// By default, performs semantic analysis when building the vector type.
437 /// Subclasses may override this routine to provide different behavior.
438 QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
439 SourceLocation AttributeLoc);
Mike Stump11289f42009-09-09 15:08:12 +0000440
441 /// \brief Build a new potentially dependently-sized extended vector type
Douglas Gregord6ff3322009-08-04 16:50:30 +0000442 /// given the element type and number of elements.
443 ///
444 /// By default, performs semantic analysis when building the vector type.
445 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000446 QualType RebuildDependentSizedExtVectorType(QualType ElementType,
Douglas Gregora16548e2009-08-11 05:31:07 +0000447 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000448 SourceLocation AttributeLoc);
Mike Stump11289f42009-09-09 15:08:12 +0000449
Douglas Gregord6ff3322009-08-04 16:50:30 +0000450 /// \brief Build a new function type.
451 ///
452 /// By default, performs semantic analysis when building the function type.
453 /// Subclasses may override this routine to provide different behavior.
454 QualType RebuildFunctionProtoType(QualType T,
Mike Stump11289f42009-09-09 15:08:12 +0000455 QualType *ParamTypes,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000456 unsigned NumParamTypes,
457 bool Variadic, unsigned Quals);
Mike Stump11289f42009-09-09 15:08:12 +0000458
John McCall550e0c22009-10-21 00:40:46 +0000459 /// \brief Build a new unprototyped function type.
460 QualType RebuildFunctionNoProtoType(QualType ResultType);
461
Douglas Gregord6ff3322009-08-04 16:50:30 +0000462 /// \brief Build a new typedef type.
463 QualType RebuildTypedefType(TypedefDecl *Typedef) {
464 return SemaRef.Context.getTypeDeclType(Typedef);
465 }
466
467 /// \brief Build a new class/struct/union type.
468 QualType RebuildRecordType(RecordDecl *Record) {
469 return SemaRef.Context.getTypeDeclType(Record);
470 }
471
472 /// \brief Build a new Enum type.
473 QualType RebuildEnumType(EnumDecl *Enum) {
474 return SemaRef.Context.getTypeDeclType(Enum);
475 }
John McCallfcc33b02009-09-05 00:15:47 +0000476
477 /// \brief Build a new elaborated type.
478 QualType RebuildElaboratedType(QualType T, ElaboratedType::TagKind Tag) {
479 return SemaRef.Context.getElaboratedType(T, Tag);
480 }
Mike Stump11289f42009-09-09 15:08:12 +0000481
482 /// \brief Build a new typeof(expr) type.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000483 ///
484 /// By default, performs semantic analysis when building the typeof type.
485 /// Subclasses may override this routine to provide different behavior.
Douglas Gregora16548e2009-08-11 05:31:07 +0000486 QualType RebuildTypeOfExprType(ExprArg Underlying);
Douglas Gregord6ff3322009-08-04 16:50:30 +0000487
Mike Stump11289f42009-09-09 15:08:12 +0000488 /// \brief Build a new typeof(type) type.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000489 ///
490 /// By default, builds a new TypeOfType with the given underlying type.
491 QualType RebuildTypeOfType(QualType Underlying);
492
Mike Stump11289f42009-09-09 15:08:12 +0000493 /// \brief Build a new C++0x decltype type.
Douglas Gregord6ff3322009-08-04 16:50:30 +0000494 ///
495 /// By default, performs semantic analysis when building the decltype type.
496 /// Subclasses may override this routine to provide different behavior.
Douglas Gregora16548e2009-08-11 05:31:07 +0000497 QualType RebuildDecltypeType(ExprArg Underlying);
Mike Stump11289f42009-09-09 15:08:12 +0000498
Douglas Gregord6ff3322009-08-04 16:50:30 +0000499 /// \brief Build a new template specialization type.
500 ///
501 /// By default, performs semantic analysis when building the template
502 /// specialization type. Subclasses may override this routine to provide
503 /// different behavior.
504 QualType RebuildTemplateSpecializationType(TemplateName Template,
John McCall0ad16662009-10-29 08:12:44 +0000505 SourceLocation TemplateLoc,
506 SourceLocation LAngleLoc,
507 const TemplateArgumentLoc *Args,
508 unsigned NumArgs,
509 SourceLocation RAngleLoc);
Mike Stump11289f42009-09-09 15:08:12 +0000510
Douglas Gregord6ff3322009-08-04 16:50:30 +0000511 /// \brief Build a new qualified name type.
512 ///
Mike Stump11289f42009-09-09 15:08:12 +0000513 /// By default, builds a new QualifiedNameType type from the
514 /// nested-name-specifier and the named type. Subclasses may override
Douglas Gregord6ff3322009-08-04 16:50:30 +0000515 /// this routine to provide different behavior.
516 QualType RebuildQualifiedNameType(NestedNameSpecifier *NNS, QualType Named) {
517 return SemaRef.Context.getQualifiedNameType(NNS, Named);
Mike Stump11289f42009-09-09 15:08:12 +0000518 }
Douglas Gregord6ff3322009-08-04 16:50:30 +0000519
520 /// \brief Build a new typename type that refers to a template-id.
521 ///
522 /// By default, builds a new TypenameType type from the nested-name-specifier
Mike Stump11289f42009-09-09 15:08:12 +0000523 /// and the given type. Subclasses may override this routine to provide
Douglas Gregord6ff3322009-08-04 16:50:30 +0000524 /// different behavior.
525 QualType RebuildTypenameType(NestedNameSpecifier *NNS, QualType T) {
526 if (NNS->isDependent())
Mike Stump11289f42009-09-09 15:08:12 +0000527 return SemaRef.Context.getTypenameType(NNS,
Douglas Gregord6ff3322009-08-04 16:50:30 +0000528 cast<TemplateSpecializationType>(T));
Mike Stump11289f42009-09-09 15:08:12 +0000529
Douglas Gregord6ff3322009-08-04 16:50:30 +0000530 return SemaRef.Context.getQualifiedNameType(NNS, T);
Mike Stump11289f42009-09-09 15:08:12 +0000531 }
Douglas Gregord6ff3322009-08-04 16:50:30 +0000532
533 /// \brief Build a new typename type that refers to an identifier.
534 ///
535 /// By default, performs semantic analysis when building the typename type
Mike Stump11289f42009-09-09 15:08:12 +0000536 /// (or qualified name type). Subclasses may override this routine to provide
Douglas Gregord6ff3322009-08-04 16:50:30 +0000537 /// different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000538 QualType RebuildTypenameType(NestedNameSpecifier *NNS,
John McCall0ad16662009-10-29 08:12:44 +0000539 const IdentifierInfo *Id,
540 SourceRange SR) {
541 return SemaRef.CheckTypenameType(NNS, *Id, SR);
Douglas Gregor1135c352009-08-06 05:28:30 +0000542 }
Mike Stump11289f42009-09-09 15:08:12 +0000543
Douglas Gregor1135c352009-08-06 05:28:30 +0000544 /// \brief Build a new nested-name-specifier given the prefix and an
545 /// identifier that names the next step in the nested-name-specifier.
546 ///
547 /// By default, performs semantic analysis when building the new
548 /// nested-name-specifier. Subclasses may override this routine to provide
549 /// different behavior.
550 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
551 SourceRange Range,
Douglas Gregorc26e0f62009-09-03 16:14:30 +0000552 IdentifierInfo &II,
Douglas Gregor2b6ca462009-09-03 21:38:09 +0000553 QualType ObjectType,
554 NamedDecl *FirstQualifierInScope);
Douglas Gregor1135c352009-08-06 05:28:30 +0000555
556 /// \brief Build a new nested-name-specifier given the prefix and the
557 /// namespace named in the next step in the nested-name-specifier.
558 ///
559 /// By default, performs semantic analysis when building the new
560 /// nested-name-specifier. Subclasses may override this routine to provide
561 /// different behavior.
562 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
563 SourceRange Range,
564 NamespaceDecl *NS);
565
566 /// \brief Build a new nested-name-specifier given the prefix and the
567 /// type named in the next step in the nested-name-specifier.
568 ///
569 /// By default, performs semantic analysis when building the new
570 /// nested-name-specifier. Subclasses may override this routine to provide
571 /// different behavior.
572 NestedNameSpecifier *RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
573 SourceRange Range,
574 bool TemplateKW,
575 QualType T);
Douglas Gregor71dc5092009-08-06 06:41:21 +0000576
577 /// \brief Build a new template name given a nested name specifier, a flag
578 /// indicating whether the "template" keyword was provided, and the template
579 /// that the template name refers to.
580 ///
581 /// By default, builds the new template name directly. Subclasses may override
582 /// this routine to provide different behavior.
583 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
584 bool TemplateKW,
585 TemplateDecl *Template);
586
587 /// \brief Build a new template name given a nested name specifier, a flag
588 /// indicating whether the "template" keyword was provided, and a set of
589 /// overloaded function templates.
590 ///
591 /// By default, builds the new template name directly. Subclasses may override
592 /// this routine to provide different behavior.
593 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
594 bool TemplateKW,
595 OverloadedFunctionDecl *Ovl);
Mike Stump11289f42009-09-09 15:08:12 +0000596
Douglas Gregor71dc5092009-08-06 06:41:21 +0000597 /// \brief Build a new template name given a nested name specifier and the
598 /// name that is referred to as a template.
599 ///
600 /// By default, performs semantic analysis to determine whether the name can
601 /// be resolved to a specific template, then builds the appropriate kind of
602 /// template name. Subclasses may override this routine to provide different
603 /// behavior.
604 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
Douglas Gregor308047d2009-09-09 00:23:06 +0000605 const IdentifierInfo &II,
606 QualType ObjectType);
Mike Stump11289f42009-09-09 15:08:12 +0000607
Douglas Gregor71395fa2009-11-04 00:56:37 +0000608 /// \brief Build a new template name given a nested name specifier and the
609 /// overloaded operator name that is referred to as a template.
610 ///
611 /// By default, performs semantic analysis to determine whether the name can
612 /// be resolved to a specific template, then builds the appropriate kind of
613 /// template name. Subclasses may override this routine to provide different
614 /// behavior.
615 TemplateName RebuildTemplateName(NestedNameSpecifier *Qualifier,
616 OverloadedOperatorKind Operator,
617 QualType ObjectType);
618
Douglas Gregorebe10102009-08-20 07:17:43 +0000619 /// \brief Build a new compound statement.
620 ///
621 /// By default, performs semantic analysis to build the new statement.
622 /// Subclasses may override this routine to provide different behavior.
623 OwningStmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
624 MultiStmtArg Statements,
625 SourceLocation RBraceLoc,
626 bool IsStmtExpr) {
627 return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, move(Statements),
628 IsStmtExpr);
629 }
630
631 /// \brief Build a new case statement.
632 ///
633 /// By default, performs semantic analysis to build the new statement.
634 /// Subclasses may override this routine to provide different behavior.
635 OwningStmtResult RebuildCaseStmt(SourceLocation CaseLoc,
636 ExprArg LHS,
637 SourceLocation EllipsisLoc,
638 ExprArg RHS,
639 SourceLocation ColonLoc) {
Mike Stump11289f42009-09-09 15:08:12 +0000640 return getSema().ActOnCaseStmt(CaseLoc, move(LHS), EllipsisLoc, move(RHS),
Douglas Gregorebe10102009-08-20 07:17:43 +0000641 ColonLoc);
642 }
Mike Stump11289f42009-09-09 15:08:12 +0000643
Douglas Gregorebe10102009-08-20 07:17:43 +0000644 /// \brief Attach the body to a new case statement.
645 ///
646 /// By default, performs semantic analysis to build the new statement.
647 /// Subclasses may override this routine to provide different behavior.
648 OwningStmtResult RebuildCaseStmtBody(StmtArg S, StmtArg Body) {
649 getSema().ActOnCaseStmtBody(S.get(), move(Body));
650 return move(S);
651 }
Mike Stump11289f42009-09-09 15:08:12 +0000652
Douglas Gregorebe10102009-08-20 07:17:43 +0000653 /// \brief Build a new default statement.
654 ///
655 /// By default, performs semantic analysis to build the new statement.
656 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000657 OwningStmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000658 SourceLocation ColonLoc,
659 StmtArg SubStmt) {
Mike Stump11289f42009-09-09 15:08:12 +0000660 return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, move(SubStmt),
Douglas Gregorebe10102009-08-20 07:17:43 +0000661 /*CurScope=*/0);
662 }
Mike Stump11289f42009-09-09 15:08:12 +0000663
Douglas Gregorebe10102009-08-20 07:17:43 +0000664 /// \brief Build a new label statement.
665 ///
666 /// By default, performs semantic analysis to build the new statement.
667 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000668 OwningStmtResult RebuildLabelStmt(SourceLocation IdentLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000669 IdentifierInfo *Id,
670 SourceLocation ColonLoc,
671 StmtArg SubStmt) {
672 return SemaRef.ActOnLabelStmt(IdentLoc, Id, ColonLoc, move(SubStmt));
673 }
Mike Stump11289f42009-09-09 15:08:12 +0000674
Douglas Gregorebe10102009-08-20 07:17:43 +0000675 /// \brief Build a new "if" statement.
676 ///
677 /// By default, performs semantic analysis to build the new statement.
678 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000679 OwningStmtResult RebuildIfStmt(SourceLocation IfLoc, Sema::FullExprArg Cond,
680 StmtArg Then, SourceLocation ElseLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000681 StmtArg Else) {
682 return getSema().ActOnIfStmt(IfLoc, Cond, move(Then), ElseLoc, move(Else));
683 }
Mike Stump11289f42009-09-09 15:08:12 +0000684
Douglas Gregorebe10102009-08-20 07:17:43 +0000685 /// \brief Start building a new switch statement.
686 ///
687 /// By default, performs semantic analysis to build the new statement.
688 /// Subclasses may override this routine to provide different behavior.
689 OwningStmtResult RebuildSwitchStmtStart(ExprArg Cond) {
690 return getSema().ActOnStartOfSwitchStmt(move(Cond));
691 }
Mike Stump11289f42009-09-09 15:08:12 +0000692
Douglas Gregorebe10102009-08-20 07:17:43 +0000693 /// \brief Attach the body to the switch statement.
694 ///
695 /// By default, performs semantic analysis to build the new statement.
696 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000697 OwningStmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000698 StmtArg Switch, StmtArg Body) {
699 return getSema().ActOnFinishSwitchStmt(SwitchLoc, move(Switch),
700 move(Body));
701 }
702
703 /// \brief Build a new while statement.
704 ///
705 /// By default, performs semantic analysis to build the new statement.
706 /// Subclasses may override this routine to provide different behavior.
707 OwningStmtResult RebuildWhileStmt(SourceLocation WhileLoc,
708 Sema::FullExprArg Cond,
709 StmtArg Body) {
710 return getSema().ActOnWhileStmt(WhileLoc, Cond, move(Body));
711 }
Mike Stump11289f42009-09-09 15:08:12 +0000712
Douglas Gregorebe10102009-08-20 07:17:43 +0000713 /// \brief Build a new do-while statement.
714 ///
715 /// By default, performs semantic analysis to build the new statement.
716 /// Subclasses may override this routine to provide different behavior.
717 OwningStmtResult RebuildDoStmt(SourceLocation DoLoc, StmtArg Body,
718 SourceLocation WhileLoc,
719 SourceLocation LParenLoc,
720 ExprArg Cond,
721 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +0000722 return getSema().ActOnDoStmt(DoLoc, move(Body), WhileLoc, LParenLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000723 move(Cond), RParenLoc);
724 }
725
726 /// \brief Build a new for statement.
727 ///
728 /// By default, performs semantic analysis to build the new statement.
729 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000730 OwningStmtResult RebuildForStmt(SourceLocation ForLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000731 SourceLocation LParenLoc,
732 StmtArg Init, ExprArg Cond, ExprArg Inc,
733 SourceLocation RParenLoc, StmtArg Body) {
Mike Stump11289f42009-09-09 15:08:12 +0000734 return getSema().ActOnForStmt(ForLoc, LParenLoc, move(Init), move(Cond),
Douglas Gregorebe10102009-08-20 07:17:43 +0000735 move(Inc), RParenLoc, move(Body));
736 }
Mike Stump11289f42009-09-09 15:08:12 +0000737
Douglas Gregorebe10102009-08-20 07:17:43 +0000738 /// \brief Build a new goto statement.
739 ///
740 /// By default, performs semantic analysis to build the new statement.
741 /// Subclasses may override this routine to provide different behavior.
742 OwningStmtResult RebuildGotoStmt(SourceLocation GotoLoc,
743 SourceLocation LabelLoc,
744 LabelStmt *Label) {
745 return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label->getID());
746 }
747
748 /// \brief Build a new indirect goto statement.
749 ///
750 /// By default, performs semantic analysis to build the new statement.
751 /// Subclasses may override this routine to provide different behavior.
752 OwningStmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
753 SourceLocation StarLoc,
754 ExprArg Target) {
755 return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, move(Target));
756 }
Mike Stump11289f42009-09-09 15:08:12 +0000757
Douglas Gregorebe10102009-08-20 07:17:43 +0000758 /// \brief Build a new return statement.
759 ///
760 /// By default, performs semantic analysis to build the new statement.
761 /// Subclasses may override this routine to provide different behavior.
762 OwningStmtResult RebuildReturnStmt(SourceLocation ReturnLoc,
763 ExprArg Result) {
Mike Stump11289f42009-09-09 15:08:12 +0000764
Douglas Gregorebe10102009-08-20 07:17:43 +0000765 return getSema().ActOnReturnStmt(ReturnLoc, move(Result));
766 }
Mike Stump11289f42009-09-09 15:08:12 +0000767
Douglas Gregorebe10102009-08-20 07:17:43 +0000768 /// \brief Build a new declaration statement.
769 ///
770 /// By default, performs semantic analysis to build the new statement.
771 /// Subclasses may override this routine to provide different behavior.
772 OwningStmtResult RebuildDeclStmt(Decl **Decls, unsigned NumDecls,
Mike Stump11289f42009-09-09 15:08:12 +0000773 SourceLocation StartLoc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000774 SourceLocation EndLoc) {
775 return getSema().Owned(
776 new (getSema().Context) DeclStmt(
777 DeclGroupRef::Create(getSema().Context,
778 Decls, NumDecls),
779 StartLoc, EndLoc));
780 }
Mike Stump11289f42009-09-09 15:08:12 +0000781
Douglas Gregorebe10102009-08-20 07:17:43 +0000782 /// \brief Build a new C++ exception declaration.
783 ///
784 /// By default, performs semantic analysis to build the new decaration.
785 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000786 VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl, QualType T,
Douglas Gregorebe10102009-08-20 07:17:43 +0000787 DeclaratorInfo *Declarator,
788 IdentifierInfo *Name,
789 SourceLocation Loc,
790 SourceRange TypeRange) {
Mike Stump11289f42009-09-09 15:08:12 +0000791 return getSema().BuildExceptionDeclaration(0, T, Declarator, Name, Loc,
Douglas Gregorebe10102009-08-20 07:17:43 +0000792 TypeRange);
793 }
794
795 /// \brief Build a new C++ catch statement.
796 ///
797 /// By default, performs semantic analysis to build the new statement.
798 /// Subclasses may override this routine to provide different behavior.
799 OwningStmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
800 VarDecl *ExceptionDecl,
801 StmtArg Handler) {
802 return getSema().Owned(
Mike Stump11289f42009-09-09 15:08:12 +0000803 new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
Douglas Gregorebe10102009-08-20 07:17:43 +0000804 Handler.takeAs<Stmt>()));
805 }
Mike Stump11289f42009-09-09 15:08:12 +0000806
Douglas Gregorebe10102009-08-20 07:17:43 +0000807 /// \brief Build a new C++ try statement.
808 ///
809 /// By default, performs semantic analysis to build the new statement.
810 /// Subclasses may override this routine to provide different behavior.
811 OwningStmtResult RebuildCXXTryStmt(SourceLocation TryLoc,
812 StmtArg TryBlock,
813 MultiStmtArg Handlers) {
814 return getSema().ActOnCXXTryBlock(TryLoc, move(TryBlock), move(Handlers));
815 }
Mike Stump11289f42009-09-09 15:08:12 +0000816
Douglas Gregora16548e2009-08-11 05:31:07 +0000817 /// \brief Build a new expression that references a declaration.
818 ///
819 /// By default, performs semantic analysis to build the new expression.
820 /// Subclasses may override this routine to provide different behavior.
Douglas Gregor4bd90e52009-10-23 18:54:35 +0000821 OwningExprResult RebuildDeclRefExpr(NestedNameSpecifier *Qualifier,
822 SourceRange QualifierRange,
823 NamedDecl *ND, SourceLocation Loc) {
824 CXXScopeSpec SS;
825 SS.setScopeRep(Qualifier);
826 SS.setRange(QualifierRange);
Douglas Gregora16548e2009-08-11 05:31:07 +0000827 return getSema().BuildDeclarationNameExpr(Loc, ND,
828 /*FIXME:*/false,
Douglas Gregor4bd90e52009-10-23 18:54:35 +0000829 &SS,
Douglas Gregora16548e2009-08-11 05:31:07 +0000830 /*FIXME:*/false);
831 }
Mike Stump11289f42009-09-09 15:08:12 +0000832
Douglas Gregora16548e2009-08-11 05:31:07 +0000833 /// \brief Build a new expression in parentheses.
Mike Stump11289f42009-09-09 15:08:12 +0000834 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000835 /// By default, performs semantic analysis to build the new expression.
836 /// Subclasses may override this routine to provide different behavior.
837 OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
838 SourceLocation RParen) {
839 return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
840 }
841
Douglas Gregorad8a3362009-09-04 17:36:40 +0000842 /// \brief Build a new pseudo-destructor expression.
Mike Stump11289f42009-09-09 15:08:12 +0000843 ///
Douglas Gregorad8a3362009-09-04 17:36:40 +0000844 /// By default, performs semantic analysis to build the new expression.
845 /// Subclasses may override this routine to provide different behavior.
846 OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
847 SourceLocation OperatorLoc,
848 bool isArrow,
849 SourceLocation DestroyedTypeLoc,
850 QualType DestroyedType,
851 NestedNameSpecifier *Qualifier,
852 SourceRange QualifierRange) {
853 CXXScopeSpec SS;
854 if (Qualifier) {
855 SS.setRange(QualifierRange);
856 SS.setScopeRep(Qualifier);
857 }
858
Mike Stump11289f42009-09-09 15:08:12 +0000859 DeclarationName Name
Douglas Gregorad8a3362009-09-04 17:36:40 +0000860 = SemaRef.Context.DeclarationNames.getCXXDestructorName(
861 SemaRef.Context.getCanonicalType(DestroyedType));
Mike Stump11289f42009-09-09 15:08:12 +0000862
863 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
Douglas Gregorad8a3362009-09-04 17:36:40 +0000864 OperatorLoc,
865 isArrow? tok::arrow : tok::period,
866 DestroyedTypeLoc,
867 Name,
868 Sema::DeclPtrTy::make((Decl *)0),
869 &SS);
Mike Stump11289f42009-09-09 15:08:12 +0000870 }
871
Douglas Gregora16548e2009-08-11 05:31:07 +0000872 /// \brief Build a new unary operator expression.
Mike Stump11289f42009-09-09 15:08:12 +0000873 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000874 /// By default, performs semantic analysis to build the new expression.
875 /// Subclasses may override this routine to provide different behavior.
876 OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
877 UnaryOperator::Opcode Opc,
878 ExprArg SubExpr) {
879 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr));
880 }
Mike Stump11289f42009-09-09 15:08:12 +0000881
Douglas Gregora16548e2009-08-11 05:31:07 +0000882 /// \brief Build a new sizeof or alignof expression with a type argument.
Mike Stump11289f42009-09-09 15:08:12 +0000883 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000884 /// By default, performs semantic analysis to build the new expression.
885 /// Subclasses may override this routine to provide different behavior.
886 OwningExprResult RebuildSizeOfAlignOf(QualType T, SourceLocation OpLoc,
887 bool isSizeOf, SourceRange R) {
888 return getSema().CreateSizeOfAlignOfExpr(T, OpLoc, isSizeOf, R);
889 }
890
Mike Stump11289f42009-09-09 15:08:12 +0000891 /// \brief Build a new sizeof or alignof expression with an expression
Douglas Gregora16548e2009-08-11 05:31:07 +0000892 /// argument.
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.
896 OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
897 bool isSizeOf, SourceRange R) {
Mike Stump11289f42009-09-09 15:08:12 +0000898 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +0000899 = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
900 OpLoc, isSizeOf, R);
901 if (Result.isInvalid())
902 return getSema().ExprError();
Mike Stump11289f42009-09-09 15:08:12 +0000903
Douglas Gregora16548e2009-08-11 05:31:07 +0000904 SubExpr.release();
905 return move(Result);
906 }
Mike Stump11289f42009-09-09 15:08:12 +0000907
Douglas Gregora16548e2009-08-11 05:31:07 +0000908 /// \brief Build a new array subscript expression.
Mike Stump11289f42009-09-09 15:08:12 +0000909 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000910 /// By default, performs semantic analysis to build the new expression.
911 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000912 OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
Douglas Gregora16548e2009-08-11 05:31:07 +0000913 SourceLocation LBracketLoc,
914 ExprArg RHS,
915 SourceLocation RBracketLoc) {
916 return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
Mike Stump11289f42009-09-09 15:08:12 +0000917 LBracketLoc, move(RHS),
Douglas Gregora16548e2009-08-11 05:31:07 +0000918 RBracketLoc);
919 }
920
921 /// \brief Build a new call expression.
Mike Stump11289f42009-09-09 15:08:12 +0000922 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000923 /// By default, performs semantic analysis to build the new expression.
924 /// Subclasses may override this routine to provide different behavior.
925 OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
926 MultiExprArg Args,
927 SourceLocation *CommaLocs,
928 SourceLocation RParenLoc) {
929 return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
930 move(Args), CommaLocs, RParenLoc);
931 }
932
933 /// \brief Build a new member access expression.
Mike Stump11289f42009-09-09 15:08:12 +0000934 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000935 /// By default, performs semantic analysis to build the new expression.
936 /// Subclasses may override this routine to provide different behavior.
937 OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
Mike Stump11289f42009-09-09 15:08:12 +0000938 bool isArrow,
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000939 NestedNameSpecifier *Qualifier,
940 SourceRange QualifierRange,
941 SourceLocation MemberLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +0000942 NamedDecl *Member) {
Anders Carlsson5da84842009-09-01 04:26:58 +0000943 if (!Member->getDeclName()) {
944 // We have a reference to an unnamed field.
945 assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
Mike Stump11289f42009-09-09 15:08:12 +0000946
947 MemberExpr *ME =
Anders Carlsson5da84842009-09-01 04:26:58 +0000948 new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow,
949 Member, MemberLoc,
950 cast<FieldDecl>(Member)->getType());
951 return getSema().Owned(ME);
952 }
Mike Stump11289f42009-09-09 15:08:12 +0000953
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000954 CXXScopeSpec SS;
955 if (Qualifier) {
956 SS.setRange(QualifierRange);
957 SS.setScopeRep(Qualifier);
958 }
959
Douglas Gregorf14b46f2009-08-31 20:00:26 +0000960 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +0000961 isArrow? tok::arrow : tok::period,
962 MemberLoc,
Douglas Gregorf14b46f2009-08-31 20:00:26 +0000963 Member->getDeclName(),
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000964 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
965 &SS);
Douglas Gregora16548e2009-08-11 05:31:07 +0000966 }
Mike Stump11289f42009-09-09 15:08:12 +0000967
Douglas Gregora16548e2009-08-11 05:31:07 +0000968 /// \brief Build a new binary operator expression.
Mike Stump11289f42009-09-09 15:08:12 +0000969 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000970 /// By default, performs semantic analysis to build the new expression.
971 /// Subclasses may override this routine to provide different behavior.
972 OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
973 BinaryOperator::Opcode Opc,
974 ExprArg LHS, ExprArg RHS) {
975 OwningExprResult Result
Mike Stump11289f42009-09-09 15:08:12 +0000976 = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +0000977 (Expr *)RHS.get());
978 if (Result.isInvalid())
979 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +0000980
Douglas Gregora16548e2009-08-11 05:31:07 +0000981 LHS.release();
982 RHS.release();
983 return move(Result);
984 }
985
986 /// \brief Build a new conditional operator expression.
Mike Stump11289f42009-09-09 15:08:12 +0000987 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000988 /// By default, performs semantic analysis to build the new expression.
989 /// Subclasses may override this routine to provide different behavior.
990 OwningExprResult RebuildConditionalOperator(ExprArg Cond,
991 SourceLocation QuestionLoc,
992 ExprArg LHS,
993 SourceLocation ColonLoc,
994 ExprArg RHS) {
Mike Stump11289f42009-09-09 15:08:12 +0000995 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
Douglas Gregora16548e2009-08-11 05:31:07 +0000996 move(LHS), move(RHS));
997 }
998
999 /// \brief Build a new implicit cast expression.
Mike Stump11289f42009-09-09 15:08:12 +00001000 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001001 /// By default, builds a new implicit cast without any semantic analysis.
1002 /// Subclasses may override this routine to provide different behavior.
1003 OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
1004 ExprArg SubExpr, bool isLvalue) {
1005 ImplicitCastExpr *ICE
Mike Stump11289f42009-09-09 15:08:12 +00001006 = new (getSema().Context) ImplicitCastExpr(T, Kind,
Douglas Gregora16548e2009-08-11 05:31:07 +00001007 (Expr *)SubExpr.release(),
1008 isLvalue);
1009 return getSema().Owned(ICE);
1010 }
1011
1012 /// \brief Build a new C-style cast expression.
Mike Stump11289f42009-09-09 15:08:12 +00001013 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001014 /// By default, performs semantic analysis to build the new expression.
1015 /// Subclasses may override this routine to provide different behavior.
1016 OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
1017 QualType ExplicitTy,
1018 SourceLocation RParenLoc,
1019 ExprArg SubExpr) {
1020 return getSema().ActOnCastExpr(/*Scope=*/0,
1021 LParenLoc,
1022 ExplicitTy.getAsOpaquePtr(),
1023 RParenLoc,
1024 move(SubExpr));
1025 }
Mike Stump11289f42009-09-09 15:08:12 +00001026
Douglas Gregora16548e2009-08-11 05:31:07 +00001027 /// \brief Build a new compound literal expression.
Mike Stump11289f42009-09-09 15:08:12 +00001028 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001029 /// By default, performs semantic analysis to build the new expression.
1030 /// Subclasses may override this routine to provide different behavior.
1031 OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1032 QualType T,
1033 SourceLocation RParenLoc,
1034 ExprArg Init) {
1035 return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
1036 RParenLoc, move(Init));
1037 }
Mike Stump11289f42009-09-09 15:08:12 +00001038
Douglas Gregora16548e2009-08-11 05:31:07 +00001039 /// \brief Build a new extended vector element access expression.
Mike Stump11289f42009-09-09 15:08:12 +00001040 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001041 /// By default, performs semantic analysis to build the new expression.
1042 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001043 OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
Douglas Gregora16548e2009-08-11 05:31:07 +00001044 SourceLocation OpLoc,
1045 SourceLocation AccessorLoc,
1046 IdentifierInfo &Accessor) {
Douglas Gregor30d60cb2009-11-03 19:44:04 +00001047 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001048 tok::period, AccessorLoc,
Douglas Gregor30d60cb2009-11-03 19:44:04 +00001049 DeclarationName(&Accessor),
Douglas Gregora16548e2009-08-11 05:31:07 +00001050 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1051 }
Mike Stump11289f42009-09-09 15:08:12 +00001052
Douglas Gregora16548e2009-08-11 05:31:07 +00001053 /// \brief Build a new initializer list expression.
Mike Stump11289f42009-09-09 15:08:12 +00001054 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001055 /// By default, performs semantic analysis to build the new expression.
1056 /// Subclasses may override this routine to provide different behavior.
1057 OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1058 MultiExprArg Inits,
1059 SourceLocation RBraceLoc) {
1060 return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1061 }
Mike Stump11289f42009-09-09 15:08:12 +00001062
Douglas Gregora16548e2009-08-11 05:31:07 +00001063 /// \brief Build a new designated initializer expression.
Mike Stump11289f42009-09-09 15:08:12 +00001064 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001065 /// By default, performs semantic analysis to build the new expression.
1066 /// Subclasses may override this routine to provide different behavior.
1067 OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1068 MultiExprArg ArrayExprs,
1069 SourceLocation EqualOrColonLoc,
1070 bool GNUSyntax,
1071 ExprArg Init) {
1072 OwningExprResult Result
1073 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1074 move(Init));
1075 if (Result.isInvalid())
1076 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001077
Douglas Gregora16548e2009-08-11 05:31:07 +00001078 ArrayExprs.release();
1079 return move(Result);
1080 }
Mike Stump11289f42009-09-09 15:08:12 +00001081
Douglas Gregora16548e2009-08-11 05:31:07 +00001082 /// \brief Build a new value-initialized expression.
Mike Stump11289f42009-09-09 15:08:12 +00001083 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001084 /// By default, builds the implicit value initialization without performing
1085 /// any semantic analysis. Subclasses may override this routine to provide
1086 /// different behavior.
1087 OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1088 return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1089 }
Mike Stump11289f42009-09-09 15:08:12 +00001090
Douglas Gregora16548e2009-08-11 05:31:07 +00001091 /// \brief Build a new \c va_arg expression.
Mike Stump11289f42009-09-09 15:08:12 +00001092 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001093 /// By default, performs semantic analysis to build the new expression.
1094 /// Subclasses may override this routine to provide different behavior.
1095 OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1096 QualType T, SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001097 return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
Douglas Gregora16548e2009-08-11 05:31:07 +00001098 RParenLoc);
1099 }
1100
1101 /// \brief Build a new expression list in parentheses.
Mike Stump11289f42009-09-09 15:08:12 +00001102 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001103 /// By default, performs semantic analysis to build the new expression.
1104 /// Subclasses may override this routine to provide different behavior.
1105 OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1106 MultiExprArg SubExprs,
1107 SourceLocation RParenLoc) {
1108 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
1109 }
Mike Stump11289f42009-09-09 15:08:12 +00001110
Douglas Gregora16548e2009-08-11 05:31:07 +00001111 /// \brief Build a new address-of-label expression.
Mike Stump11289f42009-09-09 15:08:12 +00001112 ///
1113 /// By default, performs semantic analysis, using the name of the label
Douglas Gregora16548e2009-08-11 05:31:07 +00001114 /// rather than attempting to map the label statement itself.
1115 /// Subclasses may override this routine to provide different behavior.
1116 OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1117 SourceLocation LabelLoc,
1118 LabelStmt *Label) {
1119 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1120 }
Mike Stump11289f42009-09-09 15:08:12 +00001121
Douglas Gregora16548e2009-08-11 05:31:07 +00001122 /// \brief Build a new GNU statement expression.
Mike Stump11289f42009-09-09 15:08:12 +00001123 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001124 /// By default, performs semantic analysis to build the new expression.
1125 /// Subclasses may override this routine to provide different behavior.
1126 OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1127 StmtArg SubStmt,
1128 SourceLocation RParenLoc) {
1129 return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1130 }
Mike Stump11289f42009-09-09 15:08:12 +00001131
Douglas Gregora16548e2009-08-11 05:31:07 +00001132 /// \brief Build a new __builtin_types_compatible_p expression.
1133 ///
1134 /// By default, performs semantic analysis to build the new expression.
1135 /// Subclasses may override this routine to provide different behavior.
1136 OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1137 QualType T1, QualType T2,
1138 SourceLocation RParenLoc) {
1139 return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1140 T1.getAsOpaquePtr(),
1141 T2.getAsOpaquePtr(),
1142 RParenLoc);
1143 }
Mike Stump11289f42009-09-09 15:08:12 +00001144
Douglas Gregora16548e2009-08-11 05:31:07 +00001145 /// \brief Build a new __builtin_choose_expr expression.
1146 ///
1147 /// By default, performs semantic analysis to build the new expression.
1148 /// Subclasses may override this routine to provide different behavior.
1149 OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1150 ExprArg Cond, ExprArg LHS, ExprArg RHS,
1151 SourceLocation RParenLoc) {
1152 return SemaRef.ActOnChooseExpr(BuiltinLoc,
1153 move(Cond), move(LHS), move(RHS),
1154 RParenLoc);
1155 }
Mike Stump11289f42009-09-09 15:08:12 +00001156
Douglas Gregora16548e2009-08-11 05:31:07 +00001157 /// \brief Build a new overloaded operator call expression.
1158 ///
1159 /// By default, performs semantic analysis to build the new expression.
1160 /// The semantic analysis provides the behavior of template instantiation,
1161 /// copying with transformations that turn what looks like an overloaded
Mike Stump11289f42009-09-09 15:08:12 +00001162 /// operator call into a use of a builtin operator, performing
Douglas Gregora16548e2009-08-11 05:31:07 +00001163 /// argument-dependent lookup, etc. Subclasses may override this routine to
1164 /// provide different behavior.
1165 OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1166 SourceLocation OpLoc,
1167 ExprArg Callee,
1168 ExprArg First,
1169 ExprArg Second);
Mike Stump11289f42009-09-09 15:08:12 +00001170
1171 /// \brief Build a new C++ "named" cast expression, such as static_cast or
Douglas Gregora16548e2009-08-11 05:31:07 +00001172 /// reinterpret_cast.
1173 ///
1174 /// By default, this routine dispatches to one of the more-specific routines
Mike Stump11289f42009-09-09 15:08:12 +00001175 /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
Douglas Gregora16548e2009-08-11 05:31:07 +00001176 /// Subclasses may override this routine to provide different behavior.
1177 OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1178 Stmt::StmtClass Class,
1179 SourceLocation LAngleLoc,
1180 QualType T,
1181 SourceLocation RAngleLoc,
1182 SourceLocation LParenLoc,
1183 ExprArg SubExpr,
1184 SourceLocation RParenLoc) {
1185 switch (Class) {
1186 case Stmt::CXXStaticCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001187 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
1188 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001189 move(SubExpr), RParenLoc);
1190
1191 case Stmt::CXXDynamicCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001192 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
1193 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001194 move(SubExpr), RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001195
Douglas Gregora16548e2009-08-11 05:31:07 +00001196 case Stmt::CXXReinterpretCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001197 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
1198 RAngleLoc, LParenLoc,
1199 move(SubExpr),
Douglas Gregora16548e2009-08-11 05:31:07 +00001200 RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001201
Douglas Gregora16548e2009-08-11 05:31:07 +00001202 case Stmt::CXXConstCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001203 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
1204 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001205 move(SubExpr), RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001206
Douglas Gregora16548e2009-08-11 05:31:07 +00001207 default:
1208 assert(false && "Invalid C++ named cast");
1209 break;
1210 }
Mike Stump11289f42009-09-09 15:08:12 +00001211
Douglas Gregora16548e2009-08-11 05:31:07 +00001212 return getSema().ExprError();
1213 }
Mike Stump11289f42009-09-09 15:08:12 +00001214
Douglas Gregora16548e2009-08-11 05:31:07 +00001215 /// \brief Build a new C++ static_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 RebuildCXXStaticCastExpr(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_static_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++ dynamic_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 RebuildCXXDynamicCastExpr(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_dynamic_cast,
Mike Stump11289f42009-09-09 15:08:12 +00001243 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001244 LParenLoc, move(SubExpr), RParenLoc);
1245 }
1246
1247 /// \brief Build a new C++ reinterpret_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 RebuildCXXReinterpretCastExpr(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_reinterpret_cast,
1259 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1260 LParenLoc, move(SubExpr), RParenLoc);
1261 }
1262
1263 /// \brief Build a new C++ const_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 RebuildCXXConstCastExpr(SourceLocation OpLoc,
1268 SourceLocation LAngleLoc,
1269 QualType T,
1270 SourceLocation RAngleLoc,
1271 SourceLocation LParenLoc,
1272 ExprArg SubExpr,
1273 SourceLocation RParenLoc) {
1274 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
Mike Stump11289f42009-09-09 15:08:12 +00001275 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001276 LParenLoc, move(SubExpr), RParenLoc);
1277 }
Mike Stump11289f42009-09-09 15:08:12 +00001278
Douglas Gregora16548e2009-08-11 05:31:07 +00001279 /// \brief Build a new C++ functional-style cast expression.
1280 ///
1281 /// By default, performs semantic analysis to build the new expression.
1282 /// Subclasses may override this routine to provide different behavior.
1283 OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
1284 QualType T,
1285 SourceLocation LParenLoc,
1286 ExprArg SubExpr,
1287 SourceLocation RParenLoc) {
Chris Lattnerdca19592009-08-24 05:19:01 +00001288 void *Sub = SubExpr.takeAs<Expr>();
Douglas Gregora16548e2009-08-11 05:31:07 +00001289 return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1290 T.getAsOpaquePtr(),
1291 LParenLoc,
Chris Lattnerdca19592009-08-24 05:19:01 +00001292 Sema::MultiExprArg(getSema(), &Sub, 1),
Mike Stump11289f42009-09-09 15:08:12 +00001293 /*CommaLocs=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001294 RParenLoc);
1295 }
Mike Stump11289f42009-09-09 15:08:12 +00001296
Douglas Gregora16548e2009-08-11 05:31:07 +00001297 /// \brief Build a new C++ typeid(type) expression.
1298 ///
1299 /// By default, performs semantic analysis to build the new expression.
1300 /// Subclasses may override this routine to provide different behavior.
1301 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1302 SourceLocation LParenLoc,
1303 QualType T,
1304 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001305 return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
Douglas Gregora16548e2009-08-11 05:31:07 +00001306 T.getAsOpaquePtr(), RParenLoc);
1307 }
Mike Stump11289f42009-09-09 15:08:12 +00001308
Douglas Gregora16548e2009-08-11 05:31:07 +00001309 /// \brief Build a new C++ typeid(expr) expression.
1310 ///
1311 /// By default, performs semantic analysis to build the new expression.
1312 /// Subclasses may override this routine to provide different behavior.
1313 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1314 SourceLocation LParenLoc,
1315 ExprArg Operand,
1316 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001317 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00001318 = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1319 RParenLoc);
1320 if (Result.isInvalid())
1321 return getSema().ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001322
Douglas Gregora16548e2009-08-11 05:31:07 +00001323 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1324 return move(Result);
Mike Stump11289f42009-09-09 15:08:12 +00001325 }
1326
Douglas Gregora16548e2009-08-11 05:31:07 +00001327 /// \brief Build a new C++ "this" expression.
1328 ///
1329 /// By default, builds a new "this" expression without performing any
Mike Stump11289f42009-09-09 15:08:12 +00001330 /// semantic analysis. Subclasses may override this routine to provide
Douglas Gregora16548e2009-08-11 05:31:07 +00001331 /// different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001332 OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001333 QualType ThisType) {
1334 return getSema().Owned(
1335 new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1336 }
1337
1338 /// \brief Build a new C++ throw expression.
1339 ///
1340 /// By default, performs semantic analysis to build the new expression.
1341 /// Subclasses may override this routine to provide different behavior.
1342 OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1343 return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1344 }
1345
1346 /// \brief Build a new C++ default-argument expression.
1347 ///
1348 /// By default, builds a new default-argument expression, which does not
1349 /// require any semantic analysis. Subclasses may override this routine to
1350 /// provide different behavior.
1351 OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
Anders Carlssone8271232009-08-14 18:30:22 +00001352 return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
Douglas Gregora16548e2009-08-11 05:31:07 +00001353 }
1354
1355 /// \brief Build a new C++ zero-initialization expression.
1356 ///
1357 /// By default, performs semantic analysis to build the new expression.
1358 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001359 OwningExprResult RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001360 SourceLocation LParenLoc,
1361 QualType T,
1362 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001363 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1364 T.getAsOpaquePtr(), LParenLoc,
1365 MultiExprArg(getSema(), 0, 0),
Douglas Gregora16548e2009-08-11 05:31:07 +00001366 0, RParenLoc);
1367 }
Mike Stump11289f42009-09-09 15:08:12 +00001368
Douglas Gregora16548e2009-08-11 05:31:07 +00001369 /// \brief Build a new C++ conditional declaration expression.
1370 ///
1371 /// By default, performs semantic analysis to build the new expression.
1372 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001373 OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001374 SourceLocation EqLoc,
1375 VarDecl *Var) {
1376 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1377 EqLoc,
1378 Var));
1379 }
Mike Stump11289f42009-09-09 15:08:12 +00001380
Douglas Gregora16548e2009-08-11 05:31:07 +00001381 /// \brief Build a new C++ "new" expression.
1382 ///
1383 /// By default, performs semantic analysis to build the new expression.
1384 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001385 OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001386 bool UseGlobal,
1387 SourceLocation PlacementLParen,
1388 MultiExprArg PlacementArgs,
1389 SourceLocation PlacementRParen,
Mike Stump11289f42009-09-09 15:08:12 +00001390 bool ParenTypeId,
Douglas Gregora16548e2009-08-11 05:31:07 +00001391 QualType AllocType,
1392 SourceLocation TypeLoc,
1393 SourceRange TypeRange,
1394 ExprArg ArraySize,
1395 SourceLocation ConstructorLParen,
1396 MultiExprArg ConstructorArgs,
1397 SourceLocation ConstructorRParen) {
Mike Stump11289f42009-09-09 15:08:12 +00001398 return getSema().BuildCXXNew(StartLoc, UseGlobal,
Douglas Gregora16548e2009-08-11 05:31:07 +00001399 PlacementLParen,
1400 move(PlacementArgs),
1401 PlacementRParen,
1402 ParenTypeId,
1403 AllocType,
1404 TypeLoc,
1405 TypeRange,
1406 move(ArraySize),
1407 ConstructorLParen,
1408 move(ConstructorArgs),
1409 ConstructorRParen);
1410 }
Mike Stump11289f42009-09-09 15:08:12 +00001411
Douglas Gregora16548e2009-08-11 05:31:07 +00001412 /// \brief Build a new C++ "delete" expression.
1413 ///
1414 /// By default, performs semantic analysis to build the new expression.
1415 /// Subclasses may override this routine to provide different behavior.
1416 OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1417 bool IsGlobalDelete,
1418 bool IsArrayForm,
1419 ExprArg Operand) {
1420 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1421 move(Operand));
1422 }
Mike Stump11289f42009-09-09 15:08:12 +00001423
Douglas Gregora16548e2009-08-11 05:31:07 +00001424 /// \brief Build a new unary type trait expression.
1425 ///
1426 /// By default, performs semantic analysis to build the new expression.
1427 /// Subclasses may override this routine to provide different behavior.
1428 OwningExprResult RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1429 SourceLocation StartLoc,
1430 SourceLocation LParenLoc,
1431 QualType T,
1432 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001433 return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001434 T.getAsOpaquePtr(), RParenLoc);
1435 }
1436
Mike Stump11289f42009-09-09 15:08:12 +00001437 /// \brief Build a new (previously unresolved) declaration reference
Douglas Gregora16548e2009-08-11 05:31:07 +00001438 /// expression.
1439 ///
1440 /// By default, performs semantic analysis to build the new expression.
1441 /// Subclasses may override this routine to provide different behavior.
1442 OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1443 SourceRange QualifierRange,
1444 DeclarationName Name,
1445 SourceLocation Location,
1446 bool IsAddressOfOperand) {
1447 CXXScopeSpec SS;
1448 SS.setRange(QualifierRange);
1449 SS.setScopeRep(NNS);
Mike Stump11289f42009-09-09 15:08:12 +00001450 return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001451 Location,
1452 Name,
1453 /*Trailing lparen=*/false,
1454 &SS,
1455 IsAddressOfOperand);
1456 }
1457
1458 /// \brief Build a new template-id expression.
1459 ///
1460 /// By default, performs semantic analysis to build the new expression.
1461 /// Subclasses may override this routine to provide different behavior.
Douglas Gregord019ff62009-10-22 17:20:55 +00001462 OwningExprResult RebuildTemplateIdExpr(NestedNameSpecifier *Qualifier,
1463 SourceRange QualifierRange,
1464 TemplateName Template,
Douglas Gregora16548e2009-08-11 05:31:07 +00001465 SourceLocation TemplateLoc,
1466 SourceLocation LAngleLoc,
John McCall0ad16662009-10-29 08:12:44 +00001467 TemplateArgumentLoc *TemplateArgs,
Douglas Gregora16548e2009-08-11 05:31:07 +00001468 unsigned NumTemplateArgs,
1469 SourceLocation RAngleLoc) {
Douglas Gregord019ff62009-10-22 17:20:55 +00001470 return getSema().BuildTemplateIdExpr(Qualifier, QualifierRange,
1471 Template, TemplateLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001472 LAngleLoc,
1473 TemplateArgs, NumTemplateArgs,
1474 RAngleLoc);
1475 }
1476
1477 /// \brief Build a new object-construction expression.
1478 ///
1479 /// By default, performs semantic analysis to build the new expression.
1480 /// Subclasses may override this routine to provide different behavior.
1481 OwningExprResult RebuildCXXConstructExpr(QualType T,
1482 CXXConstructorDecl *Constructor,
1483 bool IsElidable,
1484 MultiExprArg Args) {
Anders Carlsson1b4ebfa2009-09-05 07:40:38 +00001485 return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/
1486 SourceLocation(),
1487 T, Constructor, IsElidable,
Anders Carlsson5995a3e2009-09-07 22:23:31 +00001488 move(Args));
Douglas Gregora16548e2009-08-11 05:31:07 +00001489 }
1490
1491 /// \brief Build a new object-construction expression.
1492 ///
1493 /// By default, performs semantic analysis to build the new expression.
1494 /// Subclasses may override this routine to provide different behavior.
1495 OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1496 QualType T,
1497 SourceLocation LParenLoc,
1498 MultiExprArg Args,
1499 SourceLocation *Commas,
1500 SourceLocation RParenLoc) {
1501 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1502 T.getAsOpaquePtr(),
1503 LParenLoc,
1504 move(Args),
1505 Commas,
1506 RParenLoc);
1507 }
1508
1509 /// \brief Build a new object-construction expression.
1510 ///
1511 /// By default, performs semantic analysis to build the new expression.
1512 /// Subclasses may override this routine to provide different behavior.
1513 OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1514 QualType T,
1515 SourceLocation LParenLoc,
1516 MultiExprArg Args,
1517 SourceLocation *Commas,
1518 SourceLocation RParenLoc) {
1519 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1520 /*FIXME*/LParenLoc),
1521 T.getAsOpaquePtr(),
1522 LParenLoc,
1523 move(Args),
1524 Commas,
1525 RParenLoc);
1526 }
Mike Stump11289f42009-09-09 15:08:12 +00001527
Douglas Gregora16548e2009-08-11 05:31:07 +00001528 /// \brief Build a new member reference expression.
1529 ///
1530 /// By default, performs semantic analysis to build the new expression.
1531 /// Subclasses may override this routine to provide different behavior.
Douglas Gregor2168a9f2009-08-11 15:56:57 +00001532 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
Douglas Gregora16548e2009-08-11 05:31:07 +00001533 bool IsArrow,
1534 SourceLocation OperatorLoc,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001535 NestedNameSpecifier *Qualifier,
1536 SourceRange QualifierRange,
Douglas Gregora16548e2009-08-11 05:31:07 +00001537 DeclarationName Name,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001538 SourceLocation MemberLoc,
1539 NamedDecl *FirstQualifierInScope) {
Douglas Gregor2168a9f2009-08-11 15:56:57 +00001540 OwningExprResult Base = move(BaseE);
Douglas Gregora16548e2009-08-11 05:31:07 +00001541 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001542
Douglas Gregora16548e2009-08-11 05:31:07 +00001543 CXXScopeSpec SS;
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001544 SS.setRange(QualifierRange);
1545 SS.setScopeRep(Qualifier);
Mike Stump11289f42009-09-09 15:08:12 +00001546
Douglas Gregor308047d2009-09-09 00:23:06 +00001547 return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001548 move(Base), OperatorLoc, OpKind,
Douglas Gregorf14b46f2009-08-31 20:00:26 +00001549 MemberLoc,
1550 Name,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001551 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001552 &SS,
1553 FirstQualifierInScope);
Douglas Gregora16548e2009-08-11 05:31:07 +00001554 }
1555
Douglas Gregor308047d2009-09-09 00:23:06 +00001556 /// \brief Build a new member reference expression with explicit template
1557 /// arguments.
1558 ///
1559 /// By default, performs semantic analysis to build the new expression.
1560 /// Subclasses may override this routine to provide different behavior.
1561 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
1562 bool IsArrow,
1563 SourceLocation OperatorLoc,
1564 NestedNameSpecifier *Qualifier,
1565 SourceRange QualifierRange,
1566 TemplateName Template,
1567 SourceLocation TemplateNameLoc,
1568 NamedDecl *FirstQualifierInScope,
1569 SourceLocation LAngleLoc,
John McCall0ad16662009-10-29 08:12:44 +00001570 const TemplateArgumentLoc *TemplateArgs,
Douglas Gregor308047d2009-09-09 00:23:06 +00001571 unsigned NumTemplateArgs,
1572 SourceLocation RAngleLoc) {
1573 OwningExprResult Base = move(BaseE);
1574 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
Mike Stump11289f42009-09-09 15:08:12 +00001575
Douglas Gregor308047d2009-09-09 00:23:06 +00001576 CXXScopeSpec SS;
1577 SS.setRange(QualifierRange);
1578 SS.setScopeRep(Qualifier);
Mike Stump11289f42009-09-09 15:08:12 +00001579
Douglas Gregor308047d2009-09-09 00:23:06 +00001580 // FIXME: We're going to end up looking up the template based on its name,
Douglas Gregor30d60cb2009-11-03 19:44:04 +00001581 // twice! Also, duplicates part of Sema::BuildMemberAccessExpr.
Douglas Gregor308047d2009-09-09 00:23:06 +00001582 DeclarationName Name;
1583 if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl())
1584 Name = ActualTemplate->getDeclName();
Mike Stump11289f42009-09-09 15:08:12 +00001585 else if (OverloadedFunctionDecl *Ovl
Douglas Gregor308047d2009-09-09 00:23:06 +00001586 = Template.getAsOverloadedFunctionDecl())
1587 Name = Ovl->getDeclName();
Douglas Gregor71395fa2009-11-04 00:56:37 +00001588 else {
1589 DependentTemplateName *DTN = Template.getAsDependentTemplateName();
1590 if (DTN->isIdentifier())
1591 Name = DTN->getIdentifier();
1592 else
1593 Name = SemaRef.Context.DeclarationNames.getCXXOperatorName(
1594 DTN->getOperator());
1595 }
Mike Stump11289f42009-09-09 15:08:12 +00001596 return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
Douglas Gregor308047d2009-09-09 00:23:06 +00001597 OperatorLoc, OpKind,
1598 TemplateNameLoc, Name, true,
1599 LAngleLoc, TemplateArgs,
1600 NumTemplateArgs, RAngleLoc,
1601 Sema::DeclPtrTy(), &SS);
1602 }
Mike Stump11289f42009-09-09 15:08:12 +00001603
Douglas Gregora16548e2009-08-11 05:31:07 +00001604 /// \brief Build a new Objective-C @encode expression.
1605 ///
1606 /// By default, performs semantic analysis to build the new expression.
1607 /// Subclasses may override this routine to provide different behavior.
1608 OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1609 QualType T,
1610 SourceLocation RParenLoc) {
1611 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1612 RParenLoc));
Mike Stump11289f42009-09-09 15:08:12 +00001613 }
Douglas Gregora16548e2009-08-11 05:31:07 +00001614
1615 /// \brief Build a new Objective-C protocol expression.
1616 ///
1617 /// By default, performs semantic analysis to build the new expression.
1618 /// Subclasses may override this routine to provide different behavior.
1619 OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1620 SourceLocation AtLoc,
1621 SourceLocation ProtoLoc,
1622 SourceLocation LParenLoc,
1623 SourceLocation RParenLoc) {
1624 return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1625 Protocol->getIdentifier(),
1626 AtLoc,
1627 ProtoLoc,
1628 LParenLoc,
Mike Stump11289f42009-09-09 15:08:12 +00001629 RParenLoc));
Douglas Gregora16548e2009-08-11 05:31:07 +00001630 }
Mike Stump11289f42009-09-09 15:08:12 +00001631
Douglas Gregora16548e2009-08-11 05:31:07 +00001632 /// \brief Build a new shuffle vector expression.
1633 ///
1634 /// By default, performs semantic analysis to build the new expression.
1635 /// Subclasses may override this routine to provide different behavior.
1636 OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1637 MultiExprArg SubExprs,
1638 SourceLocation RParenLoc) {
1639 // Find the declaration for __builtin_shufflevector
Mike Stump11289f42009-09-09 15:08:12 +00001640 const IdentifierInfo &Name
Douglas Gregora16548e2009-08-11 05:31:07 +00001641 = SemaRef.Context.Idents.get("__builtin_shufflevector");
1642 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1643 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1644 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
Mike Stump11289f42009-09-09 15:08:12 +00001645
Douglas Gregora16548e2009-08-11 05:31:07 +00001646 // Build a reference to the __builtin_shufflevector builtin
1647 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
Mike Stump11289f42009-09-09 15:08:12 +00001648 Expr *Callee
Douglas Gregora16548e2009-08-11 05:31:07 +00001649 = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1650 BuiltinLoc, false, false);
1651 SemaRef.UsualUnaryConversions(Callee);
Mike Stump11289f42009-09-09 15:08:12 +00001652
1653 // Build the CallExpr
Douglas Gregora16548e2009-08-11 05:31:07 +00001654 unsigned NumSubExprs = SubExprs.size();
1655 Expr **Subs = (Expr **)SubExprs.release();
1656 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1657 Subs, NumSubExprs,
1658 Builtin->getResultType(),
1659 RParenLoc);
1660 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
Mike Stump11289f42009-09-09 15:08:12 +00001661
Douglas Gregora16548e2009-08-11 05:31:07 +00001662 // Type-check the __builtin_shufflevector expression.
1663 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1664 if (Result.isInvalid())
1665 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001666
Douglas Gregora16548e2009-08-11 05:31:07 +00001667 OwnedCall.release();
Mike Stump11289f42009-09-09 15:08:12 +00001668 return move(Result);
Douglas Gregora16548e2009-08-11 05:31:07 +00001669 }
Douglas Gregord6ff3322009-08-04 16:50:30 +00001670};
Douglas Gregora16548e2009-08-11 05:31:07 +00001671
Douglas Gregorebe10102009-08-20 07:17:43 +00001672template<typename Derived>
1673Sema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
1674 if (!S)
1675 return SemaRef.Owned(S);
Mike Stump11289f42009-09-09 15:08:12 +00001676
Douglas Gregorebe10102009-08-20 07:17:43 +00001677 switch (S->getStmtClass()) {
1678 case Stmt::NoStmtClass: break;
Mike Stump11289f42009-09-09 15:08:12 +00001679
Douglas Gregorebe10102009-08-20 07:17:43 +00001680 // Transform individual statement nodes
1681#define STMT(Node, Parent) \
1682 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
1683#define EXPR(Node, Parent)
1684#include "clang/AST/StmtNodes.def"
Mike Stump11289f42009-09-09 15:08:12 +00001685
Douglas Gregorebe10102009-08-20 07:17:43 +00001686 // Transform expressions by calling TransformExpr.
1687#define STMT(Node, Parent)
1688#define EXPR(Node, Parent) case Stmt::Node##Class:
1689#include "clang/AST/StmtNodes.def"
1690 {
1691 Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
1692 if (E.isInvalid())
1693 return getSema().StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00001694
Douglas Gregorebe10102009-08-20 07:17:43 +00001695 return getSema().Owned(E.takeAs<Stmt>());
1696 }
Mike Stump11289f42009-09-09 15:08:12 +00001697 }
1698
Douglas Gregorebe10102009-08-20 07:17:43 +00001699 return SemaRef.Owned(S->Retain());
1700}
Mike Stump11289f42009-09-09 15:08:12 +00001701
1702
Douglas Gregore922c772009-08-04 22:27:00 +00001703template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00001704Sema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1705 bool isAddressOfOperand) {
1706 if (!E)
1707 return SemaRef.Owned(E);
1708
1709 switch (E->getStmtClass()) {
1710 case Stmt::NoStmtClass: break;
1711#define STMT(Node, Parent) case Stmt::Node##Class: break;
1712#define EXPR(Node, Parent) \
1713 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
1714#include "clang/AST/StmtNodes.def"
Mike Stump11289f42009-09-09 15:08:12 +00001715 }
1716
Douglas Gregora16548e2009-08-11 05:31:07 +00001717 return SemaRef.Owned(E->Retain());
Douglas Gregor766b0bb2009-08-06 22:17:10 +00001718}
1719
1720template<typename Derived>
Douglas Gregor1135c352009-08-06 05:28:30 +00001721NestedNameSpecifier *
1722TreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001723 SourceRange Range,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001724 QualType ObjectType,
1725 NamedDecl *FirstQualifierInScope) {
Douglas Gregor96ee7892009-08-31 21:41:48 +00001726 if (!NNS)
1727 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001728
Douglas Gregorebe10102009-08-20 07:17:43 +00001729 // Transform the prefix of this nested name specifier.
Douglas Gregor1135c352009-08-06 05:28:30 +00001730 NestedNameSpecifier *Prefix = NNS->getPrefix();
1731 if (Prefix) {
Mike Stump11289f42009-09-09 15:08:12 +00001732 Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001733 ObjectType,
1734 FirstQualifierInScope);
Douglas Gregor1135c352009-08-06 05:28:30 +00001735 if (!Prefix)
1736 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001737
1738 // Clear out the object type and the first qualifier in scope; they only
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001739 // apply to the first element in the nested-name-specifier.
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001740 ObjectType = QualType();
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001741 FirstQualifierInScope = 0;
Douglas Gregor1135c352009-08-06 05:28:30 +00001742 }
Mike Stump11289f42009-09-09 15:08:12 +00001743
Douglas Gregor1135c352009-08-06 05:28:30 +00001744 switch (NNS->getKind()) {
1745 case NestedNameSpecifier::Identifier:
Mike Stump11289f42009-09-09 15:08:12 +00001746 assert((Prefix || !ObjectType.isNull()) &&
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001747 "Identifier nested-name-specifier with no prefix or object type");
1748 if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1749 ObjectType.isNull())
Douglas Gregor1135c352009-08-06 05:28:30 +00001750 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001751
1752 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001753 *NNS->getAsIdentifier(),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001754 ObjectType,
1755 FirstQualifierInScope);
Mike Stump11289f42009-09-09 15:08:12 +00001756
Douglas Gregor1135c352009-08-06 05:28:30 +00001757 case NestedNameSpecifier::Namespace: {
Mike Stump11289f42009-09-09 15:08:12 +00001758 NamespaceDecl *NS
Douglas Gregor1135c352009-08-06 05:28:30 +00001759 = cast_or_null<NamespaceDecl>(
1760 getDerived().TransformDecl(NNS->getAsNamespace()));
Mike Stump11289f42009-09-09 15:08:12 +00001761 if (!getDerived().AlwaysRebuild() &&
Douglas Gregor1135c352009-08-06 05:28:30 +00001762 Prefix == NNS->getPrefix() &&
1763 NS == NNS->getAsNamespace())
1764 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001765
Douglas Gregor1135c352009-08-06 05:28:30 +00001766 return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1767 }
Mike Stump11289f42009-09-09 15:08:12 +00001768
Douglas Gregor1135c352009-08-06 05:28:30 +00001769 case NestedNameSpecifier::Global:
1770 // There is no meaningful transformation that one could perform on the
1771 // global scope.
1772 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001773
Douglas Gregor1135c352009-08-06 05:28:30 +00001774 case NestedNameSpecifier::TypeSpecWithTemplate:
1775 case NestedNameSpecifier::TypeSpec: {
Douglas Gregor07cc4ac2009-10-29 22:21:39 +00001776 TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
Douglas Gregor1135c352009-08-06 05:28:30 +00001777 QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
Douglas Gregor71dc5092009-08-06 06:41:21 +00001778 if (T.isNull())
1779 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001780
Douglas Gregor1135c352009-08-06 05:28:30 +00001781 if (!getDerived().AlwaysRebuild() &&
1782 Prefix == NNS->getPrefix() &&
1783 T == QualType(NNS->getAsType(), 0))
1784 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001785
1786 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1787 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
Douglas Gregor1135c352009-08-06 05:28:30 +00001788 T);
1789 }
1790 }
Mike Stump11289f42009-09-09 15:08:12 +00001791
Douglas Gregor1135c352009-08-06 05:28:30 +00001792 // Required to silence a GCC warning
Mike Stump11289f42009-09-09 15:08:12 +00001793 return 0;
Douglas Gregor1135c352009-08-06 05:28:30 +00001794}
1795
1796template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001797DeclarationName
Douglas Gregorf816bd72009-09-03 22:13:48 +00001798TreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
Douglas Gregorc59e5612009-10-19 22:04:39 +00001799 SourceLocation Loc,
1800 QualType ObjectType) {
Douglas Gregorf816bd72009-09-03 22:13:48 +00001801 if (!Name)
1802 return Name;
1803
1804 switch (Name.getNameKind()) {
1805 case DeclarationName::Identifier:
1806 case DeclarationName::ObjCZeroArgSelector:
1807 case DeclarationName::ObjCOneArgSelector:
1808 case DeclarationName::ObjCMultiArgSelector:
1809 case DeclarationName::CXXOperatorName:
1810 case DeclarationName::CXXUsingDirective:
1811 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001812
Douglas Gregorf816bd72009-09-03 22:13:48 +00001813 case DeclarationName::CXXConstructorName:
1814 case DeclarationName::CXXDestructorName:
1815 case DeclarationName::CXXConversionFunctionName: {
1816 TemporaryBase Rebase(*this, Loc, Name);
Douglas Gregorc59e5612009-10-19 22:04:39 +00001817 QualType T;
1818 if (!ObjectType.isNull() &&
1819 isa<TemplateSpecializationType>(Name.getCXXNameType())) {
1820 TemplateSpecializationType *SpecType
1821 = cast<TemplateSpecializationType>(Name.getCXXNameType());
1822 T = TransformTemplateSpecializationType(SpecType, ObjectType);
1823 } else
1824 T = getDerived().TransformType(Name.getCXXNameType());
Douglas Gregorf816bd72009-09-03 22:13:48 +00001825 if (T.isNull())
1826 return DeclarationName();
Mike Stump11289f42009-09-09 15:08:12 +00001827
Douglas Gregorf816bd72009-09-03 22:13:48 +00001828 return SemaRef.Context.DeclarationNames.getCXXSpecialName(
Mike Stump11289f42009-09-09 15:08:12 +00001829 Name.getNameKind(),
Douglas Gregorf816bd72009-09-03 22:13:48 +00001830 SemaRef.Context.getCanonicalType(T));
Douglas Gregorf816bd72009-09-03 22:13:48 +00001831 }
Mike Stump11289f42009-09-09 15:08:12 +00001832 }
1833
Douglas Gregorf816bd72009-09-03 22:13:48 +00001834 return DeclarationName();
1835}
1836
1837template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001838TemplateName
Douglas Gregor308047d2009-09-09 00:23:06 +00001839TreeTransform<Derived>::TransformTemplateName(TemplateName Name,
1840 QualType ObjectType) {
Douglas Gregor71dc5092009-08-06 06:41:21 +00001841 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
Mike Stump11289f42009-09-09 15:08:12 +00001842 NestedNameSpecifier *NNS
Douglas Gregor71dc5092009-08-06 06:41:21 +00001843 = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1844 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1845 if (!NNS)
1846 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001847
Douglas Gregor71dc5092009-08-06 06:41:21 +00001848 if (TemplateDecl *Template = QTN->getTemplateDecl()) {
Mike Stump11289f42009-09-09 15:08:12 +00001849 TemplateDecl *TransTemplate
Douglas Gregor71dc5092009-08-06 06:41:21 +00001850 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1851 if (!TransTemplate)
1852 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001853
Douglas Gregor71dc5092009-08-06 06:41:21 +00001854 if (!getDerived().AlwaysRebuild() &&
1855 NNS == QTN->getQualifier() &&
1856 TransTemplate == Template)
1857 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001858
Douglas Gregor71dc5092009-08-06 06:41:21 +00001859 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1860 TransTemplate);
1861 }
Mike Stump11289f42009-09-09 15:08:12 +00001862
Douglas Gregor71dc5092009-08-06 06:41:21 +00001863 OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1864 assert(Ovl && "Not a template name or an overload set?");
Mike Stump11289f42009-09-09 15:08:12 +00001865 OverloadedFunctionDecl *TransOvl
Douglas Gregor71dc5092009-08-06 06:41:21 +00001866 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1867 if (!TransOvl)
1868 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001869
Douglas Gregor71dc5092009-08-06 06:41:21 +00001870 if (!getDerived().AlwaysRebuild() &&
1871 NNS == QTN->getQualifier() &&
1872 TransOvl == Ovl)
1873 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001874
Douglas Gregor71dc5092009-08-06 06:41:21 +00001875 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1876 TransOvl);
1877 }
Mike Stump11289f42009-09-09 15:08:12 +00001878
Douglas Gregor71dc5092009-08-06 06:41:21 +00001879 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
Mike Stump11289f42009-09-09 15:08:12 +00001880 NestedNameSpecifier *NNS
Douglas Gregor71dc5092009-08-06 06:41:21 +00001881 = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1882 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
Douglas Gregor308047d2009-09-09 00:23:06 +00001883 if (!NNS && DTN->getQualifier())
Douglas Gregor71dc5092009-08-06 06:41:21 +00001884 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001885
Douglas Gregor71dc5092009-08-06 06:41:21 +00001886 if (!getDerived().AlwaysRebuild() &&
Douglas Gregorc59e5612009-10-19 22:04:39 +00001887 NNS == DTN->getQualifier() &&
1888 ObjectType.isNull())
Douglas Gregor71dc5092009-08-06 06:41:21 +00001889 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001890
Douglas Gregor71395fa2009-11-04 00:56:37 +00001891 if (DTN->isIdentifier())
1892 return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
1893 ObjectType);
1894
1895 return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
1896 ObjectType);
Douglas Gregor71dc5092009-08-06 06:41:21 +00001897 }
Mike Stump11289f42009-09-09 15:08:12 +00001898
Douglas Gregor71dc5092009-08-06 06:41:21 +00001899 if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
Mike Stump11289f42009-09-09 15:08:12 +00001900 TemplateDecl *TransTemplate
Douglas Gregor71dc5092009-08-06 06:41:21 +00001901 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1902 if (!TransTemplate)
1903 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001904
Douglas Gregor71dc5092009-08-06 06:41:21 +00001905 if (!getDerived().AlwaysRebuild() &&
1906 TransTemplate == Template)
1907 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001908
Douglas Gregor71dc5092009-08-06 06:41:21 +00001909 return TemplateName(TransTemplate);
1910 }
Mike Stump11289f42009-09-09 15:08:12 +00001911
Douglas Gregor71dc5092009-08-06 06:41:21 +00001912 OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1913 assert(Ovl && "Not a template name or an overload set?");
Mike Stump11289f42009-09-09 15:08:12 +00001914 OverloadedFunctionDecl *TransOvl
Douglas Gregor71dc5092009-08-06 06:41:21 +00001915 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1916 if (!TransOvl)
1917 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001918
Douglas Gregor71dc5092009-08-06 06:41:21 +00001919 if (!getDerived().AlwaysRebuild() &&
1920 TransOvl == Ovl)
1921 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001922
Douglas Gregor71dc5092009-08-06 06:41:21 +00001923 return TemplateName(TransOvl);
1924}
1925
1926template<typename Derived>
John McCall0ad16662009-10-29 08:12:44 +00001927void TreeTransform<Derived>::InventTemplateArgumentLoc(
1928 const TemplateArgument &Arg,
1929 TemplateArgumentLoc &Output) {
1930 SourceLocation Loc = getDerived().getBaseLocation();
1931 switch (Arg.getKind()) {
1932 case TemplateArgument::Null:
1933 llvm::llvm_unreachable("null template argument in TreeTransform");
1934 break;
1935
1936 case TemplateArgument::Type:
1937 Output = TemplateArgumentLoc(Arg,
1938 SemaRef.Context.getTrivialDeclaratorInfo(Arg.getAsType(), Loc));
1939
1940 break;
1941
1942 case TemplateArgument::Expression:
1943 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
1944 break;
1945
1946 case TemplateArgument::Declaration:
1947 case TemplateArgument::Integral:
1948 case TemplateArgument::Pack:
John McCall0d07eb32009-10-29 18:45:58 +00001949 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
John McCall0ad16662009-10-29 08:12:44 +00001950 break;
1951 }
1952}
1953
1954template<typename Derived>
1955bool TreeTransform<Derived>::TransformTemplateArgument(
1956 const TemplateArgumentLoc &Input,
1957 TemplateArgumentLoc &Output) {
1958 const TemplateArgument &Arg = Input.getArgument();
Douglas Gregore922c772009-08-04 22:27:00 +00001959 switch (Arg.getKind()) {
1960 case TemplateArgument::Null:
1961 case TemplateArgument::Integral:
John McCall0ad16662009-10-29 08:12:44 +00001962 Output = Input;
1963 return false;
Mike Stump11289f42009-09-09 15:08:12 +00001964
Douglas Gregore922c772009-08-04 22:27:00 +00001965 case TemplateArgument::Type: {
John McCall0ad16662009-10-29 08:12:44 +00001966 DeclaratorInfo *DI = Input.getSourceDeclaratorInfo();
1967 if (DI == NULL)
1968 DI = InventDeclaratorInfo(Input.getArgument().getAsType());
1969
1970 DI = getDerived().TransformType(DI);
1971 if (!DI) return true;
1972
1973 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
1974 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00001975 }
Mike Stump11289f42009-09-09 15:08:12 +00001976
Douglas Gregore922c772009-08-04 22:27:00 +00001977 case TemplateArgument::Declaration: {
John McCall0ad16662009-10-29 08:12:44 +00001978 // FIXME: we should never have to transform one of these.
Douglas Gregoref6ab412009-10-27 06:26:26 +00001979 DeclarationName Name;
1980 if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
1981 Name = ND->getDeclName();
John McCall0ad16662009-10-29 08:12:44 +00001982 TemporaryBase Rebase(*this, SourceLocation(), Name);
Douglas Gregore922c772009-08-04 22:27:00 +00001983 Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
John McCall0ad16662009-10-29 08:12:44 +00001984 if (!D) return true;
1985
John McCall0d07eb32009-10-29 18:45:58 +00001986 Expr *SourceExpr = Input.getSourceDeclExpression();
1987 if (SourceExpr) {
1988 EnterExpressionEvaluationContext Unevaluated(getSema(),
1989 Action::Unevaluated);
1990 Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
1991 if (E.isInvalid())
1992 SourceExpr = NULL;
1993 else {
1994 SourceExpr = E.takeAs<Expr>();
1995 SourceExpr->Retain();
1996 }
1997 }
1998
1999 Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
John McCall0ad16662009-10-29 08:12:44 +00002000 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00002001 }
Mike Stump11289f42009-09-09 15:08:12 +00002002
Douglas Gregore922c772009-08-04 22:27:00 +00002003 case TemplateArgument::Expression: {
2004 // Template argument expressions are not potentially evaluated.
Mike Stump11289f42009-09-09 15:08:12 +00002005 EnterExpressionEvaluationContext Unevaluated(getSema(),
Douglas Gregore922c772009-08-04 22:27:00 +00002006 Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002007
John McCall0ad16662009-10-29 08:12:44 +00002008 Expr *InputExpr = Input.getSourceExpression();
2009 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2010
2011 Sema::OwningExprResult E
2012 = getDerived().TransformExpr(InputExpr);
2013 if (E.isInvalid()) return true;
2014
2015 Expr *ETaken = E.takeAs<Expr>();
John McCall0d07eb32009-10-29 18:45:58 +00002016 ETaken->Retain();
John McCall0ad16662009-10-29 08:12:44 +00002017 Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
2018 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00002019 }
Mike Stump11289f42009-09-09 15:08:12 +00002020
Douglas Gregore922c772009-08-04 22:27:00 +00002021 case TemplateArgument::Pack: {
2022 llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2023 TransformedArgs.reserve(Arg.pack_size());
Mike Stump11289f42009-09-09 15:08:12 +00002024 for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
Douglas Gregore922c772009-08-04 22:27:00 +00002025 AEnd = Arg.pack_end();
2026 A != AEnd; ++A) {
Mike Stump11289f42009-09-09 15:08:12 +00002027
John McCall0ad16662009-10-29 08:12:44 +00002028 // FIXME: preserve source information here when we start
2029 // caring about parameter packs.
2030
John McCall0d07eb32009-10-29 18:45:58 +00002031 TemplateArgumentLoc InputArg;
2032 TemplateArgumentLoc OutputArg;
2033 getDerived().InventTemplateArgumentLoc(*A, InputArg);
2034 if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
John McCall0ad16662009-10-29 08:12:44 +00002035 return true;
2036
John McCall0d07eb32009-10-29 18:45:58 +00002037 TransformedArgs.push_back(OutputArg.getArgument());
Douglas Gregore922c772009-08-04 22:27:00 +00002038 }
2039 TemplateArgument Result;
Mike Stump11289f42009-09-09 15:08:12 +00002040 Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
Douglas Gregore922c772009-08-04 22:27:00 +00002041 true);
John McCall0d07eb32009-10-29 18:45:58 +00002042 Output = TemplateArgumentLoc(Result, Input.getLocInfo());
John McCall0ad16662009-10-29 08:12:44 +00002043 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00002044 }
2045 }
Mike Stump11289f42009-09-09 15:08:12 +00002046
Douglas Gregore922c772009-08-04 22:27:00 +00002047 // Work around bogus GCC warning
John McCall0ad16662009-10-29 08:12:44 +00002048 return true;
Douglas Gregore922c772009-08-04 22:27:00 +00002049}
2050
Douglas Gregord6ff3322009-08-04 16:50:30 +00002051//===----------------------------------------------------------------------===//
2052// Type transformation
2053//===----------------------------------------------------------------------===//
2054
2055template<typename Derived>
2056QualType TreeTransform<Derived>::TransformType(QualType T) {
2057 if (getDerived().AlreadyTransformed(T))
2058 return T;
Mike Stump11289f42009-09-09 15:08:12 +00002059
John McCall550e0c22009-10-21 00:40:46 +00002060 // Temporary workaround. All of these transformations should
2061 // eventually turn into transformations on TypeLocs.
2062 DeclaratorInfo *DI = getSema().Context.CreateDeclaratorInfo(T);
John McCallde889892009-10-21 00:44:26 +00002063 DI->getTypeLoc().initialize(getDerived().getBaseLocation());
John McCall550e0c22009-10-21 00:40:46 +00002064
2065 DeclaratorInfo *NewDI = getDerived().TransformType(DI);
John McCall8ccfcb52009-09-24 19:53:00 +00002066
John McCall550e0c22009-10-21 00:40:46 +00002067 if (!NewDI)
2068 return QualType();
2069
2070 return NewDI->getType();
2071}
2072
2073template<typename Derived>
2074DeclaratorInfo *TreeTransform<Derived>::TransformType(DeclaratorInfo *DI) {
2075 if (getDerived().AlreadyTransformed(DI->getType()))
2076 return DI;
2077
2078 TypeLocBuilder TLB;
2079
2080 TypeLoc TL = DI->getTypeLoc();
2081 TLB.reserve(TL.getFullDataSize());
2082
2083 QualType Result = getDerived().TransformType(TLB, TL);
2084 if (Result.isNull())
2085 return 0;
2086
2087 return TLB.getDeclaratorInfo(SemaRef.Context, Result);
2088}
2089
2090template<typename Derived>
2091QualType
2092TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
2093 switch (T.getTypeLocClass()) {
2094#define ABSTRACT_TYPELOC(CLASS, PARENT)
2095#define TYPELOC(CLASS, PARENT) \
2096 case TypeLoc::CLASS: \
2097 return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
2098#include "clang/AST/TypeLocNodes.def"
Douglas Gregord6ff3322009-08-04 16:50:30 +00002099 }
Mike Stump11289f42009-09-09 15:08:12 +00002100
John McCall550e0c22009-10-21 00:40:46 +00002101 llvm::llvm_unreachable("unhandled type loc!");
2102 return QualType();
2103}
2104
2105/// FIXME: By default, this routine adds type qualifiers only to types
2106/// that can have qualifiers, and silently suppresses those qualifiers
2107/// that are not permitted (e.g., qualifiers on reference or function
2108/// types). This is the right thing for template instantiation, but
2109/// probably not for other clients.
2110template<typename Derived>
2111QualType
2112TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2113 QualifiedTypeLoc T) {
2114 Qualifiers Quals = T.getType().getQualifiers();
2115
2116 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
2117 if (Result.isNull())
2118 return QualType();
2119
2120 // Silently suppress qualifiers if the result type can't be qualified.
2121 // FIXME: this is the right thing for template instantiation, but
2122 // probably not for other clients.
2123 if (Result->isFunctionType() || Result->isReferenceType())
Douglas Gregord6ff3322009-08-04 16:50:30 +00002124 return Result;
Mike Stump11289f42009-09-09 15:08:12 +00002125
John McCall550e0c22009-10-21 00:40:46 +00002126 Result = SemaRef.Context.getQualifiedType(Result, Quals);
2127
2128 TLB.push<QualifiedTypeLoc>(Result);
2129
2130 // No location information to preserve.
2131
2132 return Result;
2133}
2134
2135template <class TyLoc> static inline
2136QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2137 TyLoc NewT = TLB.push<TyLoc>(T.getType());
2138 NewT.setNameLoc(T.getNameLoc());
2139 return T.getType();
2140}
2141
2142// Ugly metaprogramming macros because I couldn't be bothered to make
2143// the equivalent template version work.
2144#define TransformPointerLikeType(TypeClass) do { \
2145 QualType PointeeType \
2146 = getDerived().TransformType(TLB, TL.getPointeeLoc()); \
2147 if (PointeeType.isNull()) \
2148 return QualType(); \
2149 \
2150 QualType Result = TL.getType(); \
2151 if (getDerived().AlwaysRebuild() || \
2152 PointeeType != TL.getPointeeLoc().getType()) { \
John McCall70dd5f62009-10-30 00:06:24 +00002153 Result = getDerived().Rebuild##TypeClass(PointeeType, \
2154 TL.getSigilLoc()); \
John McCall550e0c22009-10-21 00:40:46 +00002155 if (Result.isNull()) \
2156 return QualType(); \
2157 } \
2158 \
2159 TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result); \
2160 NewT.setSigilLoc(TL.getSigilLoc()); \
2161 \
2162 return Result; \
2163} while(0)
2164
John McCall550e0c22009-10-21 00:40:46 +00002165template<typename Derived>
2166QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2167 BuiltinTypeLoc T) {
2168 return TransformTypeSpecType(TLB, T);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002169}
Mike Stump11289f42009-09-09 15:08:12 +00002170
Douglas Gregord6ff3322009-08-04 16:50:30 +00002171template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002172QualType
John McCall550e0c22009-10-21 00:40:46 +00002173TreeTransform<Derived>::TransformFixedWidthIntType(TypeLocBuilder &TLB,
2174 FixedWidthIntTypeLoc T) {
2175 return TransformTypeSpecType(TLB, T);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002176}
Argyrios Kyrtzidise9189262009-08-19 01:28:17 +00002177
Douglas Gregord6ff3322009-08-04 16:50:30 +00002178template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002179QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2180 ComplexTypeLoc T) {
2181 // FIXME: recurse?
2182 return TransformTypeSpecType(TLB, T);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002183}
Mike Stump11289f42009-09-09 15:08:12 +00002184
Douglas Gregord6ff3322009-08-04 16:50:30 +00002185template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002186QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2187 PointerTypeLoc TL) {
2188 TransformPointerLikeType(PointerType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002189}
Mike Stump11289f42009-09-09 15:08:12 +00002190
2191template<typename Derived>
2192QualType
John McCall550e0c22009-10-21 00:40:46 +00002193TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2194 BlockPointerTypeLoc TL) {
2195 TransformPointerLikeType(BlockPointerType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002196}
2197
John McCall70dd5f62009-10-30 00:06:24 +00002198/// Transforms a reference type. Note that somewhat paradoxically we
2199/// don't care whether the type itself is an l-value type or an r-value
2200/// type; we only care if the type was *written* as an l-value type
2201/// or an r-value type.
2202template<typename Derived>
2203QualType
2204TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
2205 ReferenceTypeLoc TL) {
2206 const ReferenceType *T = TL.getTypePtr();
2207
2208 // Note that this works with the pointee-as-written.
2209 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2210 if (PointeeType.isNull())
2211 return QualType();
2212
2213 QualType Result = TL.getType();
2214 if (getDerived().AlwaysRebuild() ||
2215 PointeeType != T->getPointeeTypeAsWritten()) {
2216 Result = getDerived().RebuildReferenceType(PointeeType,
2217 T->isSpelledAsLValue(),
2218 TL.getSigilLoc());
2219 if (Result.isNull())
2220 return QualType();
2221 }
2222
2223 // r-value references can be rebuilt as l-value references.
2224 ReferenceTypeLoc NewTL;
2225 if (isa<LValueReferenceType>(Result))
2226 NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
2227 else
2228 NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
2229 NewTL.setSigilLoc(TL.getSigilLoc());
2230
2231 return Result;
2232}
2233
Mike Stump11289f42009-09-09 15:08:12 +00002234template<typename Derived>
2235QualType
John McCall550e0c22009-10-21 00:40:46 +00002236TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2237 LValueReferenceTypeLoc TL) {
John McCall70dd5f62009-10-30 00:06:24 +00002238 return TransformReferenceType(TLB, TL);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002239}
2240
Mike Stump11289f42009-09-09 15:08:12 +00002241template<typename Derived>
2242QualType
John McCall550e0c22009-10-21 00:40:46 +00002243TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2244 RValueReferenceTypeLoc TL) {
John McCall70dd5f62009-10-30 00:06:24 +00002245 return TransformReferenceType(TLB, TL);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002246}
Mike Stump11289f42009-09-09 15:08:12 +00002247
Douglas Gregord6ff3322009-08-04 16:50:30 +00002248template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002249QualType
John McCall550e0c22009-10-21 00:40:46 +00002250TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2251 MemberPointerTypeLoc TL) {
2252 MemberPointerType *T = TL.getTypePtr();
2253
2254 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002255 if (PointeeType.isNull())
2256 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002257
John McCall550e0c22009-10-21 00:40:46 +00002258 // TODO: preserve source information for this.
2259 QualType ClassType
2260 = getDerived().TransformType(QualType(T->getClass(), 0));
Douglas Gregord6ff3322009-08-04 16:50:30 +00002261 if (ClassType.isNull())
2262 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002263
John McCall550e0c22009-10-21 00:40:46 +00002264 QualType Result = TL.getType();
2265 if (getDerived().AlwaysRebuild() ||
2266 PointeeType != T->getPointeeType() ||
2267 ClassType != QualType(T->getClass(), 0)) {
John McCall70dd5f62009-10-30 00:06:24 +00002268 Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
2269 TL.getStarLoc());
John McCall550e0c22009-10-21 00:40:46 +00002270 if (Result.isNull())
2271 return QualType();
2272 }
Douglas Gregord6ff3322009-08-04 16:50:30 +00002273
John McCall550e0c22009-10-21 00:40:46 +00002274 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2275 NewTL.setSigilLoc(TL.getSigilLoc());
2276
2277 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002278}
2279
Mike Stump11289f42009-09-09 15:08:12 +00002280template<typename Derived>
2281QualType
John McCall550e0c22009-10-21 00:40:46 +00002282TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2283 ConstantArrayTypeLoc TL) {
2284 ConstantArrayType *T = TL.getTypePtr();
2285 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002286 if (ElementType.isNull())
2287 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002288
John McCall550e0c22009-10-21 00:40:46 +00002289 QualType Result = TL.getType();
2290 if (getDerived().AlwaysRebuild() ||
2291 ElementType != T->getElementType()) {
2292 Result = getDerived().RebuildConstantArrayType(ElementType,
2293 T->getSizeModifier(),
2294 T->getSize(),
John McCall70dd5f62009-10-30 00:06:24 +00002295 T->getIndexTypeCVRQualifiers(),
2296 TL.getBracketsRange());
John McCall550e0c22009-10-21 00:40:46 +00002297 if (Result.isNull())
2298 return QualType();
2299 }
2300
2301 ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2302 NewTL.setLBracketLoc(TL.getLBracketLoc());
2303 NewTL.setRBracketLoc(TL.getRBracketLoc());
Mike Stump11289f42009-09-09 15:08:12 +00002304
John McCall550e0c22009-10-21 00:40:46 +00002305 Expr *Size = TL.getSizeExpr();
2306 if (Size) {
2307 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2308 Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2309 }
2310 NewTL.setSizeExpr(Size);
2311
2312 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002313}
Mike Stump11289f42009-09-09 15:08:12 +00002314
Douglas Gregord6ff3322009-08-04 16:50:30 +00002315template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002316QualType TreeTransform<Derived>::TransformIncompleteArrayType(
John McCall550e0c22009-10-21 00:40:46 +00002317 TypeLocBuilder &TLB,
2318 IncompleteArrayTypeLoc TL) {
2319 IncompleteArrayType *T = TL.getTypePtr();
2320 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002321 if (ElementType.isNull())
2322 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002323
John McCall550e0c22009-10-21 00:40:46 +00002324 QualType Result = TL.getType();
2325 if (getDerived().AlwaysRebuild() ||
2326 ElementType != T->getElementType()) {
2327 Result = getDerived().RebuildIncompleteArrayType(ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00002328 T->getSizeModifier(),
John McCall70dd5f62009-10-30 00:06:24 +00002329 T->getIndexTypeCVRQualifiers(),
2330 TL.getBracketsRange());
John McCall550e0c22009-10-21 00:40:46 +00002331 if (Result.isNull())
2332 return QualType();
2333 }
2334
2335 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2336 NewTL.setLBracketLoc(TL.getLBracketLoc());
2337 NewTL.setRBracketLoc(TL.getRBracketLoc());
2338 NewTL.setSizeExpr(0);
2339
2340 return Result;
2341}
2342
2343template<typename Derived>
2344QualType
2345TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2346 VariableArrayTypeLoc TL) {
2347 VariableArrayType *T = TL.getTypePtr();
2348 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2349 if (ElementType.isNull())
2350 return QualType();
2351
2352 // Array bounds are not potentially evaluated contexts
2353 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2354
2355 Sema::OwningExprResult SizeResult
2356 = getDerived().TransformExpr(T->getSizeExpr());
2357 if (SizeResult.isInvalid())
2358 return QualType();
2359
2360 Expr *Size = static_cast<Expr*>(SizeResult.get());
2361
2362 QualType Result = TL.getType();
2363 if (getDerived().AlwaysRebuild() ||
2364 ElementType != T->getElementType() ||
2365 Size != T->getSizeExpr()) {
2366 Result = getDerived().RebuildVariableArrayType(ElementType,
2367 T->getSizeModifier(),
2368 move(SizeResult),
2369 T->getIndexTypeCVRQualifiers(),
John McCall70dd5f62009-10-30 00:06:24 +00002370 TL.getBracketsRange());
John McCall550e0c22009-10-21 00:40:46 +00002371 if (Result.isNull())
2372 return QualType();
2373 }
2374 else SizeResult.take();
2375
2376 VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2377 NewTL.setLBracketLoc(TL.getLBracketLoc());
2378 NewTL.setRBracketLoc(TL.getRBracketLoc());
2379 NewTL.setSizeExpr(Size);
2380
2381 return Result;
2382}
2383
2384template<typename Derived>
2385QualType
2386TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2387 DependentSizedArrayTypeLoc TL) {
2388 DependentSizedArrayType *T = TL.getTypePtr();
2389 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2390 if (ElementType.isNull())
2391 return QualType();
2392
2393 // Array bounds are not potentially evaluated contexts
2394 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2395
2396 Sema::OwningExprResult SizeResult
2397 = getDerived().TransformExpr(T->getSizeExpr());
2398 if (SizeResult.isInvalid())
2399 return QualType();
2400
2401 Expr *Size = static_cast<Expr*>(SizeResult.get());
2402
2403 QualType Result = TL.getType();
2404 if (getDerived().AlwaysRebuild() ||
2405 ElementType != T->getElementType() ||
2406 Size != T->getSizeExpr()) {
2407 Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2408 T->getSizeModifier(),
2409 move(SizeResult),
2410 T->getIndexTypeCVRQualifiers(),
John McCall70dd5f62009-10-30 00:06:24 +00002411 TL.getBracketsRange());
John McCall550e0c22009-10-21 00:40:46 +00002412 if (Result.isNull())
2413 return QualType();
2414 }
2415 else SizeResult.take();
2416
2417 // We might have any sort of array type now, but fortunately they
2418 // all have the same location layout.
2419 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2420 NewTL.setLBracketLoc(TL.getLBracketLoc());
2421 NewTL.setRBracketLoc(TL.getRBracketLoc());
2422 NewTL.setSizeExpr(Size);
2423
2424 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002425}
Mike Stump11289f42009-09-09 15:08:12 +00002426
2427template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002428QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
John McCall550e0c22009-10-21 00:40:46 +00002429 TypeLocBuilder &TLB,
2430 DependentSizedExtVectorTypeLoc TL) {
2431 DependentSizedExtVectorType *T = TL.getTypePtr();
2432
2433 // FIXME: ext vector locs should be nested
Douglas Gregord6ff3322009-08-04 16:50:30 +00002434 QualType ElementType = getDerived().TransformType(T->getElementType());
2435 if (ElementType.isNull())
2436 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002437
Douglas Gregore922c772009-08-04 22:27:00 +00002438 // Vector sizes are not potentially evaluated contexts
2439 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2440
Douglas Gregord6ff3322009-08-04 16:50:30 +00002441 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2442 if (Size.isInvalid())
2443 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002444
John McCall550e0c22009-10-21 00:40:46 +00002445 QualType Result = TL.getType();
2446 if (getDerived().AlwaysRebuild() ||
John McCall24e7cb62009-10-23 17:55:45 +00002447 ElementType != T->getElementType() ||
2448 Size.get() != T->getSizeExpr()) {
John McCall550e0c22009-10-21 00:40:46 +00002449 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00002450 move(Size),
2451 T->getAttributeLoc());
John McCall550e0c22009-10-21 00:40:46 +00002452 if (Result.isNull())
2453 return QualType();
2454 }
2455 else Size.take();
2456
2457 // Result might be dependent or not.
2458 if (isa<DependentSizedExtVectorType>(Result)) {
2459 DependentSizedExtVectorTypeLoc NewTL
2460 = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2461 NewTL.setNameLoc(TL.getNameLoc());
2462 } else {
2463 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2464 NewTL.setNameLoc(TL.getNameLoc());
2465 }
2466
2467 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002468}
Mike Stump11289f42009-09-09 15:08:12 +00002469
2470template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002471QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2472 VectorTypeLoc TL) {
2473 VectorType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002474 QualType ElementType = getDerived().TransformType(T->getElementType());
2475 if (ElementType.isNull())
2476 return QualType();
2477
John McCall550e0c22009-10-21 00:40:46 +00002478 QualType Result = TL.getType();
2479 if (getDerived().AlwaysRebuild() ||
2480 ElementType != T->getElementType()) {
2481 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements());
2482 if (Result.isNull())
2483 return QualType();
2484 }
2485
2486 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2487 NewTL.setNameLoc(TL.getNameLoc());
Mike Stump11289f42009-09-09 15:08:12 +00002488
John McCall550e0c22009-10-21 00:40:46 +00002489 return Result;
2490}
2491
2492template<typename Derived>
2493QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2494 ExtVectorTypeLoc TL) {
2495 VectorType *T = TL.getTypePtr();
2496 QualType ElementType = getDerived().TransformType(T->getElementType());
2497 if (ElementType.isNull())
2498 return QualType();
2499
2500 QualType Result = TL.getType();
2501 if (getDerived().AlwaysRebuild() ||
2502 ElementType != T->getElementType()) {
2503 Result = getDerived().RebuildExtVectorType(ElementType,
2504 T->getNumElements(),
2505 /*FIXME*/ SourceLocation());
2506 if (Result.isNull())
2507 return QualType();
2508 }
2509
2510 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2511 NewTL.setNameLoc(TL.getNameLoc());
2512
2513 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002514}
Mike Stump11289f42009-09-09 15:08:12 +00002515
2516template<typename Derived>
2517QualType
John McCall550e0c22009-10-21 00:40:46 +00002518TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
2519 FunctionProtoTypeLoc TL) {
2520 FunctionProtoType *T = TL.getTypePtr();
2521 QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002522 if (ResultType.isNull())
2523 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002524
John McCall550e0c22009-10-21 00:40:46 +00002525 // Transform the parameters.
Douglas Gregord6ff3322009-08-04 16:50:30 +00002526 llvm::SmallVector<QualType, 4> ParamTypes;
John McCall550e0c22009-10-21 00:40:46 +00002527 llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
2528 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2529 ParmVarDecl *OldParm = TL.getArg(i);
Mike Stump11289f42009-09-09 15:08:12 +00002530
John McCall550e0c22009-10-21 00:40:46 +00002531 QualType NewType;
2532 ParmVarDecl *NewParm;
2533
2534 if (OldParm) {
2535 DeclaratorInfo *OldDI = OldParm->getDeclaratorInfo();
2536 assert(OldDI->getType() == T->getArgType(i));
2537
2538 DeclaratorInfo *NewDI = getDerived().TransformType(OldDI);
2539 if (!NewDI)
2540 return QualType();
2541
2542 if (NewDI == OldDI)
2543 NewParm = OldParm;
2544 else
2545 NewParm = ParmVarDecl::Create(SemaRef.Context,
2546 OldParm->getDeclContext(),
2547 OldParm->getLocation(),
2548 OldParm->getIdentifier(),
2549 NewDI->getType(),
2550 NewDI,
2551 OldParm->getStorageClass(),
2552 /* DefArg */ NULL);
2553 NewType = NewParm->getType();
2554
2555 // Deal with the possibility that we don't have a parameter
2556 // declaration for this parameter.
2557 } else {
2558 NewParm = 0;
2559
2560 QualType OldType = T->getArgType(i);
2561 NewType = getDerived().TransformType(OldType);
2562 if (NewType.isNull())
2563 return QualType();
2564 }
2565
2566 ParamTypes.push_back(NewType);
2567 ParamDecls.push_back(NewParm);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002568 }
Mike Stump11289f42009-09-09 15:08:12 +00002569
John McCall550e0c22009-10-21 00:40:46 +00002570 QualType Result = TL.getType();
2571 if (getDerived().AlwaysRebuild() ||
2572 ResultType != T->getResultType() ||
2573 !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2574 Result = getDerived().RebuildFunctionProtoType(ResultType,
2575 ParamTypes.data(),
2576 ParamTypes.size(),
2577 T->isVariadic(),
2578 T->getTypeQuals());
2579 if (Result.isNull())
2580 return QualType();
2581 }
Mike Stump11289f42009-09-09 15:08:12 +00002582
John McCall550e0c22009-10-21 00:40:46 +00002583 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2584 NewTL.setLParenLoc(TL.getLParenLoc());
2585 NewTL.setRParenLoc(TL.getRParenLoc());
2586 for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2587 NewTL.setArg(i, ParamDecls[i]);
2588
2589 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002590}
Mike Stump11289f42009-09-09 15:08:12 +00002591
Douglas Gregord6ff3322009-08-04 16:50:30 +00002592template<typename Derived>
2593QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
John McCall550e0c22009-10-21 00:40:46 +00002594 TypeLocBuilder &TLB,
2595 FunctionNoProtoTypeLoc TL) {
2596 FunctionNoProtoType *T = TL.getTypePtr();
2597 QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2598 if (ResultType.isNull())
2599 return QualType();
2600
2601 QualType Result = TL.getType();
2602 if (getDerived().AlwaysRebuild() ||
2603 ResultType != T->getResultType())
2604 Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2605
2606 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2607 NewTL.setLParenLoc(TL.getLParenLoc());
2608 NewTL.setRParenLoc(TL.getRParenLoc());
2609
2610 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002611}
Mike Stump11289f42009-09-09 15:08:12 +00002612
Douglas Gregord6ff3322009-08-04 16:50:30 +00002613template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002614QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2615 TypedefTypeLoc TL) {
2616 TypedefType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002617 TypedefDecl *Typedef
2618 = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2619 if (!Typedef)
2620 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002621
John McCall550e0c22009-10-21 00:40:46 +00002622 QualType Result = TL.getType();
2623 if (getDerived().AlwaysRebuild() ||
2624 Typedef != T->getDecl()) {
2625 Result = getDerived().RebuildTypedefType(Typedef);
2626 if (Result.isNull())
2627 return QualType();
2628 }
Mike Stump11289f42009-09-09 15:08:12 +00002629
John McCall550e0c22009-10-21 00:40:46 +00002630 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
2631 NewTL.setNameLoc(TL.getNameLoc());
2632
2633 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002634}
Mike Stump11289f42009-09-09 15:08:12 +00002635
Douglas Gregord6ff3322009-08-04 16:50:30 +00002636template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002637QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
2638 TypeOfExprTypeLoc TL) {
2639 TypeOfExprType *T = TL.getTypePtr();
2640
Douglas Gregore922c772009-08-04 22:27:00 +00002641 // typeof expressions are not potentially evaluated contexts
2642 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002643
Douglas Gregord6ff3322009-08-04 16:50:30 +00002644 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2645 if (E.isInvalid())
2646 return QualType();
2647
John McCall550e0c22009-10-21 00:40:46 +00002648 QualType Result = TL.getType();
2649 if (getDerived().AlwaysRebuild() ||
2650 E.get() != T->getUnderlyingExpr()) {
2651 Result = getDerived().RebuildTypeOfExprType(move(E));
2652 if (Result.isNull())
2653 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002654 }
John McCall550e0c22009-10-21 00:40:46 +00002655 else E.take();
Mike Stump11289f42009-09-09 15:08:12 +00002656
John McCall550e0c22009-10-21 00:40:46 +00002657 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
2658 NewTL.setNameLoc(TL.getNameLoc());
2659
2660 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002661}
Mike Stump11289f42009-09-09 15:08:12 +00002662
2663template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002664QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
2665 TypeOfTypeLoc TL) {
2666 TypeOfType *T = TL.getTypePtr();
2667
2668 // FIXME: should be an inner type, or at least have a DeclaratorInfo.
Douglas Gregord6ff3322009-08-04 16:50:30 +00002669 QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2670 if (Underlying.isNull())
2671 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002672
John McCall550e0c22009-10-21 00:40:46 +00002673 QualType Result = TL.getType();
2674 if (getDerived().AlwaysRebuild() ||
2675 Underlying != T->getUnderlyingType()) {
2676 Result = getDerived().RebuildTypeOfType(Underlying);
2677 if (Result.isNull())
2678 return QualType();
2679 }
Mike Stump11289f42009-09-09 15:08:12 +00002680
John McCall550e0c22009-10-21 00:40:46 +00002681 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
2682 NewTL.setNameLoc(TL.getNameLoc());
2683
2684 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002685}
Mike Stump11289f42009-09-09 15:08:12 +00002686
2687template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002688QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
2689 DecltypeTypeLoc TL) {
2690 DecltypeType *T = TL.getTypePtr();
2691
Douglas Gregore922c772009-08-04 22:27:00 +00002692 // decltype expressions are not potentially evaluated contexts
2693 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002694
Douglas Gregord6ff3322009-08-04 16:50:30 +00002695 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2696 if (E.isInvalid())
2697 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002698
John McCall550e0c22009-10-21 00:40:46 +00002699 QualType Result = TL.getType();
2700 if (getDerived().AlwaysRebuild() ||
2701 E.get() != T->getUnderlyingExpr()) {
2702 Result = getDerived().RebuildDecltypeType(move(E));
2703 if (Result.isNull())
2704 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002705 }
John McCall550e0c22009-10-21 00:40:46 +00002706 else E.take();
Mike Stump11289f42009-09-09 15:08:12 +00002707
John McCall550e0c22009-10-21 00:40:46 +00002708 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
2709 NewTL.setNameLoc(TL.getNameLoc());
2710
2711 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002712}
2713
2714template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002715QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
2716 RecordTypeLoc TL) {
2717 RecordType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002718 RecordDecl *Record
John McCall550e0c22009-10-21 00:40:46 +00002719 = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
Douglas Gregord6ff3322009-08-04 16:50:30 +00002720 if (!Record)
2721 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002722
John McCall550e0c22009-10-21 00:40:46 +00002723 QualType Result = TL.getType();
2724 if (getDerived().AlwaysRebuild() ||
2725 Record != T->getDecl()) {
2726 Result = getDerived().RebuildRecordType(Record);
2727 if (Result.isNull())
2728 return QualType();
2729 }
Mike Stump11289f42009-09-09 15:08:12 +00002730
John McCall550e0c22009-10-21 00:40:46 +00002731 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
2732 NewTL.setNameLoc(TL.getNameLoc());
2733
2734 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002735}
Mike Stump11289f42009-09-09 15:08:12 +00002736
2737template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002738QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
2739 EnumTypeLoc TL) {
2740 EnumType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002741 EnumDecl *Enum
John McCall550e0c22009-10-21 00:40:46 +00002742 = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
Douglas Gregord6ff3322009-08-04 16:50:30 +00002743 if (!Enum)
2744 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002745
John McCall550e0c22009-10-21 00:40:46 +00002746 QualType Result = TL.getType();
2747 if (getDerived().AlwaysRebuild() ||
2748 Enum != T->getDecl()) {
2749 Result = getDerived().RebuildEnumType(Enum);
2750 if (Result.isNull())
2751 return QualType();
2752 }
Mike Stump11289f42009-09-09 15:08:12 +00002753
John McCall550e0c22009-10-21 00:40:46 +00002754 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
2755 NewTL.setNameLoc(TL.getNameLoc());
2756
2757 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002758}
John McCallfcc33b02009-09-05 00:15:47 +00002759
2760template <typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002761QualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
2762 ElaboratedTypeLoc TL) {
2763 ElaboratedType *T = TL.getTypePtr();
2764
2765 // FIXME: this should be a nested type.
John McCallfcc33b02009-09-05 00:15:47 +00002766 QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2767 if (Underlying.isNull())
2768 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002769
John McCall550e0c22009-10-21 00:40:46 +00002770 QualType Result = TL.getType();
2771 if (getDerived().AlwaysRebuild() ||
2772 Underlying != T->getUnderlyingType()) {
2773 Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
2774 if (Result.isNull())
2775 return QualType();
2776 }
Mike Stump11289f42009-09-09 15:08:12 +00002777
John McCall550e0c22009-10-21 00:40:46 +00002778 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
2779 NewTL.setNameLoc(TL.getNameLoc());
2780
2781 return Result;
John McCallfcc33b02009-09-05 00:15:47 +00002782}
Mike Stump11289f42009-09-09 15:08:12 +00002783
2784
Douglas Gregord6ff3322009-08-04 16:50:30 +00002785template<typename Derived>
2786QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
John McCall550e0c22009-10-21 00:40:46 +00002787 TypeLocBuilder &TLB,
2788 TemplateTypeParmTypeLoc TL) {
2789 return TransformTypeSpecType(TLB, TL);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002790}
2791
Mike Stump11289f42009-09-09 15:08:12 +00002792template<typename Derived>
John McCallcebee162009-10-18 09:09:24 +00002793QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
John McCall550e0c22009-10-21 00:40:46 +00002794 TypeLocBuilder &TLB,
2795 SubstTemplateTypeParmTypeLoc TL) {
2796 return TransformTypeSpecType(TLB, TL);
John McCallcebee162009-10-18 09:09:24 +00002797}
2798
2799template<typename Derived>
Douglas Gregorc59e5612009-10-19 22:04:39 +00002800inline QualType
2801TreeTransform<Derived>::TransformTemplateSpecializationType(
John McCall550e0c22009-10-21 00:40:46 +00002802 TypeLocBuilder &TLB,
2803 TemplateSpecializationTypeLoc TL) {
John McCall0ad16662009-10-29 08:12:44 +00002804 return TransformTemplateSpecializationType(TLB, TL, QualType());
2805}
John McCall550e0c22009-10-21 00:40:46 +00002806
John McCall0ad16662009-10-29 08:12:44 +00002807template<typename Derived>
2808QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2809 const TemplateSpecializationType *TST,
2810 QualType ObjectType) {
2811 // FIXME: this entire method is a temporary workaround; callers
2812 // should be rewritten to provide real type locs.
John McCall550e0c22009-10-21 00:40:46 +00002813
John McCall0ad16662009-10-29 08:12:44 +00002814 // Fake up a TemplateSpecializationTypeLoc.
2815 TypeLocBuilder TLB;
2816 TemplateSpecializationTypeLoc TL
2817 = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
2818
John McCall0d07eb32009-10-29 18:45:58 +00002819 SourceLocation BaseLoc = getDerived().getBaseLocation();
2820
2821 TL.setTemplateNameLoc(BaseLoc);
2822 TL.setLAngleLoc(BaseLoc);
2823 TL.setRAngleLoc(BaseLoc);
John McCall0ad16662009-10-29 08:12:44 +00002824 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2825 const TemplateArgument &TA = TST->getArg(i);
2826 TemplateArgumentLoc TAL;
2827 getDerived().InventTemplateArgumentLoc(TA, TAL);
2828 TL.setArgLocInfo(i, TAL.getLocInfo());
2829 }
2830
2831 TypeLocBuilder IgnoredTLB;
2832 return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
Douglas Gregorc59e5612009-10-19 22:04:39 +00002833}
2834
2835template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002836QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
John McCall0ad16662009-10-29 08:12:44 +00002837 TypeLocBuilder &TLB,
2838 TemplateSpecializationTypeLoc TL,
2839 QualType ObjectType) {
2840 const TemplateSpecializationType *T = TL.getTypePtr();
2841
Mike Stump11289f42009-09-09 15:08:12 +00002842 TemplateName Template
Douglas Gregorc59e5612009-10-19 22:04:39 +00002843 = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002844 if (Template.isNull())
2845 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002846
John McCall0ad16662009-10-29 08:12:44 +00002847 llvm::SmallVector<TemplateArgumentLoc, 4> NewTemplateArgs(T->getNumArgs());
2848 for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i)
2849 if (getDerived().TransformTemplateArgument(TL.getArgLoc(i),
2850 NewTemplateArgs[i]))
Douglas Gregord6ff3322009-08-04 16:50:30 +00002851 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002852
John McCall0ad16662009-10-29 08:12:44 +00002853 // FIXME: maybe don't rebuild if all the template arguments are the same.
2854
2855 QualType Result =
2856 getDerived().RebuildTemplateSpecializationType(Template,
2857 TL.getTemplateNameLoc(),
2858 TL.getLAngleLoc(),
2859 NewTemplateArgs.data(),
2860 NewTemplateArgs.size(),
2861 TL.getRAngleLoc());
2862
2863 if (!Result.isNull()) {
2864 TemplateSpecializationTypeLoc NewTL
2865 = TLB.push<TemplateSpecializationTypeLoc>(Result);
2866 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
2867 NewTL.setLAngleLoc(TL.getLAngleLoc());
2868 NewTL.setRAngleLoc(TL.getRAngleLoc());
2869 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
2870 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002871 }
Mike Stump11289f42009-09-09 15:08:12 +00002872
John McCall0ad16662009-10-29 08:12:44 +00002873 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002874}
Mike Stump11289f42009-09-09 15:08:12 +00002875
2876template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002877QualType
2878TreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB,
2879 QualifiedNameTypeLoc TL) {
2880 QualifiedNameType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002881 NestedNameSpecifier *NNS
2882 = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2883 SourceRange());
2884 if (!NNS)
2885 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002886
Douglas Gregord6ff3322009-08-04 16:50:30 +00002887 QualType Named = getDerived().TransformType(T->getNamedType());
2888 if (Named.isNull())
2889 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002890
John McCall550e0c22009-10-21 00:40:46 +00002891 QualType Result = TL.getType();
2892 if (getDerived().AlwaysRebuild() ||
2893 NNS != T->getQualifier() ||
2894 Named != T->getNamedType()) {
2895 Result = getDerived().RebuildQualifiedNameType(NNS, Named);
2896 if (Result.isNull())
2897 return QualType();
2898 }
Douglas Gregord6ff3322009-08-04 16:50:30 +00002899
John McCall550e0c22009-10-21 00:40:46 +00002900 QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result);
2901 NewTL.setNameLoc(TL.getNameLoc());
2902
2903 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002904}
Mike Stump11289f42009-09-09 15:08:12 +00002905
2906template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002907QualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB,
2908 TypenameTypeLoc TL) {
2909 TypenameType *T = TL.getTypePtr();
John McCall0ad16662009-10-29 08:12:44 +00002910
2911 /* FIXME: preserve source information better than this */
2912 SourceRange SR(TL.getNameLoc());
2913
Douglas Gregord6ff3322009-08-04 16:50:30 +00002914 NestedNameSpecifier *NNS
John McCall0ad16662009-10-29 08:12:44 +00002915 = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002916 if (!NNS)
2917 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002918
John McCall550e0c22009-10-21 00:40:46 +00002919 QualType Result;
2920
Douglas Gregord6ff3322009-08-04 16:50:30 +00002921 if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
Mike Stump11289f42009-09-09 15:08:12 +00002922 QualType NewTemplateId
Douglas Gregord6ff3322009-08-04 16:50:30 +00002923 = getDerived().TransformType(QualType(TemplateId, 0));
2924 if (NewTemplateId.isNull())
2925 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002926
Douglas Gregord6ff3322009-08-04 16:50:30 +00002927 if (!getDerived().AlwaysRebuild() &&
2928 NNS == T->getQualifier() &&
2929 NewTemplateId == QualType(TemplateId, 0))
2930 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002931
John McCall550e0c22009-10-21 00:40:46 +00002932 Result = getDerived().RebuildTypenameType(NNS, NewTemplateId);
2933 } else {
John McCall0ad16662009-10-29 08:12:44 +00002934 Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002935 }
John McCall550e0c22009-10-21 00:40:46 +00002936 if (Result.isNull())
2937 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002938
John McCall550e0c22009-10-21 00:40:46 +00002939 TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result);
2940 NewTL.setNameLoc(TL.getNameLoc());
2941
2942 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002943}
Mike Stump11289f42009-09-09 15:08:12 +00002944
Douglas Gregord6ff3322009-08-04 16:50:30 +00002945template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002946QualType
2947TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
2948 ObjCInterfaceTypeLoc TL) {
John McCallfc93cf92009-10-22 22:37:11 +00002949 assert(false && "TransformObjCInterfaceType unimplemented");
2950 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002951}
Mike Stump11289f42009-09-09 15:08:12 +00002952
2953template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002954QualType
2955TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
2956 ObjCObjectPointerTypeLoc TL) {
John McCallfc93cf92009-10-22 22:37:11 +00002957 assert(false && "TransformObjCObjectPointerType unimplemented");
2958 return QualType();
Argyrios Kyrtzidisa7a36df2009-09-29 19:42:55 +00002959}
2960
Douglas Gregord6ff3322009-08-04 16:50:30 +00002961//===----------------------------------------------------------------------===//
Douglas Gregorebe10102009-08-20 07:17:43 +00002962// Statement transformation
2963//===----------------------------------------------------------------------===//
2964template<typename Derived>
2965Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002966TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
2967 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002968}
2969
2970template<typename Derived>
2971Sema::OwningStmtResult
2972TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
2973 return getDerived().TransformCompoundStmt(S, false);
2974}
2975
2976template<typename Derived>
2977Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002978TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
Douglas Gregorebe10102009-08-20 07:17:43 +00002979 bool IsStmtExpr) {
2980 bool SubStmtChanged = false;
2981 ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
2982 for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
2983 B != BEnd; ++B) {
2984 OwningStmtResult Result = getDerived().TransformStmt(*B);
2985 if (Result.isInvalid())
2986 return getSema().StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00002987
Douglas Gregorebe10102009-08-20 07:17:43 +00002988 SubStmtChanged = SubStmtChanged || Result.get() != *B;
2989 Statements.push_back(Result.takeAs<Stmt>());
2990 }
Mike Stump11289f42009-09-09 15:08:12 +00002991
Douglas Gregorebe10102009-08-20 07:17:43 +00002992 if (!getDerived().AlwaysRebuild() &&
2993 !SubStmtChanged)
Mike Stump11289f42009-09-09 15:08:12 +00002994 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002995
2996 return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
2997 move_arg(Statements),
2998 S->getRBracLoc(),
2999 IsStmtExpr);
3000}
Mike Stump11289f42009-09-09 15:08:12 +00003001
Douglas Gregorebe10102009-08-20 07:17:43 +00003002template<typename Derived>
3003Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003004TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003005 // The case value expressions are not potentially evaluated.
3006 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00003007
Douglas Gregorebe10102009-08-20 07:17:43 +00003008 // Transform the left-hand case value.
3009 OwningExprResult LHS = getDerived().TransformExpr(S->getLHS());
3010 if (LHS.isInvalid())
3011 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003012
Douglas Gregorebe10102009-08-20 07:17:43 +00003013 // Transform the right-hand case value (for the GNU case-range extension).
3014 OwningExprResult RHS = getDerived().TransformExpr(S->getRHS());
3015 if (RHS.isInvalid())
3016 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003017
Douglas Gregorebe10102009-08-20 07:17:43 +00003018 // Build the case statement.
3019 // Case statements are always rebuilt so that they will attached to their
3020 // transformed switch statement.
3021 OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
3022 move(LHS),
3023 S->getEllipsisLoc(),
3024 move(RHS),
3025 S->getColonLoc());
3026 if (Case.isInvalid())
3027 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003028
Douglas Gregorebe10102009-08-20 07:17:43 +00003029 // Transform the statement following the case
3030 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3031 if (SubStmt.isInvalid())
3032 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003033
Douglas Gregorebe10102009-08-20 07:17:43 +00003034 // Attach the body to the case statement
3035 return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
3036}
3037
3038template<typename Derived>
3039Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003040TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003041 // Transform the statement following the default case
3042 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3043 if (SubStmt.isInvalid())
3044 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003045
Douglas Gregorebe10102009-08-20 07:17:43 +00003046 // Default statements are always rebuilt
3047 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
3048 move(SubStmt));
3049}
Mike Stump11289f42009-09-09 15:08:12 +00003050
Douglas Gregorebe10102009-08-20 07:17:43 +00003051template<typename Derived>
3052Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003053TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003054 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3055 if (SubStmt.isInvalid())
3056 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003057
Douglas Gregorebe10102009-08-20 07:17:43 +00003058 // FIXME: Pass the real colon location in.
3059 SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
3060 return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
3061 move(SubStmt));
3062}
Mike Stump11289f42009-09-09 15:08:12 +00003063
Douglas Gregorebe10102009-08-20 07:17:43 +00003064template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003065Sema::OwningStmtResult
3066TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003067 // Transform the condition
3068 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3069 if (Cond.isInvalid())
3070 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003071
Douglas Gregorebe10102009-08-20 07:17:43 +00003072 Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
Mike Stump11289f42009-09-09 15:08:12 +00003073
Douglas Gregorebe10102009-08-20 07:17:43 +00003074 // Transform the "then" branch.
3075 OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
3076 if (Then.isInvalid())
3077 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003078
Douglas Gregorebe10102009-08-20 07:17:43 +00003079 // Transform the "else" branch.
3080 OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
3081 if (Else.isInvalid())
3082 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003083
Douglas Gregorebe10102009-08-20 07:17:43 +00003084 if (!getDerived().AlwaysRebuild() &&
3085 FullCond->get() == S->getCond() &&
3086 Then.get() == S->getThen() &&
3087 Else.get() == S->getElse())
Mike Stump11289f42009-09-09 15:08:12 +00003088 return SemaRef.Owned(S->Retain());
3089
Douglas Gregorebe10102009-08-20 07:17:43 +00003090 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then),
Mike Stump11289f42009-09-09 15:08:12 +00003091 S->getElseLoc(), move(Else));
Douglas Gregorebe10102009-08-20 07:17:43 +00003092}
3093
3094template<typename Derived>
3095Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003096TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003097 // Transform the condition.
3098 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3099 if (Cond.isInvalid())
3100 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003101
Douglas Gregorebe10102009-08-20 07:17:43 +00003102 // Rebuild the switch statement.
3103 OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond));
3104 if (Switch.isInvalid())
3105 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003106
Douglas Gregorebe10102009-08-20 07:17:43 +00003107 // Transform the body of the switch statement.
3108 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3109 if (Body.isInvalid())
3110 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003111
Douglas Gregorebe10102009-08-20 07:17:43 +00003112 // Complete the switch statement.
3113 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
3114 move(Body));
3115}
Mike Stump11289f42009-09-09 15:08:12 +00003116
Douglas Gregorebe10102009-08-20 07:17:43 +00003117template<typename Derived>
3118Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003119TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003120 // Transform the condition
3121 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3122 if (Cond.isInvalid())
3123 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003124
Douglas Gregorebe10102009-08-20 07:17:43 +00003125 Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
Mike Stump11289f42009-09-09 15:08:12 +00003126
Douglas Gregorebe10102009-08-20 07:17:43 +00003127 // Transform the body
3128 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3129 if (Body.isInvalid())
3130 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003131
Douglas Gregorebe10102009-08-20 07:17:43 +00003132 if (!getDerived().AlwaysRebuild() &&
3133 FullCond->get() == S->getCond() &&
3134 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00003135 return SemaRef.Owned(S->Retain());
3136
Douglas Gregorebe10102009-08-20 07:17:43 +00003137 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body));
3138}
Mike Stump11289f42009-09-09 15:08:12 +00003139
Douglas Gregorebe10102009-08-20 07:17:43 +00003140template<typename Derived>
3141Sema::OwningStmtResult
3142TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
3143 // Transform the condition
3144 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3145 if (Cond.isInvalid())
3146 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003147
Douglas Gregorebe10102009-08-20 07:17:43 +00003148 // Transform the body
3149 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3150 if (Body.isInvalid())
3151 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003152
Douglas Gregorebe10102009-08-20 07:17:43 +00003153 if (!getDerived().AlwaysRebuild() &&
3154 Cond.get() == S->getCond() &&
3155 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00003156 return SemaRef.Owned(S->Retain());
3157
Douglas Gregorebe10102009-08-20 07:17:43 +00003158 return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
3159 /*FIXME:*/S->getWhileLoc(), move(Cond),
3160 S->getRParenLoc());
3161}
Mike Stump11289f42009-09-09 15:08:12 +00003162
Douglas Gregorebe10102009-08-20 07:17:43 +00003163template<typename Derived>
3164Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003165TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003166 // Transform the initialization statement
3167 OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
3168 if (Init.isInvalid())
3169 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003170
Douglas Gregorebe10102009-08-20 07:17:43 +00003171 // Transform the condition
3172 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3173 if (Cond.isInvalid())
3174 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003175
Douglas Gregorebe10102009-08-20 07:17:43 +00003176 // Transform the increment
3177 OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
3178 if (Inc.isInvalid())
3179 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003180
Douglas Gregorebe10102009-08-20 07:17:43 +00003181 // Transform the body
3182 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3183 if (Body.isInvalid())
3184 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003185
Douglas Gregorebe10102009-08-20 07:17:43 +00003186 if (!getDerived().AlwaysRebuild() &&
3187 Init.get() == S->getInit() &&
3188 Cond.get() == S->getCond() &&
3189 Inc.get() == S->getInc() &&
3190 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00003191 return SemaRef.Owned(S->Retain());
3192
Douglas Gregorebe10102009-08-20 07:17:43 +00003193 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
3194 move(Init), move(Cond), move(Inc),
3195 S->getRParenLoc(), move(Body));
3196}
3197
3198template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003199Sema::OwningStmtResult
3200TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003201 // Goto statements must always be rebuilt, to resolve the label.
Mike Stump11289f42009-09-09 15:08:12 +00003202 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
Douglas Gregorebe10102009-08-20 07:17:43 +00003203 S->getLabel());
3204}
3205
3206template<typename Derived>
3207Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003208TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003209 OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
3210 if (Target.isInvalid())
3211 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003212
Douglas Gregorebe10102009-08-20 07:17:43 +00003213 if (!getDerived().AlwaysRebuild() &&
3214 Target.get() == S->getTarget())
Mike Stump11289f42009-09-09 15:08:12 +00003215 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003216
3217 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
3218 move(Target));
3219}
3220
3221template<typename Derived>
3222Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003223TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
3224 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003225}
Mike Stump11289f42009-09-09 15:08:12 +00003226
Douglas Gregorebe10102009-08-20 07:17:43 +00003227template<typename Derived>
3228Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003229TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
3230 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003231}
Mike Stump11289f42009-09-09 15:08:12 +00003232
Douglas Gregorebe10102009-08-20 07:17:43 +00003233template<typename Derived>
3234Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003235TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003236 Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
3237 if (Result.isInvalid())
3238 return SemaRef.StmtError();
3239
Mike Stump11289f42009-09-09 15:08:12 +00003240 // FIXME: We always rebuild the return statement because there is no way
Douglas Gregorebe10102009-08-20 07:17:43 +00003241 // to tell whether the return type of the function has changed.
3242 return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
3243}
Mike Stump11289f42009-09-09 15:08:12 +00003244
Douglas Gregorebe10102009-08-20 07:17:43 +00003245template<typename Derived>
3246Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003247TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003248 bool DeclChanged = false;
3249 llvm::SmallVector<Decl *, 4> Decls;
3250 for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
3251 D != DEnd; ++D) {
3252 Decl *Transformed = getDerived().TransformDefinition(*D);
3253 if (!Transformed)
3254 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003255
Douglas Gregorebe10102009-08-20 07:17:43 +00003256 if (Transformed != *D)
3257 DeclChanged = true;
Mike Stump11289f42009-09-09 15:08:12 +00003258
Douglas Gregorebe10102009-08-20 07:17:43 +00003259 Decls.push_back(Transformed);
3260 }
Mike Stump11289f42009-09-09 15:08:12 +00003261
Douglas Gregorebe10102009-08-20 07:17:43 +00003262 if (!getDerived().AlwaysRebuild() && !DeclChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003263 return SemaRef.Owned(S->Retain());
3264
3265 return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
Douglas Gregorebe10102009-08-20 07:17:43 +00003266 S->getStartLoc(), S->getEndLoc());
3267}
Mike Stump11289f42009-09-09 15:08:12 +00003268
Douglas Gregorebe10102009-08-20 07:17:43 +00003269template<typename Derived>
3270Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003271TreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003272 assert(false && "SwitchCase is abstract and cannot be transformed");
Mike Stump11289f42009-09-09 15:08:12 +00003273 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003274}
3275
3276template<typename Derived>
3277Sema::OwningStmtResult
3278TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
3279 // FIXME: Implement!
3280 assert(false && "Inline assembly cannot be transformed");
Mike Stump11289f42009-09-09 15:08:12 +00003281 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003282}
3283
3284
3285template<typename Derived>
3286Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003287TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003288 // FIXME: Implement this
3289 assert(false && "Cannot transform an Objective-C @try statement");
Mike Stump11289f42009-09-09 15:08:12 +00003290 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003291}
Mike Stump11289f42009-09-09 15:08:12 +00003292
Douglas Gregorebe10102009-08-20 07:17:43 +00003293template<typename Derived>
3294Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003295TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003296 // FIXME: Implement this
3297 assert(false && "Cannot transform an Objective-C @catch statement");
3298 return SemaRef.Owned(S->Retain());
3299}
Mike Stump11289f42009-09-09 15:08:12 +00003300
Douglas Gregorebe10102009-08-20 07:17:43 +00003301template<typename Derived>
3302Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003303TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003304 // FIXME: Implement this
3305 assert(false && "Cannot transform an Objective-C @finally statement");
Mike Stump11289f42009-09-09 15:08:12 +00003306 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003307}
Mike Stump11289f42009-09-09 15:08:12 +00003308
Douglas Gregorebe10102009-08-20 07:17:43 +00003309template<typename Derived>
3310Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003311TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003312 // FIXME: Implement this
3313 assert(false && "Cannot transform an Objective-C @throw statement");
Mike Stump11289f42009-09-09 15:08:12 +00003314 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003315}
Mike Stump11289f42009-09-09 15:08:12 +00003316
Douglas Gregorebe10102009-08-20 07:17:43 +00003317template<typename Derived>
3318Sema::OwningStmtResult
3319TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
Mike Stump11289f42009-09-09 15:08:12 +00003320 ObjCAtSynchronizedStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003321 // FIXME: Implement this
3322 assert(false && "Cannot transform an Objective-C @synchronized statement");
Mike Stump11289f42009-09-09 15:08:12 +00003323 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003324}
3325
3326template<typename Derived>
3327Sema::OwningStmtResult
3328TreeTransform<Derived>::TransformObjCForCollectionStmt(
Mike Stump11289f42009-09-09 15:08:12 +00003329 ObjCForCollectionStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003330 // FIXME: Implement this
3331 assert(false && "Cannot transform an Objective-C for-each statement");
Mike Stump11289f42009-09-09 15:08:12 +00003332 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003333}
3334
3335
3336template<typename Derived>
3337Sema::OwningStmtResult
3338TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
3339 // Transform the exception declaration, if any.
3340 VarDecl *Var = 0;
3341 if (S->getExceptionDecl()) {
3342 VarDecl *ExceptionDecl = S->getExceptionDecl();
3343 TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
3344 ExceptionDecl->getDeclName());
3345
3346 QualType T = getDerived().TransformType(ExceptionDecl->getType());
3347 if (T.isNull())
3348 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003349
Douglas Gregorebe10102009-08-20 07:17:43 +00003350 Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
3351 T,
3352 ExceptionDecl->getDeclaratorInfo(),
3353 ExceptionDecl->getIdentifier(),
3354 ExceptionDecl->getLocation(),
3355 /*FIXME: Inaccurate*/
3356 SourceRange(ExceptionDecl->getLocation()));
3357 if (!Var || Var->isInvalidDecl()) {
3358 if (Var)
3359 Var->Destroy(SemaRef.Context);
3360 return SemaRef.StmtError();
3361 }
3362 }
Mike Stump11289f42009-09-09 15:08:12 +00003363
Douglas Gregorebe10102009-08-20 07:17:43 +00003364 // Transform the actual exception handler.
3365 OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
3366 if (Handler.isInvalid()) {
3367 if (Var)
3368 Var->Destroy(SemaRef.Context);
3369 return SemaRef.StmtError();
3370 }
Mike Stump11289f42009-09-09 15:08:12 +00003371
Douglas Gregorebe10102009-08-20 07:17:43 +00003372 if (!getDerived().AlwaysRebuild() &&
3373 !Var &&
3374 Handler.get() == S->getHandlerBlock())
Mike Stump11289f42009-09-09 15:08:12 +00003375 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003376
3377 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
3378 Var,
3379 move(Handler));
3380}
Mike Stump11289f42009-09-09 15:08:12 +00003381
Douglas Gregorebe10102009-08-20 07:17:43 +00003382template<typename Derived>
3383Sema::OwningStmtResult
3384TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
3385 // Transform the try block itself.
Mike Stump11289f42009-09-09 15:08:12 +00003386 OwningStmtResult TryBlock
Douglas Gregorebe10102009-08-20 07:17:43 +00003387 = getDerived().TransformCompoundStmt(S->getTryBlock());
3388 if (TryBlock.isInvalid())
3389 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003390
Douglas Gregorebe10102009-08-20 07:17:43 +00003391 // Transform the handlers.
3392 bool HandlerChanged = false;
3393 ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
3394 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
Mike Stump11289f42009-09-09 15:08:12 +00003395 OwningStmtResult Handler
Douglas Gregorebe10102009-08-20 07:17:43 +00003396 = getDerived().TransformCXXCatchStmt(S->getHandler(I));
3397 if (Handler.isInvalid())
3398 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003399
Douglas Gregorebe10102009-08-20 07:17:43 +00003400 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
3401 Handlers.push_back(Handler.takeAs<Stmt>());
3402 }
Mike Stump11289f42009-09-09 15:08:12 +00003403
Douglas Gregorebe10102009-08-20 07:17:43 +00003404 if (!getDerived().AlwaysRebuild() &&
3405 TryBlock.get() == S->getTryBlock() &&
3406 !HandlerChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003407 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003408
3409 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
Mike Stump11289f42009-09-09 15:08:12 +00003410 move_arg(Handlers));
Douglas Gregorebe10102009-08-20 07:17:43 +00003411}
Mike Stump11289f42009-09-09 15:08:12 +00003412
Douglas Gregorebe10102009-08-20 07:17:43 +00003413//===----------------------------------------------------------------------===//
Douglas Gregora16548e2009-08-11 05:31:07 +00003414// Expression transformation
3415//===----------------------------------------------------------------------===//
Mike Stump11289f42009-09-09 15:08:12 +00003416template<typename Derived>
3417Sema::OwningExprResult
3418TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
3419 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003420}
Mike Stump11289f42009-09-09 15:08:12 +00003421
3422template<typename Derived>
3423Sema::OwningExprResult
3424TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003425 NestedNameSpecifier *Qualifier = 0;
3426 if (E->getQualifier()) {
3427 Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3428 E->getQualifierRange());
3429 if (!Qualifier)
3430 return SemaRef.ExprError();
3431 }
3432
Mike Stump11289f42009-09-09 15:08:12 +00003433 NamedDecl *ND
Douglas Gregora16548e2009-08-11 05:31:07 +00003434 = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3435 if (!ND)
3436 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003437
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003438 if (!getDerived().AlwaysRebuild() &&
3439 Qualifier == E->getQualifier() &&
3440 ND == E->getDecl() &&
3441 !E->hasExplicitTemplateArgumentList())
Mike Stump11289f42009-09-09 15:08:12 +00003442 return SemaRef.Owned(E->Retain());
3443
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003444 // FIXME: We're losing the explicit template arguments in this transformation.
3445
John McCall0ad16662009-10-29 08:12:44 +00003446 llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003447 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
John McCall0ad16662009-10-29 08:12:44 +00003448 if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
3449 TransArgs[I]))
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003450 return SemaRef.ExprError();
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003451 }
3452
3453 // FIXME: Pass the qualifier/qualifier range along.
3454 return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
3455 ND, E->getLocation());
Douglas Gregora16548e2009-08-11 05:31:07 +00003456}
Mike Stump11289f42009-09-09 15:08:12 +00003457
Douglas Gregora16548e2009-08-11 05:31:07 +00003458template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003459Sema::OwningExprResult
3460TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
3461 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003462}
Mike Stump11289f42009-09-09 15:08:12 +00003463
Douglas Gregora16548e2009-08-11 05:31:07 +00003464template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003465Sema::OwningExprResult
3466TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
3467 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003468}
Mike Stump11289f42009-09-09 15:08:12 +00003469
Douglas Gregora16548e2009-08-11 05:31:07 +00003470template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003471Sema::OwningExprResult
3472TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
3473 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003474}
Mike Stump11289f42009-09-09 15:08:12 +00003475
Douglas Gregora16548e2009-08-11 05:31:07 +00003476template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003477Sema::OwningExprResult
3478TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
3479 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003480}
Mike Stump11289f42009-09-09 15:08:12 +00003481
Douglas Gregora16548e2009-08-11 05:31:07 +00003482template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003483Sema::OwningExprResult
3484TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
3485 return SemaRef.Owned(E->Retain());
3486}
3487
3488template<typename Derived>
3489Sema::OwningExprResult
3490TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003491 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3492 if (SubExpr.isInvalid())
3493 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003494
Douglas Gregora16548e2009-08-11 05:31:07 +00003495 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003496 return SemaRef.Owned(E->Retain());
3497
3498 return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003499 E->getRParen());
3500}
3501
Mike Stump11289f42009-09-09 15:08:12 +00003502template<typename Derived>
3503Sema::OwningExprResult
3504TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003505 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3506 if (SubExpr.isInvalid())
3507 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003508
Douglas Gregora16548e2009-08-11 05:31:07 +00003509 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003510 return SemaRef.Owned(E->Retain());
3511
Douglas Gregora16548e2009-08-11 05:31:07 +00003512 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
3513 E->getOpcode(),
3514 move(SubExpr));
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
3519TreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003520 if (E->isArgumentType()) {
Douglas Gregor3da3c062009-10-28 00:29:27 +00003521 TemporaryBase Rebase(*this, E->getOperatorLoc(), DeclarationName());
3522
Douglas Gregora16548e2009-08-11 05:31:07 +00003523 QualType T = getDerived().TransformType(E->getArgumentType());
3524 if (T.isNull())
3525 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003526
Douglas Gregora16548e2009-08-11 05:31:07 +00003527 if (!getDerived().AlwaysRebuild() && T == E->getArgumentType())
3528 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003529
3530 return getDerived().RebuildSizeOfAlignOf(T, E->getOperatorLoc(),
3531 E->isSizeOf(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003532 E->getSourceRange());
3533 }
Mike Stump11289f42009-09-09 15:08:12 +00003534
Douglas Gregora16548e2009-08-11 05:31:07 +00003535 Sema::OwningExprResult SubExpr(SemaRef);
Mike Stump11289f42009-09-09 15:08:12 +00003536 {
Douglas Gregora16548e2009-08-11 05:31:07 +00003537 // C++0x [expr.sizeof]p1:
3538 // The operand is either an expression, which is an unevaluated operand
3539 // [...]
3540 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00003541
Douglas Gregora16548e2009-08-11 05:31:07 +00003542 SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3543 if (SubExpr.isInvalid())
3544 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003545
Douglas Gregora16548e2009-08-11 05:31:07 +00003546 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3547 return SemaRef.Owned(E->Retain());
3548 }
Mike Stump11289f42009-09-09 15:08:12 +00003549
Douglas Gregora16548e2009-08-11 05:31:07 +00003550 return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3551 E->isSizeOf(),
3552 E->getSourceRange());
3553}
Mike Stump11289f42009-09-09 15:08:12 +00003554
Douglas Gregora16548e2009-08-11 05:31:07 +00003555template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003556Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003557TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
3558 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3559 if (LHS.isInvalid())
3560 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003561
Douglas Gregora16548e2009-08-11 05:31:07 +00003562 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3563 if (RHS.isInvalid())
3564 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003565
3566
Douglas Gregora16548e2009-08-11 05:31:07 +00003567 if (!getDerived().AlwaysRebuild() &&
3568 LHS.get() == E->getLHS() &&
3569 RHS.get() == E->getRHS())
3570 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003571
Douglas Gregora16548e2009-08-11 05:31:07 +00003572 return getDerived().RebuildArraySubscriptExpr(move(LHS),
3573 /*FIXME:*/E->getLHS()->getLocStart(),
3574 move(RHS),
3575 E->getRBracketLoc());
3576}
Mike Stump11289f42009-09-09 15:08:12 +00003577
3578template<typename Derived>
3579Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003580TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
3581 // Transform the callee.
3582 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3583 if (Callee.isInvalid())
3584 return SemaRef.ExprError();
3585
3586 // Transform arguments.
3587 bool ArgChanged = false;
3588 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3589 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3590 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3591 OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3592 if (Arg.isInvalid())
3593 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003594
Douglas Gregora16548e2009-08-11 05:31:07 +00003595 // FIXME: Wrong source location information for the ','.
3596 FakeCommaLocs.push_back(
3597 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
Mike Stump11289f42009-09-09 15:08:12 +00003598
3599 ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
Douglas Gregora16548e2009-08-11 05:31:07 +00003600 Args.push_back(Arg.takeAs<Expr>());
3601 }
Mike Stump11289f42009-09-09 15:08:12 +00003602
Douglas Gregora16548e2009-08-11 05:31:07 +00003603 if (!getDerived().AlwaysRebuild() &&
3604 Callee.get() == E->getCallee() &&
3605 !ArgChanged)
3606 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003607
Douglas Gregora16548e2009-08-11 05:31:07 +00003608 // FIXME: Wrong source location information for the '('.
Mike Stump11289f42009-09-09 15:08:12 +00003609 SourceLocation FakeLParenLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003610 = ((Expr *)Callee.get())->getSourceRange().getBegin();
3611 return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3612 move_arg(Args),
3613 FakeCommaLocs.data(),
3614 E->getRParenLoc());
3615}
Mike Stump11289f42009-09-09 15:08:12 +00003616
3617template<typename Derived>
3618Sema::OwningExprResult
3619TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003620 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3621 if (Base.isInvalid())
3622 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003623
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003624 NestedNameSpecifier *Qualifier = 0;
3625 if (E->hasQualifier()) {
Mike Stump11289f42009-09-09 15:08:12 +00003626 Qualifier
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003627 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3628 E->getQualifierRange());
Douglas Gregor84f14dd2009-09-01 00:37:14 +00003629 if (Qualifier == 0)
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003630 return SemaRef.ExprError();
3631 }
Mike Stump11289f42009-09-09 15:08:12 +00003632
3633 NamedDecl *Member
Douglas Gregora16548e2009-08-11 05:31:07 +00003634 = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
3635 if (!Member)
3636 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003637
Douglas Gregora16548e2009-08-11 05:31:07 +00003638 if (!getDerived().AlwaysRebuild() &&
3639 Base.get() == E->getBase() &&
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003640 Qualifier == E->getQualifier() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00003641 Member == E->getMemberDecl())
Mike Stump11289f42009-09-09 15:08:12 +00003642 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003643
3644 // FIXME: Bogus source location for the operator
3645 SourceLocation FakeOperatorLoc
3646 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3647
3648 return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3649 E->isArrow(),
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003650 Qualifier,
3651 E->getQualifierRange(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003652 E->getMemberLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00003653 Member);
Douglas Gregora16548e2009-08-11 05:31:07 +00003654}
Mike Stump11289f42009-09-09 15:08:12 +00003655
Douglas Gregora16548e2009-08-11 05:31:07 +00003656template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00003657Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003658TreeTransform<Derived>::TransformCastExpr(CastExpr *E) {
3659 assert(false && "Cannot transform abstract class");
3660 return SemaRef.Owned(E->Retain());
3661}
3662
3663template<typename Derived>
3664Sema::OwningExprResult
3665TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003666 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3667 if (LHS.isInvalid())
3668 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003669
Douglas Gregora16548e2009-08-11 05:31:07 +00003670 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3671 if (RHS.isInvalid())
3672 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003673
Douglas Gregora16548e2009-08-11 05:31:07 +00003674 if (!getDerived().AlwaysRebuild() &&
3675 LHS.get() == E->getLHS() &&
3676 RHS.get() == E->getRHS())
Mike Stump11289f42009-09-09 15:08:12 +00003677 return SemaRef.Owned(E->Retain());
3678
Douglas Gregora16548e2009-08-11 05:31:07 +00003679 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3680 move(LHS), move(RHS));
3681}
3682
Mike Stump11289f42009-09-09 15:08:12 +00003683template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00003684Sema::OwningExprResult
3685TreeTransform<Derived>::TransformCompoundAssignOperator(
3686 CompoundAssignOperator *E) {
3687 return getDerived().TransformBinaryOperator(E);
3688}
Mike Stump11289f42009-09-09 15:08:12 +00003689
Douglas Gregora16548e2009-08-11 05:31:07 +00003690template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003691Sema::OwningExprResult
3692TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003693 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3694 if (Cond.isInvalid())
3695 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003696
Douglas Gregora16548e2009-08-11 05:31:07 +00003697 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3698 if (LHS.isInvalid())
3699 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003700
Douglas Gregora16548e2009-08-11 05:31:07 +00003701 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3702 if (RHS.isInvalid())
3703 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003704
Douglas Gregora16548e2009-08-11 05:31:07 +00003705 if (!getDerived().AlwaysRebuild() &&
3706 Cond.get() == E->getCond() &&
3707 LHS.get() == E->getLHS() &&
3708 RHS.get() == E->getRHS())
3709 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003710
3711 return getDerived().RebuildConditionalOperator(move(Cond),
Douglas Gregor7e112b02009-08-26 14:37:04 +00003712 E->getQuestionLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00003713 move(LHS),
Douglas Gregor7e112b02009-08-26 14:37:04 +00003714 E->getColonLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003715 move(RHS));
3716}
Mike Stump11289f42009-09-09 15:08:12 +00003717
3718template<typename Derived>
3719Sema::OwningExprResult
3720TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
Douglas Gregor3da3c062009-10-28 00:29:27 +00003721 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3722
3723 // FIXME: Will we ever have type information here? It seems like we won't,
3724 // so do we even need to transform the type?
Douglas Gregora16548e2009-08-11 05:31:07 +00003725 QualType T = getDerived().TransformType(E->getType());
3726 if (T.isNull())
3727 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003728
Douglas Gregora16548e2009-08-11 05:31:07 +00003729 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3730 if (SubExpr.isInvalid())
3731 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003732
Douglas Gregora16548e2009-08-11 05:31:07 +00003733 if (!getDerived().AlwaysRebuild() &&
3734 T == E->getType() &&
3735 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003736 return SemaRef.Owned(E->Retain());
3737
Douglas Gregora16548e2009-08-11 05:31:07 +00003738 return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
Mike Stump11289f42009-09-09 15:08:12 +00003739 move(SubExpr),
Douglas Gregora16548e2009-08-11 05:31:07 +00003740 E->isLvalueCast());
3741}
Mike Stump11289f42009-09-09 15:08:12 +00003742
Douglas Gregora16548e2009-08-11 05:31:07 +00003743template<typename Derived>
3744Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003745TreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E) {
3746 assert(false && "Cannot transform abstract class");
3747 return SemaRef.Owned(E->Retain());
3748}
3749
3750template<typename Derived>
3751Sema::OwningExprResult
3752TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003753 QualType T;
3754 {
3755 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00003756 SourceLocation TypeStartLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003757 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3758 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003759
Douglas Gregora16548e2009-08-11 05:31:07 +00003760 T = getDerived().TransformType(E->getTypeAsWritten());
3761 if (T.isNull())
3762 return SemaRef.ExprError();
3763 }
Mike Stump11289f42009-09-09 15:08:12 +00003764
Douglas Gregora16548e2009-08-11 05:31:07 +00003765 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3766 if (SubExpr.isInvalid())
3767 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003768
Douglas Gregora16548e2009-08-11 05:31:07 +00003769 if (!getDerived().AlwaysRebuild() &&
3770 T == E->getTypeAsWritten() &&
3771 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003772 return SemaRef.Owned(E->Retain());
3773
Douglas Gregora16548e2009-08-11 05:31:07 +00003774 return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
3775 E->getRParenLoc(),
3776 move(SubExpr));
3777}
Mike Stump11289f42009-09-09 15:08:12 +00003778
Douglas Gregora16548e2009-08-11 05:31:07 +00003779template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003780Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003781TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
3782 QualType T;
3783 {
3784 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00003785 SourceLocation FakeTypeLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003786 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3787 TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003788
Douglas Gregora16548e2009-08-11 05:31:07 +00003789 T = getDerived().TransformType(E->getType());
3790 if (T.isNull())
3791 return SemaRef.ExprError();
3792 }
Mike Stump11289f42009-09-09 15:08:12 +00003793
Douglas Gregora16548e2009-08-11 05:31:07 +00003794 OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3795 if (Init.isInvalid())
3796 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003797
Douglas Gregora16548e2009-08-11 05:31:07 +00003798 if (!getDerived().AlwaysRebuild() &&
3799 T == E->getType() &&
3800 Init.get() == E->getInitializer())
Mike Stump11289f42009-09-09 15:08:12 +00003801 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003802
3803 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3804 /*FIXME:*/E->getInitializer()->getLocEnd(),
3805 move(Init));
3806}
Mike Stump11289f42009-09-09 15:08:12 +00003807
Douglas Gregora16548e2009-08-11 05:31:07 +00003808template<typename Derived>
3809Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003810TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003811 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3812 if (Base.isInvalid())
3813 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003814
Douglas Gregora16548e2009-08-11 05:31:07 +00003815 if (!getDerived().AlwaysRebuild() &&
3816 Base.get() == E->getBase())
Mike Stump11289f42009-09-09 15:08:12 +00003817 return SemaRef.Owned(E->Retain());
3818
Douglas Gregora16548e2009-08-11 05:31:07 +00003819 // FIXME: Bad source location
Mike Stump11289f42009-09-09 15:08:12 +00003820 SourceLocation FakeOperatorLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003821 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3822 return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3823 E->getAccessorLoc(),
3824 E->getAccessor());
3825}
Mike Stump11289f42009-09-09 15:08:12 +00003826
Douglas Gregora16548e2009-08-11 05:31:07 +00003827template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003828Sema::OwningExprResult
3829TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003830 bool InitChanged = false;
Mike Stump11289f42009-09-09 15:08:12 +00003831
Douglas Gregora16548e2009-08-11 05:31:07 +00003832 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3833 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3834 OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3835 if (Init.isInvalid())
3836 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003837
Douglas Gregora16548e2009-08-11 05:31:07 +00003838 InitChanged = InitChanged || Init.get() != E->getInit(I);
3839 Inits.push_back(Init.takeAs<Expr>());
3840 }
Mike Stump11289f42009-09-09 15:08:12 +00003841
Douglas Gregora16548e2009-08-11 05:31:07 +00003842 if (!getDerived().AlwaysRebuild() && !InitChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003843 return SemaRef.Owned(E->Retain());
3844
Douglas Gregora16548e2009-08-11 05:31:07 +00003845 return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3846 E->getRBraceLoc());
3847}
Mike Stump11289f42009-09-09 15:08:12 +00003848
Douglas Gregora16548e2009-08-11 05:31:07 +00003849template<typename Derived>
3850Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003851TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003852 Designation Desig;
Mike Stump11289f42009-09-09 15:08:12 +00003853
Douglas Gregorebe10102009-08-20 07:17:43 +00003854 // transform the initializer value
Douglas Gregora16548e2009-08-11 05:31:07 +00003855 OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3856 if (Init.isInvalid())
3857 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003858
Douglas Gregorebe10102009-08-20 07:17:43 +00003859 // transform the designators.
Douglas Gregora16548e2009-08-11 05:31:07 +00003860 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3861 bool ExprChanged = false;
3862 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3863 DEnd = E->designators_end();
3864 D != DEnd; ++D) {
3865 if (D->isFieldDesignator()) {
3866 Desig.AddDesignator(Designator::getField(D->getFieldName(),
3867 D->getDotLoc(),
3868 D->getFieldLoc()));
3869 continue;
3870 }
Mike Stump11289f42009-09-09 15:08:12 +00003871
Douglas Gregora16548e2009-08-11 05:31:07 +00003872 if (D->isArrayDesignator()) {
3873 OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3874 if (Index.isInvalid())
3875 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003876
3877 Desig.AddDesignator(Designator::getArray(Index.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003878 D->getLBracketLoc()));
Mike Stump11289f42009-09-09 15:08:12 +00003879
Douglas Gregora16548e2009-08-11 05:31:07 +00003880 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3881 ArrayExprs.push_back(Index.release());
3882 continue;
3883 }
Mike Stump11289f42009-09-09 15:08:12 +00003884
Douglas Gregora16548e2009-08-11 05:31:07 +00003885 assert(D->isArrayRangeDesignator() && "New kind of designator?");
Mike Stump11289f42009-09-09 15:08:12 +00003886 OwningExprResult Start
Douglas Gregora16548e2009-08-11 05:31:07 +00003887 = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3888 if (Start.isInvalid())
3889 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003890
Douglas Gregora16548e2009-08-11 05:31:07 +00003891 OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3892 if (End.isInvalid())
3893 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003894
3895 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003896 End.get(),
3897 D->getLBracketLoc(),
3898 D->getEllipsisLoc()));
Mike Stump11289f42009-09-09 15:08:12 +00003899
Douglas Gregora16548e2009-08-11 05:31:07 +00003900 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3901 End.get() != E->getArrayRangeEnd(*D);
Mike Stump11289f42009-09-09 15:08:12 +00003902
Douglas Gregora16548e2009-08-11 05:31:07 +00003903 ArrayExprs.push_back(Start.release());
3904 ArrayExprs.push_back(End.release());
3905 }
Mike Stump11289f42009-09-09 15:08:12 +00003906
Douglas Gregora16548e2009-08-11 05:31:07 +00003907 if (!getDerived().AlwaysRebuild() &&
3908 Init.get() == E->getInit() &&
3909 !ExprChanged)
3910 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003911
Douglas Gregora16548e2009-08-11 05:31:07 +00003912 return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3913 E->getEqualOrColonLoc(),
3914 E->usesGNUSyntax(), move(Init));
3915}
Mike Stump11289f42009-09-09 15:08:12 +00003916
Douglas Gregora16548e2009-08-11 05:31:07 +00003917template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003918Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003919TreeTransform<Derived>::TransformImplicitValueInitExpr(
Mike Stump11289f42009-09-09 15:08:12 +00003920 ImplicitValueInitExpr *E) {
Douglas Gregor3da3c062009-10-28 00:29:27 +00003921 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3922
3923 // FIXME: Will we ever have proper type location here? Will we actually
3924 // need to transform the type?
Douglas Gregora16548e2009-08-11 05:31:07 +00003925 QualType T = getDerived().TransformType(E->getType());
3926 if (T.isNull())
3927 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003928
Douglas Gregora16548e2009-08-11 05:31:07 +00003929 if (!getDerived().AlwaysRebuild() &&
3930 T == E->getType())
Mike Stump11289f42009-09-09 15:08:12 +00003931 return SemaRef.Owned(E->Retain());
3932
Douglas Gregora16548e2009-08-11 05:31:07 +00003933 return getDerived().RebuildImplicitValueInitExpr(T);
3934}
Mike Stump11289f42009-09-09 15:08:12 +00003935
Douglas Gregora16548e2009-08-11 05:31:07 +00003936template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003937Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003938TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
3939 // FIXME: Do we want the type as written?
3940 QualType T;
Mike Stump11289f42009-09-09 15:08:12 +00003941
Douglas Gregora16548e2009-08-11 05:31:07 +00003942 {
3943 // FIXME: Source location isn't quite accurate.
3944 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
3945 T = getDerived().TransformType(E->getType());
3946 if (T.isNull())
3947 return SemaRef.ExprError();
3948 }
Mike Stump11289f42009-09-09 15:08:12 +00003949
Douglas Gregora16548e2009-08-11 05:31:07 +00003950 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3951 if (SubExpr.isInvalid())
3952 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003953
Douglas Gregora16548e2009-08-11 05:31:07 +00003954 if (!getDerived().AlwaysRebuild() &&
3955 T == E->getType() &&
3956 SubExpr.get() == E->getSubExpr())
3957 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003958
Douglas Gregora16548e2009-08-11 05:31:07 +00003959 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
3960 T, E->getRParenLoc());
3961}
3962
3963template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003964Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003965TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
3966 bool ArgumentChanged = false;
3967 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3968 for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
3969 OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
3970 if (Init.isInvalid())
3971 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003972
Douglas Gregora16548e2009-08-11 05:31:07 +00003973 ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
3974 Inits.push_back(Init.takeAs<Expr>());
3975 }
Mike Stump11289f42009-09-09 15:08:12 +00003976
Douglas Gregora16548e2009-08-11 05:31:07 +00003977 return getDerived().RebuildParenListExpr(E->getLParenLoc(),
3978 move_arg(Inits),
3979 E->getRParenLoc());
3980}
Mike Stump11289f42009-09-09 15:08:12 +00003981
Douglas Gregora16548e2009-08-11 05:31:07 +00003982/// \brief Transform an address-of-label expression.
3983///
3984/// By default, the transformation of an address-of-label expression always
3985/// rebuilds the expression, so that the label identifier can be resolved to
3986/// the corresponding label statement by semantic analysis.
3987template<typename Derived>
3988Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00003989TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003990 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
3991 E->getLabel());
3992}
Mike Stump11289f42009-09-09 15:08:12 +00003993
3994template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00003995Sema::OwningExprResult TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
Mike Stump11289f42009-09-09 15:08:12 +00003996 OwningStmtResult SubStmt
Douglas Gregora16548e2009-08-11 05:31:07 +00003997 = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
3998 if (SubStmt.isInvalid())
3999 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004000
Douglas Gregora16548e2009-08-11 05:31:07 +00004001 if (!getDerived().AlwaysRebuild() &&
4002 SubStmt.get() == E->getSubStmt())
4003 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004004
4005 return getDerived().RebuildStmtExpr(E->getLParenLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004006 move(SubStmt),
4007 E->getRParenLoc());
4008}
Mike Stump11289f42009-09-09 15:08:12 +00004009
Douglas Gregora16548e2009-08-11 05:31:07 +00004010template<typename Derived>
4011Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004012TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004013 QualType T1, T2;
4014 {
4015 // FIXME: Source location isn't quite accurate.
4016 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004017
Douglas Gregora16548e2009-08-11 05:31:07 +00004018 T1 = getDerived().TransformType(E->getArgType1());
4019 if (T1.isNull())
4020 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004021
Douglas Gregora16548e2009-08-11 05:31:07 +00004022 T2 = getDerived().TransformType(E->getArgType2());
4023 if (T2.isNull())
4024 return SemaRef.ExprError();
4025 }
4026
4027 if (!getDerived().AlwaysRebuild() &&
4028 T1 == E->getArgType1() &&
4029 T2 == E->getArgType2())
Mike Stump11289f42009-09-09 15:08:12 +00004030 return SemaRef.Owned(E->Retain());
4031
Douglas Gregora16548e2009-08-11 05:31:07 +00004032 return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
4033 T1, T2, E->getRParenLoc());
4034}
Mike Stump11289f42009-09-09 15:08:12 +00004035
Douglas Gregora16548e2009-08-11 05:31:07 +00004036template<typename Derived>
4037Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004038TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004039 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4040 if (Cond.isInvalid())
4041 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004042
Douglas Gregora16548e2009-08-11 05:31:07 +00004043 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4044 if (LHS.isInvalid())
4045 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004046
Douglas Gregora16548e2009-08-11 05:31:07 +00004047 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4048 if (RHS.isInvalid())
4049 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004050
Douglas Gregora16548e2009-08-11 05:31:07 +00004051 if (!getDerived().AlwaysRebuild() &&
4052 Cond.get() == E->getCond() &&
4053 LHS.get() == E->getLHS() &&
4054 RHS.get() == E->getRHS())
Mike Stump11289f42009-09-09 15:08:12 +00004055 return SemaRef.Owned(E->Retain());
4056
Douglas Gregora16548e2009-08-11 05:31:07 +00004057 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4058 move(Cond), move(LHS), move(RHS),
4059 E->getRParenLoc());
4060}
Mike Stump11289f42009-09-09 15:08:12 +00004061
Douglas Gregora16548e2009-08-11 05:31:07 +00004062template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004063Sema::OwningExprResult
4064TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
4065 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004066}
4067
4068template<typename Derived>
4069Sema::OwningExprResult
4070TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4071 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4072 if (Callee.isInvalid())
4073 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004074
Douglas Gregora16548e2009-08-11 05:31:07 +00004075 OwningExprResult First = getDerived().TransformExpr(E->getArg(0));
4076 if (First.isInvalid())
4077 return SemaRef.ExprError();
4078
4079 OwningExprResult Second(SemaRef);
4080 if (E->getNumArgs() == 2) {
4081 Second = getDerived().TransformExpr(E->getArg(1));
4082 if (Second.isInvalid())
4083 return SemaRef.ExprError();
4084 }
Mike Stump11289f42009-09-09 15:08:12 +00004085
Douglas Gregora16548e2009-08-11 05:31:07 +00004086 if (!getDerived().AlwaysRebuild() &&
4087 Callee.get() == E->getCallee() &&
4088 First.get() == E->getArg(0) &&
Mike Stump11289f42009-09-09 15:08:12 +00004089 (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
4090 return SemaRef.Owned(E->Retain());
4091
Douglas Gregora16548e2009-08-11 05:31:07 +00004092 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4093 E->getOperatorLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00004094 move(Callee),
Douglas Gregora16548e2009-08-11 05:31:07 +00004095 move(First),
4096 move(Second));
4097}
Mike Stump11289f42009-09-09 15:08:12 +00004098
Douglas Gregora16548e2009-08-11 05:31:07 +00004099template<typename Derived>
4100Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004101TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004102 return getDerived().TransformCallExpr(E);
4103}
Mike Stump11289f42009-09-09 15:08:12 +00004104
Douglas Gregora16548e2009-08-11 05:31:07 +00004105template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004106Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004107TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
4108 QualType ExplicitTy;
4109 {
4110 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00004111 SourceLocation TypeStartLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00004112 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4113 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004114
Douglas Gregora16548e2009-08-11 05:31:07 +00004115 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
4116 if (ExplicitTy.isNull())
4117 return SemaRef.ExprError();
4118 }
Mike Stump11289f42009-09-09 15:08:12 +00004119
Douglas Gregora16548e2009-08-11 05:31:07 +00004120 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4121 if (SubExpr.isInvalid())
4122 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004123
Douglas Gregora16548e2009-08-11 05:31:07 +00004124 if (!getDerived().AlwaysRebuild() &&
4125 ExplicitTy == E->getTypeAsWritten() &&
4126 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00004127 return SemaRef.Owned(E->Retain());
4128
Douglas Gregora16548e2009-08-11 05:31:07 +00004129 // FIXME: Poor source location information here.
Mike Stump11289f42009-09-09 15:08:12 +00004130 SourceLocation FakeLAngleLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00004131 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4132 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
4133 SourceLocation FakeRParenLoc
4134 = SemaRef.PP.getLocForEndOfToken(
4135 E->getSubExpr()->getSourceRange().getEnd());
4136 return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00004137 E->getStmtClass(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004138 FakeLAngleLoc,
4139 ExplicitTy,
4140 FakeRAngleLoc,
4141 FakeRAngleLoc,
4142 move(SubExpr),
4143 FakeRParenLoc);
4144}
Mike Stump11289f42009-09-09 15:08:12 +00004145
Douglas Gregora16548e2009-08-11 05:31:07 +00004146template<typename Derived>
4147Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004148TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004149 return getDerived().TransformCXXNamedCastExpr(E);
4150}
Mike Stump11289f42009-09-09 15:08:12 +00004151
4152template<typename Derived>
4153Sema::OwningExprResult
4154TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
4155 return getDerived().TransformCXXNamedCastExpr(E);
4156}
4157
Douglas Gregora16548e2009-08-11 05:31:07 +00004158template<typename Derived>
4159Sema::OwningExprResult
4160TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004161 CXXReinterpretCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004162 return getDerived().TransformCXXNamedCastExpr(E);
4163}
Mike Stump11289f42009-09-09 15:08:12 +00004164
Douglas Gregora16548e2009-08-11 05:31:07 +00004165template<typename Derived>
4166Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004167TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004168 return getDerived().TransformCXXNamedCastExpr(E);
4169}
Mike Stump11289f42009-09-09 15:08:12 +00004170
Douglas Gregora16548e2009-08-11 05:31:07 +00004171template<typename Derived>
4172Sema::OwningExprResult
4173TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004174 CXXFunctionalCastExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004175 QualType ExplicitTy;
4176 {
4177 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004178
Douglas Gregora16548e2009-08-11 05:31:07 +00004179 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
4180 if (ExplicitTy.isNull())
4181 return SemaRef.ExprError();
4182 }
Mike Stump11289f42009-09-09 15:08:12 +00004183
Douglas Gregora16548e2009-08-11 05:31:07 +00004184 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4185 if (SubExpr.isInvalid())
4186 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004187
Douglas Gregora16548e2009-08-11 05:31:07 +00004188 if (!getDerived().AlwaysRebuild() &&
4189 ExplicitTy == E->getTypeAsWritten() &&
4190 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00004191 return SemaRef.Owned(E->Retain());
4192
Douglas Gregora16548e2009-08-11 05:31:07 +00004193 // FIXME: The end of the type's source range is wrong
4194 return getDerived().RebuildCXXFunctionalCastExpr(
4195 /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
4196 ExplicitTy,
4197 /*FIXME:*/E->getSubExpr()->getLocStart(),
4198 move(SubExpr),
4199 E->getRParenLoc());
4200}
Mike Stump11289f42009-09-09 15:08:12 +00004201
Douglas Gregora16548e2009-08-11 05:31:07 +00004202template<typename Derived>
4203Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004204TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004205 if (E->isTypeOperand()) {
4206 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004207
Douglas Gregora16548e2009-08-11 05:31:07 +00004208 QualType T = getDerived().TransformType(E->getTypeOperand());
4209 if (T.isNull())
4210 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004211
Douglas Gregora16548e2009-08-11 05:31:07 +00004212 if (!getDerived().AlwaysRebuild() &&
4213 T == E->getTypeOperand())
4214 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004215
Douglas Gregora16548e2009-08-11 05:31:07 +00004216 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4217 /*FIXME:*/E->getLocStart(),
4218 T,
4219 E->getLocEnd());
4220 }
Mike Stump11289f42009-09-09 15:08:12 +00004221
Douglas Gregora16548e2009-08-11 05:31:07 +00004222 // We don't know whether the expression is potentially evaluated until
4223 // after we perform semantic analysis, so the expression is potentially
4224 // potentially evaluated.
Mike Stump11289f42009-09-09 15:08:12 +00004225 EnterExpressionEvaluationContext Unevaluated(SemaRef,
Douglas Gregora16548e2009-08-11 05:31:07 +00004226 Action::PotentiallyPotentiallyEvaluated);
Mike Stump11289f42009-09-09 15:08:12 +00004227
Douglas Gregora16548e2009-08-11 05:31:07 +00004228 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
4229 if (SubExpr.isInvalid())
4230 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004231
Douglas Gregora16548e2009-08-11 05:31:07 +00004232 if (!getDerived().AlwaysRebuild() &&
4233 SubExpr.get() == E->getExprOperand())
Mike Stump11289f42009-09-09 15:08:12 +00004234 return SemaRef.Owned(E->Retain());
4235
Douglas Gregora16548e2009-08-11 05:31:07 +00004236 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4237 /*FIXME:*/E->getLocStart(),
4238 move(SubExpr),
4239 E->getLocEnd());
4240}
4241
4242template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004243Sema::OwningExprResult
4244TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
4245 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004246}
Mike Stump11289f42009-09-09 15:08:12 +00004247
Douglas Gregora16548e2009-08-11 05:31:07 +00004248template<typename Derived>
4249Sema::OwningExprResult
4250TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004251 CXXNullPtrLiteralExpr *E) {
4252 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004253}
Mike Stump11289f42009-09-09 15:08:12 +00004254
Douglas Gregora16548e2009-08-11 05:31:07 +00004255template<typename Derived>
4256Sema::OwningExprResult
4257TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
4258 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004259
Douglas Gregora16548e2009-08-11 05:31:07 +00004260 QualType T = getDerived().TransformType(E->getType());
4261 if (T.isNull())
4262 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004263
Douglas Gregora16548e2009-08-11 05:31:07 +00004264 if (!getDerived().AlwaysRebuild() &&
4265 T == E->getType())
4266 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004267
Douglas Gregora16548e2009-08-11 05:31:07 +00004268 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
4269}
Mike Stump11289f42009-09-09 15:08:12 +00004270
Douglas Gregora16548e2009-08-11 05:31:07 +00004271template<typename Derived>
4272Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004273TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004274 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4275 if (SubExpr.isInvalid())
4276 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004277
Douglas Gregora16548e2009-08-11 05:31:07 +00004278 if (!getDerived().AlwaysRebuild() &&
4279 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00004280 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004281
4282 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
4283}
Mike Stump11289f42009-09-09 15:08:12 +00004284
Douglas Gregora16548e2009-08-11 05:31:07 +00004285template<typename Derived>
4286Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004287TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
4288 ParmVarDecl *Param
Douglas Gregora16548e2009-08-11 05:31:07 +00004289 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
4290 if (!Param)
4291 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004292
Douglas Gregora16548e2009-08-11 05:31:07 +00004293 if (getDerived().AlwaysRebuild() &&
4294 Param == E->getParam())
4295 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004296
Douglas Gregora16548e2009-08-11 05:31:07 +00004297 return getDerived().RebuildCXXDefaultArgExpr(Param);
4298}
Mike Stump11289f42009-09-09 15:08:12 +00004299
Douglas Gregora16548e2009-08-11 05:31:07 +00004300template<typename Derived>
4301Sema::OwningExprResult
4302TreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
4303 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4304
4305 QualType T = getDerived().TransformType(E->getType());
4306 if (T.isNull())
4307 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004308
Douglas Gregora16548e2009-08-11 05:31:07 +00004309 if (!getDerived().AlwaysRebuild() &&
4310 T == E->getType())
Mike Stump11289f42009-09-09 15:08:12 +00004311 return SemaRef.Owned(E->Retain());
4312
4313 return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004314 /*FIXME:*/E->getTypeBeginLoc(),
4315 T,
4316 E->getRParenLoc());
4317}
Mike Stump11289f42009-09-09 15:08:12 +00004318
Douglas Gregora16548e2009-08-11 05:31:07 +00004319template<typename Derived>
4320Sema::OwningExprResult
4321TreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
Mike Stump11289f42009-09-09 15:08:12 +00004322 VarDecl *Var
Douglas Gregorebe10102009-08-20 07:17:43 +00004323 = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl()));
Douglas Gregora16548e2009-08-11 05:31:07 +00004324 if (!Var)
4325 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004326
Douglas Gregora16548e2009-08-11 05:31:07 +00004327 if (!getDerived().AlwaysRebuild() &&
Mike Stump11289f42009-09-09 15:08:12 +00004328 Var == E->getVarDecl())
Douglas Gregora16548e2009-08-11 05:31:07 +00004329 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004330
4331 return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004332 /*FIXME:*/E->getStartLoc(),
4333 Var);
4334}
Mike Stump11289f42009-09-09 15:08:12 +00004335
Douglas Gregora16548e2009-08-11 05:31:07 +00004336template<typename Derived>
4337Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004338TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004339 // Transform the type that we're allocating
4340 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4341 QualType AllocType = getDerived().TransformType(E->getAllocatedType());
4342 if (AllocType.isNull())
4343 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004344
Douglas Gregora16548e2009-08-11 05:31:07 +00004345 // Transform the size of the array we're allocating (if any).
4346 OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
4347 if (ArraySize.isInvalid())
4348 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004349
Douglas Gregora16548e2009-08-11 05:31:07 +00004350 // Transform the placement arguments (if any).
4351 bool ArgumentChanged = false;
4352 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
4353 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
4354 OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
4355 if (Arg.isInvalid())
4356 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004357
Douglas Gregora16548e2009-08-11 05:31:07 +00004358 ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
4359 PlacementArgs.push_back(Arg.take());
4360 }
Mike Stump11289f42009-09-09 15:08:12 +00004361
Douglas Gregorebe10102009-08-20 07:17:43 +00004362 // transform the constructor arguments (if any).
Douglas Gregora16548e2009-08-11 05:31:07 +00004363 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
4364 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
4365 OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
4366 if (Arg.isInvalid())
4367 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004368
Douglas Gregora16548e2009-08-11 05:31:07 +00004369 ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
4370 ConstructorArgs.push_back(Arg.take());
4371 }
Mike Stump11289f42009-09-09 15:08:12 +00004372
Douglas Gregora16548e2009-08-11 05:31:07 +00004373 if (!getDerived().AlwaysRebuild() &&
4374 AllocType == E->getAllocatedType() &&
4375 ArraySize.get() == E->getArraySize() &&
4376 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00004377 return SemaRef.Owned(E->Retain());
4378
Douglas Gregora16548e2009-08-11 05:31:07 +00004379 return getDerived().RebuildCXXNewExpr(E->getLocStart(),
4380 E->isGlobalNew(),
4381 /*FIXME:*/E->getLocStart(),
4382 move_arg(PlacementArgs),
4383 /*FIXME:*/E->getLocStart(),
4384 E->isParenTypeId(),
4385 AllocType,
4386 /*FIXME:*/E->getLocStart(),
4387 /*FIXME:*/SourceRange(),
4388 move(ArraySize),
4389 /*FIXME:*/E->getLocStart(),
4390 move_arg(ConstructorArgs),
Mike Stump11289f42009-09-09 15:08:12 +00004391 E->getLocEnd());
Douglas Gregora16548e2009-08-11 05:31:07 +00004392}
Mike Stump11289f42009-09-09 15:08:12 +00004393
Douglas Gregora16548e2009-08-11 05:31:07 +00004394template<typename Derived>
4395Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004396TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004397 OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
4398 if (Operand.isInvalid())
4399 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004400
Douglas Gregora16548e2009-08-11 05:31:07 +00004401 if (!getDerived().AlwaysRebuild() &&
Mike Stump11289f42009-09-09 15:08:12 +00004402 Operand.get() == E->getArgument())
4403 return SemaRef.Owned(E->Retain());
4404
Douglas Gregora16548e2009-08-11 05:31:07 +00004405 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
4406 E->isGlobalDelete(),
4407 E->isArrayForm(),
4408 move(Operand));
4409}
Mike Stump11289f42009-09-09 15:08:12 +00004410
Douglas Gregora16548e2009-08-11 05:31:07 +00004411template<typename Derived>
4412Sema::OwningExprResult
Douglas Gregorad8a3362009-09-04 17:36:40 +00004413TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
4414 CXXPseudoDestructorExpr *E) {
4415 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4416 if (Base.isInvalid())
4417 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004418
Douglas Gregorad8a3362009-09-04 17:36:40 +00004419 NestedNameSpecifier *Qualifier
4420 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4421 E->getQualifierRange());
4422 if (E->getQualifier() && !Qualifier)
4423 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004424
Douglas Gregorad8a3362009-09-04 17:36:40 +00004425 QualType DestroyedType;
4426 {
4427 TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
4428 DestroyedType = getDerived().TransformType(E->getDestroyedType());
4429 if (DestroyedType.isNull())
4430 return SemaRef.ExprError();
4431 }
Mike Stump11289f42009-09-09 15:08:12 +00004432
Douglas Gregorad8a3362009-09-04 17:36:40 +00004433 if (!getDerived().AlwaysRebuild() &&
4434 Base.get() == E->getBase() &&
4435 Qualifier == E->getQualifier() &&
4436 DestroyedType == E->getDestroyedType())
4437 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004438
Douglas Gregorad8a3362009-09-04 17:36:40 +00004439 return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
4440 E->getOperatorLoc(),
4441 E->isArrow(),
4442 E->getDestroyedTypeLoc(),
4443 DestroyedType,
4444 Qualifier,
4445 E->getQualifierRange());
4446}
Mike Stump11289f42009-09-09 15:08:12 +00004447
Douglas Gregorad8a3362009-09-04 17:36:40 +00004448template<typename Derived>
4449Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004450TreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004451 UnresolvedFunctionNameExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004452 // There is no transformation we can apply to an unresolved function name.
Mike Stump11289f42009-09-09 15:08:12 +00004453 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004454}
Mike Stump11289f42009-09-09 15:08:12 +00004455
Douglas Gregora16548e2009-08-11 05:31:07 +00004456template<typename Derived>
4457Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004458TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004459 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004460
Douglas Gregora16548e2009-08-11 05:31:07 +00004461 QualType T = getDerived().TransformType(E->getQueriedType());
4462 if (T.isNull())
4463 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004464
Douglas Gregora16548e2009-08-11 05:31:07 +00004465 if (!getDerived().AlwaysRebuild() &&
4466 T == E->getQueriedType())
4467 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004468
Douglas Gregora16548e2009-08-11 05:31:07 +00004469 // FIXME: Bad location information
4470 SourceLocation FakeLParenLoc
4471 = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
Mike Stump11289f42009-09-09 15:08:12 +00004472
4473 return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004474 E->getLocStart(),
4475 /*FIXME:*/FakeLParenLoc,
4476 T,
4477 E->getLocEnd());
4478}
Mike Stump11289f42009-09-09 15:08:12 +00004479
Douglas Gregora16548e2009-08-11 05:31:07 +00004480template<typename Derived>
4481Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004482TreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004483 UnresolvedDeclRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004484 NestedNameSpecifier *NNS
Douglas Gregord019ff62009-10-22 17:20:55 +00004485 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4486 E->getQualifierRange());
Douglas Gregora16548e2009-08-11 05:31:07 +00004487 if (!NNS)
4488 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004489
4490 DeclarationName Name
Douglas Gregorf816bd72009-09-03 22:13:48 +00004491 = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
4492 if (!Name)
4493 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004494
4495 if (!getDerived().AlwaysRebuild() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00004496 NNS == E->getQualifier() &&
4497 Name == E->getDeclName())
Mike Stump11289f42009-09-09 15:08:12 +00004498 return SemaRef.Owned(E->Retain());
4499
4500 return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
Douglas Gregora16548e2009-08-11 05:31:07 +00004501 E->getQualifierRange(),
4502 Name,
4503 E->getLocation(),
4504 /*FIXME:*/false);
4505}
4506
4507template<typename Derived>
4508Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004509TreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E) {
Douglas Gregorba91b892009-10-29 17:56:10 +00004510 TemporaryBase Rebase(*this, E->getTemplateNameLoc(), DeclarationName());
4511
Mike Stump11289f42009-09-09 15:08:12 +00004512 TemplateName Template
Douglas Gregora16548e2009-08-11 05:31:07 +00004513 = getDerived().TransformTemplateName(E->getTemplateName());
4514 if (Template.isNull())
4515 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004516
Douglas Gregord019ff62009-10-22 17:20:55 +00004517 NestedNameSpecifier *Qualifier = 0;
4518 if (E->getQualifier()) {
4519 Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4520 E->getQualifierRange());
4521 if (!Qualifier)
4522 return SemaRef.ExprError();
4523 }
4524
John McCall0ad16662009-10-29 08:12:44 +00004525 llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
Douglas Gregora16548e2009-08-11 05:31:07 +00004526 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
John McCall0ad16662009-10-29 08:12:44 +00004527 if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
4528 TransArgs[I]))
Douglas Gregora16548e2009-08-11 05:31:07 +00004529 return SemaRef.ExprError();
Douglas Gregora16548e2009-08-11 05:31:07 +00004530 }
4531
4532 // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
4533 // compare template arguments (yet).
Mike Stump11289f42009-09-09 15:08:12 +00004534
4535 // FIXME: It's possible that we'll find out now that the template name
Douglas Gregora16548e2009-08-11 05:31:07 +00004536 // actually refers to a type, in which case the caller is actually dealing
4537 // with a functional cast. Give a reasonable error message!
Douglas Gregord019ff62009-10-22 17:20:55 +00004538 return getDerived().RebuildTemplateIdExpr(Qualifier, E->getQualifierRange(),
4539 Template, E->getTemplateNameLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004540 E->getLAngleLoc(),
4541 TransArgs.data(),
4542 TransArgs.size(),
4543 E->getRAngleLoc());
4544}
4545
4546template<typename Derived>
4547Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004548TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004549 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4550
4551 QualType T = getDerived().TransformType(E->getType());
4552 if (T.isNull())
4553 return SemaRef.ExprError();
4554
4555 CXXConstructorDecl *Constructor
4556 = cast_or_null<CXXConstructorDecl>(
4557 getDerived().TransformDecl(E->getConstructor()));
4558 if (!Constructor)
4559 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004560
Douglas Gregora16548e2009-08-11 05:31:07 +00004561 bool ArgumentChanged = false;
4562 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Mike Stump11289f42009-09-09 15:08:12 +00004563 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004564 ArgEnd = E->arg_end();
4565 Arg != ArgEnd; ++Arg) {
4566 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4567 if (TransArg.isInvalid())
4568 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004569
Douglas Gregora16548e2009-08-11 05:31:07 +00004570 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4571 Args.push_back(TransArg.takeAs<Expr>());
4572 }
4573
4574 if (!getDerived().AlwaysRebuild() &&
4575 T == E->getType() &&
4576 Constructor == E->getConstructor() &&
4577 !ArgumentChanged)
4578 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004579
Douglas Gregora16548e2009-08-11 05:31:07 +00004580 return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
4581 move_arg(Args));
4582}
Mike Stump11289f42009-09-09 15:08:12 +00004583
Douglas Gregora16548e2009-08-11 05:31:07 +00004584/// \brief Transform a C++ temporary-binding expression.
4585///
Mike Stump11289f42009-09-09 15:08:12 +00004586/// The transformation of a temporary-binding expression always attempts to
4587/// bind a new temporary variable to its subexpression, even if the
Douglas Gregora16548e2009-08-11 05:31:07 +00004588/// subexpression itself did not change, because the temporary variable itself
4589/// must be unique.
4590template<typename Derived>
4591Sema::OwningExprResult
4592TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
4593 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4594 if (SubExpr.isInvalid())
4595 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004596
Douglas Gregora16548e2009-08-11 05:31:07 +00004597 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
4598}
Mike Stump11289f42009-09-09 15:08:12 +00004599
4600/// \brief Transform a C++ expression that contains temporaries that should
Douglas Gregora16548e2009-08-11 05:31:07 +00004601/// be destroyed after the expression is evaluated.
4602///
Mike Stump11289f42009-09-09 15:08:12 +00004603/// The transformation of a full expression always attempts to build a new
4604/// CXXExprWithTemporaries expression, even if the
Douglas Gregora16548e2009-08-11 05:31:07 +00004605/// subexpression itself did not change, because it will need to capture the
4606/// the new temporary variables introduced in the subexpression.
4607template<typename Derived>
4608Sema::OwningExprResult
4609TreeTransform<Derived>::TransformCXXExprWithTemporaries(
Mike Stump11289f42009-09-09 15:08:12 +00004610 CXXExprWithTemporaries *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004611 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4612 if (SubExpr.isInvalid())
4613 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004614
Douglas Gregora16548e2009-08-11 05:31:07 +00004615 return SemaRef.Owned(
4616 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
4617 E->shouldDestroyTemporaries()));
4618}
Mike Stump11289f42009-09-09 15:08:12 +00004619
Douglas Gregora16548e2009-08-11 05:31:07 +00004620template<typename Derived>
4621Sema::OwningExprResult
4622TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004623 CXXTemporaryObjectExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004624 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4625 QualType T = getDerived().TransformType(E->getType());
4626 if (T.isNull())
4627 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004628
Douglas Gregora16548e2009-08-11 05:31:07 +00004629 CXXConstructorDecl *Constructor
4630 = cast_or_null<CXXConstructorDecl>(
4631 getDerived().TransformDecl(E->getConstructor()));
4632 if (!Constructor)
4633 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004634
Douglas Gregora16548e2009-08-11 05:31:07 +00004635 bool ArgumentChanged = false;
4636 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4637 Args.reserve(E->getNumArgs());
Mike Stump11289f42009-09-09 15:08:12 +00004638 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004639 ArgEnd = E->arg_end();
4640 Arg != ArgEnd; ++Arg) {
4641 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4642 if (TransArg.isInvalid())
4643 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004644
Douglas Gregora16548e2009-08-11 05:31:07 +00004645 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4646 Args.push_back((Expr *)TransArg.release());
4647 }
Mike Stump11289f42009-09-09 15:08:12 +00004648
Douglas Gregora16548e2009-08-11 05:31:07 +00004649 if (!getDerived().AlwaysRebuild() &&
4650 T == E->getType() &&
4651 Constructor == E->getConstructor() &&
4652 !ArgumentChanged)
4653 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004654
Douglas Gregora16548e2009-08-11 05:31:07 +00004655 // FIXME: Bogus location information
4656 SourceLocation CommaLoc;
4657 if (Args.size() > 1) {
4658 Expr *First = (Expr *)Args[0];
Mike Stump11289f42009-09-09 15:08:12 +00004659 CommaLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00004660 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4661 }
4662 return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4663 T,
4664 /*FIXME:*/E->getTypeBeginLoc(),
4665 move_arg(Args),
4666 &CommaLoc,
4667 E->getLocEnd());
4668}
Mike Stump11289f42009-09-09 15:08:12 +00004669
Douglas Gregora16548e2009-08-11 05:31:07 +00004670template<typename Derived>
4671Sema::OwningExprResult
4672TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004673 CXXUnresolvedConstructExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004674 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4675 QualType T = getDerived().TransformType(E->getTypeAsWritten());
4676 if (T.isNull())
4677 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004678
Douglas Gregora16548e2009-08-11 05:31:07 +00004679 bool ArgumentChanged = false;
4680 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4681 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4682 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4683 ArgEnd = E->arg_end();
4684 Arg != ArgEnd; ++Arg) {
4685 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4686 if (TransArg.isInvalid())
4687 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004688
Douglas Gregora16548e2009-08-11 05:31:07 +00004689 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4690 FakeCommaLocs.push_back(
4691 SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4692 Args.push_back(TransArg.takeAs<Expr>());
4693 }
Mike Stump11289f42009-09-09 15:08:12 +00004694
Douglas Gregora16548e2009-08-11 05:31:07 +00004695 if (!getDerived().AlwaysRebuild() &&
4696 T == E->getTypeAsWritten() &&
4697 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00004698 return SemaRef.Owned(E->Retain());
4699
Douglas Gregora16548e2009-08-11 05:31:07 +00004700 // FIXME: we're faking the locations of the commas
4701 return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4702 T,
4703 E->getLParenLoc(),
4704 move_arg(Args),
4705 FakeCommaLocs.data(),
4706 E->getRParenLoc());
4707}
Mike Stump11289f42009-09-09 15:08:12 +00004708
Douglas Gregora16548e2009-08-11 05:31:07 +00004709template<typename Derived>
4710Sema::OwningExprResult
4711TreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004712 CXXUnresolvedMemberExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004713 // Transform the base of the expression.
4714 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4715 if (Base.isInvalid())
4716 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004717
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004718 // Start the member reference and compute the object's type.
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004719 Sema::TypeTy *ObjectType = 0;
Mike Stump11289f42009-09-09 15:08:12 +00004720 Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004721 E->getOperatorLoc(),
4722 E->isArrow()? tok::arrow : tok::period,
4723 ObjectType);
4724 if (Base.isInvalid())
4725 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004726
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004727 // Transform the first part of the nested-name-specifier that qualifies
4728 // the member name.
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004729 NamedDecl *FirstQualifierInScope
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004730 = getDerived().TransformFirstQualifierInScope(
4731 E->getFirstQualifierFoundInScope(),
4732 E->getQualifierRange().getBegin());
Mike Stump11289f42009-09-09 15:08:12 +00004733
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004734 NestedNameSpecifier *Qualifier = 0;
4735 if (E->getQualifier()) {
4736 Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4737 E->getQualifierRange(),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004738 QualType::getFromOpaquePtr(ObjectType),
4739 FirstQualifierInScope);
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004740 if (!Qualifier)
4741 return SemaRef.ExprError();
4742 }
Mike Stump11289f42009-09-09 15:08:12 +00004743
4744 DeclarationName Name
Douglas Gregorc59e5612009-10-19 22:04:39 +00004745 = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
4746 QualType::getFromOpaquePtr(ObjectType));
Douglas Gregorf816bd72009-09-03 22:13:48 +00004747 if (!Name)
4748 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004749
Douglas Gregor308047d2009-09-09 00:23:06 +00004750 if (!E->hasExplicitTemplateArgumentList()) {
4751 // This is a reference to a member without an explicitly-specified
4752 // template argument list. Optimize for this common case.
4753 if (!getDerived().AlwaysRebuild() &&
4754 Base.get() == E->getBase() &&
4755 Qualifier == E->getQualifier() &&
4756 Name == E->getMember() &&
4757 FirstQualifierInScope == E->getFirstQualifierFoundInScope())
Mike Stump11289f42009-09-09 15:08:12 +00004758 return SemaRef.Owned(E->Retain());
4759
Douglas Gregor308047d2009-09-09 00:23:06 +00004760 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4761 E->isArrow(),
4762 E->getOperatorLoc(),
4763 Qualifier,
4764 E->getQualifierRange(),
4765 Name,
4766 E->getMemberLoc(),
4767 FirstQualifierInScope);
4768 }
4769
4770 // FIXME: This is an ugly hack, which forces the same template name to
4771 // be looked up multiple times. Yuck!
Douglas Gregor71395fa2009-11-04 00:56:37 +00004772 TemporaryBase Rebase(*this, E->getMemberLoc(), DeclarationName());
4773 TemplateName OrigTemplateName;
4774 if (const IdentifierInfo *II = Name.getAsIdentifierInfo())
4775 OrigTemplateName = SemaRef.Context.getDependentTemplateName(0, II);
4776 else
4777 OrigTemplateName
4778 = SemaRef.Context.getDependentTemplateName(0,
4779 Name.getCXXOverloadedOperator());
Mike Stump11289f42009-09-09 15:08:12 +00004780
4781 TemplateName Template
4782 = getDerived().TransformTemplateName(OrigTemplateName,
Douglas Gregor308047d2009-09-09 00:23:06 +00004783 QualType::getFromOpaquePtr(ObjectType));
4784 if (Template.isNull())
4785 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004786
John McCall0ad16662009-10-29 08:12:44 +00004787 llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
Douglas Gregor308047d2009-09-09 00:23:06 +00004788 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
John McCall0ad16662009-10-29 08:12:44 +00004789 if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
4790 TransArgs[I]))
Douglas Gregor308047d2009-09-09 00:23:06 +00004791 return SemaRef.ExprError();
Douglas Gregor308047d2009-09-09 00:23:06 +00004792 }
Mike Stump11289f42009-09-09 15:08:12 +00004793
Douglas Gregora16548e2009-08-11 05:31:07 +00004794 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4795 E->isArrow(),
4796 E->getOperatorLoc(),
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004797 Qualifier,
4798 E->getQualifierRange(),
Douglas Gregor308047d2009-09-09 00:23:06 +00004799 Template,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004800 E->getMemberLoc(),
Douglas Gregor308047d2009-09-09 00:23:06 +00004801 FirstQualifierInScope,
4802 E->getLAngleLoc(),
4803 TransArgs.data(),
4804 TransArgs.size(),
4805 E->getRAngleLoc());
Douglas Gregora16548e2009-08-11 05:31:07 +00004806}
4807
4808template<typename Derived>
4809Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004810TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
4811 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004812}
4813
Mike Stump11289f42009-09-09 15:08:12 +00004814template<typename Derived>
4815Sema::OwningExprResult
4816TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004817 // FIXME: poor source location
4818 TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
4819 QualType EncodedType = getDerived().TransformType(E->getEncodedType());
4820 if (EncodedType.isNull())
4821 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004822
Douglas Gregora16548e2009-08-11 05:31:07 +00004823 if (!getDerived().AlwaysRebuild() &&
4824 EncodedType == E->getEncodedType())
Mike Stump11289f42009-09-09 15:08:12 +00004825 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004826
4827 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
4828 EncodedType,
4829 E->getRParenLoc());
4830}
Mike Stump11289f42009-09-09 15:08:12 +00004831
Douglas Gregora16548e2009-08-11 05:31:07 +00004832template<typename Derived>
4833Sema::OwningExprResult
Mike Stump11289f42009-09-09 15:08:12 +00004834TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004835 // 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
4842TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
4843 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004844}
4845
Mike Stump11289f42009-09-09 15:08:12 +00004846template<typename Derived>
4847Sema::OwningExprResult
4848TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
4849 ObjCProtocolDecl *Protocol
Douglas Gregora16548e2009-08-11 05:31:07 +00004850 = cast_or_null<ObjCProtocolDecl>(
4851 getDerived().TransformDecl(E->getProtocol()));
4852 if (!Protocol)
4853 return SemaRef.ExprError();
4854
4855 if (!getDerived().AlwaysRebuild() &&
4856 Protocol == E->getProtocol())
Mike Stump11289f42009-09-09 15:08:12 +00004857 return SemaRef.Owned(E->Retain());
4858
Douglas Gregora16548e2009-08-11 05:31:07 +00004859 return getDerived().RebuildObjCProtocolExpr(Protocol,
4860 E->getAtLoc(),
4861 /*FIXME:*/E->getAtLoc(),
4862 /*FIXME:*/E->getAtLoc(),
4863 E->getRParenLoc());
Mike Stump11289f42009-09-09 15:08:12 +00004864
Douglas Gregora16548e2009-08-11 05:31:07 +00004865}
4866
Mike Stump11289f42009-09-09 15:08:12 +00004867template<typename Derived>
4868Sema::OwningExprResult
4869TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004870 // FIXME: Implement this!
4871 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004872 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004873}
4874
Mike Stump11289f42009-09-09 15:08:12 +00004875template<typename Derived>
4876Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004877TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
4878 // FIXME: Implement this!
4879 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004880 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004881}
4882
Mike Stump11289f42009-09-09 15:08:12 +00004883template<typename Derived>
4884Sema::OwningExprResult
Fariborz Jahanian9a846652009-08-20 17:02:02 +00004885TreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
Mike Stump11289f42009-09-09 15:08:12 +00004886 ObjCImplicitSetterGetterRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004887 // FIXME: Implement this!
4888 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004889 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004890}
4891
Mike Stump11289f42009-09-09 15:08:12 +00004892template<typename Derived>
4893Sema::OwningExprResult
4894TreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004895 // FIXME: Implement this!
4896 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004897 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004898}
4899
Mike Stump11289f42009-09-09 15:08:12 +00004900template<typename Derived>
4901Sema::OwningExprResult
4902TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004903 // FIXME: Implement this!
4904 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004905 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004906}
4907
Mike Stump11289f42009-09-09 15:08:12 +00004908template<typename Derived>
4909Sema::OwningExprResult
4910TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004911 bool ArgumentChanged = false;
4912 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
4913 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
4914 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
4915 if (SubExpr.isInvalid())
4916 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004917
Douglas Gregora16548e2009-08-11 05:31:07 +00004918 ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
4919 SubExprs.push_back(SubExpr.takeAs<Expr>());
4920 }
Mike Stump11289f42009-09-09 15:08:12 +00004921
Douglas Gregora16548e2009-08-11 05:31:07 +00004922 if (!getDerived().AlwaysRebuild() &&
4923 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00004924 return SemaRef.Owned(E->Retain());
4925
Douglas Gregora16548e2009-08-11 05:31:07 +00004926 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
4927 move_arg(SubExprs),
4928 E->getRParenLoc());
4929}
4930
Mike Stump11289f42009-09-09 15:08:12 +00004931template<typename Derived>
4932Sema::OwningExprResult
4933TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004934 // FIXME: Implement this!
4935 assert(false && "Cannot transform block expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004936 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004937}
4938
Mike Stump11289f42009-09-09 15:08:12 +00004939template<typename Derived>
4940Sema::OwningExprResult
4941TreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004942 // FIXME: Implement this!
4943 assert(false && "Cannot transform block-related expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004944 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004945}
Mike Stump11289f42009-09-09 15:08:12 +00004946
Douglas Gregora16548e2009-08-11 05:31:07 +00004947//===----------------------------------------------------------------------===//
Douglas Gregord6ff3322009-08-04 16:50:30 +00004948// Type reconstruction
4949//===----------------------------------------------------------------------===//
4950
Mike Stump11289f42009-09-09 15:08:12 +00004951template<typename Derived>
John McCall70dd5f62009-10-30 00:06:24 +00004952QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
4953 SourceLocation Star) {
4954 return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004955 getDerived().getBaseEntity());
4956}
4957
Mike Stump11289f42009-09-09 15:08:12 +00004958template<typename Derived>
John McCall70dd5f62009-10-30 00:06:24 +00004959QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
4960 SourceLocation Star) {
4961 return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star,
Douglas Gregord6ff3322009-08-04 16:50:30 +00004962 getDerived().getBaseEntity());
4963}
4964
Mike Stump11289f42009-09-09 15:08:12 +00004965template<typename Derived>
4966QualType
John McCall70dd5f62009-10-30 00:06:24 +00004967TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
4968 bool WrittenAsLValue,
4969 SourceLocation Sigil) {
4970 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(),
4971 Sigil, getDerived().getBaseEntity());
Douglas Gregord6ff3322009-08-04 16:50:30 +00004972}
4973
4974template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004975QualType
John McCall70dd5f62009-10-30 00:06:24 +00004976TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
4977 QualType ClassType,
4978 SourceLocation Sigil) {
John McCall8ccfcb52009-09-24 19:53:00 +00004979 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
John McCall70dd5f62009-10-30 00:06:24 +00004980 Sigil, getDerived().getBaseEntity());
Douglas Gregord6ff3322009-08-04 16:50:30 +00004981}
4982
4983template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004984QualType
John McCall70dd5f62009-10-30 00:06:24 +00004985TreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType,
4986 SourceLocation Sigil) {
4987 return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil,
John McCall550e0c22009-10-21 00:40:46 +00004988 getDerived().getBaseEntity());
4989}
4990
4991template<typename Derived>
4992QualType
Douglas Gregord6ff3322009-08-04 16:50:30 +00004993TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
4994 ArrayType::ArraySizeModifier SizeMod,
4995 const llvm::APInt *Size,
4996 Expr *SizeExpr,
4997 unsigned IndexTypeQuals,
4998 SourceRange BracketsRange) {
4999 if (SizeExpr || !Size)
5000 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
5001 IndexTypeQuals, BracketsRange,
5002 getDerived().getBaseEntity());
Mike Stump11289f42009-09-09 15:08:12 +00005003
5004 QualType Types[] = {
5005 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
5006 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
5007 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
Douglas Gregord6ff3322009-08-04 16:50:30 +00005008 };
5009 const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
5010 QualType SizeType;
5011 for (unsigned I = 0; I != NumTypes; ++I)
5012 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
5013 SizeType = Types[I];
5014 break;
5015 }
Mike Stump11289f42009-09-09 15:08:12 +00005016
Douglas Gregord6ff3322009-08-04 16:50:30 +00005017 if (SizeType.isNull())
5018 SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
Mike Stump11289f42009-09-09 15:08:12 +00005019
Douglas Gregord6ff3322009-08-04 16:50:30 +00005020 IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
Mike Stump11289f42009-09-09 15:08:12 +00005021 return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005022 IndexTypeQuals, BracketsRange,
Mike Stump11289f42009-09-09 15:08:12 +00005023 getDerived().getBaseEntity());
Douglas Gregord6ff3322009-08-04 16:50:30 +00005024}
Mike Stump11289f42009-09-09 15:08:12 +00005025
Douglas Gregord6ff3322009-08-04 16:50:30 +00005026template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005027QualType
5028TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005029 ArrayType::ArraySizeModifier SizeMod,
5030 const llvm::APInt &Size,
John McCall70dd5f62009-10-30 00:06:24 +00005031 unsigned IndexTypeQuals,
5032 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00005033 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
John McCall70dd5f62009-10-30 00:06:24 +00005034 IndexTypeQuals, BracketsRange);
Douglas Gregord6ff3322009-08-04 16:50:30 +00005035}
5036
5037template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005038QualType
Mike Stump11289f42009-09-09 15:08:12 +00005039TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005040 ArrayType::ArraySizeModifier SizeMod,
John McCall70dd5f62009-10-30 00:06:24 +00005041 unsigned IndexTypeQuals,
5042 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00005043 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
John McCall70dd5f62009-10-30 00:06:24 +00005044 IndexTypeQuals, BracketsRange);
Douglas Gregord6ff3322009-08-04 16:50:30 +00005045}
Mike Stump11289f42009-09-09 15:08:12 +00005046
Douglas Gregord6ff3322009-08-04 16:50:30 +00005047template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005048QualType
5049TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005050 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +00005051 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005052 unsigned IndexTypeQuals,
5053 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00005054 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005055 SizeExpr.takeAs<Expr>(),
5056 IndexTypeQuals, BracketsRange);
5057}
5058
5059template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005060QualType
5061TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005062 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +00005063 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005064 unsigned IndexTypeQuals,
5065 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00005066 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005067 SizeExpr.takeAs<Expr>(),
5068 IndexTypeQuals, BracketsRange);
5069}
5070
5071template<typename Derived>
5072QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
5073 unsigned NumElements) {
5074 // FIXME: semantic checking!
5075 return SemaRef.Context.getVectorType(ElementType, NumElements);
5076}
Mike Stump11289f42009-09-09 15:08:12 +00005077
Douglas Gregord6ff3322009-08-04 16:50:30 +00005078template<typename Derived>
5079QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
5080 unsigned NumElements,
5081 SourceLocation AttributeLoc) {
5082 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
5083 NumElements, true);
5084 IntegerLiteral *VectorSize
Mike Stump11289f42009-09-09 15:08:12 +00005085 = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005086 AttributeLoc);
5087 return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
5088 AttributeLoc);
5089}
Mike Stump11289f42009-09-09 15:08:12 +00005090
Douglas Gregord6ff3322009-08-04 16:50:30 +00005091template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005092QualType
5093TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
Douglas Gregora16548e2009-08-11 05:31:07 +00005094 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005095 SourceLocation AttributeLoc) {
5096 return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
5097}
Mike Stump11289f42009-09-09 15:08:12 +00005098
Douglas Gregord6ff3322009-08-04 16:50:30 +00005099template<typename Derived>
5100QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
Mike Stump11289f42009-09-09 15:08:12 +00005101 QualType *ParamTypes,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005102 unsigned NumParamTypes,
Mike Stump11289f42009-09-09 15:08:12 +00005103 bool Variadic,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005104 unsigned Quals) {
Mike Stump11289f42009-09-09 15:08:12 +00005105 return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005106 Quals,
5107 getDerived().getBaseLocation(),
5108 getDerived().getBaseEntity());
5109}
Mike Stump11289f42009-09-09 15:08:12 +00005110
Douglas Gregord6ff3322009-08-04 16:50:30 +00005111template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00005112QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
5113 return SemaRef.Context.getFunctionNoProtoType(T);
5114}
5115
5116template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00005117QualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00005118 return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
5119}
5120
5121template<typename Derived>
5122QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
5123 return SemaRef.Context.getTypeOfType(Underlying);
5124}
5125
5126template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00005127QualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00005128 return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
5129}
5130
5131template<typename Derived>
5132QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
John McCall0ad16662009-10-29 08:12:44 +00005133 TemplateName Template,
5134 SourceLocation TemplateNameLoc,
5135 SourceLocation LAngleLoc,
5136 const TemplateArgumentLoc *Args,
5137 unsigned NumArgs,
5138 SourceLocation RAngleLoc) {
5139 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, LAngleLoc,
5140 Args, NumArgs, RAngleLoc);
Douglas Gregord6ff3322009-08-04 16:50:30 +00005141}
Mike Stump11289f42009-09-09 15:08:12 +00005142
Douglas Gregor1135c352009-08-06 05:28:30 +00005143template<typename Derived>
5144NestedNameSpecifier *
5145TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5146 SourceRange Range,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00005147 IdentifierInfo &II,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00005148 QualType ObjectType,
5149 NamedDecl *FirstQualifierInScope) {
Douglas Gregor1135c352009-08-06 05:28:30 +00005150 CXXScopeSpec SS;
5151 // FIXME: The source location information is all wrong.
5152 SS.setRange(Range);
5153 SS.setScopeRep(Prefix);
5154 return static_cast<NestedNameSpecifier *>(
Mike Stump11289f42009-09-09 15:08:12 +00005155 SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
Douglas Gregore861bac2009-08-25 22:51:20 +00005156 Range.getEnd(), II,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00005157 ObjectType,
5158 FirstQualifierInScope,
Douglas Gregore861bac2009-08-25 22:51:20 +00005159 false));
Douglas Gregor1135c352009-08-06 05:28:30 +00005160}
5161
5162template<typename Derived>
5163NestedNameSpecifier *
5164TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5165 SourceRange Range,
5166 NamespaceDecl *NS) {
5167 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
5168}
5169
5170template<typename Derived>
5171NestedNameSpecifier *
5172TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5173 SourceRange Range,
5174 bool TemplateKW,
5175 QualType T) {
5176 if (T->isDependentType() || T->isRecordType() ||
5177 (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
John McCall8ccfcb52009-09-24 19:53:00 +00005178 assert(!T.hasQualifiers() && "Can't get cv-qualifiers here");
Douglas Gregor1135c352009-08-06 05:28:30 +00005179 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
5180 T.getTypePtr());
5181 }
Mike Stump11289f42009-09-09 15:08:12 +00005182
Douglas Gregor1135c352009-08-06 05:28:30 +00005183 SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
5184 return 0;
5185}
Mike Stump11289f42009-09-09 15:08:12 +00005186
Douglas Gregor71dc5092009-08-06 06:41:21 +00005187template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005188TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00005189TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5190 bool TemplateKW,
5191 TemplateDecl *Template) {
Mike Stump11289f42009-09-09 15:08:12 +00005192 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
Douglas Gregor71dc5092009-08-06 06:41:21 +00005193 Template);
5194}
5195
5196template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005197TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00005198TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5199 bool TemplateKW,
5200 OverloadedFunctionDecl *Ovl) {
5201 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
5202}
5203
5204template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005205TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00005206TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
Douglas Gregor308047d2009-09-09 00:23:06 +00005207 const IdentifierInfo &II,
5208 QualType ObjectType) {
Douglas Gregor71dc5092009-08-06 06:41:21 +00005209 CXXScopeSpec SS;
5210 SS.setRange(SourceRange(getDerived().getBaseLocation()));
Mike Stump11289f42009-09-09 15:08:12 +00005211 SS.setScopeRep(Qualifier);
Douglas Gregor3cf81312009-11-03 23:16:33 +00005212 UnqualifiedId Name;
5213 Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
Douglas Gregor308047d2009-09-09 00:23:06 +00005214 return getSema().ActOnDependentTemplateName(
5215 /*FIXME:*/getDerived().getBaseLocation(),
Douglas Gregor308047d2009-09-09 00:23:06 +00005216 SS,
Douglas Gregor3cf81312009-11-03 23:16:33 +00005217 Name,
Douglas Gregor308047d2009-09-09 00:23:06 +00005218 ObjectType.getAsOpaquePtr())
5219 .template getAsVal<TemplateName>();
Douglas Gregor71dc5092009-08-06 06:41:21 +00005220}
Mike Stump11289f42009-09-09 15:08:12 +00005221
Douglas Gregora16548e2009-08-11 05:31:07 +00005222template<typename Derived>
Douglas Gregor71395fa2009-11-04 00:56:37 +00005223TemplateName
5224TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5225 OverloadedOperatorKind Operator,
5226 QualType ObjectType) {
5227 CXXScopeSpec SS;
5228 SS.setRange(SourceRange(getDerived().getBaseLocation()));
5229 SS.setScopeRep(Qualifier);
5230 UnqualifiedId Name;
5231 SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
5232 Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
5233 Operator, SymbolLocations);
5234 return getSema().ActOnDependentTemplateName(
5235 /*FIXME:*/getDerived().getBaseLocation(),
5236 SS,
5237 Name,
5238 ObjectType.getAsOpaquePtr())
5239 .template getAsVal<TemplateName>();
5240}
5241
5242template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005243Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00005244TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
5245 SourceLocation OpLoc,
5246 ExprArg Callee,
5247 ExprArg First,
5248 ExprArg Second) {
5249 Expr *FirstExpr = (Expr *)First.get();
5250 Expr *SecondExpr = (Expr *)Second.get();
Sebastian Redladba46e2009-10-29 20:17:01 +00005251 DeclRefExpr *DRE
5252 = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts());
Douglas Gregora16548e2009-08-11 05:31:07 +00005253 bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
Mike Stump11289f42009-09-09 15:08:12 +00005254
Douglas Gregora16548e2009-08-11 05:31:07 +00005255 // Determine whether this should be a builtin operation.
Sebastian Redladba46e2009-10-29 20:17:01 +00005256 if (Op == OO_Subscript) {
5257 if (!FirstExpr->getType()->isOverloadableType() &&
5258 !SecondExpr->getType()->isOverloadableType())
5259 return getSema().CreateBuiltinArraySubscriptExpr(move(First),
5260 DRE->getLocStart(),
5261 move(Second), OpLoc);
5262 } else if (SecondExpr == 0 || isPostIncDec) {
Douglas Gregora16548e2009-08-11 05:31:07 +00005263 if (!FirstExpr->getType()->isOverloadableType()) {
5264 // The argument is not of overloadable type, so try to create a
5265 // built-in unary operation.
Mike Stump11289f42009-09-09 15:08:12 +00005266 UnaryOperator::Opcode Opc
Douglas Gregora16548e2009-08-11 05:31:07 +00005267 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
Mike Stump11289f42009-09-09 15:08:12 +00005268
Douglas Gregora16548e2009-08-11 05:31:07 +00005269 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
5270 }
5271 } else {
Mike Stump11289f42009-09-09 15:08:12 +00005272 if (!FirstExpr->getType()->isOverloadableType() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00005273 !SecondExpr->getType()->isOverloadableType()) {
5274 // Neither of the arguments is an overloadable type, so try to
5275 // create a built-in binary operation.
5276 BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
Mike Stump11289f42009-09-09 15:08:12 +00005277 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00005278 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
5279 if (Result.isInvalid())
5280 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00005281
Douglas Gregora16548e2009-08-11 05:31:07 +00005282 First.release();
5283 Second.release();
5284 return move(Result);
5285 }
5286 }
Mike Stump11289f42009-09-09 15:08:12 +00005287
5288 // Compute the transformed set of functions (and function templates) to be
Douglas Gregora16548e2009-08-11 05:31:07 +00005289 // used during overload resolution.
5290 Sema::FunctionSet Functions;
Mike Stump11289f42009-09-09 15:08:12 +00005291
Douglas Gregora16548e2009-08-11 05:31:07 +00005292 // FIXME: Do we have to check
5293 // IsAcceptableNonMemberOperatorCandidate for each of these?
Douglas Gregor32e2c842009-09-01 16:58:52 +00005294 for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F)
Douglas Gregora16548e2009-08-11 05:31:07 +00005295 Functions.insert(*F);
Mike Stump11289f42009-09-09 15:08:12 +00005296
Douglas Gregora16548e2009-08-11 05:31:07 +00005297 // Add any functions found via argument-dependent lookup.
5298 Expr *Args[2] = { FirstExpr, SecondExpr };
5299 unsigned NumArgs = 1 + (SecondExpr != 0);
Mike Stump11289f42009-09-09 15:08:12 +00005300 DeclarationName OpName
Douglas Gregora16548e2009-08-11 05:31:07 +00005301 = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
Sebastian Redlc057f422009-10-23 19:23:15 +00005302 SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs,
5303 Functions);
Mike Stump11289f42009-09-09 15:08:12 +00005304
Douglas Gregora16548e2009-08-11 05:31:07 +00005305 // Create the overloaded operator invocation for unary operators.
5306 if (NumArgs == 1 || isPostIncDec) {
Mike Stump11289f42009-09-09 15:08:12 +00005307 UnaryOperator::Opcode Opc
Douglas Gregora16548e2009-08-11 05:31:07 +00005308 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
5309 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
5310 }
Mike Stump11289f42009-09-09 15:08:12 +00005311
Sebastian Redladba46e2009-10-29 20:17:01 +00005312 if (Op == OO_Subscript)
5313 return SemaRef.CreateOverloadedArraySubscriptExpr(DRE->getLocStart(), OpLoc,
5314 move(First),move(Second));
5315
Douglas Gregora16548e2009-08-11 05:31:07 +00005316 // Create the overloaded operator invocation for binary operators.
Mike Stump11289f42009-09-09 15:08:12 +00005317 BinaryOperator::Opcode Opc =
Douglas Gregora16548e2009-08-11 05:31:07 +00005318 BinaryOperator::getOverloadedOpcode(Op);
Mike Stump11289f42009-09-09 15:08:12 +00005319 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00005320 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
5321 if (Result.isInvalid())
5322 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00005323
Douglas Gregora16548e2009-08-11 05:31:07 +00005324 First.release();
5325 Second.release();
Mike Stump11289f42009-09-09 15:08:12 +00005326 return move(Result);
Douglas Gregora16548e2009-08-11 05:31:07 +00005327}
Mike Stump11289f42009-09-09 15:08:12 +00005328
Douglas Gregord6ff3322009-08-04 16:50:30 +00005329} // end namespace clang
5330
5331#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H