blob: 51393a37c05a5ec11fcb025dd87aa586b84294aa [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) \
Douglas Gregorc95a1fa2009-11-04 07:01:15 +0000329 OwningExprResult Transform##Node(Node *E, bool isAddressOfOperand);
Douglas Gregora16548e2009-08-11 05:31:07 +0000330#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,
Douglas Gregorc95a1fa2009-11-04 07:01:15 +0000823 NamedDecl *ND, SourceLocation Loc,
824 bool isAddressOfOperand) {
Douglas Gregor4bd90e52009-10-23 18:54:35 +0000825 CXXScopeSpec SS;
826 SS.setScopeRep(Qualifier);
827 SS.setRange(QualifierRange);
Douglas Gregora16548e2009-08-11 05:31:07 +0000828 return getSema().BuildDeclarationNameExpr(Loc, ND,
829 /*FIXME:*/false,
Douglas Gregor4bd90e52009-10-23 18:54:35 +0000830 &SS,
Douglas Gregorc95a1fa2009-11-04 07:01:15 +0000831 isAddressOfOperand);
Douglas Gregora16548e2009-08-11 05:31:07 +0000832 }
Mike Stump11289f42009-09-09 15:08:12 +0000833
Douglas Gregora16548e2009-08-11 05:31:07 +0000834 /// \brief Build a new expression in parentheses.
Mike Stump11289f42009-09-09 15:08:12 +0000835 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000836 /// By default, performs semantic analysis to build the new expression.
837 /// Subclasses may override this routine to provide different behavior.
838 OwningExprResult RebuildParenExpr(ExprArg SubExpr, SourceLocation LParen,
839 SourceLocation RParen) {
840 return getSema().ActOnParenExpr(LParen, RParen, move(SubExpr));
841 }
842
Douglas Gregorad8a3362009-09-04 17:36:40 +0000843 /// \brief Build a new pseudo-destructor expression.
Mike Stump11289f42009-09-09 15:08:12 +0000844 ///
Douglas Gregorad8a3362009-09-04 17:36:40 +0000845 /// By default, performs semantic analysis to build the new expression.
846 /// Subclasses may override this routine to provide different behavior.
847 OwningExprResult RebuildCXXPseudoDestructorExpr(ExprArg Base,
848 SourceLocation OperatorLoc,
849 bool isArrow,
850 SourceLocation DestroyedTypeLoc,
851 QualType DestroyedType,
852 NestedNameSpecifier *Qualifier,
853 SourceRange QualifierRange) {
854 CXXScopeSpec SS;
855 if (Qualifier) {
856 SS.setRange(QualifierRange);
857 SS.setScopeRep(Qualifier);
858 }
859
Mike Stump11289f42009-09-09 15:08:12 +0000860 DeclarationName Name
Douglas Gregorad8a3362009-09-04 17:36:40 +0000861 = SemaRef.Context.DeclarationNames.getCXXDestructorName(
862 SemaRef.Context.getCanonicalType(DestroyedType));
Mike Stump11289f42009-09-09 15:08:12 +0000863
864 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
Douglas Gregorad8a3362009-09-04 17:36:40 +0000865 OperatorLoc,
866 isArrow? tok::arrow : tok::period,
867 DestroyedTypeLoc,
868 Name,
869 Sema::DeclPtrTy::make((Decl *)0),
870 &SS);
Mike Stump11289f42009-09-09 15:08:12 +0000871 }
872
Douglas Gregora16548e2009-08-11 05:31:07 +0000873 /// \brief Build a new unary operator expression.
Mike Stump11289f42009-09-09 15:08:12 +0000874 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000875 /// By default, performs semantic analysis to build the new expression.
876 /// Subclasses may override this routine to provide different behavior.
877 OwningExprResult RebuildUnaryOperator(SourceLocation OpLoc,
878 UnaryOperator::Opcode Opc,
879 ExprArg SubExpr) {
880 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(SubExpr));
881 }
Mike Stump11289f42009-09-09 15:08:12 +0000882
Douglas Gregora16548e2009-08-11 05:31:07 +0000883 /// \brief Build a new sizeof or alignof expression with a type argument.
Mike Stump11289f42009-09-09 15:08:12 +0000884 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000885 /// By default, performs semantic analysis to build the new expression.
886 /// Subclasses may override this routine to provide different behavior.
John McCall4c98fd82009-11-04 07:28:41 +0000887 OwningExprResult RebuildSizeOfAlignOf(DeclaratorInfo *DInfo,
888 SourceLocation OpLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +0000889 bool isSizeOf, SourceRange R) {
John McCall4c98fd82009-11-04 07:28:41 +0000890 return getSema().CreateSizeOfAlignOfExpr(DInfo, OpLoc, isSizeOf, R);
Douglas Gregora16548e2009-08-11 05:31:07 +0000891 }
892
Mike Stump11289f42009-09-09 15:08:12 +0000893 /// \brief Build a new sizeof or alignof expression with an expression
Douglas Gregora16548e2009-08-11 05:31:07 +0000894 /// argument.
Mike Stump11289f42009-09-09 15:08:12 +0000895 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000896 /// By default, performs semantic analysis to build the new expression.
897 /// Subclasses may override this routine to provide different behavior.
898 OwningExprResult RebuildSizeOfAlignOf(ExprArg SubExpr, SourceLocation OpLoc,
899 bool isSizeOf, SourceRange R) {
Mike Stump11289f42009-09-09 15:08:12 +0000900 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +0000901 = getSema().CreateSizeOfAlignOfExpr((Expr *)SubExpr.get(),
902 OpLoc, isSizeOf, R);
903 if (Result.isInvalid())
904 return getSema().ExprError();
Mike Stump11289f42009-09-09 15:08:12 +0000905
Douglas Gregora16548e2009-08-11 05:31:07 +0000906 SubExpr.release();
907 return move(Result);
908 }
Mike Stump11289f42009-09-09 15:08:12 +0000909
Douglas Gregora16548e2009-08-11 05:31:07 +0000910 /// \brief Build a new array subscript expression.
Mike Stump11289f42009-09-09 15:08:12 +0000911 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000912 /// By default, performs semantic analysis to build the new expression.
913 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +0000914 OwningExprResult RebuildArraySubscriptExpr(ExprArg LHS,
Douglas Gregora16548e2009-08-11 05:31:07 +0000915 SourceLocation LBracketLoc,
916 ExprArg RHS,
917 SourceLocation RBracketLoc) {
918 return getSema().ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
Mike Stump11289f42009-09-09 15:08:12 +0000919 LBracketLoc, move(RHS),
Douglas Gregora16548e2009-08-11 05:31:07 +0000920 RBracketLoc);
921 }
922
923 /// \brief Build a new call expression.
Mike Stump11289f42009-09-09 15:08:12 +0000924 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000925 /// By default, performs semantic analysis to build the new expression.
926 /// Subclasses may override this routine to provide different behavior.
927 OwningExprResult RebuildCallExpr(ExprArg Callee, SourceLocation LParenLoc,
928 MultiExprArg Args,
929 SourceLocation *CommaLocs,
930 SourceLocation RParenLoc) {
931 return getSema().ActOnCallExpr(/*Scope=*/0, move(Callee), LParenLoc,
932 move(Args), CommaLocs, RParenLoc);
933 }
934
935 /// \brief Build a new member access expression.
Mike Stump11289f42009-09-09 15:08:12 +0000936 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000937 /// By default, performs semantic analysis to build the new expression.
938 /// Subclasses may override this routine to provide different behavior.
939 OwningExprResult RebuildMemberExpr(ExprArg Base, SourceLocation OpLoc,
Mike Stump11289f42009-09-09 15:08:12 +0000940 bool isArrow,
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000941 NestedNameSpecifier *Qualifier,
942 SourceRange QualifierRange,
943 SourceLocation MemberLoc,
Douglas Gregorb184f0d2009-11-04 23:20:05 +0000944 NamedDecl *Member,
945 bool HasExplicitTemplateArgs,
946 SourceLocation LAngleLoc,
947 const TemplateArgumentLoc *ExplicitTemplateArgs,
948 unsigned NumExplicitTemplateArgs,
949 SourceLocation RAngleLoc,
950 NamedDecl *FirstQualifierInScope) {
Anders Carlsson5da84842009-09-01 04:26:58 +0000951 if (!Member->getDeclName()) {
952 // We have a reference to an unnamed field.
953 assert(!Qualifier && "Can't have an unnamed field with a qualifier!");
Mike Stump11289f42009-09-09 15:08:12 +0000954
955 MemberExpr *ME =
Anders Carlsson5da84842009-09-01 04:26:58 +0000956 new (getSema().Context) MemberExpr(Base.takeAs<Expr>(), isArrow,
957 Member, MemberLoc,
958 cast<FieldDecl>(Member)->getType());
959 return getSema().Owned(ME);
960 }
Mike Stump11289f42009-09-09 15:08:12 +0000961
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000962 CXXScopeSpec SS;
963 if (Qualifier) {
964 SS.setRange(QualifierRange);
965 SS.setScopeRep(Qualifier);
966 }
967
Douglas Gregorf14b46f2009-08-31 20:00:26 +0000968 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +0000969 isArrow? tok::arrow : tok::period,
970 MemberLoc,
Douglas Gregorf14b46f2009-08-31 20:00:26 +0000971 Member->getDeclName(),
Douglas Gregorb184f0d2009-11-04 23:20:05 +0000972 HasExplicitTemplateArgs,
973 LAngleLoc,
974 ExplicitTemplateArgs,
975 NumExplicitTemplateArgs,
976 RAngleLoc,
Douglas Gregorf405d7e2009-08-31 23:41:50 +0000977 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
Douglas Gregorb184f0d2009-11-04 23:20:05 +0000978 &SS,
979 FirstQualifierInScope);
Douglas Gregora16548e2009-08-11 05:31:07 +0000980 }
Mike Stump11289f42009-09-09 15:08:12 +0000981
Douglas Gregora16548e2009-08-11 05:31:07 +0000982 /// \brief Build a new binary operator expression.
Mike Stump11289f42009-09-09 15:08:12 +0000983 ///
Douglas Gregora16548e2009-08-11 05:31:07 +0000984 /// By default, performs semantic analysis to build the new expression.
985 /// Subclasses may override this routine to provide different behavior.
986 OwningExprResult RebuildBinaryOperator(SourceLocation OpLoc,
987 BinaryOperator::Opcode Opc,
988 ExprArg LHS, ExprArg RHS) {
989 OwningExprResult Result
Mike Stump11289f42009-09-09 15:08:12 +0000990 = getSema().CreateBuiltinBinOp(OpLoc, Opc, (Expr *)LHS.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +0000991 (Expr *)RHS.get());
992 if (Result.isInvalid())
993 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +0000994
Douglas Gregora16548e2009-08-11 05:31:07 +0000995 LHS.release();
996 RHS.release();
997 return move(Result);
998 }
999
1000 /// \brief Build a new conditional operator expression.
Mike Stump11289f42009-09-09 15:08:12 +00001001 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001002 /// By default, performs semantic analysis to build the new expression.
1003 /// Subclasses may override this routine to provide different behavior.
1004 OwningExprResult RebuildConditionalOperator(ExprArg Cond,
1005 SourceLocation QuestionLoc,
1006 ExprArg LHS,
1007 SourceLocation ColonLoc,
1008 ExprArg RHS) {
Mike Stump11289f42009-09-09 15:08:12 +00001009 return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, move(Cond),
Douglas Gregora16548e2009-08-11 05:31:07 +00001010 move(LHS), move(RHS));
1011 }
1012
1013 /// \brief Build a new implicit cast expression.
Mike Stump11289f42009-09-09 15:08:12 +00001014 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001015 /// By default, builds a new implicit cast without any semantic analysis.
1016 /// Subclasses may override this routine to provide different behavior.
1017 OwningExprResult RebuildImplicitCastExpr(QualType T, CastExpr::CastKind Kind,
1018 ExprArg SubExpr, bool isLvalue) {
1019 ImplicitCastExpr *ICE
Mike Stump11289f42009-09-09 15:08:12 +00001020 = new (getSema().Context) ImplicitCastExpr(T, Kind,
Douglas Gregora16548e2009-08-11 05:31:07 +00001021 (Expr *)SubExpr.release(),
1022 isLvalue);
1023 return getSema().Owned(ICE);
1024 }
1025
1026 /// \brief Build a new C-style cast expression.
Mike Stump11289f42009-09-09 15:08:12 +00001027 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001028 /// By default, performs semantic analysis to build the new expression.
1029 /// Subclasses may override this routine to provide different behavior.
1030 OwningExprResult RebuildCStyleCaseExpr(SourceLocation LParenLoc,
1031 QualType ExplicitTy,
1032 SourceLocation RParenLoc,
1033 ExprArg SubExpr) {
1034 return getSema().ActOnCastExpr(/*Scope=*/0,
1035 LParenLoc,
1036 ExplicitTy.getAsOpaquePtr(),
1037 RParenLoc,
1038 move(SubExpr));
1039 }
Mike Stump11289f42009-09-09 15:08:12 +00001040
Douglas Gregora16548e2009-08-11 05:31:07 +00001041 /// \brief Build a new compound literal expression.
Mike Stump11289f42009-09-09 15:08:12 +00001042 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001043 /// By default, performs semantic analysis to build the new expression.
1044 /// Subclasses may override this routine to provide different behavior.
1045 OwningExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
1046 QualType T,
1047 SourceLocation RParenLoc,
1048 ExprArg Init) {
1049 return getSema().ActOnCompoundLiteral(LParenLoc, T.getAsOpaquePtr(),
1050 RParenLoc, move(Init));
1051 }
Mike Stump11289f42009-09-09 15:08:12 +00001052
Douglas Gregora16548e2009-08-11 05:31:07 +00001053 /// \brief Build a new extended vector element access 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.
Mike Stump11289f42009-09-09 15:08:12 +00001057 OwningExprResult RebuildExtVectorElementExpr(ExprArg Base,
Douglas Gregora16548e2009-08-11 05:31:07 +00001058 SourceLocation OpLoc,
1059 SourceLocation AccessorLoc,
1060 IdentifierInfo &Accessor) {
Douglas Gregor30d60cb2009-11-03 19:44:04 +00001061 return getSema().BuildMemberReferenceExpr(/*Scope=*/0, move(Base), OpLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001062 tok::period, AccessorLoc,
Douglas Gregor30d60cb2009-11-03 19:44:04 +00001063 DeclarationName(&Accessor),
Douglas Gregora16548e2009-08-11 05:31:07 +00001064 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1065 }
Mike Stump11289f42009-09-09 15:08:12 +00001066
Douglas Gregora16548e2009-08-11 05:31:07 +00001067 /// \brief Build a new initializer list expression.
Mike Stump11289f42009-09-09 15:08:12 +00001068 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001069 /// By default, performs semantic analysis to build the new expression.
1070 /// Subclasses may override this routine to provide different behavior.
1071 OwningExprResult RebuildInitList(SourceLocation LBraceLoc,
1072 MultiExprArg Inits,
1073 SourceLocation RBraceLoc) {
1074 return SemaRef.ActOnInitList(LBraceLoc, move(Inits), RBraceLoc);
1075 }
Mike Stump11289f42009-09-09 15:08:12 +00001076
Douglas Gregora16548e2009-08-11 05:31:07 +00001077 /// \brief Build a new designated initializer expression.
Mike Stump11289f42009-09-09 15:08:12 +00001078 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001079 /// By default, performs semantic analysis to build the new expression.
1080 /// Subclasses may override this routine to provide different behavior.
1081 OwningExprResult RebuildDesignatedInitExpr(Designation &Desig,
1082 MultiExprArg ArrayExprs,
1083 SourceLocation EqualOrColonLoc,
1084 bool GNUSyntax,
1085 ExprArg Init) {
1086 OwningExprResult Result
1087 = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
1088 move(Init));
1089 if (Result.isInvalid())
1090 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001091
Douglas Gregora16548e2009-08-11 05:31:07 +00001092 ArrayExprs.release();
1093 return move(Result);
1094 }
Mike Stump11289f42009-09-09 15:08:12 +00001095
Douglas Gregora16548e2009-08-11 05:31:07 +00001096 /// \brief Build a new value-initialized expression.
Mike Stump11289f42009-09-09 15:08:12 +00001097 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001098 /// By default, builds the implicit value initialization without performing
1099 /// any semantic analysis. Subclasses may override this routine to provide
1100 /// different behavior.
1101 OwningExprResult RebuildImplicitValueInitExpr(QualType T) {
1102 return SemaRef.Owned(new (SemaRef.Context) ImplicitValueInitExpr(T));
1103 }
Mike Stump11289f42009-09-09 15:08:12 +00001104
Douglas Gregora16548e2009-08-11 05:31:07 +00001105 /// \brief Build a new \c va_arg expression.
Mike Stump11289f42009-09-09 15:08:12 +00001106 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001107 /// By default, performs semantic analysis to build the new expression.
1108 /// Subclasses may override this routine to provide different behavior.
1109 OwningExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc, ExprArg SubExpr,
1110 QualType T, SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001111 return getSema().ActOnVAArg(BuiltinLoc, move(SubExpr), T.getAsOpaquePtr(),
Douglas Gregora16548e2009-08-11 05:31:07 +00001112 RParenLoc);
1113 }
1114
1115 /// \brief Build a new expression list in parentheses.
Mike Stump11289f42009-09-09 15:08:12 +00001116 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001117 /// By default, performs semantic analysis to build the new expression.
1118 /// Subclasses may override this routine to provide different behavior.
1119 OwningExprResult RebuildParenListExpr(SourceLocation LParenLoc,
1120 MultiExprArg SubExprs,
1121 SourceLocation RParenLoc) {
1122 return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, move(SubExprs));
1123 }
Mike Stump11289f42009-09-09 15:08:12 +00001124
Douglas Gregora16548e2009-08-11 05:31:07 +00001125 /// \brief Build a new address-of-label expression.
Mike Stump11289f42009-09-09 15:08:12 +00001126 ///
1127 /// By default, performs semantic analysis, using the name of the label
Douglas Gregora16548e2009-08-11 05:31:07 +00001128 /// rather than attempting to map the label statement itself.
1129 /// Subclasses may override this routine to provide different behavior.
1130 OwningExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
1131 SourceLocation LabelLoc,
1132 LabelStmt *Label) {
1133 return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label->getID());
1134 }
Mike Stump11289f42009-09-09 15:08:12 +00001135
Douglas Gregora16548e2009-08-11 05:31:07 +00001136 /// \brief Build a new GNU statement expression.
Mike Stump11289f42009-09-09 15:08:12 +00001137 ///
Douglas Gregora16548e2009-08-11 05:31:07 +00001138 /// By default, performs semantic analysis to build the new expression.
1139 /// Subclasses may override this routine to provide different behavior.
1140 OwningExprResult RebuildStmtExpr(SourceLocation LParenLoc,
1141 StmtArg SubStmt,
1142 SourceLocation RParenLoc) {
1143 return getSema().ActOnStmtExpr(LParenLoc, move(SubStmt), RParenLoc);
1144 }
Mike Stump11289f42009-09-09 15:08:12 +00001145
Douglas Gregora16548e2009-08-11 05:31:07 +00001146 /// \brief Build a new __builtin_types_compatible_p expression.
1147 ///
1148 /// By default, performs semantic analysis to build the new expression.
1149 /// Subclasses may override this routine to provide different behavior.
1150 OwningExprResult RebuildTypesCompatibleExpr(SourceLocation BuiltinLoc,
1151 QualType T1, QualType T2,
1152 SourceLocation RParenLoc) {
1153 return getSema().ActOnTypesCompatibleExpr(BuiltinLoc,
1154 T1.getAsOpaquePtr(),
1155 T2.getAsOpaquePtr(),
1156 RParenLoc);
1157 }
Mike Stump11289f42009-09-09 15:08:12 +00001158
Douglas Gregora16548e2009-08-11 05:31:07 +00001159 /// \brief Build a new __builtin_choose_expr expression.
1160 ///
1161 /// By default, performs semantic analysis to build the new expression.
1162 /// Subclasses may override this routine to provide different behavior.
1163 OwningExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
1164 ExprArg Cond, ExprArg LHS, ExprArg RHS,
1165 SourceLocation RParenLoc) {
1166 return SemaRef.ActOnChooseExpr(BuiltinLoc,
1167 move(Cond), move(LHS), move(RHS),
1168 RParenLoc);
1169 }
Mike Stump11289f42009-09-09 15:08:12 +00001170
Douglas Gregora16548e2009-08-11 05:31:07 +00001171 /// \brief Build a new overloaded operator call expression.
1172 ///
1173 /// By default, performs semantic analysis to build the new expression.
1174 /// The semantic analysis provides the behavior of template instantiation,
1175 /// copying with transformations that turn what looks like an overloaded
Mike Stump11289f42009-09-09 15:08:12 +00001176 /// operator call into a use of a builtin operator, performing
Douglas Gregora16548e2009-08-11 05:31:07 +00001177 /// argument-dependent lookup, etc. Subclasses may override this routine to
1178 /// provide different behavior.
1179 OwningExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
1180 SourceLocation OpLoc,
1181 ExprArg Callee,
1182 ExprArg First,
1183 ExprArg Second);
Mike Stump11289f42009-09-09 15:08:12 +00001184
1185 /// \brief Build a new C++ "named" cast expression, such as static_cast or
Douglas Gregora16548e2009-08-11 05:31:07 +00001186 /// reinterpret_cast.
1187 ///
1188 /// By default, this routine dispatches to one of the more-specific routines
Mike Stump11289f42009-09-09 15:08:12 +00001189 /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
Douglas Gregora16548e2009-08-11 05:31:07 +00001190 /// Subclasses may override this routine to provide different behavior.
1191 OwningExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
1192 Stmt::StmtClass Class,
1193 SourceLocation LAngleLoc,
1194 QualType T,
1195 SourceLocation RAngleLoc,
1196 SourceLocation LParenLoc,
1197 ExprArg SubExpr,
1198 SourceLocation RParenLoc) {
1199 switch (Class) {
1200 case Stmt::CXXStaticCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001201 return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, T,
1202 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001203 move(SubExpr), RParenLoc);
1204
1205 case Stmt::CXXDynamicCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001206 return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, T,
1207 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001208 move(SubExpr), RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001209
Douglas Gregora16548e2009-08-11 05:31:07 +00001210 case Stmt::CXXReinterpretCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001211 return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, T,
1212 RAngleLoc, LParenLoc,
1213 move(SubExpr),
Douglas Gregora16548e2009-08-11 05:31:07 +00001214 RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001215
Douglas Gregora16548e2009-08-11 05:31:07 +00001216 case Stmt::CXXConstCastExprClass:
Mike Stump11289f42009-09-09 15:08:12 +00001217 return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, T,
1218 RAngleLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001219 move(SubExpr), RParenLoc);
Mike Stump11289f42009-09-09 15:08:12 +00001220
Douglas Gregora16548e2009-08-11 05:31:07 +00001221 default:
1222 assert(false && "Invalid C++ named cast");
1223 break;
1224 }
Mike Stump11289f42009-09-09 15:08:12 +00001225
Douglas Gregora16548e2009-08-11 05:31:07 +00001226 return getSema().ExprError();
1227 }
Mike Stump11289f42009-09-09 15:08:12 +00001228
Douglas Gregora16548e2009-08-11 05:31:07 +00001229 /// \brief Build a new C++ static_cast expression.
1230 ///
1231 /// By default, performs semantic analysis to build the new expression.
1232 /// Subclasses may override this routine to provide different behavior.
1233 OwningExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
1234 SourceLocation LAngleLoc,
1235 QualType T,
1236 SourceLocation RAngleLoc,
1237 SourceLocation LParenLoc,
1238 ExprArg SubExpr,
1239 SourceLocation RParenLoc) {
1240 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_static_cast,
Mike Stump11289f42009-09-09 15:08:12 +00001241 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001242 LParenLoc, move(SubExpr), RParenLoc);
1243 }
1244
1245 /// \brief Build a new C++ dynamic_cast expression.
1246 ///
1247 /// By default, performs semantic analysis to build the new expression.
1248 /// Subclasses may override this routine to provide different behavior.
1249 OwningExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
1250 SourceLocation LAngleLoc,
1251 QualType T,
1252 SourceLocation RAngleLoc,
1253 SourceLocation LParenLoc,
1254 ExprArg SubExpr,
1255 SourceLocation RParenLoc) {
1256 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
Mike Stump11289f42009-09-09 15:08:12 +00001257 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001258 LParenLoc, move(SubExpr), RParenLoc);
1259 }
1260
1261 /// \brief Build a new C++ reinterpret_cast expression.
1262 ///
1263 /// By default, performs semantic analysis to build the new expression.
1264 /// Subclasses may override this routine to provide different behavior.
1265 OwningExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
1266 SourceLocation LAngleLoc,
1267 QualType T,
1268 SourceLocation RAngleLoc,
1269 SourceLocation LParenLoc,
1270 ExprArg SubExpr,
1271 SourceLocation RParenLoc) {
1272 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
1273 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
1274 LParenLoc, move(SubExpr), RParenLoc);
1275 }
1276
1277 /// \brief Build a new C++ const_cast expression.
1278 ///
1279 /// By default, performs semantic analysis to build the new expression.
1280 /// Subclasses may override this routine to provide different behavior.
1281 OwningExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
1282 SourceLocation LAngleLoc,
1283 QualType T,
1284 SourceLocation RAngleLoc,
1285 SourceLocation LParenLoc,
1286 ExprArg SubExpr,
1287 SourceLocation RParenLoc) {
1288 return getSema().ActOnCXXNamedCast(OpLoc, tok::kw_const_cast,
Mike Stump11289f42009-09-09 15:08:12 +00001289 LAngleLoc, T.getAsOpaquePtr(), RAngleLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001290 LParenLoc, move(SubExpr), RParenLoc);
1291 }
Mike Stump11289f42009-09-09 15:08:12 +00001292
Douglas Gregora16548e2009-08-11 05:31:07 +00001293 /// \brief Build a new C++ functional-style cast expression.
1294 ///
1295 /// By default, performs semantic analysis to build the new expression.
1296 /// Subclasses may override this routine to provide different behavior.
1297 OwningExprResult RebuildCXXFunctionalCastExpr(SourceRange TypeRange,
1298 QualType T,
1299 SourceLocation LParenLoc,
1300 ExprArg SubExpr,
1301 SourceLocation RParenLoc) {
Chris Lattnerdca19592009-08-24 05:19:01 +00001302 void *Sub = SubExpr.takeAs<Expr>();
Douglas Gregora16548e2009-08-11 05:31:07 +00001303 return getSema().ActOnCXXTypeConstructExpr(TypeRange,
1304 T.getAsOpaquePtr(),
1305 LParenLoc,
Chris Lattnerdca19592009-08-24 05:19:01 +00001306 Sema::MultiExprArg(getSema(), &Sub, 1),
Mike Stump11289f42009-09-09 15:08:12 +00001307 /*CommaLocs=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001308 RParenLoc);
1309 }
Mike Stump11289f42009-09-09 15:08:12 +00001310
Douglas Gregora16548e2009-08-11 05:31:07 +00001311 /// \brief Build a new C++ typeid(type) expression.
1312 ///
1313 /// By default, performs semantic analysis to build the new expression.
1314 /// Subclasses may override this routine to provide different behavior.
1315 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1316 SourceLocation LParenLoc,
1317 QualType T,
1318 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001319 return getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, true,
Douglas Gregora16548e2009-08-11 05:31:07 +00001320 T.getAsOpaquePtr(), RParenLoc);
1321 }
Mike Stump11289f42009-09-09 15:08:12 +00001322
Douglas Gregora16548e2009-08-11 05:31:07 +00001323 /// \brief Build a new C++ typeid(expr) expression.
1324 ///
1325 /// By default, performs semantic analysis to build the new expression.
1326 /// Subclasses may override this routine to provide different behavior.
1327 OwningExprResult RebuildCXXTypeidExpr(SourceLocation TypeidLoc,
1328 SourceLocation LParenLoc,
1329 ExprArg Operand,
1330 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001331 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00001332 = getSema().ActOnCXXTypeid(TypeidLoc, LParenLoc, false, Operand.get(),
1333 RParenLoc);
1334 if (Result.isInvalid())
1335 return getSema().ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001336
Douglas Gregora16548e2009-08-11 05:31:07 +00001337 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1338 return move(Result);
Mike Stump11289f42009-09-09 15:08:12 +00001339 }
1340
Douglas Gregora16548e2009-08-11 05:31:07 +00001341 /// \brief Build a new C++ "this" expression.
1342 ///
1343 /// By default, builds a new "this" expression without performing any
Mike Stump11289f42009-09-09 15:08:12 +00001344 /// semantic analysis. Subclasses may override this routine to provide
Douglas Gregora16548e2009-08-11 05:31:07 +00001345 /// different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001346 OwningExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001347 QualType ThisType) {
1348 return getSema().Owned(
1349 new (getSema().Context) CXXThisExpr(ThisLoc, ThisType));
1350 }
1351
1352 /// \brief Build a new C++ throw expression.
1353 ///
1354 /// By default, performs semantic analysis to build the new expression.
1355 /// Subclasses may override this routine to provide different behavior.
1356 OwningExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, ExprArg Sub) {
1357 return getSema().ActOnCXXThrow(ThrowLoc, move(Sub));
1358 }
1359
1360 /// \brief Build a new C++ default-argument expression.
1361 ///
1362 /// By default, builds a new default-argument expression, which does not
1363 /// require any semantic analysis. Subclasses may override this routine to
1364 /// provide different behavior.
1365 OwningExprResult RebuildCXXDefaultArgExpr(ParmVarDecl *Param) {
Anders Carlssone8271232009-08-14 18:30:22 +00001366 return getSema().Owned(CXXDefaultArgExpr::Create(getSema().Context, Param));
Douglas Gregora16548e2009-08-11 05:31:07 +00001367 }
1368
1369 /// \brief Build a new C++ zero-initialization 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 RebuildCXXZeroInitValueExpr(SourceLocation TypeStartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001374 SourceLocation LParenLoc,
1375 QualType T,
1376 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001377 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeStartLoc),
1378 T.getAsOpaquePtr(), LParenLoc,
1379 MultiExprArg(getSema(), 0, 0),
Douglas Gregora16548e2009-08-11 05:31:07 +00001380 0, RParenLoc);
1381 }
Mike Stump11289f42009-09-09 15:08:12 +00001382
Douglas Gregora16548e2009-08-11 05:31:07 +00001383 /// \brief Build a new C++ conditional declaration expression.
1384 ///
1385 /// By default, performs semantic analysis to build the new expression.
1386 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001387 OwningExprResult RebuildCXXConditionDeclExpr(SourceLocation StartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001388 SourceLocation EqLoc,
1389 VarDecl *Var) {
1390 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(StartLoc,
1391 EqLoc,
1392 Var));
1393 }
Mike Stump11289f42009-09-09 15:08:12 +00001394
Douglas Gregora16548e2009-08-11 05:31:07 +00001395 /// \brief Build a new C++ "new" expression.
1396 ///
1397 /// By default, performs semantic analysis to build the new expression.
1398 /// Subclasses may override this routine to provide different behavior.
Mike Stump11289f42009-09-09 15:08:12 +00001399 OwningExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001400 bool UseGlobal,
1401 SourceLocation PlacementLParen,
1402 MultiExprArg PlacementArgs,
1403 SourceLocation PlacementRParen,
Mike Stump11289f42009-09-09 15:08:12 +00001404 bool ParenTypeId,
Douglas Gregora16548e2009-08-11 05:31:07 +00001405 QualType AllocType,
1406 SourceLocation TypeLoc,
1407 SourceRange TypeRange,
1408 ExprArg ArraySize,
1409 SourceLocation ConstructorLParen,
1410 MultiExprArg ConstructorArgs,
1411 SourceLocation ConstructorRParen) {
Mike Stump11289f42009-09-09 15:08:12 +00001412 return getSema().BuildCXXNew(StartLoc, UseGlobal,
Douglas Gregora16548e2009-08-11 05:31:07 +00001413 PlacementLParen,
1414 move(PlacementArgs),
1415 PlacementRParen,
1416 ParenTypeId,
1417 AllocType,
1418 TypeLoc,
1419 TypeRange,
1420 move(ArraySize),
1421 ConstructorLParen,
1422 move(ConstructorArgs),
1423 ConstructorRParen);
1424 }
Mike Stump11289f42009-09-09 15:08:12 +00001425
Douglas Gregora16548e2009-08-11 05:31:07 +00001426 /// \brief Build a new C++ "delete" expression.
1427 ///
1428 /// By default, performs semantic analysis to build the new expression.
1429 /// Subclasses may override this routine to provide different behavior.
1430 OwningExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
1431 bool IsGlobalDelete,
1432 bool IsArrayForm,
1433 ExprArg Operand) {
1434 return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
1435 move(Operand));
1436 }
Mike Stump11289f42009-09-09 15:08:12 +00001437
Douglas Gregora16548e2009-08-11 05:31:07 +00001438 /// \brief Build a new unary type trait 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 RebuildUnaryTypeTrait(UnaryTypeTrait Trait,
1443 SourceLocation StartLoc,
1444 SourceLocation LParenLoc,
1445 QualType T,
1446 SourceLocation RParenLoc) {
Mike Stump11289f42009-09-09 15:08:12 +00001447 return getSema().ActOnUnaryTypeTrait(Trait, StartLoc, LParenLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001448 T.getAsOpaquePtr(), RParenLoc);
1449 }
1450
Mike Stump11289f42009-09-09 15:08:12 +00001451 /// \brief Build a new (previously unresolved) declaration reference
Douglas Gregora16548e2009-08-11 05:31:07 +00001452 /// expression.
1453 ///
1454 /// By default, performs semantic analysis to build the new expression.
1455 /// Subclasses may override this routine to provide different behavior.
1456 OwningExprResult RebuildUnresolvedDeclRefExpr(NestedNameSpecifier *NNS,
1457 SourceRange QualifierRange,
1458 DeclarationName Name,
1459 SourceLocation Location,
1460 bool IsAddressOfOperand) {
1461 CXXScopeSpec SS;
1462 SS.setRange(QualifierRange);
1463 SS.setScopeRep(NNS);
Mike Stump11289f42009-09-09 15:08:12 +00001464 return getSema().ActOnDeclarationNameExpr(/*Scope=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001465 Location,
1466 Name,
1467 /*Trailing lparen=*/false,
1468 &SS,
1469 IsAddressOfOperand);
1470 }
1471
1472 /// \brief Build a new template-id expression.
1473 ///
1474 /// By default, performs semantic analysis to build the new expression.
1475 /// Subclasses may override this routine to provide different behavior.
Douglas Gregord019ff62009-10-22 17:20:55 +00001476 OwningExprResult RebuildTemplateIdExpr(NestedNameSpecifier *Qualifier,
1477 SourceRange QualifierRange,
1478 TemplateName Template,
Douglas Gregora16548e2009-08-11 05:31:07 +00001479 SourceLocation TemplateLoc,
1480 SourceLocation LAngleLoc,
John McCall0ad16662009-10-29 08:12:44 +00001481 TemplateArgumentLoc *TemplateArgs,
Douglas Gregora16548e2009-08-11 05:31:07 +00001482 unsigned NumTemplateArgs,
1483 SourceLocation RAngleLoc) {
Douglas Gregord019ff62009-10-22 17:20:55 +00001484 return getSema().BuildTemplateIdExpr(Qualifier, QualifierRange,
1485 Template, TemplateLoc,
Douglas Gregora16548e2009-08-11 05:31:07 +00001486 LAngleLoc,
1487 TemplateArgs, NumTemplateArgs,
1488 RAngleLoc);
1489 }
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 RebuildCXXConstructExpr(QualType T,
1496 CXXConstructorDecl *Constructor,
1497 bool IsElidable,
1498 MultiExprArg Args) {
Anders Carlsson1b4ebfa2009-09-05 07:40:38 +00001499 return getSema().BuildCXXConstructExpr(/*FIXME:ConstructLoc*/
1500 SourceLocation(),
1501 T, Constructor, IsElidable,
Anders Carlsson5995a3e2009-09-07 22:23:31 +00001502 move(Args));
Douglas Gregora16548e2009-08-11 05:31:07 +00001503 }
1504
1505 /// \brief Build a new object-construction expression.
1506 ///
1507 /// By default, performs semantic analysis to build the new expression.
1508 /// Subclasses may override this routine to provide different behavior.
1509 OwningExprResult RebuildCXXTemporaryObjectExpr(SourceLocation TypeBeginLoc,
1510 QualType T,
1511 SourceLocation LParenLoc,
1512 MultiExprArg Args,
1513 SourceLocation *Commas,
1514 SourceLocation RParenLoc) {
1515 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc),
1516 T.getAsOpaquePtr(),
1517 LParenLoc,
1518 move(Args),
1519 Commas,
1520 RParenLoc);
1521 }
1522
1523 /// \brief Build a new object-construction expression.
1524 ///
1525 /// By default, performs semantic analysis to build the new expression.
1526 /// Subclasses may override this routine to provide different behavior.
1527 OwningExprResult RebuildCXXUnresolvedConstructExpr(SourceLocation TypeBeginLoc,
1528 QualType T,
1529 SourceLocation LParenLoc,
1530 MultiExprArg Args,
1531 SourceLocation *Commas,
1532 SourceLocation RParenLoc) {
1533 return getSema().ActOnCXXTypeConstructExpr(SourceRange(TypeBeginLoc,
1534 /*FIXME*/LParenLoc),
1535 T.getAsOpaquePtr(),
1536 LParenLoc,
1537 move(Args),
1538 Commas,
1539 RParenLoc);
1540 }
Mike Stump11289f42009-09-09 15:08:12 +00001541
Douglas Gregora16548e2009-08-11 05:31:07 +00001542 /// \brief Build a new member reference expression.
1543 ///
1544 /// By default, performs semantic analysis to build the new expression.
1545 /// Subclasses may override this routine to provide different behavior.
Douglas Gregor2168a9f2009-08-11 15:56:57 +00001546 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
Douglas Gregora16548e2009-08-11 05:31:07 +00001547 bool IsArrow,
1548 SourceLocation OperatorLoc,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001549 NestedNameSpecifier *Qualifier,
1550 SourceRange QualifierRange,
Douglas Gregora16548e2009-08-11 05:31:07 +00001551 DeclarationName Name,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001552 SourceLocation MemberLoc,
1553 NamedDecl *FirstQualifierInScope) {
Douglas Gregor2168a9f2009-08-11 15:56:57 +00001554 OwningExprResult Base = move(BaseE);
Douglas Gregora16548e2009-08-11 05:31:07 +00001555 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001556
Douglas Gregora16548e2009-08-11 05:31:07 +00001557 CXXScopeSpec SS;
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001558 SS.setRange(QualifierRange);
1559 SS.setScopeRep(Qualifier);
Mike Stump11289f42009-09-09 15:08:12 +00001560
Douglas Gregor308047d2009-09-09 00:23:06 +00001561 return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0,
Douglas Gregora16548e2009-08-11 05:31:07 +00001562 move(Base), OperatorLoc, OpKind,
Douglas Gregorf14b46f2009-08-31 20:00:26 +00001563 MemberLoc,
1564 Name,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001565 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001566 &SS,
1567 FirstQualifierInScope);
Douglas Gregora16548e2009-08-11 05:31:07 +00001568 }
1569
Douglas Gregor308047d2009-09-09 00:23:06 +00001570 /// \brief Build a new member reference expression with explicit template
1571 /// arguments.
1572 ///
1573 /// By default, performs semantic analysis to build the new expression.
1574 /// Subclasses may override this routine to provide different behavior.
1575 OwningExprResult RebuildCXXUnresolvedMemberExpr(ExprArg BaseE,
1576 bool IsArrow,
1577 SourceLocation OperatorLoc,
1578 NestedNameSpecifier *Qualifier,
1579 SourceRange QualifierRange,
1580 TemplateName Template,
1581 SourceLocation TemplateNameLoc,
1582 NamedDecl *FirstQualifierInScope,
1583 SourceLocation LAngleLoc,
John McCall0ad16662009-10-29 08:12:44 +00001584 const TemplateArgumentLoc *TemplateArgs,
Douglas Gregor308047d2009-09-09 00:23:06 +00001585 unsigned NumTemplateArgs,
1586 SourceLocation RAngleLoc) {
1587 OwningExprResult Base = move(BaseE);
1588 tok::TokenKind OpKind = IsArrow? tok::arrow : tok::period;
Mike Stump11289f42009-09-09 15:08:12 +00001589
Douglas Gregor308047d2009-09-09 00:23:06 +00001590 CXXScopeSpec SS;
1591 SS.setRange(QualifierRange);
1592 SS.setScopeRep(Qualifier);
Mike Stump11289f42009-09-09 15:08:12 +00001593
Douglas Gregor308047d2009-09-09 00:23:06 +00001594 // FIXME: We're going to end up looking up the template based on its name,
Douglas Gregor30d60cb2009-11-03 19:44:04 +00001595 // twice! Also, duplicates part of Sema::BuildMemberAccessExpr.
Douglas Gregor308047d2009-09-09 00:23:06 +00001596 DeclarationName Name;
1597 if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl())
1598 Name = ActualTemplate->getDeclName();
Mike Stump11289f42009-09-09 15:08:12 +00001599 else if (OverloadedFunctionDecl *Ovl
Douglas Gregor308047d2009-09-09 00:23:06 +00001600 = Template.getAsOverloadedFunctionDecl())
1601 Name = Ovl->getDeclName();
Douglas Gregor71395fa2009-11-04 00:56:37 +00001602 else {
1603 DependentTemplateName *DTN = Template.getAsDependentTemplateName();
1604 if (DTN->isIdentifier())
1605 Name = DTN->getIdentifier();
1606 else
1607 Name = SemaRef.Context.DeclarationNames.getCXXOperatorName(
1608 DTN->getOperator());
1609 }
Mike Stump11289f42009-09-09 15:08:12 +00001610 return SemaRef.BuildMemberReferenceExpr(/*Scope=*/0, move(Base),
Douglas Gregor308047d2009-09-09 00:23:06 +00001611 OperatorLoc, OpKind,
1612 TemplateNameLoc, Name, true,
1613 LAngleLoc, TemplateArgs,
1614 NumTemplateArgs, RAngleLoc,
1615 Sema::DeclPtrTy(), &SS);
1616 }
Mike Stump11289f42009-09-09 15:08:12 +00001617
Douglas Gregora16548e2009-08-11 05:31:07 +00001618 /// \brief Build a new Objective-C @encode expression.
1619 ///
1620 /// By default, performs semantic analysis to build the new expression.
1621 /// Subclasses may override this routine to provide different behavior.
1622 OwningExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
1623 QualType T,
1624 SourceLocation RParenLoc) {
1625 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(AtLoc, T,
1626 RParenLoc));
Mike Stump11289f42009-09-09 15:08:12 +00001627 }
Douglas Gregora16548e2009-08-11 05:31:07 +00001628
1629 /// \brief Build a new Objective-C protocol expression.
1630 ///
1631 /// By default, performs semantic analysis to build the new expression.
1632 /// Subclasses may override this routine to provide different behavior.
1633 OwningExprResult RebuildObjCProtocolExpr(ObjCProtocolDecl *Protocol,
1634 SourceLocation AtLoc,
1635 SourceLocation ProtoLoc,
1636 SourceLocation LParenLoc,
1637 SourceLocation RParenLoc) {
1638 return SemaRef.Owned(SemaRef.ParseObjCProtocolExpression(
1639 Protocol->getIdentifier(),
1640 AtLoc,
1641 ProtoLoc,
1642 LParenLoc,
Mike Stump11289f42009-09-09 15:08:12 +00001643 RParenLoc));
Douglas Gregora16548e2009-08-11 05:31:07 +00001644 }
Mike Stump11289f42009-09-09 15:08:12 +00001645
Douglas Gregora16548e2009-08-11 05:31:07 +00001646 /// \brief Build a new shuffle vector expression.
1647 ///
1648 /// By default, performs semantic analysis to build the new expression.
1649 /// Subclasses may override this routine to provide different behavior.
1650 OwningExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
1651 MultiExprArg SubExprs,
1652 SourceLocation RParenLoc) {
1653 // Find the declaration for __builtin_shufflevector
Mike Stump11289f42009-09-09 15:08:12 +00001654 const IdentifierInfo &Name
Douglas Gregora16548e2009-08-11 05:31:07 +00001655 = SemaRef.Context.Idents.get("__builtin_shufflevector");
1656 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
1657 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
1658 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
Mike Stump11289f42009-09-09 15:08:12 +00001659
Douglas Gregora16548e2009-08-11 05:31:07 +00001660 // Build a reference to the __builtin_shufflevector builtin
1661 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
Mike Stump11289f42009-09-09 15:08:12 +00001662 Expr *Callee
Douglas Gregora16548e2009-08-11 05:31:07 +00001663 = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
1664 BuiltinLoc, false, false);
1665 SemaRef.UsualUnaryConversions(Callee);
Mike Stump11289f42009-09-09 15:08:12 +00001666
1667 // Build the CallExpr
Douglas Gregora16548e2009-08-11 05:31:07 +00001668 unsigned NumSubExprs = SubExprs.size();
1669 Expr **Subs = (Expr **)SubExprs.release();
1670 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
1671 Subs, NumSubExprs,
1672 Builtin->getResultType(),
1673 RParenLoc);
1674 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
Mike Stump11289f42009-09-09 15:08:12 +00001675
Douglas Gregora16548e2009-08-11 05:31:07 +00001676 // Type-check the __builtin_shufflevector expression.
1677 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
1678 if (Result.isInvalid())
1679 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00001680
Douglas Gregora16548e2009-08-11 05:31:07 +00001681 OwnedCall.release();
Mike Stump11289f42009-09-09 15:08:12 +00001682 return move(Result);
Douglas Gregora16548e2009-08-11 05:31:07 +00001683 }
Douglas Gregord6ff3322009-08-04 16:50:30 +00001684};
Douglas Gregora16548e2009-08-11 05:31:07 +00001685
Douglas Gregorebe10102009-08-20 07:17:43 +00001686template<typename Derived>
1687Sema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
1688 if (!S)
1689 return SemaRef.Owned(S);
Mike Stump11289f42009-09-09 15:08:12 +00001690
Douglas Gregorebe10102009-08-20 07:17:43 +00001691 switch (S->getStmtClass()) {
1692 case Stmt::NoStmtClass: break;
Mike Stump11289f42009-09-09 15:08:12 +00001693
Douglas Gregorebe10102009-08-20 07:17:43 +00001694 // Transform individual statement nodes
1695#define STMT(Node, Parent) \
1696 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
1697#define EXPR(Node, Parent)
1698#include "clang/AST/StmtNodes.def"
Mike Stump11289f42009-09-09 15:08:12 +00001699
Douglas Gregorebe10102009-08-20 07:17:43 +00001700 // Transform expressions by calling TransformExpr.
1701#define STMT(Node, Parent)
1702#define EXPR(Node, Parent) case Stmt::Node##Class:
1703#include "clang/AST/StmtNodes.def"
1704 {
1705 Sema::OwningExprResult E = getDerived().TransformExpr(cast<Expr>(S));
1706 if (E.isInvalid())
1707 return getSema().StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00001708
Douglas Gregorebe10102009-08-20 07:17:43 +00001709 return getSema().Owned(E.takeAs<Stmt>());
1710 }
Mike Stump11289f42009-09-09 15:08:12 +00001711 }
1712
Douglas Gregorebe10102009-08-20 07:17:43 +00001713 return SemaRef.Owned(S->Retain());
1714}
Mike Stump11289f42009-09-09 15:08:12 +00001715
1716
Douglas Gregore922c772009-08-04 22:27:00 +00001717template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00001718Sema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E,
1719 bool isAddressOfOperand) {
1720 if (!E)
1721 return SemaRef.Owned(E);
1722
1723 switch (E->getStmtClass()) {
1724 case Stmt::NoStmtClass: break;
1725#define STMT(Node, Parent) case Stmt::Node##Class: break;
1726#define EXPR(Node, Parent) \
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00001727 case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E), \
1728 isAddressOfOperand);
Douglas Gregora16548e2009-08-11 05:31:07 +00001729#include "clang/AST/StmtNodes.def"
Mike Stump11289f42009-09-09 15:08:12 +00001730 }
1731
Douglas Gregora16548e2009-08-11 05:31:07 +00001732 return SemaRef.Owned(E->Retain());
Douglas Gregor766b0bb2009-08-06 22:17:10 +00001733}
1734
1735template<typename Derived>
Douglas Gregor1135c352009-08-06 05:28:30 +00001736NestedNameSpecifier *
1737TreeTransform<Derived>::TransformNestedNameSpecifier(NestedNameSpecifier *NNS,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001738 SourceRange Range,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001739 QualType ObjectType,
1740 NamedDecl *FirstQualifierInScope) {
Douglas Gregor96ee7892009-08-31 21:41:48 +00001741 if (!NNS)
1742 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001743
Douglas Gregorebe10102009-08-20 07:17:43 +00001744 // Transform the prefix of this nested name specifier.
Douglas Gregor1135c352009-08-06 05:28:30 +00001745 NestedNameSpecifier *Prefix = NNS->getPrefix();
1746 if (Prefix) {
Mike Stump11289f42009-09-09 15:08:12 +00001747 Prefix = getDerived().TransformNestedNameSpecifier(Prefix, Range,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001748 ObjectType,
1749 FirstQualifierInScope);
Douglas Gregor1135c352009-08-06 05:28:30 +00001750 if (!Prefix)
1751 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001752
1753 // Clear out the object type and the first qualifier in scope; they only
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001754 // apply to the first element in the nested-name-specifier.
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001755 ObjectType = QualType();
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001756 FirstQualifierInScope = 0;
Douglas Gregor1135c352009-08-06 05:28:30 +00001757 }
Mike Stump11289f42009-09-09 15:08:12 +00001758
Douglas Gregor1135c352009-08-06 05:28:30 +00001759 switch (NNS->getKind()) {
1760 case NestedNameSpecifier::Identifier:
Mike Stump11289f42009-09-09 15:08:12 +00001761 assert((Prefix || !ObjectType.isNull()) &&
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001762 "Identifier nested-name-specifier with no prefix or object type");
1763 if (!getDerived().AlwaysRebuild() && Prefix == NNS->getPrefix() &&
1764 ObjectType.isNull())
Douglas Gregor1135c352009-08-06 05:28:30 +00001765 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001766
1767 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00001768 *NNS->getAsIdentifier(),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00001769 ObjectType,
1770 FirstQualifierInScope);
Mike Stump11289f42009-09-09 15:08:12 +00001771
Douglas Gregor1135c352009-08-06 05:28:30 +00001772 case NestedNameSpecifier::Namespace: {
Mike Stump11289f42009-09-09 15:08:12 +00001773 NamespaceDecl *NS
Douglas Gregor1135c352009-08-06 05:28:30 +00001774 = cast_or_null<NamespaceDecl>(
1775 getDerived().TransformDecl(NNS->getAsNamespace()));
Mike Stump11289f42009-09-09 15:08:12 +00001776 if (!getDerived().AlwaysRebuild() &&
Douglas Gregor1135c352009-08-06 05:28:30 +00001777 Prefix == NNS->getPrefix() &&
1778 NS == NNS->getAsNamespace())
1779 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001780
Douglas Gregor1135c352009-08-06 05:28:30 +00001781 return getDerived().RebuildNestedNameSpecifier(Prefix, Range, NS);
1782 }
Mike Stump11289f42009-09-09 15:08:12 +00001783
Douglas Gregor1135c352009-08-06 05:28:30 +00001784 case NestedNameSpecifier::Global:
1785 // There is no meaningful transformation that one could perform on the
1786 // global scope.
1787 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001788
Douglas Gregor1135c352009-08-06 05:28:30 +00001789 case NestedNameSpecifier::TypeSpecWithTemplate:
1790 case NestedNameSpecifier::TypeSpec: {
Douglas Gregor07cc4ac2009-10-29 22:21:39 +00001791 TemporaryBase Rebase(*this, Range.getBegin(), DeclarationName());
Douglas Gregor1135c352009-08-06 05:28:30 +00001792 QualType T = getDerived().TransformType(QualType(NNS->getAsType(), 0));
Douglas Gregor71dc5092009-08-06 06:41:21 +00001793 if (T.isNull())
1794 return 0;
Mike Stump11289f42009-09-09 15:08:12 +00001795
Douglas Gregor1135c352009-08-06 05:28:30 +00001796 if (!getDerived().AlwaysRebuild() &&
1797 Prefix == NNS->getPrefix() &&
1798 T == QualType(NNS->getAsType(), 0))
1799 return NNS;
Mike Stump11289f42009-09-09 15:08:12 +00001800
1801 return getDerived().RebuildNestedNameSpecifier(Prefix, Range,
1802 NNS->getKind() == NestedNameSpecifier::TypeSpecWithTemplate,
Douglas Gregor1135c352009-08-06 05:28:30 +00001803 T);
1804 }
1805 }
Mike Stump11289f42009-09-09 15:08:12 +00001806
Douglas Gregor1135c352009-08-06 05:28:30 +00001807 // Required to silence a GCC warning
Mike Stump11289f42009-09-09 15:08:12 +00001808 return 0;
Douglas Gregor1135c352009-08-06 05:28:30 +00001809}
1810
1811template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001812DeclarationName
Douglas Gregorf816bd72009-09-03 22:13:48 +00001813TreeTransform<Derived>::TransformDeclarationName(DeclarationName Name,
Douglas Gregorc59e5612009-10-19 22:04:39 +00001814 SourceLocation Loc,
1815 QualType ObjectType) {
Douglas Gregorf816bd72009-09-03 22:13:48 +00001816 if (!Name)
1817 return Name;
1818
1819 switch (Name.getNameKind()) {
1820 case DeclarationName::Identifier:
1821 case DeclarationName::ObjCZeroArgSelector:
1822 case DeclarationName::ObjCOneArgSelector:
1823 case DeclarationName::ObjCMultiArgSelector:
1824 case DeclarationName::CXXOperatorName:
1825 case DeclarationName::CXXUsingDirective:
1826 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001827
Douglas Gregorf816bd72009-09-03 22:13:48 +00001828 case DeclarationName::CXXConstructorName:
1829 case DeclarationName::CXXDestructorName:
1830 case DeclarationName::CXXConversionFunctionName: {
1831 TemporaryBase Rebase(*this, Loc, Name);
Douglas Gregorc59e5612009-10-19 22:04:39 +00001832 QualType T;
1833 if (!ObjectType.isNull() &&
1834 isa<TemplateSpecializationType>(Name.getCXXNameType())) {
1835 TemplateSpecializationType *SpecType
1836 = cast<TemplateSpecializationType>(Name.getCXXNameType());
1837 T = TransformTemplateSpecializationType(SpecType, ObjectType);
1838 } else
1839 T = getDerived().TransformType(Name.getCXXNameType());
Douglas Gregorf816bd72009-09-03 22:13:48 +00001840 if (T.isNull())
1841 return DeclarationName();
Mike Stump11289f42009-09-09 15:08:12 +00001842
Douglas Gregorf816bd72009-09-03 22:13:48 +00001843 return SemaRef.Context.DeclarationNames.getCXXSpecialName(
Mike Stump11289f42009-09-09 15:08:12 +00001844 Name.getNameKind(),
Douglas Gregorf816bd72009-09-03 22:13:48 +00001845 SemaRef.Context.getCanonicalType(T));
Douglas Gregorf816bd72009-09-03 22:13:48 +00001846 }
Mike Stump11289f42009-09-09 15:08:12 +00001847 }
1848
Douglas Gregorf816bd72009-09-03 22:13:48 +00001849 return DeclarationName();
1850}
1851
1852template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00001853TemplateName
Douglas Gregor308047d2009-09-09 00:23:06 +00001854TreeTransform<Derived>::TransformTemplateName(TemplateName Name,
1855 QualType ObjectType) {
Douglas Gregor71dc5092009-08-06 06:41:21 +00001856 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
Mike Stump11289f42009-09-09 15:08:12 +00001857 NestedNameSpecifier *NNS
Douglas Gregor71dc5092009-08-06 06:41:21 +00001858 = getDerived().TransformNestedNameSpecifier(QTN->getQualifier(),
1859 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
1860 if (!NNS)
1861 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001862
Douglas Gregor71dc5092009-08-06 06:41:21 +00001863 if (TemplateDecl *Template = QTN->getTemplateDecl()) {
Mike Stump11289f42009-09-09 15:08:12 +00001864 TemplateDecl *TransTemplate
Douglas Gregor71dc5092009-08-06 06:41:21 +00001865 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1866 if (!TransTemplate)
1867 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001868
Douglas Gregor71dc5092009-08-06 06:41:21 +00001869 if (!getDerived().AlwaysRebuild() &&
1870 NNS == QTN->getQualifier() &&
1871 TransTemplate == Template)
1872 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001873
Douglas Gregor71dc5092009-08-06 06:41:21 +00001874 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1875 TransTemplate);
1876 }
Mike Stump11289f42009-09-09 15:08:12 +00001877
Douglas Gregor71dc5092009-08-06 06:41:21 +00001878 OverloadedFunctionDecl *Ovl = QTN->getOverloadedFunctionDecl();
1879 assert(Ovl && "Not a template name or an overload set?");
Mike Stump11289f42009-09-09 15:08:12 +00001880 OverloadedFunctionDecl *TransOvl
Douglas Gregor71dc5092009-08-06 06:41:21 +00001881 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1882 if (!TransOvl)
1883 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001884
Douglas Gregor71dc5092009-08-06 06:41:21 +00001885 if (!getDerived().AlwaysRebuild() &&
1886 NNS == QTN->getQualifier() &&
1887 TransOvl == Ovl)
1888 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001889
Douglas Gregor71dc5092009-08-06 06:41:21 +00001890 return getDerived().RebuildTemplateName(NNS, QTN->hasTemplateKeyword(),
1891 TransOvl);
1892 }
Mike Stump11289f42009-09-09 15:08:12 +00001893
Douglas Gregor71dc5092009-08-06 06:41:21 +00001894 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
Mike Stump11289f42009-09-09 15:08:12 +00001895 NestedNameSpecifier *NNS
Douglas Gregor71dc5092009-08-06 06:41:21 +00001896 = getDerived().TransformNestedNameSpecifier(DTN->getQualifier(),
1897 /*FIXME:*/SourceRange(getDerived().getBaseLocation()));
Douglas Gregor308047d2009-09-09 00:23:06 +00001898 if (!NNS && DTN->getQualifier())
Douglas Gregor71dc5092009-08-06 06:41:21 +00001899 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001900
Douglas Gregor71dc5092009-08-06 06:41:21 +00001901 if (!getDerived().AlwaysRebuild() &&
Douglas Gregorc59e5612009-10-19 22:04:39 +00001902 NNS == DTN->getQualifier() &&
1903 ObjectType.isNull())
Douglas Gregor71dc5092009-08-06 06:41:21 +00001904 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001905
Douglas Gregor71395fa2009-11-04 00:56:37 +00001906 if (DTN->isIdentifier())
1907 return getDerived().RebuildTemplateName(NNS, *DTN->getIdentifier(),
1908 ObjectType);
1909
1910 return getDerived().RebuildTemplateName(NNS, DTN->getOperator(),
1911 ObjectType);
Douglas Gregor71dc5092009-08-06 06:41:21 +00001912 }
Mike Stump11289f42009-09-09 15:08:12 +00001913
Douglas Gregor71dc5092009-08-06 06:41:21 +00001914 if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
Mike Stump11289f42009-09-09 15:08:12 +00001915 TemplateDecl *TransTemplate
Douglas Gregor71dc5092009-08-06 06:41:21 +00001916 = cast_or_null<TemplateDecl>(getDerived().TransformDecl(Template));
1917 if (!TransTemplate)
1918 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001919
Douglas Gregor71dc5092009-08-06 06:41:21 +00001920 if (!getDerived().AlwaysRebuild() &&
1921 TransTemplate == Template)
1922 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001923
Douglas Gregor71dc5092009-08-06 06:41:21 +00001924 return TemplateName(TransTemplate);
1925 }
Mike Stump11289f42009-09-09 15:08:12 +00001926
Douglas Gregor71dc5092009-08-06 06:41:21 +00001927 OverloadedFunctionDecl *Ovl = Name.getAsOverloadedFunctionDecl();
1928 assert(Ovl && "Not a template name or an overload set?");
Mike Stump11289f42009-09-09 15:08:12 +00001929 OverloadedFunctionDecl *TransOvl
Douglas Gregor71dc5092009-08-06 06:41:21 +00001930 = cast_or_null<OverloadedFunctionDecl>(getDerived().TransformDecl(Ovl));
1931 if (!TransOvl)
1932 return TemplateName();
Mike Stump11289f42009-09-09 15:08:12 +00001933
Douglas Gregor71dc5092009-08-06 06:41:21 +00001934 if (!getDerived().AlwaysRebuild() &&
1935 TransOvl == Ovl)
1936 return Name;
Mike Stump11289f42009-09-09 15:08:12 +00001937
Douglas Gregor71dc5092009-08-06 06:41:21 +00001938 return TemplateName(TransOvl);
1939}
1940
1941template<typename Derived>
John McCall0ad16662009-10-29 08:12:44 +00001942void TreeTransform<Derived>::InventTemplateArgumentLoc(
1943 const TemplateArgument &Arg,
1944 TemplateArgumentLoc &Output) {
1945 SourceLocation Loc = getDerived().getBaseLocation();
1946 switch (Arg.getKind()) {
1947 case TemplateArgument::Null:
1948 llvm::llvm_unreachable("null template argument in TreeTransform");
1949 break;
1950
1951 case TemplateArgument::Type:
1952 Output = TemplateArgumentLoc(Arg,
1953 SemaRef.Context.getTrivialDeclaratorInfo(Arg.getAsType(), Loc));
1954
1955 break;
1956
1957 case TemplateArgument::Expression:
1958 Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
1959 break;
1960
1961 case TemplateArgument::Declaration:
1962 case TemplateArgument::Integral:
1963 case TemplateArgument::Pack:
John McCall0d07eb32009-10-29 18:45:58 +00001964 Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
John McCall0ad16662009-10-29 08:12:44 +00001965 break;
1966 }
1967}
1968
1969template<typename Derived>
1970bool TreeTransform<Derived>::TransformTemplateArgument(
1971 const TemplateArgumentLoc &Input,
1972 TemplateArgumentLoc &Output) {
1973 const TemplateArgument &Arg = Input.getArgument();
Douglas Gregore922c772009-08-04 22:27:00 +00001974 switch (Arg.getKind()) {
1975 case TemplateArgument::Null:
1976 case TemplateArgument::Integral:
John McCall0ad16662009-10-29 08:12:44 +00001977 Output = Input;
1978 return false;
Mike Stump11289f42009-09-09 15:08:12 +00001979
Douglas Gregore922c772009-08-04 22:27:00 +00001980 case TemplateArgument::Type: {
John McCall0ad16662009-10-29 08:12:44 +00001981 DeclaratorInfo *DI = Input.getSourceDeclaratorInfo();
1982 if (DI == NULL)
1983 DI = InventDeclaratorInfo(Input.getArgument().getAsType());
1984
1985 DI = getDerived().TransformType(DI);
1986 if (!DI) return true;
1987
1988 Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
1989 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00001990 }
Mike Stump11289f42009-09-09 15:08:12 +00001991
Douglas Gregore922c772009-08-04 22:27:00 +00001992 case TemplateArgument::Declaration: {
John McCall0ad16662009-10-29 08:12:44 +00001993 // FIXME: we should never have to transform one of these.
Douglas Gregoref6ab412009-10-27 06:26:26 +00001994 DeclarationName Name;
1995 if (NamedDecl *ND = dyn_cast<NamedDecl>(Arg.getAsDecl()))
1996 Name = ND->getDeclName();
John McCall0ad16662009-10-29 08:12:44 +00001997 TemporaryBase Rebase(*this, SourceLocation(), Name);
Douglas Gregore922c772009-08-04 22:27:00 +00001998 Decl *D = getDerived().TransformDecl(Arg.getAsDecl());
John McCall0ad16662009-10-29 08:12:44 +00001999 if (!D) return true;
2000
John McCall0d07eb32009-10-29 18:45:58 +00002001 Expr *SourceExpr = Input.getSourceDeclExpression();
2002 if (SourceExpr) {
2003 EnterExpressionEvaluationContext Unevaluated(getSema(),
2004 Action::Unevaluated);
2005 Sema::OwningExprResult E = getDerived().TransformExpr(SourceExpr);
2006 if (E.isInvalid())
2007 SourceExpr = NULL;
2008 else {
2009 SourceExpr = E.takeAs<Expr>();
2010 SourceExpr->Retain();
2011 }
2012 }
2013
2014 Output = TemplateArgumentLoc(TemplateArgument(D), SourceExpr);
John McCall0ad16662009-10-29 08:12:44 +00002015 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00002016 }
Mike Stump11289f42009-09-09 15:08:12 +00002017
Douglas Gregore922c772009-08-04 22:27:00 +00002018 case TemplateArgument::Expression: {
2019 // Template argument expressions are not potentially evaluated.
Mike Stump11289f42009-09-09 15:08:12 +00002020 EnterExpressionEvaluationContext Unevaluated(getSema(),
Douglas Gregore922c772009-08-04 22:27:00 +00002021 Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002022
John McCall0ad16662009-10-29 08:12:44 +00002023 Expr *InputExpr = Input.getSourceExpression();
2024 if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
2025
2026 Sema::OwningExprResult E
2027 = getDerived().TransformExpr(InputExpr);
2028 if (E.isInvalid()) return true;
2029
2030 Expr *ETaken = E.takeAs<Expr>();
John McCall0d07eb32009-10-29 18:45:58 +00002031 ETaken->Retain();
John McCall0ad16662009-10-29 08:12:44 +00002032 Output = TemplateArgumentLoc(TemplateArgument(ETaken), ETaken);
2033 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00002034 }
Mike Stump11289f42009-09-09 15:08:12 +00002035
Douglas Gregore922c772009-08-04 22:27:00 +00002036 case TemplateArgument::Pack: {
2037 llvm::SmallVector<TemplateArgument, 4> TransformedArgs;
2038 TransformedArgs.reserve(Arg.pack_size());
Mike Stump11289f42009-09-09 15:08:12 +00002039 for (TemplateArgument::pack_iterator A = Arg.pack_begin(),
Douglas Gregore922c772009-08-04 22:27:00 +00002040 AEnd = Arg.pack_end();
2041 A != AEnd; ++A) {
Mike Stump11289f42009-09-09 15:08:12 +00002042
John McCall0ad16662009-10-29 08:12:44 +00002043 // FIXME: preserve source information here when we start
2044 // caring about parameter packs.
2045
John McCall0d07eb32009-10-29 18:45:58 +00002046 TemplateArgumentLoc InputArg;
2047 TemplateArgumentLoc OutputArg;
2048 getDerived().InventTemplateArgumentLoc(*A, InputArg);
2049 if (getDerived().TransformTemplateArgument(InputArg, OutputArg))
John McCall0ad16662009-10-29 08:12:44 +00002050 return true;
2051
John McCall0d07eb32009-10-29 18:45:58 +00002052 TransformedArgs.push_back(OutputArg.getArgument());
Douglas Gregore922c772009-08-04 22:27:00 +00002053 }
2054 TemplateArgument Result;
Mike Stump11289f42009-09-09 15:08:12 +00002055 Result.setArgumentPack(TransformedArgs.data(), TransformedArgs.size(),
Douglas Gregore922c772009-08-04 22:27:00 +00002056 true);
John McCall0d07eb32009-10-29 18:45:58 +00002057 Output = TemplateArgumentLoc(Result, Input.getLocInfo());
John McCall0ad16662009-10-29 08:12:44 +00002058 return false;
Douglas Gregore922c772009-08-04 22:27:00 +00002059 }
2060 }
Mike Stump11289f42009-09-09 15:08:12 +00002061
Douglas Gregore922c772009-08-04 22:27:00 +00002062 // Work around bogus GCC warning
John McCall0ad16662009-10-29 08:12:44 +00002063 return true;
Douglas Gregore922c772009-08-04 22:27:00 +00002064}
2065
Douglas Gregord6ff3322009-08-04 16:50:30 +00002066//===----------------------------------------------------------------------===//
2067// Type transformation
2068//===----------------------------------------------------------------------===//
2069
2070template<typename Derived>
2071QualType TreeTransform<Derived>::TransformType(QualType T) {
2072 if (getDerived().AlreadyTransformed(T))
2073 return T;
Mike Stump11289f42009-09-09 15:08:12 +00002074
John McCall550e0c22009-10-21 00:40:46 +00002075 // Temporary workaround. All of these transformations should
2076 // eventually turn into transformations on TypeLocs.
2077 DeclaratorInfo *DI = getSema().Context.CreateDeclaratorInfo(T);
John McCallde889892009-10-21 00:44:26 +00002078 DI->getTypeLoc().initialize(getDerived().getBaseLocation());
John McCall550e0c22009-10-21 00:40:46 +00002079
2080 DeclaratorInfo *NewDI = getDerived().TransformType(DI);
John McCall8ccfcb52009-09-24 19:53:00 +00002081
John McCall550e0c22009-10-21 00:40:46 +00002082 if (!NewDI)
2083 return QualType();
2084
2085 return NewDI->getType();
2086}
2087
2088template<typename Derived>
2089DeclaratorInfo *TreeTransform<Derived>::TransformType(DeclaratorInfo *DI) {
2090 if (getDerived().AlreadyTransformed(DI->getType()))
2091 return DI;
2092
2093 TypeLocBuilder TLB;
2094
2095 TypeLoc TL = DI->getTypeLoc();
2096 TLB.reserve(TL.getFullDataSize());
2097
2098 QualType Result = getDerived().TransformType(TLB, TL);
2099 if (Result.isNull())
2100 return 0;
2101
2102 return TLB.getDeclaratorInfo(SemaRef.Context, Result);
2103}
2104
2105template<typename Derived>
2106QualType
2107TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
2108 switch (T.getTypeLocClass()) {
2109#define ABSTRACT_TYPELOC(CLASS, PARENT)
2110#define TYPELOC(CLASS, PARENT) \
2111 case TypeLoc::CLASS: \
2112 return getDerived().Transform##CLASS##Type(TLB, cast<CLASS##TypeLoc>(T));
2113#include "clang/AST/TypeLocNodes.def"
Douglas Gregord6ff3322009-08-04 16:50:30 +00002114 }
Mike Stump11289f42009-09-09 15:08:12 +00002115
John McCall550e0c22009-10-21 00:40:46 +00002116 llvm::llvm_unreachable("unhandled type loc!");
2117 return QualType();
2118}
2119
2120/// FIXME: By default, this routine adds type qualifiers only to types
2121/// that can have qualifiers, and silently suppresses those qualifiers
2122/// that are not permitted (e.g., qualifiers on reference or function
2123/// types). This is the right thing for template instantiation, but
2124/// probably not for other clients.
2125template<typename Derived>
2126QualType
2127TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
2128 QualifiedTypeLoc T) {
2129 Qualifiers Quals = T.getType().getQualifiers();
2130
2131 QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
2132 if (Result.isNull())
2133 return QualType();
2134
2135 // Silently suppress qualifiers if the result type can't be qualified.
2136 // FIXME: this is the right thing for template instantiation, but
2137 // probably not for other clients.
2138 if (Result->isFunctionType() || Result->isReferenceType())
Douglas Gregord6ff3322009-08-04 16:50:30 +00002139 return Result;
Mike Stump11289f42009-09-09 15:08:12 +00002140
John McCall550e0c22009-10-21 00:40:46 +00002141 Result = SemaRef.Context.getQualifiedType(Result, Quals);
2142
2143 TLB.push<QualifiedTypeLoc>(Result);
2144
2145 // No location information to preserve.
2146
2147 return Result;
2148}
2149
2150template <class TyLoc> static inline
2151QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
2152 TyLoc NewT = TLB.push<TyLoc>(T.getType());
2153 NewT.setNameLoc(T.getNameLoc());
2154 return T.getType();
2155}
2156
2157// Ugly metaprogramming macros because I couldn't be bothered to make
2158// the equivalent template version work.
2159#define TransformPointerLikeType(TypeClass) do { \
2160 QualType PointeeType \
2161 = getDerived().TransformType(TLB, TL.getPointeeLoc()); \
2162 if (PointeeType.isNull()) \
2163 return QualType(); \
2164 \
2165 QualType Result = TL.getType(); \
2166 if (getDerived().AlwaysRebuild() || \
2167 PointeeType != TL.getPointeeLoc().getType()) { \
John McCall70dd5f62009-10-30 00:06:24 +00002168 Result = getDerived().Rebuild##TypeClass(PointeeType, \
2169 TL.getSigilLoc()); \
John McCall550e0c22009-10-21 00:40:46 +00002170 if (Result.isNull()) \
2171 return QualType(); \
2172 } \
2173 \
2174 TypeClass##Loc NewT = TLB.push<TypeClass##Loc>(Result); \
2175 NewT.setSigilLoc(TL.getSigilLoc()); \
2176 \
2177 return Result; \
2178} while(0)
2179
John McCall550e0c22009-10-21 00:40:46 +00002180template<typename Derived>
2181QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
2182 BuiltinTypeLoc T) {
2183 return TransformTypeSpecType(TLB, T);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002184}
Mike Stump11289f42009-09-09 15:08:12 +00002185
Douglas Gregord6ff3322009-08-04 16:50:30 +00002186template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002187QualType
John McCall550e0c22009-10-21 00:40:46 +00002188TreeTransform<Derived>::TransformFixedWidthIntType(TypeLocBuilder &TLB,
2189 FixedWidthIntTypeLoc T) {
2190 return TransformTypeSpecType(TLB, T);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002191}
Argyrios Kyrtzidise9189262009-08-19 01:28:17 +00002192
Douglas Gregord6ff3322009-08-04 16:50:30 +00002193template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002194QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
2195 ComplexTypeLoc T) {
2196 // FIXME: recurse?
2197 return TransformTypeSpecType(TLB, T);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002198}
Mike Stump11289f42009-09-09 15:08:12 +00002199
Douglas Gregord6ff3322009-08-04 16:50:30 +00002200template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002201QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
2202 PointerTypeLoc TL) {
2203 TransformPointerLikeType(PointerType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002204}
Mike Stump11289f42009-09-09 15:08:12 +00002205
2206template<typename Derived>
2207QualType
John McCall550e0c22009-10-21 00:40:46 +00002208TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
2209 BlockPointerTypeLoc TL) {
2210 TransformPointerLikeType(BlockPointerType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002211}
2212
John McCall70dd5f62009-10-30 00:06:24 +00002213/// Transforms a reference type. Note that somewhat paradoxically we
2214/// don't care whether the type itself is an l-value type or an r-value
2215/// type; we only care if the type was *written* as an l-value type
2216/// or an r-value type.
2217template<typename Derived>
2218QualType
2219TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
2220 ReferenceTypeLoc TL) {
2221 const ReferenceType *T = TL.getTypePtr();
2222
2223 // Note that this works with the pointee-as-written.
2224 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
2225 if (PointeeType.isNull())
2226 return QualType();
2227
2228 QualType Result = TL.getType();
2229 if (getDerived().AlwaysRebuild() ||
2230 PointeeType != T->getPointeeTypeAsWritten()) {
2231 Result = getDerived().RebuildReferenceType(PointeeType,
2232 T->isSpelledAsLValue(),
2233 TL.getSigilLoc());
2234 if (Result.isNull())
2235 return QualType();
2236 }
2237
2238 // r-value references can be rebuilt as l-value references.
2239 ReferenceTypeLoc NewTL;
2240 if (isa<LValueReferenceType>(Result))
2241 NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
2242 else
2243 NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
2244 NewTL.setSigilLoc(TL.getSigilLoc());
2245
2246 return Result;
2247}
2248
Mike Stump11289f42009-09-09 15:08:12 +00002249template<typename Derived>
2250QualType
John McCall550e0c22009-10-21 00:40:46 +00002251TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
2252 LValueReferenceTypeLoc TL) {
John McCall70dd5f62009-10-30 00:06:24 +00002253 return TransformReferenceType(TLB, TL);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002254}
2255
Mike Stump11289f42009-09-09 15:08:12 +00002256template<typename Derived>
2257QualType
John McCall550e0c22009-10-21 00:40:46 +00002258TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
2259 RValueReferenceTypeLoc TL) {
John McCall70dd5f62009-10-30 00:06:24 +00002260 return TransformReferenceType(TLB, TL);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002261}
Mike Stump11289f42009-09-09 15:08:12 +00002262
Douglas Gregord6ff3322009-08-04 16:50:30 +00002263template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00002264QualType
John McCall550e0c22009-10-21 00:40:46 +00002265TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
2266 MemberPointerTypeLoc TL) {
2267 MemberPointerType *T = TL.getTypePtr();
2268
2269 QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002270 if (PointeeType.isNull())
2271 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002272
John McCall550e0c22009-10-21 00:40:46 +00002273 // TODO: preserve source information for this.
2274 QualType ClassType
2275 = getDerived().TransformType(QualType(T->getClass(), 0));
Douglas Gregord6ff3322009-08-04 16:50:30 +00002276 if (ClassType.isNull())
2277 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002278
John McCall550e0c22009-10-21 00:40:46 +00002279 QualType Result = TL.getType();
2280 if (getDerived().AlwaysRebuild() ||
2281 PointeeType != T->getPointeeType() ||
2282 ClassType != QualType(T->getClass(), 0)) {
John McCall70dd5f62009-10-30 00:06:24 +00002283 Result = getDerived().RebuildMemberPointerType(PointeeType, ClassType,
2284 TL.getStarLoc());
John McCall550e0c22009-10-21 00:40:46 +00002285 if (Result.isNull())
2286 return QualType();
2287 }
Douglas Gregord6ff3322009-08-04 16:50:30 +00002288
John McCall550e0c22009-10-21 00:40:46 +00002289 MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
2290 NewTL.setSigilLoc(TL.getSigilLoc());
2291
2292 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002293}
2294
Mike Stump11289f42009-09-09 15:08:12 +00002295template<typename Derived>
2296QualType
John McCall550e0c22009-10-21 00:40:46 +00002297TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
2298 ConstantArrayTypeLoc TL) {
2299 ConstantArrayType *T = TL.getTypePtr();
2300 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002301 if (ElementType.isNull())
2302 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002303
John McCall550e0c22009-10-21 00:40:46 +00002304 QualType Result = TL.getType();
2305 if (getDerived().AlwaysRebuild() ||
2306 ElementType != T->getElementType()) {
2307 Result = getDerived().RebuildConstantArrayType(ElementType,
2308 T->getSizeModifier(),
2309 T->getSize(),
John McCall70dd5f62009-10-30 00:06:24 +00002310 T->getIndexTypeCVRQualifiers(),
2311 TL.getBracketsRange());
John McCall550e0c22009-10-21 00:40:46 +00002312 if (Result.isNull())
2313 return QualType();
2314 }
2315
2316 ConstantArrayTypeLoc NewTL = TLB.push<ConstantArrayTypeLoc>(Result);
2317 NewTL.setLBracketLoc(TL.getLBracketLoc());
2318 NewTL.setRBracketLoc(TL.getRBracketLoc());
Mike Stump11289f42009-09-09 15:08:12 +00002319
John McCall550e0c22009-10-21 00:40:46 +00002320 Expr *Size = TL.getSizeExpr();
2321 if (Size) {
2322 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2323 Size = getDerived().TransformExpr(Size).template takeAs<Expr>();
2324 }
2325 NewTL.setSizeExpr(Size);
2326
2327 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002328}
Mike Stump11289f42009-09-09 15:08:12 +00002329
Douglas Gregord6ff3322009-08-04 16:50:30 +00002330template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002331QualType TreeTransform<Derived>::TransformIncompleteArrayType(
John McCall550e0c22009-10-21 00:40:46 +00002332 TypeLocBuilder &TLB,
2333 IncompleteArrayTypeLoc TL) {
2334 IncompleteArrayType *T = TL.getTypePtr();
2335 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002336 if (ElementType.isNull())
2337 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002338
John McCall550e0c22009-10-21 00:40:46 +00002339 QualType Result = TL.getType();
2340 if (getDerived().AlwaysRebuild() ||
2341 ElementType != T->getElementType()) {
2342 Result = getDerived().RebuildIncompleteArrayType(ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00002343 T->getSizeModifier(),
John McCall70dd5f62009-10-30 00:06:24 +00002344 T->getIndexTypeCVRQualifiers(),
2345 TL.getBracketsRange());
John McCall550e0c22009-10-21 00:40:46 +00002346 if (Result.isNull())
2347 return QualType();
2348 }
2349
2350 IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
2351 NewTL.setLBracketLoc(TL.getLBracketLoc());
2352 NewTL.setRBracketLoc(TL.getRBracketLoc());
2353 NewTL.setSizeExpr(0);
2354
2355 return Result;
2356}
2357
2358template<typename Derived>
2359QualType
2360TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
2361 VariableArrayTypeLoc TL) {
2362 VariableArrayType *T = TL.getTypePtr();
2363 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2364 if (ElementType.isNull())
2365 return QualType();
2366
2367 // Array bounds are not potentially evaluated contexts
2368 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2369
2370 Sema::OwningExprResult SizeResult
2371 = getDerived().TransformExpr(T->getSizeExpr());
2372 if (SizeResult.isInvalid())
2373 return QualType();
2374
2375 Expr *Size = static_cast<Expr*>(SizeResult.get());
2376
2377 QualType Result = TL.getType();
2378 if (getDerived().AlwaysRebuild() ||
2379 ElementType != T->getElementType() ||
2380 Size != T->getSizeExpr()) {
2381 Result = getDerived().RebuildVariableArrayType(ElementType,
2382 T->getSizeModifier(),
2383 move(SizeResult),
2384 T->getIndexTypeCVRQualifiers(),
John McCall70dd5f62009-10-30 00:06:24 +00002385 TL.getBracketsRange());
John McCall550e0c22009-10-21 00:40:46 +00002386 if (Result.isNull())
2387 return QualType();
2388 }
2389 else SizeResult.take();
2390
2391 VariableArrayTypeLoc NewTL = TLB.push<VariableArrayTypeLoc>(Result);
2392 NewTL.setLBracketLoc(TL.getLBracketLoc());
2393 NewTL.setRBracketLoc(TL.getRBracketLoc());
2394 NewTL.setSizeExpr(Size);
2395
2396 return Result;
2397}
2398
2399template<typename Derived>
2400QualType
2401TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
2402 DependentSizedArrayTypeLoc TL) {
2403 DependentSizedArrayType *T = TL.getTypePtr();
2404 QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
2405 if (ElementType.isNull())
2406 return QualType();
2407
2408 // Array bounds are not potentially evaluated contexts
2409 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2410
2411 Sema::OwningExprResult SizeResult
2412 = getDerived().TransformExpr(T->getSizeExpr());
2413 if (SizeResult.isInvalid())
2414 return QualType();
2415
2416 Expr *Size = static_cast<Expr*>(SizeResult.get());
2417
2418 QualType Result = TL.getType();
2419 if (getDerived().AlwaysRebuild() ||
2420 ElementType != T->getElementType() ||
2421 Size != T->getSizeExpr()) {
2422 Result = getDerived().RebuildDependentSizedArrayType(ElementType,
2423 T->getSizeModifier(),
2424 move(SizeResult),
2425 T->getIndexTypeCVRQualifiers(),
John McCall70dd5f62009-10-30 00:06:24 +00002426 TL.getBracketsRange());
John McCall550e0c22009-10-21 00:40:46 +00002427 if (Result.isNull())
2428 return QualType();
2429 }
2430 else SizeResult.take();
2431
2432 // We might have any sort of array type now, but fortunately they
2433 // all have the same location layout.
2434 ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
2435 NewTL.setLBracketLoc(TL.getLBracketLoc());
2436 NewTL.setRBracketLoc(TL.getRBracketLoc());
2437 NewTL.setSizeExpr(Size);
2438
2439 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002440}
Mike Stump11289f42009-09-09 15:08:12 +00002441
2442template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002443QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
John McCall550e0c22009-10-21 00:40:46 +00002444 TypeLocBuilder &TLB,
2445 DependentSizedExtVectorTypeLoc TL) {
2446 DependentSizedExtVectorType *T = TL.getTypePtr();
2447
2448 // FIXME: ext vector locs should be nested
Douglas Gregord6ff3322009-08-04 16:50:30 +00002449 QualType ElementType = getDerived().TransformType(T->getElementType());
2450 if (ElementType.isNull())
2451 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002452
Douglas Gregore922c772009-08-04 22:27:00 +00002453 // Vector sizes are not potentially evaluated contexts
2454 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
2455
Douglas Gregord6ff3322009-08-04 16:50:30 +00002456 Sema::OwningExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
2457 if (Size.isInvalid())
2458 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002459
John McCall550e0c22009-10-21 00:40:46 +00002460 QualType Result = TL.getType();
2461 if (getDerived().AlwaysRebuild() ||
John McCall24e7cb62009-10-23 17:55:45 +00002462 ElementType != T->getElementType() ||
2463 Size.get() != T->getSizeExpr()) {
John McCall550e0c22009-10-21 00:40:46 +00002464 Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00002465 move(Size),
2466 T->getAttributeLoc());
John McCall550e0c22009-10-21 00:40:46 +00002467 if (Result.isNull())
2468 return QualType();
2469 }
2470 else Size.take();
2471
2472 // Result might be dependent or not.
2473 if (isa<DependentSizedExtVectorType>(Result)) {
2474 DependentSizedExtVectorTypeLoc NewTL
2475 = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
2476 NewTL.setNameLoc(TL.getNameLoc());
2477 } else {
2478 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2479 NewTL.setNameLoc(TL.getNameLoc());
2480 }
2481
2482 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002483}
Mike Stump11289f42009-09-09 15:08:12 +00002484
2485template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002486QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
2487 VectorTypeLoc TL) {
2488 VectorType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002489 QualType ElementType = getDerived().TransformType(T->getElementType());
2490 if (ElementType.isNull())
2491 return QualType();
2492
John McCall550e0c22009-10-21 00:40:46 +00002493 QualType Result = TL.getType();
2494 if (getDerived().AlwaysRebuild() ||
2495 ElementType != T->getElementType()) {
2496 Result = getDerived().RebuildVectorType(ElementType, T->getNumElements());
2497 if (Result.isNull())
2498 return QualType();
2499 }
2500
2501 VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
2502 NewTL.setNameLoc(TL.getNameLoc());
Mike Stump11289f42009-09-09 15:08:12 +00002503
John McCall550e0c22009-10-21 00:40:46 +00002504 return Result;
2505}
2506
2507template<typename Derived>
2508QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
2509 ExtVectorTypeLoc TL) {
2510 VectorType *T = TL.getTypePtr();
2511 QualType ElementType = getDerived().TransformType(T->getElementType());
2512 if (ElementType.isNull())
2513 return QualType();
2514
2515 QualType Result = TL.getType();
2516 if (getDerived().AlwaysRebuild() ||
2517 ElementType != T->getElementType()) {
2518 Result = getDerived().RebuildExtVectorType(ElementType,
2519 T->getNumElements(),
2520 /*FIXME*/ SourceLocation());
2521 if (Result.isNull())
2522 return QualType();
2523 }
2524
2525 ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
2526 NewTL.setNameLoc(TL.getNameLoc());
2527
2528 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002529}
Mike Stump11289f42009-09-09 15:08:12 +00002530
2531template<typename Derived>
2532QualType
John McCall550e0c22009-10-21 00:40:46 +00002533TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
2534 FunctionProtoTypeLoc TL) {
2535 FunctionProtoType *T = TL.getTypePtr();
2536 QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002537 if (ResultType.isNull())
2538 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002539
John McCall550e0c22009-10-21 00:40:46 +00002540 // Transform the parameters.
Douglas Gregord6ff3322009-08-04 16:50:30 +00002541 llvm::SmallVector<QualType, 4> ParamTypes;
John McCall550e0c22009-10-21 00:40:46 +00002542 llvm::SmallVector<ParmVarDecl*, 4> ParamDecls;
2543 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2544 ParmVarDecl *OldParm = TL.getArg(i);
Mike Stump11289f42009-09-09 15:08:12 +00002545
John McCall550e0c22009-10-21 00:40:46 +00002546 QualType NewType;
2547 ParmVarDecl *NewParm;
2548
2549 if (OldParm) {
2550 DeclaratorInfo *OldDI = OldParm->getDeclaratorInfo();
2551 assert(OldDI->getType() == T->getArgType(i));
2552
2553 DeclaratorInfo *NewDI = getDerived().TransformType(OldDI);
2554 if (!NewDI)
2555 return QualType();
2556
2557 if (NewDI == OldDI)
2558 NewParm = OldParm;
2559 else
2560 NewParm = ParmVarDecl::Create(SemaRef.Context,
2561 OldParm->getDeclContext(),
2562 OldParm->getLocation(),
2563 OldParm->getIdentifier(),
2564 NewDI->getType(),
2565 NewDI,
2566 OldParm->getStorageClass(),
2567 /* DefArg */ NULL);
2568 NewType = NewParm->getType();
2569
2570 // Deal with the possibility that we don't have a parameter
2571 // declaration for this parameter.
2572 } else {
2573 NewParm = 0;
2574
2575 QualType OldType = T->getArgType(i);
2576 NewType = getDerived().TransformType(OldType);
2577 if (NewType.isNull())
2578 return QualType();
2579 }
2580
2581 ParamTypes.push_back(NewType);
2582 ParamDecls.push_back(NewParm);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002583 }
Mike Stump11289f42009-09-09 15:08:12 +00002584
John McCall550e0c22009-10-21 00:40:46 +00002585 QualType Result = TL.getType();
2586 if (getDerived().AlwaysRebuild() ||
2587 ResultType != T->getResultType() ||
2588 !std::equal(T->arg_type_begin(), T->arg_type_end(), ParamTypes.begin())) {
2589 Result = getDerived().RebuildFunctionProtoType(ResultType,
2590 ParamTypes.data(),
2591 ParamTypes.size(),
2592 T->isVariadic(),
2593 T->getTypeQuals());
2594 if (Result.isNull())
2595 return QualType();
2596 }
Mike Stump11289f42009-09-09 15:08:12 +00002597
John McCall550e0c22009-10-21 00:40:46 +00002598 FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
2599 NewTL.setLParenLoc(TL.getLParenLoc());
2600 NewTL.setRParenLoc(TL.getRParenLoc());
2601 for (unsigned i = 0, e = NewTL.getNumArgs(); i != e; ++i)
2602 NewTL.setArg(i, ParamDecls[i]);
2603
2604 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002605}
Mike Stump11289f42009-09-09 15:08:12 +00002606
Douglas Gregord6ff3322009-08-04 16:50:30 +00002607template<typename Derived>
2608QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
John McCall550e0c22009-10-21 00:40:46 +00002609 TypeLocBuilder &TLB,
2610 FunctionNoProtoTypeLoc TL) {
2611 FunctionNoProtoType *T = TL.getTypePtr();
2612 QualType ResultType = getDerived().TransformType(TLB, TL.getResultLoc());
2613 if (ResultType.isNull())
2614 return QualType();
2615
2616 QualType Result = TL.getType();
2617 if (getDerived().AlwaysRebuild() ||
2618 ResultType != T->getResultType())
2619 Result = getDerived().RebuildFunctionNoProtoType(ResultType);
2620
2621 FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
2622 NewTL.setLParenLoc(TL.getLParenLoc());
2623 NewTL.setRParenLoc(TL.getRParenLoc());
2624
2625 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002626}
Mike Stump11289f42009-09-09 15:08:12 +00002627
Douglas Gregord6ff3322009-08-04 16:50:30 +00002628template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002629QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
2630 TypedefTypeLoc TL) {
2631 TypedefType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002632 TypedefDecl *Typedef
2633 = cast_or_null<TypedefDecl>(getDerived().TransformDecl(T->getDecl()));
2634 if (!Typedef)
2635 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002636
John McCall550e0c22009-10-21 00:40:46 +00002637 QualType Result = TL.getType();
2638 if (getDerived().AlwaysRebuild() ||
2639 Typedef != T->getDecl()) {
2640 Result = getDerived().RebuildTypedefType(Typedef);
2641 if (Result.isNull())
2642 return QualType();
2643 }
Mike Stump11289f42009-09-09 15:08:12 +00002644
John McCall550e0c22009-10-21 00:40:46 +00002645 TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
2646 NewTL.setNameLoc(TL.getNameLoc());
2647
2648 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002649}
Mike Stump11289f42009-09-09 15:08:12 +00002650
Douglas Gregord6ff3322009-08-04 16:50:30 +00002651template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002652QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
2653 TypeOfExprTypeLoc TL) {
2654 TypeOfExprType *T = TL.getTypePtr();
2655
Douglas Gregore922c772009-08-04 22:27:00 +00002656 // typeof expressions are not potentially evaluated contexts
2657 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002658
Douglas Gregord6ff3322009-08-04 16:50:30 +00002659 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2660 if (E.isInvalid())
2661 return QualType();
2662
John McCall550e0c22009-10-21 00:40:46 +00002663 QualType Result = TL.getType();
2664 if (getDerived().AlwaysRebuild() ||
2665 E.get() != T->getUnderlyingExpr()) {
2666 Result = getDerived().RebuildTypeOfExprType(move(E));
2667 if (Result.isNull())
2668 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002669 }
John McCall550e0c22009-10-21 00:40:46 +00002670 else E.take();
Mike Stump11289f42009-09-09 15:08:12 +00002671
John McCall550e0c22009-10-21 00:40:46 +00002672 TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
2673 NewTL.setNameLoc(TL.getNameLoc());
2674
2675 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002676}
Mike Stump11289f42009-09-09 15:08:12 +00002677
2678template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002679QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
2680 TypeOfTypeLoc TL) {
2681 TypeOfType *T = TL.getTypePtr();
2682
2683 // FIXME: should be an inner type, or at least have a DeclaratorInfo.
Douglas Gregord6ff3322009-08-04 16:50:30 +00002684 QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2685 if (Underlying.isNull())
2686 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002687
John McCall550e0c22009-10-21 00:40:46 +00002688 QualType Result = TL.getType();
2689 if (getDerived().AlwaysRebuild() ||
2690 Underlying != T->getUnderlyingType()) {
2691 Result = getDerived().RebuildTypeOfType(Underlying);
2692 if (Result.isNull())
2693 return QualType();
2694 }
Mike Stump11289f42009-09-09 15:08:12 +00002695
John McCall550e0c22009-10-21 00:40:46 +00002696 TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
2697 NewTL.setNameLoc(TL.getNameLoc());
2698
2699 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002700}
Mike Stump11289f42009-09-09 15:08:12 +00002701
2702template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002703QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
2704 DecltypeTypeLoc TL) {
2705 DecltypeType *T = TL.getTypePtr();
2706
Douglas Gregore922c772009-08-04 22:27:00 +00002707 // decltype expressions are not potentially evaluated contexts
2708 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00002709
Douglas Gregord6ff3322009-08-04 16:50:30 +00002710 Sema::OwningExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
2711 if (E.isInvalid())
2712 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002713
John McCall550e0c22009-10-21 00:40:46 +00002714 QualType Result = TL.getType();
2715 if (getDerived().AlwaysRebuild() ||
2716 E.get() != T->getUnderlyingExpr()) {
2717 Result = getDerived().RebuildDecltypeType(move(E));
2718 if (Result.isNull())
2719 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002720 }
John McCall550e0c22009-10-21 00:40:46 +00002721 else E.take();
Mike Stump11289f42009-09-09 15:08:12 +00002722
John McCall550e0c22009-10-21 00:40:46 +00002723 DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
2724 NewTL.setNameLoc(TL.getNameLoc());
2725
2726 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002727}
2728
2729template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002730QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
2731 RecordTypeLoc TL) {
2732 RecordType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002733 RecordDecl *Record
John McCall550e0c22009-10-21 00:40:46 +00002734 = cast_or_null<RecordDecl>(getDerived().TransformDecl(T->getDecl()));
Douglas Gregord6ff3322009-08-04 16:50:30 +00002735 if (!Record)
2736 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002737
John McCall550e0c22009-10-21 00:40:46 +00002738 QualType Result = TL.getType();
2739 if (getDerived().AlwaysRebuild() ||
2740 Record != T->getDecl()) {
2741 Result = getDerived().RebuildRecordType(Record);
2742 if (Result.isNull())
2743 return QualType();
2744 }
Mike Stump11289f42009-09-09 15:08:12 +00002745
John McCall550e0c22009-10-21 00:40:46 +00002746 RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
2747 NewTL.setNameLoc(TL.getNameLoc());
2748
2749 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002750}
Mike Stump11289f42009-09-09 15:08:12 +00002751
2752template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002753QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
2754 EnumTypeLoc TL) {
2755 EnumType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002756 EnumDecl *Enum
John McCall550e0c22009-10-21 00:40:46 +00002757 = cast_or_null<EnumDecl>(getDerived().TransformDecl(T->getDecl()));
Douglas Gregord6ff3322009-08-04 16:50:30 +00002758 if (!Enum)
2759 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002760
John McCall550e0c22009-10-21 00:40:46 +00002761 QualType Result = TL.getType();
2762 if (getDerived().AlwaysRebuild() ||
2763 Enum != T->getDecl()) {
2764 Result = getDerived().RebuildEnumType(Enum);
2765 if (Result.isNull())
2766 return QualType();
2767 }
Mike Stump11289f42009-09-09 15:08:12 +00002768
John McCall550e0c22009-10-21 00:40:46 +00002769 EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
2770 NewTL.setNameLoc(TL.getNameLoc());
2771
2772 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002773}
John McCallfcc33b02009-09-05 00:15:47 +00002774
2775template <typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002776QualType TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
2777 ElaboratedTypeLoc TL) {
2778 ElaboratedType *T = TL.getTypePtr();
2779
2780 // FIXME: this should be a nested type.
John McCallfcc33b02009-09-05 00:15:47 +00002781 QualType Underlying = getDerived().TransformType(T->getUnderlyingType());
2782 if (Underlying.isNull())
2783 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002784
John McCall550e0c22009-10-21 00:40:46 +00002785 QualType Result = TL.getType();
2786 if (getDerived().AlwaysRebuild() ||
2787 Underlying != T->getUnderlyingType()) {
2788 Result = getDerived().RebuildElaboratedType(Underlying, T->getTagKind());
2789 if (Result.isNull())
2790 return QualType();
2791 }
Mike Stump11289f42009-09-09 15:08:12 +00002792
John McCall550e0c22009-10-21 00:40:46 +00002793 ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
2794 NewTL.setNameLoc(TL.getNameLoc());
2795
2796 return Result;
John McCallfcc33b02009-09-05 00:15:47 +00002797}
Mike Stump11289f42009-09-09 15:08:12 +00002798
2799
Douglas Gregord6ff3322009-08-04 16:50:30 +00002800template<typename Derived>
2801QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
John McCall550e0c22009-10-21 00:40:46 +00002802 TypeLocBuilder &TLB,
2803 TemplateTypeParmTypeLoc TL) {
2804 return TransformTypeSpecType(TLB, TL);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002805}
2806
Mike Stump11289f42009-09-09 15:08:12 +00002807template<typename Derived>
John McCallcebee162009-10-18 09:09:24 +00002808QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
John McCall550e0c22009-10-21 00:40:46 +00002809 TypeLocBuilder &TLB,
2810 SubstTemplateTypeParmTypeLoc TL) {
2811 return TransformTypeSpecType(TLB, TL);
John McCallcebee162009-10-18 09:09:24 +00002812}
2813
2814template<typename Derived>
Douglas Gregorc59e5612009-10-19 22:04:39 +00002815inline QualType
2816TreeTransform<Derived>::TransformTemplateSpecializationType(
John McCall550e0c22009-10-21 00:40:46 +00002817 TypeLocBuilder &TLB,
2818 TemplateSpecializationTypeLoc TL) {
John McCall0ad16662009-10-29 08:12:44 +00002819 return TransformTemplateSpecializationType(TLB, TL, QualType());
2820}
John McCall550e0c22009-10-21 00:40:46 +00002821
John McCall0ad16662009-10-29 08:12:44 +00002822template<typename Derived>
2823QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
2824 const TemplateSpecializationType *TST,
2825 QualType ObjectType) {
2826 // FIXME: this entire method is a temporary workaround; callers
2827 // should be rewritten to provide real type locs.
John McCall550e0c22009-10-21 00:40:46 +00002828
John McCall0ad16662009-10-29 08:12:44 +00002829 // Fake up a TemplateSpecializationTypeLoc.
2830 TypeLocBuilder TLB;
2831 TemplateSpecializationTypeLoc TL
2832 = TLB.push<TemplateSpecializationTypeLoc>(QualType(TST, 0));
2833
John McCall0d07eb32009-10-29 18:45:58 +00002834 SourceLocation BaseLoc = getDerived().getBaseLocation();
2835
2836 TL.setTemplateNameLoc(BaseLoc);
2837 TL.setLAngleLoc(BaseLoc);
2838 TL.setRAngleLoc(BaseLoc);
John McCall0ad16662009-10-29 08:12:44 +00002839 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) {
2840 const TemplateArgument &TA = TST->getArg(i);
2841 TemplateArgumentLoc TAL;
2842 getDerived().InventTemplateArgumentLoc(TA, TAL);
2843 TL.setArgLocInfo(i, TAL.getLocInfo());
2844 }
2845
2846 TypeLocBuilder IgnoredTLB;
2847 return TransformTemplateSpecializationType(IgnoredTLB, TL, ObjectType);
Douglas Gregorc59e5612009-10-19 22:04:39 +00002848}
2849
2850template<typename Derived>
Douglas Gregord6ff3322009-08-04 16:50:30 +00002851QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
John McCall0ad16662009-10-29 08:12:44 +00002852 TypeLocBuilder &TLB,
2853 TemplateSpecializationTypeLoc TL,
2854 QualType ObjectType) {
2855 const TemplateSpecializationType *T = TL.getTypePtr();
2856
Mike Stump11289f42009-09-09 15:08:12 +00002857 TemplateName Template
Douglas Gregorc59e5612009-10-19 22:04:39 +00002858 = getDerived().TransformTemplateName(T->getTemplateName(), ObjectType);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002859 if (Template.isNull())
2860 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002861
John McCall0ad16662009-10-29 08:12:44 +00002862 llvm::SmallVector<TemplateArgumentLoc, 4> NewTemplateArgs(T->getNumArgs());
2863 for (unsigned i = 0, e = T->getNumArgs(); i != e; ++i)
2864 if (getDerived().TransformTemplateArgument(TL.getArgLoc(i),
2865 NewTemplateArgs[i]))
Douglas Gregord6ff3322009-08-04 16:50:30 +00002866 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002867
John McCall0ad16662009-10-29 08:12:44 +00002868 // FIXME: maybe don't rebuild if all the template arguments are the same.
2869
2870 QualType Result =
2871 getDerived().RebuildTemplateSpecializationType(Template,
2872 TL.getTemplateNameLoc(),
2873 TL.getLAngleLoc(),
2874 NewTemplateArgs.data(),
2875 NewTemplateArgs.size(),
2876 TL.getRAngleLoc());
2877
2878 if (!Result.isNull()) {
2879 TemplateSpecializationTypeLoc NewTL
2880 = TLB.push<TemplateSpecializationTypeLoc>(Result);
2881 NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
2882 NewTL.setLAngleLoc(TL.getLAngleLoc());
2883 NewTL.setRAngleLoc(TL.getRAngleLoc());
2884 for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
2885 NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
Douglas Gregord6ff3322009-08-04 16:50:30 +00002886 }
Mike Stump11289f42009-09-09 15:08:12 +00002887
John McCall0ad16662009-10-29 08:12:44 +00002888 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002889}
Mike Stump11289f42009-09-09 15:08:12 +00002890
2891template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002892QualType
2893TreeTransform<Derived>::TransformQualifiedNameType(TypeLocBuilder &TLB,
2894 QualifiedNameTypeLoc TL) {
2895 QualifiedNameType *T = TL.getTypePtr();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002896 NestedNameSpecifier *NNS
2897 = getDerived().TransformNestedNameSpecifier(T->getQualifier(),
2898 SourceRange());
2899 if (!NNS)
2900 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002901
Douglas Gregord6ff3322009-08-04 16:50:30 +00002902 QualType Named = getDerived().TransformType(T->getNamedType());
2903 if (Named.isNull())
2904 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002905
John McCall550e0c22009-10-21 00:40:46 +00002906 QualType Result = TL.getType();
2907 if (getDerived().AlwaysRebuild() ||
2908 NNS != T->getQualifier() ||
2909 Named != T->getNamedType()) {
2910 Result = getDerived().RebuildQualifiedNameType(NNS, Named);
2911 if (Result.isNull())
2912 return QualType();
2913 }
Douglas Gregord6ff3322009-08-04 16:50:30 +00002914
John McCall550e0c22009-10-21 00:40:46 +00002915 QualifiedNameTypeLoc NewTL = TLB.push<QualifiedNameTypeLoc>(Result);
2916 NewTL.setNameLoc(TL.getNameLoc());
2917
2918 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002919}
Mike Stump11289f42009-09-09 15:08:12 +00002920
2921template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002922QualType TreeTransform<Derived>::TransformTypenameType(TypeLocBuilder &TLB,
2923 TypenameTypeLoc TL) {
2924 TypenameType *T = TL.getTypePtr();
John McCall0ad16662009-10-29 08:12:44 +00002925
2926 /* FIXME: preserve source information better than this */
2927 SourceRange SR(TL.getNameLoc());
2928
Douglas Gregord6ff3322009-08-04 16:50:30 +00002929 NestedNameSpecifier *NNS
John McCall0ad16662009-10-29 08:12:44 +00002930 = getDerived().TransformNestedNameSpecifier(T->getQualifier(), SR);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002931 if (!NNS)
2932 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002933
John McCall550e0c22009-10-21 00:40:46 +00002934 QualType Result;
2935
Douglas Gregord6ff3322009-08-04 16:50:30 +00002936 if (const TemplateSpecializationType *TemplateId = T->getTemplateId()) {
Mike Stump11289f42009-09-09 15:08:12 +00002937 QualType NewTemplateId
Douglas Gregord6ff3322009-08-04 16:50:30 +00002938 = getDerived().TransformType(QualType(TemplateId, 0));
2939 if (NewTemplateId.isNull())
2940 return QualType();
Mike Stump11289f42009-09-09 15:08:12 +00002941
Douglas Gregord6ff3322009-08-04 16:50:30 +00002942 if (!getDerived().AlwaysRebuild() &&
2943 NNS == T->getQualifier() &&
2944 NewTemplateId == QualType(TemplateId, 0))
2945 return QualType(T, 0);
Mike Stump11289f42009-09-09 15:08:12 +00002946
John McCall550e0c22009-10-21 00:40:46 +00002947 Result = getDerived().RebuildTypenameType(NNS, NewTemplateId);
2948 } else {
John McCall0ad16662009-10-29 08:12:44 +00002949 Result = getDerived().RebuildTypenameType(NNS, T->getIdentifier(), SR);
Douglas Gregord6ff3322009-08-04 16:50:30 +00002950 }
John McCall550e0c22009-10-21 00:40:46 +00002951 if (Result.isNull())
2952 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002953
John McCall550e0c22009-10-21 00:40:46 +00002954 TypenameTypeLoc NewTL = TLB.push<TypenameTypeLoc>(Result);
2955 NewTL.setNameLoc(TL.getNameLoc());
2956
2957 return Result;
Douglas Gregord6ff3322009-08-04 16:50:30 +00002958}
Mike Stump11289f42009-09-09 15:08:12 +00002959
Douglas Gregord6ff3322009-08-04 16:50:30 +00002960template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002961QualType
2962TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
2963 ObjCInterfaceTypeLoc TL) {
John McCallfc93cf92009-10-22 22:37:11 +00002964 assert(false && "TransformObjCInterfaceType unimplemented");
2965 return QualType();
Douglas Gregord6ff3322009-08-04 16:50:30 +00002966}
Mike Stump11289f42009-09-09 15:08:12 +00002967
2968template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00002969QualType
2970TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
2971 ObjCObjectPointerTypeLoc TL) {
John McCallfc93cf92009-10-22 22:37:11 +00002972 assert(false && "TransformObjCObjectPointerType unimplemented");
2973 return QualType();
Argyrios Kyrtzidisa7a36df2009-09-29 19:42:55 +00002974}
2975
Douglas Gregord6ff3322009-08-04 16:50:30 +00002976//===----------------------------------------------------------------------===//
Douglas Gregorebe10102009-08-20 07:17:43 +00002977// Statement transformation
2978//===----------------------------------------------------------------------===//
2979template<typename Derived>
2980Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002981TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
2982 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00002983}
2984
2985template<typename Derived>
2986Sema::OwningStmtResult
2987TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
2988 return getDerived().TransformCompoundStmt(S, false);
2989}
2990
2991template<typename Derived>
2992Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00002993TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
Douglas Gregorebe10102009-08-20 07:17:43 +00002994 bool IsStmtExpr) {
2995 bool SubStmtChanged = false;
2996 ASTOwningVector<&ActionBase::DeleteStmt> Statements(getSema());
2997 for (CompoundStmt::body_iterator B = S->body_begin(), BEnd = S->body_end();
2998 B != BEnd; ++B) {
2999 OwningStmtResult Result = getDerived().TransformStmt(*B);
3000 if (Result.isInvalid())
3001 return getSema().StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003002
Douglas Gregorebe10102009-08-20 07:17:43 +00003003 SubStmtChanged = SubStmtChanged || Result.get() != *B;
3004 Statements.push_back(Result.takeAs<Stmt>());
3005 }
Mike Stump11289f42009-09-09 15:08:12 +00003006
Douglas Gregorebe10102009-08-20 07:17:43 +00003007 if (!getDerived().AlwaysRebuild() &&
3008 !SubStmtChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003009 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003010
3011 return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
3012 move_arg(Statements),
3013 S->getRBracLoc(),
3014 IsStmtExpr);
3015}
Mike Stump11289f42009-09-09 15:08:12 +00003016
Douglas Gregorebe10102009-08-20 07:17:43 +00003017template<typename Derived>
3018Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003019TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003020 // The case value expressions are not potentially evaluated.
3021 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00003022
Douglas Gregorebe10102009-08-20 07:17:43 +00003023 // Transform the left-hand case value.
3024 OwningExprResult LHS = getDerived().TransformExpr(S->getLHS());
3025 if (LHS.isInvalid())
3026 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003027
Douglas Gregorebe10102009-08-20 07:17:43 +00003028 // Transform the right-hand case value (for the GNU case-range extension).
3029 OwningExprResult RHS = getDerived().TransformExpr(S->getRHS());
3030 if (RHS.isInvalid())
3031 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003032
Douglas Gregorebe10102009-08-20 07:17:43 +00003033 // Build the case statement.
3034 // Case statements are always rebuilt so that they will attached to their
3035 // transformed switch statement.
3036 OwningStmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
3037 move(LHS),
3038 S->getEllipsisLoc(),
3039 move(RHS),
3040 S->getColonLoc());
3041 if (Case.isInvalid())
3042 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003043
Douglas Gregorebe10102009-08-20 07:17:43 +00003044 // Transform the statement following the case
3045 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3046 if (SubStmt.isInvalid())
3047 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003048
Douglas Gregorebe10102009-08-20 07:17:43 +00003049 // Attach the body to the case statement
3050 return getDerived().RebuildCaseStmtBody(move(Case), move(SubStmt));
3051}
3052
3053template<typename Derived>
3054Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003055TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003056 // Transform the statement following the default case
3057 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3058 if (SubStmt.isInvalid())
3059 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003060
Douglas Gregorebe10102009-08-20 07:17:43 +00003061 // Default statements are always rebuilt
3062 return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
3063 move(SubStmt));
3064}
Mike Stump11289f42009-09-09 15:08:12 +00003065
Douglas Gregorebe10102009-08-20 07:17:43 +00003066template<typename Derived>
3067Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003068TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003069 OwningStmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt());
3070 if (SubStmt.isInvalid())
3071 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003072
Douglas Gregorebe10102009-08-20 07:17:43 +00003073 // FIXME: Pass the real colon location in.
3074 SourceLocation ColonLoc = SemaRef.PP.getLocForEndOfToken(S->getIdentLoc());
3075 return getDerived().RebuildLabelStmt(S->getIdentLoc(), S->getID(), ColonLoc,
3076 move(SubStmt));
3077}
Mike Stump11289f42009-09-09 15:08:12 +00003078
Douglas Gregorebe10102009-08-20 07:17:43 +00003079template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003080Sema::OwningStmtResult
3081TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003082 // Transform the condition
3083 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3084 if (Cond.isInvalid())
3085 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003086
Douglas Gregorebe10102009-08-20 07:17:43 +00003087 Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
Mike Stump11289f42009-09-09 15:08:12 +00003088
Douglas Gregorebe10102009-08-20 07:17:43 +00003089 // Transform the "then" branch.
3090 OwningStmtResult Then = getDerived().TransformStmt(S->getThen());
3091 if (Then.isInvalid())
3092 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003093
Douglas Gregorebe10102009-08-20 07:17:43 +00003094 // Transform the "else" branch.
3095 OwningStmtResult Else = getDerived().TransformStmt(S->getElse());
3096 if (Else.isInvalid())
3097 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003098
Douglas Gregorebe10102009-08-20 07:17:43 +00003099 if (!getDerived().AlwaysRebuild() &&
3100 FullCond->get() == S->getCond() &&
3101 Then.get() == S->getThen() &&
3102 Else.get() == S->getElse())
Mike Stump11289f42009-09-09 15:08:12 +00003103 return SemaRef.Owned(S->Retain());
3104
Douglas Gregorebe10102009-08-20 07:17:43 +00003105 return getDerived().RebuildIfStmt(S->getIfLoc(), FullCond, move(Then),
Mike Stump11289f42009-09-09 15:08:12 +00003106 S->getElseLoc(), move(Else));
Douglas Gregorebe10102009-08-20 07:17:43 +00003107}
3108
3109template<typename Derived>
3110Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003111TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003112 // Transform the condition.
3113 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3114 if (Cond.isInvalid())
3115 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003116
Douglas Gregorebe10102009-08-20 07:17:43 +00003117 // Rebuild the switch statement.
3118 OwningStmtResult Switch = getDerived().RebuildSwitchStmtStart(move(Cond));
3119 if (Switch.isInvalid())
3120 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003121
Douglas Gregorebe10102009-08-20 07:17:43 +00003122 // Transform the body of the switch statement.
3123 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3124 if (Body.isInvalid())
3125 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003126
Douglas Gregorebe10102009-08-20 07:17:43 +00003127 // Complete the switch statement.
3128 return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), move(Switch),
3129 move(Body));
3130}
Mike Stump11289f42009-09-09 15:08:12 +00003131
Douglas Gregorebe10102009-08-20 07:17:43 +00003132template<typename Derived>
3133Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003134TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003135 // Transform the condition
3136 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3137 if (Cond.isInvalid())
3138 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003139
Douglas Gregorebe10102009-08-20 07:17:43 +00003140 Sema::FullExprArg FullCond(getSema().FullExpr(Cond));
Mike Stump11289f42009-09-09 15:08:12 +00003141
Douglas Gregorebe10102009-08-20 07:17:43 +00003142 // Transform the body
3143 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3144 if (Body.isInvalid())
3145 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003146
Douglas Gregorebe10102009-08-20 07:17:43 +00003147 if (!getDerived().AlwaysRebuild() &&
3148 FullCond->get() == S->getCond() &&
3149 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00003150 return SemaRef.Owned(S->Retain());
3151
Douglas Gregorebe10102009-08-20 07:17:43 +00003152 return getDerived().RebuildWhileStmt(S->getWhileLoc(), FullCond, move(Body));
3153}
Mike Stump11289f42009-09-09 15:08:12 +00003154
Douglas Gregorebe10102009-08-20 07:17:43 +00003155template<typename Derived>
3156Sema::OwningStmtResult
3157TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
3158 // Transform the condition
3159 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3160 if (Cond.isInvalid())
3161 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003162
Douglas Gregorebe10102009-08-20 07:17:43 +00003163 // Transform the body
3164 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3165 if (Body.isInvalid())
3166 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003167
Douglas Gregorebe10102009-08-20 07:17:43 +00003168 if (!getDerived().AlwaysRebuild() &&
3169 Cond.get() == S->getCond() &&
3170 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00003171 return SemaRef.Owned(S->Retain());
3172
Douglas Gregorebe10102009-08-20 07:17:43 +00003173 return getDerived().RebuildDoStmt(S->getDoLoc(), move(Body), S->getWhileLoc(),
3174 /*FIXME:*/S->getWhileLoc(), move(Cond),
3175 S->getRParenLoc());
3176}
Mike Stump11289f42009-09-09 15:08:12 +00003177
Douglas Gregorebe10102009-08-20 07:17:43 +00003178template<typename Derived>
3179Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003180TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003181 // Transform the initialization statement
3182 OwningStmtResult Init = getDerived().TransformStmt(S->getInit());
3183 if (Init.isInvalid())
3184 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003185
Douglas Gregorebe10102009-08-20 07:17:43 +00003186 // Transform the condition
3187 OwningExprResult Cond = getDerived().TransformExpr(S->getCond());
3188 if (Cond.isInvalid())
3189 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003190
Douglas Gregorebe10102009-08-20 07:17:43 +00003191 // Transform the increment
3192 OwningExprResult Inc = getDerived().TransformExpr(S->getInc());
3193 if (Inc.isInvalid())
3194 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003195
Douglas Gregorebe10102009-08-20 07:17:43 +00003196 // Transform the body
3197 OwningStmtResult Body = getDerived().TransformStmt(S->getBody());
3198 if (Body.isInvalid())
3199 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003200
Douglas Gregorebe10102009-08-20 07:17:43 +00003201 if (!getDerived().AlwaysRebuild() &&
3202 Init.get() == S->getInit() &&
3203 Cond.get() == S->getCond() &&
3204 Inc.get() == S->getInc() &&
3205 Body.get() == S->getBody())
Mike Stump11289f42009-09-09 15:08:12 +00003206 return SemaRef.Owned(S->Retain());
3207
Douglas Gregorebe10102009-08-20 07:17:43 +00003208 return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
3209 move(Init), move(Cond), move(Inc),
3210 S->getRParenLoc(), move(Body));
3211}
3212
3213template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003214Sema::OwningStmtResult
3215TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003216 // Goto statements must always be rebuilt, to resolve the label.
Mike Stump11289f42009-09-09 15:08:12 +00003217 return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
Douglas Gregorebe10102009-08-20 07:17:43 +00003218 S->getLabel());
3219}
3220
3221template<typename Derived>
3222Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003223TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003224 OwningExprResult Target = getDerived().TransformExpr(S->getTarget());
3225 if (Target.isInvalid())
3226 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003227
Douglas Gregorebe10102009-08-20 07:17:43 +00003228 if (!getDerived().AlwaysRebuild() &&
3229 Target.get() == S->getTarget())
Mike Stump11289f42009-09-09 15:08:12 +00003230 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003231
3232 return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
3233 move(Target));
3234}
3235
3236template<typename Derived>
3237Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003238TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
3239 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003240}
Mike Stump11289f42009-09-09 15:08:12 +00003241
Douglas Gregorebe10102009-08-20 07:17:43 +00003242template<typename Derived>
3243Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003244TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
3245 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003246}
Mike Stump11289f42009-09-09 15:08:12 +00003247
Douglas Gregorebe10102009-08-20 07:17:43 +00003248template<typename Derived>
3249Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003250TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003251 Sema::OwningExprResult Result = getDerived().TransformExpr(S->getRetValue());
3252 if (Result.isInvalid())
3253 return SemaRef.StmtError();
3254
Mike Stump11289f42009-09-09 15:08:12 +00003255 // FIXME: We always rebuild the return statement because there is no way
Douglas Gregorebe10102009-08-20 07:17:43 +00003256 // to tell whether the return type of the function has changed.
3257 return getDerived().RebuildReturnStmt(S->getReturnLoc(), move(Result));
3258}
Mike Stump11289f42009-09-09 15:08:12 +00003259
Douglas Gregorebe10102009-08-20 07:17:43 +00003260template<typename Derived>
3261Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003262TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003263 bool DeclChanged = false;
3264 llvm::SmallVector<Decl *, 4> Decls;
3265 for (DeclStmt::decl_iterator D = S->decl_begin(), DEnd = S->decl_end();
3266 D != DEnd; ++D) {
3267 Decl *Transformed = getDerived().TransformDefinition(*D);
3268 if (!Transformed)
3269 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003270
Douglas Gregorebe10102009-08-20 07:17:43 +00003271 if (Transformed != *D)
3272 DeclChanged = true;
Mike Stump11289f42009-09-09 15:08:12 +00003273
Douglas Gregorebe10102009-08-20 07:17:43 +00003274 Decls.push_back(Transformed);
3275 }
Mike Stump11289f42009-09-09 15:08:12 +00003276
Douglas Gregorebe10102009-08-20 07:17:43 +00003277 if (!getDerived().AlwaysRebuild() && !DeclChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003278 return SemaRef.Owned(S->Retain());
3279
3280 return getDerived().RebuildDeclStmt(Decls.data(), Decls.size(),
Douglas Gregorebe10102009-08-20 07:17:43 +00003281 S->getStartLoc(), S->getEndLoc());
3282}
Mike Stump11289f42009-09-09 15:08:12 +00003283
Douglas Gregorebe10102009-08-20 07:17:43 +00003284template<typename Derived>
3285Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003286TreeTransform<Derived>::TransformSwitchCase(SwitchCase *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003287 assert(false && "SwitchCase is abstract and cannot be transformed");
Mike Stump11289f42009-09-09 15:08:12 +00003288 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003289}
3290
3291template<typename Derived>
3292Sema::OwningStmtResult
3293TreeTransform<Derived>::TransformAsmStmt(AsmStmt *S) {
3294 // FIXME: Implement!
3295 assert(false && "Inline assembly cannot be transformed");
Mike Stump11289f42009-09-09 15:08:12 +00003296 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003297}
3298
3299
3300template<typename Derived>
3301Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003302TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003303 // FIXME: Implement this
3304 assert(false && "Cannot transform an Objective-C @try statement");
Mike Stump11289f42009-09-09 15:08:12 +00003305 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003306}
Mike Stump11289f42009-09-09 15:08:12 +00003307
Douglas Gregorebe10102009-08-20 07:17:43 +00003308template<typename Derived>
3309Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003310TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003311 // FIXME: Implement this
3312 assert(false && "Cannot transform an Objective-C @catch statement");
3313 return SemaRef.Owned(S->Retain());
3314}
Mike Stump11289f42009-09-09 15:08:12 +00003315
Douglas Gregorebe10102009-08-20 07:17:43 +00003316template<typename Derived>
3317Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003318TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003319 // FIXME: Implement this
3320 assert(false && "Cannot transform an Objective-C @finally statement");
Mike Stump11289f42009-09-09 15:08:12 +00003321 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003322}
Mike Stump11289f42009-09-09 15:08:12 +00003323
Douglas Gregorebe10102009-08-20 07:17:43 +00003324template<typename Derived>
3325Sema::OwningStmtResult
Mike Stump11289f42009-09-09 15:08:12 +00003326TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003327 // FIXME: Implement this
3328 assert(false && "Cannot transform an Objective-C @throw statement");
Mike Stump11289f42009-09-09 15:08:12 +00003329 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003330}
Mike Stump11289f42009-09-09 15:08:12 +00003331
Douglas Gregorebe10102009-08-20 07:17:43 +00003332template<typename Derived>
3333Sema::OwningStmtResult
3334TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
Mike Stump11289f42009-09-09 15:08:12 +00003335 ObjCAtSynchronizedStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003336 // FIXME: Implement this
3337 assert(false && "Cannot transform an Objective-C @synchronized statement");
Mike Stump11289f42009-09-09 15:08:12 +00003338 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003339}
3340
3341template<typename Derived>
3342Sema::OwningStmtResult
3343TreeTransform<Derived>::TransformObjCForCollectionStmt(
Mike Stump11289f42009-09-09 15:08:12 +00003344 ObjCForCollectionStmt *S) {
Douglas Gregorebe10102009-08-20 07:17:43 +00003345 // FIXME: Implement this
3346 assert(false && "Cannot transform an Objective-C for-each statement");
Mike Stump11289f42009-09-09 15:08:12 +00003347 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003348}
3349
3350
3351template<typename Derived>
3352Sema::OwningStmtResult
3353TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
3354 // Transform the exception declaration, if any.
3355 VarDecl *Var = 0;
3356 if (S->getExceptionDecl()) {
3357 VarDecl *ExceptionDecl = S->getExceptionDecl();
3358 TemporaryBase Rebase(*this, ExceptionDecl->getLocation(),
3359 ExceptionDecl->getDeclName());
3360
3361 QualType T = getDerived().TransformType(ExceptionDecl->getType());
3362 if (T.isNull())
3363 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003364
Douglas Gregorebe10102009-08-20 07:17:43 +00003365 Var = getDerived().RebuildExceptionDecl(ExceptionDecl,
3366 T,
3367 ExceptionDecl->getDeclaratorInfo(),
3368 ExceptionDecl->getIdentifier(),
3369 ExceptionDecl->getLocation(),
3370 /*FIXME: Inaccurate*/
3371 SourceRange(ExceptionDecl->getLocation()));
3372 if (!Var || Var->isInvalidDecl()) {
3373 if (Var)
3374 Var->Destroy(SemaRef.Context);
3375 return SemaRef.StmtError();
3376 }
3377 }
Mike Stump11289f42009-09-09 15:08:12 +00003378
Douglas Gregorebe10102009-08-20 07:17:43 +00003379 // Transform the actual exception handler.
3380 OwningStmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
3381 if (Handler.isInvalid()) {
3382 if (Var)
3383 Var->Destroy(SemaRef.Context);
3384 return SemaRef.StmtError();
3385 }
Mike Stump11289f42009-09-09 15:08:12 +00003386
Douglas Gregorebe10102009-08-20 07:17:43 +00003387 if (!getDerived().AlwaysRebuild() &&
3388 !Var &&
3389 Handler.get() == S->getHandlerBlock())
Mike Stump11289f42009-09-09 15:08:12 +00003390 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003391
3392 return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(),
3393 Var,
3394 move(Handler));
3395}
Mike Stump11289f42009-09-09 15:08:12 +00003396
Douglas Gregorebe10102009-08-20 07:17:43 +00003397template<typename Derived>
3398Sema::OwningStmtResult
3399TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
3400 // Transform the try block itself.
Mike Stump11289f42009-09-09 15:08:12 +00003401 OwningStmtResult TryBlock
Douglas Gregorebe10102009-08-20 07:17:43 +00003402 = getDerived().TransformCompoundStmt(S->getTryBlock());
3403 if (TryBlock.isInvalid())
3404 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003405
Douglas Gregorebe10102009-08-20 07:17:43 +00003406 // Transform the handlers.
3407 bool HandlerChanged = false;
3408 ASTOwningVector<&ActionBase::DeleteStmt> Handlers(SemaRef);
3409 for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
Mike Stump11289f42009-09-09 15:08:12 +00003410 OwningStmtResult Handler
Douglas Gregorebe10102009-08-20 07:17:43 +00003411 = getDerived().TransformCXXCatchStmt(S->getHandler(I));
3412 if (Handler.isInvalid())
3413 return SemaRef.StmtError();
Mike Stump11289f42009-09-09 15:08:12 +00003414
Douglas Gregorebe10102009-08-20 07:17:43 +00003415 HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
3416 Handlers.push_back(Handler.takeAs<Stmt>());
3417 }
Mike Stump11289f42009-09-09 15:08:12 +00003418
Douglas Gregorebe10102009-08-20 07:17:43 +00003419 if (!getDerived().AlwaysRebuild() &&
3420 TryBlock.get() == S->getTryBlock() &&
3421 !HandlerChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003422 return SemaRef.Owned(S->Retain());
Douglas Gregorebe10102009-08-20 07:17:43 +00003423
3424 return getDerived().RebuildCXXTryStmt(S->getTryLoc(), move(TryBlock),
Mike Stump11289f42009-09-09 15:08:12 +00003425 move_arg(Handlers));
Douglas Gregorebe10102009-08-20 07:17:43 +00003426}
Mike Stump11289f42009-09-09 15:08:12 +00003427
Douglas Gregorebe10102009-08-20 07:17:43 +00003428//===----------------------------------------------------------------------===//
Douglas Gregora16548e2009-08-11 05:31:07 +00003429// Expression transformation
3430//===----------------------------------------------------------------------===//
Mike Stump11289f42009-09-09 15:08:12 +00003431template<typename Derived>
3432Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003433TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E,
3434 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00003435 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003436}
Mike Stump11289f42009-09-09 15:08:12 +00003437
3438template<typename Derived>
3439Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003440TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E,
3441 bool isAddressOfOperand) {
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003442 NestedNameSpecifier *Qualifier = 0;
3443 if (E->getQualifier()) {
3444 Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3445 E->getQualifierRange());
3446 if (!Qualifier)
3447 return SemaRef.ExprError();
3448 }
3449
Mike Stump11289f42009-09-09 15:08:12 +00003450 NamedDecl *ND
Douglas Gregora16548e2009-08-11 05:31:07 +00003451 = dyn_cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getDecl()));
3452 if (!ND)
3453 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003454
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003455 if (!getDerived().AlwaysRebuild() &&
3456 Qualifier == E->getQualifier() &&
3457 ND == E->getDecl() &&
3458 !E->hasExplicitTemplateArgumentList())
Mike Stump11289f42009-09-09 15:08:12 +00003459 return SemaRef.Owned(E->Retain());
3460
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003461 // FIXME: We're losing the explicit template arguments in this transformation.
3462
John McCall0ad16662009-10-29 08:12:44 +00003463 llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003464 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
John McCall0ad16662009-10-29 08:12:44 +00003465 if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
3466 TransArgs[I]))
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003467 return SemaRef.ExprError();
Douglas Gregor4bd90e52009-10-23 18:54:35 +00003468 }
3469
3470 // FIXME: Pass the qualifier/qualifier range along.
3471 return getDerived().RebuildDeclRefExpr(Qualifier, E->getQualifierRange(),
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003472 ND, E->getLocation(),
3473 isAddressOfOperand);
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
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003478TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E,
3479 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00003480 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003481}
Mike Stump11289f42009-09-09 15:08:12 +00003482
Douglas Gregora16548e2009-08-11 05:31:07 +00003483template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003484Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003485TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E,
3486 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00003487 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003488}
Mike Stump11289f42009-09-09 15:08:12 +00003489
Douglas Gregora16548e2009-08-11 05:31:07 +00003490template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003491Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003492TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E,
3493 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00003494 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003495}
Mike Stump11289f42009-09-09 15:08:12 +00003496
Douglas Gregora16548e2009-08-11 05:31:07 +00003497template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003498Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003499TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E,
3500 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00003501 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003502}
Mike Stump11289f42009-09-09 15:08:12 +00003503
Douglas Gregora16548e2009-08-11 05:31:07 +00003504template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003505Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003506TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E,
3507 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00003508 return SemaRef.Owned(E->Retain());
3509}
3510
3511template<typename Derived>
3512Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003513TreeTransform<Derived>::TransformParenExpr(ParenExpr *E,
3514 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003515 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3516 if (SubExpr.isInvalid())
3517 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003518
Douglas Gregora16548e2009-08-11 05:31:07 +00003519 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003520 return SemaRef.Owned(E->Retain());
3521
3522 return getDerived().RebuildParenExpr(move(SubExpr), E->getLParen(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003523 E->getRParen());
3524}
3525
Mike Stump11289f42009-09-09 15:08:12 +00003526template<typename Derived>
3527Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003528TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E,
3529 bool isAddressOfOperand) {
3530 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr(),
3531 E->getOpcode() == UnaryOperator::AddrOf);
Douglas Gregora16548e2009-08-11 05:31:07 +00003532 if (SubExpr.isInvalid())
3533 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003534
Douglas Gregora16548e2009-08-11 05:31:07 +00003535 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003536 return SemaRef.Owned(E->Retain());
3537
Douglas Gregora16548e2009-08-11 05:31:07 +00003538 return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
3539 E->getOpcode(),
3540 move(SubExpr));
3541}
Mike Stump11289f42009-09-09 15:08:12 +00003542
Douglas Gregora16548e2009-08-11 05:31:07 +00003543template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003544Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003545TreeTransform<Derived>::TransformSizeOfAlignOfExpr(SizeOfAlignOfExpr *E,
3546 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003547 if (E->isArgumentType()) {
John McCall4c98fd82009-11-04 07:28:41 +00003548 DeclaratorInfo *OldT = E->getArgumentTypeInfo();
Douglas Gregor3da3c062009-10-28 00:29:27 +00003549
John McCall4c98fd82009-11-04 07:28:41 +00003550 DeclaratorInfo *NewT = getDerived().TransformType(OldT);
3551 if (!NewT)
Douglas Gregora16548e2009-08-11 05:31:07 +00003552 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003553
John McCall4c98fd82009-11-04 07:28:41 +00003554 if (!getDerived().AlwaysRebuild() && OldT == NewT)
Douglas Gregora16548e2009-08-11 05:31:07 +00003555 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003556
John McCall4c98fd82009-11-04 07:28:41 +00003557 return getDerived().RebuildSizeOfAlignOf(NewT, E->getOperatorLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00003558 E->isSizeOf(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003559 E->getSourceRange());
3560 }
Mike Stump11289f42009-09-09 15:08:12 +00003561
Douglas Gregora16548e2009-08-11 05:31:07 +00003562 Sema::OwningExprResult SubExpr(SemaRef);
Mike Stump11289f42009-09-09 15:08:12 +00003563 {
Douglas Gregora16548e2009-08-11 05:31:07 +00003564 // C++0x [expr.sizeof]p1:
3565 // The operand is either an expression, which is an unevaluated operand
3566 // [...]
3567 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
Mike Stump11289f42009-09-09 15:08:12 +00003568
Douglas Gregora16548e2009-08-11 05:31:07 +00003569 SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
3570 if (SubExpr.isInvalid())
3571 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003572
Douglas Gregora16548e2009-08-11 05:31:07 +00003573 if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
3574 return SemaRef.Owned(E->Retain());
3575 }
Mike Stump11289f42009-09-09 15:08:12 +00003576
Douglas Gregora16548e2009-08-11 05:31:07 +00003577 return getDerived().RebuildSizeOfAlignOf(move(SubExpr), E->getOperatorLoc(),
3578 E->isSizeOf(),
3579 E->getSourceRange());
3580}
Mike Stump11289f42009-09-09 15:08:12 +00003581
Douglas Gregora16548e2009-08-11 05:31:07 +00003582template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003583Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003584TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E,
3585 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003586 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3587 if (LHS.isInvalid())
3588 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003589
Douglas Gregora16548e2009-08-11 05:31:07 +00003590 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3591 if (RHS.isInvalid())
3592 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003593
3594
Douglas Gregora16548e2009-08-11 05:31:07 +00003595 if (!getDerived().AlwaysRebuild() &&
3596 LHS.get() == E->getLHS() &&
3597 RHS.get() == E->getRHS())
3598 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003599
Douglas Gregora16548e2009-08-11 05:31:07 +00003600 return getDerived().RebuildArraySubscriptExpr(move(LHS),
3601 /*FIXME:*/E->getLHS()->getLocStart(),
3602 move(RHS),
3603 E->getRBracketLoc());
3604}
Mike Stump11289f42009-09-09 15:08:12 +00003605
3606template<typename Derived>
3607Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003608TreeTransform<Derived>::TransformCallExpr(CallExpr *E,
3609 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003610 // Transform the callee.
3611 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
3612 if (Callee.isInvalid())
3613 return SemaRef.ExprError();
3614
3615 // Transform arguments.
3616 bool ArgChanged = false;
3617 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
3618 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
3619 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
3620 OwningExprResult Arg = getDerived().TransformExpr(E->getArg(I));
3621 if (Arg.isInvalid())
3622 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003623
Douglas Gregora16548e2009-08-11 05:31:07 +00003624 // FIXME: Wrong source location information for the ','.
3625 FakeCommaLocs.push_back(
3626 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
Mike Stump11289f42009-09-09 15:08:12 +00003627
3628 ArgChanged = ArgChanged || Arg.get() != E->getArg(I);
Douglas Gregora16548e2009-08-11 05:31:07 +00003629 Args.push_back(Arg.takeAs<Expr>());
3630 }
Mike Stump11289f42009-09-09 15:08:12 +00003631
Douglas Gregora16548e2009-08-11 05:31:07 +00003632 if (!getDerived().AlwaysRebuild() &&
3633 Callee.get() == E->getCallee() &&
3634 !ArgChanged)
3635 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003636
Douglas Gregora16548e2009-08-11 05:31:07 +00003637 // FIXME: Wrong source location information for the '('.
Mike Stump11289f42009-09-09 15:08:12 +00003638 SourceLocation FakeLParenLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003639 = ((Expr *)Callee.get())->getSourceRange().getBegin();
3640 return getDerived().RebuildCallExpr(move(Callee), FakeLParenLoc,
3641 move_arg(Args),
3642 FakeCommaLocs.data(),
3643 E->getRParenLoc());
3644}
Mike Stump11289f42009-09-09 15:08:12 +00003645
3646template<typename Derived>
3647Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003648TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E,
3649 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003650 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3651 if (Base.isInvalid())
3652 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003653
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003654 NestedNameSpecifier *Qualifier = 0;
3655 if (E->hasQualifier()) {
Mike Stump11289f42009-09-09 15:08:12 +00003656 Qualifier
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003657 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
3658 E->getQualifierRange());
Douglas Gregor84f14dd2009-09-01 00:37:14 +00003659 if (Qualifier == 0)
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003660 return SemaRef.ExprError();
3661 }
Mike Stump11289f42009-09-09 15:08:12 +00003662
3663 NamedDecl *Member
Douglas Gregora16548e2009-08-11 05:31:07 +00003664 = cast_or_null<NamedDecl>(getDerived().TransformDecl(E->getMemberDecl()));
3665 if (!Member)
3666 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003667
Douglas Gregora16548e2009-08-11 05:31:07 +00003668 if (!getDerived().AlwaysRebuild() &&
3669 Base.get() == E->getBase() &&
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003670 Qualifier == E->getQualifier() &&
Douglas Gregorb184f0d2009-11-04 23:20:05 +00003671 Member == E->getMemberDecl() &&
3672 !E->hasExplicitTemplateArgumentList())
Mike Stump11289f42009-09-09 15:08:12 +00003673 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003674
Douglas Gregorb184f0d2009-11-04 23:20:05 +00003675 llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs;
3676 if (E->hasExplicitTemplateArgumentList()) {
3677 TransArgs.resize(E->getNumTemplateArgs());
3678 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
3679 if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
3680 TransArgs[I]))
3681 return SemaRef.ExprError();
3682 }
3683 }
3684
Douglas Gregora16548e2009-08-11 05:31:07 +00003685 // FIXME: Bogus source location for the operator
3686 SourceLocation FakeOperatorLoc
3687 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
3688
3689 return getDerived().RebuildMemberExpr(move(Base), FakeOperatorLoc,
3690 E->isArrow(),
Douglas Gregorf405d7e2009-08-31 23:41:50 +00003691 Qualifier,
3692 E->getQualifierRange(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003693 E->getMemberLoc(),
Douglas Gregorb184f0d2009-11-04 23:20:05 +00003694 Member,
3695 E->hasExplicitTemplateArgumentList(),
3696 E->getLAngleLoc(),
3697 TransArgs.data(),
3698 TransArgs.size(),
3699 E->getRAngleLoc(),
3700 0);
Douglas Gregora16548e2009-08-11 05:31:07 +00003701}
Mike Stump11289f42009-09-09 15:08:12 +00003702
Douglas Gregora16548e2009-08-11 05:31:07 +00003703template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00003704Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003705TreeTransform<Derived>::TransformCastExpr(CastExpr *E,
3706 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00003707 assert(false && "Cannot transform abstract class");
3708 return SemaRef.Owned(E->Retain());
3709}
3710
3711template<typename Derived>
3712Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003713TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E,
3714 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003715 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3716 if (LHS.isInvalid())
3717 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003718
Douglas Gregora16548e2009-08-11 05:31:07 +00003719 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3720 if (RHS.isInvalid())
3721 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003722
Douglas Gregora16548e2009-08-11 05:31:07 +00003723 if (!getDerived().AlwaysRebuild() &&
3724 LHS.get() == E->getLHS() &&
3725 RHS.get() == E->getRHS())
Mike Stump11289f42009-09-09 15:08:12 +00003726 return SemaRef.Owned(E->Retain());
3727
Douglas Gregora16548e2009-08-11 05:31:07 +00003728 return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
3729 move(LHS), move(RHS));
3730}
3731
Mike Stump11289f42009-09-09 15:08:12 +00003732template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00003733Sema::OwningExprResult
3734TreeTransform<Derived>::TransformCompoundAssignOperator(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003735 CompoundAssignOperator *E,
3736 bool isAddressOfOperand) {
3737 return getDerived().TransformBinaryOperator(E, isAddressOfOperand);
Douglas Gregora16548e2009-08-11 05:31:07 +00003738}
Mike Stump11289f42009-09-09 15:08:12 +00003739
Douglas Gregora16548e2009-08-11 05:31:07 +00003740template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003741Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003742TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E,
3743 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003744 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
3745 if (Cond.isInvalid())
3746 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003747
Douglas Gregora16548e2009-08-11 05:31:07 +00003748 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
3749 if (LHS.isInvalid())
3750 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003751
Douglas Gregora16548e2009-08-11 05:31:07 +00003752 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
3753 if (RHS.isInvalid())
3754 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003755
Douglas Gregora16548e2009-08-11 05:31:07 +00003756 if (!getDerived().AlwaysRebuild() &&
3757 Cond.get() == E->getCond() &&
3758 LHS.get() == E->getLHS() &&
3759 RHS.get() == E->getRHS())
3760 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003761
3762 return getDerived().RebuildConditionalOperator(move(Cond),
Douglas Gregor7e112b02009-08-26 14:37:04 +00003763 E->getQuestionLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00003764 move(LHS),
Douglas Gregor7e112b02009-08-26 14:37:04 +00003765 E->getColonLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003766 move(RHS));
3767}
Mike Stump11289f42009-09-09 15:08:12 +00003768
3769template<typename Derived>
3770Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003771TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E,
3772 bool isAddressOfOperand) {
Douglas Gregor3da3c062009-10-28 00:29:27 +00003773 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3774
3775 // FIXME: Will we ever have type information here? It seems like we won't,
3776 // so do we even need to transform the type?
Douglas Gregora16548e2009-08-11 05:31:07 +00003777 QualType T = getDerived().TransformType(E->getType());
3778 if (T.isNull())
3779 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003780
Douglas Gregora16548e2009-08-11 05:31:07 +00003781 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3782 if (SubExpr.isInvalid())
3783 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003784
Douglas Gregora16548e2009-08-11 05:31:07 +00003785 if (!getDerived().AlwaysRebuild() &&
3786 T == E->getType() &&
3787 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003788 return SemaRef.Owned(E->Retain());
3789
Douglas Gregora16548e2009-08-11 05:31:07 +00003790 return getDerived().RebuildImplicitCastExpr(T, E->getCastKind(),
Mike Stump11289f42009-09-09 15:08:12 +00003791 move(SubExpr),
Douglas Gregora16548e2009-08-11 05:31:07 +00003792 E->isLvalueCast());
3793}
Mike Stump11289f42009-09-09 15:08:12 +00003794
Douglas Gregora16548e2009-08-11 05:31:07 +00003795template<typename Derived>
3796Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003797TreeTransform<Derived>::TransformExplicitCastExpr(ExplicitCastExpr *E,
3798 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00003799 assert(false && "Cannot transform abstract class");
3800 return SemaRef.Owned(E->Retain());
3801}
3802
3803template<typename Derived>
3804Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003805TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E,
3806 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003807 QualType T;
3808 {
3809 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00003810 SourceLocation TypeStartLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003811 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3812 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003813
Douglas Gregora16548e2009-08-11 05:31:07 +00003814 T = getDerived().TransformType(E->getTypeAsWritten());
3815 if (T.isNull())
3816 return SemaRef.ExprError();
3817 }
Mike Stump11289f42009-09-09 15:08:12 +00003818
Douglas Gregora16548e2009-08-11 05:31:07 +00003819 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
3820 if (SubExpr.isInvalid())
3821 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003822
Douglas Gregora16548e2009-08-11 05:31:07 +00003823 if (!getDerived().AlwaysRebuild() &&
3824 T == E->getTypeAsWritten() &&
3825 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00003826 return SemaRef.Owned(E->Retain());
3827
Douglas Gregora16548e2009-08-11 05:31:07 +00003828 return getDerived().RebuildCStyleCaseExpr(E->getLParenLoc(), T,
3829 E->getRParenLoc(),
3830 move(SubExpr));
3831}
Mike Stump11289f42009-09-09 15:08:12 +00003832
Douglas Gregora16548e2009-08-11 05:31:07 +00003833template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003834Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003835TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E,
3836 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003837 QualType T;
3838 {
3839 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00003840 SourceLocation FakeTypeLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003841 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
3842 TemporaryBase Rebase(*this, FakeTypeLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00003843
Douglas Gregora16548e2009-08-11 05:31:07 +00003844 T = getDerived().TransformType(E->getType());
3845 if (T.isNull())
3846 return SemaRef.ExprError();
3847 }
Mike Stump11289f42009-09-09 15:08:12 +00003848
Douglas Gregora16548e2009-08-11 05:31:07 +00003849 OwningExprResult Init = getDerived().TransformExpr(E->getInitializer());
3850 if (Init.isInvalid())
3851 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003852
Douglas Gregora16548e2009-08-11 05:31:07 +00003853 if (!getDerived().AlwaysRebuild() &&
3854 T == E->getType() &&
3855 Init.get() == E->getInitializer())
Mike Stump11289f42009-09-09 15:08:12 +00003856 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00003857
3858 return getDerived().RebuildCompoundLiteralExpr(E->getLParenLoc(), T,
3859 /*FIXME:*/E->getInitializer()->getLocEnd(),
3860 move(Init));
3861}
Mike Stump11289f42009-09-09 15:08:12 +00003862
Douglas Gregora16548e2009-08-11 05:31:07 +00003863template<typename Derived>
3864Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003865TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E,
3866 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003867 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
3868 if (Base.isInvalid())
3869 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003870
Douglas Gregora16548e2009-08-11 05:31:07 +00003871 if (!getDerived().AlwaysRebuild() &&
3872 Base.get() == E->getBase())
Mike Stump11289f42009-09-09 15:08:12 +00003873 return SemaRef.Owned(E->Retain());
3874
Douglas Gregora16548e2009-08-11 05:31:07 +00003875 // FIXME: Bad source location
Mike Stump11289f42009-09-09 15:08:12 +00003876 SourceLocation FakeOperatorLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00003877 = SemaRef.PP.getLocForEndOfToken(E->getBase()->getLocEnd());
3878 return getDerived().RebuildExtVectorElementExpr(move(Base), FakeOperatorLoc,
3879 E->getAccessorLoc(),
3880 E->getAccessor());
3881}
Mike Stump11289f42009-09-09 15:08:12 +00003882
Douglas Gregora16548e2009-08-11 05:31:07 +00003883template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003884Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003885TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E,
3886 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003887 bool InitChanged = false;
Mike Stump11289f42009-09-09 15:08:12 +00003888
Douglas Gregora16548e2009-08-11 05:31:07 +00003889 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
3890 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
3891 OwningExprResult Init = getDerived().TransformExpr(E->getInit(I));
3892 if (Init.isInvalid())
3893 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003894
Douglas Gregora16548e2009-08-11 05:31:07 +00003895 InitChanged = InitChanged || Init.get() != E->getInit(I);
3896 Inits.push_back(Init.takeAs<Expr>());
3897 }
Mike Stump11289f42009-09-09 15:08:12 +00003898
Douglas Gregora16548e2009-08-11 05:31:07 +00003899 if (!getDerived().AlwaysRebuild() && !InitChanged)
Mike Stump11289f42009-09-09 15:08:12 +00003900 return SemaRef.Owned(E->Retain());
3901
Douglas Gregora16548e2009-08-11 05:31:07 +00003902 return getDerived().RebuildInitList(E->getLBraceLoc(), move_arg(Inits),
3903 E->getRBraceLoc());
3904}
Mike Stump11289f42009-09-09 15:08:12 +00003905
Douglas Gregora16548e2009-08-11 05:31:07 +00003906template<typename Derived>
3907Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003908TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E,
3909 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003910 Designation Desig;
Mike Stump11289f42009-09-09 15:08:12 +00003911
Douglas Gregorebe10102009-08-20 07:17:43 +00003912 // transform the initializer value
Douglas Gregora16548e2009-08-11 05:31:07 +00003913 OwningExprResult Init = getDerived().TransformExpr(E->getInit());
3914 if (Init.isInvalid())
3915 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003916
Douglas Gregorebe10102009-08-20 07:17:43 +00003917 // transform the designators.
Douglas Gregora16548e2009-08-11 05:31:07 +00003918 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
3919 bool ExprChanged = false;
3920 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
3921 DEnd = E->designators_end();
3922 D != DEnd; ++D) {
3923 if (D->isFieldDesignator()) {
3924 Desig.AddDesignator(Designator::getField(D->getFieldName(),
3925 D->getDotLoc(),
3926 D->getFieldLoc()));
3927 continue;
3928 }
Mike Stump11289f42009-09-09 15:08:12 +00003929
Douglas Gregora16548e2009-08-11 05:31:07 +00003930 if (D->isArrayDesignator()) {
3931 OwningExprResult Index = getDerived().TransformExpr(E->getArrayIndex(*D));
3932 if (Index.isInvalid())
3933 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003934
3935 Desig.AddDesignator(Designator::getArray(Index.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003936 D->getLBracketLoc()));
Mike Stump11289f42009-09-09 15:08:12 +00003937
Douglas Gregora16548e2009-08-11 05:31:07 +00003938 ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(*D);
3939 ArrayExprs.push_back(Index.release());
3940 continue;
3941 }
Mike Stump11289f42009-09-09 15:08:12 +00003942
Douglas Gregora16548e2009-08-11 05:31:07 +00003943 assert(D->isArrayRangeDesignator() && "New kind of designator?");
Mike Stump11289f42009-09-09 15:08:12 +00003944 OwningExprResult Start
Douglas Gregora16548e2009-08-11 05:31:07 +00003945 = getDerived().TransformExpr(E->getArrayRangeStart(*D));
3946 if (Start.isInvalid())
3947 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003948
Douglas Gregora16548e2009-08-11 05:31:07 +00003949 OwningExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(*D));
3950 if (End.isInvalid())
3951 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003952
3953 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
Douglas Gregora16548e2009-08-11 05:31:07 +00003954 End.get(),
3955 D->getLBracketLoc(),
3956 D->getEllipsisLoc()));
Mike Stump11289f42009-09-09 15:08:12 +00003957
Douglas Gregora16548e2009-08-11 05:31:07 +00003958 ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(*D) ||
3959 End.get() != E->getArrayRangeEnd(*D);
Mike Stump11289f42009-09-09 15:08:12 +00003960
Douglas Gregora16548e2009-08-11 05:31:07 +00003961 ArrayExprs.push_back(Start.release());
3962 ArrayExprs.push_back(End.release());
3963 }
Mike Stump11289f42009-09-09 15:08:12 +00003964
Douglas Gregora16548e2009-08-11 05:31:07 +00003965 if (!getDerived().AlwaysRebuild() &&
3966 Init.get() == E->getInit() &&
3967 !ExprChanged)
3968 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00003969
Douglas Gregora16548e2009-08-11 05:31:07 +00003970 return getDerived().RebuildDesignatedInitExpr(Desig, move_arg(ArrayExprs),
3971 E->getEqualOrColonLoc(),
3972 E->usesGNUSyntax(), move(Init));
3973}
Mike Stump11289f42009-09-09 15:08:12 +00003974
Douglas Gregora16548e2009-08-11 05:31:07 +00003975template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003976Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00003977TreeTransform<Derived>::TransformImplicitValueInitExpr(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003978 ImplicitValueInitExpr *E,
3979 bool isAddressOfOperand) {
Douglas Gregor3da3c062009-10-28 00:29:27 +00003980 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
3981
3982 // FIXME: Will we ever have proper type location here? Will we actually
3983 // need to transform the type?
Douglas Gregora16548e2009-08-11 05:31:07 +00003984 QualType T = getDerived().TransformType(E->getType());
3985 if (T.isNull())
3986 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00003987
Douglas Gregora16548e2009-08-11 05:31:07 +00003988 if (!getDerived().AlwaysRebuild() &&
3989 T == E->getType())
Mike Stump11289f42009-09-09 15:08:12 +00003990 return SemaRef.Owned(E->Retain());
3991
Douglas Gregora16548e2009-08-11 05:31:07 +00003992 return getDerived().RebuildImplicitValueInitExpr(T);
3993}
Mike Stump11289f42009-09-09 15:08:12 +00003994
Douglas Gregora16548e2009-08-11 05:31:07 +00003995template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00003996Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00003997TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E,
3998 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00003999 // FIXME: Do we want the type as written?
4000 QualType T;
Mike Stump11289f42009-09-09 15:08:12 +00004001
Douglas Gregora16548e2009-08-11 05:31:07 +00004002 {
4003 // FIXME: Source location isn't quite accurate.
4004 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
4005 T = getDerived().TransformType(E->getType());
4006 if (T.isNull())
4007 return SemaRef.ExprError();
4008 }
Mike Stump11289f42009-09-09 15:08:12 +00004009
Douglas Gregora16548e2009-08-11 05:31:07 +00004010 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4011 if (SubExpr.isInvalid())
4012 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004013
Douglas Gregora16548e2009-08-11 05:31:07 +00004014 if (!getDerived().AlwaysRebuild() &&
4015 T == E->getType() &&
4016 SubExpr.get() == E->getSubExpr())
4017 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004018
Douglas Gregora16548e2009-08-11 05:31:07 +00004019 return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), move(SubExpr),
4020 T, E->getRParenLoc());
4021}
4022
4023template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004024Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004025TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E,
4026 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004027 bool ArgumentChanged = false;
4028 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
4029 for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
4030 OwningExprResult Init = getDerived().TransformExpr(E->getExpr(I));
4031 if (Init.isInvalid())
4032 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004033
Douglas Gregora16548e2009-08-11 05:31:07 +00004034 ArgumentChanged = ArgumentChanged || Init.get() != E->getExpr(I);
4035 Inits.push_back(Init.takeAs<Expr>());
4036 }
Mike Stump11289f42009-09-09 15:08:12 +00004037
Douglas Gregora16548e2009-08-11 05:31:07 +00004038 return getDerived().RebuildParenListExpr(E->getLParenLoc(),
4039 move_arg(Inits),
4040 E->getRParenLoc());
4041}
Mike Stump11289f42009-09-09 15:08:12 +00004042
Douglas Gregora16548e2009-08-11 05:31:07 +00004043/// \brief Transform an address-of-label expression.
4044///
4045/// By default, the transformation of an address-of-label expression always
4046/// rebuilds the expression, so that the label identifier can be resolved to
4047/// the corresponding label statement by semantic analysis.
4048template<typename Derived>
4049Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004050TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E,
4051 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004052 return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
4053 E->getLabel());
4054}
Mike Stump11289f42009-09-09 15:08:12 +00004055
4056template<typename Derived>
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004057Sema::OwningExprResult
4058TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E,
4059 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00004060 OwningStmtResult SubStmt
Douglas Gregora16548e2009-08-11 05:31:07 +00004061 = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
4062 if (SubStmt.isInvalid())
4063 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004064
Douglas Gregora16548e2009-08-11 05:31:07 +00004065 if (!getDerived().AlwaysRebuild() &&
4066 SubStmt.get() == E->getSubStmt())
4067 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004068
4069 return getDerived().RebuildStmtExpr(E->getLParenLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004070 move(SubStmt),
4071 E->getRParenLoc());
4072}
Mike Stump11289f42009-09-09 15:08:12 +00004073
Douglas Gregora16548e2009-08-11 05:31:07 +00004074template<typename Derived>
4075Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004076TreeTransform<Derived>::TransformTypesCompatibleExpr(TypesCompatibleExpr *E,
4077 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004078 QualType T1, T2;
4079 {
4080 // FIXME: Source location isn't quite accurate.
4081 TemporaryBase Rebase(*this, E->getBuiltinLoc(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004082
Douglas Gregora16548e2009-08-11 05:31:07 +00004083 T1 = getDerived().TransformType(E->getArgType1());
4084 if (T1.isNull())
4085 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004086
Douglas Gregora16548e2009-08-11 05:31:07 +00004087 T2 = getDerived().TransformType(E->getArgType2());
4088 if (T2.isNull())
4089 return SemaRef.ExprError();
4090 }
4091
4092 if (!getDerived().AlwaysRebuild() &&
4093 T1 == E->getArgType1() &&
4094 T2 == E->getArgType2())
Mike Stump11289f42009-09-09 15:08:12 +00004095 return SemaRef.Owned(E->Retain());
4096
Douglas Gregora16548e2009-08-11 05:31:07 +00004097 return getDerived().RebuildTypesCompatibleExpr(E->getBuiltinLoc(),
4098 T1, T2, E->getRParenLoc());
4099}
Mike Stump11289f42009-09-09 15:08:12 +00004100
Douglas Gregora16548e2009-08-11 05:31:07 +00004101template<typename Derived>
4102Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004103TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E,
4104 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004105 OwningExprResult Cond = getDerived().TransformExpr(E->getCond());
4106 if (Cond.isInvalid())
4107 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004108
Douglas Gregora16548e2009-08-11 05:31:07 +00004109 OwningExprResult LHS = getDerived().TransformExpr(E->getLHS());
4110 if (LHS.isInvalid())
4111 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004112
Douglas Gregora16548e2009-08-11 05:31:07 +00004113 OwningExprResult RHS = getDerived().TransformExpr(E->getRHS());
4114 if (RHS.isInvalid())
4115 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004116
Douglas Gregora16548e2009-08-11 05:31:07 +00004117 if (!getDerived().AlwaysRebuild() &&
4118 Cond.get() == E->getCond() &&
4119 LHS.get() == E->getLHS() &&
4120 RHS.get() == E->getRHS())
Mike Stump11289f42009-09-09 15:08:12 +00004121 return SemaRef.Owned(E->Retain());
4122
Douglas Gregora16548e2009-08-11 05:31:07 +00004123 return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
4124 move(Cond), move(LHS), move(RHS),
4125 E->getRParenLoc());
4126}
Mike Stump11289f42009-09-09 15:08:12 +00004127
Douglas Gregora16548e2009-08-11 05:31:07 +00004128template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004129Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004130TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E,
4131 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00004132 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004133}
4134
4135template<typename Derived>
4136Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004137TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E,
4138 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004139 OwningExprResult Callee = getDerived().TransformExpr(E->getCallee());
4140 if (Callee.isInvalid())
4141 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004142
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004143 OwningExprResult First
4144 = getDerived().TransformExpr(E->getArg(0),
4145 E->getNumArgs() == 1 && E->getOperator() == OO_Amp);
Douglas Gregora16548e2009-08-11 05:31:07 +00004146 if (First.isInvalid())
4147 return SemaRef.ExprError();
4148
4149 OwningExprResult Second(SemaRef);
4150 if (E->getNumArgs() == 2) {
4151 Second = getDerived().TransformExpr(E->getArg(1));
4152 if (Second.isInvalid())
4153 return SemaRef.ExprError();
4154 }
Mike Stump11289f42009-09-09 15:08:12 +00004155
Douglas Gregora16548e2009-08-11 05:31:07 +00004156 if (!getDerived().AlwaysRebuild() &&
4157 Callee.get() == E->getCallee() &&
4158 First.get() == E->getArg(0) &&
Mike Stump11289f42009-09-09 15:08:12 +00004159 (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
4160 return SemaRef.Owned(E->Retain());
4161
Douglas Gregora16548e2009-08-11 05:31:07 +00004162 return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
4163 E->getOperatorLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00004164 move(Callee),
Douglas Gregora16548e2009-08-11 05:31:07 +00004165 move(First),
4166 move(Second));
4167}
Mike Stump11289f42009-09-09 15:08:12 +00004168
Douglas Gregora16548e2009-08-11 05:31:07 +00004169template<typename Derived>
4170Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004171TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E,
4172 bool isAddressOfOperand) {
4173 return getDerived().TransformCallExpr(E, isAddressOfOperand);
Douglas Gregora16548e2009-08-11 05:31:07 +00004174}
Mike Stump11289f42009-09-09 15:08:12 +00004175
Douglas Gregora16548e2009-08-11 05:31:07 +00004176template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004177Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004178TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E,
4179 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004180 QualType ExplicitTy;
4181 {
4182 // FIXME: Source location isn't quite accurate.
Mike Stump11289f42009-09-09 15:08:12 +00004183 SourceLocation TypeStartLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00004184 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4185 TemporaryBase Rebase(*this, TypeStartLoc, DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004186
Douglas Gregora16548e2009-08-11 05:31:07 +00004187 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
4188 if (ExplicitTy.isNull())
4189 return SemaRef.ExprError();
4190 }
Mike Stump11289f42009-09-09 15:08:12 +00004191
Douglas Gregora16548e2009-08-11 05:31:07 +00004192 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4193 if (SubExpr.isInvalid())
4194 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004195
Douglas Gregora16548e2009-08-11 05:31:07 +00004196 if (!getDerived().AlwaysRebuild() &&
4197 ExplicitTy == E->getTypeAsWritten() &&
4198 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00004199 return SemaRef.Owned(E->Retain());
4200
Douglas Gregora16548e2009-08-11 05:31:07 +00004201 // FIXME: Poor source location information here.
Mike Stump11289f42009-09-09 15:08:12 +00004202 SourceLocation FakeLAngleLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00004203 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
4204 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
4205 SourceLocation FakeRParenLoc
4206 = SemaRef.PP.getLocForEndOfToken(
4207 E->getSubExpr()->getSourceRange().getEnd());
4208 return getDerived().RebuildCXXNamedCastExpr(E->getOperatorLoc(),
Mike Stump11289f42009-09-09 15:08:12 +00004209 E->getStmtClass(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004210 FakeLAngleLoc,
4211 ExplicitTy,
4212 FakeRAngleLoc,
4213 FakeRAngleLoc,
4214 move(SubExpr),
4215 FakeRParenLoc);
4216}
Mike Stump11289f42009-09-09 15:08:12 +00004217
Douglas Gregora16548e2009-08-11 05:31:07 +00004218template<typename Derived>
4219Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004220TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E,
4221 bool isAddressOfOperand) {
4222 return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand);
Douglas Gregora16548e2009-08-11 05:31:07 +00004223}
Mike Stump11289f42009-09-09 15:08:12 +00004224
4225template<typename Derived>
4226Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004227TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E,
4228 bool isAddressOfOperand) {
4229 return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand);
Mike Stump11289f42009-09-09 15:08:12 +00004230}
4231
Douglas Gregora16548e2009-08-11 05:31:07 +00004232template<typename Derived>
4233Sema::OwningExprResult
4234TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004235 CXXReinterpretCastExpr *E,
4236 bool isAddressOfOperand) {
4237 return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand);
Douglas Gregora16548e2009-08-11 05:31:07 +00004238}
Mike Stump11289f42009-09-09 15:08:12 +00004239
Douglas Gregora16548e2009-08-11 05:31:07 +00004240template<typename Derived>
4241Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004242TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E,
4243 bool isAddressOfOperand) {
4244 return getDerived().TransformCXXNamedCastExpr(E, isAddressOfOperand);
Douglas Gregora16548e2009-08-11 05:31:07 +00004245}
Mike Stump11289f42009-09-09 15:08:12 +00004246
Douglas Gregora16548e2009-08-11 05:31:07 +00004247template<typename Derived>
4248Sema::OwningExprResult
4249TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004250 CXXFunctionalCastExpr *E,
4251 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004252 QualType ExplicitTy;
4253 {
4254 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004255
Douglas Gregora16548e2009-08-11 05:31:07 +00004256 ExplicitTy = getDerived().TransformType(E->getTypeAsWritten());
4257 if (ExplicitTy.isNull())
4258 return SemaRef.ExprError();
4259 }
Mike Stump11289f42009-09-09 15:08:12 +00004260
Douglas Gregora16548e2009-08-11 05:31:07 +00004261 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4262 if (SubExpr.isInvalid())
4263 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004264
Douglas Gregora16548e2009-08-11 05:31:07 +00004265 if (!getDerived().AlwaysRebuild() &&
4266 ExplicitTy == E->getTypeAsWritten() &&
4267 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00004268 return SemaRef.Owned(E->Retain());
4269
Douglas Gregora16548e2009-08-11 05:31:07 +00004270 // FIXME: The end of the type's source range is wrong
4271 return getDerived().RebuildCXXFunctionalCastExpr(
4272 /*FIXME:*/SourceRange(E->getTypeBeginLoc()),
4273 ExplicitTy,
4274 /*FIXME:*/E->getSubExpr()->getLocStart(),
4275 move(SubExpr),
4276 E->getRParenLoc());
4277}
Mike Stump11289f42009-09-09 15:08:12 +00004278
Douglas Gregora16548e2009-08-11 05:31:07 +00004279template<typename Derived>
4280Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004281TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E,
4282 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004283 if (E->isTypeOperand()) {
4284 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004285
Douglas Gregora16548e2009-08-11 05:31:07 +00004286 QualType T = getDerived().TransformType(E->getTypeOperand());
4287 if (T.isNull())
4288 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004289
Douglas Gregora16548e2009-08-11 05:31:07 +00004290 if (!getDerived().AlwaysRebuild() &&
4291 T == E->getTypeOperand())
4292 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004293
Douglas Gregora16548e2009-08-11 05:31:07 +00004294 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4295 /*FIXME:*/E->getLocStart(),
4296 T,
4297 E->getLocEnd());
4298 }
Mike Stump11289f42009-09-09 15:08:12 +00004299
Douglas Gregora16548e2009-08-11 05:31:07 +00004300 // We don't know whether the expression is potentially evaluated until
4301 // after we perform semantic analysis, so the expression is potentially
4302 // potentially evaluated.
Mike Stump11289f42009-09-09 15:08:12 +00004303 EnterExpressionEvaluationContext Unevaluated(SemaRef,
Douglas Gregora16548e2009-08-11 05:31:07 +00004304 Action::PotentiallyPotentiallyEvaluated);
Mike Stump11289f42009-09-09 15:08:12 +00004305
Douglas Gregora16548e2009-08-11 05:31:07 +00004306 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
4307 if (SubExpr.isInvalid())
4308 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004309
Douglas Gregora16548e2009-08-11 05:31:07 +00004310 if (!getDerived().AlwaysRebuild() &&
4311 SubExpr.get() == E->getExprOperand())
Mike Stump11289f42009-09-09 15:08:12 +00004312 return SemaRef.Owned(E->Retain());
4313
Douglas Gregora16548e2009-08-11 05:31:07 +00004314 return getDerived().RebuildCXXTypeidExpr(E->getLocStart(),
4315 /*FIXME:*/E->getLocStart(),
4316 move(SubExpr),
4317 E->getLocEnd());
4318}
4319
4320template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00004321Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004322TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E,
4323 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00004324 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004325}
Mike Stump11289f42009-09-09 15:08:12 +00004326
Douglas Gregora16548e2009-08-11 05:31:07 +00004327template<typename Derived>
4328Sema::OwningExprResult
4329TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004330 CXXNullPtrLiteralExpr *E,
4331 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00004332 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004333}
Mike Stump11289f42009-09-09 15:08:12 +00004334
Douglas Gregora16548e2009-08-11 05:31:07 +00004335template<typename Derived>
4336Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004337TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E,
4338 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004339 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004340
Douglas Gregora16548e2009-08-11 05:31:07 +00004341 QualType T = getDerived().TransformType(E->getType());
4342 if (T.isNull())
4343 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004344
Douglas Gregora16548e2009-08-11 05:31:07 +00004345 if (!getDerived().AlwaysRebuild() &&
4346 T == E->getType())
4347 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004348
Douglas Gregora16548e2009-08-11 05:31:07 +00004349 return getDerived().RebuildCXXThisExpr(E->getLocStart(), T);
4350}
Mike Stump11289f42009-09-09 15:08:12 +00004351
Douglas Gregora16548e2009-08-11 05:31:07 +00004352template<typename Derived>
4353Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004354TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E,
4355 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004356 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4357 if (SubExpr.isInvalid())
4358 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004359
Douglas Gregora16548e2009-08-11 05:31:07 +00004360 if (!getDerived().AlwaysRebuild() &&
4361 SubExpr.get() == E->getSubExpr())
Mike Stump11289f42009-09-09 15:08:12 +00004362 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004363
4364 return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), move(SubExpr));
4365}
Mike Stump11289f42009-09-09 15:08:12 +00004366
Douglas Gregora16548e2009-08-11 05:31:07 +00004367template<typename Derived>
4368Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004369TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E,
4370 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00004371 ParmVarDecl *Param
Douglas Gregora16548e2009-08-11 05:31:07 +00004372 = cast_or_null<ParmVarDecl>(getDerived().TransformDecl(E->getParam()));
4373 if (!Param)
4374 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004375
Douglas Gregora16548e2009-08-11 05:31:07 +00004376 if (getDerived().AlwaysRebuild() &&
4377 Param == E->getParam())
4378 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004379
Douglas Gregora16548e2009-08-11 05:31:07 +00004380 return getDerived().RebuildCXXDefaultArgExpr(Param);
4381}
Mike Stump11289f42009-09-09 15:08:12 +00004382
Douglas Gregora16548e2009-08-11 05:31:07 +00004383template<typename Derived>
4384Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004385TreeTransform<Derived>::TransformCXXZeroInitValueExpr(CXXZeroInitValueExpr *E,
4386 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004387 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4388
4389 QualType T = getDerived().TransformType(E->getType());
4390 if (T.isNull())
4391 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004392
Douglas Gregora16548e2009-08-11 05:31:07 +00004393 if (!getDerived().AlwaysRebuild() &&
4394 T == E->getType())
Mike Stump11289f42009-09-09 15:08:12 +00004395 return SemaRef.Owned(E->Retain());
4396
4397 return getDerived().RebuildCXXZeroInitValueExpr(E->getTypeBeginLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004398 /*FIXME:*/E->getTypeBeginLoc(),
4399 T,
4400 E->getRParenLoc());
4401}
Mike Stump11289f42009-09-09 15:08:12 +00004402
Douglas Gregora16548e2009-08-11 05:31:07 +00004403template<typename Derived>
4404Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004405TreeTransform<Derived>::TransformCXXConditionDeclExpr(CXXConditionDeclExpr *E,
4406 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00004407 VarDecl *Var
Douglas Gregorebe10102009-08-20 07:17:43 +00004408 = cast_or_null<VarDecl>(getDerived().TransformDefinition(E->getVarDecl()));
Douglas Gregora16548e2009-08-11 05:31:07 +00004409 if (!Var)
4410 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004411
Douglas Gregora16548e2009-08-11 05:31:07 +00004412 if (!getDerived().AlwaysRebuild() &&
Mike Stump11289f42009-09-09 15:08:12 +00004413 Var == E->getVarDecl())
Douglas Gregora16548e2009-08-11 05:31:07 +00004414 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004415
4416 return getDerived().RebuildCXXConditionDeclExpr(E->getStartLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004417 /*FIXME:*/E->getStartLoc(),
4418 Var);
4419}
Mike Stump11289f42009-09-09 15:08:12 +00004420
Douglas Gregora16548e2009-08-11 05:31:07 +00004421template<typename Derived>
4422Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004423TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E,
4424 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004425 // Transform the type that we're allocating
4426 TemporaryBase Rebase(*this, E->getLocStart(), DeclarationName());
4427 QualType AllocType = getDerived().TransformType(E->getAllocatedType());
4428 if (AllocType.isNull())
4429 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004430
Douglas Gregora16548e2009-08-11 05:31:07 +00004431 // Transform the size of the array we're allocating (if any).
4432 OwningExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
4433 if (ArraySize.isInvalid())
4434 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004435
Douglas Gregora16548e2009-08-11 05:31:07 +00004436 // Transform the placement arguments (if any).
4437 bool ArgumentChanged = false;
4438 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
4439 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
4440 OwningExprResult Arg = getDerived().TransformExpr(E->getPlacementArg(I));
4441 if (Arg.isInvalid())
4442 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004443
Douglas Gregora16548e2009-08-11 05:31:07 +00004444 ArgumentChanged = ArgumentChanged || Arg.get() != E->getPlacementArg(I);
4445 PlacementArgs.push_back(Arg.take());
4446 }
Mike Stump11289f42009-09-09 15:08:12 +00004447
Douglas Gregorebe10102009-08-20 07:17:43 +00004448 // transform the constructor arguments (if any).
Douglas Gregora16548e2009-08-11 05:31:07 +00004449 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
4450 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
4451 OwningExprResult Arg = getDerived().TransformExpr(E->getConstructorArg(I));
4452 if (Arg.isInvalid())
4453 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004454
Douglas Gregora16548e2009-08-11 05:31:07 +00004455 ArgumentChanged = ArgumentChanged || Arg.get() != E->getConstructorArg(I);
4456 ConstructorArgs.push_back(Arg.take());
4457 }
Mike Stump11289f42009-09-09 15:08:12 +00004458
Douglas Gregora16548e2009-08-11 05:31:07 +00004459 if (!getDerived().AlwaysRebuild() &&
4460 AllocType == E->getAllocatedType() &&
4461 ArraySize.get() == E->getArraySize() &&
4462 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00004463 return SemaRef.Owned(E->Retain());
4464
Douglas Gregora16548e2009-08-11 05:31:07 +00004465 return getDerived().RebuildCXXNewExpr(E->getLocStart(),
4466 E->isGlobalNew(),
4467 /*FIXME:*/E->getLocStart(),
4468 move_arg(PlacementArgs),
4469 /*FIXME:*/E->getLocStart(),
4470 E->isParenTypeId(),
4471 AllocType,
4472 /*FIXME:*/E->getLocStart(),
4473 /*FIXME:*/SourceRange(),
4474 move(ArraySize),
4475 /*FIXME:*/E->getLocStart(),
4476 move_arg(ConstructorArgs),
Mike Stump11289f42009-09-09 15:08:12 +00004477 E->getLocEnd());
Douglas Gregora16548e2009-08-11 05:31:07 +00004478}
Mike Stump11289f42009-09-09 15:08:12 +00004479
Douglas Gregora16548e2009-08-11 05:31:07 +00004480template<typename Derived>
4481Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004482TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E,
4483 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004484 OwningExprResult Operand = getDerived().TransformExpr(E->getArgument());
4485 if (Operand.isInvalid())
4486 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004487
Douglas Gregora16548e2009-08-11 05:31:07 +00004488 if (!getDerived().AlwaysRebuild() &&
Mike Stump11289f42009-09-09 15:08:12 +00004489 Operand.get() == E->getArgument())
4490 return SemaRef.Owned(E->Retain());
4491
Douglas Gregora16548e2009-08-11 05:31:07 +00004492 return getDerived().RebuildCXXDeleteExpr(E->getLocStart(),
4493 E->isGlobalDelete(),
4494 E->isArrayForm(),
4495 move(Operand));
4496}
Mike Stump11289f42009-09-09 15:08:12 +00004497
Douglas Gregora16548e2009-08-11 05:31:07 +00004498template<typename Derived>
4499Sema::OwningExprResult
Douglas Gregorad8a3362009-09-04 17:36:40 +00004500TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004501 CXXPseudoDestructorExpr *E,
4502 bool isAddressOfOperand) {
Douglas Gregorad8a3362009-09-04 17:36:40 +00004503 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4504 if (Base.isInvalid())
4505 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004506
Douglas Gregorad8a3362009-09-04 17:36:40 +00004507 NestedNameSpecifier *Qualifier
4508 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4509 E->getQualifierRange());
4510 if (E->getQualifier() && !Qualifier)
4511 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004512
Douglas Gregorad8a3362009-09-04 17:36:40 +00004513 QualType DestroyedType;
4514 {
4515 TemporaryBase Rebase(*this, E->getDestroyedTypeLoc(), DeclarationName());
4516 DestroyedType = getDerived().TransformType(E->getDestroyedType());
4517 if (DestroyedType.isNull())
4518 return SemaRef.ExprError();
4519 }
Mike Stump11289f42009-09-09 15:08:12 +00004520
Douglas Gregorad8a3362009-09-04 17:36:40 +00004521 if (!getDerived().AlwaysRebuild() &&
4522 Base.get() == E->getBase() &&
4523 Qualifier == E->getQualifier() &&
4524 DestroyedType == E->getDestroyedType())
4525 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004526
Douglas Gregorad8a3362009-09-04 17:36:40 +00004527 return getDerived().RebuildCXXPseudoDestructorExpr(move(Base),
4528 E->getOperatorLoc(),
4529 E->isArrow(),
4530 E->getDestroyedTypeLoc(),
4531 DestroyedType,
4532 Qualifier,
4533 E->getQualifierRange());
4534}
Mike Stump11289f42009-09-09 15:08:12 +00004535
Douglas Gregorad8a3362009-09-04 17:36:40 +00004536template<typename Derived>
4537Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004538TreeTransform<Derived>::TransformUnresolvedFunctionNameExpr(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004539 UnresolvedFunctionNameExpr *E,
4540 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004541 // There is no transformation we can apply to an unresolved function name.
Mike Stump11289f42009-09-09 15:08:12 +00004542 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004543}
Mike Stump11289f42009-09-09 15:08:12 +00004544
Douglas Gregora16548e2009-08-11 05:31:07 +00004545template<typename Derived>
4546Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004547TreeTransform<Derived>::TransformUnaryTypeTraitExpr(UnaryTypeTraitExpr *E,
4548 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004549 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
Mike Stump11289f42009-09-09 15:08:12 +00004550
Douglas Gregora16548e2009-08-11 05:31:07 +00004551 QualType T = getDerived().TransformType(E->getQueriedType());
4552 if (T.isNull())
4553 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004554
Douglas Gregora16548e2009-08-11 05:31:07 +00004555 if (!getDerived().AlwaysRebuild() &&
4556 T == E->getQueriedType())
4557 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004558
Douglas Gregora16548e2009-08-11 05:31:07 +00004559 // FIXME: Bad location information
4560 SourceLocation FakeLParenLoc
4561 = SemaRef.PP.getLocForEndOfToken(E->getLocStart());
Mike Stump11289f42009-09-09 15:08:12 +00004562
4563 return getDerived().RebuildUnaryTypeTrait(E->getTrait(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004564 E->getLocStart(),
4565 /*FIXME:*/FakeLParenLoc,
4566 T,
4567 E->getLocEnd());
4568}
Mike Stump11289f42009-09-09 15:08:12 +00004569
Douglas Gregora16548e2009-08-11 05:31:07 +00004570template<typename Derived>
4571Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00004572TreeTransform<Derived>::TransformUnresolvedDeclRefExpr(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004573 UnresolvedDeclRefExpr *E,
4574 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004575 NestedNameSpecifier *NNS
Douglas Gregord019ff62009-10-22 17:20:55 +00004576 = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4577 E->getQualifierRange());
Douglas Gregora16548e2009-08-11 05:31:07 +00004578 if (!NNS)
4579 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004580
4581 DeclarationName Name
Douglas Gregorf816bd72009-09-03 22:13:48 +00004582 = getDerived().TransformDeclarationName(E->getDeclName(), E->getLocation());
4583 if (!Name)
4584 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004585
4586 if (!getDerived().AlwaysRebuild() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00004587 NNS == E->getQualifier() &&
4588 Name == E->getDeclName())
Mike Stump11289f42009-09-09 15:08:12 +00004589 return SemaRef.Owned(E->Retain());
4590
4591 return getDerived().RebuildUnresolvedDeclRefExpr(NNS,
Douglas Gregora16548e2009-08-11 05:31:07 +00004592 E->getQualifierRange(),
4593 Name,
4594 E->getLocation(),
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004595 isAddressOfOperand);
Douglas Gregora16548e2009-08-11 05:31:07 +00004596}
4597
4598template<typename Derived>
4599Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004600TreeTransform<Derived>::TransformTemplateIdRefExpr(TemplateIdRefExpr *E,
4601 bool isAddressOfOperand) {
Douglas Gregorba91b892009-10-29 17:56:10 +00004602 TemporaryBase Rebase(*this, E->getTemplateNameLoc(), DeclarationName());
4603
Mike Stump11289f42009-09-09 15:08:12 +00004604 TemplateName Template
Douglas Gregora16548e2009-08-11 05:31:07 +00004605 = getDerived().TransformTemplateName(E->getTemplateName());
4606 if (Template.isNull())
4607 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004608
Douglas Gregord019ff62009-10-22 17:20:55 +00004609 NestedNameSpecifier *Qualifier = 0;
4610 if (E->getQualifier()) {
4611 Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4612 E->getQualifierRange());
4613 if (!Qualifier)
4614 return SemaRef.ExprError();
4615 }
4616
John McCall0ad16662009-10-29 08:12:44 +00004617 llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
Douglas Gregora16548e2009-08-11 05:31:07 +00004618 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
John McCall0ad16662009-10-29 08:12:44 +00004619 if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
4620 TransArgs[I]))
Douglas Gregora16548e2009-08-11 05:31:07 +00004621 return SemaRef.ExprError();
Douglas Gregora16548e2009-08-11 05:31:07 +00004622 }
4623
4624 // FIXME: Would like to avoid rebuilding if nothing changed, but we can't
4625 // compare template arguments (yet).
Mike Stump11289f42009-09-09 15:08:12 +00004626
4627 // FIXME: It's possible that we'll find out now that the template name
Douglas Gregora16548e2009-08-11 05:31:07 +00004628 // actually refers to a type, in which case the caller is actually dealing
4629 // with a functional cast. Give a reasonable error message!
Douglas Gregord019ff62009-10-22 17:20:55 +00004630 return getDerived().RebuildTemplateIdExpr(Qualifier, E->getQualifierRange(),
4631 Template, E->getTemplateNameLoc(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004632 E->getLAngleLoc(),
4633 TransArgs.data(),
4634 TransArgs.size(),
4635 E->getRAngleLoc());
4636}
4637
4638template<typename Derived>
4639Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004640TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E,
4641 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004642 TemporaryBase Rebase(*this, /*FIXME*/E->getLocStart(), DeclarationName());
4643
4644 QualType T = getDerived().TransformType(E->getType());
4645 if (T.isNull())
4646 return SemaRef.ExprError();
4647
4648 CXXConstructorDecl *Constructor
4649 = cast_or_null<CXXConstructorDecl>(
4650 getDerived().TransformDecl(E->getConstructor()));
4651 if (!Constructor)
4652 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004653
Douglas Gregora16548e2009-08-11 05:31:07 +00004654 bool ArgumentChanged = false;
4655 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Mike Stump11289f42009-09-09 15:08:12 +00004656 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004657 ArgEnd = E->arg_end();
4658 Arg != ArgEnd; ++Arg) {
4659 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4660 if (TransArg.isInvalid())
4661 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004662
Douglas Gregora16548e2009-08-11 05:31:07 +00004663 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4664 Args.push_back(TransArg.takeAs<Expr>());
4665 }
4666
4667 if (!getDerived().AlwaysRebuild() &&
4668 T == E->getType() &&
4669 Constructor == E->getConstructor() &&
4670 !ArgumentChanged)
4671 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004672
Douglas Gregora16548e2009-08-11 05:31:07 +00004673 return getDerived().RebuildCXXConstructExpr(T, Constructor, E->isElidable(),
4674 move_arg(Args));
4675}
Mike Stump11289f42009-09-09 15:08:12 +00004676
Douglas Gregora16548e2009-08-11 05:31:07 +00004677/// \brief Transform a C++ temporary-binding expression.
4678///
Mike Stump11289f42009-09-09 15:08:12 +00004679/// The transformation of a temporary-binding expression always attempts to
4680/// bind a new temporary variable to its subexpression, even if the
Douglas Gregora16548e2009-08-11 05:31:07 +00004681/// subexpression itself did not change, because the temporary variable itself
4682/// must be unique.
4683template<typename Derived>
4684Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004685TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E,
4686 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004687 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4688 if (SubExpr.isInvalid())
4689 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004690
Douglas Gregora16548e2009-08-11 05:31:07 +00004691 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
4692}
Mike Stump11289f42009-09-09 15:08:12 +00004693
4694/// \brief Transform a C++ expression that contains temporaries that should
Douglas Gregora16548e2009-08-11 05:31:07 +00004695/// be destroyed after the expression is evaluated.
4696///
Mike Stump11289f42009-09-09 15:08:12 +00004697/// The transformation of a full expression always attempts to build a new
4698/// CXXExprWithTemporaries expression, even if the
Douglas Gregora16548e2009-08-11 05:31:07 +00004699/// subexpression itself did not change, because it will need to capture the
4700/// the new temporary variables introduced in the subexpression.
4701template<typename Derived>
4702Sema::OwningExprResult
4703TreeTransform<Derived>::TransformCXXExprWithTemporaries(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004704 CXXExprWithTemporaries *E,
4705 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004706 OwningExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
4707 if (SubExpr.isInvalid())
4708 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004709
Douglas Gregora16548e2009-08-11 05:31:07 +00004710 return SemaRef.Owned(
4711 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
4712 E->shouldDestroyTemporaries()));
4713}
Mike Stump11289f42009-09-09 15:08:12 +00004714
Douglas Gregora16548e2009-08-11 05:31:07 +00004715template<typename Derived>
4716Sema::OwningExprResult
4717TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004718 CXXTemporaryObjectExpr *E,
4719 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004720 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4721 QualType T = getDerived().TransformType(E->getType());
4722 if (T.isNull())
4723 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004724
Douglas Gregora16548e2009-08-11 05:31:07 +00004725 CXXConstructorDecl *Constructor
4726 = cast_or_null<CXXConstructorDecl>(
4727 getDerived().TransformDecl(E->getConstructor()));
4728 if (!Constructor)
4729 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004730
Douglas Gregora16548e2009-08-11 05:31:07 +00004731 bool ArgumentChanged = false;
4732 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4733 Args.reserve(E->getNumArgs());
Mike Stump11289f42009-09-09 15:08:12 +00004734 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
Douglas Gregora16548e2009-08-11 05:31:07 +00004735 ArgEnd = E->arg_end();
4736 Arg != ArgEnd; ++Arg) {
4737 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4738 if (TransArg.isInvalid())
4739 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004740
Douglas Gregora16548e2009-08-11 05:31:07 +00004741 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4742 Args.push_back((Expr *)TransArg.release());
4743 }
Mike Stump11289f42009-09-09 15:08:12 +00004744
Douglas Gregora16548e2009-08-11 05:31:07 +00004745 if (!getDerived().AlwaysRebuild() &&
4746 T == E->getType() &&
4747 Constructor == E->getConstructor() &&
4748 !ArgumentChanged)
4749 return SemaRef.Owned(E->Retain());
Mike Stump11289f42009-09-09 15:08:12 +00004750
Douglas Gregora16548e2009-08-11 05:31:07 +00004751 // FIXME: Bogus location information
4752 SourceLocation CommaLoc;
4753 if (Args.size() > 1) {
4754 Expr *First = (Expr *)Args[0];
Mike Stump11289f42009-09-09 15:08:12 +00004755 CommaLoc
Douglas Gregora16548e2009-08-11 05:31:07 +00004756 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
4757 }
4758 return getDerived().RebuildCXXTemporaryObjectExpr(E->getTypeBeginLoc(),
4759 T,
4760 /*FIXME:*/E->getTypeBeginLoc(),
4761 move_arg(Args),
4762 &CommaLoc,
4763 E->getLocEnd());
4764}
Mike Stump11289f42009-09-09 15:08:12 +00004765
Douglas Gregora16548e2009-08-11 05:31:07 +00004766template<typename Derived>
4767Sema::OwningExprResult
4768TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004769 CXXUnresolvedConstructExpr *E,
4770 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004771 TemporaryBase Rebase(*this, E->getTypeBeginLoc(), DeclarationName());
4772 QualType T = getDerived().TransformType(E->getTypeAsWritten());
4773 if (T.isNull())
4774 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004775
Douglas Gregora16548e2009-08-11 05:31:07 +00004776 bool ArgumentChanged = false;
4777 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
4778 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
4779 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
4780 ArgEnd = E->arg_end();
4781 Arg != ArgEnd; ++Arg) {
4782 OwningExprResult TransArg = getDerived().TransformExpr(*Arg);
4783 if (TransArg.isInvalid())
4784 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004785
Douglas Gregora16548e2009-08-11 05:31:07 +00004786 ArgumentChanged = ArgumentChanged || TransArg.get() != *Arg;
4787 FakeCommaLocs.push_back(
4788 SemaRef.PP.getLocForEndOfToken((*Arg)->getLocEnd()));
4789 Args.push_back(TransArg.takeAs<Expr>());
4790 }
Mike Stump11289f42009-09-09 15:08:12 +00004791
Douglas Gregora16548e2009-08-11 05:31:07 +00004792 if (!getDerived().AlwaysRebuild() &&
4793 T == E->getTypeAsWritten() &&
4794 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00004795 return SemaRef.Owned(E->Retain());
4796
Douglas Gregora16548e2009-08-11 05:31:07 +00004797 // FIXME: we're faking the locations of the commas
4798 return getDerived().RebuildCXXUnresolvedConstructExpr(E->getTypeBeginLoc(),
4799 T,
4800 E->getLParenLoc(),
4801 move_arg(Args),
4802 FakeCommaLocs.data(),
4803 E->getRParenLoc());
4804}
Mike Stump11289f42009-09-09 15:08:12 +00004805
Douglas Gregora16548e2009-08-11 05:31:07 +00004806template<typename Derived>
4807Sema::OwningExprResult
4808TreeTransform<Derived>::TransformCXXUnresolvedMemberExpr(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004809 CXXUnresolvedMemberExpr *E,
4810 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004811 // Transform the base of the expression.
4812 OwningExprResult Base = getDerived().TransformExpr(E->getBase());
4813 if (Base.isInvalid())
4814 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004815
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004816 // Start the member reference and compute the object's type.
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004817 Sema::TypeTy *ObjectType = 0;
Mike Stump11289f42009-09-09 15:08:12 +00004818 Base = SemaRef.ActOnStartCXXMemberReference(0, move(Base),
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004819 E->getOperatorLoc(),
4820 E->isArrow()? tok::arrow : tok::period,
4821 ObjectType);
4822 if (Base.isInvalid())
4823 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004824
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004825 // Transform the first part of the nested-name-specifier that qualifies
4826 // the member name.
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004827 NamedDecl *FirstQualifierInScope
Douglas Gregora5cb6da2009-10-20 05:58:46 +00004828 = getDerived().TransformFirstQualifierInScope(
4829 E->getFirstQualifierFoundInScope(),
4830 E->getQualifierRange().getBegin());
Mike Stump11289f42009-09-09 15:08:12 +00004831
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004832 NestedNameSpecifier *Qualifier = 0;
4833 if (E->getQualifier()) {
4834 Qualifier = getDerived().TransformNestedNameSpecifier(E->getQualifier(),
4835 E->getQualifierRange(),
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004836 QualType::getFromOpaquePtr(ObjectType),
4837 FirstQualifierInScope);
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004838 if (!Qualifier)
4839 return SemaRef.ExprError();
4840 }
Mike Stump11289f42009-09-09 15:08:12 +00004841
4842 DeclarationName Name
Douglas Gregorc59e5612009-10-19 22:04:39 +00004843 = getDerived().TransformDeclarationName(E->getMember(), E->getMemberLoc(),
4844 QualType::getFromOpaquePtr(ObjectType));
Douglas Gregorf816bd72009-09-03 22:13:48 +00004845 if (!Name)
4846 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004847
Douglas Gregor308047d2009-09-09 00:23:06 +00004848 if (!E->hasExplicitTemplateArgumentList()) {
4849 // This is a reference to a member without an explicitly-specified
4850 // template argument list. Optimize for this common case.
4851 if (!getDerived().AlwaysRebuild() &&
4852 Base.get() == E->getBase() &&
4853 Qualifier == E->getQualifier() &&
4854 Name == E->getMember() &&
4855 FirstQualifierInScope == E->getFirstQualifierFoundInScope())
Mike Stump11289f42009-09-09 15:08:12 +00004856 return SemaRef.Owned(E->Retain());
4857
Douglas Gregor308047d2009-09-09 00:23:06 +00004858 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4859 E->isArrow(),
4860 E->getOperatorLoc(),
4861 Qualifier,
4862 E->getQualifierRange(),
4863 Name,
4864 E->getMemberLoc(),
4865 FirstQualifierInScope);
4866 }
4867
4868 // FIXME: This is an ugly hack, which forces the same template name to
4869 // be looked up multiple times. Yuck!
Douglas Gregor71395fa2009-11-04 00:56:37 +00004870 TemporaryBase Rebase(*this, E->getMemberLoc(), DeclarationName());
4871 TemplateName OrigTemplateName;
4872 if (const IdentifierInfo *II = Name.getAsIdentifierInfo())
4873 OrigTemplateName = SemaRef.Context.getDependentTemplateName(0, II);
4874 else
4875 OrigTemplateName
4876 = SemaRef.Context.getDependentTemplateName(0,
4877 Name.getCXXOverloadedOperator());
Mike Stump11289f42009-09-09 15:08:12 +00004878
4879 TemplateName Template
4880 = getDerived().TransformTemplateName(OrigTemplateName,
Douglas Gregor308047d2009-09-09 00:23:06 +00004881 QualType::getFromOpaquePtr(ObjectType));
4882 if (Template.isNull())
4883 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004884
John McCall0ad16662009-10-29 08:12:44 +00004885 llvm::SmallVector<TemplateArgumentLoc, 4> TransArgs(E->getNumTemplateArgs());
Douglas Gregor308047d2009-09-09 00:23:06 +00004886 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
John McCall0ad16662009-10-29 08:12:44 +00004887 if (getDerived().TransformTemplateArgument(E->getTemplateArgs()[I],
4888 TransArgs[I]))
Douglas Gregor308047d2009-09-09 00:23:06 +00004889 return SemaRef.ExprError();
Douglas Gregor308047d2009-09-09 00:23:06 +00004890 }
Mike Stump11289f42009-09-09 15:08:12 +00004891
Douglas Gregora16548e2009-08-11 05:31:07 +00004892 return getDerived().RebuildCXXUnresolvedMemberExpr(move(Base),
4893 E->isArrow(),
4894 E->getOperatorLoc(),
Douglas Gregorc26e0f62009-09-03 16:14:30 +00004895 Qualifier,
4896 E->getQualifierRange(),
Douglas Gregor308047d2009-09-09 00:23:06 +00004897 Template,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00004898 E->getMemberLoc(),
Douglas Gregor308047d2009-09-09 00:23:06 +00004899 FirstQualifierInScope,
4900 E->getLAngleLoc(),
4901 TransArgs.data(),
4902 TransArgs.size(),
4903 E->getRAngleLoc());
Douglas Gregora16548e2009-08-11 05:31:07 +00004904}
4905
4906template<typename Derived>
4907Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004908TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E,
4909 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00004910 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004911}
4912
Mike Stump11289f42009-09-09 15:08:12 +00004913template<typename Derived>
4914Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004915TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E,
4916 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004917 // FIXME: poor source location
4918 TemporaryBase Rebase(*this, E->getAtLoc(), DeclarationName());
4919 QualType EncodedType = getDerived().TransformType(E->getEncodedType());
4920 if (EncodedType.isNull())
4921 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00004922
Douglas Gregora16548e2009-08-11 05:31:07 +00004923 if (!getDerived().AlwaysRebuild() &&
4924 EncodedType == E->getEncodedType())
Mike Stump11289f42009-09-09 15:08:12 +00004925 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004926
4927 return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
4928 EncodedType,
4929 E->getRParenLoc());
4930}
Mike Stump11289f42009-09-09 15:08:12 +00004931
Douglas Gregora16548e2009-08-11 05:31:07 +00004932template<typename Derived>
4933Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004934TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E,
4935 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004936 // FIXME: Implement this!
4937 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004938 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004939}
4940
Mike Stump11289f42009-09-09 15:08:12 +00004941template<typename Derived>
4942Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004943TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E,
4944 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00004945 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004946}
4947
Mike Stump11289f42009-09-09 15:08:12 +00004948template<typename Derived>
4949Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004950TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E,
4951 bool isAddressOfOperand) {
Mike Stump11289f42009-09-09 15:08:12 +00004952 ObjCProtocolDecl *Protocol
Douglas Gregora16548e2009-08-11 05:31:07 +00004953 = cast_or_null<ObjCProtocolDecl>(
4954 getDerived().TransformDecl(E->getProtocol()));
4955 if (!Protocol)
4956 return SemaRef.ExprError();
4957
4958 if (!getDerived().AlwaysRebuild() &&
4959 Protocol == E->getProtocol())
Mike Stump11289f42009-09-09 15:08:12 +00004960 return SemaRef.Owned(E->Retain());
4961
Douglas Gregora16548e2009-08-11 05:31:07 +00004962 return getDerived().RebuildObjCProtocolExpr(Protocol,
4963 E->getAtLoc(),
4964 /*FIXME:*/E->getAtLoc(),
4965 /*FIXME:*/E->getAtLoc(),
4966 E->getRParenLoc());
Mike Stump11289f42009-09-09 15:08:12 +00004967
Douglas Gregora16548e2009-08-11 05:31:07 +00004968}
4969
Mike Stump11289f42009-09-09 15:08:12 +00004970template<typename Derived>
4971Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004972TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E,
4973 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004974 // FIXME: Implement this!
4975 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004976 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004977}
4978
Mike Stump11289f42009-09-09 15:08:12 +00004979template<typename Derived>
4980Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004981TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E,
4982 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004983 // FIXME: Implement this!
4984 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004985 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004986}
4987
Mike Stump11289f42009-09-09 15:08:12 +00004988template<typename Derived>
4989Sema::OwningExprResult
Fariborz Jahanian9a846652009-08-20 17:02:02 +00004990TreeTransform<Derived>::TransformObjCImplicitSetterGetterRefExpr(
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00004991 ObjCImplicitSetterGetterRefExpr *E,
4992 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00004993 // FIXME: Implement this!
4994 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00004995 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00004996}
4997
Mike Stump11289f42009-09-09 15:08:12 +00004998template<typename Derived>
4999Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00005000TreeTransform<Derived>::TransformObjCSuperExpr(ObjCSuperExpr *E,
5001 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00005002 // FIXME: Implement this!
5003 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00005004 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00005005}
5006
Mike Stump11289f42009-09-09 15:08:12 +00005007template<typename Derived>
5008Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00005009TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E,
5010 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00005011 // FIXME: Implement this!
5012 assert(false && "Cannot transform Objective-C expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00005013 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00005014}
5015
Mike Stump11289f42009-09-09 15:08:12 +00005016template<typename Derived>
5017Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00005018TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E,
5019 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00005020 bool ArgumentChanged = false;
5021 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
5022 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
5023 OwningExprResult SubExpr = getDerived().TransformExpr(E->getExpr(I));
5024 if (SubExpr.isInvalid())
5025 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00005026
Douglas Gregora16548e2009-08-11 05:31:07 +00005027 ArgumentChanged = ArgumentChanged || SubExpr.get() != E->getExpr(I);
5028 SubExprs.push_back(SubExpr.takeAs<Expr>());
5029 }
Mike Stump11289f42009-09-09 15:08:12 +00005030
Douglas Gregora16548e2009-08-11 05:31:07 +00005031 if (!getDerived().AlwaysRebuild() &&
5032 !ArgumentChanged)
Mike Stump11289f42009-09-09 15:08:12 +00005033 return SemaRef.Owned(E->Retain());
5034
Douglas Gregora16548e2009-08-11 05:31:07 +00005035 return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
5036 move_arg(SubExprs),
5037 E->getRParenLoc());
5038}
5039
Mike Stump11289f42009-09-09 15:08:12 +00005040template<typename Derived>
5041Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00005042TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E,
5043 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00005044 // FIXME: Implement this!
5045 assert(false && "Cannot transform block expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00005046 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00005047}
5048
Mike Stump11289f42009-09-09 15:08:12 +00005049template<typename Derived>
5050Sema::OwningExprResult
Douglas Gregorc95a1fa2009-11-04 07:01:15 +00005051TreeTransform<Derived>::TransformBlockDeclRefExpr(BlockDeclRefExpr *E,
5052 bool isAddressOfOperand) {
Douglas Gregora16548e2009-08-11 05:31:07 +00005053 // FIXME: Implement this!
5054 assert(false && "Cannot transform block-related expressions yet");
Mike Stump11289f42009-09-09 15:08:12 +00005055 return SemaRef.Owned(E->Retain());
Douglas Gregora16548e2009-08-11 05:31:07 +00005056}
Mike Stump11289f42009-09-09 15:08:12 +00005057
Douglas Gregora16548e2009-08-11 05:31:07 +00005058//===----------------------------------------------------------------------===//
Douglas Gregord6ff3322009-08-04 16:50:30 +00005059// Type reconstruction
5060//===----------------------------------------------------------------------===//
5061
Mike Stump11289f42009-09-09 15:08:12 +00005062template<typename Derived>
John McCall70dd5f62009-10-30 00:06:24 +00005063QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
5064 SourceLocation Star) {
5065 return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Star,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005066 getDerived().getBaseEntity());
5067}
5068
Mike Stump11289f42009-09-09 15:08:12 +00005069template<typename Derived>
John McCall70dd5f62009-10-30 00:06:24 +00005070QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
5071 SourceLocation Star) {
5072 return SemaRef.BuildBlockPointerType(PointeeType, Qualifiers(), Star,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005073 getDerived().getBaseEntity());
5074}
5075
Mike Stump11289f42009-09-09 15:08:12 +00005076template<typename Derived>
5077QualType
John McCall70dd5f62009-10-30 00:06:24 +00005078TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
5079 bool WrittenAsLValue,
5080 SourceLocation Sigil) {
5081 return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue, Qualifiers(),
5082 Sigil, getDerived().getBaseEntity());
Douglas Gregord6ff3322009-08-04 16:50:30 +00005083}
5084
5085template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005086QualType
John McCall70dd5f62009-10-30 00:06:24 +00005087TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
5088 QualType ClassType,
5089 SourceLocation Sigil) {
John McCall8ccfcb52009-09-24 19:53:00 +00005090 return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Qualifiers(),
John McCall70dd5f62009-10-30 00:06:24 +00005091 Sigil, getDerived().getBaseEntity());
Douglas Gregord6ff3322009-08-04 16:50:30 +00005092}
5093
5094template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005095QualType
John McCall70dd5f62009-10-30 00:06:24 +00005096TreeTransform<Derived>::RebuildObjCObjectPointerType(QualType PointeeType,
5097 SourceLocation Sigil) {
5098 return SemaRef.BuildPointerType(PointeeType, Qualifiers(), Sigil,
John McCall550e0c22009-10-21 00:40:46 +00005099 getDerived().getBaseEntity());
5100}
5101
5102template<typename Derived>
5103QualType
Douglas Gregord6ff3322009-08-04 16:50:30 +00005104TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
5105 ArrayType::ArraySizeModifier SizeMod,
5106 const llvm::APInt *Size,
5107 Expr *SizeExpr,
5108 unsigned IndexTypeQuals,
5109 SourceRange BracketsRange) {
5110 if (SizeExpr || !Size)
5111 return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
5112 IndexTypeQuals, BracketsRange,
5113 getDerived().getBaseEntity());
Mike Stump11289f42009-09-09 15:08:12 +00005114
5115 QualType Types[] = {
5116 SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
5117 SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
5118 SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
Douglas Gregord6ff3322009-08-04 16:50:30 +00005119 };
5120 const unsigned NumTypes = sizeof(Types) / sizeof(QualType);
5121 QualType SizeType;
5122 for (unsigned I = 0; I != NumTypes; ++I)
5123 if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
5124 SizeType = Types[I];
5125 break;
5126 }
Mike Stump11289f42009-09-09 15:08:12 +00005127
Douglas Gregord6ff3322009-08-04 16:50:30 +00005128 if (SizeType.isNull())
5129 SizeType = SemaRef.Context.getFixedWidthIntType(Size->getBitWidth(), false);
Mike Stump11289f42009-09-09 15:08:12 +00005130
Douglas Gregord6ff3322009-08-04 16:50:30 +00005131 IntegerLiteral ArraySize(*Size, SizeType, /*FIXME*/BracketsRange.getBegin());
Mike Stump11289f42009-09-09 15:08:12 +00005132 return SemaRef.BuildArrayType(ElementType, SizeMod, &ArraySize,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005133 IndexTypeQuals, BracketsRange,
Mike Stump11289f42009-09-09 15:08:12 +00005134 getDerived().getBaseEntity());
Douglas Gregord6ff3322009-08-04 16:50:30 +00005135}
Mike Stump11289f42009-09-09 15:08:12 +00005136
Douglas Gregord6ff3322009-08-04 16:50:30 +00005137template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005138QualType
5139TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005140 ArrayType::ArraySizeModifier SizeMod,
5141 const llvm::APInt &Size,
John McCall70dd5f62009-10-30 00:06:24 +00005142 unsigned IndexTypeQuals,
5143 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00005144 return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, 0,
John McCall70dd5f62009-10-30 00:06:24 +00005145 IndexTypeQuals, BracketsRange);
Douglas Gregord6ff3322009-08-04 16:50:30 +00005146}
5147
5148template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005149QualType
Mike Stump11289f42009-09-09 15:08:12 +00005150TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005151 ArrayType::ArraySizeModifier SizeMod,
John McCall70dd5f62009-10-30 00:06:24 +00005152 unsigned IndexTypeQuals,
5153 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00005154 return getDerived().RebuildArrayType(ElementType, SizeMod, 0, 0,
John McCall70dd5f62009-10-30 00:06:24 +00005155 IndexTypeQuals, BracketsRange);
Douglas Gregord6ff3322009-08-04 16:50:30 +00005156}
Mike Stump11289f42009-09-09 15:08:12 +00005157
Douglas Gregord6ff3322009-08-04 16:50:30 +00005158template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005159QualType
5160TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005161 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +00005162 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005163 unsigned IndexTypeQuals,
5164 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00005165 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005166 SizeExpr.takeAs<Expr>(),
5167 IndexTypeQuals, BracketsRange);
5168}
5169
5170template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005171QualType
5172TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005173 ArrayType::ArraySizeModifier SizeMod,
Douglas Gregora16548e2009-08-11 05:31:07 +00005174 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005175 unsigned IndexTypeQuals,
5176 SourceRange BracketsRange) {
Mike Stump11289f42009-09-09 15:08:12 +00005177 return getDerived().RebuildArrayType(ElementType, SizeMod, 0,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005178 SizeExpr.takeAs<Expr>(),
5179 IndexTypeQuals, BracketsRange);
5180}
5181
5182template<typename Derived>
5183QualType TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
5184 unsigned NumElements) {
5185 // FIXME: semantic checking!
5186 return SemaRef.Context.getVectorType(ElementType, NumElements);
5187}
Mike Stump11289f42009-09-09 15:08:12 +00005188
Douglas Gregord6ff3322009-08-04 16:50:30 +00005189template<typename Derived>
5190QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
5191 unsigned NumElements,
5192 SourceLocation AttributeLoc) {
5193 llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
5194 NumElements, true);
5195 IntegerLiteral *VectorSize
Mike Stump11289f42009-09-09 15:08:12 +00005196 = new (SemaRef.Context) IntegerLiteral(numElements, SemaRef.Context.IntTy,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005197 AttributeLoc);
5198 return SemaRef.BuildExtVectorType(ElementType, SemaRef.Owned(VectorSize),
5199 AttributeLoc);
5200}
Mike Stump11289f42009-09-09 15:08:12 +00005201
Douglas Gregord6ff3322009-08-04 16:50:30 +00005202template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005203QualType
5204TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
Douglas Gregora16548e2009-08-11 05:31:07 +00005205 ExprArg SizeExpr,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005206 SourceLocation AttributeLoc) {
5207 return SemaRef.BuildExtVectorType(ElementType, move(SizeExpr), AttributeLoc);
5208}
Mike Stump11289f42009-09-09 15:08:12 +00005209
Douglas Gregord6ff3322009-08-04 16:50:30 +00005210template<typename Derived>
5211QualType TreeTransform<Derived>::RebuildFunctionProtoType(QualType T,
Mike Stump11289f42009-09-09 15:08:12 +00005212 QualType *ParamTypes,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005213 unsigned NumParamTypes,
Mike Stump11289f42009-09-09 15:08:12 +00005214 bool Variadic,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005215 unsigned Quals) {
Mike Stump11289f42009-09-09 15:08:12 +00005216 return SemaRef.BuildFunctionType(T, ParamTypes, NumParamTypes, Variadic,
Douglas Gregord6ff3322009-08-04 16:50:30 +00005217 Quals,
5218 getDerived().getBaseLocation(),
5219 getDerived().getBaseEntity());
5220}
Mike Stump11289f42009-09-09 15:08:12 +00005221
Douglas Gregord6ff3322009-08-04 16:50:30 +00005222template<typename Derived>
John McCall550e0c22009-10-21 00:40:46 +00005223QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
5224 return SemaRef.Context.getFunctionNoProtoType(T);
5225}
5226
5227template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00005228QualType TreeTransform<Derived>::RebuildTypeOfExprType(ExprArg E) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00005229 return SemaRef.BuildTypeofExprType(E.takeAs<Expr>());
5230}
5231
5232template<typename Derived>
5233QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
5234 return SemaRef.Context.getTypeOfType(Underlying);
5235}
5236
5237template<typename Derived>
Douglas Gregora16548e2009-08-11 05:31:07 +00005238QualType TreeTransform<Derived>::RebuildDecltypeType(ExprArg E) {
Douglas Gregord6ff3322009-08-04 16:50:30 +00005239 return SemaRef.BuildDecltypeType(E.takeAs<Expr>());
5240}
5241
5242template<typename Derived>
5243QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
John McCall0ad16662009-10-29 08:12:44 +00005244 TemplateName Template,
5245 SourceLocation TemplateNameLoc,
5246 SourceLocation LAngleLoc,
5247 const TemplateArgumentLoc *Args,
5248 unsigned NumArgs,
5249 SourceLocation RAngleLoc) {
5250 return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, LAngleLoc,
5251 Args, NumArgs, RAngleLoc);
Douglas Gregord6ff3322009-08-04 16:50:30 +00005252}
Mike Stump11289f42009-09-09 15:08:12 +00005253
Douglas Gregor1135c352009-08-06 05:28:30 +00005254template<typename Derived>
5255NestedNameSpecifier *
5256TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5257 SourceRange Range,
Douglas Gregorc26e0f62009-09-03 16:14:30 +00005258 IdentifierInfo &II,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00005259 QualType ObjectType,
5260 NamedDecl *FirstQualifierInScope) {
Douglas Gregor1135c352009-08-06 05:28:30 +00005261 CXXScopeSpec SS;
5262 // FIXME: The source location information is all wrong.
5263 SS.setRange(Range);
5264 SS.setScopeRep(Prefix);
5265 return static_cast<NestedNameSpecifier *>(
Mike Stump11289f42009-09-09 15:08:12 +00005266 SemaRef.BuildCXXNestedNameSpecifier(0, SS, Range.getEnd(),
Douglas Gregore861bac2009-08-25 22:51:20 +00005267 Range.getEnd(), II,
Douglas Gregor2b6ca462009-09-03 21:38:09 +00005268 ObjectType,
5269 FirstQualifierInScope,
Douglas Gregore861bac2009-08-25 22:51:20 +00005270 false));
Douglas Gregor1135c352009-08-06 05:28:30 +00005271}
5272
5273template<typename Derived>
5274NestedNameSpecifier *
5275TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5276 SourceRange Range,
5277 NamespaceDecl *NS) {
5278 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, NS);
5279}
5280
5281template<typename Derived>
5282NestedNameSpecifier *
5283TreeTransform<Derived>::RebuildNestedNameSpecifier(NestedNameSpecifier *Prefix,
5284 SourceRange Range,
5285 bool TemplateKW,
5286 QualType T) {
5287 if (T->isDependentType() || T->isRecordType() ||
5288 (SemaRef.getLangOptions().CPlusPlus0x && T->isEnumeralType())) {
John McCall8ccfcb52009-09-24 19:53:00 +00005289 assert(!T.hasQualifiers() && "Can't get cv-qualifiers here");
Douglas Gregor1135c352009-08-06 05:28:30 +00005290 return NestedNameSpecifier::Create(SemaRef.Context, Prefix, TemplateKW,
5291 T.getTypePtr());
5292 }
Mike Stump11289f42009-09-09 15:08:12 +00005293
Douglas Gregor1135c352009-08-06 05:28:30 +00005294 SemaRef.Diag(Range.getBegin(), diag::err_nested_name_spec_non_tag) << T;
5295 return 0;
5296}
Mike Stump11289f42009-09-09 15:08:12 +00005297
Douglas Gregor71dc5092009-08-06 06:41:21 +00005298template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005299TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00005300TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5301 bool TemplateKW,
5302 TemplateDecl *Template) {
Mike Stump11289f42009-09-09 15:08:12 +00005303 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW,
Douglas Gregor71dc5092009-08-06 06:41:21 +00005304 Template);
5305}
5306
5307template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005308TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00005309TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5310 bool TemplateKW,
5311 OverloadedFunctionDecl *Ovl) {
5312 return SemaRef.Context.getQualifiedTemplateName(Qualifier, TemplateKW, Ovl);
5313}
5314
5315template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005316TemplateName
Douglas Gregor71dc5092009-08-06 06:41:21 +00005317TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
Douglas Gregor308047d2009-09-09 00:23:06 +00005318 const IdentifierInfo &II,
5319 QualType ObjectType) {
Douglas Gregor71dc5092009-08-06 06:41:21 +00005320 CXXScopeSpec SS;
5321 SS.setRange(SourceRange(getDerived().getBaseLocation()));
Mike Stump11289f42009-09-09 15:08:12 +00005322 SS.setScopeRep(Qualifier);
Douglas Gregor3cf81312009-11-03 23:16:33 +00005323 UnqualifiedId Name;
5324 Name.setIdentifier(&II, /*FIXME:*/getDerived().getBaseLocation());
Douglas Gregor308047d2009-09-09 00:23:06 +00005325 return getSema().ActOnDependentTemplateName(
5326 /*FIXME:*/getDerived().getBaseLocation(),
Douglas Gregor308047d2009-09-09 00:23:06 +00005327 SS,
Douglas Gregor3cf81312009-11-03 23:16:33 +00005328 Name,
Douglas Gregor308047d2009-09-09 00:23:06 +00005329 ObjectType.getAsOpaquePtr())
5330 .template getAsVal<TemplateName>();
Douglas Gregor71dc5092009-08-06 06:41:21 +00005331}
Mike Stump11289f42009-09-09 15:08:12 +00005332
Douglas Gregora16548e2009-08-11 05:31:07 +00005333template<typename Derived>
Douglas Gregor71395fa2009-11-04 00:56:37 +00005334TemplateName
5335TreeTransform<Derived>::RebuildTemplateName(NestedNameSpecifier *Qualifier,
5336 OverloadedOperatorKind Operator,
5337 QualType ObjectType) {
5338 CXXScopeSpec SS;
5339 SS.setRange(SourceRange(getDerived().getBaseLocation()));
5340 SS.setScopeRep(Qualifier);
5341 UnqualifiedId Name;
5342 SourceLocation SymbolLocations[3]; // FIXME: Bogus location information.
5343 Name.setOperatorFunctionId(/*FIXME:*/getDerived().getBaseLocation(),
5344 Operator, SymbolLocations);
5345 return getSema().ActOnDependentTemplateName(
5346 /*FIXME:*/getDerived().getBaseLocation(),
5347 SS,
5348 Name,
5349 ObjectType.getAsOpaquePtr())
5350 .template getAsVal<TemplateName>();
5351}
5352
5353template<typename Derived>
Mike Stump11289f42009-09-09 15:08:12 +00005354Sema::OwningExprResult
Douglas Gregora16548e2009-08-11 05:31:07 +00005355TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
5356 SourceLocation OpLoc,
5357 ExprArg Callee,
5358 ExprArg First,
5359 ExprArg Second) {
5360 Expr *FirstExpr = (Expr *)First.get();
5361 Expr *SecondExpr = (Expr *)Second.get();
Sebastian Redladba46e2009-10-29 20:17:01 +00005362 DeclRefExpr *DRE
5363 = cast<DeclRefExpr>(((Expr *)Callee.get())->IgnoreParenCasts());
Douglas Gregora16548e2009-08-11 05:31:07 +00005364 bool isPostIncDec = SecondExpr && (Op == OO_PlusPlus || Op == OO_MinusMinus);
Mike Stump11289f42009-09-09 15:08:12 +00005365
Douglas Gregora16548e2009-08-11 05:31:07 +00005366 // Determine whether this should be a builtin operation.
Sebastian Redladba46e2009-10-29 20:17:01 +00005367 if (Op == OO_Subscript) {
5368 if (!FirstExpr->getType()->isOverloadableType() &&
5369 !SecondExpr->getType()->isOverloadableType())
5370 return getSema().CreateBuiltinArraySubscriptExpr(move(First),
5371 DRE->getLocStart(),
5372 move(Second), OpLoc);
5373 } else if (SecondExpr == 0 || isPostIncDec) {
Douglas Gregora16548e2009-08-11 05:31:07 +00005374 if (!FirstExpr->getType()->isOverloadableType()) {
5375 // The argument is not of overloadable type, so try to create a
5376 // built-in unary operation.
Mike Stump11289f42009-09-09 15:08:12 +00005377 UnaryOperator::Opcode Opc
Douglas Gregora16548e2009-08-11 05:31:07 +00005378 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
Mike Stump11289f42009-09-09 15:08:12 +00005379
Douglas Gregora16548e2009-08-11 05:31:07 +00005380 return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, move(First));
5381 }
5382 } else {
Mike Stump11289f42009-09-09 15:08:12 +00005383 if (!FirstExpr->getType()->isOverloadableType() &&
Douglas Gregora16548e2009-08-11 05:31:07 +00005384 !SecondExpr->getType()->isOverloadableType()) {
5385 // Neither of the arguments is an overloadable type, so try to
5386 // create a built-in binary operation.
5387 BinaryOperator::Opcode Opc = BinaryOperator::getOverloadedOpcode(Op);
Mike Stump11289f42009-09-09 15:08:12 +00005388 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00005389 = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, FirstExpr, SecondExpr);
5390 if (Result.isInvalid())
5391 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00005392
Douglas Gregora16548e2009-08-11 05:31:07 +00005393 First.release();
5394 Second.release();
5395 return move(Result);
5396 }
5397 }
Mike Stump11289f42009-09-09 15:08:12 +00005398
5399 // Compute the transformed set of functions (and function templates) to be
Douglas Gregora16548e2009-08-11 05:31:07 +00005400 // used during overload resolution.
5401 Sema::FunctionSet Functions;
Mike Stump11289f42009-09-09 15:08:12 +00005402
Douglas Gregora16548e2009-08-11 05:31:07 +00005403 // FIXME: Do we have to check
5404 // IsAcceptableNonMemberOperatorCandidate for each of these?
Douglas Gregor32e2c842009-09-01 16:58:52 +00005405 for (OverloadIterator F(DRE->getDecl()), FEnd; F != FEnd; ++F)
Douglas Gregora16548e2009-08-11 05:31:07 +00005406 Functions.insert(*F);
Mike Stump11289f42009-09-09 15:08:12 +00005407
Douglas Gregora16548e2009-08-11 05:31:07 +00005408 // Add any functions found via argument-dependent lookup.
5409 Expr *Args[2] = { FirstExpr, SecondExpr };
5410 unsigned NumArgs = 1 + (SecondExpr != 0);
Mike Stump11289f42009-09-09 15:08:12 +00005411 DeclarationName OpName
Douglas Gregora16548e2009-08-11 05:31:07 +00005412 = SemaRef.Context.DeclarationNames.getCXXOperatorName(Op);
Sebastian Redlc057f422009-10-23 19:23:15 +00005413 SemaRef.ArgumentDependentLookup(OpName, /*Operator*/true, Args, NumArgs,
5414 Functions);
Mike Stump11289f42009-09-09 15:08:12 +00005415
Douglas Gregora16548e2009-08-11 05:31:07 +00005416 // Create the overloaded operator invocation for unary operators.
5417 if (NumArgs == 1 || isPostIncDec) {
Mike Stump11289f42009-09-09 15:08:12 +00005418 UnaryOperator::Opcode Opc
Douglas Gregora16548e2009-08-11 05:31:07 +00005419 = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
5420 return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, move(First));
5421 }
Mike Stump11289f42009-09-09 15:08:12 +00005422
Sebastian Redladba46e2009-10-29 20:17:01 +00005423 if (Op == OO_Subscript)
5424 return SemaRef.CreateOverloadedArraySubscriptExpr(DRE->getLocStart(), OpLoc,
5425 move(First),move(Second));
5426
Douglas Gregora16548e2009-08-11 05:31:07 +00005427 // Create the overloaded operator invocation for binary operators.
Mike Stump11289f42009-09-09 15:08:12 +00005428 BinaryOperator::Opcode Opc =
Douglas Gregora16548e2009-08-11 05:31:07 +00005429 BinaryOperator::getOverloadedOpcode(Op);
Mike Stump11289f42009-09-09 15:08:12 +00005430 OwningExprResult Result
Douglas Gregora16548e2009-08-11 05:31:07 +00005431 = SemaRef.CreateOverloadedBinOp(OpLoc, Opc, Functions, Args[0], Args[1]);
5432 if (Result.isInvalid())
5433 return SemaRef.ExprError();
Mike Stump11289f42009-09-09 15:08:12 +00005434
Douglas Gregora16548e2009-08-11 05:31:07 +00005435 First.release();
5436 Second.release();
Mike Stump11289f42009-09-09 15:08:12 +00005437 return move(Result);
Douglas Gregora16548e2009-08-11 05:31:07 +00005438}
Mike Stump11289f42009-09-09 15:08:12 +00005439
Douglas Gregord6ff3322009-08-04 16:50:30 +00005440} // end namespace clang
5441
5442#endif // LLVM_CLANG_SEMA_TREETRANSFORM_H