blob: 9dc14d551bad1d82c548b49542a8aabb060afa4a [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 Gregor5f8bd592009-05-26 22:09:24 +0000141 } else if (isa<FunctionDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000142 // FIXME: Instantiate decl!
143 NewD = cast<ValueDecl>(D);
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000144 } else if (isa<OverloadedFunctionDecl>(D)) {
145 // FIXME: instantiate decls?
146 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(cast<NamedDecl>(D),
147 SemaRef.Context.OverloadTy,
148 E->getLocation(),
149 false, false));
Douglas Gregordd027302009-05-19 23:10:31 +0000150 } else
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000151 assert(false && "FIXME: unhandled declaration reference kind");
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000152
153 if (!NewD)
154 return SemaRef.ExprError();
155
156 QualType T = NewD->getType();
157 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000158 T.getNonReferenceType(),
159 E->getLocation(),
160 T->isDependentType(),
161 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000162}
163
164Sema::OwningExprResult
165TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
166 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
167 if (SubExpr.isInvalid())
168 return SemaRef.ExprError();
169
170 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
171 E->getLParen(), E->getRParen(),
172 (Expr *)SubExpr.release()));
173}
174
175Sema::OwningExprResult
176TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
177 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
178 if (Arg.isInvalid())
179 return SemaRef.ExprError();
180
181 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
182 E->getOpcode(),
183 move(Arg));
184}
185
186Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000187TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
188 Sema::OwningExprResult LHS = Visit(E->getLHS());
189 if (LHS.isInvalid())
190 return SemaRef.ExprError();
191
192 Sema::OwningExprResult RHS = Visit(E->getRHS());
193 if (RHS.isInvalid())
194 return SemaRef.ExprError();
195
196 // Since the overloaded array-subscript operator (operator[]) can
197 // only be a member function, we can make several simplifying
198 // assumptions here:
199 // 1) Normal name lookup (from the current scope) will not ever
200 // find any declarations of operator[] that won't also be found be
201 // member operator lookup, so it is safe to pass a NULL Scope
202 // during the instantiation to avoid the lookup entirely.
203 //
204 // 2) Neither normal name lookup nor argument-dependent lookup at
205 // template definition time will find any operators that won't be
206 // found at template instantiation time, so we do not need to
207 // cache the results of name lookup as we do for the binary
208 // operators.
209 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
210 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
211 /*FIXME:*/LLocFake,
212 move(RHS),
213 E->getRBracketLoc());
214}
215
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000216Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
217 // Instantiate callee
218 OwningExprResult Callee = Visit(E->getCallee());
219 if (Callee.isInvalid())
220 return SemaRef.ExprError();
221
222 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000223 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000224 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
225 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
226 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000227 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000228 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000229
230 FakeCommaLocs.push_back(
231 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
232 Args.push_back(Arg.takeAs<Expr>());
233 }
234
235 SourceLocation FakeLParenLoc
236 = ((Expr *)Callee.get())->getSourceRange().getBegin();
237 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
238 /*FIXME:*/FakeLParenLoc,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000239 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000240 /*FIXME:*/&FakeCommaLocs.front(),
241 E->getRParenLoc());
242}
243
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000244Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000245TemplateExprInstantiator::VisitMemberExpr(MemberExpr *E) {
246 // Instantiate the base of the expression.
247 OwningExprResult Base = Visit(E->getBase());
248 if (Base.isInvalid())
249 return SemaRef.ExprError();
250
251 // FIXME: Handle declaration names here
252 SourceLocation FakeOperatorLoc =
253 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
254 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
255 move(Base),
256 /*FIXME*/FakeOperatorLoc,
257 E->isArrow()? tok::arrow
258 : tok::period,
259 E->getMemberLoc(),
260 /*FIXME:*/*E->getMemberDecl()->getIdentifier(),
261 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
262}
263
264Sema::OwningExprResult
Douglas Gregor690dc7f2009-05-21 23:48:18 +0000265TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
266 SourceLocation FakeTypeLoc
267 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
268 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
269 FakeTypeLoc,
270 DeclarationName());
271 if (T.isNull())
272 return SemaRef.ExprError();
273
274 OwningExprResult Init = Visit(E->getInitializer());
275 if (Init.isInvalid())
276 return SemaRef.ExprError();
277
278 return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
279 T.getAsOpaquePtr(),
280 /*FIXME*/E->getLParenLoc(),
281 move(Init));
282}
283
284Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000285TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
286 Sema::OwningExprResult LHS = Visit(E->getLHS());
287 if (LHS.isInvalid())
288 return SemaRef.ExprError();
289
290 Sema::OwningExprResult RHS = Visit(E->getRHS());
291 if (RHS.isInvalid())
292 return SemaRef.ExprError();
293
294 Sema::OwningExprResult Result
295 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
296 E->getOpcode(),
297 (Expr *)LHS.get(),
298 (Expr *)RHS.get());
299 if (Result.isInvalid())
300 return SemaRef.ExprError();
301
302 LHS.release();
303 RHS.release();
304 return move(Result);
305}
306
307Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000308TemplateExprInstantiator::VisitCompoundAssignOperator(
309 CompoundAssignOperator *E) {
310 return VisitBinaryOperator(E);
311}
312
313Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000314TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
315 Sema::OwningExprResult First = Visit(E->getArg(0));
316 if (First.isInvalid())
317 return SemaRef.ExprError();
318
319 Expr *Args[2] = { (Expr *)First.get(), 0 };
320
321 Sema::OwningExprResult Second(SemaRef);
322 if (E->getNumArgs() == 2) {
323 Second = Visit(E->getArg(1));
324
325 if (Second.isInvalid())
326 return SemaRef.ExprError();
327
328 Args[1] = (Expr *)Second.get();
329 }
330
331 if (!E->isTypeDependent()) {
332 // Since our original expression was not type-dependent, we do not
333 // perform lookup again at instantiation time (C++ [temp.dep]p1).
334 // Instead, we just build the new overloaded operator call
335 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000336 OwningExprResult Callee = Visit(E->getCallee());
337 if (Callee.isInvalid())
338 return SemaRef.ExprError();
339
Douglas Gregoraa6af222009-03-25 00:27:28 +0000340 First.release();
341 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000342
Douglas Gregoraa6af222009-03-25 00:27:28 +0000343 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
344 SemaRef.Context,
345 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000346 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000347 Args, E->getNumArgs(),
348 E->getType(),
349 E->getOperatorLoc()));
350 }
351
352 bool isPostIncDec = E->getNumArgs() == 2 &&
353 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
354 if (E->getNumArgs() == 1 || isPostIncDec) {
355 if (!Args[0]->getType()->isOverloadableType()) {
356 // The argument is not of overloadable type, so try to create a
357 // built-in unary operation.
358 UnaryOperator::Opcode Opc
359 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
360
361 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
362 move(First));
363 }
364
365 // Fall through to perform overload resolution
366 } else {
367 assert(E->getNumArgs() == 2 && "Expected binary operation");
368
369 Sema::OwningExprResult Result(SemaRef);
370 if (!Args[0]->getType()->isOverloadableType() &&
371 !Args[1]->getType()->isOverloadableType()) {
372 // Neither of the arguments is an overloadable type, so try to
373 // create a built-in binary operation.
374 BinaryOperator::Opcode Opc =
375 BinaryOperator::getOverloadedOpcode(E->getOperator());
376 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
377 Args[0], Args[1]);
378 if (Result.isInvalid())
379 return SemaRef.ExprError();
380
381 First.release();
382 Second.release();
383 return move(Result);
384 }
385
386 // Fall through to perform overload resolution.
387 }
388
389 // Compute the set of functions that were found at template
390 // definition time.
391 Sema::FunctionSet Functions;
392 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
393 OverloadedFunctionDecl *Overloads
394 = cast<OverloadedFunctionDecl>(DRE->getDecl());
395
396 // FIXME: Do we have to check
397 // IsAcceptableNonMemberOperatorCandidate for each of these?
398 for (OverloadedFunctionDecl::function_iterator
399 F = Overloads->function_begin(),
400 FEnd = Overloads->function_end();
401 F != FEnd; ++F)
402 Functions.insert(*F);
403
404 // Add any functions found via argument-dependent lookup.
405 DeclarationName OpName
406 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
407 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
408
409 // Create the overloaded operator invocation.
410 if (E->getNumArgs() == 1 || isPostIncDec) {
411 UnaryOperator::Opcode Opc
412 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
413 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
414 Functions, move(First));
415 }
416
Mike Stump390b4cc2009-05-16 07:39:55 +0000417 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
418 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000419 BinaryOperator::Opcode Opc =
420 BinaryOperator::getOverloadedOpcode(E->getOperator());
421 OwningExprResult Result
422 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
423 Functions, Args[0], Args[1]);
424
425 if (Result.isInvalid())
426 return SemaRef.ExprError();
427
428 First.release();
429 Second.release();
430 return move(Result);
431}
432
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000433Sema::OwningExprResult
434TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
435 VarDecl *Var
436 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
437 SemaRef.CurContext,
438 TemplateArgs));
439 if (!Var)
440 return SemaRef.ExprError();
441
Douglas Gregore06274d2009-05-20 21:51:01 +0000442 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000443 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
444 E->getStartLoc(),
445 SourceLocation(),
446 Var));
447}
448
Douglas Gregoraa6af222009-03-25 00:27:28 +0000449Sema::OwningExprResult
450TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
451 Sema::OwningExprResult Cond = Visit(E->getCond());
452 if (Cond.isInvalid())
453 return SemaRef.ExprError();
454
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000455 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
456 TemplateArgs);
457 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000458 return SemaRef.ExprError();
459
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000460 Sema::OwningExprResult RHS = Visit(E->getRHS());
461 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000462 return SemaRef.ExprError();
463
464 if (!E->isTypeDependent()) {
465 // Since our original expression was not type-dependent, we do not
466 // perform lookup again at instantiation time (C++ [temp.dep]p1).
467 // Instead, we just build the new conditional operator call expression.
468 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
469 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000470 LHS.takeAs<Expr>(),
471 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000472 E->getType()));
473 }
474
475
476 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
477 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000478 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000479}
480
Douglas Gregor76658232009-05-22 23:25:52 +0000481Sema::OwningExprResult
482TemplateExprInstantiator::VisitAddrLabelExpr(AddrLabelExpr *E) {
483 return SemaRef.ActOnAddrLabel(E->getAmpAmpLoc(),
484 E->getLabelLoc(),
485 E->getLabel()->getID());
486}
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 Gregorccb97f52009-05-21 21:38:12 +0000585TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
586 ExprVector Inits(SemaRef);
587 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
588 OwningExprResult Init = Visit(E->getInit(I));
589 if (Init.isInvalid())
590 return SemaRef.ExprError();
591 Inits.push_back(Init.takeAs<Expr>());
592 }
593
594 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
595 E->getRBraceLoc());
596}
597
598Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000599TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
600 Designation Desig;
601
602 // Instantiate the initializer value
603 OwningExprResult Init = Visit(E->getInit());
604 if (Init.isInvalid())
605 return SemaRef.ExprError();
606
607 // Instantiate the designators.
608 ExprVector ArrayExprs(SemaRef); // Expresses used in array designators
609 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
610 DEnd = E->designators_end();
611 D != DEnd; ++D) {
612 if (D->isFieldDesignator()) {
613 Desig.AddDesignator(Designator::getField(D->getFieldName(),
614 D->getDotLoc(),
615 D->getFieldLoc()));
616 continue;
617 }
618
619 if (D->isArrayDesignator()) {
620 OwningExprResult Index = Visit(E->getArrayIndex(*D));
621 if (Index.isInvalid())
622 return SemaRef.ExprError();
623
624 Desig.AddDesignator(Designator::getArray(Index.get(),
625 D->getLBracketLoc()));
626
627 ArrayExprs.push_back(Index.release());
628 continue;
629 }
630
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000631 assert(D->isArrayRangeDesignator() && "New kind of designator?");
632 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
633 if (Start.isInvalid())
634 return SemaRef.ExprError();
635
636 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
637 if (End.isInvalid())
638 return SemaRef.ExprError();
639
640 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
641 End.get(),
642 D->getLBracketLoc(),
643 D->getEllipsisLoc()));
644
645 ArrayExprs.push_back(Start.release());
646 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000647 }
648
649 OwningExprResult Result =
650 SemaRef.ActOnDesignatedInitializer(Desig,
651 E->getEqualOrColonLoc(),
652 E->usesGNUSyntax(),
653 move(Init));
654 if (Result.isInvalid())
655 return SemaRef.ExprError();
656
657 ArrayExprs.take();
658 return move(Result);
659}
660
661Sema::OwningExprResult
662TemplateExprInstantiator::VisitImplicitValueInitExpr(
663 ImplicitValueInitExpr *E) {
664 assert(!E->isTypeDependent() && !E->isValueDependent() &&
665 "ImplicitValueInitExprs are never dependent");
666 return SemaRef.Clone(E);
667}
668
669Sema::OwningExprResult
Douglas Gregorbec53e72009-05-22 23:07:44 +0000670TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
671 OwningExprResult Base = Visit(E->getBase());
672 if (Base.isInvalid())
673 return SemaRef.ExprError();
674
675 SourceLocation FakeOperatorLoc =
676 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
677 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
678 move(Base),
679 /*FIXME*/FakeOperatorLoc,
680 tok::period,
681 E->getAccessorLoc(),
682 E->getAccessor(),
683 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
684}
685
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000686Sema::OwningExprResult
687TemplateExprInstantiator::VisitBlockExpr(BlockExpr *E) {
688 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
689 return SemaRef.ExprError();
690}
691
692Sema::OwningExprResult
693TemplateExprInstantiator::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
694 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
695 return SemaRef.ExprError();
696}
697
Douglas Gregorbec53e72009-05-22 23:07:44 +0000698Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000699TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
700 bool isSizeOf = E->isSizeOf();
701
702 if (E->isArgumentType()) {
703 QualType T = E->getArgumentType();
704 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000705 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000706 /*FIXME*/E->getOperatorLoc(),
707 &SemaRef.PP.getIdentifierTable().get("sizeof"));
708 if (T.isNull())
709 return SemaRef.ExprError();
710 }
711
712 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
713 E->getSourceRange());
714 }
715
716 Sema::OwningExprResult Arg = Visit(E->getArgumentExpr());
717 if (Arg.isInvalid())
718 return SemaRef.ExprError();
719
720 Sema::OwningExprResult Result
721 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
722 isSizeOf, E->getSourceRange());
723 if (Result.isInvalid())
724 return SemaRef.ExprError();
725
726 Arg.release();
727 return move(Result);
728}
729
730Sema::OwningExprResult
731TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000732 NestedNameSpecifier *NNS
733 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
734 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000735 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000736 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000737 return SemaRef.ExprError();
738
Douglas Gregorab452ba2009-03-26 23:50:42 +0000739 CXXScopeSpec SS;
740 SS.setRange(E->getQualifierRange());
741 SS.setScopeRep(NNS);
742
Douglas Gregoraa6af222009-03-25 00:27:28 +0000743 // FIXME: We're passing in a NULL scope, because
744 // ActOnDeclarationNameExpr doesn't actually use the scope when we
745 // give it a non-empty scope specifier. Investigate whether it would
746 // be better to refactor ActOnDeclarationNameExpr.
747 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
748 E->getDeclName(),
749 /*HasTrailingLParen=*/false,
750 &SS,
751 /*FIXME:isAddressOfOperand=*/false);
752}
753
754Sema::OwningExprResult
755TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
756 CXXTemporaryObjectExpr *E) {
757 QualType T = E->getType();
758 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000759 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000760 E->getTypeBeginLoc(), DeclarationName());
761 if (T.isNull())
762 return SemaRef.ExprError();
763 }
764
Douglas Gregord7e27052009-05-20 22:33:37 +0000765 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000766 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000767 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
768 ArgEnd = E->arg_end();
769 Arg != ArgEnd; ++Arg) {
770 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000771 if (InstantiatedArg.isInvalid())
772 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000773
774 Args.push_back((Expr *)InstantiatedArg.release());
775 }
776
Douglas Gregord7e27052009-05-20 22:33:37 +0000777 SourceLocation CommaLoc;
778 // FIXME: HACK!
779 if (Args.size() > 1) {
780 Expr *First = (Expr *)Args[0];
781 CommaLoc
782 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000783 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000784 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
785 /*, FIXME*/),
786 T.getAsOpaquePtr(),
787 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000788 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000789 /*HACK*/&CommaLoc,
790 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000791}
792
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000793Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
794 assert(false && "Cannot instantiate abstract CastExpr");
795 return SemaRef.ExprError();
796}
797
Douglas Gregoraa6af222009-03-25 00:27:28 +0000798Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
799 ImplicitCastExpr *E) {
800 assert(!E->isTypeDependent() && "Implicit casts must have known types");
801
802 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
803 if (SubExpr.isInvalid())
804 return SemaRef.ExprError();
805
806 ImplicitCastExpr *ICE =
807 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
808 (Expr *)SubExpr.release(),
809 E->isLvalueCast());
810 return SemaRef.Owned(ICE);
811}
812
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000813Sema::OwningExprResult
814TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
815 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
816 return SemaRef.ExprError();
817}
818
819Sema::OwningExprResult
820TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
821 // Instantiate the type that we're casting to.
822 SourceLocation TypeStartLoc
823 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
824 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
825 TemplateArgs,
826 TypeStartLoc,
827 DeclarationName());
828 if (ExplicitTy.isNull())
829 return SemaRef.ExprError();
830
831 // Instantiate the subexpression.
832 OwningExprResult SubExpr = Visit(E->getSubExpr());
833 if (SubExpr.isInvalid())
834 return SemaRef.ExprError();
835
836 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
837 ExplicitTy.getAsOpaquePtr(),
838 E->getRParenLoc(),
839 move(SubExpr));
840}
841
842Sema::OwningExprResult
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000843TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
844 return VisitCallExpr(E);
845}
846
847Sema::OwningExprResult
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000848TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
849 // Figure out which cast operator we're dealing with.
850 tok::TokenKind Kind;
851 switch (E->getStmtClass()) {
852 case Stmt::CXXStaticCastExprClass:
853 Kind = tok::kw_static_cast;
854 break;
855
856 case Stmt::CXXDynamicCastExprClass:
857 Kind = tok::kw_dynamic_cast;
858 break;
859
860 case Stmt::CXXReinterpretCastExprClass:
861 Kind = tok::kw_reinterpret_cast;
862 break;
863
864 case Stmt::CXXConstCastExprClass:
865 Kind = tok::kw_const_cast;
866 break;
867
868 default:
869 assert(false && "Invalid C++ named cast");
870 return SemaRef.ExprError();
871 }
872
873 // Instantiate the type that we're casting to.
874 SourceLocation TypeStartLoc
875 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
876 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
877 TemplateArgs,
878 TypeStartLoc,
879 DeclarationName());
880 if (ExplicitTy.isNull())
881 return SemaRef.ExprError();
882
883 // Instantiate the subexpression.
884 OwningExprResult SubExpr = Visit(E->getSubExpr());
885 if (SubExpr.isInvalid())
886 return SemaRef.ExprError();
887
888 SourceLocation FakeLAngleLoc
889 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
890 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
891 SourceLocation FakeRParenLoc
892 = SemaRef.PP.getLocForEndOfToken(
893 E->getSubExpr()->getSourceRange().getEnd());
894 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
895 /*FIXME:*/FakeLAngleLoc,
896 ExplicitTy.getAsOpaquePtr(),
897 /*FIXME:*/FakeRAngleLoc,
898 /*FIXME:*/FakeRAngleLoc,
899 move(SubExpr),
900 /*FIXME:*/FakeRParenLoc);
901}
902
903Sema::OwningExprResult
904TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
905 return VisitCXXNamedCastExpr(E);
906}
907
908Sema::OwningExprResult
909TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
910 return VisitCXXNamedCastExpr(E);
911}
912
913Sema::OwningExprResult
914TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
915 CXXReinterpretCastExpr *E) {
916 return VisitCXXNamedCastExpr(E);
917}
918
919Sema::OwningExprResult
920TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
921 return VisitCXXNamedCastExpr(E);
922}
923
Anders Carlsson0712d292009-05-15 20:26:03 +0000924Sema::OwningExprResult
925TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
926 QualType ThisType =
927 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
928
929 CXXThisExpr *TE =
930 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
931
932 return SemaRef.Owned(TE);
933}
934
Douglas Gregoraa6af222009-03-25 00:27:28 +0000935Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000936TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
937 if (E->isTypeOperand()) {
938 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
939 TemplateArgs,
940 /*FIXME*/E->getSourceRange().getBegin(),
941 DeclarationName());
942 if (T.isNull())
943 return SemaRef.ExprError();
944
945 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
946 /*FIXME*/E->getSourceRange().getBegin(),
947 true, T.getAsOpaquePtr(),
948 E->getSourceRange().getEnd());
949 }
950
951 OwningExprResult Operand = Visit(E->getExprOperand());
952 if (Operand.isInvalid())
953 return SemaRef.ExprError();
954
955 OwningExprResult Result
956 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
957 /*FIXME*/E->getSourceRange().getBegin(),
958 false, Operand.get(),
959 E->getSourceRange().getEnd());
960 if (Result.isInvalid())
961 return SemaRef.ExprError();
962
963 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
964 return move(Result);
965}
966
967Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +0000968TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
969 OwningExprResult SubExpr(SemaRef, (void *)0);
970 if (E->getSubExpr()) {
971 SubExpr = Visit(E->getSubExpr());
972 if (SubExpr.isInvalid())
973 return SemaRef.ExprError();
974 }
975
976 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
977}
978
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000979Sema::OwningExprResult
980TemplateExprInstantiator::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
981 assert(false &&
982 "FIXME: Instantiation for default arguments is unimplemented");
983 return SemaRef.ExprError();
984}
985
Douglas Gregor42e5b502009-05-21 17:37:52 +0000986Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +0000987TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
988 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
989 ->isDependentType() && "Dependent constructor shouldn't be here");
990
991 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
992 /*FIXME*/E->getSourceRange().getBegin(),
993 DeclarationName());
994 if (T.isNull())
995 return SemaRef.ExprError();
996
Douglas Gregord7e27052009-05-20 22:33:37 +0000997 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +0000998 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
999 ArgEnd = E->arg_end();
1000 Arg != ArgEnd; ++Arg) {
1001 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001002 if (ArgInst.isInvalid())
1003 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001004
1005 Args.push_back(ArgInst.takeAs<Expr>());
1006 }
1007
1008
Douglas Gregord7e27052009-05-20 22:33:37 +00001009 VarDecl *Var = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
1010 SemaRef.CurContext,
1011 TemplateArgs));
1012 if (!Var)
Douglas Gregord94546a2009-05-20 21:38:11 +00001013 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001014
Douglas Gregore06274d2009-05-20 21:51:01 +00001015 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregord94546a2009-05-20 21:38:11 +00001016 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, Var, T,
1017 E->getConstructor(),
1018 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +00001019 Args.takeAs<Expr>(),
1020 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001021}
1022
1023Sema::OwningExprResult
1024TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1025 CXXFunctionalCastExpr *E) {
1026 // Instantiate the type that we're casting to.
1027 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1028 TemplateArgs,
1029 E->getTypeBeginLoc(),
1030 DeclarationName());
1031 if (ExplicitTy.isNull())
1032 return SemaRef.ExprError();
1033
1034 // Instantiate the subexpression.
1035 OwningExprResult SubExpr = Visit(E->getSubExpr());
1036 if (SubExpr.isInvalid())
1037 return SemaRef.ExprError();
1038
1039 // FIXME: The end of the type's source range is wrong
1040 Expr *Sub = SubExpr.takeAs<Expr>();
1041 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1042 ExplicitTy.getAsOpaquePtr(),
1043 /*FIXME:*/E->getTypeBeginLoc(),
1044 Sema::MultiExprArg(SemaRef,
1045 (void **)&Sub,
1046 1),
1047 0,
1048 E->getRParenLoc());
1049}
1050
1051Sema::OwningExprResult
1052TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1053 return SemaRef.Clone(E);
1054}
1055
1056Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001057TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1058 // Instantiate the type that we're allocating
1059 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1060 TemplateArgs,
1061 /*FIXME:*/E->getSourceRange().getBegin(),
1062 DeclarationName());
1063 if (AllocType.isNull())
1064 return SemaRef.ExprError();
1065
1066 // Instantiate the size of the array we're allocating (if any).
1067 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1068 TemplateArgs);
1069 if (ArraySize.isInvalid())
1070 return SemaRef.ExprError();
1071
1072 // Instantiate the placement arguments (if any).
1073 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1074 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1075 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1076 if (Arg.isInvalid())
1077 return SemaRef.ExprError();
1078
1079 PlacementArgs.push_back(Arg.take());
1080 }
1081
1082 // Instantiate the constructor arguments (if any).
1083 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1084 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1085 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1086 if (Arg.isInvalid())
1087 return SemaRef.ExprError();
1088
1089 ConstructorArgs.push_back(Arg.take());
1090 }
1091
1092 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1093 E->isGlobalNew(),
1094 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001095 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001096 /*FIXME*/SourceLocation(),
1097 E->isParenTypeId(),
1098 AllocType,
1099 /*FIXME*/E->getSourceRange().getBegin(),
1100 SourceRange(),
1101 move(ArraySize),
1102 /*FIXME*/SourceLocation(),
1103 Sema::MultiExprArg(SemaRef,
1104 ConstructorArgs.take(),
1105 ConstructorArgs.size()),
1106 E->getSourceRange().getEnd());
1107}
1108
1109Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001110TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1111 OwningExprResult Operand = Visit(E->getArgument());
1112 if (Operand.isInvalid())
1113 return SemaRef.ExprError();
1114
1115 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1116 E->isGlobalDelete(),
1117 E->isArrayForm(),
1118 move(Operand));
1119}
1120
1121Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001122TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1123 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1124 /*FIXME*/E->getSourceRange().getBegin(),
1125 DeclarationName());
1126 if (T.isNull())
1127 return SemaRef.ExprError();
1128
1129 SourceLocation FakeLParenLoc
1130 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1131 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1132 E->getSourceRange().getBegin(),
1133 /*FIXME*/FakeLParenLoc,
1134 T.getAsOpaquePtr(),
1135 E->getSourceRange().getEnd());
1136}
1137
1138Sema::OwningExprResult
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001139TemplateExprInstantiator::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
1140 NestedNameSpecifier *NNS
1141 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
1142 E->getQualifierRange(),
1143 TemplateArgs);
1144 if (!NNS)
1145 return SemaRef.ExprError();
1146
1147 CXXScopeSpec SS;
1148 SS.setRange(E->getQualifierRange());
1149 SS.setScopeRep(NNS);
1150 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0,
1151 E->getLocation(),
1152 E->getDecl()->getDeclName(),
1153 /*Trailing lparen=*/false,
1154 &SS,
1155 /*FIXME:*/false);
1156}
1157
1158Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001159TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1160 CXXExprWithTemporaries *E) {
1161 OwningExprResult SubExpr = Visit(E->getSubExpr());
1162 if (SubExpr.isInvalid())
1163 return SemaRef.ExprError();
1164
1165 return SemaRef.ActOnFinishFullExpr(move(SubExpr));
1166}
1167
1168Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001169TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1170 CXXUnresolvedConstructExpr *E) {
1171 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1172 E->getTypeBeginLoc(),
1173 DeclarationName());
1174 if (T.isNull())
1175 return SemaRef.ExprError();
1176
Douglas Gregord7e27052009-05-20 22:33:37 +00001177 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001178 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1179 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1180 ArgEnd = E->arg_end();
1181 Arg != ArgEnd; ++Arg) {
1182 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001183 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001184 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001185
1186 FakeCommaLocs.push_back(
1187 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1188 Args.push_back(InstArg.takeAs<Expr>());
1189 }
1190
1191 // FIXME: The end of the type range isn't exactly correct.
1192 // FIXME: we're faking the locations of the commas
1193 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1194 E->getLParenLoc()),
1195 T.getAsOpaquePtr(),
1196 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001197 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001198 &FakeCommaLocs.front(),
1199 E->getRParenLoc());
1200}
1201
1202Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001203TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
1204 CXXUnresolvedMemberExpr *E) {
1205 // Instantiate the base of the expression.
1206 OwningExprResult Base = Visit(E->getBase());
1207 if (Base.isInvalid())
1208 return SemaRef.ExprError();
1209
1210 // FIXME: Instantiate the declaration name.
1211 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1212 move(Base), E->getOperatorLoc(),
1213 E->isArrow()? tok::arrow
1214 : tok::period,
1215 E->getMemberLoc(),
1216 /*FIXME:*/*E->getMember().getAsIdentifierInfo(),
1217 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1218}
1219
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001220//----------------------------------------------------------------------------
1221// Objective-C Expressions
1222//----------------------------------------------------------------------------
1223Sema::OwningExprResult
1224TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) {
1225 assert(false && "FIXME: Template instantiations for ObjC expressions");
1226 return SemaRef.ExprError();
1227}
1228
1229Sema::OwningExprResult
1230TemplateExprInstantiator::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1231 assert(false && "FIXME: Template instantiations for ObjC expressions");
1232 return SemaRef.ExprError();
1233}
1234
1235Sema::OwningExprResult
1236TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1237 assert(false && "FIXME: Template instantiations for ObjC expressions");
1238 return SemaRef.ExprError();
1239}
1240
1241Sema::OwningExprResult
1242TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
1243 assert(false && "FIXME: Template instantiations for ObjC expressions");
1244 return SemaRef.ExprError();
1245}
1246
1247Sema::OwningExprResult
1248TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
1249 assert(false && "FIXME: Template instantiations for ObjC expressions");
1250 return SemaRef.ExprError();
1251}
1252
1253Sema::OwningExprResult
1254TemplateExprInstantiator::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1255 assert(false && "FIXME: Template instantiations for ObjC expressions");
1256 return SemaRef.ExprError();
1257}
1258
1259Sema::OwningExprResult
1260TemplateExprInstantiator::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1261 assert(false && "FIXME: Template instantiations for ObjC expressions");
1262 return SemaRef.ExprError();
1263}
1264
1265Sema::OwningExprResult
1266TemplateExprInstantiator::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) {
1267 assert(false && "FIXME: Template instantiations for ObjC expressions");
1268 return SemaRef.ExprError();
1269}
1270
1271Sema::OwningExprResult
1272TemplateExprInstantiator::VisitObjCSuperExpr(ObjCSuperExpr *E) {
1273 assert(false && "FIXME: Template instantiations for ObjC expressions");
1274 return SemaRef.ExprError();
1275}
1276
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001277Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001278Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001279 if (!E)
1280 return Owned((Expr *)0);
1281
Douglas Gregor7e063902009-05-11 23:53:27 +00001282 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001283 return Instantiator.Visit(E);
1284}