blob: 65a35f92f7c6a71b9bf6e935107c5426c55b1b50 [file] [log] [blame]
Douglas Gregorb70ccad2009-05-15 18:22:25 +00001//===--- SemaTemplateInstantiateExpr.cpp - C++ Template Expr Instantiation ===/
Douglas Gregoraa6af222009-03-25 00:27:28 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//===----------------------------------------------------------------------===/
8//
Douglas Gregorb70ccad2009-05-15 18:22:25 +00009// This file implements C++ template instantiation for expressions.
Douglas Gregoraa6af222009-03-25 00:27:28 +000010//
11//===----------------------------------------------------------------------===/
12#include "Sema.h"
13#include "clang/AST/ASTContext.h"
14#include "clang/AST/DeclTemplate.h"
15#include "clang/AST/StmtVisitor.h"
16#include "clang/AST/Expr.h"
17#include "clang/AST/ExprCXX.h"
18#include "clang/Parse/DeclSpec.h"
Douglas Gregor9ea62762009-05-21 23:17:49 +000019#include "clang/Parse/Designator.h"
Douglas Gregoraa6af222009-03-25 00:27:28 +000020#include "clang/Lex/Preprocessor.h" // for the identifier table
21#include "llvm/Support/Compiler.h"
22using namespace clang;
23
24namespace {
25 class VISIBILITY_HIDDEN TemplateExprInstantiator
26 : public StmtVisitor<TemplateExprInstantiator, Sema::OwningExprResult> {
27 Sema &SemaRef;
Douglas Gregor7e063902009-05-11 23:53:27 +000028 const TemplateArgumentList &TemplateArgs;
Douglas Gregoraa6af222009-03-25 00:27:28 +000029
30 public:
31 typedef Sema::OwningExprResult OwningExprResult;
32
33 TemplateExprInstantiator(Sema &SemaRef,
Douglas Gregor7e063902009-05-11 23:53:27 +000034 const TemplateArgumentList &TemplateArgs)
35 : SemaRef(SemaRef), TemplateArgs(TemplateArgs) { }
Douglas Gregoraa6af222009-03-25 00:27:28 +000036
Douglas Gregore30d0bd2009-05-22 23:47:06 +000037 // Declare VisitXXXStmt nodes for all of the expression kinds.
38#define EXPR(Type, Base) OwningExprResult Visit##Type(Type *S);
39#define STMT(Type, Base)
40#include "clang/AST/StmtNodes.def"
Sebastian Redl8b0b4752009-05-16 18:50:46 +000041
Douglas Gregore30d0bd2009-05-22 23:47:06 +000042 // Base case. We can't get here.
Douglas Gregoraa6af222009-03-25 00:27:28 +000043 Sema::OwningExprResult VisitStmt(Stmt *S) {
44 S->dump();
45 assert(false && "Cannot instantiate this kind of expression");
46 return SemaRef.ExprError();
47 }
48 };
49}
50
Douglas Gregore30d0bd2009-05-22 23:47:06 +000051// Base case. We can't get here.
52Sema::OwningExprResult TemplateExprInstantiator::VisitExpr(Expr *E) {
53 E->dump();
54 assert(false && "Cannot instantiate this kind of expression");
55 return SemaRef.ExprError();
56}
57
Sebastian Redl8b0b4752009-05-16 18:50:46 +000058Sema::OwningExprResult
59TemplateExprInstantiator::VisitPredefinedExpr(PredefinedExpr *E) {
60 return SemaRef.Clone(E);
61}
62
63Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +000064TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) {
65 return SemaRef.Clone(E);
66}
67
68Sema::OwningExprResult
Sebastian Redl8b0b4752009-05-16 18:50:46 +000069TemplateExprInstantiator::VisitFloatingLiteral(FloatingLiteral *E) {
70 return SemaRef.Clone(E);
71}
72
73Sema::OwningExprResult
74TemplateExprInstantiator::VisitStringLiteral(StringLiteral *E) {
75 return SemaRef.Clone(E);
76}
77
78Sema::OwningExprResult
79TemplateExprInstantiator::VisitCharacterLiteral(CharacterLiteral *E) {
80 return SemaRef.Clone(E);
81}
82
Douglas Gregord8ac4362009-05-18 22:38:38 +000083Sema::OwningExprResult
84TemplateExprInstantiator::VisitImaginaryLiteral(ImaginaryLiteral *E) {
85 return SemaRef.Clone(E);
86}
87
Sebastian Redl8b0b4752009-05-16 18:50:46 +000088Sema::OwningExprResult
89TemplateExprInstantiator::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
90 return SemaRef.Clone(E);
91}
92
93Sema::OwningExprResult
94TemplateExprInstantiator::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
95 return SemaRef.Clone(E);
96}
97
98Sema::OwningExprResult
99TemplateExprInstantiator::VisitGNUNullExpr(GNUNullExpr *E) {
100 return SemaRef.Clone(E);
101}
102
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000103Sema::OwningExprResult
104TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr(
105 UnresolvedFunctionNameExpr *E) {
106 return SemaRef.Clone(E);
107}
108
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000109Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000110TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000111 NamedDecl *D = E->getDecl();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000112 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
113 assert(NTTP->getDepth() == 0 && "No nested templates yet");
114 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
Douglas Gregore94866f2009-06-12 21:21:02 +0000115
116 // The template argument itself might be an expression, in which
117 // case we just return that expression.
118 if (Arg.getKind() == TemplateArgument::Expression)
119 // FIXME: Clone the expression!
120 return SemaRef.Owned(Arg.getAsExpr());
121
Anders Carlsson87471f52009-06-26 03:02:18 +0000122 if (Arg.getKind() == TemplateArgument::Declaration) {
123 ValueDecl *VD = cast<ValueDecl>(Arg.getAsDecl());
124
125 // FIXME: Can VD ever have a dependent type?
126 return SemaRef.BuildDeclRefExpr(VD, VD->getType(), E->getLocation(),
127 false, false);
128 }
129
Douglas Gregore94866f2009-06-12 21:21:02 +0000130 assert(Arg.getKind() == TemplateArgument::Integral);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000131 QualType T = Arg.getIntegralType();
132 if (T->isCharType() || T->isWideCharType())
133 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
134 Arg.getAsIntegral()->getZExtValue(),
135 T->isWideCharType(),
136 T,
137 E->getSourceRange().getBegin()));
Douglas Gregor199d9912009-06-05 00:53:49 +0000138 if (T->isBooleanType())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000139 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
140 Arg.getAsIntegral()->getBoolValue(),
141 T,
142 E->getSourceRange().getBegin()));
143
Douglas Gregor199d9912009-06-05 00:53:49 +0000144 assert(Arg.getAsIntegral()->getBitWidth() == SemaRef.Context.getIntWidth(T));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000145 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
146 *Arg.getAsIntegral(),
147 T,
148 E->getSourceRange().getBegin()));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000149 }
150
151 if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
152 // FIXME: instantiate each decl in the overload set
153 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Ovl,
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000154 SemaRef.Context.OverloadTy,
155 E->getLocation(),
156 false, false));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000157 }
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000158
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000159 ValueDecl *NewD
Douglas Gregored961e72009-05-27 17:54:46 +0000160 = dyn_cast_or_null<ValueDecl>(SemaRef.InstantiateCurrentDeclRef(D));
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000161 if (!NewD)
162 return SemaRef.ExprError();
163
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000164 // FIXME: Build QualifiedDeclRefExpr?
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000165 QualType T = NewD->getType();
166 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000167 T.getNonReferenceType(),
168 E->getLocation(),
169 T->isDependentType(),
170 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000171}
172
173Sema::OwningExprResult
174TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
175 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
176 if (SubExpr.isInvalid())
177 return SemaRef.ExprError();
178
179 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
180 E->getLParen(), E->getRParen(),
181 (Expr *)SubExpr.release()));
182}
183
184Sema::OwningExprResult
185TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
186 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
187 if (Arg.isInvalid())
188 return SemaRef.ExprError();
189
190 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
191 E->getOpcode(),
192 move(Arg));
193}
194
195Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000196TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
197 Sema::OwningExprResult LHS = Visit(E->getLHS());
198 if (LHS.isInvalid())
199 return SemaRef.ExprError();
200
201 Sema::OwningExprResult RHS = Visit(E->getRHS());
202 if (RHS.isInvalid())
203 return SemaRef.ExprError();
204
205 // Since the overloaded array-subscript operator (operator[]) can
206 // only be a member function, we can make several simplifying
207 // assumptions here:
208 // 1) Normal name lookup (from the current scope) will not ever
209 // find any declarations of operator[] that won't also be found be
210 // member operator lookup, so it is safe to pass a NULL Scope
211 // during the instantiation to avoid the lookup entirely.
212 //
213 // 2) Neither normal name lookup nor argument-dependent lookup at
214 // template definition time will find any operators that won't be
215 // found at template instantiation time, so we do not need to
216 // cache the results of name lookup as we do for the binary
217 // operators.
218 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
219 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
220 /*FIXME:*/LLocFake,
221 move(RHS),
222 E->getRBracketLoc());
223}
224
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000225Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
226 // Instantiate callee
227 OwningExprResult Callee = Visit(E->getCallee());
228 if (Callee.isInvalid())
229 return SemaRef.ExprError();
230
231 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000232 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000233 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
234 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
235 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000236 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000237 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000238
239 FakeCommaLocs.push_back(
240 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
241 Args.push_back(Arg.takeAs<Expr>());
242 }
243
244 SourceLocation FakeLParenLoc
245 = ((Expr *)Callee.get())->getSourceRange().getBegin();
246 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
247 /*FIXME:*/FakeLParenLoc,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000248 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000249 /*FIXME:*/&FakeCommaLocs.front(),
250 E->getRParenLoc());
251}
252
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000253Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000254TemplateExprInstantiator::VisitMemberExpr(MemberExpr *E) {
255 // Instantiate the base of the expression.
256 OwningExprResult Base = Visit(E->getBase());
257 if (Base.isInvalid())
258 return SemaRef.ExprError();
259
260 // FIXME: Handle declaration names here
261 SourceLocation FakeOperatorLoc =
262 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
263 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
264 move(Base),
265 /*FIXME*/FakeOperatorLoc,
266 E->isArrow()? tok::arrow
267 : tok::period,
268 E->getMemberLoc(),
269 /*FIXME:*/*E->getMemberDecl()->getIdentifier(),
270 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
271}
272
273Sema::OwningExprResult
Douglas Gregor690dc7f2009-05-21 23:48:18 +0000274TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
275 SourceLocation FakeTypeLoc
276 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
277 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
278 FakeTypeLoc,
279 DeclarationName());
280 if (T.isNull())
281 return SemaRef.ExprError();
282
283 OwningExprResult Init = Visit(E->getInitializer());
284 if (Init.isInvalid())
285 return SemaRef.ExprError();
286
287 return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
288 T.getAsOpaquePtr(),
289 /*FIXME*/E->getLParenLoc(),
290 move(Init));
291}
292
293Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000294TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
295 Sema::OwningExprResult LHS = Visit(E->getLHS());
296 if (LHS.isInvalid())
297 return SemaRef.ExprError();
298
299 Sema::OwningExprResult RHS = Visit(E->getRHS());
300 if (RHS.isInvalid())
301 return SemaRef.ExprError();
302
303 Sema::OwningExprResult Result
304 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
305 E->getOpcode(),
306 (Expr *)LHS.get(),
307 (Expr *)RHS.get());
308 if (Result.isInvalid())
309 return SemaRef.ExprError();
310
311 LHS.release();
312 RHS.release();
313 return move(Result);
314}
315
316Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000317TemplateExprInstantiator::VisitCompoundAssignOperator(
318 CompoundAssignOperator *E) {
319 return VisitBinaryOperator(E);
320}
321
322Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000323TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
324 Sema::OwningExprResult First = Visit(E->getArg(0));
325 if (First.isInvalid())
326 return SemaRef.ExprError();
327
328 Expr *Args[2] = { (Expr *)First.get(), 0 };
329
330 Sema::OwningExprResult Second(SemaRef);
331 if (E->getNumArgs() == 2) {
332 Second = Visit(E->getArg(1));
333
334 if (Second.isInvalid())
335 return SemaRef.ExprError();
336
337 Args[1] = (Expr *)Second.get();
338 }
339
340 if (!E->isTypeDependent()) {
341 // Since our original expression was not type-dependent, we do not
342 // perform lookup again at instantiation time (C++ [temp.dep]p1).
343 // Instead, we just build the new overloaded operator call
344 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000345 OwningExprResult Callee = Visit(E->getCallee());
346 if (Callee.isInvalid())
347 return SemaRef.ExprError();
348
Douglas Gregoraa6af222009-03-25 00:27:28 +0000349 First.release();
350 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000351
Douglas Gregoraa6af222009-03-25 00:27:28 +0000352 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
353 SemaRef.Context,
354 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000355 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000356 Args, E->getNumArgs(),
357 E->getType(),
358 E->getOperatorLoc()));
359 }
360
361 bool isPostIncDec = E->getNumArgs() == 2 &&
362 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
363 if (E->getNumArgs() == 1 || isPostIncDec) {
364 if (!Args[0]->getType()->isOverloadableType()) {
365 // The argument is not of overloadable type, so try to create a
366 // built-in unary operation.
367 UnaryOperator::Opcode Opc
368 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
369
370 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
371 move(First));
372 }
373
374 // Fall through to perform overload resolution
375 } else {
376 assert(E->getNumArgs() == 2 && "Expected binary operation");
377
378 Sema::OwningExprResult Result(SemaRef);
379 if (!Args[0]->getType()->isOverloadableType() &&
380 !Args[1]->getType()->isOverloadableType()) {
381 // Neither of the arguments is an overloadable type, so try to
382 // create a built-in binary operation.
383 BinaryOperator::Opcode Opc =
384 BinaryOperator::getOverloadedOpcode(E->getOperator());
385 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
386 Args[0], Args[1]);
387 if (Result.isInvalid())
388 return SemaRef.ExprError();
389
390 First.release();
391 Second.release();
392 return move(Result);
393 }
394
395 // Fall through to perform overload resolution.
396 }
397
398 // Compute the set of functions that were found at template
399 // definition time.
400 Sema::FunctionSet Functions;
401 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
402 OverloadedFunctionDecl *Overloads
403 = cast<OverloadedFunctionDecl>(DRE->getDecl());
404
405 // FIXME: Do we have to check
406 // IsAcceptableNonMemberOperatorCandidate for each of these?
407 for (OverloadedFunctionDecl::function_iterator
408 F = Overloads->function_begin(),
409 FEnd = Overloads->function_end();
410 F != FEnd; ++F)
Douglas Gregore53060f2009-06-25 22:08:12 +0000411 Functions.insert(cast<FunctionDecl>(*F));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000412
413 // Add any functions found via argument-dependent lookup.
414 DeclarationName OpName
415 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
416 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
417
418 // Create the overloaded operator invocation.
419 if (E->getNumArgs() == 1 || isPostIncDec) {
420 UnaryOperator::Opcode Opc
421 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
422 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
423 Functions, move(First));
424 }
425
Mike Stump390b4cc2009-05-16 07:39:55 +0000426 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
427 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000428 BinaryOperator::Opcode Opc =
429 BinaryOperator::getOverloadedOpcode(E->getOperator());
430 OwningExprResult Result
431 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
432 Functions, Args[0], Args[1]);
433
434 if (Result.isInvalid())
435 return SemaRef.ExprError();
436
437 First.release();
438 Second.release();
439 return move(Result);
440}
441
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000442Sema::OwningExprResult
443TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
444 VarDecl *Var
445 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
446 SemaRef.CurContext,
447 TemplateArgs));
448 if (!Var)
449 return SemaRef.ExprError();
450
Douglas Gregore06274d2009-05-20 21:51:01 +0000451 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000452 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
453 E->getStartLoc(),
454 SourceLocation(),
455 Var));
456}
457
Douglas Gregoraa6af222009-03-25 00:27:28 +0000458Sema::OwningExprResult
459TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
460 Sema::OwningExprResult Cond = Visit(E->getCond());
461 if (Cond.isInvalid())
462 return SemaRef.ExprError();
463
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000464 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
465 TemplateArgs);
466 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000467 return SemaRef.ExprError();
468
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000469 Sema::OwningExprResult RHS = Visit(E->getRHS());
470 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000471 return SemaRef.ExprError();
472
473 if (!E->isTypeDependent()) {
474 // Since our original expression was not type-dependent, we do not
475 // perform lookup again at instantiation time (C++ [temp.dep]p1).
476 // Instead, we just build the new conditional operator call expression.
477 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
478 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000479 LHS.takeAs<Expr>(),
480 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000481 E->getType()));
482 }
483
484
485 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
486 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000487 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000488}
489
Douglas Gregor76658232009-05-22 23:25:52 +0000490Sema::OwningExprResult
491TemplateExprInstantiator::VisitAddrLabelExpr(AddrLabelExpr *E) {
492 return SemaRef.ActOnAddrLabel(E->getAmpAmpLoc(),
493 E->getLabelLoc(),
494 E->getLabel()->getID());
495}
496
Douglas Gregorcd938172009-05-19 20:31:21 +0000497Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000498 Sema::OwningStmtResult SubStmt
499 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000500 if (SubStmt.isInvalid())
501 return SemaRef.ExprError();
502
503 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
504 E->getRParenLoc());
505}
506
Douglas Gregoraa6af222009-03-25 00:27:28 +0000507Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000508TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000509 assert(false && "__builtin_types_compatible_p is not legal in C++");
510 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000511}
512
513Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000514TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000515 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000516 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
517 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000518 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000519 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000520
521 SubExprs.push_back(SubExpr.takeAs<Expr>());
522 }
523
524 // Find the declaration for __builtin_shufflevector
525 const IdentifierInfo &Name
526 = SemaRef.Context.Idents.get("__builtin_shufflevector");
527 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
528 DeclContext::lookup_result Lookup
529 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
530 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
531
532 // Build a reference to the __builtin_shufflevector builtin
533 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
534 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
535 E->getBuiltinLoc(),
536 false, false);
537 SemaRef.UsualUnaryConversions(Callee);
538
539 // Build the CallExpr
540 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000541 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000542 SubExprs.size(),
543 Builtin->getResultType(),
544 E->getRParenLoc());
545 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
546
547 // Type-check the __builtin_shufflevector expression.
548 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
549 if (Result.isInvalid())
550 return SemaRef.ExprError();
551
552 OwnedCall.release();
553 return move(Result);
554}
555
556Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000557TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
558 OwningExprResult Cond = Visit(E->getCond());
559 if (Cond.isInvalid())
560 return SemaRef.ExprError();
561
562 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
563 if (LHS.isInvalid())
564 return SemaRef.ExprError();
565
566 OwningExprResult RHS = Visit(E->getRHS());
567 if (RHS.isInvalid())
568 return SemaRef.ExprError();
569
570 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
571 move(Cond), move(LHS), move(RHS),
572 E->getRParenLoc());
573}
574
Douglas Gregordd027302009-05-19 23:10:31 +0000575Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
576 OwningExprResult SubExpr = Visit(E->getSubExpr());
577 if (SubExpr.isInvalid())
578 return SemaRef.ExprError();
579
580 SourceLocation FakeTypeLoc
581 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
582 .getEnd());
583 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
584 /*FIXME:*/FakeTypeLoc,
585 DeclarationName());
586 if (T.isNull())
587 return SemaRef.ExprError();
588
589 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
590 T.getAsOpaquePtr(), E->getRParenLoc());
591}
592
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000593Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000594TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000595 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
Douglas Gregorccb97f52009-05-21 21:38:12 +0000596 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
597 OwningExprResult Init = Visit(E->getInit(I));
598 if (Init.isInvalid())
599 return SemaRef.ExprError();
600 Inits.push_back(Init.takeAs<Expr>());
601 }
602
603 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
604 E->getRBraceLoc());
605}
606
607Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000608TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
609 Designation Desig;
610
611 // Instantiate the initializer value
612 OwningExprResult Init = Visit(E->getInit());
613 if (Init.isInvalid())
614 return SemaRef.ExprError();
615
616 // Instantiate the designators.
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000617 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
Douglas Gregor9ea62762009-05-21 23:17:49 +0000618 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
619 DEnd = E->designators_end();
620 D != DEnd; ++D) {
621 if (D->isFieldDesignator()) {
622 Desig.AddDesignator(Designator::getField(D->getFieldName(),
623 D->getDotLoc(),
624 D->getFieldLoc()));
625 continue;
626 }
627
628 if (D->isArrayDesignator()) {
629 OwningExprResult Index = Visit(E->getArrayIndex(*D));
630 if (Index.isInvalid())
631 return SemaRef.ExprError();
632
633 Desig.AddDesignator(Designator::getArray(Index.get(),
634 D->getLBracketLoc()));
635
636 ArrayExprs.push_back(Index.release());
637 continue;
638 }
639
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000640 assert(D->isArrayRangeDesignator() && "New kind of designator?");
641 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
642 if (Start.isInvalid())
643 return SemaRef.ExprError();
644
645 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
646 if (End.isInvalid())
647 return SemaRef.ExprError();
648
649 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
650 End.get(),
651 D->getLBracketLoc(),
652 D->getEllipsisLoc()));
653
654 ArrayExprs.push_back(Start.release());
655 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000656 }
657
658 OwningExprResult Result =
659 SemaRef.ActOnDesignatedInitializer(Desig,
660 E->getEqualOrColonLoc(),
661 E->usesGNUSyntax(),
662 move(Init));
663 if (Result.isInvalid())
664 return SemaRef.ExprError();
665
666 ArrayExprs.take();
667 return move(Result);
668}
669
670Sema::OwningExprResult
671TemplateExprInstantiator::VisitImplicitValueInitExpr(
672 ImplicitValueInitExpr *E) {
673 assert(!E->isTypeDependent() && !E->isValueDependent() &&
674 "ImplicitValueInitExprs are never dependent");
675 return SemaRef.Clone(E);
676}
677
678Sema::OwningExprResult
Douglas Gregorbec53e72009-05-22 23:07:44 +0000679TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
680 OwningExprResult Base = Visit(E->getBase());
681 if (Base.isInvalid())
682 return SemaRef.ExprError();
683
684 SourceLocation FakeOperatorLoc =
685 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
686 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
687 move(Base),
688 /*FIXME*/FakeOperatorLoc,
689 tok::period,
690 E->getAccessorLoc(),
691 E->getAccessor(),
692 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
693}
694
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000695Sema::OwningExprResult
696TemplateExprInstantiator::VisitBlockExpr(BlockExpr *E) {
697 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
698 return SemaRef.ExprError();
699}
700
701Sema::OwningExprResult
702TemplateExprInstantiator::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
703 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
704 return SemaRef.ExprError();
705}
706
Douglas Gregorbec53e72009-05-22 23:07:44 +0000707Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000708TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
709 bool isSizeOf = E->isSizeOf();
710
711 if (E->isArgumentType()) {
712 QualType T = E->getArgumentType();
713 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000714 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000715 /*FIXME*/E->getOperatorLoc(),
716 &SemaRef.PP.getIdentifierTable().get("sizeof"));
717 if (T.isNull())
718 return SemaRef.ExprError();
719 }
720
721 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
722 E->getSourceRange());
723 }
724
Douglas Gregorac7610d2009-06-22 20:57:11 +0000725 Sema::OwningExprResult Arg(SemaRef);
726 {
727 // C++0x [expr.sizeof]p1:
728 // The operand is either an expression, which is an unevaluated operand
729 // [...]
730 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
731
732 Arg = Visit(E->getArgumentExpr());
733 if (Arg.isInvalid())
734 return SemaRef.ExprError();
735 }
Douglas Gregoraa6af222009-03-25 00:27:28 +0000736
737 Sema::OwningExprResult Result
738 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
739 isSizeOf, E->getSourceRange());
740 if (Result.isInvalid())
741 return SemaRef.ExprError();
742
743 Arg.release();
744 return move(Result);
745}
746
747Sema::OwningExprResult
748TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000749 NestedNameSpecifier *NNS
750 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
751 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000752 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000753 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000754 return SemaRef.ExprError();
755
Douglas Gregorab452ba2009-03-26 23:50:42 +0000756 CXXScopeSpec SS;
757 SS.setRange(E->getQualifierRange());
758 SS.setScopeRep(NNS);
759
Douglas Gregoraa6af222009-03-25 00:27:28 +0000760 // FIXME: We're passing in a NULL scope, because
761 // ActOnDeclarationNameExpr doesn't actually use the scope when we
762 // give it a non-empty scope specifier. Investigate whether it would
763 // be better to refactor ActOnDeclarationNameExpr.
764 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
765 E->getDeclName(),
766 /*HasTrailingLParen=*/false,
767 &SS,
768 /*FIXME:isAddressOfOperand=*/false);
769}
770
771Sema::OwningExprResult
772TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
773 CXXTemporaryObjectExpr *E) {
774 QualType T = E->getType();
775 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000776 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000777 E->getTypeBeginLoc(), DeclarationName());
778 if (T.isNull())
779 return SemaRef.ExprError();
780 }
781
Douglas Gregord7e27052009-05-20 22:33:37 +0000782 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000783 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000784 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
785 ArgEnd = E->arg_end();
786 Arg != ArgEnd; ++Arg) {
787 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000788 if (InstantiatedArg.isInvalid())
789 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000790
791 Args.push_back((Expr *)InstantiatedArg.release());
792 }
793
Douglas Gregord7e27052009-05-20 22:33:37 +0000794 SourceLocation CommaLoc;
795 // FIXME: HACK!
796 if (Args.size() > 1) {
797 Expr *First = (Expr *)Args[0];
798 CommaLoc
799 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000800 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000801 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
802 /*, FIXME*/),
803 T.getAsOpaquePtr(),
804 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000805 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000806 /*HACK*/&CommaLoc,
807 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000808}
809
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000810Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
811 assert(false && "Cannot instantiate abstract CastExpr");
812 return SemaRef.ExprError();
813}
814
Douglas Gregoraa6af222009-03-25 00:27:28 +0000815Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
816 ImplicitCastExpr *E) {
817 assert(!E->isTypeDependent() && "Implicit casts must have known types");
818
819 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
820 if (SubExpr.isInvalid())
821 return SemaRef.ExprError();
822
823 ImplicitCastExpr *ICE =
824 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
825 (Expr *)SubExpr.release(),
826 E->isLvalueCast());
827 return SemaRef.Owned(ICE);
828}
829
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000830Sema::OwningExprResult
831TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
832 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
833 return SemaRef.ExprError();
834}
835
836Sema::OwningExprResult
837TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
838 // Instantiate the type that we're casting to.
839 SourceLocation TypeStartLoc
840 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
841 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
842 TemplateArgs,
843 TypeStartLoc,
844 DeclarationName());
845 if (ExplicitTy.isNull())
846 return SemaRef.ExprError();
847
848 // Instantiate the subexpression.
849 OwningExprResult SubExpr = Visit(E->getSubExpr());
850 if (SubExpr.isInvalid())
851 return SemaRef.ExprError();
852
853 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
854 ExplicitTy.getAsOpaquePtr(),
855 E->getRParenLoc(),
856 move(SubExpr));
857}
858
859Sema::OwningExprResult
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000860TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
861 return VisitCallExpr(E);
862}
863
864Sema::OwningExprResult
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000865TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
866 // Figure out which cast operator we're dealing with.
867 tok::TokenKind Kind;
868 switch (E->getStmtClass()) {
869 case Stmt::CXXStaticCastExprClass:
870 Kind = tok::kw_static_cast;
871 break;
872
873 case Stmt::CXXDynamicCastExprClass:
874 Kind = tok::kw_dynamic_cast;
875 break;
876
877 case Stmt::CXXReinterpretCastExprClass:
878 Kind = tok::kw_reinterpret_cast;
879 break;
880
881 case Stmt::CXXConstCastExprClass:
882 Kind = tok::kw_const_cast;
883 break;
884
885 default:
886 assert(false && "Invalid C++ named cast");
887 return SemaRef.ExprError();
888 }
889
890 // Instantiate the type that we're casting to.
891 SourceLocation TypeStartLoc
892 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
893 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
894 TemplateArgs,
895 TypeStartLoc,
896 DeclarationName());
897 if (ExplicitTy.isNull())
898 return SemaRef.ExprError();
899
900 // Instantiate the subexpression.
901 OwningExprResult SubExpr = Visit(E->getSubExpr());
902 if (SubExpr.isInvalid())
903 return SemaRef.ExprError();
904
905 SourceLocation FakeLAngleLoc
906 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
907 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
908 SourceLocation FakeRParenLoc
909 = SemaRef.PP.getLocForEndOfToken(
910 E->getSubExpr()->getSourceRange().getEnd());
911 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
912 /*FIXME:*/FakeLAngleLoc,
913 ExplicitTy.getAsOpaquePtr(),
914 /*FIXME:*/FakeRAngleLoc,
915 /*FIXME:*/FakeRAngleLoc,
916 move(SubExpr),
917 /*FIXME:*/FakeRParenLoc);
918}
919
920Sema::OwningExprResult
921TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
922 return VisitCXXNamedCastExpr(E);
923}
924
925Sema::OwningExprResult
926TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
927 return VisitCXXNamedCastExpr(E);
928}
929
930Sema::OwningExprResult
931TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
932 CXXReinterpretCastExpr *E) {
933 return VisitCXXNamedCastExpr(E);
934}
935
936Sema::OwningExprResult
937TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
938 return VisitCXXNamedCastExpr(E);
939}
940
Anders Carlsson0712d292009-05-15 20:26:03 +0000941Sema::OwningExprResult
942TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
943 QualType ThisType =
944 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
945
946 CXXThisExpr *TE =
947 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
948
949 return SemaRef.Owned(TE);
950}
951
Douglas Gregoraa6af222009-03-25 00:27:28 +0000952Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000953TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
954 if (E->isTypeOperand()) {
955 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
956 TemplateArgs,
957 /*FIXME*/E->getSourceRange().getBegin(),
958 DeclarationName());
959 if (T.isNull())
960 return SemaRef.ExprError();
961
962 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
963 /*FIXME*/E->getSourceRange().getBegin(),
964 true, T.getAsOpaquePtr(),
965 E->getSourceRange().getEnd());
966 }
967
Douglas Gregorac7610d2009-06-22 20:57:11 +0000968 // We don't know whether the expression is potentially evaluated until
969 // after we perform semantic analysis, so the expression is potentially
970 // potentially evaluated.
971 EnterExpressionEvaluationContext Unevaluated(SemaRef,
972 Action::PotentiallyPotentiallyEvaluated);
973
Douglas Gregor12d0c302009-05-21 18:34:44 +0000974 OwningExprResult Operand = Visit(E->getExprOperand());
975 if (Operand.isInvalid())
976 return SemaRef.ExprError();
977
978 OwningExprResult Result
979 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
980 /*FIXME*/E->getSourceRange().getBegin(),
981 false, Operand.get(),
982 E->getSourceRange().getEnd());
983 if (Result.isInvalid())
984 return SemaRef.ExprError();
985
986 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
987 return move(Result);
988}
989
990Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +0000991TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
992 OwningExprResult SubExpr(SemaRef, (void *)0);
993 if (E->getSubExpr()) {
994 SubExpr = Visit(E->getSubExpr());
995 if (SubExpr.isInvalid())
996 return SemaRef.ExprError();
997 }
998
999 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
1000}
1001
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001002Sema::OwningExprResult
1003TemplateExprInstantiator::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1004 assert(false &&
1005 "FIXME: Instantiation for default arguments is unimplemented");
1006 return SemaRef.ExprError();
1007}
1008
Douglas Gregor42e5b502009-05-21 17:37:52 +00001009Sema::OwningExprResult
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001010TemplateExprInstantiator::VisitCXXBindTemporaryExpr(
1011 CXXBindTemporaryExpr *E) {
1012 OwningExprResult SubExpr = Visit(E->getSubExpr());
1013 if (SubExpr.isInvalid())
1014 return SemaRef.ExprError();
1015
Anders Carlsson464f4f32009-05-30 20:52:37 +00001016 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001017}
1018
1019Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +00001020TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
1021 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
1022 ->isDependentType() && "Dependent constructor shouldn't be here");
1023
1024 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
1025 /*FIXME*/E->getSourceRange().getBegin(),
1026 DeclarationName());
1027 if (T.isNull())
1028 return SemaRef.ExprError();
1029
Douglas Gregord7e27052009-05-20 22:33:37 +00001030 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +00001031 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
1032 ArgEnd = E->arg_end();
1033 Arg != ArgEnd; ++Arg) {
1034 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001035 if (ArgInst.isInvalid())
1036 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001037
1038 Args.push_back(ArgInst.takeAs<Expr>());
1039 }
1040
Anders Carlsson8e587a12009-05-30 20:56:46 +00001041 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, T,
Douglas Gregord94546a2009-05-20 21:38:11 +00001042 E->getConstructor(),
1043 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +00001044 Args.takeAs<Expr>(),
1045 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001046}
1047
1048Sema::OwningExprResult
1049TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1050 CXXFunctionalCastExpr *E) {
1051 // Instantiate the type that we're casting to.
1052 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1053 TemplateArgs,
1054 E->getTypeBeginLoc(),
1055 DeclarationName());
1056 if (ExplicitTy.isNull())
1057 return SemaRef.ExprError();
1058
1059 // Instantiate the subexpression.
1060 OwningExprResult SubExpr = Visit(E->getSubExpr());
1061 if (SubExpr.isInvalid())
1062 return SemaRef.ExprError();
1063
1064 // FIXME: The end of the type's source range is wrong
1065 Expr *Sub = SubExpr.takeAs<Expr>();
1066 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1067 ExplicitTy.getAsOpaquePtr(),
1068 /*FIXME:*/E->getTypeBeginLoc(),
1069 Sema::MultiExprArg(SemaRef,
1070 (void **)&Sub,
1071 1),
1072 0,
1073 E->getRParenLoc());
1074}
1075
1076Sema::OwningExprResult
1077TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1078 return SemaRef.Clone(E);
1079}
1080
1081Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001082TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1083 // Instantiate the type that we're allocating
1084 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1085 TemplateArgs,
1086 /*FIXME:*/E->getSourceRange().getBegin(),
1087 DeclarationName());
1088 if (AllocType.isNull())
1089 return SemaRef.ExprError();
1090
1091 // Instantiate the size of the array we're allocating (if any).
1092 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1093 TemplateArgs);
1094 if (ArraySize.isInvalid())
1095 return SemaRef.ExprError();
1096
1097 // Instantiate the placement arguments (if any).
1098 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1099 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1100 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1101 if (Arg.isInvalid())
1102 return SemaRef.ExprError();
1103
1104 PlacementArgs.push_back(Arg.take());
1105 }
1106
1107 // Instantiate the constructor arguments (if any).
1108 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1109 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1110 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1111 if (Arg.isInvalid())
1112 return SemaRef.ExprError();
1113
1114 ConstructorArgs.push_back(Arg.take());
1115 }
1116
1117 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1118 E->isGlobalNew(),
1119 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001120 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001121 /*FIXME*/SourceLocation(),
1122 E->isParenTypeId(),
1123 AllocType,
1124 /*FIXME*/E->getSourceRange().getBegin(),
1125 SourceRange(),
1126 move(ArraySize),
1127 /*FIXME*/SourceLocation(),
1128 Sema::MultiExprArg(SemaRef,
1129 ConstructorArgs.take(),
1130 ConstructorArgs.size()),
1131 E->getSourceRange().getEnd());
1132}
1133
1134Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001135TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1136 OwningExprResult Operand = Visit(E->getArgument());
1137 if (Operand.isInvalid())
1138 return SemaRef.ExprError();
1139
1140 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1141 E->isGlobalDelete(),
1142 E->isArrayForm(),
1143 move(Operand));
1144}
1145
1146Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001147TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1148 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1149 /*FIXME*/E->getSourceRange().getBegin(),
1150 DeclarationName());
1151 if (T.isNull())
1152 return SemaRef.ExprError();
1153
1154 SourceLocation FakeLParenLoc
1155 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1156 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1157 E->getSourceRange().getBegin(),
1158 /*FIXME*/FakeLParenLoc,
1159 T.getAsOpaquePtr(),
1160 E->getSourceRange().getEnd());
1161}
1162
1163Sema::OwningExprResult
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001164TemplateExprInstantiator::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
1165 NestedNameSpecifier *NNS
1166 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
1167 E->getQualifierRange(),
1168 TemplateArgs);
1169 if (!NNS)
1170 return SemaRef.ExprError();
1171
1172 CXXScopeSpec SS;
1173 SS.setRange(E->getQualifierRange());
1174 SS.setScopeRep(NNS);
1175 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0,
1176 E->getLocation(),
1177 E->getDecl()->getDeclName(),
1178 /*Trailing lparen=*/false,
1179 &SS,
1180 /*FIXME:*/false);
1181}
1182
1183Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001184TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1185 CXXExprWithTemporaries *E) {
1186 OwningExprResult SubExpr = Visit(E->getSubExpr());
1187 if (SubExpr.isInvalid())
1188 return SemaRef.ExprError();
1189
Anders Carlssonf54741e2009-06-16 03:37:31 +00001190 Expr *Temp =
1191 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
1192 E->shouldDestroyTemporaries());
1193 return SemaRef.Owned(Temp);
Douglas Gregore06274d2009-05-20 21:51:01 +00001194}
1195
1196Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001197TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1198 CXXUnresolvedConstructExpr *E) {
1199 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1200 E->getTypeBeginLoc(),
1201 DeclarationName());
1202 if (T.isNull())
1203 return SemaRef.ExprError();
1204
Douglas Gregord7e27052009-05-20 22:33:37 +00001205 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001206 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1207 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1208 ArgEnd = E->arg_end();
1209 Arg != ArgEnd; ++Arg) {
1210 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001211 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001212 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001213
1214 FakeCommaLocs.push_back(
1215 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1216 Args.push_back(InstArg.takeAs<Expr>());
1217 }
1218
1219 // FIXME: The end of the type range isn't exactly correct.
1220 // FIXME: we're faking the locations of the commas
1221 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1222 E->getLParenLoc()),
1223 T.getAsOpaquePtr(),
1224 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001225 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001226 &FakeCommaLocs.front(),
1227 E->getRParenLoc());
1228}
1229
1230Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001231TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
1232 CXXUnresolvedMemberExpr *E) {
1233 // Instantiate the base of the expression.
1234 OwningExprResult Base = Visit(E->getBase());
1235 if (Base.isInvalid())
1236 return SemaRef.ExprError();
1237
1238 // FIXME: Instantiate the declaration name.
1239 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1240 move(Base), E->getOperatorLoc(),
1241 E->isArrow()? tok::arrow
1242 : tok::period,
1243 E->getMemberLoc(),
1244 /*FIXME:*/*E->getMember().getAsIdentifierInfo(),
1245 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1246}
1247
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001248//----------------------------------------------------------------------------
1249// Objective-C Expressions
1250//----------------------------------------------------------------------------
1251Sema::OwningExprResult
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001252TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) {
1253 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001254}
1255
1256Sema::OwningExprResult
Anders Carlssonfc0f0212009-06-07 18:45:35 +00001257TemplateExprInstantiator::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1258 QualType EncodedType = SemaRef.InstantiateType(E->getEncodedType(),
1259 TemplateArgs,
1260 /*FIXME:*/E->getAtLoc(),
1261 DeclarationName());
1262 if (EncodedType.isNull())
1263 return SemaRef.ExprError();
1264
1265 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(E->getAtLoc(),
1266 EncodedType,
1267 E->getRParenLoc()));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001268}
1269
1270Sema::OwningExprResult
1271TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1272 assert(false && "FIXME: Template instantiations for ObjC expressions");
1273 return SemaRef.ExprError();
1274}
1275
1276Sema::OwningExprResult
1277TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001278 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001279}
1280
1281Sema::OwningExprResult
1282TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001283 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001284}
1285
1286Sema::OwningExprResult
1287TemplateExprInstantiator::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1288 assert(false && "FIXME: Template instantiations for ObjC expressions");
1289 return SemaRef.ExprError();
1290}
1291
1292Sema::OwningExprResult
1293TemplateExprInstantiator::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1294 assert(false && "FIXME: Template instantiations for ObjC expressions");
1295 return SemaRef.ExprError();
1296}
1297
1298Sema::OwningExprResult
1299TemplateExprInstantiator::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) {
1300 assert(false && "FIXME: Template instantiations for ObjC expressions");
1301 return SemaRef.ExprError();
1302}
1303
1304Sema::OwningExprResult
1305TemplateExprInstantiator::VisitObjCSuperExpr(ObjCSuperExpr *E) {
1306 assert(false && "FIXME: Template instantiations for ObjC expressions");
1307 return SemaRef.ExprError();
1308}
1309
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001310Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001311Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001312 if (!E)
1313 return Owned((Expr *)0);
1314
Douglas Gregor7e063902009-05-11 23:53:27 +00001315 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001316 return Instantiator.Visit(E);
1317}