blob: 719a9eda47179faa59779488c44fdb0a58939dd3 [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) {
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000111 NamedDecl *D = E->getDecl();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000112 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
113 assert(NTTP->getDepth() == 0 && "No nested templates yet");
114 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
Douglas Gregore94866f2009-06-12 21:21:02 +0000115
116 // The template argument itself might be an expression, in which
117 // case we just return that expression.
118 if (Arg.getKind() == TemplateArgument::Expression)
119 // FIXME: Clone the expression!
120 return SemaRef.Owned(Arg.getAsExpr());
121
Anders Carlsson87471f52009-06-26 03:02:18 +0000122 if (Arg.getKind() == TemplateArgument::Declaration) {
123 ValueDecl *VD = cast<ValueDecl>(Arg.getAsDecl());
124
125 // FIXME: Can VD ever have a dependent type?
126 return SemaRef.BuildDeclRefExpr(VD, VD->getType(), E->getLocation(),
127 false, false);
128 }
129
Douglas Gregore94866f2009-06-12 21:21:02 +0000130 assert(Arg.getKind() == TemplateArgument::Integral);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000131 QualType T = Arg.getIntegralType();
132 if (T->isCharType() || T->isWideCharType())
133 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
134 Arg.getAsIntegral()->getZExtValue(),
135 T->isWideCharType(),
136 T,
137 E->getSourceRange().getBegin()));
Douglas Gregor199d9912009-06-05 00:53:49 +0000138 if (T->isBooleanType())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000139 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
140 Arg.getAsIntegral()->getBoolValue(),
141 T,
142 E->getSourceRange().getBegin()));
143
Douglas Gregor199d9912009-06-05 00:53:49 +0000144 assert(Arg.getAsIntegral()->getBitWidth() == SemaRef.Context.getIntWidth(T));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000145 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
146 *Arg.getAsIntegral(),
147 T,
148 E->getSourceRange().getBegin()));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000149 }
150
151 if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
152 // FIXME: instantiate each decl in the overload set
153 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Ovl,
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000154 SemaRef.Context.OverloadTy,
155 E->getLocation(),
156 false, false));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000157 }
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000158
Douglas Gregor751f9a42009-06-30 15:47:41 +0000159 NamedDecl *InstD = SemaRef.InstantiateCurrentDeclRef(D);
160 if (!InstD)
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000161 return SemaRef.ExprError();
162
Douglas Gregor751f9a42009-06-30 15:47:41 +0000163 // FIXME: nested-name-specifier for QualifiedDeclRefExpr
164 return SemaRef.BuildDeclarationNameExpr(E->getLocation(), InstD,
165 /*FIXME:*/false,
166 /*FIXME:*/0,
167 /*FIXME:*/false);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000168}
169
170Sema::OwningExprResult
171TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
172 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
173 if (SubExpr.isInvalid())
174 return SemaRef.ExprError();
175
176 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
177 E->getLParen(), E->getRParen(),
178 (Expr *)SubExpr.release()));
179}
180
181Sema::OwningExprResult
182TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
183 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
184 if (Arg.isInvalid())
185 return SemaRef.ExprError();
186
187 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
188 E->getOpcode(),
189 move(Arg));
190}
191
192Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000193TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
194 Sema::OwningExprResult LHS = Visit(E->getLHS());
195 if (LHS.isInvalid())
196 return SemaRef.ExprError();
197
198 Sema::OwningExprResult RHS = Visit(E->getRHS());
199 if (RHS.isInvalid())
200 return SemaRef.ExprError();
201
202 // Since the overloaded array-subscript operator (operator[]) can
203 // only be a member function, we can make several simplifying
204 // assumptions here:
205 // 1) Normal name lookup (from the current scope) will not ever
206 // find any declarations of operator[] that won't also be found be
207 // member operator lookup, so it is safe to pass a NULL Scope
208 // during the instantiation to avoid the lookup entirely.
209 //
210 // 2) Neither normal name lookup nor argument-dependent lookup at
211 // template definition time will find any operators that won't be
212 // found at template instantiation time, so we do not need to
213 // cache the results of name lookup as we do for the binary
214 // operators.
215 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
216 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
217 /*FIXME:*/LLocFake,
218 move(RHS),
219 E->getRBracketLoc());
220}
221
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000222Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
223 // Instantiate callee
224 OwningExprResult Callee = Visit(E->getCallee());
225 if (Callee.isInvalid())
226 return SemaRef.ExprError();
227
228 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000229 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000230 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
231 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
232 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000233 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000234 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000235
236 FakeCommaLocs.push_back(
237 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
238 Args.push_back(Arg.takeAs<Expr>());
239 }
240
241 SourceLocation FakeLParenLoc
242 = ((Expr *)Callee.get())->getSourceRange().getBegin();
243 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
244 /*FIXME:*/FakeLParenLoc,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000245 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000246 /*FIXME:*/&FakeCommaLocs.front(),
247 E->getRParenLoc());
248}
249
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000250Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000251TemplateExprInstantiator::VisitMemberExpr(MemberExpr *E) {
252 // Instantiate the base of the expression.
253 OwningExprResult Base = Visit(E->getBase());
254 if (Base.isInvalid())
255 return SemaRef.ExprError();
256
257 // FIXME: Handle declaration names here
258 SourceLocation FakeOperatorLoc =
259 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
260 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
261 move(Base),
262 /*FIXME*/FakeOperatorLoc,
263 E->isArrow()? tok::arrow
264 : tok::period,
265 E->getMemberLoc(),
266 /*FIXME:*/*E->getMemberDecl()->getIdentifier(),
267 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
268}
269
270Sema::OwningExprResult
Douglas Gregor690dc7f2009-05-21 23:48:18 +0000271TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
272 SourceLocation FakeTypeLoc
273 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
274 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
275 FakeTypeLoc,
276 DeclarationName());
277 if (T.isNull())
278 return SemaRef.ExprError();
279
280 OwningExprResult Init = Visit(E->getInitializer());
281 if (Init.isInvalid())
282 return SemaRef.ExprError();
283
284 return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
285 T.getAsOpaquePtr(),
286 /*FIXME*/E->getLParenLoc(),
287 move(Init));
288}
289
290Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000291TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
292 Sema::OwningExprResult LHS = Visit(E->getLHS());
293 if (LHS.isInvalid())
294 return SemaRef.ExprError();
295
296 Sema::OwningExprResult RHS = Visit(E->getRHS());
297 if (RHS.isInvalid())
298 return SemaRef.ExprError();
299
300 Sema::OwningExprResult Result
301 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
302 E->getOpcode(),
303 (Expr *)LHS.get(),
304 (Expr *)RHS.get());
305 if (Result.isInvalid())
306 return SemaRef.ExprError();
307
308 LHS.release();
309 RHS.release();
310 return move(Result);
311}
312
313Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000314TemplateExprInstantiator::VisitCompoundAssignOperator(
315 CompoundAssignOperator *E) {
316 return VisitBinaryOperator(E);
317}
318
319Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000320TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
321 Sema::OwningExprResult First = Visit(E->getArg(0));
322 if (First.isInvalid())
323 return SemaRef.ExprError();
324
325 Expr *Args[2] = { (Expr *)First.get(), 0 };
326
327 Sema::OwningExprResult Second(SemaRef);
328 if (E->getNumArgs() == 2) {
329 Second = Visit(E->getArg(1));
330
331 if (Second.isInvalid())
332 return SemaRef.ExprError();
333
334 Args[1] = (Expr *)Second.get();
335 }
336
337 if (!E->isTypeDependent()) {
338 // Since our original expression was not type-dependent, we do not
339 // perform lookup again at instantiation time (C++ [temp.dep]p1).
340 // Instead, we just build the new overloaded operator call
341 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000342 OwningExprResult Callee = Visit(E->getCallee());
343 if (Callee.isInvalid())
344 return SemaRef.ExprError();
345
Douglas Gregoraa6af222009-03-25 00:27:28 +0000346 First.release();
347 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000348
Douglas Gregoraa6af222009-03-25 00:27:28 +0000349 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
350 SemaRef.Context,
351 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000352 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000353 Args, E->getNumArgs(),
354 E->getType(),
355 E->getOperatorLoc()));
356 }
357
358 bool isPostIncDec = E->getNumArgs() == 2 &&
359 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
360 if (E->getNumArgs() == 1 || isPostIncDec) {
361 if (!Args[0]->getType()->isOverloadableType()) {
362 // The argument is not of overloadable type, so try to create a
363 // built-in unary operation.
364 UnaryOperator::Opcode Opc
365 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
366
367 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
368 move(First));
369 }
370
371 // Fall through to perform overload resolution
372 } else {
373 assert(E->getNumArgs() == 2 && "Expected binary operation");
374
375 Sema::OwningExprResult Result(SemaRef);
376 if (!Args[0]->getType()->isOverloadableType() &&
377 !Args[1]->getType()->isOverloadableType()) {
378 // Neither of the arguments is an overloadable type, so try to
379 // create a built-in binary operation.
380 BinaryOperator::Opcode Opc =
381 BinaryOperator::getOverloadedOpcode(E->getOperator());
382 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
383 Args[0], Args[1]);
384 if (Result.isInvalid())
385 return SemaRef.ExprError();
386
387 First.release();
388 Second.release();
389 return move(Result);
390 }
391
392 // Fall through to perform overload resolution.
393 }
394
395 // Compute the set of functions that were found at template
396 // definition time.
397 Sema::FunctionSet Functions;
398 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
399 OverloadedFunctionDecl *Overloads
400 = cast<OverloadedFunctionDecl>(DRE->getDecl());
401
402 // FIXME: Do we have to check
403 // IsAcceptableNonMemberOperatorCandidate for each of these?
404 for (OverloadedFunctionDecl::function_iterator
405 F = Overloads->function_begin(),
406 FEnd = Overloads->function_end();
407 F != FEnd; ++F)
Douglas Gregore53060f2009-06-25 22:08:12 +0000408 Functions.insert(cast<FunctionDecl>(*F));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000409
410 // Add any functions found via argument-dependent lookup.
411 DeclarationName OpName
412 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
413 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
414
415 // Create the overloaded operator invocation.
416 if (E->getNumArgs() == 1 || isPostIncDec) {
417 UnaryOperator::Opcode Opc
418 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
419 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
420 Functions, move(First));
421 }
422
Mike Stump390b4cc2009-05-16 07:39:55 +0000423 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
424 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000425 BinaryOperator::Opcode Opc =
426 BinaryOperator::getOverloadedOpcode(E->getOperator());
427 OwningExprResult Result
428 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
429 Functions, Args[0], Args[1]);
430
431 if (Result.isInvalid())
432 return SemaRef.ExprError();
433
434 First.release();
435 Second.release();
436 return move(Result);
437}
438
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000439Sema::OwningExprResult
440TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
441 VarDecl *Var
442 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
443 SemaRef.CurContext,
444 TemplateArgs));
445 if (!Var)
446 return SemaRef.ExprError();
447
Douglas Gregore06274d2009-05-20 21:51:01 +0000448 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000449 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
450 E->getStartLoc(),
451 SourceLocation(),
452 Var));
453}
454
Douglas Gregoraa6af222009-03-25 00:27:28 +0000455Sema::OwningExprResult
456TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
457 Sema::OwningExprResult Cond = Visit(E->getCond());
458 if (Cond.isInvalid())
459 return SemaRef.ExprError();
460
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000461 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
462 TemplateArgs);
463 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000464 return SemaRef.ExprError();
465
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000466 Sema::OwningExprResult RHS = Visit(E->getRHS());
467 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000468 return SemaRef.ExprError();
469
470 if (!E->isTypeDependent()) {
471 // Since our original expression was not type-dependent, we do not
472 // perform lookup again at instantiation time (C++ [temp.dep]p1).
473 // Instead, we just build the new conditional operator call expression.
474 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
475 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000476 LHS.takeAs<Expr>(),
477 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000478 E->getType()));
479 }
480
481
482 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
483 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000484 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000485}
486
Douglas Gregor76658232009-05-22 23:25:52 +0000487Sema::OwningExprResult
488TemplateExprInstantiator::VisitAddrLabelExpr(AddrLabelExpr *E) {
489 return SemaRef.ActOnAddrLabel(E->getAmpAmpLoc(),
490 E->getLabelLoc(),
491 E->getLabel()->getID());
492}
493
Douglas Gregorcd938172009-05-19 20:31:21 +0000494Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000495 Sema::OwningStmtResult SubStmt
496 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000497 if (SubStmt.isInvalid())
498 return SemaRef.ExprError();
499
500 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
501 E->getRParenLoc());
502}
503
Douglas Gregoraa6af222009-03-25 00:27:28 +0000504Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000505TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000506 assert(false && "__builtin_types_compatible_p is not legal in C++");
507 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000508}
509
510Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000511TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000512 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000513 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
514 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000515 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000516 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000517
518 SubExprs.push_back(SubExpr.takeAs<Expr>());
519 }
520
521 // Find the declaration for __builtin_shufflevector
522 const IdentifierInfo &Name
523 = SemaRef.Context.Idents.get("__builtin_shufflevector");
524 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +0000525 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
Douglas Gregorcde01732009-05-19 22:10:17 +0000526 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
527
528 // Build a reference to the __builtin_shufflevector builtin
529 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
530 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
531 E->getBuiltinLoc(),
532 false, false);
533 SemaRef.UsualUnaryConversions(Callee);
534
535 // Build the CallExpr
536 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000537 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000538 SubExprs.size(),
539 Builtin->getResultType(),
540 E->getRParenLoc());
541 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
542
543 // Type-check the __builtin_shufflevector expression.
544 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
545 if (Result.isInvalid())
546 return SemaRef.ExprError();
547
548 OwnedCall.release();
549 return move(Result);
550}
551
552Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000553TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
554 OwningExprResult Cond = Visit(E->getCond());
555 if (Cond.isInvalid())
556 return SemaRef.ExprError();
557
558 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
559 if (LHS.isInvalid())
560 return SemaRef.ExprError();
561
562 OwningExprResult RHS = Visit(E->getRHS());
563 if (RHS.isInvalid())
564 return SemaRef.ExprError();
565
566 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
567 move(Cond), move(LHS), move(RHS),
568 E->getRParenLoc());
569}
570
Douglas Gregordd027302009-05-19 23:10:31 +0000571Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
572 OwningExprResult SubExpr = Visit(E->getSubExpr());
573 if (SubExpr.isInvalid())
574 return SemaRef.ExprError();
575
576 SourceLocation FakeTypeLoc
577 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
578 .getEnd());
579 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
580 /*FIXME:*/FakeTypeLoc,
581 DeclarationName());
582 if (T.isNull())
583 return SemaRef.ExprError();
584
585 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
586 T.getAsOpaquePtr(), E->getRParenLoc());
587}
588
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000589Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000590TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000591 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
Douglas Gregorccb97f52009-05-21 21:38:12 +0000592 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
593 OwningExprResult Init = Visit(E->getInit(I));
594 if (Init.isInvalid())
595 return SemaRef.ExprError();
596 Inits.push_back(Init.takeAs<Expr>());
597 }
598
599 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
600 E->getRBraceLoc());
601}
602
603Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000604TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
605 Designation Desig;
606
607 // Instantiate the initializer value
608 OwningExprResult Init = Visit(E->getInit());
609 if (Init.isInvalid())
610 return SemaRef.ExprError();
611
612 // Instantiate the designators.
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000613 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
Douglas Gregor9ea62762009-05-21 23:17:49 +0000614 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
615 DEnd = E->designators_end();
616 D != DEnd; ++D) {
617 if (D->isFieldDesignator()) {
618 Desig.AddDesignator(Designator::getField(D->getFieldName(),
619 D->getDotLoc(),
620 D->getFieldLoc()));
621 continue;
622 }
623
624 if (D->isArrayDesignator()) {
625 OwningExprResult Index = Visit(E->getArrayIndex(*D));
626 if (Index.isInvalid())
627 return SemaRef.ExprError();
628
629 Desig.AddDesignator(Designator::getArray(Index.get(),
630 D->getLBracketLoc()));
631
632 ArrayExprs.push_back(Index.release());
633 continue;
634 }
635
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000636 assert(D->isArrayRangeDesignator() && "New kind of designator?");
637 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
638 if (Start.isInvalid())
639 return SemaRef.ExprError();
640
641 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
642 if (End.isInvalid())
643 return SemaRef.ExprError();
644
645 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
646 End.get(),
647 D->getLBracketLoc(),
648 D->getEllipsisLoc()));
649
650 ArrayExprs.push_back(Start.release());
651 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000652 }
653
654 OwningExprResult Result =
655 SemaRef.ActOnDesignatedInitializer(Desig,
656 E->getEqualOrColonLoc(),
657 E->usesGNUSyntax(),
658 move(Init));
659 if (Result.isInvalid())
660 return SemaRef.ExprError();
661
662 ArrayExprs.take();
663 return move(Result);
664}
665
666Sema::OwningExprResult
667TemplateExprInstantiator::VisitImplicitValueInitExpr(
668 ImplicitValueInitExpr *E) {
669 assert(!E->isTypeDependent() && !E->isValueDependent() &&
670 "ImplicitValueInitExprs are never dependent");
671 return SemaRef.Clone(E);
672}
673
674Sema::OwningExprResult
Douglas Gregorbec53e72009-05-22 23:07:44 +0000675TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
676 OwningExprResult Base = Visit(E->getBase());
677 if (Base.isInvalid())
678 return SemaRef.ExprError();
679
680 SourceLocation FakeOperatorLoc =
681 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
682 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
683 move(Base),
684 /*FIXME*/FakeOperatorLoc,
685 tok::period,
686 E->getAccessorLoc(),
687 E->getAccessor(),
688 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
689}
690
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000691Sema::OwningExprResult
692TemplateExprInstantiator::VisitBlockExpr(BlockExpr *E) {
693 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
694 return SemaRef.ExprError();
695}
696
697Sema::OwningExprResult
698TemplateExprInstantiator::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
699 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
700 return SemaRef.ExprError();
701}
702
Douglas Gregorbec53e72009-05-22 23:07:44 +0000703Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000704TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
705 bool isSizeOf = E->isSizeOf();
706
707 if (E->isArgumentType()) {
708 QualType T = E->getArgumentType();
709 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000710 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000711 /*FIXME*/E->getOperatorLoc(),
712 &SemaRef.PP.getIdentifierTable().get("sizeof"));
713 if (T.isNull())
714 return SemaRef.ExprError();
715 }
716
717 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
718 E->getSourceRange());
719 }
720
Douglas Gregorac7610d2009-06-22 20:57:11 +0000721 Sema::OwningExprResult Arg(SemaRef);
722 {
723 // C++0x [expr.sizeof]p1:
724 // The operand is either an expression, which is an unevaluated operand
725 // [...]
726 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
727
728 Arg = Visit(E->getArgumentExpr());
729 if (Arg.isInvalid())
730 return SemaRef.ExprError();
731 }
Douglas Gregoraa6af222009-03-25 00:27:28 +0000732
733 Sema::OwningExprResult Result
734 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
735 isSizeOf, E->getSourceRange());
736 if (Result.isInvalid())
737 return SemaRef.ExprError();
738
739 Arg.release();
740 return move(Result);
741}
742
743Sema::OwningExprResult
744TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000745 NestedNameSpecifier *NNS
746 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
747 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000748 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000749 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000750 return SemaRef.ExprError();
751
Douglas Gregorab452ba2009-03-26 23:50:42 +0000752 CXXScopeSpec SS;
753 SS.setRange(E->getQualifierRange());
754 SS.setScopeRep(NNS);
755
Douglas Gregoraa6af222009-03-25 00:27:28 +0000756 // FIXME: We're passing in a NULL scope, because
757 // ActOnDeclarationNameExpr doesn't actually use the scope when we
758 // give it a non-empty scope specifier. Investigate whether it would
759 // be better to refactor ActOnDeclarationNameExpr.
760 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
761 E->getDeclName(),
762 /*HasTrailingLParen=*/false,
763 &SS,
764 /*FIXME:isAddressOfOperand=*/false);
765}
766
767Sema::OwningExprResult
768TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
769 CXXTemporaryObjectExpr *E) {
770 QualType T = E->getType();
771 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000772 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000773 E->getTypeBeginLoc(), DeclarationName());
774 if (T.isNull())
775 return SemaRef.ExprError();
776 }
777
Douglas Gregord7e27052009-05-20 22:33:37 +0000778 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000779 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000780 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
781 ArgEnd = E->arg_end();
782 Arg != ArgEnd; ++Arg) {
783 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000784 if (InstantiatedArg.isInvalid())
785 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000786
787 Args.push_back((Expr *)InstantiatedArg.release());
788 }
789
Douglas Gregord7e27052009-05-20 22:33:37 +0000790 SourceLocation CommaLoc;
791 // FIXME: HACK!
792 if (Args.size() > 1) {
793 Expr *First = (Expr *)Args[0];
794 CommaLoc
795 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000796 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000797 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
798 /*, FIXME*/),
799 T.getAsOpaquePtr(),
800 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000801 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000802 /*HACK*/&CommaLoc,
803 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000804}
805
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000806Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
807 assert(false && "Cannot instantiate abstract CastExpr");
808 return SemaRef.ExprError();
809}
810
Douglas Gregoraa6af222009-03-25 00:27:28 +0000811Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
812 ImplicitCastExpr *E) {
813 assert(!E->isTypeDependent() && "Implicit casts must have known types");
814
815 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
816 if (SubExpr.isInvalid())
817 return SemaRef.ExprError();
818
819 ImplicitCastExpr *ICE =
820 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
821 (Expr *)SubExpr.release(),
822 E->isLvalueCast());
823 return SemaRef.Owned(ICE);
824}
825
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000826Sema::OwningExprResult
827TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
828 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
829 return SemaRef.ExprError();
830}
831
832Sema::OwningExprResult
833TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
834 // Instantiate the type that we're casting to.
835 SourceLocation TypeStartLoc
836 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
837 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
838 TemplateArgs,
839 TypeStartLoc,
840 DeclarationName());
841 if (ExplicitTy.isNull())
842 return SemaRef.ExprError();
843
844 // Instantiate the subexpression.
845 OwningExprResult SubExpr = Visit(E->getSubExpr());
846 if (SubExpr.isInvalid())
847 return SemaRef.ExprError();
848
849 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
850 ExplicitTy.getAsOpaquePtr(),
851 E->getRParenLoc(),
852 move(SubExpr));
853}
854
855Sema::OwningExprResult
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000856TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
857 return VisitCallExpr(E);
858}
859
860Sema::OwningExprResult
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000861TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
862 // Figure out which cast operator we're dealing with.
863 tok::TokenKind Kind;
864 switch (E->getStmtClass()) {
865 case Stmt::CXXStaticCastExprClass:
866 Kind = tok::kw_static_cast;
867 break;
868
869 case Stmt::CXXDynamicCastExprClass:
870 Kind = tok::kw_dynamic_cast;
871 break;
872
873 case Stmt::CXXReinterpretCastExprClass:
874 Kind = tok::kw_reinterpret_cast;
875 break;
876
877 case Stmt::CXXConstCastExprClass:
878 Kind = tok::kw_const_cast;
879 break;
880
881 default:
882 assert(false && "Invalid C++ named cast");
883 return SemaRef.ExprError();
884 }
885
886 // Instantiate the type that we're casting to.
887 SourceLocation TypeStartLoc
888 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
889 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
890 TemplateArgs,
891 TypeStartLoc,
892 DeclarationName());
893 if (ExplicitTy.isNull())
894 return SemaRef.ExprError();
895
896 // Instantiate the subexpression.
897 OwningExprResult SubExpr = Visit(E->getSubExpr());
898 if (SubExpr.isInvalid())
899 return SemaRef.ExprError();
900
901 SourceLocation FakeLAngleLoc
902 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
903 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
904 SourceLocation FakeRParenLoc
905 = SemaRef.PP.getLocForEndOfToken(
906 E->getSubExpr()->getSourceRange().getEnd());
907 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
908 /*FIXME:*/FakeLAngleLoc,
909 ExplicitTy.getAsOpaquePtr(),
910 /*FIXME:*/FakeRAngleLoc,
911 /*FIXME:*/FakeRAngleLoc,
912 move(SubExpr),
913 /*FIXME:*/FakeRParenLoc);
914}
915
916Sema::OwningExprResult
917TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
918 return VisitCXXNamedCastExpr(E);
919}
920
921Sema::OwningExprResult
922TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
923 return VisitCXXNamedCastExpr(E);
924}
925
926Sema::OwningExprResult
927TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
928 CXXReinterpretCastExpr *E) {
929 return VisitCXXNamedCastExpr(E);
930}
931
932Sema::OwningExprResult
933TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
934 return VisitCXXNamedCastExpr(E);
935}
936
Anders Carlsson0712d292009-05-15 20:26:03 +0000937Sema::OwningExprResult
938TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
939 QualType ThisType =
940 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
941
942 CXXThisExpr *TE =
943 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
944
945 return SemaRef.Owned(TE);
946}
947
Douglas Gregoraa6af222009-03-25 00:27:28 +0000948Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000949TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
950 if (E->isTypeOperand()) {
951 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
952 TemplateArgs,
953 /*FIXME*/E->getSourceRange().getBegin(),
954 DeclarationName());
955 if (T.isNull())
956 return SemaRef.ExprError();
957
958 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
959 /*FIXME*/E->getSourceRange().getBegin(),
960 true, T.getAsOpaquePtr(),
961 E->getSourceRange().getEnd());
962 }
963
Douglas Gregorac7610d2009-06-22 20:57:11 +0000964 // We don't know whether the expression is potentially evaluated until
965 // after we perform semantic analysis, so the expression is potentially
966 // potentially evaluated.
967 EnterExpressionEvaluationContext Unevaluated(SemaRef,
968 Action::PotentiallyPotentiallyEvaluated);
969
Douglas Gregor12d0c302009-05-21 18:34:44 +0000970 OwningExprResult Operand = Visit(E->getExprOperand());
971 if (Operand.isInvalid())
972 return SemaRef.ExprError();
973
974 OwningExprResult Result
975 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
976 /*FIXME*/E->getSourceRange().getBegin(),
977 false, Operand.get(),
978 E->getSourceRange().getEnd());
979 if (Result.isInvalid())
980 return SemaRef.ExprError();
981
982 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
983 return move(Result);
984}
985
986Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +0000987TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
988 OwningExprResult SubExpr(SemaRef, (void *)0);
989 if (E->getSubExpr()) {
990 SubExpr = Visit(E->getSubExpr());
991 if (SubExpr.isInvalid())
992 return SemaRef.ExprError();
993 }
994
995 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
996}
997
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000998Sema::OwningExprResult
999TemplateExprInstantiator::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1000 assert(false &&
1001 "FIXME: Instantiation for default arguments is unimplemented");
1002 return SemaRef.ExprError();
1003}
1004
Douglas Gregor42e5b502009-05-21 17:37:52 +00001005Sema::OwningExprResult
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001006TemplateExprInstantiator::VisitCXXBindTemporaryExpr(
1007 CXXBindTemporaryExpr *E) {
1008 OwningExprResult SubExpr = Visit(E->getSubExpr());
1009 if (SubExpr.isInvalid())
1010 return SemaRef.ExprError();
1011
Anders Carlsson464f4f32009-05-30 20:52:37 +00001012 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001013}
1014
1015Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +00001016TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
1017 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
1018 ->isDependentType() && "Dependent constructor shouldn't be here");
1019
1020 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
1021 /*FIXME*/E->getSourceRange().getBegin(),
1022 DeclarationName());
1023 if (T.isNull())
1024 return SemaRef.ExprError();
1025
Douglas Gregord7e27052009-05-20 22:33:37 +00001026 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +00001027 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
1028 ArgEnd = E->arg_end();
1029 Arg != ArgEnd; ++Arg) {
1030 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001031 if (ArgInst.isInvalid())
1032 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001033
1034 Args.push_back(ArgInst.takeAs<Expr>());
1035 }
1036
Anders Carlsson8e587a12009-05-30 20:56:46 +00001037 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, T,
Douglas Gregord94546a2009-05-20 21:38:11 +00001038 E->getConstructor(),
1039 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +00001040 Args.takeAs<Expr>(),
1041 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001042}
1043
1044Sema::OwningExprResult
1045TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1046 CXXFunctionalCastExpr *E) {
1047 // Instantiate the type that we're casting to.
1048 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1049 TemplateArgs,
1050 E->getTypeBeginLoc(),
1051 DeclarationName());
1052 if (ExplicitTy.isNull())
1053 return SemaRef.ExprError();
1054
1055 // Instantiate the subexpression.
1056 OwningExprResult SubExpr = Visit(E->getSubExpr());
1057 if (SubExpr.isInvalid())
1058 return SemaRef.ExprError();
1059
1060 // FIXME: The end of the type's source range is wrong
1061 Expr *Sub = SubExpr.takeAs<Expr>();
1062 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1063 ExplicitTy.getAsOpaquePtr(),
1064 /*FIXME:*/E->getTypeBeginLoc(),
1065 Sema::MultiExprArg(SemaRef,
1066 (void **)&Sub,
1067 1),
1068 0,
1069 E->getRParenLoc());
1070}
1071
1072Sema::OwningExprResult
1073TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1074 return SemaRef.Clone(E);
1075}
1076
1077Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001078TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1079 // Instantiate the type that we're allocating
1080 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1081 TemplateArgs,
1082 /*FIXME:*/E->getSourceRange().getBegin(),
1083 DeclarationName());
1084 if (AllocType.isNull())
1085 return SemaRef.ExprError();
1086
1087 // Instantiate the size of the array we're allocating (if any).
1088 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1089 TemplateArgs);
1090 if (ArraySize.isInvalid())
1091 return SemaRef.ExprError();
1092
1093 // Instantiate the placement arguments (if any).
1094 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1095 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1096 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1097 if (Arg.isInvalid())
1098 return SemaRef.ExprError();
1099
1100 PlacementArgs.push_back(Arg.take());
1101 }
1102
1103 // Instantiate the constructor arguments (if any).
1104 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1105 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1106 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1107 if (Arg.isInvalid())
1108 return SemaRef.ExprError();
1109
1110 ConstructorArgs.push_back(Arg.take());
1111 }
1112
1113 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1114 E->isGlobalNew(),
1115 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001116 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001117 /*FIXME*/SourceLocation(),
1118 E->isParenTypeId(),
1119 AllocType,
1120 /*FIXME*/E->getSourceRange().getBegin(),
1121 SourceRange(),
1122 move(ArraySize),
1123 /*FIXME*/SourceLocation(),
1124 Sema::MultiExprArg(SemaRef,
1125 ConstructorArgs.take(),
1126 ConstructorArgs.size()),
1127 E->getSourceRange().getEnd());
1128}
1129
1130Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001131TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1132 OwningExprResult Operand = Visit(E->getArgument());
1133 if (Operand.isInvalid())
1134 return SemaRef.ExprError();
1135
1136 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1137 E->isGlobalDelete(),
1138 E->isArrayForm(),
1139 move(Operand));
1140}
1141
1142Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001143TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1144 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1145 /*FIXME*/E->getSourceRange().getBegin(),
1146 DeclarationName());
1147 if (T.isNull())
1148 return SemaRef.ExprError();
1149
1150 SourceLocation FakeLParenLoc
1151 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1152 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1153 E->getSourceRange().getBegin(),
1154 /*FIXME*/FakeLParenLoc,
1155 T.getAsOpaquePtr(),
1156 E->getSourceRange().getEnd());
1157}
1158
1159Sema::OwningExprResult
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001160TemplateExprInstantiator::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
1161 NestedNameSpecifier *NNS
1162 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
1163 E->getQualifierRange(),
1164 TemplateArgs);
1165 if (!NNS)
1166 return SemaRef.ExprError();
1167
1168 CXXScopeSpec SS;
1169 SS.setRange(E->getQualifierRange());
1170 SS.setScopeRep(NNS);
1171 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0,
1172 E->getLocation(),
1173 E->getDecl()->getDeclName(),
1174 /*Trailing lparen=*/false,
1175 &SS,
1176 /*FIXME:*/false);
1177}
1178
1179Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001180TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1181 CXXExprWithTemporaries *E) {
1182 OwningExprResult SubExpr = Visit(E->getSubExpr());
1183 if (SubExpr.isInvalid())
1184 return SemaRef.ExprError();
1185
Anders Carlssonf54741e2009-06-16 03:37:31 +00001186 Expr *Temp =
1187 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
1188 E->shouldDestroyTemporaries());
1189 return SemaRef.Owned(Temp);
Douglas Gregore06274d2009-05-20 21:51:01 +00001190}
1191
1192Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001193TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1194 CXXUnresolvedConstructExpr *E) {
1195 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1196 E->getTypeBeginLoc(),
1197 DeclarationName());
1198 if (T.isNull())
1199 return SemaRef.ExprError();
1200
Douglas Gregord7e27052009-05-20 22:33:37 +00001201 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001202 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1203 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1204 ArgEnd = E->arg_end();
1205 Arg != ArgEnd; ++Arg) {
1206 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001207 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001208 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001209
1210 FakeCommaLocs.push_back(
1211 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1212 Args.push_back(InstArg.takeAs<Expr>());
1213 }
1214
1215 // FIXME: The end of the type range isn't exactly correct.
1216 // FIXME: we're faking the locations of the commas
1217 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1218 E->getLParenLoc()),
1219 T.getAsOpaquePtr(),
1220 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001221 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001222 &FakeCommaLocs.front(),
1223 E->getRParenLoc());
1224}
1225
1226Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001227TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
1228 CXXUnresolvedMemberExpr *E) {
1229 // Instantiate the base of the expression.
1230 OwningExprResult Base = Visit(E->getBase());
1231 if (Base.isInvalid())
1232 return SemaRef.ExprError();
1233
1234 // FIXME: Instantiate the declaration name.
1235 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1236 move(Base), E->getOperatorLoc(),
1237 E->isArrow()? tok::arrow
1238 : tok::period,
1239 E->getMemberLoc(),
1240 /*FIXME:*/*E->getMember().getAsIdentifierInfo(),
1241 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1242}
1243
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001244//----------------------------------------------------------------------------
1245// Objective-C Expressions
1246//----------------------------------------------------------------------------
1247Sema::OwningExprResult
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001248TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) {
1249 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001250}
1251
1252Sema::OwningExprResult
Anders Carlssonfc0f0212009-06-07 18:45:35 +00001253TemplateExprInstantiator::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1254 QualType EncodedType = SemaRef.InstantiateType(E->getEncodedType(),
1255 TemplateArgs,
1256 /*FIXME:*/E->getAtLoc(),
1257 DeclarationName());
1258 if (EncodedType.isNull())
1259 return SemaRef.ExprError();
1260
1261 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(E->getAtLoc(),
1262 EncodedType,
1263 E->getRParenLoc()));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001264}
1265
1266Sema::OwningExprResult
1267TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1268 assert(false && "FIXME: Template instantiations for ObjC expressions");
1269 return SemaRef.ExprError();
1270}
1271
1272Sema::OwningExprResult
1273TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001274 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001275}
1276
1277Sema::OwningExprResult
1278TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001279 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001280}
1281
1282Sema::OwningExprResult
1283TemplateExprInstantiator::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1284 assert(false && "FIXME: Template instantiations for ObjC expressions");
1285 return SemaRef.ExprError();
1286}
1287
1288Sema::OwningExprResult
1289TemplateExprInstantiator::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1290 assert(false && "FIXME: Template instantiations for ObjC expressions");
1291 return SemaRef.ExprError();
1292}
1293
1294Sema::OwningExprResult
1295TemplateExprInstantiator::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) {
1296 assert(false && "FIXME: Template instantiations for ObjC expressions");
1297 return SemaRef.ExprError();
1298}
1299
1300Sema::OwningExprResult
1301TemplateExprInstantiator::VisitObjCSuperExpr(ObjCSuperExpr *E) {
1302 assert(false && "FIXME: Template instantiations for ObjC expressions");
1303 return SemaRef.ExprError();
1304}
1305
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001306Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001307Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001308 if (!E)
1309 return Owned((Expr *)0);
1310
Douglas Gregor7e063902009-05-11 23:53:27 +00001311 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001312 return Instantiator.Visit(E);
1313}