blob: 43666df7c0f33918bbea62eac96a23d7c18ca5ed [file] [log] [blame]
Douglas Gregorb70ccad2009-05-15 18:22:25 +00001//===--- SemaTemplateInstantiateExpr.cpp - C++ Template Expr Instantiation ===/
Douglas Gregoraa6af222009-03-25 00:27:28 +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//
Douglas Gregorb70ccad2009-05-15 18:22:25 +00009// This file implements C++ template instantiation for expressions.
Douglas Gregoraa6af222009-03-25 00:27:28 +000010//
11//===----------------------------------------------------------------------===/
12#include "Sema.h"
13#include "clang/AST/ASTContext.h"
14#include "clang/AST/DeclTemplate.h"
15#include "clang/AST/StmtVisitor.h"
16#include "clang/AST/Expr.h"
17#include "clang/AST/ExprCXX.h"
18#include "clang/Parse/DeclSpec.h"
19#include "clang/Lex/Preprocessor.h" // for the identifier table
20#include "llvm/Support/Compiler.h"
21using namespace clang;
22
23namespace {
24 class VISIBILITY_HIDDEN TemplateExprInstantiator
25 : public StmtVisitor<TemplateExprInstantiator, Sema::OwningExprResult> {
26 Sema &SemaRef;
Douglas Gregor7e063902009-05-11 23:53:27 +000027 const TemplateArgumentList &TemplateArgs;
Douglas Gregoraa6af222009-03-25 00:27:28 +000028
29 public:
30 typedef Sema::OwningExprResult OwningExprResult;
31
32 TemplateExprInstantiator(Sema &SemaRef,
Douglas Gregor7e063902009-05-11 23:53:27 +000033 const TemplateArgumentList &TemplateArgs)
34 : SemaRef(SemaRef), TemplateArgs(TemplateArgs) { }
Douglas Gregoraa6af222009-03-25 00:27:28 +000035
Mike Stump390b4cc2009-05-16 07:39:55 +000036 // FIXME: Once we get closer to completion, replace these manually-written
37 // declarations with automatically-generated ones from
38 // clang/AST/StmtNodes.def.
Sebastian Redl8b0b4752009-05-16 18:50:46 +000039 OwningExprResult VisitPredefinedExpr(PredefinedExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000040 OwningExprResult VisitIntegerLiteral(IntegerLiteral *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000041 OwningExprResult VisitFloatingLiteral(FloatingLiteral *E);
42 OwningExprResult VisitStringLiteral(StringLiteral *E);
43 OwningExprResult VisitCharacterLiteral(CharacterLiteral *E);
Douglas Gregord8ac4362009-05-18 22:38:38 +000044 OwningExprResult VisitImaginaryLiteral(ImaginaryLiteral *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000045 OwningExprResult VisitDeclRefExpr(DeclRefExpr *E);
46 OwningExprResult VisitParenExpr(ParenExpr *E);
47 OwningExprResult VisitUnaryOperator(UnaryOperator *E);
Douglas Gregor3384c9c2009-05-19 00:01:19 +000048 OwningExprResult VisitArraySubscriptExpr(ArraySubscriptExpr *E);
Douglas Gregor4a2487a2009-05-19 00:38:01 +000049 OwningExprResult VisitCallExpr(CallExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000050 // FIXME: VisitMemberExpr
51 // FIXME: CompoundLiteralExpr
Douglas Gregoraa6af222009-03-25 00:27:28 +000052 OwningExprResult VisitBinaryOperator(BinaryOperator *E);
Douglas Gregor6731c312009-05-19 20:02:01 +000053 OwningExprResult VisitCompoundAssignOperator(CompoundAssignOperator *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000054 OwningExprResult VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
Douglas Gregor4a2e2042009-05-15 21:45:53 +000055 OwningExprResult VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000056 OwningExprResult VisitConditionalOperator(ConditionalOperator *E);
Douglas Gregorcd938172009-05-19 20:31:21 +000057 // FIXME: AddrLabelExpr
58 OwningExprResult VisitStmtExpr(StmtExpr *E);
Douglas Gregordc241b42009-05-19 20:55:31 +000059 OwningExprResult VisitTypesCompatibleExpr(TypesCompatibleExpr *E);
Douglas Gregorcde01732009-05-19 22:10:17 +000060 OwningExprResult VisitShuffleVectorExpr(ShuffleVectorExpr *E);
Douglas Gregorc9ecc572009-05-19 22:43:30 +000061 OwningExprResult VisitChooseExpr(ChooseExpr *E);
Douglas Gregordd027302009-05-19 23:10:31 +000062 OwningExprResult VisitVAArgExpr(VAArgExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000063 // FIXME: InitListExpr
64 // FIXME: DesignatedInitExpr
65 // FIXME: ImplicitValueInitExpr
66 // FIXME: ExtVectorElementExpr
67 // FIXME: BlockExpr
68 // FIXME: BlockDeclRefExpr
Douglas Gregoraa6af222009-03-25 00:27:28 +000069 OwningExprResult VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
70 OwningExprResult VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E);
71 OwningExprResult VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000072 OwningExprResult VisitCastExpr(CastExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000073 OwningExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000074 OwningExprResult VisitExplicitCastExpr(ExplicitCastExpr *E);
75 OwningExprResult VisitCStyleCastExpr(CStyleCastExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000076 // FIXME: CXXMemberCallExpr
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000077 OwningExprResult VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
78 OwningExprResult VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
79 OwningExprResult VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
80 OwningExprResult VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
81 OwningExprResult VisitCXXConstCastExpr(CXXConstCastExpr *E);
Anders Carlsson0712d292009-05-15 20:26:03 +000082 OwningExprResult VisitCXXThisExpr(CXXThisExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000083 OwningExprResult VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
84 OwningExprResult VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000085 // FIXME: CXXTypeIdExpr
86 // FIXME: CXXThrowExpr
87 // FIXME: CXXDefaultArgExpr
Douglas Gregord94546a2009-05-20 21:38:11 +000088 OwningExprResult VisitCXXConstructExpr(CXXConstructExpr *E);
89 OwningExprResult VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
90 OwningExprResult VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
Douglas Gregor3433cf72009-05-21 00:00:09 +000091 OwningExprResult VisitCXXNewExpr(CXXNewExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000092 // FIXME: CXXDeleteExpr
93 // FIXME: UnaryTypeTraitExpr
94 // FIXME: QualifiedDeclRefExpr
Douglas Gregore06274d2009-05-20 21:51:01 +000095 OwningExprResult VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
Douglas Gregord81e6ca2009-05-20 18:46:25 +000096 OwningExprResult VisitCXXUnresolvedConstructExpr(
97 CXXUnresolvedConstructExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000098 OwningExprResult VisitGNUNullExpr(GNUNullExpr *E);
Douglas Gregor4a2487a2009-05-19 00:38:01 +000099 OwningExprResult VisitUnresolvedFunctionNameExpr(
100 UnresolvedFunctionNameExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000101
Douglas Gregoraa6af222009-03-25 00:27:28 +0000102 // Base case. I'm supposed to ignore this.
103 Sema::OwningExprResult VisitStmt(Stmt *S) {
104 S->dump();
105 assert(false && "Cannot instantiate this kind of expression");
106 return SemaRef.ExprError();
107 }
108 };
109}
110
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000111Sema::OwningExprResult
112TemplateExprInstantiator::VisitPredefinedExpr(PredefinedExpr *E) {
113 return SemaRef.Clone(E);
114}
115
116Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000117TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) {
118 return SemaRef.Clone(E);
119}
120
121Sema::OwningExprResult
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000122TemplateExprInstantiator::VisitFloatingLiteral(FloatingLiteral *E) {
123 return SemaRef.Clone(E);
124}
125
126Sema::OwningExprResult
127TemplateExprInstantiator::VisitStringLiteral(StringLiteral *E) {
128 return SemaRef.Clone(E);
129}
130
131Sema::OwningExprResult
132TemplateExprInstantiator::VisitCharacterLiteral(CharacterLiteral *E) {
133 return SemaRef.Clone(E);
134}
135
Douglas Gregord8ac4362009-05-18 22:38:38 +0000136Sema::OwningExprResult
137TemplateExprInstantiator::VisitImaginaryLiteral(ImaginaryLiteral *E) {
138 return SemaRef.Clone(E);
139}
140
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000141Sema::OwningExprResult
142TemplateExprInstantiator::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
143 return SemaRef.Clone(E);
144}
145
146Sema::OwningExprResult
147TemplateExprInstantiator::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
148 return SemaRef.Clone(E);
149}
150
151Sema::OwningExprResult
152TemplateExprInstantiator::VisitGNUNullExpr(GNUNullExpr *E) {
153 return SemaRef.Clone(E);
154}
155
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000156Sema::OwningExprResult
157TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr(
158 UnresolvedFunctionNameExpr *E) {
159 return SemaRef.Clone(E);
160}
161
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000162Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000163TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
164 Decl *D = E->getDecl();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000165 ValueDecl *NewD = 0;
Douglas Gregoraa6af222009-03-25 00:27:28 +0000166 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
167 assert(NTTP->getDepth() == 0 && "No nested templates yet");
168 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
169 QualType T = Arg.getIntegralType();
170 if (T->isCharType() || T->isWideCharType())
171 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
172 Arg.getAsIntegral()->getZExtValue(),
173 T->isWideCharType(),
174 T,
175 E->getSourceRange().getBegin()));
176 else if (T->isBooleanType())
177 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
178 Arg.getAsIntegral()->getBoolValue(),
179 T,
180 E->getSourceRange().getBegin()));
181
182 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
183 *Arg.getAsIntegral(),
184 T,
185 E->getSourceRange().getBegin()));
Douglas Gregordd027302009-05-19 23:10:31 +0000186 } else if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000187 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Parm);
Douglas Gregordd027302009-05-19 23:10:31 +0000188 } else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
189 if (Var->hasLocalStorage())
190 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Var);
191 else
192 assert(false && "Cannot instantiation non-local variable declarations");
193 } else if (isa<FunctionDecl>(D) || isa<OverloadedFunctionDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000194 // FIXME: Instantiate decl!
195 NewD = cast<ValueDecl>(D);
Douglas Gregordd027302009-05-19 23:10:31 +0000196 } else
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000197 assert(false && "Unhandled declaratrion reference kind");
198
199 if (!NewD)
200 return SemaRef.ExprError();
201
202 QualType T = NewD->getType();
203 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000204 T.getNonReferenceType(),
205 E->getLocation(),
206 T->isDependentType(),
207 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000208}
209
210Sema::OwningExprResult
211TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
212 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
213 if (SubExpr.isInvalid())
214 return SemaRef.ExprError();
215
216 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
217 E->getLParen(), E->getRParen(),
218 (Expr *)SubExpr.release()));
219}
220
221Sema::OwningExprResult
222TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
223 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
224 if (Arg.isInvalid())
225 return SemaRef.ExprError();
226
227 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
228 E->getOpcode(),
229 move(Arg));
230}
231
232Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000233TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
234 Sema::OwningExprResult LHS = Visit(E->getLHS());
235 if (LHS.isInvalid())
236 return SemaRef.ExprError();
237
238 Sema::OwningExprResult RHS = Visit(E->getRHS());
239 if (RHS.isInvalid())
240 return SemaRef.ExprError();
241
242 // Since the overloaded array-subscript operator (operator[]) can
243 // only be a member function, we can make several simplifying
244 // assumptions here:
245 // 1) Normal name lookup (from the current scope) will not ever
246 // find any declarations of operator[] that won't also be found be
247 // member operator lookup, so it is safe to pass a NULL Scope
248 // during the instantiation to avoid the lookup entirely.
249 //
250 // 2) Neither normal name lookup nor argument-dependent lookup at
251 // template definition time will find any operators that won't be
252 // found at template instantiation time, so we do not need to
253 // cache the results of name lookup as we do for the binary
254 // operators.
255 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
256 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
257 /*FIXME:*/LLocFake,
258 move(RHS),
259 E->getRBracketLoc());
260}
261
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000262Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
263 // Instantiate callee
264 OwningExprResult Callee = Visit(E->getCallee());
265 if (Callee.isInvalid())
266 return SemaRef.ExprError();
267
268 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000269 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000270 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
271 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
272 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000273 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000274 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000275
276 FakeCommaLocs.push_back(
277 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
278 Args.push_back(Arg.takeAs<Expr>());
279 }
280
281 SourceLocation FakeLParenLoc
282 = ((Expr *)Callee.get())->getSourceRange().getBegin();
283 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
284 /*FIXME:*/FakeLParenLoc,
285 Sema::MultiExprArg(SemaRef,
Douglas Gregord7e27052009-05-20 22:33:37 +0000286 Args.take(), Args.size()),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000287 /*FIXME:*/&FakeCommaLocs.front(),
288 E->getRParenLoc());
289}
290
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000291Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000292TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
293 Sema::OwningExprResult LHS = Visit(E->getLHS());
294 if (LHS.isInvalid())
295 return SemaRef.ExprError();
296
297 Sema::OwningExprResult RHS = Visit(E->getRHS());
298 if (RHS.isInvalid())
299 return SemaRef.ExprError();
300
301 Sema::OwningExprResult Result
302 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
303 E->getOpcode(),
304 (Expr *)LHS.get(),
305 (Expr *)RHS.get());
306 if (Result.isInvalid())
307 return SemaRef.ExprError();
308
309 LHS.release();
310 RHS.release();
311 return move(Result);
312}
313
314Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000315TemplateExprInstantiator::VisitCompoundAssignOperator(
316 CompoundAssignOperator *E) {
317 return VisitBinaryOperator(E);
318}
319
320Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000321TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
322 Sema::OwningExprResult First = Visit(E->getArg(0));
323 if (First.isInvalid())
324 return SemaRef.ExprError();
325
326 Expr *Args[2] = { (Expr *)First.get(), 0 };
327
328 Sema::OwningExprResult Second(SemaRef);
329 if (E->getNumArgs() == 2) {
330 Second = Visit(E->getArg(1));
331
332 if (Second.isInvalid())
333 return SemaRef.ExprError();
334
335 Args[1] = (Expr *)Second.get();
336 }
337
338 if (!E->isTypeDependent()) {
339 // Since our original expression was not type-dependent, we do not
340 // perform lookup again at instantiation time (C++ [temp.dep]p1).
341 // Instead, we just build the new overloaded operator call
342 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000343 OwningExprResult Callee = Visit(E->getCallee());
344 if (Callee.isInvalid())
345 return SemaRef.ExprError();
346
Douglas Gregoraa6af222009-03-25 00:27:28 +0000347 First.release();
348 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000349
Douglas Gregoraa6af222009-03-25 00:27:28 +0000350 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
351 SemaRef.Context,
352 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000353 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000354 Args, E->getNumArgs(),
355 E->getType(),
356 E->getOperatorLoc()));
357 }
358
359 bool isPostIncDec = E->getNumArgs() == 2 &&
360 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
361 if (E->getNumArgs() == 1 || isPostIncDec) {
362 if (!Args[0]->getType()->isOverloadableType()) {
363 // The argument is not of overloadable type, so try to create a
364 // built-in unary operation.
365 UnaryOperator::Opcode Opc
366 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
367
368 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
369 move(First));
370 }
371
372 // Fall through to perform overload resolution
373 } else {
374 assert(E->getNumArgs() == 2 && "Expected binary operation");
375
376 Sema::OwningExprResult Result(SemaRef);
377 if (!Args[0]->getType()->isOverloadableType() &&
378 !Args[1]->getType()->isOverloadableType()) {
379 // Neither of the arguments is an overloadable type, so try to
380 // create a built-in binary operation.
381 BinaryOperator::Opcode Opc =
382 BinaryOperator::getOverloadedOpcode(E->getOperator());
383 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
384 Args[0], Args[1]);
385 if (Result.isInvalid())
386 return SemaRef.ExprError();
387
388 First.release();
389 Second.release();
390 return move(Result);
391 }
392
393 // Fall through to perform overload resolution.
394 }
395
396 // Compute the set of functions that were found at template
397 // definition time.
398 Sema::FunctionSet Functions;
399 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
400 OverloadedFunctionDecl *Overloads
401 = cast<OverloadedFunctionDecl>(DRE->getDecl());
402
403 // FIXME: Do we have to check
404 // IsAcceptableNonMemberOperatorCandidate for each of these?
405 for (OverloadedFunctionDecl::function_iterator
406 F = Overloads->function_begin(),
407 FEnd = Overloads->function_end();
408 F != FEnd; ++F)
409 Functions.insert(*F);
410
411 // Add any functions found via argument-dependent lookup.
412 DeclarationName OpName
413 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
414 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
415
416 // Create the overloaded operator invocation.
417 if (E->getNumArgs() == 1 || isPostIncDec) {
418 UnaryOperator::Opcode Opc
419 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
420 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
421 Functions, move(First));
422 }
423
Mike Stump390b4cc2009-05-16 07:39:55 +0000424 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
425 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000426 BinaryOperator::Opcode Opc =
427 BinaryOperator::getOverloadedOpcode(E->getOperator());
428 OwningExprResult Result
429 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
430 Functions, Args[0], Args[1]);
431
432 if (Result.isInvalid())
433 return SemaRef.ExprError();
434
435 First.release();
436 Second.release();
437 return move(Result);
438}
439
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000440Sema::OwningExprResult
441TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
442 VarDecl *Var
443 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
444 SemaRef.CurContext,
445 TemplateArgs));
446 if (!Var)
447 return SemaRef.ExprError();
448
Douglas Gregore06274d2009-05-20 21:51:01 +0000449 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000450 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
451 E->getStartLoc(),
452 SourceLocation(),
453 Var));
454}
455
Douglas Gregoraa6af222009-03-25 00:27:28 +0000456Sema::OwningExprResult
457TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
458 Sema::OwningExprResult Cond = Visit(E->getCond());
459 if (Cond.isInvalid())
460 return SemaRef.ExprError();
461
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000462 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
463 TemplateArgs);
464 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000465 return SemaRef.ExprError();
466
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000467 Sema::OwningExprResult RHS = Visit(E->getRHS());
468 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000469 return SemaRef.ExprError();
470
471 if (!E->isTypeDependent()) {
472 // Since our original expression was not type-dependent, we do not
473 // perform lookup again at instantiation time (C++ [temp.dep]p1).
474 // Instead, we just build the new conditional operator call expression.
475 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
476 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000477 LHS.takeAs<Expr>(),
478 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000479 E->getType()));
480 }
481
482
483 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
484 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000485 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000486}
487
Douglas Gregorcd938172009-05-19 20:31:21 +0000488Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000489 Sema::OwningStmtResult SubStmt
490 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000491 if (SubStmt.isInvalid())
492 return SemaRef.ExprError();
493
494 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
495 E->getRParenLoc());
496}
497
Douglas Gregoraa6af222009-03-25 00:27:28 +0000498Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000499TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000500 assert(false && "__builtin_types_compatible_p is not legal in C++");
501 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000502}
503
504Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000505TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000506 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000507 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
508 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000509 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000510 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000511
512 SubExprs.push_back(SubExpr.takeAs<Expr>());
513 }
514
515 // Find the declaration for __builtin_shufflevector
516 const IdentifierInfo &Name
517 = SemaRef.Context.Idents.get("__builtin_shufflevector");
518 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
519 DeclContext::lookup_result Lookup
520 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
521 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
522
523 // Build a reference to the __builtin_shufflevector builtin
524 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
525 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
526 E->getBuiltinLoc(),
527 false, false);
528 SemaRef.UsualUnaryConversions(Callee);
529
530 // Build the CallExpr
531 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000532 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000533 SubExprs.size(),
534 Builtin->getResultType(),
535 E->getRParenLoc());
536 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
537
538 // Type-check the __builtin_shufflevector expression.
539 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
540 if (Result.isInvalid())
541 return SemaRef.ExprError();
542
543 OwnedCall.release();
544 return move(Result);
545}
546
547Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000548TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
549 OwningExprResult Cond = Visit(E->getCond());
550 if (Cond.isInvalid())
551 return SemaRef.ExprError();
552
553 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
554 if (LHS.isInvalid())
555 return SemaRef.ExprError();
556
557 OwningExprResult RHS = Visit(E->getRHS());
558 if (RHS.isInvalid())
559 return SemaRef.ExprError();
560
561 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
562 move(Cond), move(LHS), move(RHS),
563 E->getRParenLoc());
564}
565
Douglas Gregordd027302009-05-19 23:10:31 +0000566Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
567 OwningExprResult SubExpr = Visit(E->getSubExpr());
568 if (SubExpr.isInvalid())
569 return SemaRef.ExprError();
570
571 SourceLocation FakeTypeLoc
572 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
573 .getEnd());
574 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
575 /*FIXME:*/FakeTypeLoc,
576 DeclarationName());
577 if (T.isNull())
578 return SemaRef.ExprError();
579
580 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
581 T.getAsOpaquePtr(), E->getRParenLoc());
582}
583
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000584Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000585TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
586 bool isSizeOf = E->isSizeOf();
587
588 if (E->isArgumentType()) {
589 QualType T = E->getArgumentType();
590 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000591 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000592 /*FIXME*/E->getOperatorLoc(),
593 &SemaRef.PP.getIdentifierTable().get("sizeof"));
594 if (T.isNull())
595 return SemaRef.ExprError();
596 }
597
598 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
599 E->getSourceRange());
600 }
601
602 Sema::OwningExprResult Arg = Visit(E->getArgumentExpr());
603 if (Arg.isInvalid())
604 return SemaRef.ExprError();
605
606 Sema::OwningExprResult Result
607 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
608 isSizeOf, E->getSourceRange());
609 if (Result.isInvalid())
610 return SemaRef.ExprError();
611
612 Arg.release();
613 return move(Result);
614}
615
616Sema::OwningExprResult
617TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000618 NestedNameSpecifier *NNS
619 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
620 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000621 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000622 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000623 return SemaRef.ExprError();
624
Douglas Gregorab452ba2009-03-26 23:50:42 +0000625 CXXScopeSpec SS;
626 SS.setRange(E->getQualifierRange());
627 SS.setScopeRep(NNS);
628
Douglas Gregoraa6af222009-03-25 00:27:28 +0000629 // FIXME: We're passing in a NULL scope, because
630 // ActOnDeclarationNameExpr doesn't actually use the scope when we
631 // give it a non-empty scope specifier. Investigate whether it would
632 // be better to refactor ActOnDeclarationNameExpr.
633 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
634 E->getDeclName(),
635 /*HasTrailingLParen=*/false,
636 &SS,
637 /*FIXME:isAddressOfOperand=*/false);
638}
639
640Sema::OwningExprResult
641TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
642 CXXTemporaryObjectExpr *E) {
643 QualType T = E->getType();
644 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000645 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000646 E->getTypeBeginLoc(), DeclarationName());
647 if (T.isNull())
648 return SemaRef.ExprError();
649 }
650
Douglas Gregord7e27052009-05-20 22:33:37 +0000651 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000652 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000653 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
654 ArgEnd = E->arg_end();
655 Arg != ArgEnd; ++Arg) {
656 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000657 if (InstantiatedArg.isInvalid())
658 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000659
660 Args.push_back((Expr *)InstantiatedArg.release());
661 }
662
Douglas Gregord7e27052009-05-20 22:33:37 +0000663 SourceLocation CommaLoc;
664 // FIXME: HACK!
665 if (Args.size() > 1) {
666 Expr *First = (Expr *)Args[0];
667 CommaLoc
668 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000669 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000670 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
671 /*, FIXME*/),
672 T.getAsOpaquePtr(),
673 /*FIXME*/E->getTypeBeginLoc(),
674 Sema::MultiExprArg(SemaRef,
675 Args.take(),
676 Args.size()),
677 /*HACK*/&CommaLoc,
678 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000679}
680
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000681Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
682 assert(false && "Cannot instantiate abstract CastExpr");
683 return SemaRef.ExprError();
684}
685
Douglas Gregoraa6af222009-03-25 00:27:28 +0000686Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
687 ImplicitCastExpr *E) {
688 assert(!E->isTypeDependent() && "Implicit casts must have known types");
689
690 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
691 if (SubExpr.isInvalid())
692 return SemaRef.ExprError();
693
694 ImplicitCastExpr *ICE =
695 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
696 (Expr *)SubExpr.release(),
697 E->isLvalueCast());
698 return SemaRef.Owned(ICE);
699}
700
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000701Sema::OwningExprResult
702TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
703 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
704 return SemaRef.ExprError();
705}
706
707Sema::OwningExprResult
708TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
709 // Instantiate the type that we're casting to.
710 SourceLocation TypeStartLoc
711 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
712 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
713 TemplateArgs,
714 TypeStartLoc,
715 DeclarationName());
716 if (ExplicitTy.isNull())
717 return SemaRef.ExprError();
718
719 // Instantiate the subexpression.
720 OwningExprResult SubExpr = Visit(E->getSubExpr());
721 if (SubExpr.isInvalid())
722 return SemaRef.ExprError();
723
724 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
725 ExplicitTy.getAsOpaquePtr(),
726 E->getRParenLoc(),
727 move(SubExpr));
728}
729
730Sema::OwningExprResult
731TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
732 // Figure out which cast operator we're dealing with.
733 tok::TokenKind Kind;
734 switch (E->getStmtClass()) {
735 case Stmt::CXXStaticCastExprClass:
736 Kind = tok::kw_static_cast;
737 break;
738
739 case Stmt::CXXDynamicCastExprClass:
740 Kind = tok::kw_dynamic_cast;
741 break;
742
743 case Stmt::CXXReinterpretCastExprClass:
744 Kind = tok::kw_reinterpret_cast;
745 break;
746
747 case Stmt::CXXConstCastExprClass:
748 Kind = tok::kw_const_cast;
749 break;
750
751 default:
752 assert(false && "Invalid C++ named cast");
753 return SemaRef.ExprError();
754 }
755
756 // Instantiate the type that we're casting to.
757 SourceLocation TypeStartLoc
758 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
759 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
760 TemplateArgs,
761 TypeStartLoc,
762 DeclarationName());
763 if (ExplicitTy.isNull())
764 return SemaRef.ExprError();
765
766 // Instantiate the subexpression.
767 OwningExprResult SubExpr = Visit(E->getSubExpr());
768 if (SubExpr.isInvalid())
769 return SemaRef.ExprError();
770
771 SourceLocation FakeLAngleLoc
772 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
773 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
774 SourceLocation FakeRParenLoc
775 = SemaRef.PP.getLocForEndOfToken(
776 E->getSubExpr()->getSourceRange().getEnd());
777 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
778 /*FIXME:*/FakeLAngleLoc,
779 ExplicitTy.getAsOpaquePtr(),
780 /*FIXME:*/FakeRAngleLoc,
781 /*FIXME:*/FakeRAngleLoc,
782 move(SubExpr),
783 /*FIXME:*/FakeRParenLoc);
784}
785
786Sema::OwningExprResult
787TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
788 return VisitCXXNamedCastExpr(E);
789}
790
791Sema::OwningExprResult
792TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
793 return VisitCXXNamedCastExpr(E);
794}
795
796Sema::OwningExprResult
797TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
798 CXXReinterpretCastExpr *E) {
799 return VisitCXXNamedCastExpr(E);
800}
801
802Sema::OwningExprResult
803TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
804 return VisitCXXNamedCastExpr(E);
805}
806
Anders Carlsson0712d292009-05-15 20:26:03 +0000807Sema::OwningExprResult
808TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
809 QualType ThisType =
810 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
811
812 CXXThisExpr *TE =
813 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
814
815 return SemaRef.Owned(TE);
816}
817
Douglas Gregoraa6af222009-03-25 00:27:28 +0000818Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +0000819TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
820 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
821 ->isDependentType() && "Dependent constructor shouldn't be here");
822
823 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
824 /*FIXME*/E->getSourceRange().getBegin(),
825 DeclarationName());
826 if (T.isNull())
827 return SemaRef.ExprError();
828
Douglas Gregord7e27052009-05-20 22:33:37 +0000829 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +0000830 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
831 ArgEnd = E->arg_end();
832 Arg != ArgEnd; ++Arg) {
833 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000834 if (ArgInst.isInvalid())
835 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +0000836
837 Args.push_back(ArgInst.takeAs<Expr>());
838 }
839
840
Douglas Gregord7e27052009-05-20 22:33:37 +0000841 VarDecl *Var = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
842 SemaRef.CurContext,
843 TemplateArgs));
844 if (!Var)
Douglas Gregord94546a2009-05-20 21:38:11 +0000845 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +0000846
Douglas Gregore06274d2009-05-20 21:51:01 +0000847 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregord94546a2009-05-20 21:38:11 +0000848 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, Var, T,
849 E->getConstructor(),
850 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +0000851 Args.takeAs<Expr>(),
852 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +0000853}
854
855Sema::OwningExprResult
856TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
857 CXXFunctionalCastExpr *E) {
858 // Instantiate the type that we're casting to.
859 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
860 TemplateArgs,
861 E->getTypeBeginLoc(),
862 DeclarationName());
863 if (ExplicitTy.isNull())
864 return SemaRef.ExprError();
865
866 // Instantiate the subexpression.
867 OwningExprResult SubExpr = Visit(E->getSubExpr());
868 if (SubExpr.isInvalid())
869 return SemaRef.ExprError();
870
871 // FIXME: The end of the type's source range is wrong
872 Expr *Sub = SubExpr.takeAs<Expr>();
873 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
874 ExplicitTy.getAsOpaquePtr(),
875 /*FIXME:*/E->getTypeBeginLoc(),
876 Sema::MultiExprArg(SemaRef,
877 (void **)&Sub,
878 1),
879 0,
880 E->getRParenLoc());
881}
882
883Sema::OwningExprResult
884TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
885 return SemaRef.Clone(E);
886}
887
888Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +0000889TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
890 // Instantiate the type that we're allocating
891 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
892 TemplateArgs,
893 /*FIXME:*/E->getSourceRange().getBegin(),
894 DeclarationName());
895 if (AllocType.isNull())
896 return SemaRef.ExprError();
897
898 // Instantiate the size of the array we're allocating (if any).
899 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
900 TemplateArgs);
901 if (ArraySize.isInvalid())
902 return SemaRef.ExprError();
903
904 // Instantiate the placement arguments (if any).
905 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
906 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
907 OwningExprResult Arg = Visit(E->getPlacementArg(I));
908 if (Arg.isInvalid())
909 return SemaRef.ExprError();
910
911 PlacementArgs.push_back(Arg.take());
912 }
913
914 // Instantiate the constructor arguments (if any).
915 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
916 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
917 OwningExprResult Arg = Visit(E->getConstructorArg(I));
918 if (Arg.isInvalid())
919 return SemaRef.ExprError();
920
921 ConstructorArgs.push_back(Arg.take());
922 }
923
924 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
925 E->isGlobalNew(),
926 /*FIXME*/SourceLocation(),
927 Sema::MultiExprArg(SemaRef,
928 PlacementArgs.take(),
929 PlacementArgs.size()),
930 /*FIXME*/SourceLocation(),
931 E->isParenTypeId(),
932 AllocType,
933 /*FIXME*/E->getSourceRange().getBegin(),
934 SourceRange(),
935 move(ArraySize),
936 /*FIXME*/SourceLocation(),
937 Sema::MultiExprArg(SemaRef,
938 ConstructorArgs.take(),
939 ConstructorArgs.size()),
940 E->getSourceRange().getEnd());
941}
942
943Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +0000944TemplateExprInstantiator::VisitCXXExprWithTemporaries(
945 CXXExprWithTemporaries *E) {
946 OwningExprResult SubExpr = Visit(E->getSubExpr());
947 if (SubExpr.isInvalid())
948 return SemaRef.ExprError();
949
950 return SemaRef.ActOnFinishFullExpr(move(SubExpr));
951}
952
953Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000954TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
955 CXXUnresolvedConstructExpr *E) {
956 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
957 E->getTypeBeginLoc(),
958 DeclarationName());
959 if (T.isNull())
960 return SemaRef.ExprError();
961
Douglas Gregord7e27052009-05-20 22:33:37 +0000962 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000963 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
964 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
965 ArgEnd = E->arg_end();
966 Arg != ArgEnd; ++Arg) {
967 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000968 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000969 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000970
971 FakeCommaLocs.push_back(
972 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
973 Args.push_back(InstArg.takeAs<Expr>());
974 }
975
976 // FIXME: The end of the type range isn't exactly correct.
977 // FIXME: we're faking the locations of the commas
978 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
979 E->getLParenLoc()),
980 T.getAsOpaquePtr(),
981 E->getLParenLoc(),
982 Sema::MultiExprArg(SemaRef,
Douglas Gregord7e27052009-05-20 22:33:37 +0000983 Args.take(),
Douglas Gregord81e6ca2009-05-20 18:46:25 +0000984 Args.size()),
985 &FakeCommaLocs.front(),
986 E->getRParenLoc());
987}
988
989Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +0000990Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +0000991 if (!E)
992 return Owned((Expr *)0);
993
Douglas Gregor7e063902009-05-11 23:53:27 +0000994 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000995 return Instantiator.Visit(E);
996}