blob: 7a09210fe048a5c5ff313e1b71eecdd74fb79d81 [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) {
Douglas Gregor43d9d922009-08-08 01:41:12 +000060 return SemaRef.Owned(E->Retain());
Sebastian Redl8b0b4752009-05-16 18:50:46 +000061}
62
63Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +000064TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +000065 return SemaRef.Owned(E->Retain());
Douglas Gregoraa6af222009-03-25 00:27:28 +000066}
67
68Sema::OwningExprResult
Sebastian Redl8b0b4752009-05-16 18:50:46 +000069TemplateExprInstantiator::VisitFloatingLiteral(FloatingLiteral *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +000070 return SemaRef.Owned(E->Retain());
Sebastian Redl8b0b4752009-05-16 18:50:46 +000071}
72
73Sema::OwningExprResult
74TemplateExprInstantiator::VisitStringLiteral(StringLiteral *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +000075 return SemaRef.Owned(E->Retain());
Sebastian Redl8b0b4752009-05-16 18:50:46 +000076}
77
78Sema::OwningExprResult
79TemplateExprInstantiator::VisitCharacterLiteral(CharacterLiteral *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +000080 return SemaRef.Owned(E->Retain());
Sebastian Redl8b0b4752009-05-16 18:50:46 +000081}
82
Douglas Gregord8ac4362009-05-18 22:38:38 +000083Sema::OwningExprResult
84TemplateExprInstantiator::VisitImaginaryLiteral(ImaginaryLiteral *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +000085 return SemaRef.Owned(E->Retain());
Douglas Gregord8ac4362009-05-18 22:38:38 +000086}
87
Sebastian Redl8b0b4752009-05-16 18:50:46 +000088Sema::OwningExprResult
89TemplateExprInstantiator::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +000090 return SemaRef.Owned(E->Retain());
Sebastian Redl8b0b4752009-05-16 18:50:46 +000091}
92
93Sema::OwningExprResult
94TemplateExprInstantiator::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +000095 return SemaRef.Owned(E->Retain());
Sebastian Redl8b0b4752009-05-16 18:50:46 +000096}
97
98Sema::OwningExprResult
99TemplateExprInstantiator::VisitGNUNullExpr(GNUNullExpr *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +0000100 return SemaRef.Owned(E->Retain());
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000101}
102
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000103Sema::OwningExprResult
104TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr(
105 UnresolvedFunctionNameExpr *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +0000106 return SemaRef.Owned(E->Retain());
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000107}
108
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000109Sema::OwningExprResult
Douglas Gregoredce4dd2009-06-30 22:34:41 +0000110TemplateExprInstantiator::VisitTemplateIdRefExpr(TemplateIdRefExpr *E) {
111 TemplateName Template
Douglas Gregord99cbe62009-07-29 18:26:50 +0000112 = SemaRef.InstantiateTemplateName(E->getTemplateName(),
113 E->getTemplateNameLoc(),
Douglas Gregoredce4dd2009-06-30 22:34:41 +0000114 TemplateArgs);
115 // FIXME: Can InstantiateTemplateName report an error?
116
117 llvm::SmallVector<TemplateArgument, 4> InstantiatedArgs;
118 for (unsigned I = 0, N = E->getNumTemplateArgs(); I != N; ++I) {
119 TemplateArgument InstArg = SemaRef.Instantiate(E->getTemplateArgs()[I],
120 TemplateArgs);
121 if (InstArg.isNull())
122 return SemaRef.ExprError();
123
124 InstantiatedArgs.push_back(InstArg);
125 }
126
127 // FIXME: It's possible that we'll find out now that the template name
128 // actually refers to a type, in which case this is a functional cast.
129 // Implement this!
130
131 return SemaRef.BuildTemplateIdExpr(Template, E->getTemplateNameLoc(),
132 E->getLAngleLoc(),
133 InstantiatedArgs.data(),
134 InstantiatedArgs.size(),
135 E->getRAngleLoc());
136}
137
138Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000139TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000140 NamedDecl *D = E->getDecl();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000141 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
142 assert(NTTP->getDepth() == 0 && "No nested templates yet");
Douglas Gregore94866f2009-06-12 21:21:02 +0000143
Douglas Gregor16134c62009-07-01 00:28:38 +0000144 // If the corresponding template argument is NULL or non-existent, it's
145 // because we are performing instantiation from explicitly-specified
146 // template arguments in a function template, but there were some
147 // arguments left unspecified.
148 if (NTTP->getPosition() >= TemplateArgs.size() ||
149 TemplateArgs[NTTP->getPosition()].isNull())
Anders Carlssond4972062009-08-08 02:50:17 +0000150 return SemaRef.Owned(E->Retain());
Douglas Gregor16134c62009-07-01 00:28:38 +0000151
152 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
153
Douglas Gregore94866f2009-06-12 21:21:02 +0000154 // The template argument itself might be an expression, in which
155 // case we just return that expression.
156 if (Arg.getKind() == TemplateArgument::Expression)
157 // FIXME: Clone the expression!
158 return SemaRef.Owned(Arg.getAsExpr());
159
Anders Carlsson87471f52009-06-26 03:02:18 +0000160 if (Arg.getKind() == TemplateArgument::Declaration) {
161 ValueDecl *VD = cast<ValueDecl>(Arg.getAsDecl());
162
163 // FIXME: Can VD ever have a dependent type?
164 return SemaRef.BuildDeclRefExpr(VD, VD->getType(), E->getLocation(),
165 false, false);
166 }
167
Douglas Gregore94866f2009-06-12 21:21:02 +0000168 assert(Arg.getKind() == TemplateArgument::Integral);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000169 QualType T = Arg.getIntegralType();
170 if (T->isCharType() || T->isWideCharType())
171 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
172 Arg.getAsIntegral()->getZExtValue(),
173 T->isWideCharType(),
174 T,
175 E->getSourceRange().getBegin()));
Douglas Gregor199d9912009-06-05 00:53:49 +0000176 if (T->isBooleanType())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000177 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
178 Arg.getAsIntegral()->getBoolValue(),
179 T,
180 E->getSourceRange().getBegin()));
181
Douglas Gregor199d9912009-06-05 00:53:49 +0000182 assert(Arg.getAsIntegral()->getBitWidth() == SemaRef.Context.getIntWidth(T));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000183 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
184 *Arg.getAsIntegral(),
185 T,
186 E->getSourceRange().getBegin()));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000187 }
188
189 if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
190 // FIXME: instantiate each decl in the overload set
191 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Ovl,
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000192 SemaRef.Context.OverloadTy,
193 E->getLocation(),
194 false, false));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000195 }
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000196
Douglas Gregor751f9a42009-06-30 15:47:41 +0000197 NamedDecl *InstD = SemaRef.InstantiateCurrentDeclRef(D);
198 if (!InstD)
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000199 return SemaRef.ExprError();
200
Douglas Gregor751f9a42009-06-30 15:47:41 +0000201 // FIXME: nested-name-specifier for QualifiedDeclRefExpr
202 return SemaRef.BuildDeclarationNameExpr(E->getLocation(), InstD,
203 /*FIXME:*/false,
204 /*FIXME:*/0,
205 /*FIXME:*/false);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000206}
207
208Sema::OwningExprResult
209TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
210 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
211 if (SubExpr.isInvalid())
212 return SemaRef.ExprError();
213
214 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
215 E->getLParen(), E->getRParen(),
216 (Expr *)SubExpr.release()));
217}
218
219Sema::OwningExprResult
220TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
221 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
222 if (Arg.isInvalid())
223 return SemaRef.ExprError();
224
225 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
226 E->getOpcode(),
227 move(Arg));
228}
229
230Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000231TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
232 Sema::OwningExprResult LHS = Visit(E->getLHS());
233 if (LHS.isInvalid())
234 return SemaRef.ExprError();
235
236 Sema::OwningExprResult RHS = Visit(E->getRHS());
237 if (RHS.isInvalid())
238 return SemaRef.ExprError();
239
240 // Since the overloaded array-subscript operator (operator[]) can
241 // only be a member function, we can make several simplifying
242 // assumptions here:
243 // 1) Normal name lookup (from the current scope) will not ever
244 // find any declarations of operator[] that won't also be found be
245 // member operator lookup, so it is safe to pass a NULL Scope
246 // during the instantiation to avoid the lookup entirely.
247 //
248 // 2) Neither normal name lookup nor argument-dependent lookup at
249 // template definition time will find any operators that won't be
250 // found at template instantiation time, so we do not need to
251 // cache the results of name lookup as we do for the binary
252 // operators.
253 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
254 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
255 /*FIXME:*/LLocFake,
256 move(RHS),
257 E->getRBracketLoc());
258}
259
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000260Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
261 // Instantiate callee
262 OwningExprResult Callee = Visit(E->getCallee());
263 if (Callee.isInvalid())
264 return SemaRef.ExprError();
265
266 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000267 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000268 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
269 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
270 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000271 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000272 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000273
274 FakeCommaLocs.push_back(
275 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
276 Args.push_back(Arg.takeAs<Expr>());
277 }
278
279 SourceLocation FakeLParenLoc
280 = ((Expr *)Callee.get())->getSourceRange().getBegin();
281 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
282 /*FIXME:*/FakeLParenLoc,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000283 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000284 /*FIXME:*/&FakeCommaLocs.front(),
285 E->getRParenLoc());
286}
287
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000288Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000289TemplateExprInstantiator::VisitMemberExpr(MemberExpr *E) {
290 // Instantiate the base of the expression.
291 OwningExprResult Base = Visit(E->getBase());
292 if (Base.isInvalid())
293 return SemaRef.ExprError();
294
295 // FIXME: Handle declaration names here
296 SourceLocation FakeOperatorLoc =
297 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
298 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
299 move(Base),
300 /*FIXME*/FakeOperatorLoc,
301 E->isArrow()? tok::arrow
302 : tok::period,
303 E->getMemberLoc(),
304 /*FIXME:*/*E->getMemberDecl()->getIdentifier(),
305 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
306}
307
308Sema::OwningExprResult
Douglas Gregor690dc7f2009-05-21 23:48:18 +0000309TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
310 SourceLocation FakeTypeLoc
311 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
312 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
313 FakeTypeLoc,
314 DeclarationName());
315 if (T.isNull())
316 return SemaRef.ExprError();
317
318 OwningExprResult Init = Visit(E->getInitializer());
319 if (Init.isInvalid())
320 return SemaRef.ExprError();
321
322 return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
323 T.getAsOpaquePtr(),
324 /*FIXME*/E->getLParenLoc(),
325 move(Init));
326}
327
328Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000329TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
330 Sema::OwningExprResult LHS = Visit(E->getLHS());
331 if (LHS.isInvalid())
332 return SemaRef.ExprError();
333
334 Sema::OwningExprResult RHS = Visit(E->getRHS());
335 if (RHS.isInvalid())
336 return SemaRef.ExprError();
337
338 Sema::OwningExprResult Result
339 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
340 E->getOpcode(),
341 (Expr *)LHS.get(),
342 (Expr *)RHS.get());
343 if (Result.isInvalid())
344 return SemaRef.ExprError();
345
346 LHS.release();
347 RHS.release();
348 return move(Result);
349}
350
351Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000352TemplateExprInstantiator::VisitCompoundAssignOperator(
353 CompoundAssignOperator *E) {
354 return VisitBinaryOperator(E);
355}
356
357Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000358TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
359 Sema::OwningExprResult First = Visit(E->getArg(0));
360 if (First.isInvalid())
361 return SemaRef.ExprError();
362
363 Expr *Args[2] = { (Expr *)First.get(), 0 };
364
365 Sema::OwningExprResult Second(SemaRef);
366 if (E->getNumArgs() == 2) {
367 Second = Visit(E->getArg(1));
368
369 if (Second.isInvalid())
370 return SemaRef.ExprError();
371
372 Args[1] = (Expr *)Second.get();
373 }
374
375 if (!E->isTypeDependent()) {
376 // Since our original expression was not type-dependent, we do not
377 // perform lookup again at instantiation time (C++ [temp.dep]p1).
378 // Instead, we just build the new overloaded operator call
379 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000380 OwningExprResult Callee = Visit(E->getCallee());
381 if (Callee.isInvalid())
382 return SemaRef.ExprError();
383
Douglas Gregoraa6af222009-03-25 00:27:28 +0000384 First.release();
385 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000386
Douglas Gregoraa6af222009-03-25 00:27:28 +0000387 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
388 SemaRef.Context,
389 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000390 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000391 Args, E->getNumArgs(),
392 E->getType(),
393 E->getOperatorLoc()));
394 }
395
396 bool isPostIncDec = E->getNumArgs() == 2 &&
397 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
398 if (E->getNumArgs() == 1 || isPostIncDec) {
399 if (!Args[0]->getType()->isOverloadableType()) {
400 // The argument is not of overloadable type, so try to create a
401 // built-in unary operation.
402 UnaryOperator::Opcode Opc
403 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
404
405 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
406 move(First));
407 }
408
409 // Fall through to perform overload resolution
410 } else {
411 assert(E->getNumArgs() == 2 && "Expected binary operation");
412
413 Sema::OwningExprResult Result(SemaRef);
414 if (!Args[0]->getType()->isOverloadableType() &&
415 !Args[1]->getType()->isOverloadableType()) {
416 // Neither of the arguments is an overloadable type, so try to
417 // create a built-in binary operation.
418 BinaryOperator::Opcode Opc =
419 BinaryOperator::getOverloadedOpcode(E->getOperator());
420 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
421 Args[0], Args[1]);
422 if (Result.isInvalid())
423 return SemaRef.ExprError();
424
425 First.release();
426 Second.release();
427 return move(Result);
428 }
429
430 // Fall through to perform overload resolution.
431 }
432
433 // Compute the set of functions that were found at template
434 // definition time.
435 Sema::FunctionSet Functions;
436 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
437 OverloadedFunctionDecl *Overloads
438 = cast<OverloadedFunctionDecl>(DRE->getDecl());
439
440 // FIXME: Do we have to check
441 // IsAcceptableNonMemberOperatorCandidate for each of these?
442 for (OverloadedFunctionDecl::function_iterator
443 F = Overloads->function_begin(),
444 FEnd = Overloads->function_end();
445 F != FEnd; ++F)
Eli Friedmand469fc82009-08-03 09:07:06 +0000446 Functions.insert(*F);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000447
448 // Add any functions found via argument-dependent lookup.
449 DeclarationName OpName
450 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
451 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
452
453 // Create the overloaded operator invocation.
454 if (E->getNumArgs() == 1 || isPostIncDec) {
455 UnaryOperator::Opcode Opc
456 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
457 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
458 Functions, move(First));
459 }
460
Mike Stump390b4cc2009-05-16 07:39:55 +0000461 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
462 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000463 BinaryOperator::Opcode Opc =
464 BinaryOperator::getOverloadedOpcode(E->getOperator());
465 OwningExprResult Result
466 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
467 Functions, Args[0], Args[1]);
468
469 if (Result.isInvalid())
470 return SemaRef.ExprError();
471
472 First.release();
473 Second.release();
474 return move(Result);
475}
476
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000477Sema::OwningExprResult
478TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
479 VarDecl *Var
480 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
481 SemaRef.CurContext,
482 TemplateArgs));
483 if (!Var)
484 return SemaRef.ExprError();
485
Douglas Gregore06274d2009-05-20 21:51:01 +0000486 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000487 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
488 E->getStartLoc(),
489 SourceLocation(),
490 Var));
491}
492
Douglas Gregoraa6af222009-03-25 00:27:28 +0000493Sema::OwningExprResult
494TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
495 Sema::OwningExprResult Cond = Visit(E->getCond());
496 if (Cond.isInvalid())
497 return SemaRef.ExprError();
498
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000499 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
500 TemplateArgs);
501 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000502 return SemaRef.ExprError();
503
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000504 Sema::OwningExprResult RHS = Visit(E->getRHS());
505 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000506 return SemaRef.ExprError();
507
508 if (!E->isTypeDependent()) {
509 // Since our original expression was not type-dependent, we do not
510 // perform lookup again at instantiation time (C++ [temp.dep]p1).
511 // Instead, we just build the new conditional operator call expression.
512 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
513 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000514 LHS.takeAs<Expr>(),
515 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000516 E->getType()));
517 }
518
519
520 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
521 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000522 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000523}
524
Douglas Gregor76658232009-05-22 23:25:52 +0000525Sema::OwningExprResult
526TemplateExprInstantiator::VisitAddrLabelExpr(AddrLabelExpr *E) {
527 return SemaRef.ActOnAddrLabel(E->getAmpAmpLoc(),
528 E->getLabelLoc(),
529 E->getLabel()->getID());
530}
531
Douglas Gregorcd938172009-05-19 20:31:21 +0000532Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000533 Sema::OwningStmtResult SubStmt
534 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000535 if (SubStmt.isInvalid())
536 return SemaRef.ExprError();
537
538 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
539 E->getRParenLoc());
540}
541
Douglas Gregoraa6af222009-03-25 00:27:28 +0000542Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000543TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000544 assert(false && "__builtin_types_compatible_p is not legal in C++");
545 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000546}
547
548Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000549TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000550 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000551 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
552 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000553 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000554 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000555
556 SubExprs.push_back(SubExpr.takeAs<Expr>());
557 }
558
559 // Find the declaration for __builtin_shufflevector
560 const IdentifierInfo &Name
561 = SemaRef.Context.Idents.get("__builtin_shufflevector");
562 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +0000563 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
Douglas Gregorcde01732009-05-19 22:10:17 +0000564 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
565
566 // Build a reference to the __builtin_shufflevector builtin
567 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
568 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
569 E->getBuiltinLoc(),
570 false, false);
571 SemaRef.UsualUnaryConversions(Callee);
572
573 // Build the CallExpr
574 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000575 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000576 SubExprs.size(),
577 Builtin->getResultType(),
578 E->getRParenLoc());
579 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
580
581 // Type-check the __builtin_shufflevector expression.
582 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
583 if (Result.isInvalid())
584 return SemaRef.ExprError();
585
586 OwnedCall.release();
587 return move(Result);
588}
589
590Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000591TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
592 OwningExprResult Cond = Visit(E->getCond());
593 if (Cond.isInvalid())
594 return SemaRef.ExprError();
595
596 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
597 if (LHS.isInvalid())
598 return SemaRef.ExprError();
599
600 OwningExprResult RHS = Visit(E->getRHS());
601 if (RHS.isInvalid())
602 return SemaRef.ExprError();
603
604 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
605 move(Cond), move(LHS), move(RHS),
606 E->getRParenLoc());
607}
608
Douglas Gregordd027302009-05-19 23:10:31 +0000609Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
610 OwningExprResult SubExpr = Visit(E->getSubExpr());
611 if (SubExpr.isInvalid())
612 return SemaRef.ExprError();
613
614 SourceLocation FakeTypeLoc
615 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
616 .getEnd());
617 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
618 /*FIXME:*/FakeTypeLoc,
619 DeclarationName());
620 if (T.isNull())
621 return SemaRef.ExprError();
622
623 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
624 T.getAsOpaquePtr(), E->getRParenLoc());
625}
626
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000627Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000628TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000629 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
Douglas Gregorccb97f52009-05-21 21:38:12 +0000630 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
631 OwningExprResult Init = Visit(E->getInit(I));
632 if (Init.isInvalid())
633 return SemaRef.ExprError();
634 Inits.push_back(Init.takeAs<Expr>());
635 }
636
637 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
638 E->getRBraceLoc());
639}
640
641Sema::OwningExprResult
Nate Begeman25b4fdb2009-08-09 17:55:44 +0000642TemplateExprInstantiator::VisitParenListExpr(ParenListExpr *E) {
643 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
644 for (unsigned I = 0, N = E->getNumExprs(); I != N; ++I) {
645 OwningExprResult Init = Visit(E->getExpr(I));
646 if (Init.isInvalid())
647 return SemaRef.ExprError();
648 Inits.push_back(Init.takeAs<Expr>());
649 }
650
651 return SemaRef.ActOnParenListExpr(E->getLParenLoc(), E->getRParenLoc(),
652 move_arg(Inits));
653}
654
655Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000656TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
657 Designation Desig;
658
659 // Instantiate the initializer value
660 OwningExprResult Init = Visit(E->getInit());
661 if (Init.isInvalid())
662 return SemaRef.ExprError();
663
664 // Instantiate the designators.
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000665 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
Douglas Gregor9ea62762009-05-21 23:17:49 +0000666 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
667 DEnd = E->designators_end();
668 D != DEnd; ++D) {
669 if (D->isFieldDesignator()) {
670 Desig.AddDesignator(Designator::getField(D->getFieldName(),
671 D->getDotLoc(),
672 D->getFieldLoc()));
673 continue;
674 }
675
676 if (D->isArrayDesignator()) {
677 OwningExprResult Index = Visit(E->getArrayIndex(*D));
678 if (Index.isInvalid())
679 return SemaRef.ExprError();
680
681 Desig.AddDesignator(Designator::getArray(Index.get(),
682 D->getLBracketLoc()));
683
684 ArrayExprs.push_back(Index.release());
685 continue;
686 }
687
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000688 assert(D->isArrayRangeDesignator() && "New kind of designator?");
689 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
690 if (Start.isInvalid())
691 return SemaRef.ExprError();
692
693 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
694 if (End.isInvalid())
695 return SemaRef.ExprError();
696
697 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
698 End.get(),
699 D->getLBracketLoc(),
700 D->getEllipsisLoc()));
701
702 ArrayExprs.push_back(Start.release());
703 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000704 }
705
706 OwningExprResult Result =
707 SemaRef.ActOnDesignatedInitializer(Desig,
708 E->getEqualOrColonLoc(),
709 E->usesGNUSyntax(),
710 move(Init));
711 if (Result.isInvalid())
712 return SemaRef.ExprError();
713
714 ArrayExprs.take();
715 return move(Result);
716}
717
718Sema::OwningExprResult
719TemplateExprInstantiator::VisitImplicitValueInitExpr(
720 ImplicitValueInitExpr *E) {
721 assert(!E->isTypeDependent() && !E->isValueDependent() &&
722 "ImplicitValueInitExprs are never dependent");
Douglas Gregor43d9d922009-08-08 01:41:12 +0000723 E->Retain();
724 return SemaRef.Owned(E);
Douglas Gregor9ea62762009-05-21 23:17:49 +0000725}
726
727Sema::OwningExprResult
Douglas Gregorbec53e72009-05-22 23:07:44 +0000728TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
729 OwningExprResult Base = Visit(E->getBase());
730 if (Base.isInvalid())
731 return SemaRef.ExprError();
732
733 SourceLocation FakeOperatorLoc =
734 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
735 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
736 move(Base),
737 /*FIXME*/FakeOperatorLoc,
738 tok::period,
739 E->getAccessorLoc(),
740 E->getAccessor(),
741 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
742}
743
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000744Sema::OwningExprResult
745TemplateExprInstantiator::VisitBlockExpr(BlockExpr *E) {
746 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
747 return SemaRef.ExprError();
748}
749
750Sema::OwningExprResult
751TemplateExprInstantiator::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
752 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
753 return SemaRef.ExprError();
754}
755
Douglas Gregorbec53e72009-05-22 23:07:44 +0000756Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000757TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
758 bool isSizeOf = E->isSizeOf();
759
760 if (E->isArgumentType()) {
761 QualType T = E->getArgumentType();
762 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000763 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000764 /*FIXME*/E->getOperatorLoc(),
765 &SemaRef.PP.getIdentifierTable().get("sizeof"));
766 if (T.isNull())
767 return SemaRef.ExprError();
768 }
769
770 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
771 E->getSourceRange());
772 }
773
Douglas Gregorac7610d2009-06-22 20:57:11 +0000774 Sema::OwningExprResult Arg(SemaRef);
775 {
776 // C++0x [expr.sizeof]p1:
777 // The operand is either an expression, which is an unevaluated operand
778 // [...]
779 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
780
781 Arg = Visit(E->getArgumentExpr());
782 if (Arg.isInvalid())
783 return SemaRef.ExprError();
784 }
Douglas Gregoraa6af222009-03-25 00:27:28 +0000785
786 Sema::OwningExprResult Result
787 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
788 isSizeOf, E->getSourceRange());
789 if (Result.isInvalid())
790 return SemaRef.ExprError();
791
792 Arg.release();
793 return move(Result);
794}
795
796Sema::OwningExprResult
797TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000798 NestedNameSpecifier *NNS
799 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
800 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000801 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000802 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000803 return SemaRef.ExprError();
804
Douglas Gregorab452ba2009-03-26 23:50:42 +0000805 CXXScopeSpec SS;
806 SS.setRange(E->getQualifierRange());
807 SS.setScopeRep(NNS);
808
Douglas Gregoraa6af222009-03-25 00:27:28 +0000809 // FIXME: We're passing in a NULL scope, because
810 // ActOnDeclarationNameExpr doesn't actually use the scope when we
811 // give it a non-empty scope specifier. Investigate whether it would
812 // be better to refactor ActOnDeclarationNameExpr.
813 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
814 E->getDeclName(),
815 /*HasTrailingLParen=*/false,
816 &SS,
Anders Carlsson9b31df42009-07-09 00:05:08 +0000817 E->isAddressOfOperand());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000818}
819
820Sema::OwningExprResult
821TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
822 CXXTemporaryObjectExpr *E) {
823 QualType T = E->getType();
824 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000825 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000826 E->getTypeBeginLoc(), DeclarationName());
827 if (T.isNull())
828 return SemaRef.ExprError();
829 }
830
Douglas Gregord7e27052009-05-20 22:33:37 +0000831 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000832 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000833 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
834 ArgEnd = E->arg_end();
835 Arg != ArgEnd; ++Arg) {
836 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000837 if (InstantiatedArg.isInvalid())
838 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000839
840 Args.push_back((Expr *)InstantiatedArg.release());
841 }
842
Douglas Gregord7e27052009-05-20 22:33:37 +0000843 SourceLocation CommaLoc;
844 // FIXME: HACK!
845 if (Args.size() > 1) {
846 Expr *First = (Expr *)Args[0];
847 CommaLoc
848 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000849 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000850 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
851 /*, FIXME*/),
852 T.getAsOpaquePtr(),
853 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000854 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000855 /*HACK*/&CommaLoc,
856 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000857}
858
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000859Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
860 assert(false && "Cannot instantiate abstract CastExpr");
861 return SemaRef.ExprError();
862}
863
Douglas Gregoraa6af222009-03-25 00:27:28 +0000864Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
865 ImplicitCastExpr *E) {
866 assert(!E->isTypeDependent() && "Implicit casts must have known types");
867
868 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
869 if (SubExpr.isInvalid())
870 return SemaRef.ExprError();
871
872 ImplicitCastExpr *ICE =
873 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
Anders Carlssoncdef2b72009-07-31 00:48:10 +0000874 E->getCastKind(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000875 (Expr *)SubExpr.release(),
876 E->isLvalueCast());
877 return SemaRef.Owned(ICE);
878}
879
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000880Sema::OwningExprResult
881TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
882 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
883 return SemaRef.ExprError();
884}
885
886Sema::OwningExprResult
887TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
888 // Instantiate the type that we're casting to.
889 SourceLocation TypeStartLoc
890 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
891 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
892 TemplateArgs,
893 TypeStartLoc,
894 DeclarationName());
895 if (ExplicitTy.isNull())
896 return SemaRef.ExprError();
897
898 // Instantiate the subexpression.
899 OwningExprResult SubExpr = Visit(E->getSubExpr());
900 if (SubExpr.isInvalid())
901 return SemaRef.ExprError();
902
Nate Begeman25b4fdb2009-08-09 17:55:44 +0000903 return SemaRef.ActOnCastExpr(/*Scope=*/0, E->getLParenLoc(),
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000904 ExplicitTy.getAsOpaquePtr(),
905 E->getRParenLoc(),
906 move(SubExpr));
907}
908
909Sema::OwningExprResult
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000910TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
911 return VisitCallExpr(E);
912}
913
914Sema::OwningExprResult
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000915TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
916 // Figure out which cast operator we're dealing with.
917 tok::TokenKind Kind;
918 switch (E->getStmtClass()) {
919 case Stmt::CXXStaticCastExprClass:
920 Kind = tok::kw_static_cast;
921 break;
922
923 case Stmt::CXXDynamicCastExprClass:
924 Kind = tok::kw_dynamic_cast;
925 break;
926
927 case Stmt::CXXReinterpretCastExprClass:
928 Kind = tok::kw_reinterpret_cast;
929 break;
930
931 case Stmt::CXXConstCastExprClass:
932 Kind = tok::kw_const_cast;
933 break;
934
935 default:
936 assert(false && "Invalid C++ named cast");
937 return SemaRef.ExprError();
938 }
939
940 // Instantiate the type that we're casting to.
941 SourceLocation TypeStartLoc
942 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
943 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
944 TemplateArgs,
945 TypeStartLoc,
946 DeclarationName());
947 if (ExplicitTy.isNull())
948 return SemaRef.ExprError();
949
950 // Instantiate the subexpression.
951 OwningExprResult SubExpr = Visit(E->getSubExpr());
952 if (SubExpr.isInvalid())
953 return SemaRef.ExprError();
954
955 SourceLocation FakeLAngleLoc
956 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
957 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
958 SourceLocation FakeRParenLoc
959 = SemaRef.PP.getLocForEndOfToken(
960 E->getSubExpr()->getSourceRange().getEnd());
961 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
962 /*FIXME:*/FakeLAngleLoc,
963 ExplicitTy.getAsOpaquePtr(),
964 /*FIXME:*/FakeRAngleLoc,
965 /*FIXME:*/FakeRAngleLoc,
966 move(SubExpr),
967 /*FIXME:*/FakeRParenLoc);
968}
969
970Sema::OwningExprResult
971TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
972 return VisitCXXNamedCastExpr(E);
973}
974
975Sema::OwningExprResult
976TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
977 return VisitCXXNamedCastExpr(E);
978}
979
980Sema::OwningExprResult
981TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
982 CXXReinterpretCastExpr *E) {
983 return VisitCXXNamedCastExpr(E);
984}
985
986Sema::OwningExprResult
987TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
988 return VisitCXXNamedCastExpr(E);
989}
990
Anders Carlsson0712d292009-05-15 20:26:03 +0000991Sema::OwningExprResult
992TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
993 QualType ThisType =
994 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
995
996 CXXThisExpr *TE =
997 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
998
999 return SemaRef.Owned(TE);
1000}
1001
Douglas Gregoraa6af222009-03-25 00:27:28 +00001002Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +00001003TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
1004 if (E->isTypeOperand()) {
1005 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
1006 TemplateArgs,
1007 /*FIXME*/E->getSourceRange().getBegin(),
1008 DeclarationName());
1009 if (T.isNull())
1010 return SemaRef.ExprError();
1011
1012 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
1013 /*FIXME*/E->getSourceRange().getBegin(),
1014 true, T.getAsOpaquePtr(),
1015 E->getSourceRange().getEnd());
1016 }
1017
Douglas Gregorac7610d2009-06-22 20:57:11 +00001018 // We don't know whether the expression is potentially evaluated until
1019 // after we perform semantic analysis, so the expression is potentially
1020 // potentially evaluated.
1021 EnterExpressionEvaluationContext Unevaluated(SemaRef,
1022 Action::PotentiallyPotentiallyEvaluated);
1023
Douglas Gregor12d0c302009-05-21 18:34:44 +00001024 OwningExprResult Operand = Visit(E->getExprOperand());
1025 if (Operand.isInvalid())
1026 return SemaRef.ExprError();
1027
1028 OwningExprResult Result
1029 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
1030 /*FIXME*/E->getSourceRange().getBegin(),
1031 false, Operand.get(),
1032 E->getSourceRange().getEnd());
1033 if (Result.isInvalid())
1034 return SemaRef.ExprError();
1035
1036 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1037 return move(Result);
1038}
1039
1040Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +00001041TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
1042 OwningExprResult SubExpr(SemaRef, (void *)0);
1043 if (E->getSubExpr()) {
1044 SubExpr = Visit(E->getSubExpr());
1045 if (SubExpr.isInvalid())
1046 return SemaRef.ExprError();
1047 }
1048
1049 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
1050}
1051
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001052Sema::OwningExprResult
1053TemplateExprInstantiator::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1054 assert(false &&
1055 "FIXME: Instantiation for default arguments is unimplemented");
1056 return SemaRef.ExprError();
1057}
1058
Douglas Gregor42e5b502009-05-21 17:37:52 +00001059Sema::OwningExprResult
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001060TemplateExprInstantiator::VisitCXXBindTemporaryExpr(
1061 CXXBindTemporaryExpr *E) {
1062 OwningExprResult SubExpr = Visit(E->getSubExpr());
1063 if (SubExpr.isInvalid())
1064 return SemaRef.ExprError();
1065
Anders Carlsson464f4f32009-05-30 20:52:37 +00001066 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001067}
1068
1069Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +00001070TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
1071 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
1072 ->isDependentType() && "Dependent constructor shouldn't be here");
1073
1074 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
1075 /*FIXME*/E->getSourceRange().getBegin(),
1076 DeclarationName());
1077 if (T.isNull())
1078 return SemaRef.ExprError();
1079
Douglas Gregord7e27052009-05-20 22:33:37 +00001080 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +00001081 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
1082 ArgEnd = E->arg_end();
1083 Arg != ArgEnd; ++Arg) {
1084 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001085 if (ArgInst.isInvalid())
1086 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001087
1088 Args.push_back(ArgInst.takeAs<Expr>());
1089 }
1090
Fariborz Jahanianb2c352e2009-08-05 17:03:54 +00001091 return SemaRef.Owned(SemaRef.BuildCXXConstructExpr(SemaRef.Context, T,
1092 E->getConstructor(),
1093 E->isElidable(),
1094 Args.takeAs<Expr>(),
1095 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001096}
1097
1098Sema::OwningExprResult
1099TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1100 CXXFunctionalCastExpr *E) {
1101 // Instantiate the type that we're casting to.
1102 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1103 TemplateArgs,
1104 E->getTypeBeginLoc(),
1105 DeclarationName());
1106 if (ExplicitTy.isNull())
1107 return SemaRef.ExprError();
1108
1109 // Instantiate the subexpression.
1110 OwningExprResult SubExpr = Visit(E->getSubExpr());
1111 if (SubExpr.isInvalid())
1112 return SemaRef.ExprError();
1113
1114 // FIXME: The end of the type's source range is wrong
1115 Expr *Sub = SubExpr.takeAs<Expr>();
1116 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1117 ExplicitTy.getAsOpaquePtr(),
1118 /*FIXME:*/E->getTypeBeginLoc(),
1119 Sema::MultiExprArg(SemaRef,
1120 (void **)&Sub,
1121 1),
1122 0,
1123 E->getRParenLoc());
1124}
1125
1126Sema::OwningExprResult
1127TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +00001128 return SemaRef.Owned(E->Retain());
Douglas Gregord94546a2009-05-20 21:38:11 +00001129}
1130
1131Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001132TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1133 // Instantiate the type that we're allocating
1134 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1135 TemplateArgs,
1136 /*FIXME:*/E->getSourceRange().getBegin(),
1137 DeclarationName());
1138 if (AllocType.isNull())
1139 return SemaRef.ExprError();
1140
1141 // Instantiate the size of the array we're allocating (if any).
1142 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1143 TemplateArgs);
1144 if (ArraySize.isInvalid())
1145 return SemaRef.ExprError();
1146
1147 // Instantiate the placement arguments (if any).
1148 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1149 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1150 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1151 if (Arg.isInvalid())
1152 return SemaRef.ExprError();
1153
1154 PlacementArgs.push_back(Arg.take());
1155 }
1156
1157 // Instantiate the constructor arguments (if any).
1158 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1159 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1160 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1161 if (Arg.isInvalid())
1162 return SemaRef.ExprError();
1163
1164 ConstructorArgs.push_back(Arg.take());
1165 }
1166
1167 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1168 E->isGlobalNew(),
1169 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001170 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001171 /*FIXME*/SourceLocation(),
1172 E->isParenTypeId(),
1173 AllocType,
1174 /*FIXME*/E->getSourceRange().getBegin(),
1175 SourceRange(),
1176 move(ArraySize),
1177 /*FIXME*/SourceLocation(),
1178 Sema::MultiExprArg(SemaRef,
1179 ConstructorArgs.take(),
1180 ConstructorArgs.size()),
1181 E->getSourceRange().getEnd());
1182}
1183
1184Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001185TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1186 OwningExprResult Operand = Visit(E->getArgument());
1187 if (Operand.isInvalid())
1188 return SemaRef.ExprError();
1189
1190 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1191 E->isGlobalDelete(),
1192 E->isArrayForm(),
1193 move(Operand));
1194}
1195
1196Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001197TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1198 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1199 /*FIXME*/E->getSourceRange().getBegin(),
1200 DeclarationName());
1201 if (T.isNull())
1202 return SemaRef.ExprError();
1203
1204 SourceLocation FakeLParenLoc
1205 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1206 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1207 E->getSourceRange().getBegin(),
1208 /*FIXME*/FakeLParenLoc,
1209 T.getAsOpaquePtr(),
1210 E->getSourceRange().getEnd());
1211}
1212
1213Sema::OwningExprResult
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001214TemplateExprInstantiator::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
1215 NestedNameSpecifier *NNS
1216 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
1217 E->getQualifierRange(),
1218 TemplateArgs);
1219 if (!NNS)
1220 return SemaRef.ExprError();
1221
1222 CXXScopeSpec SS;
1223 SS.setRange(E->getQualifierRange());
1224 SS.setScopeRep(NNS);
1225 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0,
1226 E->getLocation(),
1227 E->getDecl()->getDeclName(),
1228 /*Trailing lparen=*/false,
1229 &SS,
1230 /*FIXME:*/false);
1231}
1232
1233Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001234TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1235 CXXExprWithTemporaries *E) {
1236 OwningExprResult SubExpr = Visit(E->getSubExpr());
1237 if (SubExpr.isInvalid())
1238 return SemaRef.ExprError();
1239
Anders Carlssonf54741e2009-06-16 03:37:31 +00001240 Expr *Temp =
1241 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
1242 E->shouldDestroyTemporaries());
1243 return SemaRef.Owned(Temp);
Douglas Gregore06274d2009-05-20 21:51:01 +00001244}
1245
1246Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001247TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1248 CXXUnresolvedConstructExpr *E) {
1249 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1250 E->getTypeBeginLoc(),
1251 DeclarationName());
1252 if (T.isNull())
1253 return SemaRef.ExprError();
1254
Douglas Gregord7e27052009-05-20 22:33:37 +00001255 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001256 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1257 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1258 ArgEnd = E->arg_end();
1259 Arg != ArgEnd; ++Arg) {
1260 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001261 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001262 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001263
1264 FakeCommaLocs.push_back(
1265 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1266 Args.push_back(InstArg.takeAs<Expr>());
1267 }
1268
1269 // FIXME: The end of the type range isn't exactly correct.
1270 // FIXME: we're faking the locations of the commas
1271 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1272 E->getLParenLoc()),
1273 T.getAsOpaquePtr(),
1274 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001275 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001276 &FakeCommaLocs.front(),
1277 E->getRParenLoc());
1278}
1279
1280Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001281TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
1282 CXXUnresolvedMemberExpr *E) {
1283 // Instantiate the base of the expression.
1284 OwningExprResult Base = Visit(E->getBase());
1285 if (Base.isInvalid())
1286 return SemaRef.ExprError();
1287
Douglas Gregorfe85ced2009-08-06 03:17:00 +00001288 tok::TokenKind OpKind = E->isArrow() ? tok::arrow : tok::period;
1289 CXXScopeSpec SS;
1290 Base = SemaRef.ActOnCXXEnterMemberScope(0, SS, move(Base), OpKind);
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001291 // FIXME: Instantiate the declaration name.
Douglas Gregorfe85ced2009-08-06 03:17:00 +00001292 Base = SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001293 move(Base), E->getOperatorLoc(),
Douglas Gregorfe85ced2009-08-06 03:17:00 +00001294 OpKind,
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001295 E->getMemberLoc(),
1296 /*FIXME:*/*E->getMember().getAsIdentifierInfo(),
Douglas Gregorfe85ced2009-08-06 03:17:00 +00001297 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1298 SemaRef.ActOnCXXExitMemberScope(0, SS);
1299 return move(Base);
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001300}
1301
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001302//----------------------------------------------------------------------------
1303// Objective-C Expressions
1304//----------------------------------------------------------------------------
1305Sema::OwningExprResult
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001306TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +00001307 return SemaRef.Owned(E->Retain());
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001308}
1309
1310Sema::OwningExprResult
Anders Carlssonfc0f0212009-06-07 18:45:35 +00001311TemplateExprInstantiator::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1312 QualType EncodedType = SemaRef.InstantiateType(E->getEncodedType(),
1313 TemplateArgs,
1314 /*FIXME:*/E->getAtLoc(),
1315 DeclarationName());
1316 if (EncodedType.isNull())
1317 return SemaRef.ExprError();
1318
1319 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(E->getAtLoc(),
1320 EncodedType,
1321 E->getRParenLoc()));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001322}
1323
1324Sema::OwningExprResult
1325TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1326 assert(false && "FIXME: Template instantiations for ObjC expressions");
1327 return SemaRef.ExprError();
1328}
1329
1330Sema::OwningExprResult
1331TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +00001332 return SemaRef.Owned(E->Retain());
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001333}
1334
1335Sema::OwningExprResult
1336TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
Douglas Gregor43d9d922009-08-08 01:41:12 +00001337 return SemaRef.Owned(E->Retain());
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001338}
1339
1340Sema::OwningExprResult
1341TemplateExprInstantiator::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1342 assert(false && "FIXME: Template instantiations for ObjC expressions");
1343 return SemaRef.ExprError();
1344}
1345
1346Sema::OwningExprResult
1347TemplateExprInstantiator::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1348 assert(false && "FIXME: Template instantiations for ObjC expressions");
1349 return SemaRef.ExprError();
1350}
1351
1352Sema::OwningExprResult
1353TemplateExprInstantiator::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) {
1354 assert(false && "FIXME: Template instantiations for ObjC expressions");
1355 return SemaRef.ExprError();
1356}
1357
1358Sema::OwningExprResult
1359TemplateExprInstantiator::VisitObjCSuperExpr(ObjCSuperExpr *E) {
1360 assert(false && "FIXME: Template instantiations for ObjC expressions");
1361 return SemaRef.ExprError();
1362}
1363
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001364Sema::OwningExprResult
Steve Narofff242b1b2009-07-24 17:54:45 +00001365TemplateExprInstantiator::VisitObjCIsaExpr(ObjCIsaExpr *E) {
1366 assert(false && "FIXME: Template instantiations for ObjC expressions");
1367 return SemaRef.ExprError();
1368}
1369
1370Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001371Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001372 if (!E)
1373 return Owned((Expr *)0);
1374
Douglas Gregor7e063902009-05-11 23:53:27 +00001375 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001376 return Instantiator.Visit(E);
1377}