blob: 283b0d35a20c2713d7f228b9799acfa084a053c9 [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 Gregorccb97f52009-05-21 21:38:12 +000063 OwningExprResult VisitInitListExpr(InitListExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000064 // 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 Gregor12d0c302009-05-21 18:34:44 +000085 OwningExprResult VisitCXXTypeidExpr(CXXTypeidExpr *E);
Douglas Gregor42e5b502009-05-21 17:37:52 +000086 OwningExprResult VisitCXXThrowExpr(CXXThrowExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000087 // FIXME: CXXDefaultArgExpr
Douglas Gregord94546a2009-05-20 21:38:11 +000088 OwningExprResult VisitCXXConstructExpr(CXXConstructExpr *E);
89 OwningExprResult VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
90 OwningExprResult VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
Douglas Gregor3433cf72009-05-21 00:00:09 +000091 OwningExprResult VisitCXXNewExpr(CXXNewExpr *E);
Douglas Gregord0c02672009-05-21 17:21:12 +000092 OwningExprResult VisitCXXDeleteExpr(CXXDeleteExpr *E);
Douglas Gregor36bb03b2009-05-21 18:55:48 +000093 OwningExprResult VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000094 // FIXME: QualifiedDeclRefExpr
Douglas Gregore06274d2009-05-20 21:51:01 +000095 OwningExprResult VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
Douglas Gregord81e6ca2009-05-20 18:46:25 +000096 OwningExprResult VisitCXXUnresolvedConstructExpr(
97 CXXUnresolvedConstructExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000098 OwningExprResult VisitGNUNullExpr(GNUNullExpr *E);
Douglas Gregor4a2487a2009-05-19 00:38:01 +000099 OwningExprResult VisitUnresolvedFunctionNameExpr(
100 UnresolvedFunctionNameExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000101
Douglas Gregoraa6af222009-03-25 00:27:28 +0000102 // Base case. I'm supposed to ignore this.
103 Sema::OwningExprResult VisitStmt(Stmt *S) {
104 S->dump();
105 assert(false && "Cannot instantiate this kind of expression");
106 return SemaRef.ExprError();
107 }
108 };
109}
110
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000111Sema::OwningExprResult
112TemplateExprInstantiator::VisitPredefinedExpr(PredefinedExpr *E) {
113 return SemaRef.Clone(E);
114}
115
116Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000117TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) {
118 return SemaRef.Clone(E);
119}
120
121Sema::OwningExprResult
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000122TemplateExprInstantiator::VisitFloatingLiteral(FloatingLiteral *E) {
123 return SemaRef.Clone(E);
124}
125
126Sema::OwningExprResult
127TemplateExprInstantiator::VisitStringLiteral(StringLiteral *E) {
128 return SemaRef.Clone(E);
129}
130
131Sema::OwningExprResult
132TemplateExprInstantiator::VisitCharacterLiteral(CharacterLiteral *E) {
133 return SemaRef.Clone(E);
134}
135
Douglas Gregord8ac4362009-05-18 22:38:38 +0000136Sema::OwningExprResult
137TemplateExprInstantiator::VisitImaginaryLiteral(ImaginaryLiteral *E) {
138 return SemaRef.Clone(E);
139}
140
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000141Sema::OwningExprResult
142TemplateExprInstantiator::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
143 return SemaRef.Clone(E);
144}
145
146Sema::OwningExprResult
147TemplateExprInstantiator::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
148 return SemaRef.Clone(E);
149}
150
151Sema::OwningExprResult
152TemplateExprInstantiator::VisitGNUNullExpr(GNUNullExpr *E) {
153 return SemaRef.Clone(E);
154}
155
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000156Sema::OwningExprResult
157TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr(
158 UnresolvedFunctionNameExpr *E) {
159 return SemaRef.Clone(E);
160}
161
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000162Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000163TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
164 Decl *D = E->getDecl();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000165 ValueDecl *NewD = 0;
Douglas Gregoraa6af222009-03-25 00:27:28 +0000166 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
167 assert(NTTP->getDepth() == 0 && "No nested templates yet");
168 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
169 QualType T = Arg.getIntegralType();
170 if (T->isCharType() || T->isWideCharType())
171 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
172 Arg.getAsIntegral()->getZExtValue(),
173 T->isWideCharType(),
174 T,
175 E->getSourceRange().getBegin()));
176 else if (T->isBooleanType())
177 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
178 Arg.getAsIntegral()->getBoolValue(),
179 T,
180 E->getSourceRange().getBegin()));
181
182 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
183 *Arg.getAsIntegral(),
184 T,
185 E->getSourceRange().getBegin()));
Douglas Gregordd027302009-05-19 23:10:31 +0000186 } else if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000187 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Parm);
Douglas Gregordd027302009-05-19 23:10:31 +0000188 } else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
189 if (Var->hasLocalStorage())
190 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Var);
191 else
192 assert(false && "Cannot instantiation non-local variable declarations");
193 } else if (isa<FunctionDecl>(D) || isa<OverloadedFunctionDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000194 // FIXME: Instantiate decl!
195 NewD = cast<ValueDecl>(D);
Douglas Gregordd027302009-05-19 23:10:31 +0000196 } else
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000197 assert(false && "Unhandled declaratrion reference kind");
198
199 if (!NewD)
200 return SemaRef.ExprError();
201
202 QualType T = NewD->getType();
203 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000204 T.getNonReferenceType(),
205 E->getLocation(),
206 T->isDependentType(),
207 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000208}
209
210Sema::OwningExprResult
211TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
212 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
213 if (SubExpr.isInvalid())
214 return SemaRef.ExprError();
215
216 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
217 E->getLParen(), E->getRParen(),
218 (Expr *)SubExpr.release()));
219}
220
221Sema::OwningExprResult
222TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
223 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
224 if (Arg.isInvalid())
225 return SemaRef.ExprError();
226
227 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
228 E->getOpcode(),
229 move(Arg));
230}
231
232Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000233TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
234 Sema::OwningExprResult LHS = Visit(E->getLHS());
235 if (LHS.isInvalid())
236 return SemaRef.ExprError();
237
238 Sema::OwningExprResult RHS = Visit(E->getRHS());
239 if (RHS.isInvalid())
240 return SemaRef.ExprError();
241
242 // Since the overloaded array-subscript operator (operator[]) can
243 // only be a member function, we can make several simplifying
244 // assumptions here:
245 // 1) Normal name lookup (from the current scope) will not ever
246 // find any declarations of operator[] that won't also be found be
247 // member operator lookup, so it is safe to pass a NULL Scope
248 // during the instantiation to avoid the lookup entirely.
249 //
250 // 2) Neither normal name lookup nor argument-dependent lookup at
251 // template definition time will find any operators that won't be
252 // found at template instantiation time, so we do not need to
253 // cache the results of name lookup as we do for the binary
254 // operators.
255 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
256 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
257 /*FIXME:*/LLocFake,
258 move(RHS),
259 E->getRBracketLoc());
260}
261
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000262Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
263 // Instantiate callee
264 OwningExprResult Callee = Visit(E->getCallee());
265 if (Callee.isInvalid())
266 return SemaRef.ExprError();
267
268 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000269 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000270 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
271 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
272 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000273 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000274 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000275
276 FakeCommaLocs.push_back(
277 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
278 Args.push_back(Arg.takeAs<Expr>());
279 }
280
281 SourceLocation FakeLParenLoc
282 = ((Expr *)Callee.get())->getSourceRange().getBegin();
283 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
284 /*FIXME:*/FakeLParenLoc,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000285 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000286 /*FIXME:*/&FakeCommaLocs.front(),
287 E->getRParenLoc());
288}
289
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000290Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000291TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
292 Sema::OwningExprResult LHS = Visit(E->getLHS());
293 if (LHS.isInvalid())
294 return SemaRef.ExprError();
295
296 Sema::OwningExprResult RHS = Visit(E->getRHS());
297 if (RHS.isInvalid())
298 return SemaRef.ExprError();
299
300 Sema::OwningExprResult Result
301 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
302 E->getOpcode(),
303 (Expr *)LHS.get(),
304 (Expr *)RHS.get());
305 if (Result.isInvalid())
306 return SemaRef.ExprError();
307
308 LHS.release();
309 RHS.release();
310 return move(Result);
311}
312
313Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000314TemplateExprInstantiator::VisitCompoundAssignOperator(
315 CompoundAssignOperator *E) {
316 return VisitBinaryOperator(E);
317}
318
319Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000320TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
321 Sema::OwningExprResult First = Visit(E->getArg(0));
322 if (First.isInvalid())
323 return SemaRef.ExprError();
324
325 Expr *Args[2] = { (Expr *)First.get(), 0 };
326
327 Sema::OwningExprResult Second(SemaRef);
328 if (E->getNumArgs() == 2) {
329 Second = Visit(E->getArg(1));
330
331 if (Second.isInvalid())
332 return SemaRef.ExprError();
333
334 Args[1] = (Expr *)Second.get();
335 }
336
337 if (!E->isTypeDependent()) {
338 // Since our original expression was not type-dependent, we do not
339 // perform lookup again at instantiation time (C++ [temp.dep]p1).
340 // Instead, we just build the new overloaded operator call
341 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000342 OwningExprResult Callee = Visit(E->getCallee());
343 if (Callee.isInvalid())
344 return SemaRef.ExprError();
345
Douglas Gregoraa6af222009-03-25 00:27:28 +0000346 First.release();
347 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000348
Douglas Gregoraa6af222009-03-25 00:27:28 +0000349 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
350 SemaRef.Context,
351 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000352 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000353 Args, E->getNumArgs(),
354 E->getType(),
355 E->getOperatorLoc()));
356 }
357
358 bool isPostIncDec = E->getNumArgs() == 2 &&
359 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
360 if (E->getNumArgs() == 1 || isPostIncDec) {
361 if (!Args[0]->getType()->isOverloadableType()) {
362 // The argument is not of overloadable type, so try to create a
363 // built-in unary operation.
364 UnaryOperator::Opcode Opc
365 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
366
367 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
368 move(First));
369 }
370
371 // Fall through to perform overload resolution
372 } else {
373 assert(E->getNumArgs() == 2 && "Expected binary operation");
374
375 Sema::OwningExprResult Result(SemaRef);
376 if (!Args[0]->getType()->isOverloadableType() &&
377 !Args[1]->getType()->isOverloadableType()) {
378 // Neither of the arguments is an overloadable type, so try to
379 // create a built-in binary operation.
380 BinaryOperator::Opcode Opc =
381 BinaryOperator::getOverloadedOpcode(E->getOperator());
382 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
383 Args[0], Args[1]);
384 if (Result.isInvalid())
385 return SemaRef.ExprError();
386
387 First.release();
388 Second.release();
389 return move(Result);
390 }
391
392 // Fall through to perform overload resolution.
393 }
394
395 // Compute the set of functions that were found at template
396 // definition time.
397 Sema::FunctionSet Functions;
398 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
399 OverloadedFunctionDecl *Overloads
400 = cast<OverloadedFunctionDecl>(DRE->getDecl());
401
402 // FIXME: Do we have to check
403 // IsAcceptableNonMemberOperatorCandidate for each of these?
404 for (OverloadedFunctionDecl::function_iterator
405 F = Overloads->function_begin(),
406 FEnd = Overloads->function_end();
407 F != FEnd; ++F)
408 Functions.insert(*F);
409
410 // Add any functions found via argument-dependent lookup.
411 DeclarationName OpName
412 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
413 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
414
415 // Create the overloaded operator invocation.
416 if (E->getNumArgs() == 1 || isPostIncDec) {
417 UnaryOperator::Opcode Opc
418 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
419 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
420 Functions, move(First));
421 }
422
Mike Stump390b4cc2009-05-16 07:39:55 +0000423 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
424 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000425 BinaryOperator::Opcode Opc =
426 BinaryOperator::getOverloadedOpcode(E->getOperator());
427 OwningExprResult Result
428 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
429 Functions, Args[0], Args[1]);
430
431 if (Result.isInvalid())
432 return SemaRef.ExprError();
433
434 First.release();
435 Second.release();
436 return move(Result);
437}
438
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000439Sema::OwningExprResult
440TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
441 VarDecl *Var
442 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
443 SemaRef.CurContext,
444 TemplateArgs));
445 if (!Var)
446 return SemaRef.ExprError();
447
Douglas Gregore06274d2009-05-20 21:51:01 +0000448 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000449 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
450 E->getStartLoc(),
451 SourceLocation(),
452 Var));
453}
454
Douglas Gregoraa6af222009-03-25 00:27:28 +0000455Sema::OwningExprResult
456TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
457 Sema::OwningExprResult Cond = Visit(E->getCond());
458 if (Cond.isInvalid())
459 return SemaRef.ExprError();
460
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000461 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
462 TemplateArgs);
463 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000464 return SemaRef.ExprError();
465
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000466 Sema::OwningExprResult RHS = Visit(E->getRHS());
467 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000468 return SemaRef.ExprError();
469
470 if (!E->isTypeDependent()) {
471 // Since our original expression was not type-dependent, we do not
472 // perform lookup again at instantiation time (C++ [temp.dep]p1).
473 // Instead, we just build the new conditional operator call expression.
474 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
475 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000476 LHS.takeAs<Expr>(),
477 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000478 E->getType()));
479 }
480
481
482 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
483 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000484 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000485}
486
Douglas Gregorcd938172009-05-19 20:31:21 +0000487Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000488 Sema::OwningStmtResult SubStmt
489 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000490 if (SubStmt.isInvalid())
491 return SemaRef.ExprError();
492
493 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
494 E->getRParenLoc());
495}
496
Douglas Gregoraa6af222009-03-25 00:27:28 +0000497Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000498TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000499 assert(false && "__builtin_types_compatible_p is not legal in C++");
500 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000501}
502
503Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000504TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000505 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000506 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
507 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000508 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000509 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000510
511 SubExprs.push_back(SubExpr.takeAs<Expr>());
512 }
513
514 // Find the declaration for __builtin_shufflevector
515 const IdentifierInfo &Name
516 = SemaRef.Context.Idents.get("__builtin_shufflevector");
517 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
518 DeclContext::lookup_result Lookup
519 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
520 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
521
522 // Build a reference to the __builtin_shufflevector builtin
523 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
524 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
525 E->getBuiltinLoc(),
526 false, false);
527 SemaRef.UsualUnaryConversions(Callee);
528
529 // Build the CallExpr
530 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000531 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000532 SubExprs.size(),
533 Builtin->getResultType(),
534 E->getRParenLoc());
535 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
536
537 // Type-check the __builtin_shufflevector expression.
538 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
539 if (Result.isInvalid())
540 return SemaRef.ExprError();
541
542 OwnedCall.release();
543 return move(Result);
544}
545
546Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000547TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
548 OwningExprResult Cond = Visit(E->getCond());
549 if (Cond.isInvalid())
550 return SemaRef.ExprError();
551
552 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
553 if (LHS.isInvalid())
554 return SemaRef.ExprError();
555
556 OwningExprResult RHS = Visit(E->getRHS());
557 if (RHS.isInvalid())
558 return SemaRef.ExprError();
559
560 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
561 move(Cond), move(LHS), move(RHS),
562 E->getRParenLoc());
563}
564
Douglas Gregordd027302009-05-19 23:10:31 +0000565Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
566 OwningExprResult SubExpr = Visit(E->getSubExpr());
567 if (SubExpr.isInvalid())
568 return SemaRef.ExprError();
569
570 SourceLocation FakeTypeLoc
571 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
572 .getEnd());
573 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
574 /*FIXME:*/FakeTypeLoc,
575 DeclarationName());
576 if (T.isNull())
577 return SemaRef.ExprError();
578
579 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
580 T.getAsOpaquePtr(), E->getRParenLoc());
581}
582
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000583Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000584TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
585 ExprVector Inits(SemaRef);
586 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
587 OwningExprResult Init = Visit(E->getInit(I));
588 if (Init.isInvalid())
589 return SemaRef.ExprError();
590 Inits.push_back(Init.takeAs<Expr>());
591 }
592
593 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
594 E->getRBraceLoc());
595}
596
597Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000598TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
599 bool isSizeOf = E->isSizeOf();
600
601 if (E->isArgumentType()) {
602 QualType T = E->getArgumentType();
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 /*FIXME*/E->getOperatorLoc(),
606 &SemaRef.PP.getIdentifierTable().get("sizeof"));
607 if (T.isNull())
608 return SemaRef.ExprError();
609 }
610
611 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
612 E->getSourceRange());
613 }
614
615 Sema::OwningExprResult Arg = Visit(E->getArgumentExpr());
616 if (Arg.isInvalid())
617 return SemaRef.ExprError();
618
619 Sema::OwningExprResult Result
620 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
621 isSizeOf, E->getSourceRange());
622 if (Result.isInvalid())
623 return SemaRef.ExprError();
624
625 Arg.release();
626 return move(Result);
627}
628
629Sema::OwningExprResult
630TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000631 NestedNameSpecifier *NNS
632 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
633 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000634 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000635 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000636 return SemaRef.ExprError();
637
Douglas Gregorab452ba2009-03-26 23:50:42 +0000638 CXXScopeSpec SS;
639 SS.setRange(E->getQualifierRange());
640 SS.setScopeRep(NNS);
641
Douglas Gregoraa6af222009-03-25 00:27:28 +0000642 // FIXME: We're passing in a NULL scope, because
643 // ActOnDeclarationNameExpr doesn't actually use the scope when we
644 // give it a non-empty scope specifier. Investigate whether it would
645 // be better to refactor ActOnDeclarationNameExpr.
646 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
647 E->getDeclName(),
648 /*HasTrailingLParen=*/false,
649 &SS,
650 /*FIXME:isAddressOfOperand=*/false);
651}
652
653Sema::OwningExprResult
654TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
655 CXXTemporaryObjectExpr *E) {
656 QualType T = E->getType();
657 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000658 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000659 E->getTypeBeginLoc(), DeclarationName());
660 if (T.isNull())
661 return SemaRef.ExprError();
662 }
663
Douglas Gregord7e27052009-05-20 22:33:37 +0000664 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000665 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000666 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
667 ArgEnd = E->arg_end();
668 Arg != ArgEnd; ++Arg) {
669 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000670 if (InstantiatedArg.isInvalid())
671 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000672
673 Args.push_back((Expr *)InstantiatedArg.release());
674 }
675
Douglas Gregord7e27052009-05-20 22:33:37 +0000676 SourceLocation CommaLoc;
677 // FIXME: HACK!
678 if (Args.size() > 1) {
679 Expr *First = (Expr *)Args[0];
680 CommaLoc
681 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000682 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000683 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
684 /*, FIXME*/),
685 T.getAsOpaquePtr(),
686 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000687 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000688 /*HACK*/&CommaLoc,
689 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000690}
691
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000692Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
693 assert(false && "Cannot instantiate abstract CastExpr");
694 return SemaRef.ExprError();
695}
696
Douglas Gregoraa6af222009-03-25 00:27:28 +0000697Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
698 ImplicitCastExpr *E) {
699 assert(!E->isTypeDependent() && "Implicit casts must have known types");
700
701 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
702 if (SubExpr.isInvalid())
703 return SemaRef.ExprError();
704
705 ImplicitCastExpr *ICE =
706 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
707 (Expr *)SubExpr.release(),
708 E->isLvalueCast());
709 return SemaRef.Owned(ICE);
710}
711
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000712Sema::OwningExprResult
713TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
714 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
715 return SemaRef.ExprError();
716}
717
718Sema::OwningExprResult
719TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
720 // Instantiate the type that we're casting to.
721 SourceLocation TypeStartLoc
722 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
723 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
724 TemplateArgs,
725 TypeStartLoc,
726 DeclarationName());
727 if (ExplicitTy.isNull())
728 return SemaRef.ExprError();
729
730 // Instantiate the subexpression.
731 OwningExprResult SubExpr = Visit(E->getSubExpr());
732 if (SubExpr.isInvalid())
733 return SemaRef.ExprError();
734
735 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
736 ExplicitTy.getAsOpaquePtr(),
737 E->getRParenLoc(),
738 move(SubExpr));
739}
740
741Sema::OwningExprResult
742TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
743 // Figure out which cast operator we're dealing with.
744 tok::TokenKind Kind;
745 switch (E->getStmtClass()) {
746 case Stmt::CXXStaticCastExprClass:
747 Kind = tok::kw_static_cast;
748 break;
749
750 case Stmt::CXXDynamicCastExprClass:
751 Kind = tok::kw_dynamic_cast;
752 break;
753
754 case Stmt::CXXReinterpretCastExprClass:
755 Kind = tok::kw_reinterpret_cast;
756 break;
757
758 case Stmt::CXXConstCastExprClass:
759 Kind = tok::kw_const_cast;
760 break;
761
762 default:
763 assert(false && "Invalid C++ named cast");
764 return SemaRef.ExprError();
765 }
766
767 // Instantiate the type that we're casting to.
768 SourceLocation TypeStartLoc
769 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
770 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
771 TemplateArgs,
772 TypeStartLoc,
773 DeclarationName());
774 if (ExplicitTy.isNull())
775 return SemaRef.ExprError();
776
777 // Instantiate the subexpression.
778 OwningExprResult SubExpr = Visit(E->getSubExpr());
779 if (SubExpr.isInvalid())
780 return SemaRef.ExprError();
781
782 SourceLocation FakeLAngleLoc
783 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
784 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
785 SourceLocation FakeRParenLoc
786 = SemaRef.PP.getLocForEndOfToken(
787 E->getSubExpr()->getSourceRange().getEnd());
788 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
789 /*FIXME:*/FakeLAngleLoc,
790 ExplicitTy.getAsOpaquePtr(),
791 /*FIXME:*/FakeRAngleLoc,
792 /*FIXME:*/FakeRAngleLoc,
793 move(SubExpr),
794 /*FIXME:*/FakeRParenLoc);
795}
796
797Sema::OwningExprResult
798TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
799 return VisitCXXNamedCastExpr(E);
800}
801
802Sema::OwningExprResult
803TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
804 return VisitCXXNamedCastExpr(E);
805}
806
807Sema::OwningExprResult
808TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
809 CXXReinterpretCastExpr *E) {
810 return VisitCXXNamedCastExpr(E);
811}
812
813Sema::OwningExprResult
814TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
815 return VisitCXXNamedCastExpr(E);
816}
817
Anders Carlsson0712d292009-05-15 20:26:03 +0000818Sema::OwningExprResult
819TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
820 QualType ThisType =
821 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
822
823 CXXThisExpr *TE =
824 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
825
826 return SemaRef.Owned(TE);
827}
828
Douglas Gregoraa6af222009-03-25 00:27:28 +0000829Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000830TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
831 if (E->isTypeOperand()) {
832 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
833 TemplateArgs,
834 /*FIXME*/E->getSourceRange().getBegin(),
835 DeclarationName());
836 if (T.isNull())
837 return SemaRef.ExprError();
838
839 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
840 /*FIXME*/E->getSourceRange().getBegin(),
841 true, T.getAsOpaquePtr(),
842 E->getSourceRange().getEnd());
843 }
844
845 OwningExprResult Operand = Visit(E->getExprOperand());
846 if (Operand.isInvalid())
847 return SemaRef.ExprError();
848
849 OwningExprResult Result
850 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
851 /*FIXME*/E->getSourceRange().getBegin(),
852 false, Operand.get(),
853 E->getSourceRange().getEnd());
854 if (Result.isInvalid())
855 return SemaRef.ExprError();
856
857 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
858 return move(Result);
859}
860
861Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +0000862TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
863 OwningExprResult SubExpr(SemaRef, (void *)0);
864 if (E->getSubExpr()) {
865 SubExpr = Visit(E->getSubExpr());
866 if (SubExpr.isInvalid())
867 return SemaRef.ExprError();
868 }
869
870 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
871}
872
873Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +0000874TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
875 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
876 ->isDependentType() && "Dependent constructor shouldn't be here");
877
878 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
879 /*FIXME*/E->getSourceRange().getBegin(),
880 DeclarationName());
881 if (T.isNull())
882 return SemaRef.ExprError();
883
Douglas Gregord7e27052009-05-20 22:33:37 +0000884 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +0000885 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
886 ArgEnd = E->arg_end();
887 Arg != ArgEnd; ++Arg) {
888 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000889 if (ArgInst.isInvalid())
890 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +0000891
892 Args.push_back(ArgInst.takeAs<Expr>());
893 }
894
895
Douglas Gregord7e27052009-05-20 22:33:37 +0000896 VarDecl *Var = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
897 SemaRef.CurContext,
898 TemplateArgs));
899 if (!Var)
Douglas Gregord94546a2009-05-20 21:38:11 +0000900 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +0000901
Douglas Gregore06274d2009-05-20 21:51:01 +0000902 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregord94546a2009-05-20 21:38:11 +0000903 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, Var, T,
904 E->getConstructor(),
905 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +0000906 Args.takeAs<Expr>(),
907 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +0000908}
909
910Sema::OwningExprResult
911TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
912 CXXFunctionalCastExpr *E) {
913 // Instantiate the type that we're casting to.
914 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
915 TemplateArgs,
916 E->getTypeBeginLoc(),
917 DeclarationName());
918 if (ExplicitTy.isNull())
919 return SemaRef.ExprError();
920
921 // Instantiate the subexpression.
922 OwningExprResult SubExpr = Visit(E->getSubExpr());
923 if (SubExpr.isInvalid())
924 return SemaRef.ExprError();
925
926 // FIXME: The end of the type's source range is wrong
927 Expr *Sub = SubExpr.takeAs<Expr>();
928 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
929 ExplicitTy.getAsOpaquePtr(),
930 /*FIXME:*/E->getTypeBeginLoc(),
931 Sema::MultiExprArg(SemaRef,
932 (void **)&Sub,
933 1),
934 0,
935 E->getRParenLoc());
936}
937
938Sema::OwningExprResult
939TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
940 return SemaRef.Clone(E);
941}
942
943Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +0000944TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
945 // Instantiate the type that we're allocating
946 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
947 TemplateArgs,
948 /*FIXME:*/E->getSourceRange().getBegin(),
949 DeclarationName());
950 if (AllocType.isNull())
951 return SemaRef.ExprError();
952
953 // Instantiate the size of the array we're allocating (if any).
954 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
955 TemplateArgs);
956 if (ArraySize.isInvalid())
957 return SemaRef.ExprError();
958
959 // Instantiate the placement arguments (if any).
960 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
961 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
962 OwningExprResult Arg = Visit(E->getPlacementArg(I));
963 if (Arg.isInvalid())
964 return SemaRef.ExprError();
965
966 PlacementArgs.push_back(Arg.take());
967 }
968
969 // Instantiate the constructor arguments (if any).
970 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
971 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
972 OwningExprResult Arg = Visit(E->getConstructorArg(I));
973 if (Arg.isInvalid())
974 return SemaRef.ExprError();
975
976 ConstructorArgs.push_back(Arg.take());
977 }
978
979 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
980 E->isGlobalNew(),
981 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000982 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +0000983 /*FIXME*/SourceLocation(),
984 E->isParenTypeId(),
985 AllocType,
986 /*FIXME*/E->getSourceRange().getBegin(),
987 SourceRange(),
988 move(ArraySize),
989 /*FIXME*/SourceLocation(),
990 Sema::MultiExprArg(SemaRef,
991 ConstructorArgs.take(),
992 ConstructorArgs.size()),
993 E->getSourceRange().getEnd());
994}
995
996Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +0000997TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
998 OwningExprResult Operand = Visit(E->getArgument());
999 if (Operand.isInvalid())
1000 return SemaRef.ExprError();
1001
1002 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1003 E->isGlobalDelete(),
1004 E->isArrayForm(),
1005 move(Operand));
1006}
1007
1008Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001009TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1010 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1011 /*FIXME*/E->getSourceRange().getBegin(),
1012 DeclarationName());
1013 if (T.isNull())
1014 return SemaRef.ExprError();
1015
1016 SourceLocation FakeLParenLoc
1017 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1018 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1019 E->getSourceRange().getBegin(),
1020 /*FIXME*/FakeLParenLoc,
1021 T.getAsOpaquePtr(),
1022 E->getSourceRange().getEnd());
1023}
1024
1025Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001026TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1027 CXXExprWithTemporaries *E) {
1028 OwningExprResult SubExpr = Visit(E->getSubExpr());
1029 if (SubExpr.isInvalid())
1030 return SemaRef.ExprError();
1031
1032 return SemaRef.ActOnFinishFullExpr(move(SubExpr));
1033}
1034
1035Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001036TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1037 CXXUnresolvedConstructExpr *E) {
1038 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1039 E->getTypeBeginLoc(),
1040 DeclarationName());
1041 if (T.isNull())
1042 return SemaRef.ExprError();
1043
Douglas Gregord7e27052009-05-20 22:33:37 +00001044 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001045 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1046 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1047 ArgEnd = E->arg_end();
1048 Arg != ArgEnd; ++Arg) {
1049 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001050 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001051 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001052
1053 FakeCommaLocs.push_back(
1054 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1055 Args.push_back(InstArg.takeAs<Expr>());
1056 }
1057
1058 // FIXME: The end of the type range isn't exactly correct.
1059 // FIXME: we're faking the locations of the commas
1060 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1061 E->getLParenLoc()),
1062 T.getAsOpaquePtr(),
1063 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001064 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001065 &FakeCommaLocs.front(),
1066 E->getRParenLoc());
1067}
1068
1069Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001070Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001071 if (!E)
1072 return Owned((Expr *)0);
1073
Douglas Gregor7e063902009-05-11 23:53:27 +00001074 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001075 return Instantiator.Visit(E);
1076}