blob: 58896d48fa9260f7077df7a5e5233b11f3caea5a [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 Gregoredce4dd2009-06-30 22:34:41 +0000110TemplateExprInstantiator::VisitTemplateIdRefExpr(TemplateIdRefExpr *E) {
111 TemplateName Template
112 = SemaRef.InstantiateTemplateName(E->getTemplateName(), E->getTemplateNameLoc(),
113 TemplateArgs);
114 // FIXME: Can InstantiateTemplateName report an error?
115
116 llvm::SmallVector<TemplateArgument, 4> InstantiatedArgs;
117 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
118 TemplateArgument InstArg = SemaRef.Instantiate(E->getTemplateArgs()[I],
119 TemplateArgs);
120 if (InstArg.isNull())
121 return SemaRef.ExprError();
122
123 InstantiatedArgs.push_back(InstArg);
124 }
125
126 // FIXME: It's possible that we'll find out now that the template name
127 // actually refers to a type, in which case this is a functional cast.
128 // Implement this!
129
130 return SemaRef.BuildTemplateIdExpr(Template, E->getTemplateNameLoc(),
131 E->getLAngleLoc(),
132 InstantiatedArgs.data(),
133 InstantiatedArgs.size(),
134 E->getRAngleLoc());
135}
136
137Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000138TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000139 NamedDecl *D = E->getDecl();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000140 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
141 assert(NTTP->getDepth() == 0 && "No nested templates yet");
142 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
Douglas Gregore94866f2009-06-12 21:21:02 +0000143
144 // The template argument itself might be an expression, in which
145 // case we just return that expression.
146 if (Arg.getKind() == TemplateArgument::Expression)
147 // FIXME: Clone the expression!
148 return SemaRef.Owned(Arg.getAsExpr());
149
Anders Carlsson87471f52009-06-26 03:02:18 +0000150 if (Arg.getKind() == TemplateArgument::Declaration) {
151 ValueDecl *VD = cast<ValueDecl>(Arg.getAsDecl());
152
153 // FIXME: Can VD ever have a dependent type?
154 return SemaRef.BuildDeclRefExpr(VD, VD->getType(), E->getLocation(),
155 false, false);
156 }
157
Douglas Gregore94866f2009-06-12 21:21:02 +0000158 assert(Arg.getKind() == TemplateArgument::Integral);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000159 QualType T = Arg.getIntegralType();
160 if (T->isCharType() || T->isWideCharType())
161 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
162 Arg.getAsIntegral()->getZExtValue(),
163 T->isWideCharType(),
164 T,
165 E->getSourceRange().getBegin()));
Douglas Gregor199d9912009-06-05 00:53:49 +0000166 if (T->isBooleanType())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000167 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
168 Arg.getAsIntegral()->getBoolValue(),
169 T,
170 E->getSourceRange().getBegin()));
171
Douglas Gregor199d9912009-06-05 00:53:49 +0000172 assert(Arg.getAsIntegral()->getBitWidth() == SemaRef.Context.getIntWidth(T));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000173 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
174 *Arg.getAsIntegral(),
175 T,
176 E->getSourceRange().getBegin()));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000177 }
178
179 if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
180 // FIXME: instantiate each decl in the overload set
181 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Ovl,
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000182 SemaRef.Context.OverloadTy,
183 E->getLocation(),
184 false, false));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000185 }
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000186
Douglas Gregor751f9a42009-06-30 15:47:41 +0000187 NamedDecl *InstD = SemaRef.InstantiateCurrentDeclRef(D);
188 if (!InstD)
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000189 return SemaRef.ExprError();
190
Douglas Gregor751f9a42009-06-30 15:47:41 +0000191 // FIXME: nested-name-specifier for QualifiedDeclRefExpr
192 return SemaRef.BuildDeclarationNameExpr(E->getLocation(), InstD,
193 /*FIXME:*/false,
194 /*FIXME:*/0,
195 /*FIXME:*/false);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000196}
197
198Sema::OwningExprResult
199TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
200 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
201 if (SubExpr.isInvalid())
202 return SemaRef.ExprError();
203
204 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
205 E->getLParen(), E->getRParen(),
206 (Expr *)SubExpr.release()));
207}
208
209Sema::OwningExprResult
210TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
211 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
212 if (Arg.isInvalid())
213 return SemaRef.ExprError();
214
215 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
216 E->getOpcode(),
217 move(Arg));
218}
219
220Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000221TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
222 Sema::OwningExprResult LHS = Visit(E->getLHS());
223 if (LHS.isInvalid())
224 return SemaRef.ExprError();
225
226 Sema::OwningExprResult RHS = Visit(E->getRHS());
227 if (RHS.isInvalid())
228 return SemaRef.ExprError();
229
230 // Since the overloaded array-subscript operator (operator[]) can
231 // only be a member function, we can make several simplifying
232 // assumptions here:
233 // 1) Normal name lookup (from the current scope) will not ever
234 // find any declarations of operator[] that won't also be found be
235 // member operator lookup, so it is safe to pass a NULL Scope
236 // during the instantiation to avoid the lookup entirely.
237 //
238 // 2) Neither normal name lookup nor argument-dependent lookup at
239 // template definition time will find any operators that won't be
240 // found at template instantiation time, so we do not need to
241 // cache the results of name lookup as we do for the binary
242 // operators.
243 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
244 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
245 /*FIXME:*/LLocFake,
246 move(RHS),
247 E->getRBracketLoc());
248}
249
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000250Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
251 // Instantiate callee
252 OwningExprResult Callee = Visit(E->getCallee());
253 if (Callee.isInvalid())
254 return SemaRef.ExprError();
255
256 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000257 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000258 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
259 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
260 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000261 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000262 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000263
264 FakeCommaLocs.push_back(
265 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
266 Args.push_back(Arg.takeAs<Expr>());
267 }
268
269 SourceLocation FakeLParenLoc
270 = ((Expr *)Callee.get())->getSourceRange().getBegin();
271 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
272 /*FIXME:*/FakeLParenLoc,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000273 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000274 /*FIXME:*/&FakeCommaLocs.front(),
275 E->getRParenLoc());
276}
277
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000278Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000279TemplateExprInstantiator::VisitMemberExpr(MemberExpr *E) {
280 // Instantiate the base of the expression.
281 OwningExprResult Base = Visit(E->getBase());
282 if (Base.isInvalid())
283 return SemaRef.ExprError();
284
285 // FIXME: Handle declaration names here
286 SourceLocation FakeOperatorLoc =
287 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
288 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
289 move(Base),
290 /*FIXME*/FakeOperatorLoc,
291 E->isArrow()? tok::arrow
292 : tok::period,
293 E->getMemberLoc(),
294 /*FIXME:*/*E->getMemberDecl()->getIdentifier(),
295 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
296}
297
298Sema::OwningExprResult
Douglas Gregor690dc7f2009-05-21 23:48:18 +0000299TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
300 SourceLocation FakeTypeLoc
301 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
302 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
303 FakeTypeLoc,
304 DeclarationName());
305 if (T.isNull())
306 return SemaRef.ExprError();
307
308 OwningExprResult Init = Visit(E->getInitializer());
309 if (Init.isInvalid())
310 return SemaRef.ExprError();
311
312 return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
313 T.getAsOpaquePtr(),
314 /*FIXME*/E->getLParenLoc(),
315 move(Init));
316}
317
318Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000319TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
320 Sema::OwningExprResult LHS = Visit(E->getLHS());
321 if (LHS.isInvalid())
322 return SemaRef.ExprError();
323
324 Sema::OwningExprResult RHS = Visit(E->getRHS());
325 if (RHS.isInvalid())
326 return SemaRef.ExprError();
327
328 Sema::OwningExprResult Result
329 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
330 E->getOpcode(),
331 (Expr *)LHS.get(),
332 (Expr *)RHS.get());
333 if (Result.isInvalid())
334 return SemaRef.ExprError();
335
336 LHS.release();
337 RHS.release();
338 return move(Result);
339}
340
341Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000342TemplateExprInstantiator::VisitCompoundAssignOperator(
343 CompoundAssignOperator *E) {
344 return VisitBinaryOperator(E);
345}
346
347Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000348TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
349 Sema::OwningExprResult First = Visit(E->getArg(0));
350 if (First.isInvalid())
351 return SemaRef.ExprError();
352
353 Expr *Args[2] = { (Expr *)First.get(), 0 };
354
355 Sema::OwningExprResult Second(SemaRef);
356 if (E->getNumArgs() == 2) {
357 Second = Visit(E->getArg(1));
358
359 if (Second.isInvalid())
360 return SemaRef.ExprError();
361
362 Args[1] = (Expr *)Second.get();
363 }
364
365 if (!E->isTypeDependent()) {
366 // Since our original expression was not type-dependent, we do not
367 // perform lookup again at instantiation time (C++ [temp.dep]p1).
368 // Instead, we just build the new overloaded operator call
369 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000370 OwningExprResult Callee = Visit(E->getCallee());
371 if (Callee.isInvalid())
372 return SemaRef.ExprError();
373
Douglas Gregoraa6af222009-03-25 00:27:28 +0000374 First.release();
375 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000376
Douglas Gregoraa6af222009-03-25 00:27:28 +0000377 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
378 SemaRef.Context,
379 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000380 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000381 Args, E->getNumArgs(),
382 E->getType(),
383 E->getOperatorLoc()));
384 }
385
386 bool isPostIncDec = E->getNumArgs() == 2 &&
387 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
388 if (E->getNumArgs() == 1 || isPostIncDec) {
389 if (!Args[0]->getType()->isOverloadableType()) {
390 // The argument is not of overloadable type, so try to create a
391 // built-in unary operation.
392 UnaryOperator::Opcode Opc
393 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
394
395 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
396 move(First));
397 }
398
399 // Fall through to perform overload resolution
400 } else {
401 assert(E->getNumArgs() == 2 && "Expected binary operation");
402
403 Sema::OwningExprResult Result(SemaRef);
404 if (!Args[0]->getType()->isOverloadableType() &&
405 !Args[1]->getType()->isOverloadableType()) {
406 // Neither of the arguments is an overloadable type, so try to
407 // create a built-in binary operation.
408 BinaryOperator::Opcode Opc =
409 BinaryOperator::getOverloadedOpcode(E->getOperator());
410 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
411 Args[0], Args[1]);
412 if (Result.isInvalid())
413 return SemaRef.ExprError();
414
415 First.release();
416 Second.release();
417 return move(Result);
418 }
419
420 // Fall through to perform overload resolution.
421 }
422
423 // Compute the set of functions that were found at template
424 // definition time.
425 Sema::FunctionSet Functions;
426 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
427 OverloadedFunctionDecl *Overloads
428 = cast<OverloadedFunctionDecl>(DRE->getDecl());
429
430 // FIXME: Do we have to check
431 // IsAcceptableNonMemberOperatorCandidate for each of these?
432 for (OverloadedFunctionDecl::function_iterator
433 F = Overloads->function_begin(),
434 FEnd = Overloads->function_end();
435 F != FEnd; ++F)
Douglas Gregore53060f2009-06-25 22:08:12 +0000436 Functions.insert(cast<FunctionDecl>(*F));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000437
438 // Add any functions found via argument-dependent lookup.
439 DeclarationName OpName
440 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
441 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
442
443 // Create the overloaded operator invocation.
444 if (E->getNumArgs() == 1 || isPostIncDec) {
445 UnaryOperator::Opcode Opc
446 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
447 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
448 Functions, move(First));
449 }
450
Mike Stump390b4cc2009-05-16 07:39:55 +0000451 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
452 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000453 BinaryOperator::Opcode Opc =
454 BinaryOperator::getOverloadedOpcode(E->getOperator());
455 OwningExprResult Result
456 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
457 Functions, Args[0], Args[1]);
458
459 if (Result.isInvalid())
460 return SemaRef.ExprError();
461
462 First.release();
463 Second.release();
464 return move(Result);
465}
466
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000467Sema::OwningExprResult
468TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
469 VarDecl *Var
470 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
471 SemaRef.CurContext,
472 TemplateArgs));
473 if (!Var)
474 return SemaRef.ExprError();
475
Douglas Gregore06274d2009-05-20 21:51:01 +0000476 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000477 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
478 E->getStartLoc(),
479 SourceLocation(),
480 Var));
481}
482
Douglas Gregoraa6af222009-03-25 00:27:28 +0000483Sema::OwningExprResult
484TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
485 Sema::OwningExprResult Cond = Visit(E->getCond());
486 if (Cond.isInvalid())
487 return SemaRef.ExprError();
488
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000489 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
490 TemplateArgs);
491 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000492 return SemaRef.ExprError();
493
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000494 Sema::OwningExprResult RHS = Visit(E->getRHS());
495 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000496 return SemaRef.ExprError();
497
498 if (!E->isTypeDependent()) {
499 // Since our original expression was not type-dependent, we do not
500 // perform lookup again at instantiation time (C++ [temp.dep]p1).
501 // Instead, we just build the new conditional operator call expression.
502 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
503 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000504 LHS.takeAs<Expr>(),
505 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000506 E->getType()));
507 }
508
509
510 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
511 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000512 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000513}
514
Douglas Gregor76658232009-05-22 23:25:52 +0000515Sema::OwningExprResult
516TemplateExprInstantiator::VisitAddrLabelExpr(AddrLabelExpr *E) {
517 return SemaRef.ActOnAddrLabel(E->getAmpAmpLoc(),
518 E->getLabelLoc(),
519 E->getLabel()->getID());
520}
521
Douglas Gregorcd938172009-05-19 20:31:21 +0000522Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000523 Sema::OwningStmtResult SubStmt
524 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000525 if (SubStmt.isInvalid())
526 return SemaRef.ExprError();
527
528 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
529 E->getRParenLoc());
530}
531
Douglas Gregoraa6af222009-03-25 00:27:28 +0000532Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000533TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000534 assert(false && "__builtin_types_compatible_p is not legal in C++");
535 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000536}
537
538Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000539TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000540 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000541 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
542 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000543 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000544 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000545
546 SubExprs.push_back(SubExpr.takeAs<Expr>());
547 }
548
549 // Find the declaration for __builtin_shufflevector
550 const IdentifierInfo &Name
551 = SemaRef.Context.Idents.get("__builtin_shufflevector");
552 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +0000553 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
Douglas Gregorcde01732009-05-19 22:10:17 +0000554 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
555
556 // Build a reference to the __builtin_shufflevector builtin
557 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
558 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
559 E->getBuiltinLoc(),
560 false, false);
561 SemaRef.UsualUnaryConversions(Callee);
562
563 // Build the CallExpr
564 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000565 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000566 SubExprs.size(),
567 Builtin->getResultType(),
568 E->getRParenLoc());
569 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
570
571 // Type-check the __builtin_shufflevector expression.
572 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
573 if (Result.isInvalid())
574 return SemaRef.ExprError();
575
576 OwnedCall.release();
577 return move(Result);
578}
579
580Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000581TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
582 OwningExprResult Cond = Visit(E->getCond());
583 if (Cond.isInvalid())
584 return SemaRef.ExprError();
585
586 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
587 if (LHS.isInvalid())
588 return SemaRef.ExprError();
589
590 OwningExprResult RHS = Visit(E->getRHS());
591 if (RHS.isInvalid())
592 return SemaRef.ExprError();
593
594 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
595 move(Cond), move(LHS), move(RHS),
596 E->getRParenLoc());
597}
598
Douglas Gregordd027302009-05-19 23:10:31 +0000599Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
600 OwningExprResult SubExpr = Visit(E->getSubExpr());
601 if (SubExpr.isInvalid())
602 return SemaRef.ExprError();
603
604 SourceLocation FakeTypeLoc
605 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
606 .getEnd());
607 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
608 /*FIXME:*/FakeTypeLoc,
609 DeclarationName());
610 if (T.isNull())
611 return SemaRef.ExprError();
612
613 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
614 T.getAsOpaquePtr(), E->getRParenLoc());
615}
616
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000617Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000618TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000619 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
Douglas Gregorccb97f52009-05-21 21:38:12 +0000620 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
621 OwningExprResult Init = Visit(E->getInit(I));
622 if (Init.isInvalid())
623 return SemaRef.ExprError();
624 Inits.push_back(Init.takeAs<Expr>());
625 }
626
627 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
628 E->getRBraceLoc());
629}
630
631Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000632TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
633 Designation Desig;
634
635 // Instantiate the initializer value
636 OwningExprResult Init = Visit(E->getInit());
637 if (Init.isInvalid())
638 return SemaRef.ExprError();
639
640 // Instantiate the designators.
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000641 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
Douglas Gregor9ea62762009-05-21 23:17:49 +0000642 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
643 DEnd = E->designators_end();
644 D != DEnd; ++D) {
645 if (D->isFieldDesignator()) {
646 Desig.AddDesignator(Designator::getField(D->getFieldName(),
647 D->getDotLoc(),
648 D->getFieldLoc()));
649 continue;
650 }
651
652 if (D->isArrayDesignator()) {
653 OwningExprResult Index = Visit(E->getArrayIndex(*D));
654 if (Index.isInvalid())
655 return SemaRef.ExprError();
656
657 Desig.AddDesignator(Designator::getArray(Index.get(),
658 D->getLBracketLoc()));
659
660 ArrayExprs.push_back(Index.release());
661 continue;
662 }
663
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000664 assert(D->isArrayRangeDesignator() && "New kind of designator?");
665 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
666 if (Start.isInvalid())
667 return SemaRef.ExprError();
668
669 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
670 if (End.isInvalid())
671 return SemaRef.ExprError();
672
673 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
674 End.get(),
675 D->getLBracketLoc(),
676 D->getEllipsisLoc()));
677
678 ArrayExprs.push_back(Start.release());
679 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000680 }
681
682 OwningExprResult Result =
683 SemaRef.ActOnDesignatedInitializer(Desig,
684 E->getEqualOrColonLoc(),
685 E->usesGNUSyntax(),
686 move(Init));
687 if (Result.isInvalid())
688 return SemaRef.ExprError();
689
690 ArrayExprs.take();
691 return move(Result);
692}
693
694Sema::OwningExprResult
695TemplateExprInstantiator::VisitImplicitValueInitExpr(
696 ImplicitValueInitExpr *E) {
697 assert(!E->isTypeDependent() && !E->isValueDependent() &&
698 "ImplicitValueInitExprs are never dependent");
699 return SemaRef.Clone(E);
700}
701
702Sema::OwningExprResult
Douglas Gregorbec53e72009-05-22 23:07:44 +0000703TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
704 OwningExprResult Base = Visit(E->getBase());
705 if (Base.isInvalid())
706 return SemaRef.ExprError();
707
708 SourceLocation FakeOperatorLoc =
709 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
710 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
711 move(Base),
712 /*FIXME*/FakeOperatorLoc,
713 tok::period,
714 E->getAccessorLoc(),
715 E->getAccessor(),
716 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
717}
718
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000719Sema::OwningExprResult
720TemplateExprInstantiator::VisitBlockExpr(BlockExpr *E) {
721 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
722 return SemaRef.ExprError();
723}
724
725Sema::OwningExprResult
726TemplateExprInstantiator::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
727 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
728 return SemaRef.ExprError();
729}
730
Douglas Gregorbec53e72009-05-22 23:07:44 +0000731Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000732TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
733 bool isSizeOf = E->isSizeOf();
734
735 if (E->isArgumentType()) {
736 QualType T = E->getArgumentType();
737 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000738 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000739 /*FIXME*/E->getOperatorLoc(),
740 &SemaRef.PP.getIdentifierTable().get("sizeof"));
741 if (T.isNull())
742 return SemaRef.ExprError();
743 }
744
745 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
746 E->getSourceRange());
747 }
748
Douglas Gregorac7610d2009-06-22 20:57:11 +0000749 Sema::OwningExprResult Arg(SemaRef);
750 {
751 // C++0x [expr.sizeof]p1:
752 // The operand is either an expression, which is an unevaluated operand
753 // [...]
754 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
755
756 Arg = Visit(E->getArgumentExpr());
757 if (Arg.isInvalid())
758 return SemaRef.ExprError();
759 }
Douglas Gregoraa6af222009-03-25 00:27:28 +0000760
761 Sema::OwningExprResult Result
762 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
763 isSizeOf, E->getSourceRange());
764 if (Result.isInvalid())
765 return SemaRef.ExprError();
766
767 Arg.release();
768 return move(Result);
769}
770
771Sema::OwningExprResult
772TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000773 NestedNameSpecifier *NNS
774 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
775 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000776 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000777 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000778 return SemaRef.ExprError();
779
Douglas Gregorab452ba2009-03-26 23:50:42 +0000780 CXXScopeSpec SS;
781 SS.setRange(E->getQualifierRange());
782 SS.setScopeRep(NNS);
783
Douglas Gregoraa6af222009-03-25 00:27:28 +0000784 // FIXME: We're passing in a NULL scope, because
785 // ActOnDeclarationNameExpr doesn't actually use the scope when we
786 // give it a non-empty scope specifier. Investigate whether it would
787 // be better to refactor ActOnDeclarationNameExpr.
788 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
789 E->getDeclName(),
790 /*HasTrailingLParen=*/false,
791 &SS,
792 /*FIXME:isAddressOfOperand=*/false);
793}
794
795Sema::OwningExprResult
796TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
797 CXXTemporaryObjectExpr *E) {
798 QualType T = E->getType();
799 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000800 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000801 E->getTypeBeginLoc(), DeclarationName());
802 if (T.isNull())
803 return SemaRef.ExprError();
804 }
805
Douglas Gregord7e27052009-05-20 22:33:37 +0000806 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000807 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000808 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
809 ArgEnd = E->arg_end();
810 Arg != ArgEnd; ++Arg) {
811 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000812 if (InstantiatedArg.isInvalid())
813 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000814
815 Args.push_back((Expr *)InstantiatedArg.release());
816 }
817
Douglas Gregord7e27052009-05-20 22:33:37 +0000818 SourceLocation CommaLoc;
819 // FIXME: HACK!
820 if (Args.size() > 1) {
821 Expr *First = (Expr *)Args[0];
822 CommaLoc
823 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000824 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000825 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
826 /*, FIXME*/),
827 T.getAsOpaquePtr(),
828 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000829 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000830 /*HACK*/&CommaLoc,
831 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000832}
833
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000834Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
835 assert(false && "Cannot instantiate abstract CastExpr");
836 return SemaRef.ExprError();
837}
838
Douglas Gregoraa6af222009-03-25 00:27:28 +0000839Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
840 ImplicitCastExpr *E) {
841 assert(!E->isTypeDependent() && "Implicit casts must have known types");
842
843 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
844 if (SubExpr.isInvalid())
845 return SemaRef.ExprError();
846
847 ImplicitCastExpr *ICE =
848 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
849 (Expr *)SubExpr.release(),
850 E->isLvalueCast());
851 return SemaRef.Owned(ICE);
852}
853
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000854Sema::OwningExprResult
855TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
856 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
857 return SemaRef.ExprError();
858}
859
860Sema::OwningExprResult
861TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
862 // Instantiate the type that we're casting to.
863 SourceLocation TypeStartLoc
864 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
865 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
866 TemplateArgs,
867 TypeStartLoc,
868 DeclarationName());
869 if (ExplicitTy.isNull())
870 return SemaRef.ExprError();
871
872 // Instantiate the subexpression.
873 OwningExprResult SubExpr = Visit(E->getSubExpr());
874 if (SubExpr.isInvalid())
875 return SemaRef.ExprError();
876
877 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
878 ExplicitTy.getAsOpaquePtr(),
879 E->getRParenLoc(),
880 move(SubExpr));
881}
882
883Sema::OwningExprResult
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000884TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
885 return VisitCallExpr(E);
886}
887
888Sema::OwningExprResult
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000889TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
890 // Figure out which cast operator we're dealing with.
891 tok::TokenKind Kind;
892 switch (E->getStmtClass()) {
893 case Stmt::CXXStaticCastExprClass:
894 Kind = tok::kw_static_cast;
895 break;
896
897 case Stmt::CXXDynamicCastExprClass:
898 Kind = tok::kw_dynamic_cast;
899 break;
900
901 case Stmt::CXXReinterpretCastExprClass:
902 Kind = tok::kw_reinterpret_cast;
903 break;
904
905 case Stmt::CXXConstCastExprClass:
906 Kind = tok::kw_const_cast;
907 break;
908
909 default:
910 assert(false && "Invalid C++ named cast");
911 return SemaRef.ExprError();
912 }
913
914 // Instantiate the type that we're casting to.
915 SourceLocation TypeStartLoc
916 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
917 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
918 TemplateArgs,
919 TypeStartLoc,
920 DeclarationName());
921 if (ExplicitTy.isNull())
922 return SemaRef.ExprError();
923
924 // Instantiate the subexpression.
925 OwningExprResult SubExpr = Visit(E->getSubExpr());
926 if (SubExpr.isInvalid())
927 return SemaRef.ExprError();
928
929 SourceLocation FakeLAngleLoc
930 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
931 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
932 SourceLocation FakeRParenLoc
933 = SemaRef.PP.getLocForEndOfToken(
934 E->getSubExpr()->getSourceRange().getEnd());
935 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
936 /*FIXME:*/FakeLAngleLoc,
937 ExplicitTy.getAsOpaquePtr(),
938 /*FIXME:*/FakeRAngleLoc,
939 /*FIXME:*/FakeRAngleLoc,
940 move(SubExpr),
941 /*FIXME:*/FakeRParenLoc);
942}
943
944Sema::OwningExprResult
945TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
946 return VisitCXXNamedCastExpr(E);
947}
948
949Sema::OwningExprResult
950TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
951 return VisitCXXNamedCastExpr(E);
952}
953
954Sema::OwningExprResult
955TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
956 CXXReinterpretCastExpr *E) {
957 return VisitCXXNamedCastExpr(E);
958}
959
960Sema::OwningExprResult
961TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
962 return VisitCXXNamedCastExpr(E);
963}
964
Anders Carlsson0712d292009-05-15 20:26:03 +0000965Sema::OwningExprResult
966TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
967 QualType ThisType =
968 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
969
970 CXXThisExpr *TE =
971 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
972
973 return SemaRef.Owned(TE);
974}
975
Douglas Gregoraa6af222009-03-25 00:27:28 +0000976Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000977TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
978 if (E->isTypeOperand()) {
979 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
980 TemplateArgs,
981 /*FIXME*/E->getSourceRange().getBegin(),
982 DeclarationName());
983 if (T.isNull())
984 return SemaRef.ExprError();
985
986 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
987 /*FIXME*/E->getSourceRange().getBegin(),
988 true, T.getAsOpaquePtr(),
989 E->getSourceRange().getEnd());
990 }
991
Douglas Gregorac7610d2009-06-22 20:57:11 +0000992 // We don't know whether the expression is potentially evaluated until
993 // after we perform semantic analysis, so the expression is potentially
994 // potentially evaluated.
995 EnterExpressionEvaluationContext Unevaluated(SemaRef,
996 Action::PotentiallyPotentiallyEvaluated);
997
Douglas Gregor12d0c302009-05-21 18:34:44 +0000998 OwningExprResult Operand = Visit(E->getExprOperand());
999 if (Operand.isInvalid())
1000 return SemaRef.ExprError();
1001
1002 OwningExprResult Result
1003 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
1004 /*FIXME*/E->getSourceRange().getBegin(),
1005 false, Operand.get(),
1006 E->getSourceRange().getEnd());
1007 if (Result.isInvalid())
1008 return SemaRef.ExprError();
1009
1010 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1011 return move(Result);
1012}
1013
1014Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +00001015TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
1016 OwningExprResult SubExpr(SemaRef, (void *)0);
1017 if (E->getSubExpr()) {
1018 SubExpr = Visit(E->getSubExpr());
1019 if (SubExpr.isInvalid())
1020 return SemaRef.ExprError();
1021 }
1022
1023 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
1024}
1025
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001026Sema::OwningExprResult
1027TemplateExprInstantiator::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1028 assert(false &&
1029 "FIXME: Instantiation for default arguments is unimplemented");
1030 return SemaRef.ExprError();
1031}
1032
Douglas Gregor42e5b502009-05-21 17:37:52 +00001033Sema::OwningExprResult
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001034TemplateExprInstantiator::VisitCXXBindTemporaryExpr(
1035 CXXBindTemporaryExpr *E) {
1036 OwningExprResult SubExpr = Visit(E->getSubExpr());
1037 if (SubExpr.isInvalid())
1038 return SemaRef.ExprError();
1039
Anders Carlsson464f4f32009-05-30 20:52:37 +00001040 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001041}
1042
1043Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +00001044TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
1045 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
1046 ->isDependentType() && "Dependent constructor shouldn't be here");
1047
1048 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
1049 /*FIXME*/E->getSourceRange().getBegin(),
1050 DeclarationName());
1051 if (T.isNull())
1052 return SemaRef.ExprError();
1053
Douglas Gregord7e27052009-05-20 22:33:37 +00001054 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +00001055 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
1056 ArgEnd = E->arg_end();
1057 Arg != ArgEnd; ++Arg) {
1058 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001059 if (ArgInst.isInvalid())
1060 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001061
1062 Args.push_back(ArgInst.takeAs<Expr>());
1063 }
1064
Anders Carlsson8e587a12009-05-30 20:56:46 +00001065 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, T,
Douglas Gregord94546a2009-05-20 21:38:11 +00001066 E->getConstructor(),
1067 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +00001068 Args.takeAs<Expr>(),
1069 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001070}
1071
1072Sema::OwningExprResult
1073TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1074 CXXFunctionalCastExpr *E) {
1075 // Instantiate the type that we're casting to.
1076 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1077 TemplateArgs,
1078 E->getTypeBeginLoc(),
1079 DeclarationName());
1080 if (ExplicitTy.isNull())
1081 return SemaRef.ExprError();
1082
1083 // Instantiate the subexpression.
1084 OwningExprResult SubExpr = Visit(E->getSubExpr());
1085 if (SubExpr.isInvalid())
1086 return SemaRef.ExprError();
1087
1088 // FIXME: The end of the type's source range is wrong
1089 Expr *Sub = SubExpr.takeAs<Expr>();
1090 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1091 ExplicitTy.getAsOpaquePtr(),
1092 /*FIXME:*/E->getTypeBeginLoc(),
1093 Sema::MultiExprArg(SemaRef,
1094 (void **)&Sub,
1095 1),
1096 0,
1097 E->getRParenLoc());
1098}
1099
1100Sema::OwningExprResult
1101TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1102 return SemaRef.Clone(E);
1103}
1104
1105Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001106TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1107 // Instantiate the type that we're allocating
1108 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1109 TemplateArgs,
1110 /*FIXME:*/E->getSourceRange().getBegin(),
1111 DeclarationName());
1112 if (AllocType.isNull())
1113 return SemaRef.ExprError();
1114
1115 // Instantiate the size of the array we're allocating (if any).
1116 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1117 TemplateArgs);
1118 if (ArraySize.isInvalid())
1119 return SemaRef.ExprError();
1120
1121 // Instantiate the placement arguments (if any).
1122 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1123 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1124 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1125 if (Arg.isInvalid())
1126 return SemaRef.ExprError();
1127
1128 PlacementArgs.push_back(Arg.take());
1129 }
1130
1131 // Instantiate the constructor arguments (if any).
1132 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1133 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1134 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1135 if (Arg.isInvalid())
1136 return SemaRef.ExprError();
1137
1138 ConstructorArgs.push_back(Arg.take());
1139 }
1140
1141 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1142 E->isGlobalNew(),
1143 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001144 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001145 /*FIXME*/SourceLocation(),
1146 E->isParenTypeId(),
1147 AllocType,
1148 /*FIXME*/E->getSourceRange().getBegin(),
1149 SourceRange(),
1150 move(ArraySize),
1151 /*FIXME*/SourceLocation(),
1152 Sema::MultiExprArg(SemaRef,
1153 ConstructorArgs.take(),
1154 ConstructorArgs.size()),
1155 E->getSourceRange().getEnd());
1156}
1157
1158Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001159TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1160 OwningExprResult Operand = Visit(E->getArgument());
1161 if (Operand.isInvalid())
1162 return SemaRef.ExprError();
1163
1164 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1165 E->isGlobalDelete(),
1166 E->isArrayForm(),
1167 move(Operand));
1168}
1169
1170Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001171TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1172 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1173 /*FIXME*/E->getSourceRange().getBegin(),
1174 DeclarationName());
1175 if (T.isNull())
1176 return SemaRef.ExprError();
1177
1178 SourceLocation FakeLParenLoc
1179 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1180 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1181 E->getSourceRange().getBegin(),
1182 /*FIXME*/FakeLParenLoc,
1183 T.getAsOpaquePtr(),
1184 E->getSourceRange().getEnd());
1185}
1186
1187Sema::OwningExprResult
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001188TemplateExprInstantiator::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
1189 NestedNameSpecifier *NNS
1190 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
1191 E->getQualifierRange(),
1192 TemplateArgs);
1193 if (!NNS)
1194 return SemaRef.ExprError();
1195
1196 CXXScopeSpec SS;
1197 SS.setRange(E->getQualifierRange());
1198 SS.setScopeRep(NNS);
1199 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0,
1200 E->getLocation(),
1201 E->getDecl()->getDeclName(),
1202 /*Trailing lparen=*/false,
1203 &SS,
1204 /*FIXME:*/false);
1205}
1206
1207Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001208TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1209 CXXExprWithTemporaries *E) {
1210 OwningExprResult SubExpr = Visit(E->getSubExpr());
1211 if (SubExpr.isInvalid())
1212 return SemaRef.ExprError();
1213
Anders Carlssonf54741e2009-06-16 03:37:31 +00001214 Expr *Temp =
1215 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
1216 E->shouldDestroyTemporaries());
1217 return SemaRef.Owned(Temp);
Douglas Gregore06274d2009-05-20 21:51:01 +00001218}
1219
1220Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001221TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1222 CXXUnresolvedConstructExpr *E) {
1223 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1224 E->getTypeBeginLoc(),
1225 DeclarationName());
1226 if (T.isNull())
1227 return SemaRef.ExprError();
1228
Douglas Gregord7e27052009-05-20 22:33:37 +00001229 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001230 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1231 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1232 ArgEnd = E->arg_end();
1233 Arg != ArgEnd; ++Arg) {
1234 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001235 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001236 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001237
1238 FakeCommaLocs.push_back(
1239 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1240 Args.push_back(InstArg.takeAs<Expr>());
1241 }
1242
1243 // FIXME: The end of the type range isn't exactly correct.
1244 // FIXME: we're faking the locations of the commas
1245 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1246 E->getLParenLoc()),
1247 T.getAsOpaquePtr(),
1248 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001249 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001250 &FakeCommaLocs.front(),
1251 E->getRParenLoc());
1252}
1253
1254Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001255TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
1256 CXXUnresolvedMemberExpr *E) {
1257 // Instantiate the base of the expression.
1258 OwningExprResult Base = Visit(E->getBase());
1259 if (Base.isInvalid())
1260 return SemaRef.ExprError();
1261
1262 // FIXME: Instantiate the declaration name.
1263 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1264 move(Base), E->getOperatorLoc(),
1265 E->isArrow()? tok::arrow
1266 : tok::period,
1267 E->getMemberLoc(),
1268 /*FIXME:*/*E->getMember().getAsIdentifierInfo(),
1269 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1270}
1271
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001272//----------------------------------------------------------------------------
1273// Objective-C Expressions
1274//----------------------------------------------------------------------------
1275Sema::OwningExprResult
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001276TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) {
1277 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001278}
1279
1280Sema::OwningExprResult
Anders Carlssonfc0f0212009-06-07 18:45:35 +00001281TemplateExprInstantiator::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1282 QualType EncodedType = SemaRef.InstantiateType(E->getEncodedType(),
1283 TemplateArgs,
1284 /*FIXME:*/E->getAtLoc(),
1285 DeclarationName());
1286 if (EncodedType.isNull())
1287 return SemaRef.ExprError();
1288
1289 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(E->getAtLoc(),
1290 EncodedType,
1291 E->getRParenLoc()));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001292}
1293
1294Sema::OwningExprResult
1295TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1296 assert(false && "FIXME: Template instantiations for ObjC expressions");
1297 return SemaRef.ExprError();
1298}
1299
1300Sema::OwningExprResult
1301TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001302 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001303}
1304
1305Sema::OwningExprResult
1306TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001307 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001308}
1309
1310Sema::OwningExprResult
1311TemplateExprInstantiator::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1312 assert(false && "FIXME: Template instantiations for ObjC expressions");
1313 return SemaRef.ExprError();
1314}
1315
1316Sema::OwningExprResult
1317TemplateExprInstantiator::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1318 assert(false && "FIXME: Template instantiations for ObjC expressions");
1319 return SemaRef.ExprError();
1320}
1321
1322Sema::OwningExprResult
1323TemplateExprInstantiator::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) {
1324 assert(false && "FIXME: Template instantiations for ObjC expressions");
1325 return SemaRef.ExprError();
1326}
1327
1328Sema::OwningExprResult
1329TemplateExprInstantiator::VisitObjCSuperExpr(ObjCSuperExpr *E) {
1330 assert(false && "FIXME: Template instantiations for ObjC expressions");
1331 return SemaRef.ExprError();
1332}
1333
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001334Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001335Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001336 if (!E)
1337 return Owned((Expr *)0);
1338
Douglas Gregor7e063902009-05-11 23:53:27 +00001339 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001340 return Instantiator.Visit(E);
1341}