blob: a0e2941e26d382248566c432db85d87632c248c5 [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 Gregor05295192009-05-19 23:29:16 +000063 // FIXME: InitListExpr
64 // FIXME: DesignatedInitExpr
65 // FIXME: ImplicitValueInitExpr
66 // FIXME: ExtVectorElementExpr
67 // FIXME: BlockExpr
68 // FIXME: BlockDeclRefExpr
Douglas Gregoraa6af222009-03-25 00:27:28 +000069 OwningExprResult VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
70 OwningExprResult VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E);
71 OwningExprResult VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000072 OwningExprResult VisitCastExpr(CastExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000073 OwningExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000074 OwningExprResult VisitExplicitCastExpr(ExplicitCastExpr *E);
75 OwningExprResult VisitCStyleCastExpr(CStyleCastExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000076 // FIXME: CXXMemberCallExpr
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000077 OwningExprResult VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
78 OwningExprResult VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
79 OwningExprResult VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
80 OwningExprResult VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
81 OwningExprResult VisitCXXConstCastExpr(CXXConstCastExpr *E);
Anders Carlsson0712d292009-05-15 20:26:03 +000082 OwningExprResult VisitCXXThisExpr(CXXThisExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000083 OwningExprResult VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
84 OwningExprResult VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000085 // FIXME: CXXTypeIdExpr
86 // FIXME: CXXThrowExpr
87 // FIXME: CXXDefaultArgExpr
88 // FIXME: CXXConstructExpr
89 // FIXME: CXXFunctionalCastExpr
90 // FIXME: CXXZeroInitValueExpr
91 // FIXME: CXXNewExpr
92 // FIXME: CXXDeleteExpr
93 // FIXME: UnaryTypeTraitExpr
94 // FIXME: QualifiedDeclRefExpr
95 // FIXME: CXXExprWithTemporaries
Sebastian Redl8b0b4752009-05-16 18:50:46 +000096 OwningExprResult VisitGNUNullExpr(GNUNullExpr *E);
Douglas Gregor4a2487a2009-05-19 00:38:01 +000097 OwningExprResult VisitUnresolvedFunctionNameExpr(
98 UnresolvedFunctionNameExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000099
Douglas Gregoraa6af222009-03-25 00:27:28 +0000100 // Base case. I'm supposed to ignore this.
101 Sema::OwningExprResult VisitStmt(Stmt *S) {
102 S->dump();
103 assert(false && "Cannot instantiate this kind of expression");
104 return SemaRef.ExprError();
105 }
106 };
107}
108
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000109Sema::OwningExprResult
110TemplateExprInstantiator::VisitPredefinedExpr(PredefinedExpr *E) {
111 return SemaRef.Clone(E);
112}
113
114Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000115TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) {
116 return SemaRef.Clone(E);
117}
118
119Sema::OwningExprResult
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000120TemplateExprInstantiator::VisitFloatingLiteral(FloatingLiteral *E) {
121 return SemaRef.Clone(E);
122}
123
124Sema::OwningExprResult
125TemplateExprInstantiator::VisitStringLiteral(StringLiteral *E) {
126 return SemaRef.Clone(E);
127}
128
129Sema::OwningExprResult
130TemplateExprInstantiator::VisitCharacterLiteral(CharacterLiteral *E) {
131 return SemaRef.Clone(E);
132}
133
Douglas Gregord8ac4362009-05-18 22:38:38 +0000134Sema::OwningExprResult
135TemplateExprInstantiator::VisitImaginaryLiteral(ImaginaryLiteral *E) {
136 return SemaRef.Clone(E);
137}
138
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000139Sema::OwningExprResult
140TemplateExprInstantiator::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
141 return SemaRef.Clone(E);
142}
143
144Sema::OwningExprResult
145TemplateExprInstantiator::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
146 return SemaRef.Clone(E);
147}
148
149Sema::OwningExprResult
150TemplateExprInstantiator::VisitGNUNullExpr(GNUNullExpr *E) {
151 return SemaRef.Clone(E);
152}
153
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000154Sema::OwningExprResult
155TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr(
156 UnresolvedFunctionNameExpr *E) {
157 return SemaRef.Clone(E);
158}
159
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000160Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000161TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
162 Decl *D = E->getDecl();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000163 ValueDecl *NewD = 0;
Douglas Gregoraa6af222009-03-25 00:27:28 +0000164 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
165 assert(NTTP->getDepth() == 0 && "No nested templates yet");
166 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
167 QualType T = Arg.getIntegralType();
168 if (T->isCharType() || T->isWideCharType())
169 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
170 Arg.getAsIntegral()->getZExtValue(),
171 T->isWideCharType(),
172 T,
173 E->getSourceRange().getBegin()));
174 else if (T->isBooleanType())
175 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
176 Arg.getAsIntegral()->getBoolValue(),
177 T,
178 E->getSourceRange().getBegin()));
179
180 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
181 *Arg.getAsIntegral(),
182 T,
183 E->getSourceRange().getBegin()));
Douglas Gregordd027302009-05-19 23:10:31 +0000184 } else if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000185 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Parm);
Douglas Gregordd027302009-05-19 23:10:31 +0000186 } else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
187 if (Var->hasLocalStorage())
188 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Var);
189 else
190 assert(false && "Cannot instantiation non-local variable declarations");
191 } else if (isa<FunctionDecl>(D) || isa<OverloadedFunctionDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000192 // FIXME: Instantiate decl!
193 NewD = cast<ValueDecl>(D);
Douglas Gregordd027302009-05-19 23:10:31 +0000194 } else
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000195 assert(false && "Unhandled declaratrion reference kind");
196
197 if (!NewD)
198 return SemaRef.ExprError();
199
200 QualType T = NewD->getType();
201 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000202 T.getNonReferenceType(),
203 E->getLocation(),
204 T->isDependentType(),
205 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000206}
207
208Sema::OwningExprResult
209TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
210 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
211 if (SubExpr.isInvalid())
212 return SemaRef.ExprError();
213
214 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
215 E->getLParen(), E->getRParen(),
216 (Expr *)SubExpr.release()));
217}
218
219Sema::OwningExprResult
220TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
221 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
222 if (Arg.isInvalid())
223 return SemaRef.ExprError();
224
225 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
226 E->getOpcode(),
227 move(Arg));
228}
229
230Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000231TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
232 Sema::OwningExprResult LHS = Visit(E->getLHS());
233 if (LHS.isInvalid())
234 return SemaRef.ExprError();
235
236 Sema::OwningExprResult RHS = Visit(E->getRHS());
237 if (RHS.isInvalid())
238 return SemaRef.ExprError();
239
240 // Since the overloaded array-subscript operator (operator[]) can
241 // only be a member function, we can make several simplifying
242 // assumptions here:
243 // 1) Normal name lookup (from the current scope) will not ever
244 // find any declarations of operator[] that won't also be found be
245 // member operator lookup, so it is safe to pass a NULL Scope
246 // during the instantiation to avoid the lookup entirely.
247 //
248 // 2) Neither normal name lookup nor argument-dependent lookup at
249 // template definition time will find any operators that won't be
250 // found at template instantiation time, so we do not need to
251 // cache the results of name lookup as we do for the binary
252 // operators.
253 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
254 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
255 /*FIXME:*/LLocFake,
256 move(RHS),
257 E->getRBracketLoc());
258}
259
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000260Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
261 // Instantiate callee
262 OwningExprResult Callee = Visit(E->getCallee());
263 if (Callee.isInvalid())
264 return SemaRef.ExprError();
265
266 // Instantiate arguments
267 llvm::SmallVector<Expr*, 8> Args;
268 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
269 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
270 OwningExprResult Arg = Visit(E->getArg(I));
271 if (Arg.isInvalid()) {
272 for (unsigned Victim = 0; Victim != I; ++Victim)
273 Args[Victim]->Destroy(SemaRef.Context);
274 return SemaRef.ExprError();
275 }
276
277 FakeCommaLocs.push_back(
278 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
279 Args.push_back(Arg.takeAs<Expr>());
280 }
281
282 SourceLocation FakeLParenLoc
283 = ((Expr *)Callee.get())->getSourceRange().getBegin();
284 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
285 /*FIXME:*/FakeLParenLoc,
286 Sema::MultiExprArg(SemaRef,
287 (void **)&Args.front(),
288 Args.size()),
289 /*FIXME:*/&FakeCommaLocs.front(),
290 E->getRParenLoc());
291}
292
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000293Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000294TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
295 Sema::OwningExprResult LHS = Visit(E->getLHS());
296 if (LHS.isInvalid())
297 return SemaRef.ExprError();
298
299 Sema::OwningExprResult RHS = Visit(E->getRHS());
300 if (RHS.isInvalid())
301 return SemaRef.ExprError();
302
303 Sema::OwningExprResult Result
304 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
305 E->getOpcode(),
306 (Expr *)LHS.get(),
307 (Expr *)RHS.get());
308 if (Result.isInvalid())
309 return SemaRef.ExprError();
310
311 LHS.release();
312 RHS.release();
313 return move(Result);
314}
315
316Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000317TemplateExprInstantiator::VisitCompoundAssignOperator(
318 CompoundAssignOperator *E) {
319 return VisitBinaryOperator(E);
320}
321
322Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000323TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
324 Sema::OwningExprResult First = Visit(E->getArg(0));
325 if (First.isInvalid())
326 return SemaRef.ExprError();
327
328 Expr *Args[2] = { (Expr *)First.get(), 0 };
329
330 Sema::OwningExprResult Second(SemaRef);
331 if (E->getNumArgs() == 2) {
332 Second = Visit(E->getArg(1));
333
334 if (Second.isInvalid())
335 return SemaRef.ExprError();
336
337 Args[1] = (Expr *)Second.get();
338 }
339
340 if (!E->isTypeDependent()) {
341 // Since our original expression was not type-dependent, we do not
342 // perform lookup again at instantiation time (C++ [temp.dep]p1).
343 // Instead, we just build the new overloaded operator call
344 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000345 OwningExprResult Callee = Visit(E->getCallee());
346 if (Callee.isInvalid())
347 return SemaRef.ExprError();
348
Douglas Gregoraa6af222009-03-25 00:27:28 +0000349 First.release();
350 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000351
Douglas Gregoraa6af222009-03-25 00:27:28 +0000352 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
353 SemaRef.Context,
354 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000355 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000356 Args, E->getNumArgs(),
357 E->getType(),
358 E->getOperatorLoc()));
359 }
360
361 bool isPostIncDec = E->getNumArgs() == 2 &&
362 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
363 if (E->getNumArgs() == 1 || isPostIncDec) {
364 if (!Args[0]->getType()->isOverloadableType()) {
365 // The argument is not of overloadable type, so try to create a
366 // built-in unary operation.
367 UnaryOperator::Opcode Opc
368 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
369
370 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
371 move(First));
372 }
373
374 // Fall through to perform overload resolution
375 } else {
376 assert(E->getNumArgs() == 2 && "Expected binary operation");
377
378 Sema::OwningExprResult Result(SemaRef);
379 if (!Args[0]->getType()->isOverloadableType() &&
380 !Args[1]->getType()->isOverloadableType()) {
381 // Neither of the arguments is an overloadable type, so try to
382 // create a built-in binary operation.
383 BinaryOperator::Opcode Opc =
384 BinaryOperator::getOverloadedOpcode(E->getOperator());
385 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
386 Args[0], Args[1]);
387 if (Result.isInvalid())
388 return SemaRef.ExprError();
389
390 First.release();
391 Second.release();
392 return move(Result);
393 }
394
395 // Fall through to perform overload resolution.
396 }
397
398 // Compute the set of functions that were found at template
399 // definition time.
400 Sema::FunctionSet Functions;
401 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
402 OverloadedFunctionDecl *Overloads
403 = cast<OverloadedFunctionDecl>(DRE->getDecl());
404
405 // FIXME: Do we have to check
406 // IsAcceptableNonMemberOperatorCandidate for each of these?
407 for (OverloadedFunctionDecl::function_iterator
408 F = Overloads->function_begin(),
409 FEnd = Overloads->function_end();
410 F != FEnd; ++F)
411 Functions.insert(*F);
412
413 // Add any functions found via argument-dependent lookup.
414 DeclarationName OpName
415 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
416 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
417
418 // Create the overloaded operator invocation.
419 if (E->getNumArgs() == 1 || isPostIncDec) {
420 UnaryOperator::Opcode Opc
421 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
422 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
423 Functions, move(First));
424 }
425
Mike Stump390b4cc2009-05-16 07:39:55 +0000426 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
427 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000428 BinaryOperator::Opcode Opc =
429 BinaryOperator::getOverloadedOpcode(E->getOperator());
430 OwningExprResult Result
431 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
432 Functions, Args[0], Args[1]);
433
434 if (Result.isInvalid())
435 return SemaRef.ExprError();
436
437 First.release();
438 Second.release();
439 return move(Result);
440}
441
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000442Sema::OwningExprResult
443TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
444 VarDecl *Var
445 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
446 SemaRef.CurContext,
447 TemplateArgs));
448 if (!Var)
449 return SemaRef.ExprError();
450
451 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
452 E->getStartLoc(),
453 SourceLocation(),
454 Var));
455}
456
Douglas Gregoraa6af222009-03-25 00:27:28 +0000457Sema::OwningExprResult
458TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
459 Sema::OwningExprResult Cond = Visit(E->getCond());
460 if (Cond.isInvalid())
461 return SemaRef.ExprError();
462
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000463 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
464 TemplateArgs);
465 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000466 return SemaRef.ExprError();
467
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000468 Sema::OwningExprResult RHS = Visit(E->getRHS());
469 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000470 return SemaRef.ExprError();
471
472 if (!E->isTypeDependent()) {
473 // Since our original expression was not type-dependent, we do not
474 // perform lookup again at instantiation time (C++ [temp.dep]p1).
475 // Instead, we just build the new conditional operator call expression.
476 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
477 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000478 LHS.takeAs<Expr>(),
479 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000480 E->getType()));
481 }
482
483
484 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
485 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000486 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000487}
488
Douglas Gregorcd938172009-05-19 20:31:21 +0000489Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
490 Sema::OwningStmtResult SubStmt = SemaRef.InstantiateStmt(E->getSubStmt(),
491 TemplateArgs);
492 if (SubStmt.isInvalid())
493 return SemaRef.ExprError();
494
495 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
496 E->getRParenLoc());
497}
498
Douglas Gregoraa6af222009-03-25 00:27:28 +0000499Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000500TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000501 assert(false && "__builtin_types_compatible_p is not legal in C++");
502 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000503}
504
505Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000506TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
507 // FIXME: Better solution for this!
508 llvm::SmallVector<Expr *, 8> SubExprs;
509 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
510 OwningExprResult SubExpr = Visit(E->getExpr(I));
511 if (SubExpr.isInvalid()) {
512 for (unsigned Victim = 0; Victim != I; ++Victim)
513 SubExprs[I]->Destroy(SemaRef.Context);
514 return SemaRef.ExprError();
515 }
516
517 SubExprs.push_back(SubExpr.takeAs<Expr>());
518 }
519
520 // Find the declaration for __builtin_shufflevector
521 const IdentifierInfo &Name
522 = SemaRef.Context.Idents.get("__builtin_shufflevector");
523 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
524 DeclContext::lookup_result Lookup
525 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
526 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
527
528 // Build a reference to the __builtin_shufflevector builtin
529 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
530 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
531 E->getBuiltinLoc(),
532 false, false);
533 SemaRef.UsualUnaryConversions(Callee);
534
535 // Build the CallExpr
536 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
537 &SubExprs[0],
538 SubExprs.size(),
539 Builtin->getResultType(),
540 E->getRParenLoc());
541 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
542
543 // Type-check the __builtin_shufflevector expression.
544 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
545 if (Result.isInvalid())
546 return SemaRef.ExprError();
547
548 OwnedCall.release();
549 return move(Result);
550}
551
552Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000553TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
554 OwningExprResult Cond = Visit(E->getCond());
555 if (Cond.isInvalid())
556 return SemaRef.ExprError();
557
558 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
559 if (LHS.isInvalid())
560 return SemaRef.ExprError();
561
562 OwningExprResult RHS = Visit(E->getRHS());
563 if (RHS.isInvalid())
564 return SemaRef.ExprError();
565
566 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
567 move(Cond), move(LHS), move(RHS),
568 E->getRParenLoc());
569}
570
Douglas Gregordd027302009-05-19 23:10:31 +0000571Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
572 OwningExprResult SubExpr = Visit(E->getSubExpr());
573 if (SubExpr.isInvalid())
574 return SemaRef.ExprError();
575
576 SourceLocation FakeTypeLoc
577 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
578 .getEnd());
579 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
580 /*FIXME:*/FakeTypeLoc,
581 DeclarationName());
582 if (T.isNull())
583 return SemaRef.ExprError();
584
585 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
586 T.getAsOpaquePtr(), E->getRParenLoc());
587}
588
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000589Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000590TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
591 bool isSizeOf = E->isSizeOf();
592
593 if (E->isArgumentType()) {
594 QualType T = E->getArgumentType();
595 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000596 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000597 /*FIXME*/E->getOperatorLoc(),
598 &SemaRef.PP.getIdentifierTable().get("sizeof"));
599 if (T.isNull())
600 return SemaRef.ExprError();
601 }
602
603 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
604 E->getSourceRange());
605 }
606
607 Sema::OwningExprResult Arg = Visit(E->getArgumentExpr());
608 if (Arg.isInvalid())
609 return SemaRef.ExprError();
610
611 Sema::OwningExprResult Result
612 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
613 isSizeOf, E->getSourceRange());
614 if (Result.isInvalid())
615 return SemaRef.ExprError();
616
617 Arg.release();
618 return move(Result);
619}
620
621Sema::OwningExprResult
622TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000623 NestedNameSpecifier *NNS
624 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
625 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000626 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000627 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000628 return SemaRef.ExprError();
629
Douglas Gregorab452ba2009-03-26 23:50:42 +0000630 CXXScopeSpec SS;
631 SS.setRange(E->getQualifierRange());
632 SS.setScopeRep(NNS);
633
Douglas Gregoraa6af222009-03-25 00:27:28 +0000634 // FIXME: We're passing in a NULL scope, because
635 // ActOnDeclarationNameExpr doesn't actually use the scope when we
636 // give it a non-empty scope specifier. Investigate whether it would
637 // be better to refactor ActOnDeclarationNameExpr.
638 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
639 E->getDeclName(),
640 /*HasTrailingLParen=*/false,
641 &SS,
642 /*FIXME:isAddressOfOperand=*/false);
643}
644
645Sema::OwningExprResult
646TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
647 CXXTemporaryObjectExpr *E) {
648 QualType T = E->getType();
649 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000650 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000651 E->getTypeBeginLoc(), DeclarationName());
652 if (T.isNull())
653 return SemaRef.ExprError();
654 }
655
656 llvm::SmallVector<Expr *, 16> Args;
657 Args.reserve(E->getNumArgs());
658 bool Invalid = false;
659 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
660 ArgEnd = E->arg_end();
661 Arg != ArgEnd; ++Arg) {
662 OwningExprResult InstantiatedArg = Visit(*Arg);
663 if (InstantiatedArg.isInvalid()) {
664 Invalid = true;
665 break;
666 }
667
668 Args.push_back((Expr *)InstantiatedArg.release());
669 }
670
671 if (!Invalid) {
672 SourceLocation CommaLoc;
673 // FIXME: HACK!
674 if (Args.size() > 1)
675 CommaLoc
676 = SemaRef.PP.getLocForEndOfToken(Args[0]->getSourceRange().getEnd());
677 Sema::OwningExprResult Result(
678 SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
679 /*, FIXME*/),
680 T.getAsOpaquePtr(),
681 /*FIXME*/E->getTypeBeginLoc(),
682 Sema::MultiExprArg(SemaRef,
683 (void**)&Args[0],
684 Args.size()),
685 /*HACK*/&CommaLoc,
686 E->getSourceRange().getEnd()));
687 // At this point, Args no longer owns the arguments, no matter what.
688 return move(Result);
689 }
690
691 // Clean up the instantiated arguments.
692 // FIXME: Would rather do this with RAII.
693 for (unsigned Idx = 0; Idx < Args.size(); ++Idx)
694 SemaRef.DeleteExpr(Args[Idx]);
695
696 return SemaRef.ExprError();
697}
698
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000699Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
700 assert(false && "Cannot instantiate abstract CastExpr");
701 return SemaRef.ExprError();
702}
703
Douglas Gregoraa6af222009-03-25 00:27:28 +0000704Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
705 ImplicitCastExpr *E) {
706 assert(!E->isTypeDependent() && "Implicit casts must have known types");
707
708 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
709 if (SubExpr.isInvalid())
710 return SemaRef.ExprError();
711
712 ImplicitCastExpr *ICE =
713 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
714 (Expr *)SubExpr.release(),
715 E->isLvalueCast());
716 return SemaRef.Owned(ICE);
717}
718
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000719Sema::OwningExprResult
720TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
721 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
722 return SemaRef.ExprError();
723}
724
725Sema::OwningExprResult
726TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
727 // Instantiate the type that we're casting to.
728 SourceLocation TypeStartLoc
729 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
730 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
731 TemplateArgs,
732 TypeStartLoc,
733 DeclarationName());
734 if (ExplicitTy.isNull())
735 return SemaRef.ExprError();
736
737 // Instantiate the subexpression.
738 OwningExprResult SubExpr = Visit(E->getSubExpr());
739 if (SubExpr.isInvalid())
740 return SemaRef.ExprError();
741
742 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
743 ExplicitTy.getAsOpaquePtr(),
744 E->getRParenLoc(),
745 move(SubExpr));
746}
747
748Sema::OwningExprResult
749TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
750 // Figure out which cast operator we're dealing with.
751 tok::TokenKind Kind;
752 switch (E->getStmtClass()) {
753 case Stmt::CXXStaticCastExprClass:
754 Kind = tok::kw_static_cast;
755 break;
756
757 case Stmt::CXXDynamicCastExprClass:
758 Kind = tok::kw_dynamic_cast;
759 break;
760
761 case Stmt::CXXReinterpretCastExprClass:
762 Kind = tok::kw_reinterpret_cast;
763 break;
764
765 case Stmt::CXXConstCastExprClass:
766 Kind = tok::kw_const_cast;
767 break;
768
769 default:
770 assert(false && "Invalid C++ named cast");
771 return SemaRef.ExprError();
772 }
773
774 // Instantiate the type that we're casting to.
775 SourceLocation TypeStartLoc
776 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
777 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
778 TemplateArgs,
779 TypeStartLoc,
780 DeclarationName());
781 if (ExplicitTy.isNull())
782 return SemaRef.ExprError();
783
784 // Instantiate the subexpression.
785 OwningExprResult SubExpr = Visit(E->getSubExpr());
786 if (SubExpr.isInvalid())
787 return SemaRef.ExprError();
788
789 SourceLocation FakeLAngleLoc
790 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
791 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
792 SourceLocation FakeRParenLoc
793 = SemaRef.PP.getLocForEndOfToken(
794 E->getSubExpr()->getSourceRange().getEnd());
795 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
796 /*FIXME:*/FakeLAngleLoc,
797 ExplicitTy.getAsOpaquePtr(),
798 /*FIXME:*/FakeRAngleLoc,
799 /*FIXME:*/FakeRAngleLoc,
800 move(SubExpr),
801 /*FIXME:*/FakeRParenLoc);
802}
803
804Sema::OwningExprResult
805TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
806 return VisitCXXNamedCastExpr(E);
807}
808
809Sema::OwningExprResult
810TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
811 return VisitCXXNamedCastExpr(E);
812}
813
814Sema::OwningExprResult
815TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
816 CXXReinterpretCastExpr *E) {
817 return VisitCXXNamedCastExpr(E);
818}
819
820Sema::OwningExprResult
821TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
822 return VisitCXXNamedCastExpr(E);
823}
824
Anders Carlsson0712d292009-05-15 20:26:03 +0000825Sema::OwningExprResult
826TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
827 QualType ThisType =
828 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
829
830 CXXThisExpr *TE =
831 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
832
833 return SemaRef.Owned(TE);
834}
835
Douglas Gregoraa6af222009-03-25 00:27:28 +0000836Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +0000837Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +0000838 if (!E)
839 return Owned((Expr *)0);
840
Douglas Gregor7e063902009-05-11 23:53:27 +0000841 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000842 return Instantiator.Visit(E);
843}