blob: 749fb58948786e24712162353ee4d596088bc3af [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
122 assert(Arg.getKind() == TemplateArgument::Integral);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000123 QualType T = Arg.getIntegralType();
124 if (T->isCharType() || T->isWideCharType())
125 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
126 Arg.getAsIntegral()->getZExtValue(),
127 T->isWideCharType(),
128 T,
129 E->getSourceRange().getBegin()));
Douglas Gregor199d9912009-06-05 00:53:49 +0000130 if (T->isBooleanType())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000131 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
132 Arg.getAsIntegral()->getBoolValue(),
133 T,
134 E->getSourceRange().getBegin()));
135
Douglas Gregor199d9912009-06-05 00:53:49 +0000136 assert(Arg.getAsIntegral()->getBitWidth() == SemaRef.Context.getIntWidth(T));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000137 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
138 *Arg.getAsIntegral(),
139 T,
140 E->getSourceRange().getBegin()));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000141 }
142
143 if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
144 // FIXME: instantiate each decl in the overload set
145 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Ovl,
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000146 SemaRef.Context.OverloadTy,
147 E->getLocation(),
148 false, false));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000149 }
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000150
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000151 ValueDecl *NewD
Douglas Gregored961e72009-05-27 17:54:46 +0000152 = dyn_cast_or_null<ValueDecl>(SemaRef.InstantiateCurrentDeclRef(D));
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000153 if (!NewD)
154 return SemaRef.ExprError();
155
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000156 // FIXME: Build QualifiedDeclRefExpr?
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000157 QualType T = NewD->getType();
158 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000159 T.getNonReferenceType(),
160 E->getLocation(),
161 T->isDependentType(),
162 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000163}
164
165Sema::OwningExprResult
166TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
167 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
168 if (SubExpr.isInvalid())
169 return SemaRef.ExprError();
170
171 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
172 E->getLParen(), E->getRParen(),
173 (Expr *)SubExpr.release()));
174}
175
176Sema::OwningExprResult
177TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
178 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
179 if (Arg.isInvalid())
180 return SemaRef.ExprError();
181
182 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
183 E->getOpcode(),
184 move(Arg));
185}
186
187Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000188TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
189 Sema::OwningExprResult LHS = Visit(E->getLHS());
190 if (LHS.isInvalid())
191 return SemaRef.ExprError();
192
193 Sema::OwningExprResult RHS = Visit(E->getRHS());
194 if (RHS.isInvalid())
195 return SemaRef.ExprError();
196
197 // Since the overloaded array-subscript operator (operator[]) can
198 // only be a member function, we can make several simplifying
199 // assumptions here:
200 // 1) Normal name lookup (from the current scope) will not ever
201 // find any declarations of operator[] that won't also be found be
202 // member operator lookup, so it is safe to pass a NULL Scope
203 // during the instantiation to avoid the lookup entirely.
204 //
205 // 2) Neither normal name lookup nor argument-dependent lookup at
206 // template definition time will find any operators that won't be
207 // found at template instantiation time, so we do not need to
208 // cache the results of name lookup as we do for the binary
209 // operators.
210 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
211 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
212 /*FIXME:*/LLocFake,
213 move(RHS),
214 E->getRBracketLoc());
215}
216
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000217Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
218 // Instantiate callee
219 OwningExprResult Callee = Visit(E->getCallee());
220 if (Callee.isInvalid())
221 return SemaRef.ExprError();
222
223 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000224 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000225 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
226 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
227 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000228 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000229 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000230
231 FakeCommaLocs.push_back(
232 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
233 Args.push_back(Arg.takeAs<Expr>());
234 }
235
236 SourceLocation FakeLParenLoc
237 = ((Expr *)Callee.get())->getSourceRange().getBegin();
238 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
239 /*FIXME:*/FakeLParenLoc,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000240 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000241 /*FIXME:*/&FakeCommaLocs.front(),
242 E->getRParenLoc());
243}
244
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000245Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000246TemplateExprInstantiator::VisitMemberExpr(MemberExpr *E) {
247 // Instantiate the base of the expression.
248 OwningExprResult Base = Visit(E->getBase());
249 if (Base.isInvalid())
250 return SemaRef.ExprError();
251
252 // FIXME: Handle declaration names here
253 SourceLocation FakeOperatorLoc =
254 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
255 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
256 move(Base),
257 /*FIXME*/FakeOperatorLoc,
258 E->isArrow()? tok::arrow
259 : tok::period,
260 E->getMemberLoc(),
261 /*FIXME:*/*E->getMemberDecl()->getIdentifier(),
262 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
263}
264
265Sema::OwningExprResult
Douglas Gregor690dc7f2009-05-21 23:48:18 +0000266TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
267 SourceLocation FakeTypeLoc
268 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
269 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
270 FakeTypeLoc,
271 DeclarationName());
272 if (T.isNull())
273 return SemaRef.ExprError();
274
275 OwningExprResult Init = Visit(E->getInitializer());
276 if (Init.isInvalid())
277 return SemaRef.ExprError();
278
279 return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
280 T.getAsOpaquePtr(),
281 /*FIXME*/E->getLParenLoc(),
282 move(Init));
283}
284
285Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000286TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
287 Sema::OwningExprResult LHS = Visit(E->getLHS());
288 if (LHS.isInvalid())
289 return SemaRef.ExprError();
290
291 Sema::OwningExprResult RHS = Visit(E->getRHS());
292 if (RHS.isInvalid())
293 return SemaRef.ExprError();
294
295 Sema::OwningExprResult Result
296 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
297 E->getOpcode(),
298 (Expr *)LHS.get(),
299 (Expr *)RHS.get());
300 if (Result.isInvalid())
301 return SemaRef.ExprError();
302
303 LHS.release();
304 RHS.release();
305 return move(Result);
306}
307
308Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000309TemplateExprInstantiator::VisitCompoundAssignOperator(
310 CompoundAssignOperator *E) {
311 return VisitBinaryOperator(E);
312}
313
314Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000315TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
316 Sema::OwningExprResult First = Visit(E->getArg(0));
317 if (First.isInvalid())
318 return SemaRef.ExprError();
319
320 Expr *Args[2] = { (Expr *)First.get(), 0 };
321
322 Sema::OwningExprResult Second(SemaRef);
323 if (E->getNumArgs() == 2) {
324 Second = Visit(E->getArg(1));
325
326 if (Second.isInvalid())
327 return SemaRef.ExprError();
328
329 Args[1] = (Expr *)Second.get();
330 }
331
332 if (!E->isTypeDependent()) {
333 // Since our original expression was not type-dependent, we do not
334 // perform lookup again at instantiation time (C++ [temp.dep]p1).
335 // Instead, we just build the new overloaded operator call
336 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000337 OwningExprResult Callee = Visit(E->getCallee());
338 if (Callee.isInvalid())
339 return SemaRef.ExprError();
340
Douglas Gregoraa6af222009-03-25 00:27:28 +0000341 First.release();
342 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000343
Douglas Gregoraa6af222009-03-25 00:27:28 +0000344 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
345 SemaRef.Context,
346 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000347 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000348 Args, E->getNumArgs(),
349 E->getType(),
350 E->getOperatorLoc()));
351 }
352
353 bool isPostIncDec = E->getNumArgs() == 2 &&
354 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
355 if (E->getNumArgs() == 1 || isPostIncDec) {
356 if (!Args[0]->getType()->isOverloadableType()) {
357 // The argument is not of overloadable type, so try to create a
358 // built-in unary operation.
359 UnaryOperator::Opcode Opc
360 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
361
362 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
363 move(First));
364 }
365
366 // Fall through to perform overload resolution
367 } else {
368 assert(E->getNumArgs() == 2 && "Expected binary operation");
369
370 Sema::OwningExprResult Result(SemaRef);
371 if (!Args[0]->getType()->isOverloadableType() &&
372 !Args[1]->getType()->isOverloadableType()) {
373 // Neither of the arguments is an overloadable type, so try to
374 // create a built-in binary operation.
375 BinaryOperator::Opcode Opc =
376 BinaryOperator::getOverloadedOpcode(E->getOperator());
377 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
378 Args[0], Args[1]);
379 if (Result.isInvalid())
380 return SemaRef.ExprError();
381
382 First.release();
383 Second.release();
384 return move(Result);
385 }
386
387 // Fall through to perform overload resolution.
388 }
389
390 // Compute the set of functions that were found at template
391 // definition time.
392 Sema::FunctionSet Functions;
393 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
394 OverloadedFunctionDecl *Overloads
395 = cast<OverloadedFunctionDecl>(DRE->getDecl());
396
397 // FIXME: Do we have to check
398 // IsAcceptableNonMemberOperatorCandidate for each of these?
399 for (OverloadedFunctionDecl::function_iterator
400 F = Overloads->function_begin(),
401 FEnd = Overloads->function_end();
402 F != FEnd; ++F)
403 Functions.insert(*F);
404
405 // Add any functions found via argument-dependent lookup.
406 DeclarationName OpName
407 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
408 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
409
410 // Create the overloaded operator invocation.
411 if (E->getNumArgs() == 1 || isPostIncDec) {
412 UnaryOperator::Opcode Opc
413 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
414 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
415 Functions, move(First));
416 }
417
Mike Stump390b4cc2009-05-16 07:39:55 +0000418 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
419 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000420 BinaryOperator::Opcode Opc =
421 BinaryOperator::getOverloadedOpcode(E->getOperator());
422 OwningExprResult Result
423 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
424 Functions, Args[0], Args[1]);
425
426 if (Result.isInvalid())
427 return SemaRef.ExprError();
428
429 First.release();
430 Second.release();
431 return move(Result);
432}
433
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000434Sema::OwningExprResult
435TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
436 VarDecl *Var
437 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
438 SemaRef.CurContext,
439 TemplateArgs));
440 if (!Var)
441 return SemaRef.ExprError();
442
Douglas Gregore06274d2009-05-20 21:51:01 +0000443 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000444 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
445 E->getStartLoc(),
446 SourceLocation(),
447 Var));
448}
449
Douglas Gregoraa6af222009-03-25 00:27:28 +0000450Sema::OwningExprResult
451TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
452 Sema::OwningExprResult Cond = Visit(E->getCond());
453 if (Cond.isInvalid())
454 return SemaRef.ExprError();
455
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000456 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
457 TemplateArgs);
458 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000459 return SemaRef.ExprError();
460
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000461 Sema::OwningExprResult RHS = Visit(E->getRHS());
462 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000463 return SemaRef.ExprError();
464
465 if (!E->isTypeDependent()) {
466 // Since our original expression was not type-dependent, we do not
467 // perform lookup again at instantiation time (C++ [temp.dep]p1).
468 // Instead, we just build the new conditional operator call expression.
469 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
470 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000471 LHS.takeAs<Expr>(),
472 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000473 E->getType()));
474 }
475
476
477 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
478 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000479 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000480}
481
Douglas Gregor76658232009-05-22 23:25:52 +0000482Sema::OwningExprResult
483TemplateExprInstantiator::VisitAddrLabelExpr(AddrLabelExpr *E) {
484 return SemaRef.ActOnAddrLabel(E->getAmpAmpLoc(),
485 E->getLabelLoc(),
486 E->getLabel()->getID());
487}
488
Douglas Gregorcd938172009-05-19 20:31:21 +0000489Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000490 Sema::OwningStmtResult SubStmt
491 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000492 if (SubStmt.isInvalid())
493 return SemaRef.ExprError();
494
495 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
496 E->getRParenLoc());
497}
498
Douglas Gregoraa6af222009-03-25 00:27:28 +0000499Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000500TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000501 assert(false && "__builtin_types_compatible_p is not legal in C++");
502 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000503}
504
505Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000506TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000507 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000508 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
509 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000510 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000511 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000512
513 SubExprs.push_back(SubExpr.takeAs<Expr>());
514 }
515
516 // Find the declaration for __builtin_shufflevector
517 const IdentifierInfo &Name
518 = SemaRef.Context.Idents.get("__builtin_shufflevector");
519 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
520 DeclContext::lookup_result Lookup
521 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
522 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
523
524 // Build a reference to the __builtin_shufflevector builtin
525 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
526 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
527 E->getBuiltinLoc(),
528 false, false);
529 SemaRef.UsualUnaryConversions(Callee);
530
531 // Build the CallExpr
532 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000533 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000534 SubExprs.size(),
535 Builtin->getResultType(),
536 E->getRParenLoc());
537 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
538
539 // Type-check the __builtin_shufflevector expression.
540 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
541 if (Result.isInvalid())
542 return SemaRef.ExprError();
543
544 OwnedCall.release();
545 return move(Result);
546}
547
548Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000549TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
550 OwningExprResult Cond = Visit(E->getCond());
551 if (Cond.isInvalid())
552 return SemaRef.ExprError();
553
554 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
555 if (LHS.isInvalid())
556 return SemaRef.ExprError();
557
558 OwningExprResult RHS = Visit(E->getRHS());
559 if (RHS.isInvalid())
560 return SemaRef.ExprError();
561
562 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
563 move(Cond), move(LHS), move(RHS),
564 E->getRParenLoc());
565}
566
Douglas Gregordd027302009-05-19 23:10:31 +0000567Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
568 OwningExprResult SubExpr = Visit(E->getSubExpr());
569 if (SubExpr.isInvalid())
570 return SemaRef.ExprError();
571
572 SourceLocation FakeTypeLoc
573 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
574 .getEnd());
575 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
576 /*FIXME:*/FakeTypeLoc,
577 DeclarationName());
578 if (T.isNull())
579 return SemaRef.ExprError();
580
581 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
582 T.getAsOpaquePtr(), E->getRParenLoc());
583}
584
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000585Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000586TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000587 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
Douglas Gregorccb97f52009-05-21 21:38:12 +0000588 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
589 OwningExprResult Init = Visit(E->getInit(I));
590 if (Init.isInvalid())
591 return SemaRef.ExprError();
592 Inits.push_back(Init.takeAs<Expr>());
593 }
594
595 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
596 E->getRBraceLoc());
597}
598
599Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000600TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
601 Designation Desig;
602
603 // Instantiate the initializer value
604 OwningExprResult Init = Visit(E->getInit());
605 if (Init.isInvalid())
606 return SemaRef.ExprError();
607
608 // Instantiate the designators.
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000609 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
Douglas Gregor9ea62762009-05-21 23:17:49 +0000610 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
611 DEnd = E->designators_end();
612 D != DEnd; ++D) {
613 if (D->isFieldDesignator()) {
614 Desig.AddDesignator(Designator::getField(D->getFieldName(),
615 D->getDotLoc(),
616 D->getFieldLoc()));
617 continue;
618 }
619
620 if (D->isArrayDesignator()) {
621 OwningExprResult Index = Visit(E->getArrayIndex(*D));
622 if (Index.isInvalid())
623 return SemaRef.ExprError();
624
625 Desig.AddDesignator(Designator::getArray(Index.get(),
626 D->getLBracketLoc()));
627
628 ArrayExprs.push_back(Index.release());
629 continue;
630 }
631
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000632 assert(D->isArrayRangeDesignator() && "New kind of designator?");
633 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
634 if (Start.isInvalid())
635 return SemaRef.ExprError();
636
637 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
638 if (End.isInvalid())
639 return SemaRef.ExprError();
640
641 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
642 End.get(),
643 D->getLBracketLoc(),
644 D->getEllipsisLoc()));
645
646 ArrayExprs.push_back(Start.release());
647 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000648 }
649
650 OwningExprResult Result =
651 SemaRef.ActOnDesignatedInitializer(Desig,
652 E->getEqualOrColonLoc(),
653 E->usesGNUSyntax(),
654 move(Init));
655 if (Result.isInvalid())
656 return SemaRef.ExprError();
657
658 ArrayExprs.take();
659 return move(Result);
660}
661
662Sema::OwningExprResult
663TemplateExprInstantiator::VisitImplicitValueInitExpr(
664 ImplicitValueInitExpr *E) {
665 assert(!E->isTypeDependent() && !E->isValueDependent() &&
666 "ImplicitValueInitExprs are never dependent");
667 return SemaRef.Clone(E);
668}
669
670Sema::OwningExprResult
Douglas Gregorbec53e72009-05-22 23:07:44 +0000671TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
672 OwningExprResult Base = Visit(E->getBase());
673 if (Base.isInvalid())
674 return SemaRef.ExprError();
675
676 SourceLocation FakeOperatorLoc =
677 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
678 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
679 move(Base),
680 /*FIXME*/FakeOperatorLoc,
681 tok::period,
682 E->getAccessorLoc(),
683 E->getAccessor(),
684 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
685}
686
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000687Sema::OwningExprResult
688TemplateExprInstantiator::VisitBlockExpr(BlockExpr *E) {
689 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
690 return SemaRef.ExprError();
691}
692
693Sema::OwningExprResult
694TemplateExprInstantiator::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
695 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
696 return SemaRef.ExprError();
697}
698
Douglas Gregorbec53e72009-05-22 23:07:44 +0000699Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000700TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
701 bool isSizeOf = E->isSizeOf();
702
703 if (E->isArgumentType()) {
704 QualType T = E->getArgumentType();
705 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000706 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000707 /*FIXME*/E->getOperatorLoc(),
708 &SemaRef.PP.getIdentifierTable().get("sizeof"));
709 if (T.isNull())
710 return SemaRef.ExprError();
711 }
712
713 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
714 E->getSourceRange());
715 }
716
Douglas Gregorac7610d2009-06-22 20:57:11 +0000717 Sema::OwningExprResult Arg(SemaRef);
718 {
719 // C++0x [expr.sizeof]p1:
720 // The operand is either an expression, which is an unevaluated operand
721 // [...]
722 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
723
724 Arg = Visit(E->getArgumentExpr());
725 if (Arg.isInvalid())
726 return SemaRef.ExprError();
727 }
Douglas Gregoraa6af222009-03-25 00:27:28 +0000728
729 Sema::OwningExprResult Result
730 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
731 isSizeOf, E->getSourceRange());
732 if (Result.isInvalid())
733 return SemaRef.ExprError();
734
735 Arg.release();
736 return move(Result);
737}
738
739Sema::OwningExprResult
740TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000741 NestedNameSpecifier *NNS
742 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
743 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000744 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000745 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000746 return SemaRef.ExprError();
747
Douglas Gregorab452ba2009-03-26 23:50:42 +0000748 CXXScopeSpec SS;
749 SS.setRange(E->getQualifierRange());
750 SS.setScopeRep(NNS);
751
Douglas Gregoraa6af222009-03-25 00:27:28 +0000752 // FIXME: We're passing in a NULL scope, because
753 // ActOnDeclarationNameExpr doesn't actually use the scope when we
754 // give it a non-empty scope specifier. Investigate whether it would
755 // be better to refactor ActOnDeclarationNameExpr.
756 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
757 E->getDeclName(),
758 /*HasTrailingLParen=*/false,
759 &SS,
760 /*FIXME:isAddressOfOperand=*/false);
761}
762
763Sema::OwningExprResult
764TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
765 CXXTemporaryObjectExpr *E) {
766 QualType T = E->getType();
767 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000768 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000769 E->getTypeBeginLoc(), DeclarationName());
770 if (T.isNull())
771 return SemaRef.ExprError();
772 }
773
Douglas Gregord7e27052009-05-20 22:33:37 +0000774 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000775 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000776 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
777 ArgEnd = E->arg_end();
778 Arg != ArgEnd; ++Arg) {
779 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000780 if (InstantiatedArg.isInvalid())
781 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000782
783 Args.push_back((Expr *)InstantiatedArg.release());
784 }
785
Douglas Gregord7e27052009-05-20 22:33:37 +0000786 SourceLocation CommaLoc;
787 // FIXME: HACK!
788 if (Args.size() > 1) {
789 Expr *First = (Expr *)Args[0];
790 CommaLoc
791 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000792 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000793 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
794 /*, FIXME*/),
795 T.getAsOpaquePtr(),
796 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000797 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000798 /*HACK*/&CommaLoc,
799 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000800}
801
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000802Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
803 assert(false && "Cannot instantiate abstract CastExpr");
804 return SemaRef.ExprError();
805}
806
Douglas Gregoraa6af222009-03-25 00:27:28 +0000807Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
808 ImplicitCastExpr *E) {
809 assert(!E->isTypeDependent() && "Implicit casts must have known types");
810
811 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
812 if (SubExpr.isInvalid())
813 return SemaRef.ExprError();
814
815 ImplicitCastExpr *ICE =
816 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
817 (Expr *)SubExpr.release(),
818 E->isLvalueCast());
819 return SemaRef.Owned(ICE);
820}
821
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000822Sema::OwningExprResult
823TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
824 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
825 return SemaRef.ExprError();
826}
827
828Sema::OwningExprResult
829TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
830 // Instantiate the type that we're casting to.
831 SourceLocation TypeStartLoc
832 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
833 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
834 TemplateArgs,
835 TypeStartLoc,
836 DeclarationName());
837 if (ExplicitTy.isNull())
838 return SemaRef.ExprError();
839
840 // Instantiate the subexpression.
841 OwningExprResult SubExpr = Visit(E->getSubExpr());
842 if (SubExpr.isInvalid())
843 return SemaRef.ExprError();
844
845 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
846 ExplicitTy.getAsOpaquePtr(),
847 E->getRParenLoc(),
848 move(SubExpr));
849}
850
851Sema::OwningExprResult
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000852TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
853 return VisitCallExpr(E);
854}
855
856Sema::OwningExprResult
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000857TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
858 // Figure out which cast operator we're dealing with.
859 tok::TokenKind Kind;
860 switch (E->getStmtClass()) {
861 case Stmt::CXXStaticCastExprClass:
862 Kind = tok::kw_static_cast;
863 break;
864
865 case Stmt::CXXDynamicCastExprClass:
866 Kind = tok::kw_dynamic_cast;
867 break;
868
869 case Stmt::CXXReinterpretCastExprClass:
870 Kind = tok::kw_reinterpret_cast;
871 break;
872
873 case Stmt::CXXConstCastExprClass:
874 Kind = tok::kw_const_cast;
875 break;
876
877 default:
878 assert(false && "Invalid C++ named cast");
879 return SemaRef.ExprError();
880 }
881
882 // Instantiate the type that we're casting to.
883 SourceLocation TypeStartLoc
884 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
885 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
886 TemplateArgs,
887 TypeStartLoc,
888 DeclarationName());
889 if (ExplicitTy.isNull())
890 return SemaRef.ExprError();
891
892 // Instantiate the subexpression.
893 OwningExprResult SubExpr = Visit(E->getSubExpr());
894 if (SubExpr.isInvalid())
895 return SemaRef.ExprError();
896
897 SourceLocation FakeLAngleLoc
898 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
899 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
900 SourceLocation FakeRParenLoc
901 = SemaRef.PP.getLocForEndOfToken(
902 E->getSubExpr()->getSourceRange().getEnd());
903 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
904 /*FIXME:*/FakeLAngleLoc,
905 ExplicitTy.getAsOpaquePtr(),
906 /*FIXME:*/FakeRAngleLoc,
907 /*FIXME:*/FakeRAngleLoc,
908 move(SubExpr),
909 /*FIXME:*/FakeRParenLoc);
910}
911
912Sema::OwningExprResult
913TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
914 return VisitCXXNamedCastExpr(E);
915}
916
917Sema::OwningExprResult
918TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
919 return VisitCXXNamedCastExpr(E);
920}
921
922Sema::OwningExprResult
923TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
924 CXXReinterpretCastExpr *E) {
925 return VisitCXXNamedCastExpr(E);
926}
927
928Sema::OwningExprResult
929TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
930 return VisitCXXNamedCastExpr(E);
931}
932
Anders Carlsson0712d292009-05-15 20:26:03 +0000933Sema::OwningExprResult
934TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
935 QualType ThisType =
936 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
937
938 CXXThisExpr *TE =
939 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
940
941 return SemaRef.Owned(TE);
942}
943
Douglas Gregoraa6af222009-03-25 00:27:28 +0000944Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000945TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
946 if (E->isTypeOperand()) {
947 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
948 TemplateArgs,
949 /*FIXME*/E->getSourceRange().getBegin(),
950 DeclarationName());
951 if (T.isNull())
952 return SemaRef.ExprError();
953
954 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
955 /*FIXME*/E->getSourceRange().getBegin(),
956 true, T.getAsOpaquePtr(),
957 E->getSourceRange().getEnd());
958 }
959
Douglas Gregorac7610d2009-06-22 20:57:11 +0000960 // We don't know whether the expression is potentially evaluated until
961 // after we perform semantic analysis, so the expression is potentially
962 // potentially evaluated.
963 EnterExpressionEvaluationContext Unevaluated(SemaRef,
964 Action::PotentiallyPotentiallyEvaluated);
965
Douglas Gregor12d0c302009-05-21 18:34:44 +0000966 OwningExprResult Operand = Visit(E->getExprOperand());
967 if (Operand.isInvalid())
968 return SemaRef.ExprError();
969
970 OwningExprResult Result
971 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
972 /*FIXME*/E->getSourceRange().getBegin(),
973 false, Operand.get(),
974 E->getSourceRange().getEnd());
975 if (Result.isInvalid())
976 return SemaRef.ExprError();
977
978 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
979 return move(Result);
980}
981
982Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +0000983TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
984 OwningExprResult SubExpr(SemaRef, (void *)0);
985 if (E->getSubExpr()) {
986 SubExpr = Visit(E->getSubExpr());
987 if (SubExpr.isInvalid())
988 return SemaRef.ExprError();
989 }
990
991 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
992}
993
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000994Sema::OwningExprResult
995TemplateExprInstantiator::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
996 assert(false &&
997 "FIXME: Instantiation for default arguments is unimplemented");
998 return SemaRef.ExprError();
999}
1000
Douglas Gregor42e5b502009-05-21 17:37:52 +00001001Sema::OwningExprResult
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001002TemplateExprInstantiator::VisitCXXBindTemporaryExpr(
1003 CXXBindTemporaryExpr *E) {
1004 OwningExprResult SubExpr = Visit(E->getSubExpr());
1005 if (SubExpr.isInvalid())
1006 return SemaRef.ExprError();
1007
Anders Carlsson464f4f32009-05-30 20:52:37 +00001008 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001009}
1010
1011Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +00001012TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
1013 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
1014 ->isDependentType() && "Dependent constructor shouldn't be here");
1015
1016 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
1017 /*FIXME*/E->getSourceRange().getBegin(),
1018 DeclarationName());
1019 if (T.isNull())
1020 return SemaRef.ExprError();
1021
Douglas Gregord7e27052009-05-20 22:33:37 +00001022 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +00001023 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
1024 ArgEnd = E->arg_end();
1025 Arg != ArgEnd; ++Arg) {
1026 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001027 if (ArgInst.isInvalid())
1028 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001029
1030 Args.push_back(ArgInst.takeAs<Expr>());
1031 }
1032
Anders Carlsson8e587a12009-05-30 20:56:46 +00001033 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, T,
Douglas Gregord94546a2009-05-20 21:38:11 +00001034 E->getConstructor(),
1035 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +00001036 Args.takeAs<Expr>(),
1037 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001038}
1039
1040Sema::OwningExprResult
1041TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1042 CXXFunctionalCastExpr *E) {
1043 // Instantiate the type that we're casting to.
1044 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1045 TemplateArgs,
1046 E->getTypeBeginLoc(),
1047 DeclarationName());
1048 if (ExplicitTy.isNull())
1049 return SemaRef.ExprError();
1050
1051 // Instantiate the subexpression.
1052 OwningExprResult SubExpr = Visit(E->getSubExpr());
1053 if (SubExpr.isInvalid())
1054 return SemaRef.ExprError();
1055
1056 // FIXME: The end of the type's source range is wrong
1057 Expr *Sub = SubExpr.takeAs<Expr>();
1058 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1059 ExplicitTy.getAsOpaquePtr(),
1060 /*FIXME:*/E->getTypeBeginLoc(),
1061 Sema::MultiExprArg(SemaRef,
1062 (void **)&Sub,
1063 1),
1064 0,
1065 E->getRParenLoc());
1066}
1067
1068Sema::OwningExprResult
1069TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1070 return SemaRef.Clone(E);
1071}
1072
1073Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001074TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1075 // Instantiate the type that we're allocating
1076 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1077 TemplateArgs,
1078 /*FIXME:*/E->getSourceRange().getBegin(),
1079 DeclarationName());
1080 if (AllocType.isNull())
1081 return SemaRef.ExprError();
1082
1083 // Instantiate the size of the array we're allocating (if any).
1084 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1085 TemplateArgs);
1086 if (ArraySize.isInvalid())
1087 return SemaRef.ExprError();
1088
1089 // Instantiate the placement arguments (if any).
1090 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1091 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1092 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1093 if (Arg.isInvalid())
1094 return SemaRef.ExprError();
1095
1096 PlacementArgs.push_back(Arg.take());
1097 }
1098
1099 // Instantiate the constructor arguments (if any).
1100 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1101 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1102 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1103 if (Arg.isInvalid())
1104 return SemaRef.ExprError();
1105
1106 ConstructorArgs.push_back(Arg.take());
1107 }
1108
1109 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1110 E->isGlobalNew(),
1111 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001112 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001113 /*FIXME*/SourceLocation(),
1114 E->isParenTypeId(),
1115 AllocType,
1116 /*FIXME*/E->getSourceRange().getBegin(),
1117 SourceRange(),
1118 move(ArraySize),
1119 /*FIXME*/SourceLocation(),
1120 Sema::MultiExprArg(SemaRef,
1121 ConstructorArgs.take(),
1122 ConstructorArgs.size()),
1123 E->getSourceRange().getEnd());
1124}
1125
1126Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001127TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1128 OwningExprResult Operand = Visit(E->getArgument());
1129 if (Operand.isInvalid())
1130 return SemaRef.ExprError();
1131
1132 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1133 E->isGlobalDelete(),
1134 E->isArrayForm(),
1135 move(Operand));
1136}
1137
1138Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001139TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1140 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1141 /*FIXME*/E->getSourceRange().getBegin(),
1142 DeclarationName());
1143 if (T.isNull())
1144 return SemaRef.ExprError();
1145
1146 SourceLocation FakeLParenLoc
1147 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1148 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1149 E->getSourceRange().getBegin(),
1150 /*FIXME*/FakeLParenLoc,
1151 T.getAsOpaquePtr(),
1152 E->getSourceRange().getEnd());
1153}
1154
1155Sema::OwningExprResult
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001156TemplateExprInstantiator::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
1157 NestedNameSpecifier *NNS
1158 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
1159 E->getQualifierRange(),
1160 TemplateArgs);
1161 if (!NNS)
1162 return SemaRef.ExprError();
1163
1164 CXXScopeSpec SS;
1165 SS.setRange(E->getQualifierRange());
1166 SS.setScopeRep(NNS);
1167 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0,
1168 E->getLocation(),
1169 E->getDecl()->getDeclName(),
1170 /*Trailing lparen=*/false,
1171 &SS,
1172 /*FIXME:*/false);
1173}
1174
1175Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001176TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1177 CXXExprWithTemporaries *E) {
1178 OwningExprResult SubExpr = Visit(E->getSubExpr());
1179 if (SubExpr.isInvalid())
1180 return SemaRef.ExprError();
1181
Anders Carlssonf54741e2009-06-16 03:37:31 +00001182 Expr *Temp =
1183 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
1184 E->shouldDestroyTemporaries());
1185 return SemaRef.Owned(Temp);
Douglas Gregore06274d2009-05-20 21:51:01 +00001186}
1187
1188Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001189TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1190 CXXUnresolvedConstructExpr *E) {
1191 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1192 E->getTypeBeginLoc(),
1193 DeclarationName());
1194 if (T.isNull())
1195 return SemaRef.ExprError();
1196
Douglas Gregord7e27052009-05-20 22:33:37 +00001197 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001198 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1199 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1200 ArgEnd = E->arg_end();
1201 Arg != ArgEnd; ++Arg) {
1202 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001203 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001204 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001205
1206 FakeCommaLocs.push_back(
1207 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1208 Args.push_back(InstArg.takeAs<Expr>());
1209 }
1210
1211 // FIXME: The end of the type range isn't exactly correct.
1212 // FIXME: we're faking the locations of the commas
1213 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1214 E->getLParenLoc()),
1215 T.getAsOpaquePtr(),
1216 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001217 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001218 &FakeCommaLocs.front(),
1219 E->getRParenLoc());
1220}
1221
1222Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001223TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
1224 CXXUnresolvedMemberExpr *E) {
1225 // Instantiate the base of the expression.
1226 OwningExprResult Base = Visit(E->getBase());
1227 if (Base.isInvalid())
1228 return SemaRef.ExprError();
1229
1230 // FIXME: Instantiate the declaration name.
1231 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1232 move(Base), E->getOperatorLoc(),
1233 E->isArrow()? tok::arrow
1234 : tok::period,
1235 E->getMemberLoc(),
1236 /*FIXME:*/*E->getMember().getAsIdentifierInfo(),
1237 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1238}
1239
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001240//----------------------------------------------------------------------------
1241// Objective-C Expressions
1242//----------------------------------------------------------------------------
1243Sema::OwningExprResult
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001244TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) {
1245 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001246}
1247
1248Sema::OwningExprResult
Anders Carlssonfc0f0212009-06-07 18:45:35 +00001249TemplateExprInstantiator::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1250 QualType EncodedType = SemaRef.InstantiateType(E->getEncodedType(),
1251 TemplateArgs,
1252 /*FIXME:*/E->getAtLoc(),
1253 DeclarationName());
1254 if (EncodedType.isNull())
1255 return SemaRef.ExprError();
1256
1257 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(E->getAtLoc(),
1258 EncodedType,
1259 E->getRParenLoc()));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001260}
1261
1262Sema::OwningExprResult
1263TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1264 assert(false && "FIXME: Template instantiations for ObjC expressions");
1265 return SemaRef.ExprError();
1266}
1267
1268Sema::OwningExprResult
1269TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001270 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001271}
1272
1273Sema::OwningExprResult
1274TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001275 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001276}
1277
1278Sema::OwningExprResult
1279TemplateExprInstantiator::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1280 assert(false && "FIXME: Template instantiations for ObjC expressions");
1281 return SemaRef.ExprError();
1282}
1283
1284Sema::OwningExprResult
1285TemplateExprInstantiator::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1286 assert(false && "FIXME: Template instantiations for ObjC expressions");
1287 return SemaRef.ExprError();
1288}
1289
1290Sema::OwningExprResult
1291TemplateExprInstantiator::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) {
1292 assert(false && "FIXME: Template instantiations for ObjC expressions");
1293 return SemaRef.ExprError();
1294}
1295
1296Sema::OwningExprResult
1297TemplateExprInstantiator::VisitObjCSuperExpr(ObjCSuperExpr *E) {
1298 assert(false && "FIXME: Template instantiations for ObjC expressions");
1299 return SemaRef.ExprError();
1300}
1301
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001302Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001303Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001304 if (!E)
1305 return Owned((Expr *)0);
1306
Douglas Gregor7e063902009-05-11 23:53:27 +00001307 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001308 return Instantiator.Visit(E);
1309}