blob: 0c298393308c768e817c12a26d06754e562a81fc [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"
Douglas Gregor9ea62762009-05-21 23:17:49 +000019#include "clang/Parse/Designator.h"
Douglas Gregoraa6af222009-03-25 00:27:28 +000020#include "clang/Lex/Preprocessor.h" // for the identifier table
21#include "llvm/Support/Compiler.h"
22using namespace clang;
23
24namespace {
25 class VISIBILITY_HIDDEN TemplateExprInstantiator
26 : public StmtVisitor<TemplateExprInstantiator, Sema::OwningExprResult> {
27 Sema &SemaRef;
Douglas Gregor7e063902009-05-11 23:53:27 +000028 const TemplateArgumentList &TemplateArgs;
Douglas Gregoraa6af222009-03-25 00:27:28 +000029
30 public:
31 typedef Sema::OwningExprResult OwningExprResult;
32
33 TemplateExprInstantiator(Sema &SemaRef,
Douglas Gregor7e063902009-05-11 23:53:27 +000034 const TemplateArgumentList &TemplateArgs)
35 : SemaRef(SemaRef), TemplateArgs(TemplateArgs) { }
Douglas Gregoraa6af222009-03-25 00:27:28 +000036
Douglas Gregore30d0bd2009-05-22 23:47:06 +000037 // Declare VisitXXXStmt nodes for all of the expression kinds.
38#define EXPR(Type, Base) OwningExprResult Visit##Type(Type *S);
39#define STMT(Type, Base)
40#include "clang/AST/StmtNodes.def"
Sebastian Redl8b0b4752009-05-16 18:50:46 +000041
Douglas Gregore30d0bd2009-05-22 23:47:06 +000042 // Base case. We can't get here.
Douglas Gregoraa6af222009-03-25 00:27:28 +000043 Sema::OwningExprResult VisitStmt(Stmt *S) {
44 S->dump();
45 assert(false && "Cannot instantiate this kind of expression");
46 return SemaRef.ExprError();
47 }
48 };
49}
50
Douglas Gregore30d0bd2009-05-22 23:47:06 +000051// Base case. We can't get here.
52Sema::OwningExprResult TemplateExprInstantiator::VisitExpr(Expr *E) {
53 E->dump();
54 assert(false && "Cannot instantiate this kind of expression");
55 return SemaRef.ExprError();
56}
57
Sebastian Redl8b0b4752009-05-16 18:50:46 +000058Sema::OwningExprResult
59TemplateExprInstantiator::VisitPredefinedExpr(PredefinedExpr *E) {
60 return SemaRef.Clone(E);
61}
62
63Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +000064TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) {
65 return SemaRef.Clone(E);
66}
67
68Sema::OwningExprResult
Sebastian Redl8b0b4752009-05-16 18:50:46 +000069TemplateExprInstantiator::VisitFloatingLiteral(FloatingLiteral *E) {
70 return SemaRef.Clone(E);
71}
72
73Sema::OwningExprResult
74TemplateExprInstantiator::VisitStringLiteral(StringLiteral *E) {
75 return SemaRef.Clone(E);
76}
77
78Sema::OwningExprResult
79TemplateExprInstantiator::VisitCharacterLiteral(CharacterLiteral *E) {
80 return SemaRef.Clone(E);
81}
82
Douglas Gregord8ac4362009-05-18 22:38:38 +000083Sema::OwningExprResult
84TemplateExprInstantiator::VisitImaginaryLiteral(ImaginaryLiteral *E) {
85 return SemaRef.Clone(E);
86}
87
Sebastian Redl8b0b4752009-05-16 18:50:46 +000088Sema::OwningExprResult
89TemplateExprInstantiator::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
90 return SemaRef.Clone(E);
91}
92
93Sema::OwningExprResult
94TemplateExprInstantiator::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
95 return SemaRef.Clone(E);
96}
97
98Sema::OwningExprResult
99TemplateExprInstantiator::VisitGNUNullExpr(GNUNullExpr *E) {
100 return SemaRef.Clone(E);
101}
102
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000103Sema::OwningExprResult
104TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr(
105 UnresolvedFunctionNameExpr *E) {
106 return SemaRef.Clone(E);
107}
108
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000109Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000110TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
111 Decl *D = E->getDecl();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000112 ValueDecl *NewD = 0;
Douglas Gregoraa6af222009-03-25 00:27:28 +0000113 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
114 assert(NTTP->getDepth() == 0 && "No nested templates yet");
115 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
116 QualType T = Arg.getIntegralType();
117 if (T->isCharType() || T->isWideCharType())
118 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
119 Arg.getAsIntegral()->getZExtValue(),
120 T->isWideCharType(),
121 T,
122 E->getSourceRange().getBegin()));
123 else if (T->isBooleanType())
124 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
125 Arg.getAsIntegral()->getBoolValue(),
126 T,
127 E->getSourceRange().getBegin()));
128
129 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
130 *Arg.getAsIntegral(),
131 T,
132 E->getSourceRange().getBegin()));
Douglas Gregordd027302009-05-19 23:10:31 +0000133 } else if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000134 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Parm);
Douglas Gregordd027302009-05-19 23:10:31 +0000135 } else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
136 if (Var->hasLocalStorage())
137 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Var);
138 else
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000139 assert(false &&
140 "FIXME: instantiation of non-local variable declarations");
Douglas Gregordd027302009-05-19 23:10:31 +0000141 } else if (isa<FunctionDecl>(D) || isa<OverloadedFunctionDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000142 // FIXME: Instantiate decl!
143 NewD = cast<ValueDecl>(D);
Douglas Gregordd027302009-05-19 23:10:31 +0000144 } else
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000145 assert(false && "FIXME: unhandled declaration reference kind");
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000146
147 if (!NewD)
148 return SemaRef.ExprError();
149
150 QualType T = NewD->getType();
151 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000152 T.getNonReferenceType(),
153 E->getLocation(),
154 T->isDependentType(),
155 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000156}
157
158Sema::OwningExprResult
159TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
160 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
161 if (SubExpr.isInvalid())
162 return SemaRef.ExprError();
163
164 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
165 E->getLParen(), E->getRParen(),
166 (Expr *)SubExpr.release()));
167}
168
169Sema::OwningExprResult
170TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
171 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
172 if (Arg.isInvalid())
173 return SemaRef.ExprError();
174
175 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
176 E->getOpcode(),
177 move(Arg));
178}
179
180Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000181TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
182 Sema::OwningExprResult LHS = Visit(E->getLHS());
183 if (LHS.isInvalid())
184 return SemaRef.ExprError();
185
186 Sema::OwningExprResult RHS = Visit(E->getRHS());
187 if (RHS.isInvalid())
188 return SemaRef.ExprError();
189
190 // Since the overloaded array-subscript operator (operator[]) can
191 // only be a member function, we can make several simplifying
192 // assumptions here:
193 // 1) Normal name lookup (from the current scope) will not ever
194 // find any declarations of operator[] that won't also be found be
195 // member operator lookup, so it is safe to pass a NULL Scope
196 // during the instantiation to avoid the lookup entirely.
197 //
198 // 2) Neither normal name lookup nor argument-dependent lookup at
199 // template definition time will find any operators that won't be
200 // found at template instantiation time, so we do not need to
201 // cache the results of name lookup as we do for the binary
202 // operators.
203 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
204 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
205 /*FIXME:*/LLocFake,
206 move(RHS),
207 E->getRBracketLoc());
208}
209
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000210Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
211 // Instantiate callee
212 OwningExprResult Callee = Visit(E->getCallee());
213 if (Callee.isInvalid())
214 return SemaRef.ExprError();
215
216 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000217 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000218 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
219 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
220 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000221 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000222 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000223
224 FakeCommaLocs.push_back(
225 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
226 Args.push_back(Arg.takeAs<Expr>());
227 }
228
229 SourceLocation FakeLParenLoc
230 = ((Expr *)Callee.get())->getSourceRange().getBegin();
231 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
232 /*FIXME:*/FakeLParenLoc,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000233 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000234 /*FIXME:*/&FakeCommaLocs.front(),
235 E->getRParenLoc());
236}
237
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000238Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000239TemplateExprInstantiator::VisitMemberExpr(MemberExpr *E) {
240 // Instantiate the base of the expression.
241 OwningExprResult Base = Visit(E->getBase());
242 if (Base.isInvalid())
243 return SemaRef.ExprError();
244
245 // FIXME: Handle declaration names here
246 SourceLocation FakeOperatorLoc =
247 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
248 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
249 move(Base),
250 /*FIXME*/FakeOperatorLoc,
251 E->isArrow()? tok::arrow
252 : tok::period,
253 E->getMemberLoc(),
254 /*FIXME:*/*E->getMemberDecl()->getIdentifier(),
255 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
256}
257
258Sema::OwningExprResult
Douglas Gregor690dc7f2009-05-21 23:48:18 +0000259TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
260 SourceLocation FakeTypeLoc
261 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
262 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
263 FakeTypeLoc,
264 DeclarationName());
265 if (T.isNull())
266 return SemaRef.ExprError();
267
268 OwningExprResult Init = Visit(E->getInitializer());
269 if (Init.isInvalid())
270 return SemaRef.ExprError();
271
272 return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
273 T.getAsOpaquePtr(),
274 /*FIXME*/E->getLParenLoc(),
275 move(Init));
276}
277
278Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000279TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
280 Sema::OwningExprResult LHS = Visit(E->getLHS());
281 if (LHS.isInvalid())
282 return SemaRef.ExprError();
283
284 Sema::OwningExprResult RHS = Visit(E->getRHS());
285 if (RHS.isInvalid())
286 return SemaRef.ExprError();
287
288 Sema::OwningExprResult Result
289 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
290 E->getOpcode(),
291 (Expr *)LHS.get(),
292 (Expr *)RHS.get());
293 if (Result.isInvalid())
294 return SemaRef.ExprError();
295
296 LHS.release();
297 RHS.release();
298 return move(Result);
299}
300
301Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000302TemplateExprInstantiator::VisitCompoundAssignOperator(
303 CompoundAssignOperator *E) {
304 return VisitBinaryOperator(E);
305}
306
307Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000308TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
309 Sema::OwningExprResult First = Visit(E->getArg(0));
310 if (First.isInvalid())
311 return SemaRef.ExprError();
312
313 Expr *Args[2] = { (Expr *)First.get(), 0 };
314
315 Sema::OwningExprResult Second(SemaRef);
316 if (E->getNumArgs() == 2) {
317 Second = Visit(E->getArg(1));
318
319 if (Second.isInvalid())
320 return SemaRef.ExprError();
321
322 Args[1] = (Expr *)Second.get();
323 }
324
325 if (!E->isTypeDependent()) {
326 // Since our original expression was not type-dependent, we do not
327 // perform lookup again at instantiation time (C++ [temp.dep]p1).
328 // Instead, we just build the new overloaded operator call
329 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000330 OwningExprResult Callee = Visit(E->getCallee());
331 if (Callee.isInvalid())
332 return SemaRef.ExprError();
333
Douglas Gregoraa6af222009-03-25 00:27:28 +0000334 First.release();
335 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000336
Douglas Gregoraa6af222009-03-25 00:27:28 +0000337 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
338 SemaRef.Context,
339 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000340 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000341 Args, E->getNumArgs(),
342 E->getType(),
343 E->getOperatorLoc()));
344 }
345
346 bool isPostIncDec = E->getNumArgs() == 2 &&
347 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
348 if (E->getNumArgs() == 1 || isPostIncDec) {
349 if (!Args[0]->getType()->isOverloadableType()) {
350 // The argument is not of overloadable type, so try to create a
351 // built-in unary operation.
352 UnaryOperator::Opcode Opc
353 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
354
355 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
356 move(First));
357 }
358
359 // Fall through to perform overload resolution
360 } else {
361 assert(E->getNumArgs() == 2 && "Expected binary operation");
362
363 Sema::OwningExprResult Result(SemaRef);
364 if (!Args[0]->getType()->isOverloadableType() &&
365 !Args[1]->getType()->isOverloadableType()) {
366 // Neither of the arguments is an overloadable type, so try to
367 // create a built-in binary operation.
368 BinaryOperator::Opcode Opc =
369 BinaryOperator::getOverloadedOpcode(E->getOperator());
370 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
371 Args[0], Args[1]);
372 if (Result.isInvalid())
373 return SemaRef.ExprError();
374
375 First.release();
376 Second.release();
377 return move(Result);
378 }
379
380 // Fall through to perform overload resolution.
381 }
382
383 // Compute the set of functions that were found at template
384 // definition time.
385 Sema::FunctionSet Functions;
386 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
387 OverloadedFunctionDecl *Overloads
388 = cast<OverloadedFunctionDecl>(DRE->getDecl());
389
390 // FIXME: Do we have to check
391 // IsAcceptableNonMemberOperatorCandidate for each of these?
392 for (OverloadedFunctionDecl::function_iterator
393 F = Overloads->function_begin(),
394 FEnd = Overloads->function_end();
395 F != FEnd; ++F)
396 Functions.insert(*F);
397
398 // Add any functions found via argument-dependent lookup.
399 DeclarationName OpName
400 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
401 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
402
403 // Create the overloaded operator invocation.
404 if (E->getNumArgs() == 1 || isPostIncDec) {
405 UnaryOperator::Opcode Opc
406 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
407 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
408 Functions, move(First));
409 }
410
Mike Stump390b4cc2009-05-16 07:39:55 +0000411 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
412 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000413 BinaryOperator::Opcode Opc =
414 BinaryOperator::getOverloadedOpcode(E->getOperator());
415 OwningExprResult Result
416 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
417 Functions, Args[0], Args[1]);
418
419 if (Result.isInvalid())
420 return SemaRef.ExprError();
421
422 First.release();
423 Second.release();
424 return move(Result);
425}
426
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000427Sema::OwningExprResult
428TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
429 VarDecl *Var
430 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
431 SemaRef.CurContext,
432 TemplateArgs));
433 if (!Var)
434 return SemaRef.ExprError();
435
Douglas Gregore06274d2009-05-20 21:51:01 +0000436 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000437 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
438 E->getStartLoc(),
439 SourceLocation(),
440 Var));
441}
442
Douglas Gregoraa6af222009-03-25 00:27:28 +0000443Sema::OwningExprResult
444TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
445 Sema::OwningExprResult Cond = Visit(E->getCond());
446 if (Cond.isInvalid())
447 return SemaRef.ExprError();
448
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000449 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
450 TemplateArgs);
451 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000452 return SemaRef.ExprError();
453
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000454 Sema::OwningExprResult RHS = Visit(E->getRHS());
455 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000456 return SemaRef.ExprError();
457
458 if (!E->isTypeDependent()) {
459 // Since our original expression was not type-dependent, we do not
460 // perform lookup again at instantiation time (C++ [temp.dep]p1).
461 // Instead, we just build the new conditional operator call expression.
462 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
463 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000464 LHS.takeAs<Expr>(),
465 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000466 E->getType()));
467 }
468
469
470 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
471 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000472 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000473}
474
Douglas Gregor76658232009-05-22 23:25:52 +0000475Sema::OwningExprResult
476TemplateExprInstantiator::VisitAddrLabelExpr(AddrLabelExpr *E) {
477 return SemaRef.ActOnAddrLabel(E->getAmpAmpLoc(),
478 E->getLabelLoc(),
479 E->getLabel()->getID());
480}
481
Douglas Gregorcd938172009-05-19 20:31:21 +0000482Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000483 Sema::OwningStmtResult SubStmt
484 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000485 if (SubStmt.isInvalid())
486 return SemaRef.ExprError();
487
488 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
489 E->getRParenLoc());
490}
491
Douglas Gregoraa6af222009-03-25 00:27:28 +0000492Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000493TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000494 assert(false && "__builtin_types_compatible_p is not legal in C++");
495 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000496}
497
498Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000499TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000500 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000501 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
502 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000503 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000504 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000505
506 SubExprs.push_back(SubExpr.takeAs<Expr>());
507 }
508
509 // Find the declaration for __builtin_shufflevector
510 const IdentifierInfo &Name
511 = SemaRef.Context.Idents.get("__builtin_shufflevector");
512 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
513 DeclContext::lookup_result Lookup
514 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
515 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
516
517 // Build a reference to the __builtin_shufflevector builtin
518 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
519 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
520 E->getBuiltinLoc(),
521 false, false);
522 SemaRef.UsualUnaryConversions(Callee);
523
524 // Build the CallExpr
525 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000526 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000527 SubExprs.size(),
528 Builtin->getResultType(),
529 E->getRParenLoc());
530 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
531
532 // Type-check the __builtin_shufflevector expression.
533 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
534 if (Result.isInvalid())
535 return SemaRef.ExprError();
536
537 OwnedCall.release();
538 return move(Result);
539}
540
541Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000542TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
543 OwningExprResult Cond = Visit(E->getCond());
544 if (Cond.isInvalid())
545 return SemaRef.ExprError();
546
547 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
548 if (LHS.isInvalid())
549 return SemaRef.ExprError();
550
551 OwningExprResult RHS = Visit(E->getRHS());
552 if (RHS.isInvalid())
553 return SemaRef.ExprError();
554
555 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
556 move(Cond), move(LHS), move(RHS),
557 E->getRParenLoc());
558}
559
Douglas Gregordd027302009-05-19 23:10:31 +0000560Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
561 OwningExprResult SubExpr = Visit(E->getSubExpr());
562 if (SubExpr.isInvalid())
563 return SemaRef.ExprError();
564
565 SourceLocation FakeTypeLoc
566 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
567 .getEnd());
568 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
569 /*FIXME:*/FakeTypeLoc,
570 DeclarationName());
571 if (T.isNull())
572 return SemaRef.ExprError();
573
574 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
575 T.getAsOpaquePtr(), E->getRParenLoc());
576}
577
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000578Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000579TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
580 ExprVector Inits(SemaRef);
581 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
582 OwningExprResult Init = Visit(E->getInit(I));
583 if (Init.isInvalid())
584 return SemaRef.ExprError();
585 Inits.push_back(Init.takeAs<Expr>());
586 }
587
588 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
589 E->getRBraceLoc());
590}
591
592Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000593TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
594 Designation Desig;
595
596 // Instantiate the initializer value
597 OwningExprResult Init = Visit(E->getInit());
598 if (Init.isInvalid())
599 return SemaRef.ExprError();
600
601 // Instantiate the designators.
602 ExprVector ArrayExprs(SemaRef); // Expresses used in array designators
603 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
604 DEnd = E->designators_end();
605 D != DEnd; ++D) {
606 if (D->isFieldDesignator()) {
607 Desig.AddDesignator(Designator::getField(D->getFieldName(),
608 D->getDotLoc(),
609 D->getFieldLoc()));
610 continue;
611 }
612
613 if (D->isArrayDesignator()) {
614 OwningExprResult Index = Visit(E->getArrayIndex(*D));
615 if (Index.isInvalid())
616 return SemaRef.ExprError();
617
618 Desig.AddDesignator(Designator::getArray(Index.get(),
619 D->getLBracketLoc()));
620
621 ArrayExprs.push_back(Index.release());
622 continue;
623 }
624
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000625 assert(D->isArrayRangeDesignator() && "New kind of designator?");
626 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
627 if (Start.isInvalid())
628 return SemaRef.ExprError();
629
630 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
631 if (End.isInvalid())
632 return SemaRef.ExprError();
633
634 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
635 End.get(),
636 D->getLBracketLoc(),
637 D->getEllipsisLoc()));
638
639 ArrayExprs.push_back(Start.release());
640 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000641 }
642
643 OwningExprResult Result =
644 SemaRef.ActOnDesignatedInitializer(Desig,
645 E->getEqualOrColonLoc(),
646 E->usesGNUSyntax(),
647 move(Init));
648 if (Result.isInvalid())
649 return SemaRef.ExprError();
650
651 ArrayExprs.take();
652 return move(Result);
653}
654
655Sema::OwningExprResult
656TemplateExprInstantiator::VisitImplicitValueInitExpr(
657 ImplicitValueInitExpr *E) {
658 assert(!E->isTypeDependent() && !E->isValueDependent() &&
659 "ImplicitValueInitExprs are never dependent");
660 return SemaRef.Clone(E);
661}
662
663Sema::OwningExprResult
Douglas Gregorbec53e72009-05-22 23:07:44 +0000664TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
665 OwningExprResult Base = Visit(E->getBase());
666 if (Base.isInvalid())
667 return SemaRef.ExprError();
668
669 SourceLocation FakeOperatorLoc =
670 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
671 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
672 move(Base),
673 /*FIXME*/FakeOperatorLoc,
674 tok::period,
675 E->getAccessorLoc(),
676 E->getAccessor(),
677 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
678}
679
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000680Sema::OwningExprResult
681TemplateExprInstantiator::VisitBlockExpr(BlockExpr *E) {
682 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
683 return SemaRef.ExprError();
684}
685
686Sema::OwningExprResult
687TemplateExprInstantiator::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
688 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
689 return SemaRef.ExprError();
690}
691
Douglas Gregorbec53e72009-05-22 23:07:44 +0000692Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000693TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
694 bool isSizeOf = E->isSizeOf();
695
696 if (E->isArgumentType()) {
697 QualType T = E->getArgumentType();
698 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000699 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000700 /*FIXME*/E->getOperatorLoc(),
701 &SemaRef.PP.getIdentifierTable().get("sizeof"));
702 if (T.isNull())
703 return SemaRef.ExprError();
704 }
705
706 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
707 E->getSourceRange());
708 }
709
710 Sema::OwningExprResult Arg = Visit(E->getArgumentExpr());
711 if (Arg.isInvalid())
712 return SemaRef.ExprError();
713
714 Sema::OwningExprResult Result
715 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
716 isSizeOf, E->getSourceRange());
717 if (Result.isInvalid())
718 return SemaRef.ExprError();
719
720 Arg.release();
721 return move(Result);
722}
723
724Sema::OwningExprResult
725TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000726 NestedNameSpecifier *NNS
727 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
728 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000729 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000730 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000731 return SemaRef.ExprError();
732
Douglas Gregorab452ba2009-03-26 23:50:42 +0000733 CXXScopeSpec SS;
734 SS.setRange(E->getQualifierRange());
735 SS.setScopeRep(NNS);
736
Douglas Gregoraa6af222009-03-25 00:27:28 +0000737 // FIXME: We're passing in a NULL scope, because
738 // ActOnDeclarationNameExpr doesn't actually use the scope when we
739 // give it a non-empty scope specifier. Investigate whether it would
740 // be better to refactor ActOnDeclarationNameExpr.
741 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
742 E->getDeclName(),
743 /*HasTrailingLParen=*/false,
744 &SS,
745 /*FIXME:isAddressOfOperand=*/false);
746}
747
748Sema::OwningExprResult
749TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
750 CXXTemporaryObjectExpr *E) {
751 QualType T = E->getType();
752 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000753 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000754 E->getTypeBeginLoc(), DeclarationName());
755 if (T.isNull())
756 return SemaRef.ExprError();
757 }
758
Douglas Gregord7e27052009-05-20 22:33:37 +0000759 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000760 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000761 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
762 ArgEnd = E->arg_end();
763 Arg != ArgEnd; ++Arg) {
764 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000765 if (InstantiatedArg.isInvalid())
766 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000767
768 Args.push_back((Expr *)InstantiatedArg.release());
769 }
770
Douglas Gregord7e27052009-05-20 22:33:37 +0000771 SourceLocation CommaLoc;
772 // FIXME: HACK!
773 if (Args.size() > 1) {
774 Expr *First = (Expr *)Args[0];
775 CommaLoc
776 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000777 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000778 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
779 /*, FIXME*/),
780 T.getAsOpaquePtr(),
781 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000782 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000783 /*HACK*/&CommaLoc,
784 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000785}
786
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000787Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
788 assert(false && "Cannot instantiate abstract CastExpr");
789 return SemaRef.ExprError();
790}
791
Douglas Gregoraa6af222009-03-25 00:27:28 +0000792Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
793 ImplicitCastExpr *E) {
794 assert(!E->isTypeDependent() && "Implicit casts must have known types");
795
796 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
797 if (SubExpr.isInvalid())
798 return SemaRef.ExprError();
799
800 ImplicitCastExpr *ICE =
801 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
802 (Expr *)SubExpr.release(),
803 E->isLvalueCast());
804 return SemaRef.Owned(ICE);
805}
806
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000807Sema::OwningExprResult
808TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
809 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
810 return SemaRef.ExprError();
811}
812
813Sema::OwningExprResult
814TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
815 // Instantiate the type that we're casting to.
816 SourceLocation TypeStartLoc
817 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
818 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
819 TemplateArgs,
820 TypeStartLoc,
821 DeclarationName());
822 if (ExplicitTy.isNull())
823 return SemaRef.ExprError();
824
825 // Instantiate the subexpression.
826 OwningExprResult SubExpr = Visit(E->getSubExpr());
827 if (SubExpr.isInvalid())
828 return SemaRef.ExprError();
829
830 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
831 ExplicitTy.getAsOpaquePtr(),
832 E->getRParenLoc(),
833 move(SubExpr));
834}
835
836Sema::OwningExprResult
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000837TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
838 return VisitCallExpr(E);
839}
840
841Sema::OwningExprResult
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000842TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
843 // Figure out which cast operator we're dealing with.
844 tok::TokenKind Kind;
845 switch (E->getStmtClass()) {
846 case Stmt::CXXStaticCastExprClass:
847 Kind = tok::kw_static_cast;
848 break;
849
850 case Stmt::CXXDynamicCastExprClass:
851 Kind = tok::kw_dynamic_cast;
852 break;
853
854 case Stmt::CXXReinterpretCastExprClass:
855 Kind = tok::kw_reinterpret_cast;
856 break;
857
858 case Stmt::CXXConstCastExprClass:
859 Kind = tok::kw_const_cast;
860 break;
861
862 default:
863 assert(false && "Invalid C++ named cast");
864 return SemaRef.ExprError();
865 }
866
867 // Instantiate the type that we're casting to.
868 SourceLocation TypeStartLoc
869 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
870 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
871 TemplateArgs,
872 TypeStartLoc,
873 DeclarationName());
874 if (ExplicitTy.isNull())
875 return SemaRef.ExprError();
876
877 // Instantiate the subexpression.
878 OwningExprResult SubExpr = Visit(E->getSubExpr());
879 if (SubExpr.isInvalid())
880 return SemaRef.ExprError();
881
882 SourceLocation FakeLAngleLoc
883 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
884 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
885 SourceLocation FakeRParenLoc
886 = SemaRef.PP.getLocForEndOfToken(
887 E->getSubExpr()->getSourceRange().getEnd());
888 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
889 /*FIXME:*/FakeLAngleLoc,
890 ExplicitTy.getAsOpaquePtr(),
891 /*FIXME:*/FakeRAngleLoc,
892 /*FIXME:*/FakeRAngleLoc,
893 move(SubExpr),
894 /*FIXME:*/FakeRParenLoc);
895}
896
897Sema::OwningExprResult
898TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
899 return VisitCXXNamedCastExpr(E);
900}
901
902Sema::OwningExprResult
903TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
904 return VisitCXXNamedCastExpr(E);
905}
906
907Sema::OwningExprResult
908TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
909 CXXReinterpretCastExpr *E) {
910 return VisitCXXNamedCastExpr(E);
911}
912
913Sema::OwningExprResult
914TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
915 return VisitCXXNamedCastExpr(E);
916}
917
Anders Carlsson0712d292009-05-15 20:26:03 +0000918Sema::OwningExprResult
919TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
920 QualType ThisType =
921 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
922
923 CXXThisExpr *TE =
924 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
925
926 return SemaRef.Owned(TE);
927}
928
Douglas Gregoraa6af222009-03-25 00:27:28 +0000929Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000930TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
931 if (E->isTypeOperand()) {
932 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
933 TemplateArgs,
934 /*FIXME*/E->getSourceRange().getBegin(),
935 DeclarationName());
936 if (T.isNull())
937 return SemaRef.ExprError();
938
939 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
940 /*FIXME*/E->getSourceRange().getBegin(),
941 true, T.getAsOpaquePtr(),
942 E->getSourceRange().getEnd());
943 }
944
945 OwningExprResult Operand = Visit(E->getExprOperand());
946 if (Operand.isInvalid())
947 return SemaRef.ExprError();
948
949 OwningExprResult Result
950 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
951 /*FIXME*/E->getSourceRange().getBegin(),
952 false, Operand.get(),
953 E->getSourceRange().getEnd());
954 if (Result.isInvalid())
955 return SemaRef.ExprError();
956
957 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
958 return move(Result);
959}
960
961Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +0000962TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
963 OwningExprResult SubExpr(SemaRef, (void *)0);
964 if (E->getSubExpr()) {
965 SubExpr = Visit(E->getSubExpr());
966 if (SubExpr.isInvalid())
967 return SemaRef.ExprError();
968 }
969
970 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
971}
972
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000973Sema::OwningExprResult
974TemplateExprInstantiator::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
975 assert(false &&
976 "FIXME: Instantiation for default arguments is unimplemented");
977 return SemaRef.ExprError();
978}
979
Douglas Gregor42e5b502009-05-21 17:37:52 +0000980Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +0000981TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
982 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
983 ->isDependentType() && "Dependent constructor shouldn't be here");
984
985 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
986 /*FIXME*/E->getSourceRange().getBegin(),
987 DeclarationName());
988 if (T.isNull())
989 return SemaRef.ExprError();
990
Douglas Gregord7e27052009-05-20 22:33:37 +0000991 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +0000992 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
993 ArgEnd = E->arg_end();
994 Arg != ArgEnd; ++Arg) {
995 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000996 if (ArgInst.isInvalid())
997 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +0000998
999 Args.push_back(ArgInst.takeAs<Expr>());
1000 }
1001
1002
Douglas Gregord7e27052009-05-20 22:33:37 +00001003 VarDecl *Var = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
1004 SemaRef.CurContext,
1005 TemplateArgs));
1006 if (!Var)
Douglas Gregord94546a2009-05-20 21:38:11 +00001007 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001008
Douglas Gregore06274d2009-05-20 21:51:01 +00001009 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregord94546a2009-05-20 21:38:11 +00001010 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, Var, T,
1011 E->getConstructor(),
1012 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +00001013 Args.takeAs<Expr>(),
1014 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001015}
1016
1017Sema::OwningExprResult
1018TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1019 CXXFunctionalCastExpr *E) {
1020 // Instantiate the type that we're casting to.
1021 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1022 TemplateArgs,
1023 E->getTypeBeginLoc(),
1024 DeclarationName());
1025 if (ExplicitTy.isNull())
1026 return SemaRef.ExprError();
1027
1028 // Instantiate the subexpression.
1029 OwningExprResult SubExpr = Visit(E->getSubExpr());
1030 if (SubExpr.isInvalid())
1031 return SemaRef.ExprError();
1032
1033 // FIXME: The end of the type's source range is wrong
1034 Expr *Sub = SubExpr.takeAs<Expr>();
1035 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1036 ExplicitTy.getAsOpaquePtr(),
1037 /*FIXME:*/E->getTypeBeginLoc(),
1038 Sema::MultiExprArg(SemaRef,
1039 (void **)&Sub,
1040 1),
1041 0,
1042 E->getRParenLoc());
1043}
1044
1045Sema::OwningExprResult
1046TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1047 return SemaRef.Clone(E);
1048}
1049
1050Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001051TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1052 // Instantiate the type that we're allocating
1053 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1054 TemplateArgs,
1055 /*FIXME:*/E->getSourceRange().getBegin(),
1056 DeclarationName());
1057 if (AllocType.isNull())
1058 return SemaRef.ExprError();
1059
1060 // Instantiate the size of the array we're allocating (if any).
1061 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1062 TemplateArgs);
1063 if (ArraySize.isInvalid())
1064 return SemaRef.ExprError();
1065
1066 // Instantiate the placement arguments (if any).
1067 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1068 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1069 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1070 if (Arg.isInvalid())
1071 return SemaRef.ExprError();
1072
1073 PlacementArgs.push_back(Arg.take());
1074 }
1075
1076 // Instantiate the constructor arguments (if any).
1077 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1078 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1079 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1080 if (Arg.isInvalid())
1081 return SemaRef.ExprError();
1082
1083 ConstructorArgs.push_back(Arg.take());
1084 }
1085
1086 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1087 E->isGlobalNew(),
1088 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001089 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001090 /*FIXME*/SourceLocation(),
1091 E->isParenTypeId(),
1092 AllocType,
1093 /*FIXME*/E->getSourceRange().getBegin(),
1094 SourceRange(),
1095 move(ArraySize),
1096 /*FIXME*/SourceLocation(),
1097 Sema::MultiExprArg(SemaRef,
1098 ConstructorArgs.take(),
1099 ConstructorArgs.size()),
1100 E->getSourceRange().getEnd());
1101}
1102
1103Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001104TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1105 OwningExprResult Operand = Visit(E->getArgument());
1106 if (Operand.isInvalid())
1107 return SemaRef.ExprError();
1108
1109 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1110 E->isGlobalDelete(),
1111 E->isArrayForm(),
1112 move(Operand));
1113}
1114
1115Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001116TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1117 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1118 /*FIXME*/E->getSourceRange().getBegin(),
1119 DeclarationName());
1120 if (T.isNull())
1121 return SemaRef.ExprError();
1122
1123 SourceLocation FakeLParenLoc
1124 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1125 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1126 E->getSourceRange().getBegin(),
1127 /*FIXME*/FakeLParenLoc,
1128 T.getAsOpaquePtr(),
1129 E->getSourceRange().getEnd());
1130}
1131
1132Sema::OwningExprResult
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001133TemplateExprInstantiator::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
1134 NestedNameSpecifier *NNS
1135 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
1136 E->getQualifierRange(),
1137 TemplateArgs);
1138 if (!NNS)
1139 return SemaRef.ExprError();
1140
1141 CXXScopeSpec SS;
1142 SS.setRange(E->getQualifierRange());
1143 SS.setScopeRep(NNS);
1144 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0,
1145 E->getLocation(),
1146 E->getDecl()->getDeclName(),
1147 /*Trailing lparen=*/false,
1148 &SS,
1149 /*FIXME:*/false);
1150}
1151
1152Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001153TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1154 CXXExprWithTemporaries *E) {
1155 OwningExprResult SubExpr = Visit(E->getSubExpr());
1156 if (SubExpr.isInvalid())
1157 return SemaRef.ExprError();
1158
1159 return SemaRef.ActOnFinishFullExpr(move(SubExpr));
1160}
1161
1162Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001163TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1164 CXXUnresolvedConstructExpr *E) {
1165 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1166 E->getTypeBeginLoc(),
1167 DeclarationName());
1168 if (T.isNull())
1169 return SemaRef.ExprError();
1170
Douglas Gregord7e27052009-05-20 22:33:37 +00001171 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001172 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1173 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1174 ArgEnd = E->arg_end();
1175 Arg != ArgEnd; ++Arg) {
1176 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001177 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001178 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001179
1180 FakeCommaLocs.push_back(
1181 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1182 Args.push_back(InstArg.takeAs<Expr>());
1183 }
1184
1185 // FIXME: The end of the type range isn't exactly correct.
1186 // FIXME: we're faking the locations of the commas
1187 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1188 E->getLParenLoc()),
1189 T.getAsOpaquePtr(),
1190 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001191 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001192 &FakeCommaLocs.front(),
1193 E->getRParenLoc());
1194}
1195
1196Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001197TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
1198 CXXUnresolvedMemberExpr *E) {
1199 // Instantiate the base of the expression.
1200 OwningExprResult Base = Visit(E->getBase());
1201 if (Base.isInvalid())
1202 return SemaRef.ExprError();
1203
1204 // FIXME: Instantiate the declaration name.
1205 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1206 move(Base), E->getOperatorLoc(),
1207 E->isArrow()? tok::arrow
1208 : tok::period,
1209 E->getMemberLoc(),
1210 /*FIXME:*/*E->getMember().getAsIdentifierInfo(),
1211 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1212}
1213
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001214//----------------------------------------------------------------------------
1215// Objective-C Expressions
1216//----------------------------------------------------------------------------
1217Sema::OwningExprResult
1218TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) {
1219 assert(false && "FIXME: Template instantiations for ObjC expressions");
1220 return SemaRef.ExprError();
1221}
1222
1223Sema::OwningExprResult
1224TemplateExprInstantiator::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1225 assert(false && "FIXME: Template instantiations for ObjC expressions");
1226 return SemaRef.ExprError();
1227}
1228
1229Sema::OwningExprResult
1230TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1231 assert(false && "FIXME: Template instantiations for ObjC expressions");
1232 return SemaRef.ExprError();
1233}
1234
1235Sema::OwningExprResult
1236TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
1237 assert(false && "FIXME: Template instantiations for ObjC expressions");
1238 return SemaRef.ExprError();
1239}
1240
1241Sema::OwningExprResult
1242TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
1243 assert(false && "FIXME: Template instantiations for ObjC expressions");
1244 return SemaRef.ExprError();
1245}
1246
1247Sema::OwningExprResult
1248TemplateExprInstantiator::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1249 assert(false && "FIXME: Template instantiations for ObjC expressions");
1250 return SemaRef.ExprError();
1251}
1252
1253Sema::OwningExprResult
1254TemplateExprInstantiator::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1255 assert(false && "FIXME: Template instantiations for ObjC expressions");
1256 return SemaRef.ExprError();
1257}
1258
1259Sema::OwningExprResult
1260TemplateExprInstantiator::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) {
1261 assert(false && "FIXME: Template instantiations for ObjC expressions");
1262 return SemaRef.ExprError();
1263}
1264
1265Sema::OwningExprResult
1266TemplateExprInstantiator::VisitObjCSuperExpr(ObjCSuperExpr *E) {
1267 assert(false && "FIXME: Template instantiations for ObjC expressions");
1268 return SemaRef.ExprError();
1269}
1270
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001271Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001272Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001273 if (!E)
1274 return Owned((Expr *)0);
1275
Douglas Gregor7e063902009-05-11 23:53:27 +00001276 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001277 return Instantiator.Visit(E);
1278}