blob: 92a152c2e3fcf8bbd4a268630762436adc6bf82e [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"
19#include "clang/Lex/Preprocessor.h" // for the identifier table
20#include "llvm/Support/Compiler.h"
21using namespace clang;
22
23namespace {
24 class VISIBILITY_HIDDEN TemplateExprInstantiator
25 : public StmtVisitor<TemplateExprInstantiator, Sema::OwningExprResult> {
26 Sema &SemaRef;
Douglas Gregor7e063902009-05-11 23:53:27 +000027 const TemplateArgumentList &TemplateArgs;
Douglas Gregoraa6af222009-03-25 00:27:28 +000028
29 public:
30 typedef Sema::OwningExprResult OwningExprResult;
31
32 TemplateExprInstantiator(Sema &SemaRef,
Douglas Gregor7e063902009-05-11 23:53:27 +000033 const TemplateArgumentList &TemplateArgs)
34 : SemaRef(SemaRef), TemplateArgs(TemplateArgs) { }
Douglas Gregoraa6af222009-03-25 00:27:28 +000035
Mike Stump390b4cc2009-05-16 07:39:55 +000036 // FIXME: Once we get closer to completion, replace these manually-written
37 // declarations with automatically-generated ones from
38 // clang/AST/StmtNodes.def.
Sebastian Redl8b0b4752009-05-16 18:50:46 +000039 OwningExprResult VisitPredefinedExpr(PredefinedExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000040 OwningExprResult VisitIntegerLiteral(IntegerLiteral *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000041 OwningExprResult VisitFloatingLiteral(FloatingLiteral *E);
42 OwningExprResult VisitStringLiteral(StringLiteral *E);
43 OwningExprResult VisitCharacterLiteral(CharacterLiteral *E);
Douglas Gregord8ac4362009-05-18 22:38:38 +000044 OwningExprResult VisitImaginaryLiteral(ImaginaryLiteral *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000045 OwningExprResult VisitDeclRefExpr(DeclRefExpr *E);
46 OwningExprResult VisitParenExpr(ParenExpr *E);
47 OwningExprResult VisitUnaryOperator(UnaryOperator *E);
Douglas Gregor3384c9c2009-05-19 00:01:19 +000048 OwningExprResult VisitArraySubscriptExpr(ArraySubscriptExpr *E);
Douglas Gregor4a2487a2009-05-19 00:38:01 +000049 OwningExprResult VisitCallExpr(CallExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000050 // FIXME: VisitMemberExpr
51 // FIXME: CompoundLiteralExpr
Douglas Gregoraa6af222009-03-25 00:27:28 +000052 OwningExprResult VisitBinaryOperator(BinaryOperator *E);
Douglas Gregor6731c312009-05-19 20:02:01 +000053 OwningExprResult VisitCompoundAssignOperator(CompoundAssignOperator *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000054 OwningExprResult VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
Douglas Gregor4a2e2042009-05-15 21:45:53 +000055 OwningExprResult VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000056 OwningExprResult VisitConditionalOperator(ConditionalOperator *E);
Douglas Gregorcd938172009-05-19 20:31:21 +000057 // FIXME: AddrLabelExpr
58 OwningExprResult VisitStmtExpr(StmtExpr *E);
Douglas Gregordc241b42009-05-19 20:55:31 +000059 OwningExprResult VisitTypesCompatibleExpr(TypesCompatibleExpr *E);
Douglas Gregorcde01732009-05-19 22:10:17 +000060 OwningExprResult VisitShuffleVectorExpr(ShuffleVectorExpr *E);
Douglas Gregorc9ecc572009-05-19 22:43:30 +000061 OwningExprResult VisitChooseExpr(ChooseExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000062 OwningExprResult VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
63 OwningExprResult VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E);
64 OwningExprResult VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000065 OwningExprResult VisitCastExpr(CastExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000066 OwningExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000067 OwningExprResult VisitExplicitCastExpr(ExplicitCastExpr *E);
68 OwningExprResult VisitCStyleCastExpr(CStyleCastExpr *E);
69 OwningExprResult VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
70 OwningExprResult VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
71 OwningExprResult VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
72 OwningExprResult VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
73 OwningExprResult VisitCXXConstCastExpr(CXXConstCastExpr *E);
Anders Carlsson0712d292009-05-15 20:26:03 +000074 OwningExprResult VisitCXXThisExpr(CXXThisExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000075 OwningExprResult VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
76 OwningExprResult VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
77 OwningExprResult VisitGNUNullExpr(GNUNullExpr *E);
Douglas Gregor4a2487a2009-05-19 00:38:01 +000078 OwningExprResult VisitUnresolvedFunctionNameExpr(
79 UnresolvedFunctionNameExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000080
Douglas Gregoraa6af222009-03-25 00:27:28 +000081 // Base case. I'm supposed to ignore this.
82 Sema::OwningExprResult VisitStmt(Stmt *S) {
83 S->dump();
84 assert(false && "Cannot instantiate this kind of expression");
85 return SemaRef.ExprError();
86 }
87 };
88}
89
Sebastian Redl8b0b4752009-05-16 18:50:46 +000090Sema::OwningExprResult
91TemplateExprInstantiator::VisitPredefinedExpr(PredefinedExpr *E) {
92 return SemaRef.Clone(E);
93}
94
95Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +000096TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) {
97 return SemaRef.Clone(E);
98}
99
100Sema::OwningExprResult
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000101TemplateExprInstantiator::VisitFloatingLiteral(FloatingLiteral *E) {
102 return SemaRef.Clone(E);
103}
104
105Sema::OwningExprResult
106TemplateExprInstantiator::VisitStringLiteral(StringLiteral *E) {
107 return SemaRef.Clone(E);
108}
109
110Sema::OwningExprResult
111TemplateExprInstantiator::VisitCharacterLiteral(CharacterLiteral *E) {
112 return SemaRef.Clone(E);
113}
114
Douglas Gregord8ac4362009-05-18 22:38:38 +0000115Sema::OwningExprResult
116TemplateExprInstantiator::VisitImaginaryLiteral(ImaginaryLiteral *E) {
117 return SemaRef.Clone(E);
118}
119
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000120Sema::OwningExprResult
121TemplateExprInstantiator::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
122 return SemaRef.Clone(E);
123}
124
125Sema::OwningExprResult
126TemplateExprInstantiator::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
127 return SemaRef.Clone(E);
128}
129
130Sema::OwningExprResult
131TemplateExprInstantiator::VisitGNUNullExpr(GNUNullExpr *E) {
132 return SemaRef.Clone(E);
133}
134
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000135Sema::OwningExprResult
136TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr(
137 UnresolvedFunctionNameExpr *E) {
138 return SemaRef.Clone(E);
139}
140
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000141Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000142TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
143 Decl *D = E->getDecl();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000144 ValueDecl *NewD = 0;
Douglas Gregoraa6af222009-03-25 00:27:28 +0000145 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
146 assert(NTTP->getDepth() == 0 && "No nested templates yet");
147 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
148 QualType T = Arg.getIntegralType();
149 if (T->isCharType() || T->isWideCharType())
150 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
151 Arg.getAsIntegral()->getZExtValue(),
152 T->isWideCharType(),
153 T,
154 E->getSourceRange().getBegin()));
155 else if (T->isBooleanType())
156 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
157 Arg.getAsIntegral()->getBoolValue(),
158 T,
159 E->getSourceRange().getBegin()));
160
161 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
162 *Arg.getAsIntegral(),
163 T,
164 E->getSourceRange().getBegin()));
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000165 } else if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D))
166 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Parm);
167 else if (isa<FunctionDecl>(D) || isa<OverloadedFunctionDecl>(D))
168 // FIXME: Instantiate decl!
169 NewD = cast<ValueDecl>(D);
170 else
171 assert(false && "Unhandled declaratrion reference kind");
172
173 if (!NewD)
174 return SemaRef.ExprError();
175
176 QualType T = NewD->getType();
177 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000178 T.getNonReferenceType(),
179 E->getLocation(),
180 T->isDependentType(),
181 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000182}
183
184Sema::OwningExprResult
185TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
186 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
187 if (SubExpr.isInvalid())
188 return SemaRef.ExprError();
189
190 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
191 E->getLParen(), E->getRParen(),
192 (Expr *)SubExpr.release()));
193}
194
195Sema::OwningExprResult
196TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
197 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
198 if (Arg.isInvalid())
199 return SemaRef.ExprError();
200
201 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
202 E->getOpcode(),
203 move(Arg));
204}
205
206Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000207TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
208 Sema::OwningExprResult LHS = Visit(E->getLHS());
209 if (LHS.isInvalid())
210 return SemaRef.ExprError();
211
212 Sema::OwningExprResult RHS = Visit(E->getRHS());
213 if (RHS.isInvalid())
214 return SemaRef.ExprError();
215
216 // Since the overloaded array-subscript operator (operator[]) can
217 // only be a member function, we can make several simplifying
218 // assumptions here:
219 // 1) Normal name lookup (from the current scope) will not ever
220 // find any declarations of operator[] that won't also be found be
221 // member operator lookup, so it is safe to pass a NULL Scope
222 // during the instantiation to avoid the lookup entirely.
223 //
224 // 2) Neither normal name lookup nor argument-dependent lookup at
225 // template definition time will find any operators that won't be
226 // found at template instantiation time, so we do not need to
227 // cache the results of name lookup as we do for the binary
228 // operators.
229 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
230 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
231 /*FIXME:*/LLocFake,
232 move(RHS),
233 E->getRBracketLoc());
234}
235
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000236Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
237 // Instantiate callee
238 OwningExprResult Callee = Visit(E->getCallee());
239 if (Callee.isInvalid())
240 return SemaRef.ExprError();
241
242 // Instantiate arguments
243 llvm::SmallVector<Expr*, 8> Args;
244 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
245 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
246 OwningExprResult Arg = Visit(E->getArg(I));
247 if (Arg.isInvalid()) {
248 for (unsigned Victim = 0; Victim != I; ++Victim)
249 Args[Victim]->Destroy(SemaRef.Context);
250 return SemaRef.ExprError();
251 }
252
253 FakeCommaLocs.push_back(
254 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
255 Args.push_back(Arg.takeAs<Expr>());
256 }
257
258 SourceLocation FakeLParenLoc
259 = ((Expr *)Callee.get())->getSourceRange().getBegin();
260 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
261 /*FIXME:*/FakeLParenLoc,
262 Sema::MultiExprArg(SemaRef,
263 (void **)&Args.front(),
264 Args.size()),
265 /*FIXME:*/&FakeCommaLocs.front(),
266 E->getRParenLoc());
267}
268
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000269Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000270TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
271 Sema::OwningExprResult LHS = Visit(E->getLHS());
272 if (LHS.isInvalid())
273 return SemaRef.ExprError();
274
275 Sema::OwningExprResult RHS = Visit(E->getRHS());
276 if (RHS.isInvalid())
277 return SemaRef.ExprError();
278
279 Sema::OwningExprResult Result
280 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
281 E->getOpcode(),
282 (Expr *)LHS.get(),
283 (Expr *)RHS.get());
284 if (Result.isInvalid())
285 return SemaRef.ExprError();
286
287 LHS.release();
288 RHS.release();
289 return move(Result);
290}
291
292Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000293TemplateExprInstantiator::VisitCompoundAssignOperator(
294 CompoundAssignOperator *E) {
295 return VisitBinaryOperator(E);
296}
297
298Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000299TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
300 Sema::OwningExprResult First = Visit(E->getArg(0));
301 if (First.isInvalid())
302 return SemaRef.ExprError();
303
304 Expr *Args[2] = { (Expr *)First.get(), 0 };
305
306 Sema::OwningExprResult Second(SemaRef);
307 if (E->getNumArgs() == 2) {
308 Second = Visit(E->getArg(1));
309
310 if (Second.isInvalid())
311 return SemaRef.ExprError();
312
313 Args[1] = (Expr *)Second.get();
314 }
315
316 if (!E->isTypeDependent()) {
317 // Since our original expression was not type-dependent, we do not
318 // perform lookup again at instantiation time (C++ [temp.dep]p1).
319 // Instead, we just build the new overloaded operator call
320 // expression.
321 First.release();
322 Second.release();
323 // FIXME: Don't reuse the callee here. We need to instantiate it.
324 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
325 SemaRef.Context,
326 E->getOperator(),
327 E->getCallee(),
328 Args, E->getNumArgs(),
329 E->getType(),
330 E->getOperatorLoc()));
331 }
332
333 bool isPostIncDec = E->getNumArgs() == 2 &&
334 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
335 if (E->getNumArgs() == 1 || isPostIncDec) {
336 if (!Args[0]->getType()->isOverloadableType()) {
337 // The argument is not of overloadable type, so try to create a
338 // built-in unary operation.
339 UnaryOperator::Opcode Opc
340 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
341
342 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
343 move(First));
344 }
345
346 // Fall through to perform overload resolution
347 } else {
348 assert(E->getNumArgs() == 2 && "Expected binary operation");
349
350 Sema::OwningExprResult Result(SemaRef);
351 if (!Args[0]->getType()->isOverloadableType() &&
352 !Args[1]->getType()->isOverloadableType()) {
353 // Neither of the arguments is an overloadable type, so try to
354 // create a built-in binary operation.
355 BinaryOperator::Opcode Opc =
356 BinaryOperator::getOverloadedOpcode(E->getOperator());
357 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
358 Args[0], Args[1]);
359 if (Result.isInvalid())
360 return SemaRef.ExprError();
361
362 First.release();
363 Second.release();
364 return move(Result);
365 }
366
367 // Fall through to perform overload resolution.
368 }
369
370 // Compute the set of functions that were found at template
371 // definition time.
372 Sema::FunctionSet Functions;
373 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
374 OverloadedFunctionDecl *Overloads
375 = cast<OverloadedFunctionDecl>(DRE->getDecl());
376
377 // FIXME: Do we have to check
378 // IsAcceptableNonMemberOperatorCandidate for each of these?
379 for (OverloadedFunctionDecl::function_iterator
380 F = Overloads->function_begin(),
381 FEnd = Overloads->function_end();
382 F != FEnd; ++F)
383 Functions.insert(*F);
384
385 // Add any functions found via argument-dependent lookup.
386 DeclarationName OpName
387 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
388 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
389
390 // Create the overloaded operator invocation.
391 if (E->getNumArgs() == 1 || isPostIncDec) {
392 UnaryOperator::Opcode Opc
393 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
394 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
395 Functions, move(First));
396 }
397
Mike Stump390b4cc2009-05-16 07:39:55 +0000398 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
399 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000400 BinaryOperator::Opcode Opc =
401 BinaryOperator::getOverloadedOpcode(E->getOperator());
402 OwningExprResult Result
403 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
404 Functions, Args[0], Args[1]);
405
406 if (Result.isInvalid())
407 return SemaRef.ExprError();
408
409 First.release();
410 Second.release();
411 return move(Result);
412}
413
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000414Sema::OwningExprResult
415TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
416 VarDecl *Var
417 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
418 SemaRef.CurContext,
419 TemplateArgs));
420 if (!Var)
421 return SemaRef.ExprError();
422
423 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
424 E->getStartLoc(),
425 SourceLocation(),
426 Var));
427}
428
Douglas Gregoraa6af222009-03-25 00:27:28 +0000429Sema::OwningExprResult
430TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
431 Sema::OwningExprResult Cond = Visit(E->getCond());
432 if (Cond.isInvalid())
433 return SemaRef.ExprError();
434
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000435 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
436 TemplateArgs);
437 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000438 return SemaRef.ExprError();
439
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000440 Sema::OwningExprResult RHS = Visit(E->getRHS());
441 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000442 return SemaRef.ExprError();
443
444 if (!E->isTypeDependent()) {
445 // Since our original expression was not type-dependent, we do not
446 // perform lookup again at instantiation time (C++ [temp.dep]p1).
447 // Instead, we just build the new conditional operator call expression.
448 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
449 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000450 LHS.takeAs<Expr>(),
451 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000452 E->getType()));
453 }
454
455
456 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
457 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000458 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000459}
460
Douglas Gregorcd938172009-05-19 20:31:21 +0000461Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
462 Sema::OwningStmtResult SubStmt = SemaRef.InstantiateStmt(E->getSubStmt(),
463 TemplateArgs);
464 if (SubStmt.isInvalid())
465 return SemaRef.ExprError();
466
467 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
468 E->getRParenLoc());
469}
470
Douglas Gregoraa6af222009-03-25 00:27:28 +0000471Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000472TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000473 assert(false && "__builtin_types_compatible_p is not legal in C++");
474 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000475}
476
477Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000478TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
479 // FIXME: Better solution for this!
480 llvm::SmallVector<Expr *, 8> SubExprs;
481 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
482 OwningExprResult SubExpr = Visit(E->getExpr(I));
483 if (SubExpr.isInvalid()) {
484 for (unsigned Victim = 0; Victim != I; ++Victim)
485 SubExprs[I]->Destroy(SemaRef.Context);
486 return SemaRef.ExprError();
487 }
488
489 SubExprs.push_back(SubExpr.takeAs<Expr>());
490 }
491
492 // Find the declaration for __builtin_shufflevector
493 const IdentifierInfo &Name
494 = SemaRef.Context.Idents.get("__builtin_shufflevector");
495 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
496 DeclContext::lookup_result Lookup
497 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
498 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
499
500 // Build a reference to the __builtin_shufflevector builtin
501 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
502 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
503 E->getBuiltinLoc(),
504 false, false);
505 SemaRef.UsualUnaryConversions(Callee);
506
507 // Build the CallExpr
508 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
509 &SubExprs[0],
510 SubExprs.size(),
511 Builtin->getResultType(),
512 E->getRParenLoc());
513 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
514
515 // Type-check the __builtin_shufflevector expression.
516 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
517 if (Result.isInvalid())
518 return SemaRef.ExprError();
519
520 OwnedCall.release();
521 return move(Result);
522}
523
524Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000525TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
526 OwningExprResult Cond = Visit(E->getCond());
527 if (Cond.isInvalid())
528 return SemaRef.ExprError();
529
530 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
531 if (LHS.isInvalid())
532 return SemaRef.ExprError();
533
534 OwningExprResult RHS = Visit(E->getRHS());
535 if (RHS.isInvalid())
536 return SemaRef.ExprError();
537
538 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
539 move(Cond), move(LHS), move(RHS),
540 E->getRParenLoc());
541}
542
543Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000544TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
545 bool isSizeOf = E->isSizeOf();
546
547 if (E->isArgumentType()) {
548 QualType T = E->getArgumentType();
549 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000550 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000551 /*FIXME*/E->getOperatorLoc(),
552 &SemaRef.PP.getIdentifierTable().get("sizeof"));
553 if (T.isNull())
554 return SemaRef.ExprError();
555 }
556
557 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
558 E->getSourceRange());
559 }
560
561 Sema::OwningExprResult Arg = Visit(E->getArgumentExpr());
562 if (Arg.isInvalid())
563 return SemaRef.ExprError();
564
565 Sema::OwningExprResult Result
566 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
567 isSizeOf, E->getSourceRange());
568 if (Result.isInvalid())
569 return SemaRef.ExprError();
570
571 Arg.release();
572 return move(Result);
573}
574
575Sema::OwningExprResult
576TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000577 NestedNameSpecifier *NNS
578 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
579 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000580 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000581 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000582 return SemaRef.ExprError();
583
Douglas Gregorab452ba2009-03-26 23:50:42 +0000584 CXXScopeSpec SS;
585 SS.setRange(E->getQualifierRange());
586 SS.setScopeRep(NNS);
587
Douglas Gregoraa6af222009-03-25 00:27:28 +0000588 // FIXME: We're passing in a NULL scope, because
589 // ActOnDeclarationNameExpr doesn't actually use the scope when we
590 // give it a non-empty scope specifier. Investigate whether it would
591 // be better to refactor ActOnDeclarationNameExpr.
592 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
593 E->getDeclName(),
594 /*HasTrailingLParen=*/false,
595 &SS,
596 /*FIXME:isAddressOfOperand=*/false);
597}
598
599Sema::OwningExprResult
600TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
601 CXXTemporaryObjectExpr *E) {
602 QualType T = E->getType();
603 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000604 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000605 E->getTypeBeginLoc(), DeclarationName());
606 if (T.isNull())
607 return SemaRef.ExprError();
608 }
609
610 llvm::SmallVector<Expr *, 16> Args;
611 Args.reserve(E->getNumArgs());
612 bool Invalid = false;
613 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
614 ArgEnd = E->arg_end();
615 Arg != ArgEnd; ++Arg) {
616 OwningExprResult InstantiatedArg = Visit(*Arg);
617 if (InstantiatedArg.isInvalid()) {
618 Invalid = true;
619 break;
620 }
621
622 Args.push_back((Expr *)InstantiatedArg.release());
623 }
624
625 if (!Invalid) {
626 SourceLocation CommaLoc;
627 // FIXME: HACK!
628 if (Args.size() > 1)
629 CommaLoc
630 = SemaRef.PP.getLocForEndOfToken(Args[0]->getSourceRange().getEnd());
631 Sema::OwningExprResult Result(
632 SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
633 /*, FIXME*/),
634 T.getAsOpaquePtr(),
635 /*FIXME*/E->getTypeBeginLoc(),
636 Sema::MultiExprArg(SemaRef,
637 (void**)&Args[0],
638 Args.size()),
639 /*HACK*/&CommaLoc,
640 E->getSourceRange().getEnd()));
641 // At this point, Args no longer owns the arguments, no matter what.
642 return move(Result);
643 }
644
645 // Clean up the instantiated arguments.
646 // FIXME: Would rather do this with RAII.
647 for (unsigned Idx = 0; Idx < Args.size(); ++Idx)
648 SemaRef.DeleteExpr(Args[Idx]);
649
650 return SemaRef.ExprError();
651}
652
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000653Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
654 assert(false && "Cannot instantiate abstract CastExpr");
655 return SemaRef.ExprError();
656}
657
Douglas Gregoraa6af222009-03-25 00:27:28 +0000658Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
659 ImplicitCastExpr *E) {
660 assert(!E->isTypeDependent() && "Implicit casts must have known types");
661
662 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
663 if (SubExpr.isInvalid())
664 return SemaRef.ExprError();
665
666 ImplicitCastExpr *ICE =
667 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
668 (Expr *)SubExpr.release(),
669 E->isLvalueCast());
670 return SemaRef.Owned(ICE);
671}
672
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000673Sema::OwningExprResult
674TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
675 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
676 return SemaRef.ExprError();
677}
678
679Sema::OwningExprResult
680TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
681 // Instantiate the type that we're casting to.
682 SourceLocation TypeStartLoc
683 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
684 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
685 TemplateArgs,
686 TypeStartLoc,
687 DeclarationName());
688 if (ExplicitTy.isNull())
689 return SemaRef.ExprError();
690
691 // Instantiate the subexpression.
692 OwningExprResult SubExpr = Visit(E->getSubExpr());
693 if (SubExpr.isInvalid())
694 return SemaRef.ExprError();
695
696 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
697 ExplicitTy.getAsOpaquePtr(),
698 E->getRParenLoc(),
699 move(SubExpr));
700}
701
702Sema::OwningExprResult
703TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
704 // Figure out which cast operator we're dealing with.
705 tok::TokenKind Kind;
706 switch (E->getStmtClass()) {
707 case Stmt::CXXStaticCastExprClass:
708 Kind = tok::kw_static_cast;
709 break;
710
711 case Stmt::CXXDynamicCastExprClass:
712 Kind = tok::kw_dynamic_cast;
713 break;
714
715 case Stmt::CXXReinterpretCastExprClass:
716 Kind = tok::kw_reinterpret_cast;
717 break;
718
719 case Stmt::CXXConstCastExprClass:
720 Kind = tok::kw_const_cast;
721 break;
722
723 default:
724 assert(false && "Invalid C++ named cast");
725 return SemaRef.ExprError();
726 }
727
728 // Instantiate the type that we're casting to.
729 SourceLocation TypeStartLoc
730 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
731 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
732 TemplateArgs,
733 TypeStartLoc,
734 DeclarationName());
735 if (ExplicitTy.isNull())
736 return SemaRef.ExprError();
737
738 // Instantiate the subexpression.
739 OwningExprResult SubExpr = Visit(E->getSubExpr());
740 if (SubExpr.isInvalid())
741 return SemaRef.ExprError();
742
743 SourceLocation FakeLAngleLoc
744 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
745 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
746 SourceLocation FakeRParenLoc
747 = SemaRef.PP.getLocForEndOfToken(
748 E->getSubExpr()->getSourceRange().getEnd());
749 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
750 /*FIXME:*/FakeLAngleLoc,
751 ExplicitTy.getAsOpaquePtr(),
752 /*FIXME:*/FakeRAngleLoc,
753 /*FIXME:*/FakeRAngleLoc,
754 move(SubExpr),
755 /*FIXME:*/FakeRParenLoc);
756}
757
758Sema::OwningExprResult
759TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
760 return VisitCXXNamedCastExpr(E);
761}
762
763Sema::OwningExprResult
764TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
765 return VisitCXXNamedCastExpr(E);
766}
767
768Sema::OwningExprResult
769TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
770 CXXReinterpretCastExpr *E) {
771 return VisitCXXNamedCastExpr(E);
772}
773
774Sema::OwningExprResult
775TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
776 return VisitCXXNamedCastExpr(E);
777}
778
Anders Carlsson0712d292009-05-15 20:26:03 +0000779Sema::OwningExprResult
780TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
781 QualType ThisType =
782 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
783
784 CXXThisExpr *TE =
785 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
786
787 return SemaRef.Owned(TE);
788}
789
Douglas Gregoraa6af222009-03-25 00:27:28 +0000790Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +0000791Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +0000792 if (!E)
793 return Owned((Expr *)0);
794
Douglas Gregor7e063902009-05-11 23:53:27 +0000795 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000796 return Instantiator.Visit(E);
797}