blob: e1702b52a66318e7388cf47b80fb18dc3949af3d [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();
Argyrios Kyrtzidis17945a02009-06-30 02:36:12 +0000528 DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
Douglas Gregorcde01732009-05-19 22:10:17 +0000529 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
530
531 // Build a reference to the __builtin_shufflevector builtin
532 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
533 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
534 E->getBuiltinLoc(),
535 false, false);
536 SemaRef.UsualUnaryConversions(Callee);
537
538 // Build the CallExpr
539 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000540 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000541 SubExprs.size(),
542 Builtin->getResultType(),
543 E->getRParenLoc());
544 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
545
546 // Type-check the __builtin_shufflevector expression.
547 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
548 if (Result.isInvalid())
549 return SemaRef.ExprError();
550
551 OwnedCall.release();
552 return move(Result);
553}
554
555Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000556TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
557 OwningExprResult Cond = Visit(E->getCond());
558 if (Cond.isInvalid())
559 return SemaRef.ExprError();
560
561 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
562 if (LHS.isInvalid())
563 return SemaRef.ExprError();
564
565 OwningExprResult RHS = Visit(E->getRHS());
566 if (RHS.isInvalid())
567 return SemaRef.ExprError();
568
569 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
570 move(Cond), move(LHS), move(RHS),
571 E->getRParenLoc());
572}
573
Douglas Gregordd027302009-05-19 23:10:31 +0000574Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
575 OwningExprResult SubExpr = Visit(E->getSubExpr());
576 if (SubExpr.isInvalid())
577 return SemaRef.ExprError();
578
579 SourceLocation FakeTypeLoc
580 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
581 .getEnd());
582 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
583 /*FIXME:*/FakeTypeLoc,
584 DeclarationName());
585 if (T.isNull())
586 return SemaRef.ExprError();
587
588 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
589 T.getAsOpaquePtr(), E->getRParenLoc());
590}
591
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000592Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000593TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000594 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
Douglas Gregorccb97f52009-05-21 21:38:12 +0000595 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
596 OwningExprResult Init = Visit(E->getInit(I));
597 if (Init.isInvalid())
598 return SemaRef.ExprError();
599 Inits.push_back(Init.takeAs<Expr>());
600 }
601
602 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
603 E->getRBraceLoc());
604}
605
606Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000607TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
608 Designation Desig;
609
610 // Instantiate the initializer value
611 OwningExprResult Init = Visit(E->getInit());
612 if (Init.isInvalid())
613 return SemaRef.ExprError();
614
615 // Instantiate the designators.
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000616 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
Douglas Gregor9ea62762009-05-21 23:17:49 +0000617 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
618 DEnd = E->designators_end();
619 D != DEnd; ++D) {
620 if (D->isFieldDesignator()) {
621 Desig.AddDesignator(Designator::getField(D->getFieldName(),
622 D->getDotLoc(),
623 D->getFieldLoc()));
624 continue;
625 }
626
627 if (D->isArrayDesignator()) {
628 OwningExprResult Index = Visit(E->getArrayIndex(*D));
629 if (Index.isInvalid())
630 return SemaRef.ExprError();
631
632 Desig.AddDesignator(Designator::getArray(Index.get(),
633 D->getLBracketLoc()));
634
635 ArrayExprs.push_back(Index.release());
636 continue;
637 }
638
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000639 assert(D->isArrayRangeDesignator() && "New kind of designator?");
640 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
641 if (Start.isInvalid())
642 return SemaRef.ExprError();
643
644 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
645 if (End.isInvalid())
646 return SemaRef.ExprError();
647
648 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
649 End.get(),
650 D->getLBracketLoc(),
651 D->getEllipsisLoc()));
652
653 ArrayExprs.push_back(Start.release());
654 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000655 }
656
657 OwningExprResult Result =
658 SemaRef.ActOnDesignatedInitializer(Desig,
659 E->getEqualOrColonLoc(),
660 E->usesGNUSyntax(),
661 move(Init));
662 if (Result.isInvalid())
663 return SemaRef.ExprError();
664
665 ArrayExprs.take();
666 return move(Result);
667}
668
669Sema::OwningExprResult
670TemplateExprInstantiator::VisitImplicitValueInitExpr(
671 ImplicitValueInitExpr *E) {
672 assert(!E->isTypeDependent() && !E->isValueDependent() &&
673 "ImplicitValueInitExprs are never dependent");
674 return SemaRef.Clone(E);
675}
676
677Sema::OwningExprResult
Douglas Gregorbec53e72009-05-22 23:07:44 +0000678TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
679 OwningExprResult Base = Visit(E->getBase());
680 if (Base.isInvalid())
681 return SemaRef.ExprError();
682
683 SourceLocation FakeOperatorLoc =
684 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
685 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
686 move(Base),
687 /*FIXME*/FakeOperatorLoc,
688 tok::period,
689 E->getAccessorLoc(),
690 E->getAccessor(),
691 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
692}
693
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000694Sema::OwningExprResult
695TemplateExprInstantiator::VisitBlockExpr(BlockExpr *E) {
696 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
697 return SemaRef.ExprError();
698}
699
700Sema::OwningExprResult
701TemplateExprInstantiator::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
702 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
703 return SemaRef.ExprError();
704}
705
Douglas Gregorbec53e72009-05-22 23:07:44 +0000706Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000707TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
708 bool isSizeOf = E->isSizeOf();
709
710 if (E->isArgumentType()) {
711 QualType T = E->getArgumentType();
712 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000713 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000714 /*FIXME*/E->getOperatorLoc(),
715 &SemaRef.PP.getIdentifierTable().get("sizeof"));
716 if (T.isNull())
717 return SemaRef.ExprError();
718 }
719
720 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
721 E->getSourceRange());
722 }
723
Douglas Gregorac7610d2009-06-22 20:57:11 +0000724 Sema::OwningExprResult Arg(SemaRef);
725 {
726 // C++0x [expr.sizeof]p1:
727 // The operand is either an expression, which is an unevaluated operand
728 // [...]
729 EnterExpressionEvaluationContext Unevaluated(SemaRef, Action::Unevaluated);
730
731 Arg = Visit(E->getArgumentExpr());
732 if (Arg.isInvalid())
733 return SemaRef.ExprError();
734 }
Douglas Gregoraa6af222009-03-25 00:27:28 +0000735
736 Sema::OwningExprResult Result
737 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
738 isSizeOf, E->getSourceRange());
739 if (Result.isInvalid())
740 return SemaRef.ExprError();
741
742 Arg.release();
743 return move(Result);
744}
745
746Sema::OwningExprResult
747TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000748 NestedNameSpecifier *NNS
749 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
750 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000751 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000752 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000753 return SemaRef.ExprError();
754
Douglas Gregorab452ba2009-03-26 23:50:42 +0000755 CXXScopeSpec SS;
756 SS.setRange(E->getQualifierRange());
757 SS.setScopeRep(NNS);
758
Douglas Gregoraa6af222009-03-25 00:27:28 +0000759 // FIXME: We're passing in a NULL scope, because
760 // ActOnDeclarationNameExpr doesn't actually use the scope when we
761 // give it a non-empty scope specifier. Investigate whether it would
762 // be better to refactor ActOnDeclarationNameExpr.
763 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
764 E->getDeclName(),
765 /*HasTrailingLParen=*/false,
766 &SS,
767 /*FIXME:isAddressOfOperand=*/false);
768}
769
770Sema::OwningExprResult
771TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
772 CXXTemporaryObjectExpr *E) {
773 QualType T = E->getType();
774 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000775 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000776 E->getTypeBeginLoc(), DeclarationName());
777 if (T.isNull())
778 return SemaRef.ExprError();
779 }
780
Douglas Gregord7e27052009-05-20 22:33:37 +0000781 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000782 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000783 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
784 ArgEnd = E->arg_end();
785 Arg != ArgEnd; ++Arg) {
786 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000787 if (InstantiatedArg.isInvalid())
788 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000789
790 Args.push_back((Expr *)InstantiatedArg.release());
791 }
792
Douglas Gregord7e27052009-05-20 22:33:37 +0000793 SourceLocation CommaLoc;
794 // FIXME: HACK!
795 if (Args.size() > 1) {
796 Expr *First = (Expr *)Args[0];
797 CommaLoc
798 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000799 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000800 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
801 /*, FIXME*/),
802 T.getAsOpaquePtr(),
803 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000804 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000805 /*HACK*/&CommaLoc,
806 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000807}
808
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000809Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
810 assert(false && "Cannot instantiate abstract CastExpr");
811 return SemaRef.ExprError();
812}
813
Douglas Gregoraa6af222009-03-25 00:27:28 +0000814Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
815 ImplicitCastExpr *E) {
816 assert(!E->isTypeDependent() && "Implicit casts must have known types");
817
818 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
819 if (SubExpr.isInvalid())
820 return SemaRef.ExprError();
821
822 ImplicitCastExpr *ICE =
823 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
824 (Expr *)SubExpr.release(),
825 E->isLvalueCast());
826 return SemaRef.Owned(ICE);
827}
828
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000829Sema::OwningExprResult
830TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
831 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
832 return SemaRef.ExprError();
833}
834
835Sema::OwningExprResult
836TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
837 // Instantiate the type that we're casting to.
838 SourceLocation TypeStartLoc
839 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
840 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
841 TemplateArgs,
842 TypeStartLoc,
843 DeclarationName());
844 if (ExplicitTy.isNull())
845 return SemaRef.ExprError();
846
847 // Instantiate the subexpression.
848 OwningExprResult SubExpr = Visit(E->getSubExpr());
849 if (SubExpr.isInvalid())
850 return SemaRef.ExprError();
851
852 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
853 ExplicitTy.getAsOpaquePtr(),
854 E->getRParenLoc(),
855 move(SubExpr));
856}
857
858Sema::OwningExprResult
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000859TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
860 return VisitCallExpr(E);
861}
862
863Sema::OwningExprResult
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000864TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
865 // Figure out which cast operator we're dealing with.
866 tok::TokenKind Kind;
867 switch (E->getStmtClass()) {
868 case Stmt::CXXStaticCastExprClass:
869 Kind = tok::kw_static_cast;
870 break;
871
872 case Stmt::CXXDynamicCastExprClass:
873 Kind = tok::kw_dynamic_cast;
874 break;
875
876 case Stmt::CXXReinterpretCastExprClass:
877 Kind = tok::kw_reinterpret_cast;
878 break;
879
880 case Stmt::CXXConstCastExprClass:
881 Kind = tok::kw_const_cast;
882 break;
883
884 default:
885 assert(false && "Invalid C++ named cast");
886 return SemaRef.ExprError();
887 }
888
889 // Instantiate the type that we're casting to.
890 SourceLocation TypeStartLoc
891 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
892 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
893 TemplateArgs,
894 TypeStartLoc,
895 DeclarationName());
896 if (ExplicitTy.isNull())
897 return SemaRef.ExprError();
898
899 // Instantiate the subexpression.
900 OwningExprResult SubExpr = Visit(E->getSubExpr());
901 if (SubExpr.isInvalid())
902 return SemaRef.ExprError();
903
904 SourceLocation FakeLAngleLoc
905 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
906 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
907 SourceLocation FakeRParenLoc
908 = SemaRef.PP.getLocForEndOfToken(
909 E->getSubExpr()->getSourceRange().getEnd());
910 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
911 /*FIXME:*/FakeLAngleLoc,
912 ExplicitTy.getAsOpaquePtr(),
913 /*FIXME:*/FakeRAngleLoc,
914 /*FIXME:*/FakeRAngleLoc,
915 move(SubExpr),
916 /*FIXME:*/FakeRParenLoc);
917}
918
919Sema::OwningExprResult
920TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
921 return VisitCXXNamedCastExpr(E);
922}
923
924Sema::OwningExprResult
925TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
926 return VisitCXXNamedCastExpr(E);
927}
928
929Sema::OwningExprResult
930TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
931 CXXReinterpretCastExpr *E) {
932 return VisitCXXNamedCastExpr(E);
933}
934
935Sema::OwningExprResult
936TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
937 return VisitCXXNamedCastExpr(E);
938}
939
Anders Carlsson0712d292009-05-15 20:26:03 +0000940Sema::OwningExprResult
941TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
942 QualType ThisType =
943 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
944
945 CXXThisExpr *TE =
946 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
947
948 return SemaRef.Owned(TE);
949}
950
Douglas Gregoraa6af222009-03-25 00:27:28 +0000951Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000952TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
953 if (E->isTypeOperand()) {
954 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
955 TemplateArgs,
956 /*FIXME*/E->getSourceRange().getBegin(),
957 DeclarationName());
958 if (T.isNull())
959 return SemaRef.ExprError();
960
961 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
962 /*FIXME*/E->getSourceRange().getBegin(),
963 true, T.getAsOpaquePtr(),
964 E->getSourceRange().getEnd());
965 }
966
Douglas Gregorac7610d2009-06-22 20:57:11 +0000967 // We don't know whether the expression is potentially evaluated until
968 // after we perform semantic analysis, so the expression is potentially
969 // potentially evaluated.
970 EnterExpressionEvaluationContext Unevaluated(SemaRef,
971 Action::PotentiallyPotentiallyEvaluated);
972
Douglas Gregor12d0c302009-05-21 18:34:44 +0000973 OwningExprResult Operand = Visit(E->getExprOperand());
974 if (Operand.isInvalid())
975 return SemaRef.ExprError();
976
977 OwningExprResult Result
978 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
979 /*FIXME*/E->getSourceRange().getBegin(),
980 false, Operand.get(),
981 E->getSourceRange().getEnd());
982 if (Result.isInvalid())
983 return SemaRef.ExprError();
984
985 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
986 return move(Result);
987}
988
989Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +0000990TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
991 OwningExprResult SubExpr(SemaRef, (void *)0);
992 if (E->getSubExpr()) {
993 SubExpr = Visit(E->getSubExpr());
994 if (SubExpr.isInvalid())
995 return SemaRef.ExprError();
996 }
997
998 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
999}
1000
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001001Sema::OwningExprResult
1002TemplateExprInstantiator::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
1003 assert(false &&
1004 "FIXME: Instantiation for default arguments is unimplemented");
1005 return SemaRef.ExprError();
1006}
1007
Douglas Gregor42e5b502009-05-21 17:37:52 +00001008Sema::OwningExprResult
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001009TemplateExprInstantiator::VisitCXXBindTemporaryExpr(
1010 CXXBindTemporaryExpr *E) {
1011 OwningExprResult SubExpr = Visit(E->getSubExpr());
1012 if (SubExpr.isInvalid())
1013 return SemaRef.ExprError();
1014
Anders Carlsson464f4f32009-05-30 20:52:37 +00001015 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
Anders Carlssonfceb0a82009-05-30 20:03:25 +00001016}
1017
1018Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +00001019TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
1020 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
1021 ->isDependentType() && "Dependent constructor shouldn't be here");
1022
1023 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
1024 /*FIXME*/E->getSourceRange().getBegin(),
1025 DeclarationName());
1026 if (T.isNull())
1027 return SemaRef.ExprError();
1028
Douglas Gregord7e27052009-05-20 22:33:37 +00001029 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +00001030 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
1031 ArgEnd = E->arg_end();
1032 Arg != ArgEnd; ++Arg) {
1033 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001034 if (ArgInst.isInvalid())
1035 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001036
1037 Args.push_back(ArgInst.takeAs<Expr>());
1038 }
1039
Anders Carlsson8e587a12009-05-30 20:56:46 +00001040 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, T,
Douglas Gregord94546a2009-05-20 21:38:11 +00001041 E->getConstructor(),
1042 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +00001043 Args.takeAs<Expr>(),
1044 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001045}
1046
1047Sema::OwningExprResult
1048TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1049 CXXFunctionalCastExpr *E) {
1050 // Instantiate the type that we're casting to.
1051 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1052 TemplateArgs,
1053 E->getTypeBeginLoc(),
1054 DeclarationName());
1055 if (ExplicitTy.isNull())
1056 return SemaRef.ExprError();
1057
1058 // Instantiate the subexpression.
1059 OwningExprResult SubExpr = Visit(E->getSubExpr());
1060 if (SubExpr.isInvalid())
1061 return SemaRef.ExprError();
1062
1063 // FIXME: The end of the type's source range is wrong
1064 Expr *Sub = SubExpr.takeAs<Expr>();
1065 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1066 ExplicitTy.getAsOpaquePtr(),
1067 /*FIXME:*/E->getTypeBeginLoc(),
1068 Sema::MultiExprArg(SemaRef,
1069 (void **)&Sub,
1070 1),
1071 0,
1072 E->getRParenLoc());
1073}
1074
1075Sema::OwningExprResult
1076TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1077 return SemaRef.Clone(E);
1078}
1079
1080Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001081TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1082 // Instantiate the type that we're allocating
1083 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1084 TemplateArgs,
1085 /*FIXME:*/E->getSourceRange().getBegin(),
1086 DeclarationName());
1087 if (AllocType.isNull())
1088 return SemaRef.ExprError();
1089
1090 // Instantiate the size of the array we're allocating (if any).
1091 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1092 TemplateArgs);
1093 if (ArraySize.isInvalid())
1094 return SemaRef.ExprError();
1095
1096 // Instantiate the placement arguments (if any).
1097 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1098 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1099 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1100 if (Arg.isInvalid())
1101 return SemaRef.ExprError();
1102
1103 PlacementArgs.push_back(Arg.take());
1104 }
1105
1106 // Instantiate the constructor arguments (if any).
1107 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1108 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1109 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1110 if (Arg.isInvalid())
1111 return SemaRef.ExprError();
1112
1113 ConstructorArgs.push_back(Arg.take());
1114 }
1115
1116 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1117 E->isGlobalNew(),
1118 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001119 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001120 /*FIXME*/SourceLocation(),
1121 E->isParenTypeId(),
1122 AllocType,
1123 /*FIXME*/E->getSourceRange().getBegin(),
1124 SourceRange(),
1125 move(ArraySize),
1126 /*FIXME*/SourceLocation(),
1127 Sema::MultiExprArg(SemaRef,
1128 ConstructorArgs.take(),
1129 ConstructorArgs.size()),
1130 E->getSourceRange().getEnd());
1131}
1132
1133Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001134TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1135 OwningExprResult Operand = Visit(E->getArgument());
1136 if (Operand.isInvalid())
1137 return SemaRef.ExprError();
1138
1139 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1140 E->isGlobalDelete(),
1141 E->isArrayForm(),
1142 move(Operand));
1143}
1144
1145Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001146TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1147 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1148 /*FIXME*/E->getSourceRange().getBegin(),
1149 DeclarationName());
1150 if (T.isNull())
1151 return SemaRef.ExprError();
1152
1153 SourceLocation FakeLParenLoc
1154 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1155 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1156 E->getSourceRange().getBegin(),
1157 /*FIXME*/FakeLParenLoc,
1158 T.getAsOpaquePtr(),
1159 E->getSourceRange().getEnd());
1160}
1161
1162Sema::OwningExprResult
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001163TemplateExprInstantiator::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
1164 NestedNameSpecifier *NNS
1165 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
1166 E->getQualifierRange(),
1167 TemplateArgs);
1168 if (!NNS)
1169 return SemaRef.ExprError();
1170
1171 CXXScopeSpec SS;
1172 SS.setRange(E->getQualifierRange());
1173 SS.setScopeRep(NNS);
1174 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0,
1175 E->getLocation(),
1176 E->getDecl()->getDeclName(),
1177 /*Trailing lparen=*/false,
1178 &SS,
1179 /*FIXME:*/false);
1180}
1181
1182Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001183TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1184 CXXExprWithTemporaries *E) {
1185 OwningExprResult SubExpr = Visit(E->getSubExpr());
1186 if (SubExpr.isInvalid())
1187 return SemaRef.ExprError();
1188
Anders Carlssonf54741e2009-06-16 03:37:31 +00001189 Expr *Temp =
1190 SemaRef.MaybeCreateCXXExprWithTemporaries(SubExpr.takeAs<Expr>(),
1191 E->shouldDestroyTemporaries());
1192 return SemaRef.Owned(Temp);
Douglas Gregore06274d2009-05-20 21:51:01 +00001193}
1194
1195Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001196TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1197 CXXUnresolvedConstructExpr *E) {
1198 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1199 E->getTypeBeginLoc(),
1200 DeclarationName());
1201 if (T.isNull())
1202 return SemaRef.ExprError();
1203
Douglas Gregord7e27052009-05-20 22:33:37 +00001204 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001205 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1206 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1207 ArgEnd = E->arg_end();
1208 Arg != ArgEnd; ++Arg) {
1209 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001210 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001211 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001212
1213 FakeCommaLocs.push_back(
1214 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1215 Args.push_back(InstArg.takeAs<Expr>());
1216 }
1217
1218 // FIXME: The end of the type range isn't exactly correct.
1219 // FIXME: we're faking the locations of the commas
1220 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1221 E->getLParenLoc()),
1222 T.getAsOpaquePtr(),
1223 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001224 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001225 &FakeCommaLocs.front(),
1226 E->getRParenLoc());
1227}
1228
1229Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001230TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
1231 CXXUnresolvedMemberExpr *E) {
1232 // Instantiate the base of the expression.
1233 OwningExprResult Base = Visit(E->getBase());
1234 if (Base.isInvalid())
1235 return SemaRef.ExprError();
1236
1237 // FIXME: Instantiate the declaration name.
1238 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1239 move(Base), E->getOperatorLoc(),
1240 E->isArrow()? tok::arrow
1241 : tok::period,
1242 E->getMemberLoc(),
1243 /*FIXME:*/*E->getMember().getAsIdentifierInfo(),
1244 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1245}
1246
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001247//----------------------------------------------------------------------------
1248// Objective-C Expressions
1249//----------------------------------------------------------------------------
1250Sema::OwningExprResult
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001251TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) {
1252 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001253}
1254
1255Sema::OwningExprResult
Anders Carlssonfc0f0212009-06-07 18:45:35 +00001256TemplateExprInstantiator::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1257 QualType EncodedType = SemaRef.InstantiateType(E->getEncodedType(),
1258 TemplateArgs,
1259 /*FIXME:*/E->getAtLoc(),
1260 DeclarationName());
1261 if (EncodedType.isNull())
1262 return SemaRef.ExprError();
1263
1264 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(E->getAtLoc(),
1265 EncodedType,
1266 E->getRParenLoc()));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001267}
1268
1269Sema::OwningExprResult
1270TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1271 assert(false && "FIXME: Template instantiations for ObjC expressions");
1272 return SemaRef.ExprError();
1273}
1274
1275Sema::OwningExprResult
1276TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001277 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001278}
1279
1280Sema::OwningExprResult
1281TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
Anders Carlsson02d95ba2009-06-07 19:51:47 +00001282 return SemaRef.Owned(E->Clone(SemaRef.Context));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001283}
1284
1285Sema::OwningExprResult
1286TemplateExprInstantiator::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1287 assert(false && "FIXME: Template instantiations for ObjC expressions");
1288 return SemaRef.ExprError();
1289}
1290
1291Sema::OwningExprResult
1292TemplateExprInstantiator::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1293 assert(false && "FIXME: Template instantiations for ObjC expressions");
1294 return SemaRef.ExprError();
1295}
1296
1297Sema::OwningExprResult
1298TemplateExprInstantiator::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) {
1299 assert(false && "FIXME: Template instantiations for ObjC expressions");
1300 return SemaRef.ExprError();
1301}
1302
1303Sema::OwningExprResult
1304TemplateExprInstantiator::VisitObjCSuperExpr(ObjCSuperExpr *E) {
1305 assert(false && "FIXME: Template instantiations for ObjC expressions");
1306 return SemaRef.ExprError();
1307}
1308
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001309Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001310Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001311 if (!E)
1312 return Owned((Expr *)0);
1313
Douglas Gregor7e063902009-05-11 23:53:27 +00001314 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001315 return Instantiator.Visit(E);
1316}