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