blob: dcf2ebcd2ee18f2fbd60736f6912e0c981a613df [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");
Douglas Gregore94866f2009-06-12 21:21:02 +0000142
Douglas Gregor16134c62009-07-01 00:28:38 +0000143 // If the corresponding template argument is NULL or non-existent, it's
144 // because we are performing instantiation from explicitly-specified
145 // template arguments in a function template, but there were some
146 // arguments left unspecified.
147 if (NTTP->getPosition() >= TemplateArgs.size() ||
148 TemplateArgs[NTTP->getPosition()].isNull())
149 return SemaRef.Owned(E); // FIXME: Clone the expression!
150
151 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
152
Douglas Gregore94866f2009-06-12 21:21:02 +0000153 // The template argument itself might be an expression, in which
154 // case we just return that expression.
155 if (Arg.getKind() == TemplateArgument::Expression)
156 // FIXME: Clone the expression!
157 return SemaRef.Owned(Arg.getAsExpr());
158
Anders Carlsson87471f52009-06-26 03:02:18 +0000159 if (Arg.getKind() == TemplateArgument::Declaration) {
160 ValueDecl *VD = cast<ValueDecl>(Arg.getAsDecl());
161
162 // FIXME: Can VD ever have a dependent type?
163 return SemaRef.BuildDeclRefExpr(VD, VD->getType(), E->getLocation(),
164 false, false);
165 }
166
Douglas Gregore94866f2009-06-12 21:21:02 +0000167 assert(Arg.getKind() == TemplateArgument::Integral);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000168 QualType T = Arg.getIntegralType();
169 if (T->isCharType() || T->isWideCharType())
170 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
171 Arg.getAsIntegral()->getZExtValue(),
172 T->isWideCharType(),
173 T,
174 E->getSourceRange().getBegin()));
Douglas Gregor199d9912009-06-05 00:53:49 +0000175 if (T->isBooleanType())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000176 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
177 Arg.getAsIntegral()->getBoolValue(),
178 T,
179 E->getSourceRange().getBegin()));
180
Douglas Gregor199d9912009-06-05 00:53:49 +0000181 assert(Arg.getAsIntegral()->getBitWidth() == SemaRef.Context.getIntWidth(T));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000182 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
183 *Arg.getAsIntegral(),
184 T,
185 E->getSourceRange().getBegin()));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000186 }
187
188 if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
189 // FIXME: instantiate each decl in the overload set
190 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Ovl,
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000191 SemaRef.Context.OverloadTy,
192 E->getLocation(),
193 false, false));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000194 }
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000195
Douglas Gregor751f9a42009-06-30 15:47:41 +0000196 NamedDecl *InstD = SemaRef.InstantiateCurrentDeclRef(D);
197 if (!InstD)
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000198 return SemaRef.ExprError();
199
Douglas Gregor751f9a42009-06-30 15:47:41 +0000200 // FIXME: nested-name-specifier for QualifiedDeclRefExpr
201 return SemaRef.BuildDeclarationNameExpr(E->getLocation(), InstD,
202 /*FIXME:*/false,
203 /*FIXME:*/0,
204 /*FIXME:*/false);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000205}
206
207Sema::OwningExprResult
208TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
209 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
210 if (SubExpr.isInvalid())
211 return SemaRef.ExprError();
212
213 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
214 E->getLParen(), E->getRParen(),
215 (Expr *)SubExpr.release()));
216}
217
218Sema::OwningExprResult
219TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
220 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
221 if (Arg.isInvalid())
222 return SemaRef.ExprError();
223
224 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
225 E->getOpcode(),
226 move(Arg));
227}
228
229Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000230TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
231 Sema::OwningExprResult LHS = Visit(E->getLHS());
232 if (LHS.isInvalid())
233 return SemaRef.ExprError();
234
235 Sema::OwningExprResult RHS = Visit(E->getRHS());
236 if (RHS.isInvalid())
237 return SemaRef.ExprError();
238
239 // Since the overloaded array-subscript operator (operator[]) can
240 // only be a member function, we can make several simplifying
241 // assumptions here:
242 // 1) Normal name lookup (from the current scope) will not ever
243 // find any declarations of operator[] that won't also be found be
244 // member operator lookup, so it is safe to pass a NULL Scope
245 // during the instantiation to avoid the lookup entirely.
246 //
247 // 2) Neither normal name lookup nor argument-dependent lookup at
248 // template definition time will find any operators that won't be
249 // found at template instantiation time, so we do not need to
250 // cache the results of name lookup as we do for the binary
251 // operators.
252 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
253 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
254 /*FIXME:*/LLocFake,
255 move(RHS),
256 E->getRBracketLoc());
257}
258
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000259Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
260 // Instantiate callee
261 OwningExprResult Callee = Visit(E->getCallee());
262 if (Callee.isInvalid())
263 return SemaRef.ExprError();
264
265 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000266 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000267 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
268 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
269 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000270 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000271 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000272
273 FakeCommaLocs.push_back(
274 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
275 Args.push_back(Arg.takeAs<Expr>());
276 }
277
278 SourceLocation FakeLParenLoc
279 = ((Expr *)Callee.get())->getSourceRange().getBegin();
280 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
281 /*FIXME:*/FakeLParenLoc,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000282 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000283 /*FIXME:*/&FakeCommaLocs.front(),
284 E->getRParenLoc());
285}
286
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000287Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000288TemplateExprInstantiator::VisitMemberExpr(MemberExpr *E) {
289 // Instantiate the base of the expression.
290 OwningExprResult Base = Visit(E->getBase());
291 if (Base.isInvalid())
292 return SemaRef.ExprError();
293
294 // FIXME: Handle declaration names here
295 SourceLocation FakeOperatorLoc =
296 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
297 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
298 move(Base),
299 /*FIXME*/FakeOperatorLoc,
300 E->isArrow()? tok::arrow
301 : tok::period,
302 E->getMemberLoc(),
303 /*FIXME:*/*E->getMemberDecl()->getIdentifier(),
304 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
305}
306
307Sema::OwningExprResult
Douglas Gregor690dc7f2009-05-21 23:48:18 +0000308TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
309 SourceLocation FakeTypeLoc
310 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
311 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
312 FakeTypeLoc,
313 DeclarationName());
314 if (T.isNull())
315 return SemaRef.ExprError();
316
317 OwningExprResult Init = Visit(E->getInitializer());
318 if (Init.isInvalid())
319 return SemaRef.ExprError();
320
321 return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
322 T.getAsOpaquePtr(),
323 /*FIXME*/E->getLParenLoc(),
324 move(Init));
325}
326
327Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000328TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
329 Sema::OwningExprResult LHS = Visit(E->getLHS());
330 if (LHS.isInvalid())
331 return SemaRef.ExprError();
332
333 Sema::OwningExprResult RHS = Visit(E->getRHS());
334 if (RHS.isInvalid())
335 return SemaRef.ExprError();
336
337 Sema::OwningExprResult Result
338 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
339 E->getOpcode(),
340 (Expr *)LHS.get(),
341 (Expr *)RHS.get());
342 if (Result.isInvalid())
343 return SemaRef.ExprError();
344
345 LHS.release();
346 RHS.release();
347 return move(Result);
348}
349
350Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000351TemplateExprInstantiator::VisitCompoundAssignOperator(
352 CompoundAssignOperator *E) {
353 return VisitBinaryOperator(E);
354}
355
356Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000357TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
358 Sema::OwningExprResult First = Visit(E->getArg(0));
359 if (First.isInvalid())
360 return SemaRef.ExprError();
361
362 Expr *Args[2] = { (Expr *)First.get(), 0 };
363
364 Sema::OwningExprResult Second(SemaRef);
365 if (E->getNumArgs() == 2) {
366 Second = Visit(E->getArg(1));
367
368 if (Second.isInvalid())
369 return SemaRef.ExprError();
370
371 Args[1] = (Expr *)Second.get();
372 }
373
374 if (!E->isTypeDependent()) {
375 // Since our original expression was not type-dependent, we do not
376 // perform lookup again at instantiation time (C++ [temp.dep]p1).
377 // Instead, we just build the new overloaded operator call
378 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000379 OwningExprResult Callee = Visit(E->getCallee());
380 if (Callee.isInvalid())
381 return SemaRef.ExprError();
382
Douglas Gregoraa6af222009-03-25 00:27:28 +0000383 First.release();
384 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000385
Douglas Gregoraa6af222009-03-25 00:27:28 +0000386 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
387 SemaRef.Context,
388 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000389 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000390 Args, E->getNumArgs(),
391 E->getType(),
392 E->getOperatorLoc()));
393 }
394
395 bool isPostIncDec = E->getNumArgs() == 2 &&
396 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
397 if (E->getNumArgs() == 1 || isPostIncDec) {
398 if (!Args[0]->getType()->isOverloadableType()) {
399 // The argument is not of overloadable type, so try to create a
400 // built-in unary operation.
401 UnaryOperator::Opcode Opc
402 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
403
404 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
405 move(First));
406 }
407
408 // Fall through to perform overload resolution
409 } else {
410 assert(E->getNumArgs() == 2 && "Expected binary operation");
411
412 Sema::OwningExprResult Result(SemaRef);
413 if (!Args[0]->getType()->isOverloadableType() &&
414 !Args[1]->getType()->isOverloadableType()) {
415 // Neither of the arguments is an overloadable type, so try to
416 // create a built-in binary operation.
417 BinaryOperator::Opcode Opc =
418 BinaryOperator::getOverloadedOpcode(E->getOperator());
419 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
420 Args[0], Args[1]);
421 if (Result.isInvalid())
422 return SemaRef.ExprError();
423
424 First.release();
425 Second.release();
426 return move(Result);
427 }
428
429 // Fall through to perform overload resolution.
430 }
431
432 // Compute the set of functions that were found at template
433 // definition time.
434 Sema::FunctionSet Functions;
435 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
436 OverloadedFunctionDecl *Overloads
437 = cast<OverloadedFunctionDecl>(DRE->getDecl());
438
439 // FIXME: Do we have to check
440 // IsAcceptableNonMemberOperatorCandidate for each of these?
441 for (OverloadedFunctionDecl::function_iterator
442 F = Overloads->function_begin(),
443 FEnd = Overloads->function_end();
444 F != FEnd; ++F)
Douglas Gregore53060f2009-06-25 22:08:12 +0000445 Functions.insert(cast<FunctionDecl>(*F));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000446
447 // Add any functions found via argument-dependent lookup.
448 DeclarationName OpName
449 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
450 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
451
452 // Create the overloaded operator invocation.
453 if (E->getNumArgs() == 1 || isPostIncDec) {
454 UnaryOperator::Opcode Opc
455 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
456 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
457 Functions, move(First));
458 }
459
Mike Stump390b4cc2009-05-16 07:39:55 +0000460 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
461 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000462 BinaryOperator::Opcode Opc =
463 BinaryOperator::getOverloadedOpcode(E->getOperator());
464 OwningExprResult Result
465 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
466 Functions, Args[0], Args[1]);
467
468 if (Result.isInvalid())
469 return SemaRef.ExprError();
470
471 First.release();
472 Second.release();
473 return move(Result);
474}
475
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000476Sema::OwningExprResult
477TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
478 VarDecl *Var
479 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
480 SemaRef.CurContext,
481 TemplateArgs));
482 if (!Var)
483 return SemaRef.ExprError();
484
Douglas Gregore06274d2009-05-20 21:51:01 +0000485 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000486 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
487 E->getStartLoc(),
488 SourceLocation(),
489 Var));
490}
491
Douglas Gregoraa6af222009-03-25 00:27:28 +0000492Sema::OwningExprResult
493TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
494 Sema::OwningExprResult Cond = Visit(E->getCond());
495 if (Cond.isInvalid())
496 return SemaRef.ExprError();
497
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000498 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
499 TemplateArgs);
500 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000501 return SemaRef.ExprError();
502
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000503 Sema::OwningExprResult RHS = Visit(E->getRHS());
504 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000505 return SemaRef.ExprError();
506
507 if (!E->isTypeDependent()) {
508 // Since our original expression was not type-dependent, we do not
509 // perform lookup again at instantiation time (C++ [temp.dep]p1).
510 // Instead, we just build the new conditional operator call expression.
511 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
512 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000513 LHS.takeAs<Expr>(),
514 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000515 E->getType()));
516 }
517
518
519 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
520 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000521 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000522}
523
Douglas Gregor76658232009-05-22 23:25:52 +0000524Sema::OwningExprResult
525TemplateExprInstantiator::VisitAddrLabelExpr(AddrLabelExpr *E) {
526 return SemaRef.ActOnAddrLabel(E->getAmpAmpLoc(),
527 E->getLabelLoc(),
528 E->getLabel()->getID());
529}
530
Douglas Gregorcd938172009-05-19 20:31:21 +0000531Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000532 Sema::OwningStmtResult SubStmt
533 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000534 if (SubStmt.isInvalid())
535 return SemaRef.ExprError();
536
537 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
538 E->getRParenLoc());
539}
540
Douglas Gregoraa6af222009-03-25 00:27:28 +0000541Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000542TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000543 assert(false && "__builtin_types_compatible_p is not legal in C++");
544 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000545}
546
547Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000548TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000549 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000550 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
551 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000552 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000553 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000554
555 SubExprs.push_back(SubExpr.takeAs<Expr>());
556 }
557
558 // Find the declaration for __builtin_shufflevector
559 const IdentifierInfo &Name
560 = SemaRef.Context.Idents.get("__builtin_shufflevector");
561 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +0000562 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
Douglas Gregorcde01732009-05-19 22:10:17 +0000563 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
564
565 // Build a reference to the __builtin_shufflevector builtin
566 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
567 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
568 E->getBuiltinLoc(),
569 false, false);
570 SemaRef.UsualUnaryConversions(Callee);
571
572 // Build the CallExpr
573 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000574 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000575 SubExprs.size(),
576 Builtin->getResultType(),
577 E->getRParenLoc());
578 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
579
580 // Type-check the __builtin_shufflevector expression.
581 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
582 if (Result.isInvalid())
583 return SemaRef.ExprError();
584
585 OwnedCall.release();
586 return move(Result);
587}
588
589Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000590TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
591 OwningExprResult Cond = Visit(E->getCond());
592 if (Cond.isInvalid())
593 return SemaRef.ExprError();
594
595 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
596 if (LHS.isInvalid())
597 return SemaRef.ExprError();
598
599 OwningExprResult RHS = Visit(E->getRHS());
600 if (RHS.isInvalid())
601 return SemaRef.ExprError();
602
603 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
604 move(Cond), move(LHS), move(RHS),
605 E->getRParenLoc());
606}
607
Douglas Gregordd027302009-05-19 23:10:31 +0000608Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
609 OwningExprResult SubExpr = Visit(E->getSubExpr());
610 if (SubExpr.isInvalid())
611 return SemaRef.ExprError();
612
613 SourceLocation FakeTypeLoc
614 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
615 .getEnd());
616 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
617 /*FIXME:*/FakeTypeLoc,
618 DeclarationName());
619 if (T.isNull())
620 return SemaRef.ExprError();
621
622 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
623 T.getAsOpaquePtr(), E->getRParenLoc());
624}
625
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000626Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000627TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000628 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
Douglas Gregorccb97f52009-05-21 21:38:12 +0000629 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
630 OwningExprResult Init = Visit(E->getInit(I));
631 if (Init.isInvalid())
632 return SemaRef.ExprError();
633 Inits.push_back(Init.takeAs<Expr>());
634 }
635
636 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
637 E->getRBraceLoc());
638}
639
640Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000641TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
642 Designation Desig;
643
644 // Instantiate the initializer value
645 OwningExprResult Init = Visit(E->getInit());
646 if (Init.isInvalid())
647 return SemaRef.ExprError();
648
649 // Instantiate the designators.
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000650 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
Douglas Gregor9ea62762009-05-21 23:17:49 +0000651 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
652 DEnd = E->designators_end();
653 D != DEnd; ++D) {
654 if (D->isFieldDesignator()) {
655 Desig.AddDesignator(Designator::getField(D->getFieldName(),
656 D->getDotLoc(),
657 D->getFieldLoc()));
658 continue;
659 }
660
661 if (D->isArrayDesignator()) {
662 OwningExprResult Index = Visit(E->getArrayIndex(*D));
663 if (Index.isInvalid())
664 return SemaRef.ExprError();
665
666 Desig.AddDesignator(Designator::getArray(Index.get(),
667 D->getLBracketLoc()));
668
669 ArrayExprs.push_back(Index.release());
670 continue;
671 }
672
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000673 assert(D->isArrayRangeDesignator() && "New kind of designator?");
674 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
675 if (Start.isInvalid())
676 return SemaRef.ExprError();
677
678 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
679 if (End.isInvalid())
680 return SemaRef.ExprError();
681
682 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
683 End.get(),
684 D->getLBracketLoc(),
685 D->getEllipsisLoc()));
686
687 ArrayExprs.push_back(Start.release());
688 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000689 }
690
691 OwningExprResult Result =
692 SemaRef.ActOnDesignatedInitializer(Desig,
693 E->getEqualOrColonLoc(),
694 E->usesGNUSyntax(),
695 move(Init));
696 if (Result.isInvalid())
697 return SemaRef.ExprError();
698
699 ArrayExprs.take();
700 return move(Result);
701}
702
703Sema::OwningExprResult
704TemplateExprInstantiator::VisitImplicitValueInitExpr(
705 ImplicitValueInitExpr *E) {
706 assert(!E->isTypeDependent() && !E->isValueDependent() &&
707 "ImplicitValueInitExprs are never dependent");
708 return SemaRef.Clone(E);
709}
710
711Sema::OwningExprResult
Douglas Gregorbec53e72009-05-22 23:07:44 +0000712TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
713 OwningExprResult Base = Visit(E->getBase());
714 if (Base.isInvalid())
715 return SemaRef.ExprError();
716
717 SourceLocation FakeOperatorLoc =
718 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
719 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
720 move(Base),
721 /*FIXME*/FakeOperatorLoc,
722 tok::period,
723 E->getAccessorLoc(),
724 E->getAccessor(),
725 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
726}
727
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000728Sema::OwningExprResult
729TemplateExprInstantiator::VisitBlockExpr(BlockExpr *E) {
730 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
731 return SemaRef.ExprError();
732}
733
734Sema::OwningExprResult
735TemplateExprInstantiator::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
736 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
737 return SemaRef.ExprError();
738}
739
Douglas Gregorbec53e72009-05-22 23:07:44 +0000740Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000741TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
742 bool isSizeOf = E->isSizeOf();
743
744 if (E->isArgumentType()) {
745 QualType T = E->getArgumentType();
746 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000747 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000748 /*FIXME*/E->getOperatorLoc(),
749 &SemaRef.PP.getIdentifierTable().get("sizeof"));
750 if (T.isNull())
751 return SemaRef.ExprError();
752 }
753
754 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
755 E->getSourceRange());
756 }
757
Douglas Gregorac7610d2009-06-22 20:57:11 +0000758 Sema::OwningExprResult Arg(SemaRef);
759 {
760 // C++0x [expr.sizeof]p1:
761 // The operand is either an expression, which is an unevaluated operand
762 // [...]
763 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
764
765 Arg = Visit(E->getArgumentExpr());
766 if (Arg.isInvalid())
767 return SemaRef.ExprError();
768 }
Douglas Gregoraa6af222009-03-25 00:27:28 +0000769
770 Sema::OwningExprResult Result
771 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
772 isSizeOf, E->getSourceRange());
773 if (Result.isInvalid())
774 return SemaRef.ExprError();
775
776 Arg.release();
777 return move(Result);
778}
779
780Sema::OwningExprResult
781TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000782 NestedNameSpecifier *NNS
783 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
784 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000785 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000786 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000787 return SemaRef.ExprError();
788
Douglas Gregorab452ba2009-03-26 23:50:42 +0000789 CXXScopeSpec SS;
790 SS.setRange(E->getQualifierRange());
791 SS.setScopeRep(NNS);
792
Douglas Gregoraa6af222009-03-25 00:27:28 +0000793 // FIXME: We're passing in a NULL scope, because
794 // ActOnDeclarationNameExpr doesn't actually use the scope when we
795 // give it a non-empty scope specifier. Investigate whether it would
796 // be better to refactor ActOnDeclarationNameExpr.
797 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
798 E->getDeclName(),
799 /*HasTrailingLParen=*/false,
800 &SS,
Anders Carlsson9b31df42009-07-09 00:05:08 +0000801 E->isAddressOfOperand());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000802}
803
804Sema::OwningExprResult
805TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
806 CXXTemporaryObjectExpr *E) {
807 QualType T = E->getType();
808 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000809 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000810 E->getTypeBeginLoc(), DeclarationName());
811 if (T.isNull())
812 return SemaRef.ExprError();
813 }
814
Douglas Gregord7e27052009-05-20 22:33:37 +0000815 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000816 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000817 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
818 ArgEnd = E->arg_end();
819 Arg != ArgEnd; ++Arg) {
820 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000821 if (InstantiatedArg.isInvalid())
822 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000823
824 Args.push_back((Expr *)InstantiatedArg.release());
825 }
826
Douglas Gregord7e27052009-05-20 22:33:37 +0000827 SourceLocation CommaLoc;
828 // FIXME: HACK!
829 if (Args.size() > 1) {
830 Expr *First = (Expr *)Args[0];
831 CommaLoc
832 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000833 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000834 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
835 /*, FIXME*/),
836 T.getAsOpaquePtr(),
837 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000838 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000839 /*HACK*/&CommaLoc,
840 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000841}
842
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000843Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
844 assert(false && "Cannot instantiate abstract CastExpr");
845 return SemaRef.ExprError();
846}
847
Douglas Gregoraa6af222009-03-25 00:27:28 +0000848Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
849 ImplicitCastExpr *E) {
850 assert(!E->isTypeDependent() && "Implicit casts must have known types");
851
852 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
853 if (SubExpr.isInvalid())
854 return SemaRef.ExprError();
855
856 ImplicitCastExpr *ICE =
857 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
858 (Expr *)SubExpr.release(),
859 E->isLvalueCast());
860 return SemaRef.Owned(ICE);
861}
862
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000863Sema::OwningExprResult
864TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
865 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
866 return SemaRef.ExprError();
867}
868
869Sema::OwningExprResult
870TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
871 // Instantiate the type that we're casting to.
872 SourceLocation TypeStartLoc
873 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
874 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
875 TemplateArgs,
876 TypeStartLoc,
877 DeclarationName());
878 if (ExplicitTy.isNull())
879 return SemaRef.ExprError();
880
881 // Instantiate the subexpression.
882 OwningExprResult SubExpr = Visit(E->getSubExpr());
883 if (SubExpr.isInvalid())
884 return SemaRef.ExprError();
885
886 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
887 ExplicitTy.getAsOpaquePtr(),
888 E->getRParenLoc(),
889 move(SubExpr));
890}
891
892Sema::OwningExprResult
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000893TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
894 return VisitCallExpr(E);
895}
896
897Sema::OwningExprResult
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000898TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
899 // Figure out which cast operator we're dealing with.
900 tok::TokenKind Kind;
901 switch (E->getStmtClass()) {
902 case Stmt::CXXStaticCastExprClass:
903 Kind = tok::kw_static_cast;
904 break;
905
906 case Stmt::CXXDynamicCastExprClass:
907 Kind = tok::kw_dynamic_cast;
908 break;
909
910 case Stmt::CXXReinterpretCastExprClass:
911 Kind = tok::kw_reinterpret_cast;
912 break;
913
914 case Stmt::CXXConstCastExprClass:
915 Kind = tok::kw_const_cast;
916 break;
917
918 default:
919 assert(false && "Invalid C++ named cast");
920 return SemaRef.ExprError();
921 }
922
923 // Instantiate the type that we're casting to.
924 SourceLocation TypeStartLoc
925 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
926 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
927 TemplateArgs,
928 TypeStartLoc,
929 DeclarationName());
930 if (ExplicitTy.isNull())
931 return SemaRef.ExprError();
932
933 // Instantiate the subexpression.
934 OwningExprResult SubExpr = Visit(E->getSubExpr());
935 if (SubExpr.isInvalid())
936 return SemaRef.ExprError();
937
938 SourceLocation FakeLAngleLoc
939 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
940 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
941 SourceLocation FakeRParenLoc
942 = SemaRef.PP.getLocForEndOfToken(
943 E->getSubExpr()->getSourceRange().getEnd());
944 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
945 /*FIXME:*/FakeLAngleLoc,
946 ExplicitTy.getAsOpaquePtr(),
947 /*FIXME:*/FakeRAngleLoc,
948 /*FIXME:*/FakeRAngleLoc,
949 move(SubExpr),
950 /*FIXME:*/FakeRParenLoc);
951}
952
953Sema::OwningExprResult
954TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
955 return VisitCXXNamedCastExpr(E);
956}
957
958Sema::OwningExprResult
959TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
960 return VisitCXXNamedCastExpr(E);
961}
962
963Sema::OwningExprResult
964TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
965 CXXReinterpretCastExpr *E) {
966 return VisitCXXNamedCastExpr(E);
967}
968
969Sema::OwningExprResult
970TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
971 return VisitCXXNamedCastExpr(E);
972}
973
Anders Carlsson0712d292009-05-15 20:26:03 +0000974Sema::OwningExprResult
975TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
976 QualType ThisType =
977 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
978
979 CXXThisExpr *TE =
980 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
981
982 return SemaRef.Owned(TE);
983}
984
Douglas Gregoraa6af222009-03-25 00:27:28 +0000985Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000986TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
987 if (E->isTypeOperand()) {
988 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
989 TemplateArgs,
990 /*FIXME*/E->getSourceRange().getBegin(),
991 DeclarationName());
992 if (T.isNull())
993 return SemaRef.ExprError();
994
995 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
996 /*FIXME*/E->getSourceRange().getBegin(),
997 true, T.getAsOpaquePtr(),
998 E->getSourceRange().getEnd());
999 }
1000
Douglas Gregorac7610d2009-06-22 20:57:11 +00001001 // We don't know whether the expression is potentially evaluated until
1002 // after we perform semantic analysis, so the expression is potentially
1003 // potentially evaluated.
1004 EnterExpressionEvaluationContext Unevaluated(SemaRef,
1005 Action::PotentiallyPotentiallyEvaluated);
1006
Douglas Gregor12d0c302009-05-21 18:34:44 +00001007 OwningExprResult Operand = Visit(E->getExprOperand());
1008 if (Operand.isInvalid())
1009 return SemaRef.ExprError();
1010
1011 OwningExprResult Result
1012 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
1013 /*FIXME*/E->getSourceRange().getBegin(),
1014 false, Operand.get(),
1015 E->getSourceRange().getEnd());
1016 if (Result.isInvalid())
1017 return SemaRef.ExprError();
1018
1019 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1020 return move(Result);
1021}
1022
1023Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +00001024TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
1025 OwningExprResult SubExpr(SemaRef, (void *)0);
1026 if (E->getSubExpr()) {
1027 SubExpr = Visit(E->getSubExpr());
1028 if (SubExpr.isInvalid())
1029 return SemaRef.ExprError();
1030 }
1031
1032 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
1033}
1034
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001035Sema::OwningExprResult
1036TemplateExprInstantiator::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1037 assert(false &&
1038 "FIXME: Instantiation for default arguments is unimplemented");
1039 return SemaRef.ExprError();
1040}
1041
Douglas Gregor42e5b502009-05-21 17:37:52 +00001042Sema::OwningExprResult
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001043TemplateExprInstantiator::VisitCXXBindTemporaryExpr(
1044 CXXBindTemporaryExpr *E) {
1045 OwningExprResult SubExpr = Visit(E->getSubExpr());
1046 if (SubExpr.isInvalid())
1047 return SemaRef.ExprError();
1048
Anders Carlsson464f4f32009-05-30 20:52:37 +00001049 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001050}
1051
1052Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +00001053TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
1054 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
1055 ->isDependentType() && "Dependent constructor shouldn't be here");
1056
1057 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
1058 /*FIXME*/E->getSourceRange().getBegin(),
1059 DeclarationName());
1060 if (T.isNull())
1061 return SemaRef.ExprError();
1062
Douglas Gregord7e27052009-05-20 22:33:37 +00001063 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +00001064 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
1065 ArgEnd = E->arg_end();
1066 Arg != ArgEnd; ++Arg) {
1067 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001068 if (ArgInst.isInvalid())
1069 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001070
1071 Args.push_back(ArgInst.takeAs<Expr>());
1072 }
1073
Anders Carlsson8e587a12009-05-30 20:56:46 +00001074 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, T,
Douglas Gregord94546a2009-05-20 21:38:11 +00001075 E->getConstructor(),
1076 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +00001077 Args.takeAs<Expr>(),
1078 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001079}
1080
1081Sema::OwningExprResult
1082TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1083 CXXFunctionalCastExpr *E) {
1084 // Instantiate the type that we're casting to.
1085 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1086 TemplateArgs,
1087 E->getTypeBeginLoc(),
1088 DeclarationName());
1089 if (ExplicitTy.isNull())
1090 return SemaRef.ExprError();
1091
1092 // Instantiate the subexpression.
1093 OwningExprResult SubExpr = Visit(E->getSubExpr());
1094 if (SubExpr.isInvalid())
1095 return SemaRef.ExprError();
1096
1097 // FIXME: The end of the type's source range is wrong
1098 Expr *Sub = SubExpr.takeAs<Expr>();
1099 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1100 ExplicitTy.getAsOpaquePtr(),
1101 /*FIXME:*/E->getTypeBeginLoc(),
1102 Sema::MultiExprArg(SemaRef,
1103 (void **)&Sub,
1104 1),
1105 0,
1106 E->getRParenLoc());
1107}
1108
1109Sema::OwningExprResult
1110TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1111 return SemaRef.Clone(E);
1112}
1113
1114Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001115TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1116 // Instantiate the type that we're allocating
1117 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1118 TemplateArgs,
1119 /*FIXME:*/E->getSourceRange().getBegin(),
1120 DeclarationName());
1121 if (AllocType.isNull())
1122 return SemaRef.ExprError();
1123
1124 // Instantiate the size of the array we're allocating (if any).
1125 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1126 TemplateArgs);
1127 if (ArraySize.isInvalid())
1128 return SemaRef.ExprError();
1129
1130 // Instantiate the placement arguments (if any).
1131 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1132 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1133 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1134 if (Arg.isInvalid())
1135 return SemaRef.ExprError();
1136
1137 PlacementArgs.push_back(Arg.take());
1138 }
1139
1140 // Instantiate the constructor arguments (if any).
1141 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1142 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1143 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1144 if (Arg.isInvalid())
1145 return SemaRef.ExprError();
1146
1147 ConstructorArgs.push_back(Arg.take());
1148 }
1149
1150 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1151 E->isGlobalNew(),
1152 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001153 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001154 /*FIXME*/SourceLocation(),
1155 E->isParenTypeId(),
1156 AllocType,
1157 /*FIXME*/E->getSourceRange().getBegin(),
1158 SourceRange(),
1159 move(ArraySize),
1160 /*FIXME*/SourceLocation(),
1161 Sema::MultiExprArg(SemaRef,
1162 ConstructorArgs.take(),
1163 ConstructorArgs.size()),
1164 E->getSourceRange().getEnd());
1165}
1166
1167Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001168TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1169 OwningExprResult Operand = Visit(E->getArgument());
1170 if (Operand.isInvalid())
1171 return SemaRef.ExprError();
1172
1173 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1174 E->isGlobalDelete(),
1175 E->isArrayForm(),
1176 move(Operand));
1177}
1178
1179Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001180TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1181 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1182 /*FIXME*/E->getSourceRange().getBegin(),
1183 DeclarationName());
1184 if (T.isNull())
1185 return SemaRef.ExprError();
1186
1187 SourceLocation FakeLParenLoc
1188 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1189 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1190 E->getSourceRange().getBegin(),
1191 /*FIXME*/FakeLParenLoc,
1192 T.getAsOpaquePtr(),
1193 E->getSourceRange().getEnd());
1194}
1195
1196Sema::OwningExprResult
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001197TemplateExprInstantiator::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
1198 NestedNameSpecifier *NNS
1199 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
1200 E->getQualifierRange(),
1201 TemplateArgs);
1202 if (!NNS)
1203 return SemaRef.ExprError();
1204
1205 CXXScopeSpec SS;
1206 SS.setRange(E->getQualifierRange());
1207 SS.setScopeRep(NNS);
1208 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0,
1209 E->getLocation(),
1210 E->getDecl()->getDeclName(),
1211 /*Trailing lparen=*/false,
1212 &SS,
1213 /*FIXME:*/false);
1214}
1215
1216Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001217TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1218 CXXExprWithTemporaries *E) {
1219 OwningExprResult SubExpr = Visit(E->getSubExpr());
1220 if (SubExpr.isInvalid())
1221 return SemaRef.ExprError();
1222
Anders Carlssonf54741e2009-06-16 03:37:31 +00001223 Expr *Temp =
1224 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
1225 E->shouldDestroyTemporaries());
1226 return SemaRef.Owned(Temp);
Douglas Gregore06274d2009-05-20 21:51:01 +00001227}
1228
1229Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001230TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1231 CXXUnresolvedConstructExpr *E) {
1232 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1233 E->getTypeBeginLoc(),
1234 DeclarationName());
1235 if (T.isNull())
1236 return SemaRef.ExprError();
1237
Douglas Gregord7e27052009-05-20 22:33:37 +00001238 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001239 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1240 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1241 ArgEnd = E->arg_end();
1242 Arg != ArgEnd; ++Arg) {
1243 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001244 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001245 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001246
1247 FakeCommaLocs.push_back(
1248 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1249 Args.push_back(InstArg.takeAs<Expr>());
1250 }
1251
1252 // FIXME: The end of the type range isn't exactly correct.
1253 // FIXME: we're faking the locations of the commas
1254 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1255 E->getLParenLoc()),
1256 T.getAsOpaquePtr(),
1257 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001258 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001259 &FakeCommaLocs.front(),
1260 E->getRParenLoc());
1261}
1262
1263Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001264TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
1265 CXXUnresolvedMemberExpr *E) {
1266 // Instantiate the base of the expression.
1267 OwningExprResult Base = Visit(E->getBase());
1268 if (Base.isInvalid())
1269 return SemaRef.ExprError();
1270
1271 // FIXME: Instantiate the declaration name.
1272 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1273 move(Base), E->getOperatorLoc(),
1274 E->isArrow()? tok::arrow
1275 : tok::period,
1276 E->getMemberLoc(),
1277 /*FIXME:*/*E->getMember().getAsIdentifierInfo(),
1278 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1279}
1280
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001281//----------------------------------------------------------------------------
1282// Objective-C Expressions
1283//----------------------------------------------------------------------------
1284Sema::OwningExprResult
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001285TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) {
1286 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001287}
1288
1289Sema::OwningExprResult
Anders Carlssonfc0f0212009-06-07 18:45:35 +00001290TemplateExprInstantiator::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1291 QualType EncodedType = SemaRef.InstantiateType(E->getEncodedType(),
1292 TemplateArgs,
1293 /*FIXME:*/E->getAtLoc(),
1294 DeclarationName());
1295 if (EncodedType.isNull())
1296 return SemaRef.ExprError();
1297
1298 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(E->getAtLoc(),
1299 EncodedType,
1300 E->getRParenLoc()));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001301}
1302
1303Sema::OwningExprResult
1304TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1305 assert(false && "FIXME: Template instantiations for ObjC expressions");
1306 return SemaRef.ExprError();
1307}
1308
1309Sema::OwningExprResult
1310TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001311 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001312}
1313
1314Sema::OwningExprResult
1315TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001316 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001317}
1318
1319Sema::OwningExprResult
1320TemplateExprInstantiator::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1321 assert(false && "FIXME: Template instantiations for ObjC expressions");
1322 return SemaRef.ExprError();
1323}
1324
1325Sema::OwningExprResult
1326TemplateExprInstantiator::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1327 assert(false && "FIXME: Template instantiations for ObjC expressions");
1328 return SemaRef.ExprError();
1329}
1330
1331Sema::OwningExprResult
1332TemplateExprInstantiator::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) {
1333 assert(false && "FIXME: Template instantiations for ObjC expressions");
1334 return SemaRef.ExprError();
1335}
1336
1337Sema::OwningExprResult
1338TemplateExprInstantiator::VisitObjCSuperExpr(ObjCSuperExpr *E) {
1339 assert(false && "FIXME: Template instantiations for ObjC expressions");
1340 return SemaRef.ExprError();
1341}
1342
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001343Sema::OwningExprResult
Steve Narofff242b1b2009-07-24 17:54:45 +00001344TemplateExprInstantiator::VisitObjCIsaExpr(ObjCIsaExpr *E) {
1345 assert(false && "FIXME: Template instantiations for ObjC expressions");
1346 return SemaRef.ExprError();
1347}
1348
1349Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001350Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001351 if (!E)
1352 return Owned((Expr *)0);
1353
Douglas Gregor7e063902009-05-11 23:53:27 +00001354 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001355 return Instantiator.Visit(E);
1356}