blob: 56126d45046b3a9505cb0fe65eac02cfbf519438 [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 Gregordd027302009-05-19 23:10:31 +000062 OwningExprResult VisitVAArgExpr(VAArgExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000063 OwningExprResult VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
64 OwningExprResult VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E);
65 OwningExprResult VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000066 OwningExprResult VisitCastExpr(CastExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000067 OwningExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000068 OwningExprResult VisitExplicitCastExpr(ExplicitCastExpr *E);
69 OwningExprResult VisitCStyleCastExpr(CStyleCastExpr *E);
70 OwningExprResult VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
71 OwningExprResult VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
72 OwningExprResult VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
73 OwningExprResult VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
74 OwningExprResult VisitCXXConstCastExpr(CXXConstCastExpr *E);
Anders Carlsson0712d292009-05-15 20:26:03 +000075 OwningExprResult VisitCXXThisExpr(CXXThisExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000076 OwningExprResult VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
77 OwningExprResult VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
78 OwningExprResult VisitGNUNullExpr(GNUNullExpr *E);
Douglas Gregor4a2487a2009-05-19 00:38:01 +000079 OwningExprResult VisitUnresolvedFunctionNameExpr(
80 UnresolvedFunctionNameExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000081
Douglas Gregoraa6af222009-03-25 00:27:28 +000082 // Base case. I'm supposed to ignore this.
83 Sema::OwningExprResult VisitStmt(Stmt *S) {
84 S->dump();
85 assert(false && "Cannot instantiate this kind of expression");
86 return SemaRef.ExprError();
87 }
88 };
89}
90
Sebastian Redl8b0b4752009-05-16 18:50:46 +000091Sema::OwningExprResult
92TemplateExprInstantiator::VisitPredefinedExpr(PredefinedExpr *E) {
93 return SemaRef.Clone(E);
94}
95
96Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +000097TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) {
98 return SemaRef.Clone(E);
99}
100
101Sema::OwningExprResult
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000102TemplateExprInstantiator::VisitFloatingLiteral(FloatingLiteral *E) {
103 return SemaRef.Clone(E);
104}
105
106Sema::OwningExprResult
107TemplateExprInstantiator::VisitStringLiteral(StringLiteral *E) {
108 return SemaRef.Clone(E);
109}
110
111Sema::OwningExprResult
112TemplateExprInstantiator::VisitCharacterLiteral(CharacterLiteral *E) {
113 return SemaRef.Clone(E);
114}
115
Douglas Gregord8ac4362009-05-18 22:38:38 +0000116Sema::OwningExprResult
117TemplateExprInstantiator::VisitImaginaryLiteral(ImaginaryLiteral *E) {
118 return SemaRef.Clone(E);
119}
120
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000121Sema::OwningExprResult
122TemplateExprInstantiator::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
123 return SemaRef.Clone(E);
124}
125
126Sema::OwningExprResult
127TemplateExprInstantiator::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
128 return SemaRef.Clone(E);
129}
130
131Sema::OwningExprResult
132TemplateExprInstantiator::VisitGNUNullExpr(GNUNullExpr *E) {
133 return SemaRef.Clone(E);
134}
135
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000136Sema::OwningExprResult
137TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr(
138 UnresolvedFunctionNameExpr *E) {
139 return SemaRef.Clone(E);
140}
141
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000142Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000143TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
144 Decl *D = E->getDecl();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000145 ValueDecl *NewD = 0;
Douglas Gregoraa6af222009-03-25 00:27:28 +0000146 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
147 assert(NTTP->getDepth() == 0 && "No nested templates yet");
148 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
149 QualType T = Arg.getIntegralType();
150 if (T->isCharType() || T->isWideCharType())
151 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
152 Arg.getAsIntegral()->getZExtValue(),
153 T->isWideCharType(),
154 T,
155 E->getSourceRange().getBegin()));
156 else if (T->isBooleanType())
157 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
158 Arg.getAsIntegral()->getBoolValue(),
159 T,
160 E->getSourceRange().getBegin()));
161
162 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
163 *Arg.getAsIntegral(),
164 T,
165 E->getSourceRange().getBegin()));
Douglas Gregordd027302009-05-19 23:10:31 +0000166 } else if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000167 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Parm);
Douglas Gregordd027302009-05-19 23:10:31 +0000168 } else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
169 if (Var->hasLocalStorage())
170 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Var);
171 else
172 assert(false && "Cannot instantiation non-local variable declarations");
173 } else if (isa<FunctionDecl>(D) || isa<OverloadedFunctionDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000174 // FIXME: Instantiate decl!
175 NewD = cast<ValueDecl>(D);
Douglas Gregordd027302009-05-19 23:10:31 +0000176 } else
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000177 assert(false && "Unhandled declaratrion reference kind");
178
179 if (!NewD)
180 return SemaRef.ExprError();
181
182 QualType T = NewD->getType();
183 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000184 T.getNonReferenceType(),
185 E->getLocation(),
186 T->isDependentType(),
187 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000188}
189
190Sema::OwningExprResult
191TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
192 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
193 if (SubExpr.isInvalid())
194 return SemaRef.ExprError();
195
196 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
197 E->getLParen(), E->getRParen(),
198 (Expr *)SubExpr.release()));
199}
200
201Sema::OwningExprResult
202TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
203 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
204 if (Arg.isInvalid())
205 return SemaRef.ExprError();
206
207 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
208 E->getOpcode(),
209 move(Arg));
210}
211
212Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000213TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
214 Sema::OwningExprResult LHS = Visit(E->getLHS());
215 if (LHS.isInvalid())
216 return SemaRef.ExprError();
217
218 Sema::OwningExprResult RHS = Visit(E->getRHS());
219 if (RHS.isInvalid())
220 return SemaRef.ExprError();
221
222 // Since the overloaded array-subscript operator (operator[]) can
223 // only be a member function, we can make several simplifying
224 // assumptions here:
225 // 1) Normal name lookup (from the current scope) will not ever
226 // find any declarations of operator[] that won't also be found be
227 // member operator lookup, so it is safe to pass a NULL Scope
228 // during the instantiation to avoid the lookup entirely.
229 //
230 // 2) Neither normal name lookup nor argument-dependent lookup at
231 // template definition time will find any operators that won't be
232 // found at template instantiation time, so we do not need to
233 // cache the results of name lookup as we do for the binary
234 // operators.
235 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
236 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
237 /*FIXME:*/LLocFake,
238 move(RHS),
239 E->getRBracketLoc());
240}
241
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000242Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
243 // Instantiate callee
244 OwningExprResult Callee = Visit(E->getCallee());
245 if (Callee.isInvalid())
246 return SemaRef.ExprError();
247
248 // Instantiate arguments
249 llvm::SmallVector<Expr*, 8> Args;
250 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
251 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
252 OwningExprResult Arg = Visit(E->getArg(I));
253 if (Arg.isInvalid()) {
254 for (unsigned Victim = 0; Victim != I; ++Victim)
255 Args[Victim]->Destroy(SemaRef.Context);
256 return SemaRef.ExprError();
257 }
258
259 FakeCommaLocs.push_back(
260 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
261 Args.push_back(Arg.takeAs<Expr>());
262 }
263
264 SourceLocation FakeLParenLoc
265 = ((Expr *)Callee.get())->getSourceRange().getBegin();
266 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
267 /*FIXME:*/FakeLParenLoc,
268 Sema::MultiExprArg(SemaRef,
269 (void **)&Args.front(),
270 Args.size()),
271 /*FIXME:*/&FakeCommaLocs.front(),
272 E->getRParenLoc());
273}
274
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000275Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000276TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
277 Sema::OwningExprResult LHS = Visit(E->getLHS());
278 if (LHS.isInvalid())
279 return SemaRef.ExprError();
280
281 Sema::OwningExprResult RHS = Visit(E->getRHS());
282 if (RHS.isInvalid())
283 return SemaRef.ExprError();
284
285 Sema::OwningExprResult Result
286 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
287 E->getOpcode(),
288 (Expr *)LHS.get(),
289 (Expr *)RHS.get());
290 if (Result.isInvalid())
291 return SemaRef.ExprError();
292
293 LHS.release();
294 RHS.release();
295 return move(Result);
296}
297
298Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000299TemplateExprInstantiator::VisitCompoundAssignOperator(
300 CompoundAssignOperator *E) {
301 return VisitBinaryOperator(E);
302}
303
304Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000305TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
306 Sema::OwningExprResult First = Visit(E->getArg(0));
307 if (First.isInvalid())
308 return SemaRef.ExprError();
309
310 Expr *Args[2] = { (Expr *)First.get(), 0 };
311
312 Sema::OwningExprResult Second(SemaRef);
313 if (E->getNumArgs() == 2) {
314 Second = Visit(E->getArg(1));
315
316 if (Second.isInvalid())
317 return SemaRef.ExprError();
318
319 Args[1] = (Expr *)Second.get();
320 }
321
322 if (!E->isTypeDependent()) {
323 // Since our original expression was not type-dependent, we do not
324 // perform lookup again at instantiation time (C++ [temp.dep]p1).
325 // Instead, we just build the new overloaded operator call
326 // expression.
327 First.release();
328 Second.release();
329 // FIXME: Don't reuse the callee here. We need to instantiate it.
330 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
331 SemaRef.Context,
332 E->getOperator(),
333 E->getCallee(),
334 Args, E->getNumArgs(),
335 E->getType(),
336 E->getOperatorLoc()));
337 }
338
339 bool isPostIncDec = E->getNumArgs() == 2 &&
340 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
341 if (E->getNumArgs() == 1 || isPostIncDec) {
342 if (!Args[0]->getType()->isOverloadableType()) {
343 // The argument is not of overloadable type, so try to create a
344 // built-in unary operation.
345 UnaryOperator::Opcode Opc
346 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
347
348 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
349 move(First));
350 }
351
352 // Fall through to perform overload resolution
353 } else {
354 assert(E->getNumArgs() == 2 && "Expected binary operation");
355
356 Sema::OwningExprResult Result(SemaRef);
357 if (!Args[0]->getType()->isOverloadableType() &&
358 !Args[1]->getType()->isOverloadableType()) {
359 // Neither of the arguments is an overloadable type, so try to
360 // create a built-in binary operation.
361 BinaryOperator::Opcode Opc =
362 BinaryOperator::getOverloadedOpcode(E->getOperator());
363 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
364 Args[0], Args[1]);
365 if (Result.isInvalid())
366 return SemaRef.ExprError();
367
368 First.release();
369 Second.release();
370 return move(Result);
371 }
372
373 // Fall through to perform overload resolution.
374 }
375
376 // Compute the set of functions that were found at template
377 // definition time.
378 Sema::FunctionSet Functions;
379 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
380 OverloadedFunctionDecl *Overloads
381 = cast<OverloadedFunctionDecl>(DRE->getDecl());
382
383 // FIXME: Do we have to check
384 // IsAcceptableNonMemberOperatorCandidate for each of these?
385 for (OverloadedFunctionDecl::function_iterator
386 F = Overloads->function_begin(),
387 FEnd = Overloads->function_end();
388 F != FEnd; ++F)
389 Functions.insert(*F);
390
391 // Add any functions found via argument-dependent lookup.
392 DeclarationName OpName
393 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
394 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
395
396 // Create the overloaded operator invocation.
397 if (E->getNumArgs() == 1 || isPostIncDec) {
398 UnaryOperator::Opcode Opc
399 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
400 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
401 Functions, move(First));
402 }
403
Mike Stump390b4cc2009-05-16 07:39:55 +0000404 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
405 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000406 BinaryOperator::Opcode Opc =
407 BinaryOperator::getOverloadedOpcode(E->getOperator());
408 OwningExprResult Result
409 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
410 Functions, Args[0], Args[1]);
411
412 if (Result.isInvalid())
413 return SemaRef.ExprError();
414
415 First.release();
416 Second.release();
417 return move(Result);
418}
419
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000420Sema::OwningExprResult
421TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
422 VarDecl *Var
423 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
424 SemaRef.CurContext,
425 TemplateArgs));
426 if (!Var)
427 return SemaRef.ExprError();
428
429 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
430 E->getStartLoc(),
431 SourceLocation(),
432 Var));
433}
434
Douglas Gregoraa6af222009-03-25 00:27:28 +0000435Sema::OwningExprResult
436TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
437 Sema::OwningExprResult Cond = Visit(E->getCond());
438 if (Cond.isInvalid())
439 return SemaRef.ExprError();
440
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000441 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
442 TemplateArgs);
443 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000444 return SemaRef.ExprError();
445
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000446 Sema::OwningExprResult RHS = Visit(E->getRHS());
447 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000448 return SemaRef.ExprError();
449
450 if (!E->isTypeDependent()) {
451 // Since our original expression was not type-dependent, we do not
452 // perform lookup again at instantiation time (C++ [temp.dep]p1).
453 // Instead, we just build the new conditional operator call expression.
454 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
455 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000456 LHS.takeAs<Expr>(),
457 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000458 E->getType()));
459 }
460
461
462 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
463 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000464 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000465}
466
Douglas Gregorcd938172009-05-19 20:31:21 +0000467Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
468 Sema::OwningStmtResult SubStmt = SemaRef.InstantiateStmt(E->getSubStmt(),
469 TemplateArgs);
470 if (SubStmt.isInvalid())
471 return SemaRef.ExprError();
472
473 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
474 E->getRParenLoc());
475}
476
Douglas Gregoraa6af222009-03-25 00:27:28 +0000477Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000478TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000479 assert(false && "__builtin_types_compatible_p is not legal in C++");
480 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000481}
482
483Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000484TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
485 // FIXME: Better solution for this!
486 llvm::SmallVector<Expr *, 8> SubExprs;
487 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
488 OwningExprResult SubExpr = Visit(E->getExpr(I));
489 if (SubExpr.isInvalid()) {
490 for (unsigned Victim = 0; Victim != I; ++Victim)
491 SubExprs[I]->Destroy(SemaRef.Context);
492 return SemaRef.ExprError();
493 }
494
495 SubExprs.push_back(SubExpr.takeAs<Expr>());
496 }
497
498 // Find the declaration for __builtin_shufflevector
499 const IdentifierInfo &Name
500 = SemaRef.Context.Idents.get("__builtin_shufflevector");
501 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
502 DeclContext::lookup_result Lookup
503 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
504 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
505
506 // Build a reference to the __builtin_shufflevector builtin
507 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
508 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
509 E->getBuiltinLoc(),
510 false, false);
511 SemaRef.UsualUnaryConversions(Callee);
512
513 // Build the CallExpr
514 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
515 &SubExprs[0],
516 SubExprs.size(),
517 Builtin->getResultType(),
518 E->getRParenLoc());
519 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
520
521 // Type-check the __builtin_shufflevector expression.
522 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
523 if (Result.isInvalid())
524 return SemaRef.ExprError();
525
526 OwnedCall.release();
527 return move(Result);
528}
529
530Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000531TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
532 OwningExprResult Cond = Visit(E->getCond());
533 if (Cond.isInvalid())
534 return SemaRef.ExprError();
535
536 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
537 if (LHS.isInvalid())
538 return SemaRef.ExprError();
539
540 OwningExprResult RHS = Visit(E->getRHS());
541 if (RHS.isInvalid())
542 return SemaRef.ExprError();
543
544 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
545 move(Cond), move(LHS), move(RHS),
546 E->getRParenLoc());
547}
548
Douglas Gregordd027302009-05-19 23:10:31 +0000549Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
550 OwningExprResult SubExpr = Visit(E->getSubExpr());
551 if (SubExpr.isInvalid())
552 return SemaRef.ExprError();
553
554 SourceLocation FakeTypeLoc
555 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
556 .getEnd());
557 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
558 /*FIXME:*/FakeTypeLoc,
559 DeclarationName());
560 if (T.isNull())
561 return SemaRef.ExprError();
562
563 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
564 T.getAsOpaquePtr(), E->getRParenLoc());
565}
566
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000567Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000568TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
569 bool isSizeOf = E->isSizeOf();
570
571 if (E->isArgumentType()) {
572 QualType T = E->getArgumentType();
573 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000574 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000575 /*FIXME*/E->getOperatorLoc(),
576 &SemaRef.PP.getIdentifierTable().get("sizeof"));
577 if (T.isNull())
578 return SemaRef.ExprError();
579 }
580
581 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
582 E->getSourceRange());
583 }
584
585 Sema::OwningExprResult Arg = Visit(E->getArgumentExpr());
586 if (Arg.isInvalid())
587 return SemaRef.ExprError();
588
589 Sema::OwningExprResult Result
590 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
591 isSizeOf, E->getSourceRange());
592 if (Result.isInvalid())
593 return SemaRef.ExprError();
594
595 Arg.release();
596 return move(Result);
597}
598
599Sema::OwningExprResult
600TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000601 NestedNameSpecifier *NNS
602 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
603 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000604 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000605 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000606 return SemaRef.ExprError();
607
Douglas Gregorab452ba2009-03-26 23:50:42 +0000608 CXXScopeSpec SS;
609 SS.setRange(E->getQualifierRange());
610 SS.setScopeRep(NNS);
611
Douglas Gregoraa6af222009-03-25 00:27:28 +0000612 // FIXME: We're passing in a NULL scope, because
613 // ActOnDeclarationNameExpr doesn't actually use the scope when we
614 // give it a non-empty scope specifier. Investigate whether it would
615 // be better to refactor ActOnDeclarationNameExpr.
616 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
617 E->getDeclName(),
618 /*HasTrailingLParen=*/false,
619 &SS,
620 /*FIXME:isAddressOfOperand=*/false);
621}
622
623Sema::OwningExprResult
624TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
625 CXXTemporaryObjectExpr *E) {
626 QualType T = E->getType();
627 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000628 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000629 E->getTypeBeginLoc(), DeclarationName());
630 if (T.isNull())
631 return SemaRef.ExprError();
632 }
633
634 llvm::SmallVector<Expr *, 16> Args;
635 Args.reserve(E->getNumArgs());
636 bool Invalid = false;
637 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
638 ArgEnd = E->arg_end();
639 Arg != ArgEnd; ++Arg) {
640 OwningExprResult InstantiatedArg = Visit(*Arg);
641 if (InstantiatedArg.isInvalid()) {
642 Invalid = true;
643 break;
644 }
645
646 Args.push_back((Expr *)InstantiatedArg.release());
647 }
648
649 if (!Invalid) {
650 SourceLocation CommaLoc;
651 // FIXME: HACK!
652 if (Args.size() > 1)
653 CommaLoc
654 = SemaRef.PP.getLocForEndOfToken(Args[0]->getSourceRange().getEnd());
655 Sema::OwningExprResult Result(
656 SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
657 /*, FIXME*/),
658 T.getAsOpaquePtr(),
659 /*FIXME*/E->getTypeBeginLoc(),
660 Sema::MultiExprArg(SemaRef,
661 (void**)&Args[0],
662 Args.size()),
663 /*HACK*/&CommaLoc,
664 E->getSourceRange().getEnd()));
665 // At this point, Args no longer owns the arguments, no matter what.
666 return move(Result);
667 }
668
669 // Clean up the instantiated arguments.
670 // FIXME: Would rather do this with RAII.
671 for (unsigned Idx = 0; Idx < Args.size(); ++Idx)
672 SemaRef.DeleteExpr(Args[Idx]);
673
674 return SemaRef.ExprError();
675}
676
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000677Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
678 assert(false && "Cannot instantiate abstract CastExpr");
679 return SemaRef.ExprError();
680}
681
Douglas Gregoraa6af222009-03-25 00:27:28 +0000682Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
683 ImplicitCastExpr *E) {
684 assert(!E->isTypeDependent() && "Implicit casts must have known types");
685
686 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
687 if (SubExpr.isInvalid())
688 return SemaRef.ExprError();
689
690 ImplicitCastExpr *ICE =
691 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
692 (Expr *)SubExpr.release(),
693 E->isLvalueCast());
694 return SemaRef.Owned(ICE);
695}
696
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000697Sema::OwningExprResult
698TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
699 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
700 return SemaRef.ExprError();
701}
702
703Sema::OwningExprResult
704TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
705 // Instantiate the type that we're casting to.
706 SourceLocation TypeStartLoc
707 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
708 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
709 TemplateArgs,
710 TypeStartLoc,
711 DeclarationName());
712 if (ExplicitTy.isNull())
713 return SemaRef.ExprError();
714
715 // Instantiate the subexpression.
716 OwningExprResult SubExpr = Visit(E->getSubExpr());
717 if (SubExpr.isInvalid())
718 return SemaRef.ExprError();
719
720 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
721 ExplicitTy.getAsOpaquePtr(),
722 E->getRParenLoc(),
723 move(SubExpr));
724}
725
726Sema::OwningExprResult
727TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
728 // Figure out which cast operator we're dealing with.
729 tok::TokenKind Kind;
730 switch (E->getStmtClass()) {
731 case Stmt::CXXStaticCastExprClass:
732 Kind = tok::kw_static_cast;
733 break;
734
735 case Stmt::CXXDynamicCastExprClass:
736 Kind = tok::kw_dynamic_cast;
737 break;
738
739 case Stmt::CXXReinterpretCastExprClass:
740 Kind = tok::kw_reinterpret_cast;
741 break;
742
743 case Stmt::CXXConstCastExprClass:
744 Kind = tok::kw_const_cast;
745 break;
746
747 default:
748 assert(false && "Invalid C++ named cast");
749 return SemaRef.ExprError();
750 }
751
752 // Instantiate the type that we're casting to.
753 SourceLocation TypeStartLoc
754 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
755 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
756 TemplateArgs,
757 TypeStartLoc,
758 DeclarationName());
759 if (ExplicitTy.isNull())
760 return SemaRef.ExprError();
761
762 // Instantiate the subexpression.
763 OwningExprResult SubExpr = Visit(E->getSubExpr());
764 if (SubExpr.isInvalid())
765 return SemaRef.ExprError();
766
767 SourceLocation FakeLAngleLoc
768 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
769 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
770 SourceLocation FakeRParenLoc
771 = SemaRef.PP.getLocForEndOfToken(
772 E->getSubExpr()->getSourceRange().getEnd());
773 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
774 /*FIXME:*/FakeLAngleLoc,
775 ExplicitTy.getAsOpaquePtr(),
776 /*FIXME:*/FakeRAngleLoc,
777 /*FIXME:*/FakeRAngleLoc,
778 move(SubExpr),
779 /*FIXME:*/FakeRParenLoc);
780}
781
782Sema::OwningExprResult
783TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
784 return VisitCXXNamedCastExpr(E);
785}
786
787Sema::OwningExprResult
788TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
789 return VisitCXXNamedCastExpr(E);
790}
791
792Sema::OwningExprResult
793TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
794 CXXReinterpretCastExpr *E) {
795 return VisitCXXNamedCastExpr(E);
796}
797
798Sema::OwningExprResult
799TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
800 return VisitCXXNamedCastExpr(E);
801}
802
Anders Carlsson0712d292009-05-15 20:26:03 +0000803Sema::OwningExprResult
804TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
805 QualType ThisType =
806 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
807
808 CXXThisExpr *TE =
809 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
810
811 return SemaRef.Owned(TE);
812}
813
Douglas Gregoraa6af222009-03-25 00:27:28 +0000814Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +0000815Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +0000816 if (!E)
817 return Owned((Expr *)0);
818
Douglas Gregor7e063902009-05-11 23:53:27 +0000819 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000820 return Instantiator.Visit(E);
821}