blob: 9576627577970f8d037fe7dc39995da2ed94b96e [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()];
115 QualType T = Arg.getIntegralType();
116 if (T->isCharType() || T->isWideCharType())
117 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
118 Arg.getAsIntegral()->getZExtValue(),
119 T->isWideCharType(),
120 T,
121 E->getSourceRange().getBegin()));
Douglas Gregor199d9912009-06-05 00:53:49 +0000122 if (T->isBooleanType())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000123 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
124 Arg.getAsIntegral()->getBoolValue(),
125 T,
126 E->getSourceRange().getBegin()));
127
Douglas Gregor199d9912009-06-05 00:53:49 +0000128 assert(Arg.getAsIntegral()->getBitWidth() == SemaRef.Context.getIntWidth(T));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000129 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
130 *Arg.getAsIntegral(),
131 T,
132 E->getSourceRange().getBegin()));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000133 }
134
135 if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
136 // FIXME: instantiate each decl in the overload set
137 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Ovl,
Douglas Gregor5f8bd592009-05-26 22:09:24 +0000138 SemaRef.Context.OverloadTy,
139 E->getLocation(),
140 false, false));
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000141 }
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000142
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000143 ValueDecl *NewD
Douglas Gregored961e72009-05-27 17:54:46 +0000144 = dyn_cast_or_null<ValueDecl>(SemaRef.InstantiateCurrentDeclRef(D));
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000145 if (!NewD)
146 return SemaRef.ExprError();
147
Douglas Gregor2bba76b2009-05-27 17:07:49 +0000148 // FIXME: Build QualifiedDeclRefExpr?
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000149 QualType T = NewD->getType();
150 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000151 T.getNonReferenceType(),
152 E->getLocation(),
153 T->isDependentType(),
154 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000155}
156
157Sema::OwningExprResult
158TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
159 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
160 if (SubExpr.isInvalid())
161 return SemaRef.ExprError();
162
163 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
164 E->getLParen(), E->getRParen(),
165 (Expr *)SubExpr.release()));
166}
167
168Sema::OwningExprResult
169TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
170 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
171 if (Arg.isInvalid())
172 return SemaRef.ExprError();
173
174 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
175 E->getOpcode(),
176 move(Arg));
177}
178
179Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000180TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
181 Sema::OwningExprResult LHS = Visit(E->getLHS());
182 if (LHS.isInvalid())
183 return SemaRef.ExprError();
184
185 Sema::OwningExprResult RHS = Visit(E->getRHS());
186 if (RHS.isInvalid())
187 return SemaRef.ExprError();
188
189 // Since the overloaded array-subscript operator (operator[]) can
190 // only be a member function, we can make several simplifying
191 // assumptions here:
192 // 1) Normal name lookup (from the current scope) will not ever
193 // find any declarations of operator[] that won't also be found be
194 // member operator lookup, so it is safe to pass a NULL Scope
195 // during the instantiation to avoid the lookup entirely.
196 //
197 // 2) Neither normal name lookup nor argument-dependent lookup at
198 // template definition time will find any operators that won't be
199 // found at template instantiation time, so we do not need to
200 // cache the results of name lookup as we do for the binary
201 // operators.
202 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
203 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
204 /*FIXME:*/LLocFake,
205 move(RHS),
206 E->getRBracketLoc());
207}
208
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000209Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
210 // Instantiate callee
211 OwningExprResult Callee = Visit(E->getCallee());
212 if (Callee.isInvalid())
213 return SemaRef.ExprError();
214
215 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000216 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000217 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
218 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
219 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000220 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000221 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000222
223 FakeCommaLocs.push_back(
224 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
225 Args.push_back(Arg.takeAs<Expr>());
226 }
227
228 SourceLocation FakeLParenLoc
229 = ((Expr *)Callee.get())->getSourceRange().getBegin();
230 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
231 /*FIXME:*/FakeLParenLoc,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000232 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000233 /*FIXME:*/&FakeCommaLocs.front(),
234 E->getRParenLoc());
235}
236
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000237Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000238TemplateExprInstantiator::VisitMemberExpr(MemberExpr *E) {
239 // Instantiate the base of the expression.
240 OwningExprResult Base = Visit(E->getBase());
241 if (Base.isInvalid())
242 return SemaRef.ExprError();
243
244 // FIXME: Handle declaration names here
245 SourceLocation FakeOperatorLoc =
246 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
247 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
248 move(Base),
249 /*FIXME*/FakeOperatorLoc,
250 E->isArrow()? tok::arrow
251 : tok::period,
252 E->getMemberLoc(),
253 /*FIXME:*/*E->getMemberDecl()->getIdentifier(),
254 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
255}
256
257Sema::OwningExprResult
Douglas Gregor690dc7f2009-05-21 23:48:18 +0000258TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
259 SourceLocation FakeTypeLoc
260 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
261 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
262 FakeTypeLoc,
263 DeclarationName());
264 if (T.isNull())
265 return SemaRef.ExprError();
266
267 OwningExprResult Init = Visit(E->getInitializer());
268 if (Init.isInvalid())
269 return SemaRef.ExprError();
270
271 return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
272 T.getAsOpaquePtr(),
273 /*FIXME*/E->getLParenLoc(),
274 move(Init));
275}
276
277Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000278TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
279 Sema::OwningExprResult LHS = Visit(E->getLHS());
280 if (LHS.isInvalid())
281 return SemaRef.ExprError();
282
283 Sema::OwningExprResult RHS = Visit(E->getRHS());
284 if (RHS.isInvalid())
285 return SemaRef.ExprError();
286
287 Sema::OwningExprResult Result
288 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
289 E->getOpcode(),
290 (Expr *)LHS.get(),
291 (Expr *)RHS.get());
292 if (Result.isInvalid())
293 return SemaRef.ExprError();
294
295 LHS.release();
296 RHS.release();
297 return move(Result);
298}
299
300Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000301TemplateExprInstantiator::VisitCompoundAssignOperator(
302 CompoundAssignOperator *E) {
303 return VisitBinaryOperator(E);
304}
305
306Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000307TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
308 Sema::OwningExprResult First = Visit(E->getArg(0));
309 if (First.isInvalid())
310 return SemaRef.ExprError();
311
312 Expr *Args[2] = { (Expr *)First.get(), 0 };
313
314 Sema::OwningExprResult Second(SemaRef);
315 if (E->getNumArgs() == 2) {
316 Second = Visit(E->getArg(1));
317
318 if (Second.isInvalid())
319 return SemaRef.ExprError();
320
321 Args[1] = (Expr *)Second.get();
322 }
323
324 if (!E->isTypeDependent()) {
325 // Since our original expression was not type-dependent, we do not
326 // perform lookup again at instantiation time (C++ [temp.dep]p1).
327 // Instead, we just build the new overloaded operator call
328 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000329 OwningExprResult Callee = Visit(E->getCallee());
330 if (Callee.isInvalid())
331 return SemaRef.ExprError();
332
Douglas Gregoraa6af222009-03-25 00:27:28 +0000333 First.release();
334 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000335
Douglas Gregoraa6af222009-03-25 00:27:28 +0000336 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
337 SemaRef.Context,
338 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000339 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000340 Args, E->getNumArgs(),
341 E->getType(),
342 E->getOperatorLoc()));
343 }
344
345 bool isPostIncDec = E->getNumArgs() == 2 &&
346 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
347 if (E->getNumArgs() == 1 || isPostIncDec) {
348 if (!Args[0]->getType()->isOverloadableType()) {
349 // The argument is not of overloadable type, so try to create a
350 // built-in unary operation.
351 UnaryOperator::Opcode Opc
352 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
353
354 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
355 move(First));
356 }
357
358 // Fall through to perform overload resolution
359 } else {
360 assert(E->getNumArgs() == 2 && "Expected binary operation");
361
362 Sema::OwningExprResult Result(SemaRef);
363 if (!Args[0]->getType()->isOverloadableType() &&
364 !Args[1]->getType()->isOverloadableType()) {
365 // Neither of the arguments is an overloadable type, so try to
366 // create a built-in binary operation.
367 BinaryOperator::Opcode Opc =
368 BinaryOperator::getOverloadedOpcode(E->getOperator());
369 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
370 Args[0], Args[1]);
371 if (Result.isInvalid())
372 return SemaRef.ExprError();
373
374 First.release();
375 Second.release();
376 return move(Result);
377 }
378
379 // Fall through to perform overload resolution.
380 }
381
382 // Compute the set of functions that were found at template
383 // definition time.
384 Sema::FunctionSet Functions;
385 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
386 OverloadedFunctionDecl *Overloads
387 = cast<OverloadedFunctionDecl>(DRE->getDecl());
388
389 // FIXME: Do we have to check
390 // IsAcceptableNonMemberOperatorCandidate for each of these?
391 for (OverloadedFunctionDecl::function_iterator
392 F = Overloads->function_begin(),
393 FEnd = Overloads->function_end();
394 F != FEnd; ++F)
395 Functions.insert(*F);
396
397 // Add any functions found via argument-dependent lookup.
398 DeclarationName OpName
399 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
400 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
401
402 // Create the overloaded operator invocation.
403 if (E->getNumArgs() == 1 || isPostIncDec) {
404 UnaryOperator::Opcode Opc
405 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
406 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
407 Functions, move(First));
408 }
409
Mike Stump390b4cc2009-05-16 07:39:55 +0000410 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
411 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000412 BinaryOperator::Opcode Opc =
413 BinaryOperator::getOverloadedOpcode(E->getOperator());
414 OwningExprResult Result
415 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
416 Functions, Args[0], Args[1]);
417
418 if (Result.isInvalid())
419 return SemaRef.ExprError();
420
421 First.release();
422 Second.release();
423 return move(Result);
424}
425
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000426Sema::OwningExprResult
427TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
428 VarDecl *Var
429 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
430 SemaRef.CurContext,
431 TemplateArgs));
432 if (!Var)
433 return SemaRef.ExprError();
434
Douglas Gregore06274d2009-05-20 21:51:01 +0000435 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000436 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
437 E->getStartLoc(),
438 SourceLocation(),
439 Var));
440}
441
Douglas Gregoraa6af222009-03-25 00:27:28 +0000442Sema::OwningExprResult
443TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
444 Sema::OwningExprResult Cond = Visit(E->getCond());
445 if (Cond.isInvalid())
446 return SemaRef.ExprError();
447
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000448 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
449 TemplateArgs);
450 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000451 return SemaRef.ExprError();
452
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000453 Sema::OwningExprResult RHS = Visit(E->getRHS());
454 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000455 return SemaRef.ExprError();
456
457 if (!E->isTypeDependent()) {
458 // Since our original expression was not type-dependent, we do not
459 // perform lookup again at instantiation time (C++ [temp.dep]p1).
460 // Instead, we just build the new conditional operator call expression.
461 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
462 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000463 LHS.takeAs<Expr>(),
464 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000465 E->getType()));
466 }
467
468
469 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
470 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000471 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000472}
473
Douglas Gregor76658232009-05-22 23:25:52 +0000474Sema::OwningExprResult
475TemplateExprInstantiator::VisitAddrLabelExpr(AddrLabelExpr *E) {
476 return SemaRef.ActOnAddrLabel(E->getAmpAmpLoc(),
477 E->getLabelLoc(),
478 E->getLabel()->getID());
479}
480
Douglas Gregorcd938172009-05-19 20:31:21 +0000481Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000482 Sema::OwningStmtResult SubStmt
483 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000484 if (SubStmt.isInvalid())
485 return SemaRef.ExprError();
486
487 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
488 E->getRParenLoc());
489}
490
Douglas Gregoraa6af222009-03-25 00:27:28 +0000491Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000492TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000493 assert(false && "__builtin_types_compatible_p is not legal in C++");
494 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000495}
496
497Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000498TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000499 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000500 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
501 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000502 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000503 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000504
505 SubExprs.push_back(SubExpr.takeAs<Expr>());
506 }
507
508 // Find the declaration for __builtin_shufflevector
509 const IdentifierInfo &Name
510 = SemaRef.Context.Idents.get("__builtin_shufflevector");
511 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
512 DeclContext::lookup_result Lookup
513 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
514 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
515
516 // Build a reference to the __builtin_shufflevector builtin
517 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
518 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
519 E->getBuiltinLoc(),
520 false, false);
521 SemaRef.UsualUnaryConversions(Callee);
522
523 // Build the CallExpr
524 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000525 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000526 SubExprs.size(),
527 Builtin->getResultType(),
528 E->getRParenLoc());
529 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
530
531 // Type-check the __builtin_shufflevector expression.
532 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
533 if (Result.isInvalid())
534 return SemaRef.ExprError();
535
536 OwnedCall.release();
537 return move(Result);
538}
539
540Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000541TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
542 OwningExprResult Cond = Visit(E->getCond());
543 if (Cond.isInvalid())
544 return SemaRef.ExprError();
545
546 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
547 if (LHS.isInvalid())
548 return SemaRef.ExprError();
549
550 OwningExprResult RHS = Visit(E->getRHS());
551 if (RHS.isInvalid())
552 return SemaRef.ExprError();
553
554 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
555 move(Cond), move(LHS), move(RHS),
556 E->getRParenLoc());
557}
558
Douglas Gregordd027302009-05-19 23:10:31 +0000559Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
560 OwningExprResult SubExpr = Visit(E->getSubExpr());
561 if (SubExpr.isInvalid())
562 return SemaRef.ExprError();
563
564 SourceLocation FakeTypeLoc
565 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
566 .getEnd());
567 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
568 /*FIXME:*/FakeTypeLoc,
569 DeclarationName());
570 if (T.isNull())
571 return SemaRef.ExprError();
572
573 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
574 T.getAsOpaquePtr(), E->getRParenLoc());
575}
576
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000577Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000578TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000579 ASTOwningVector<&ActionBase::DeleteExpr, 4> Inits(SemaRef);
Douglas Gregorccb97f52009-05-21 21:38:12 +0000580 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
581 OwningExprResult Init = Visit(E->getInit(I));
582 if (Init.isInvalid())
583 return SemaRef.ExprError();
584 Inits.push_back(Init.takeAs<Expr>());
585 }
586
587 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
588 E->getRBraceLoc());
589}
590
591Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000592TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
593 Designation Desig;
594
595 // Instantiate the initializer value
596 OwningExprResult Init = Visit(E->getInit());
597 if (Init.isInvalid())
598 return SemaRef.ExprError();
599
600 // Instantiate the designators.
Douglas Gregor0ca20ac2009-05-29 18:27:38 +0000601 ASTOwningVector<&ActionBase::DeleteExpr, 4> ArrayExprs(SemaRef);
Douglas Gregor9ea62762009-05-21 23:17:49 +0000602 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
603 DEnd = E->designators_end();
604 D != DEnd; ++D) {
605 if (D->isFieldDesignator()) {
606 Desig.AddDesignator(Designator::getField(D->getFieldName(),
607 D->getDotLoc(),
608 D->getFieldLoc()));
609 continue;
610 }
611
612 if (D->isArrayDesignator()) {
613 OwningExprResult Index = Visit(E->getArrayIndex(*D));
614 if (Index.isInvalid())
615 return SemaRef.ExprError();
616
617 Desig.AddDesignator(Designator::getArray(Index.get(),
618 D->getLBracketLoc()));
619
620 ArrayExprs.push_back(Index.release());
621 continue;
622 }
623
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000624 assert(D->isArrayRangeDesignator() && "New kind of designator?");
625 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
626 if (Start.isInvalid())
627 return SemaRef.ExprError();
628
629 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
630 if (End.isInvalid())
631 return SemaRef.ExprError();
632
633 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
634 End.get(),
635 D->getLBracketLoc(),
636 D->getEllipsisLoc()));
637
638 ArrayExprs.push_back(Start.release());
639 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000640 }
641
642 OwningExprResult Result =
643 SemaRef.ActOnDesignatedInitializer(Desig,
644 E->getEqualOrColonLoc(),
645 E->usesGNUSyntax(),
646 move(Init));
647 if (Result.isInvalid())
648 return SemaRef.ExprError();
649
650 ArrayExprs.take();
651 return move(Result);
652}
653
654Sema::OwningExprResult
655TemplateExprInstantiator::VisitImplicitValueInitExpr(
656 ImplicitValueInitExpr *E) {
657 assert(!E->isTypeDependent() && !E->isValueDependent() &&
658 "ImplicitValueInitExprs are never dependent");
659 return SemaRef.Clone(E);
660}
661
662Sema::OwningExprResult
Douglas Gregorbec53e72009-05-22 23:07:44 +0000663TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
664 OwningExprResult Base = Visit(E->getBase());
665 if (Base.isInvalid())
666 return SemaRef.ExprError();
667
668 SourceLocation FakeOperatorLoc =
669 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
670 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
671 move(Base),
672 /*FIXME*/FakeOperatorLoc,
673 tok::period,
674 E->getAccessorLoc(),
675 E->getAccessor(),
676 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
677}
678
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000679Sema::OwningExprResult
680TemplateExprInstantiator::VisitBlockExpr(BlockExpr *E) {
681 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
682 return SemaRef.ExprError();
683}
684
685Sema::OwningExprResult
686TemplateExprInstantiator::VisitBlockDeclRefExpr(BlockDeclRefExpr *E) {
687 assert(false && "FIXME:Template instantiation for blocks is unimplemented");
688 return SemaRef.ExprError();
689}
690
Douglas Gregorbec53e72009-05-22 23:07:44 +0000691Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000692TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
693 bool isSizeOf = E->isSizeOf();
694
695 if (E->isArgumentType()) {
696 QualType T = E->getArgumentType();
697 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000698 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000699 /*FIXME*/E->getOperatorLoc(),
700 &SemaRef.PP.getIdentifierTable().get("sizeof"));
701 if (T.isNull())
702 return SemaRef.ExprError();
703 }
704
705 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
706 E->getSourceRange());
707 }
708
709 Sema::OwningExprResult Arg = Visit(E->getArgumentExpr());
710 if (Arg.isInvalid())
711 return SemaRef.ExprError();
712
713 Sema::OwningExprResult Result
714 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
715 isSizeOf, E->getSourceRange());
716 if (Result.isInvalid())
717 return SemaRef.ExprError();
718
719 Arg.release();
720 return move(Result);
721}
722
723Sema::OwningExprResult
724TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000725 NestedNameSpecifier *NNS
726 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
727 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000728 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000729 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000730 return SemaRef.ExprError();
731
Douglas Gregorab452ba2009-03-26 23:50:42 +0000732 CXXScopeSpec SS;
733 SS.setRange(E->getQualifierRange());
734 SS.setScopeRep(NNS);
735
Douglas Gregoraa6af222009-03-25 00:27:28 +0000736 // FIXME: We're passing in a NULL scope, because
737 // ActOnDeclarationNameExpr doesn't actually use the scope when we
738 // give it a non-empty scope specifier. Investigate whether it would
739 // be better to refactor ActOnDeclarationNameExpr.
740 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
741 E->getDeclName(),
742 /*HasTrailingLParen=*/false,
743 &SS,
744 /*FIXME:isAddressOfOperand=*/false);
745}
746
747Sema::OwningExprResult
748TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
749 CXXTemporaryObjectExpr *E) {
750 QualType T = E->getType();
751 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000752 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000753 E->getTypeBeginLoc(), DeclarationName());
754 if (T.isNull())
755 return SemaRef.ExprError();
756 }
757
Douglas Gregord7e27052009-05-20 22:33:37 +0000758 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000759 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000760 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
761 ArgEnd = E->arg_end();
762 Arg != ArgEnd; ++Arg) {
763 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000764 if (InstantiatedArg.isInvalid())
765 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000766
767 Args.push_back((Expr *)InstantiatedArg.release());
768 }
769
Douglas Gregord7e27052009-05-20 22:33:37 +0000770 SourceLocation CommaLoc;
771 // FIXME: HACK!
772 if (Args.size() > 1) {
773 Expr *First = (Expr *)Args[0];
774 CommaLoc
775 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000776 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000777 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
778 /*, FIXME*/),
779 T.getAsOpaquePtr(),
780 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000781 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000782 /*HACK*/&CommaLoc,
783 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000784}
785
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000786Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
787 assert(false && "Cannot instantiate abstract CastExpr");
788 return SemaRef.ExprError();
789}
790
Douglas Gregoraa6af222009-03-25 00:27:28 +0000791Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
792 ImplicitCastExpr *E) {
793 assert(!E->isTypeDependent() && "Implicit casts must have known types");
794
795 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
796 if (SubExpr.isInvalid())
797 return SemaRef.ExprError();
798
799 ImplicitCastExpr *ICE =
800 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
801 (Expr *)SubExpr.release(),
802 E->isLvalueCast());
803 return SemaRef.Owned(ICE);
804}
805
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000806Sema::OwningExprResult
807TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
808 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
809 return SemaRef.ExprError();
810}
811
812Sema::OwningExprResult
813TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
814 // Instantiate the type that we're casting to.
815 SourceLocation TypeStartLoc
816 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
817 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
818 TemplateArgs,
819 TypeStartLoc,
820 DeclarationName());
821 if (ExplicitTy.isNull())
822 return SemaRef.ExprError();
823
824 // Instantiate the subexpression.
825 OwningExprResult SubExpr = Visit(E->getSubExpr());
826 if (SubExpr.isInvalid())
827 return SemaRef.ExprError();
828
829 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
830 ExplicitTy.getAsOpaquePtr(),
831 E->getRParenLoc(),
832 move(SubExpr));
833}
834
835Sema::OwningExprResult
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000836TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
837 return VisitCallExpr(E);
838}
839
840Sema::OwningExprResult
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000841TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
842 // Figure out which cast operator we're dealing with.
843 tok::TokenKind Kind;
844 switch (E->getStmtClass()) {
845 case Stmt::CXXStaticCastExprClass:
846 Kind = tok::kw_static_cast;
847 break;
848
849 case Stmt::CXXDynamicCastExprClass:
850 Kind = tok::kw_dynamic_cast;
851 break;
852
853 case Stmt::CXXReinterpretCastExprClass:
854 Kind = tok::kw_reinterpret_cast;
855 break;
856
857 case Stmt::CXXConstCastExprClass:
858 Kind = tok::kw_const_cast;
859 break;
860
861 default:
862 assert(false && "Invalid C++ named cast");
863 return SemaRef.ExprError();
864 }
865
866 // Instantiate the type that we're casting to.
867 SourceLocation TypeStartLoc
868 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
869 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
870 TemplateArgs,
871 TypeStartLoc,
872 DeclarationName());
873 if (ExplicitTy.isNull())
874 return SemaRef.ExprError();
875
876 // Instantiate the subexpression.
877 OwningExprResult SubExpr = Visit(E->getSubExpr());
878 if (SubExpr.isInvalid())
879 return SemaRef.ExprError();
880
881 SourceLocation FakeLAngleLoc
882 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
883 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
884 SourceLocation FakeRParenLoc
885 = SemaRef.PP.getLocForEndOfToken(
886 E->getSubExpr()->getSourceRange().getEnd());
887 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
888 /*FIXME:*/FakeLAngleLoc,
889 ExplicitTy.getAsOpaquePtr(),
890 /*FIXME:*/FakeRAngleLoc,
891 /*FIXME:*/FakeRAngleLoc,
892 move(SubExpr),
893 /*FIXME:*/FakeRParenLoc);
894}
895
896Sema::OwningExprResult
897TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
898 return VisitCXXNamedCastExpr(E);
899}
900
901Sema::OwningExprResult
902TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
903 return VisitCXXNamedCastExpr(E);
904}
905
906Sema::OwningExprResult
907TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
908 CXXReinterpretCastExpr *E) {
909 return VisitCXXNamedCastExpr(E);
910}
911
912Sema::OwningExprResult
913TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
914 return VisitCXXNamedCastExpr(E);
915}
916
Anders Carlsson0712d292009-05-15 20:26:03 +0000917Sema::OwningExprResult
918TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
919 QualType ThisType =
920 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
921
922 CXXThisExpr *TE =
923 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
924
925 return SemaRef.Owned(TE);
926}
927
Douglas Gregoraa6af222009-03-25 00:27:28 +0000928Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000929TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
930 if (E->isTypeOperand()) {
931 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
932 TemplateArgs,
933 /*FIXME*/E->getSourceRange().getBegin(),
934 DeclarationName());
935 if (T.isNull())
936 return SemaRef.ExprError();
937
938 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
939 /*FIXME*/E->getSourceRange().getBegin(),
940 true, T.getAsOpaquePtr(),
941 E->getSourceRange().getEnd());
942 }
943
944 OwningExprResult Operand = Visit(E->getExprOperand());
945 if (Operand.isInvalid())
946 return SemaRef.ExprError();
947
948 OwningExprResult Result
949 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
950 /*FIXME*/E->getSourceRange().getBegin(),
951 false, Operand.get(),
952 E->getSourceRange().getEnd());
953 if (Result.isInvalid())
954 return SemaRef.ExprError();
955
956 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
957 return move(Result);
958}
959
960Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +0000961TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
962 OwningExprResult SubExpr(SemaRef, (void *)0);
963 if (E->getSubExpr()) {
964 SubExpr = Visit(E->getSubExpr());
965 if (SubExpr.isInvalid())
966 return SemaRef.ExprError();
967 }
968
969 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
970}
971
Douglas Gregore30d0bd2009-05-22 23:47:06 +0000972Sema::OwningExprResult
973TemplateExprInstantiator::VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
974 assert(false &&
975 "FIXME: Instantiation for default arguments is unimplemented");
976 return SemaRef.ExprError();
977}
978
Douglas Gregor42e5b502009-05-21 17:37:52 +0000979Sema::OwningExprResult
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000980TemplateExprInstantiator::VisitCXXBindTemporaryExpr(
981 CXXBindTemporaryExpr *E) {
982 OwningExprResult SubExpr = Visit(E->getSubExpr());
983 if (SubExpr.isInvalid())
984 return SemaRef.ExprError();
985
Anders Carlsson464f4f32009-05-30 20:52:37 +0000986 return SemaRef.MaybeBindToTemporary(SubExpr.takeAs<Expr>());
Anders Carlssonfceb0a82009-05-30 20:03:25 +0000987}
988
989Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +0000990TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
991 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
992 ->isDependentType() && "Dependent constructor shouldn't be here");
993
994 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
995 /*FIXME*/E->getSourceRange().getBegin(),
996 DeclarationName());
997 if (T.isNull())
998 return SemaRef.ExprError();
999
Douglas Gregord7e27052009-05-20 22:33:37 +00001000 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +00001001 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
1002 ArgEnd = E->arg_end();
1003 Arg != ArgEnd; ++Arg) {
1004 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001005 if (ArgInst.isInvalid())
1006 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001007
1008 Args.push_back(ArgInst.takeAs<Expr>());
1009 }
1010
Anders Carlsson8e587a12009-05-30 20:56:46 +00001011 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, T,
Douglas Gregord94546a2009-05-20 21:38:11 +00001012 E->getConstructor(),
1013 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +00001014 Args.takeAs<Expr>(),
1015 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001016}
1017
1018Sema::OwningExprResult
1019TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1020 CXXFunctionalCastExpr *E) {
1021 // Instantiate the type that we're casting to.
1022 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1023 TemplateArgs,
1024 E->getTypeBeginLoc(),
1025 DeclarationName());
1026 if (ExplicitTy.isNull())
1027 return SemaRef.ExprError();
1028
1029 // Instantiate the subexpression.
1030 OwningExprResult SubExpr = Visit(E->getSubExpr());
1031 if (SubExpr.isInvalid())
1032 return SemaRef.ExprError();
1033
1034 // FIXME: The end of the type's source range is wrong
1035 Expr *Sub = SubExpr.takeAs<Expr>();
1036 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1037 ExplicitTy.getAsOpaquePtr(),
1038 /*FIXME:*/E->getTypeBeginLoc(),
1039 Sema::MultiExprArg(SemaRef,
1040 (void **)&Sub,
1041 1),
1042 0,
1043 E->getRParenLoc());
1044}
1045
1046Sema::OwningExprResult
1047TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1048 return SemaRef.Clone(E);
1049}
1050
1051Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001052TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1053 // Instantiate the type that we're allocating
1054 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1055 TemplateArgs,
1056 /*FIXME:*/E->getSourceRange().getBegin(),
1057 DeclarationName());
1058 if (AllocType.isNull())
1059 return SemaRef.ExprError();
1060
1061 // Instantiate the size of the array we're allocating (if any).
1062 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1063 TemplateArgs);
1064 if (ArraySize.isInvalid())
1065 return SemaRef.ExprError();
1066
1067 // Instantiate the placement arguments (if any).
1068 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1069 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1070 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1071 if (Arg.isInvalid())
1072 return SemaRef.ExprError();
1073
1074 PlacementArgs.push_back(Arg.take());
1075 }
1076
1077 // Instantiate the constructor arguments (if any).
1078 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1079 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1080 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1081 if (Arg.isInvalid())
1082 return SemaRef.ExprError();
1083
1084 ConstructorArgs.push_back(Arg.take());
1085 }
1086
1087 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1088 E->isGlobalNew(),
1089 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001090 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001091 /*FIXME*/SourceLocation(),
1092 E->isParenTypeId(),
1093 AllocType,
1094 /*FIXME*/E->getSourceRange().getBegin(),
1095 SourceRange(),
1096 move(ArraySize),
1097 /*FIXME*/SourceLocation(),
1098 Sema::MultiExprArg(SemaRef,
1099 ConstructorArgs.take(),
1100 ConstructorArgs.size()),
1101 E->getSourceRange().getEnd());
1102}
1103
1104Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001105TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1106 OwningExprResult Operand = Visit(E->getArgument());
1107 if (Operand.isInvalid())
1108 return SemaRef.ExprError();
1109
1110 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1111 E->isGlobalDelete(),
1112 E->isArrayForm(),
1113 move(Operand));
1114}
1115
1116Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001117TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1118 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1119 /*FIXME*/E->getSourceRange().getBegin(),
1120 DeclarationName());
1121 if (T.isNull())
1122 return SemaRef.ExprError();
1123
1124 SourceLocation FakeLParenLoc
1125 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1126 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1127 E->getSourceRange().getBegin(),
1128 /*FIXME*/FakeLParenLoc,
1129 T.getAsOpaquePtr(),
1130 E->getSourceRange().getEnd());
1131}
1132
1133Sema::OwningExprResult
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001134TemplateExprInstantiator::VisitQualifiedDeclRefExpr(QualifiedDeclRefExpr *E) {
1135 NestedNameSpecifier *NNS
1136 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
1137 E->getQualifierRange(),
1138 TemplateArgs);
1139 if (!NNS)
1140 return SemaRef.ExprError();
1141
1142 CXXScopeSpec SS;
1143 SS.setRange(E->getQualifierRange());
1144 SS.setScopeRep(NNS);
1145 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0,
1146 E->getLocation(),
1147 E->getDecl()->getDeclName(),
1148 /*Trailing lparen=*/false,
1149 &SS,
1150 /*FIXME:*/false);
1151}
1152
1153Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001154TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1155 CXXExprWithTemporaries *E) {
1156 OwningExprResult SubExpr = Visit(E->getSubExpr());
1157 if (SubExpr.isInvalid())
1158 return SemaRef.ExprError();
1159
1160 return SemaRef.ActOnFinishFullExpr(move(SubExpr));
1161}
1162
1163Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001164TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1165 CXXUnresolvedConstructExpr *E) {
1166 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1167 E->getTypeBeginLoc(),
1168 DeclarationName());
1169 if (T.isNull())
1170 return SemaRef.ExprError();
1171
Douglas Gregord7e27052009-05-20 22:33:37 +00001172 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001173 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1174 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1175 ArgEnd = E->arg_end();
1176 Arg != ArgEnd; ++Arg) {
1177 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001178 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001179 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001180
1181 FakeCommaLocs.push_back(
1182 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1183 Args.push_back(InstArg.takeAs<Expr>());
1184 }
1185
1186 // FIXME: The end of the type range isn't exactly correct.
1187 // FIXME: we're faking the locations of the commas
1188 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1189 E->getLParenLoc()),
1190 T.getAsOpaquePtr(),
1191 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001192 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001193 &FakeCommaLocs.front(),
1194 E->getRParenLoc());
1195}
1196
1197Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001198TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
1199 CXXUnresolvedMemberExpr *E) {
1200 // Instantiate the base of the expression.
1201 OwningExprResult Base = Visit(E->getBase());
1202 if (Base.isInvalid())
1203 return SemaRef.ExprError();
1204
1205 // FIXME: Instantiate the declaration name.
1206 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1207 move(Base), E->getOperatorLoc(),
1208 E->isArrow()? tok::arrow
1209 : tok::period,
1210 E->getMemberLoc(),
1211 /*FIXME:*/*E->getMember().getAsIdentifierInfo(),
1212 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1213}
1214
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001215//----------------------------------------------------------------------------
1216// Objective-C Expressions
1217//----------------------------------------------------------------------------
1218Sema::OwningExprResult
1219TemplateExprInstantiator::VisitObjCStringLiteral(ObjCStringLiteral *E) {
1220 assert(false && "FIXME: Template instantiations for ObjC expressions");
1221 return SemaRef.ExprError();
1222}
1223
1224Sema::OwningExprResult
Anders Carlssonfc0f0212009-06-07 18:45:35 +00001225TemplateExprInstantiator::VisitObjCEncodeExpr(ObjCEncodeExpr *E) {
1226 QualType EncodedType = SemaRef.InstantiateType(E->getEncodedType(),
1227 TemplateArgs,
1228 /*FIXME:*/E->getAtLoc(),
1229 DeclarationName());
1230 if (EncodedType.isNull())
1231 return SemaRef.ExprError();
1232
1233 return SemaRef.Owned(SemaRef.BuildObjCEncodeExpression(E->getAtLoc(),
1234 EncodedType,
1235 E->getRParenLoc()));
Douglas Gregore30d0bd2009-05-22 23:47:06 +00001236}
1237
1238Sema::OwningExprResult
1239TemplateExprInstantiator::VisitObjCMessageExpr(ObjCMessageExpr *E) {
1240 assert(false && "FIXME: Template instantiations for ObjC expressions");
1241 return SemaRef.ExprError();
1242}
1243
1244Sema::OwningExprResult
1245TemplateExprInstantiator::VisitObjCSelectorExpr(ObjCSelectorExpr *E) {
1246 assert(false && "FIXME: Template instantiations for ObjC expressions");
1247 return SemaRef.ExprError();
1248}
1249
1250Sema::OwningExprResult
1251TemplateExprInstantiator::VisitObjCProtocolExpr(ObjCProtocolExpr *E) {
1252 assert(false && "FIXME: Template instantiations for ObjC expressions");
1253 return SemaRef.ExprError();
1254}
1255
1256Sema::OwningExprResult
1257TemplateExprInstantiator::VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
1258 assert(false && "FIXME: Template instantiations for ObjC expressions");
1259 return SemaRef.ExprError();
1260}
1261
1262Sema::OwningExprResult
1263TemplateExprInstantiator::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
1264 assert(false && "FIXME: Template instantiations for ObjC expressions");
1265 return SemaRef.ExprError();
1266}
1267
1268Sema::OwningExprResult
1269TemplateExprInstantiator::VisitObjCKVCRefExpr(ObjCKVCRefExpr *E) {
1270 assert(false && "FIXME: Template instantiations for ObjC expressions");
1271 return SemaRef.ExprError();
1272}
1273
1274Sema::OwningExprResult
1275TemplateExprInstantiator::VisitObjCSuperExpr(ObjCSuperExpr *E) {
1276 assert(false && "FIXME: Template instantiations for ObjC expressions");
1277 return SemaRef.ExprError();
1278}
1279
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001280Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001281Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001282 if (!E)
1283 return Owned((Expr *)0);
1284
Douglas Gregor7e063902009-05-11 23:53:27 +00001285 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001286 return Instantiator.Visit(E);
1287}