blob: 14eef13f8d015f52092212b10a17938e9004dbf8 [file] [log] [blame]
Douglas Gregorb70ccad2009-05-15 18:22:25 +00001//===--- SemaTemplateInstantiateExpr.cpp - C++ Template Expr Instantiation ===/
Douglas Gregoraa6af222009-03-25 00:27:28 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//===----------------------------------------------------------------------===/
8//
Douglas Gregorb70ccad2009-05-15 18:22:25 +00009// This file implements C++ template instantiation for expressions.
Douglas Gregoraa6af222009-03-25 00:27:28 +000010//
11//===----------------------------------------------------------------------===/
12#include "Sema.h"
13#include "clang/AST/ASTContext.h"
14#include "clang/AST/DeclTemplate.h"
15#include "clang/AST/StmtVisitor.h"
16#include "clang/AST/Expr.h"
17#include "clang/AST/ExprCXX.h"
18#include "clang/Parse/DeclSpec.h"
Douglas Gregor9ea62762009-05-21 23:17:49 +000019#include "clang/Parse/Designator.h"
Douglas Gregoraa6af222009-03-25 00:27:28 +000020#include "clang/Lex/Preprocessor.h" // for the identifier table
21#include "llvm/Support/Compiler.h"
22using namespace clang;
23
24namespace {
25 class VISIBILITY_HIDDEN TemplateExprInstantiator
26 : public StmtVisitor<TemplateExprInstantiator, Sema::OwningExprResult> {
27 Sema &SemaRef;
Douglas Gregor7e063902009-05-11 23:53:27 +000028 const TemplateArgumentList &TemplateArgs;
Douglas Gregoraa6af222009-03-25 00:27:28 +000029
30 public:
31 typedef Sema::OwningExprResult OwningExprResult;
32
33 TemplateExprInstantiator(Sema &SemaRef,
Douglas Gregor7e063902009-05-11 23:53:27 +000034 const TemplateArgumentList &TemplateArgs)
35 : SemaRef(SemaRef), TemplateArgs(TemplateArgs) { }
Douglas Gregoraa6af222009-03-25 00:27:28 +000036
Mike Stump390b4cc2009-05-16 07:39:55 +000037 // FIXME: Once we get closer to completion, replace these manually-written
38 // declarations with automatically-generated ones from
39 // clang/AST/StmtNodes.def.
Sebastian Redl8b0b4752009-05-16 18:50:46 +000040 OwningExprResult VisitPredefinedExpr(PredefinedExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000041 OwningExprResult VisitIntegerLiteral(IntegerLiteral *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000042 OwningExprResult VisitFloatingLiteral(FloatingLiteral *E);
43 OwningExprResult VisitStringLiteral(StringLiteral *E);
44 OwningExprResult VisitCharacterLiteral(CharacterLiteral *E);
Douglas Gregord8ac4362009-05-18 22:38:38 +000045 OwningExprResult VisitImaginaryLiteral(ImaginaryLiteral *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000046 OwningExprResult VisitDeclRefExpr(DeclRefExpr *E);
47 OwningExprResult VisitParenExpr(ParenExpr *E);
48 OwningExprResult VisitUnaryOperator(UnaryOperator *E);
Douglas Gregor3384c9c2009-05-19 00:01:19 +000049 OwningExprResult VisitArraySubscriptExpr(ArraySubscriptExpr *E);
Douglas Gregor4a2487a2009-05-19 00:38:01 +000050 OwningExprResult VisitCallExpr(CallExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000051 // FIXME: VisitMemberExpr
52 // FIXME: CompoundLiteralExpr
Douglas Gregoraa6af222009-03-25 00:27:28 +000053 OwningExprResult VisitBinaryOperator(BinaryOperator *E);
Douglas Gregor6731c312009-05-19 20:02:01 +000054 OwningExprResult VisitCompoundAssignOperator(CompoundAssignOperator *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000055 OwningExprResult VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
Douglas Gregor4a2e2042009-05-15 21:45:53 +000056 OwningExprResult VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000057 OwningExprResult VisitConditionalOperator(ConditionalOperator *E);
Douglas Gregorcd938172009-05-19 20:31:21 +000058 // FIXME: AddrLabelExpr
59 OwningExprResult VisitStmtExpr(StmtExpr *E);
Douglas Gregordc241b42009-05-19 20:55:31 +000060 OwningExprResult VisitTypesCompatibleExpr(TypesCompatibleExpr *E);
Douglas Gregorcde01732009-05-19 22:10:17 +000061 OwningExprResult VisitShuffleVectorExpr(ShuffleVectorExpr *E);
Douglas Gregorc9ecc572009-05-19 22:43:30 +000062 OwningExprResult VisitChooseExpr(ChooseExpr *E);
Douglas Gregordd027302009-05-19 23:10:31 +000063 OwningExprResult VisitVAArgExpr(VAArgExpr *E);
Douglas Gregorccb97f52009-05-21 21:38:12 +000064 OwningExprResult VisitInitListExpr(InitListExpr *E);
Douglas Gregor9ea62762009-05-21 23:17:49 +000065 OwningExprResult VisitDesignatedInitExpr(DesignatedInitExpr *E);
66 OwningExprResult VisitImplicitValueInitExpr(ImplicitValueInitExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000067 // FIXME: ExtVectorElementExpr
68 // FIXME: BlockExpr
69 // FIXME: BlockDeclRefExpr
Douglas Gregoraa6af222009-03-25 00:27:28 +000070 OwningExprResult VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E);
71 OwningExprResult VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E);
72 OwningExprResult VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000073 OwningExprResult VisitCastExpr(CastExpr *E);
Douglas Gregoraa6af222009-03-25 00:27:28 +000074 OwningExprResult VisitImplicitCastExpr(ImplicitCastExpr *E);
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000075 OwningExprResult VisitExplicitCastExpr(ExplicitCastExpr *E);
76 OwningExprResult VisitCStyleCastExpr(CStyleCastExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000077 // FIXME: CXXMemberCallExpr
Douglas Gregora3a7b8e2009-05-19 19:05:47 +000078 OwningExprResult VisitCXXNamedCastExpr(CXXNamedCastExpr *E);
79 OwningExprResult VisitCXXStaticCastExpr(CXXStaticCastExpr *E);
80 OwningExprResult VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E);
81 OwningExprResult VisitCXXReinterpretCastExpr(CXXReinterpretCastExpr *E);
82 OwningExprResult VisitCXXConstCastExpr(CXXConstCastExpr *E);
Anders Carlsson0712d292009-05-15 20:26:03 +000083 OwningExprResult VisitCXXThisExpr(CXXThisExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000084 OwningExprResult VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E);
85 OwningExprResult VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E);
Douglas Gregor12d0c302009-05-21 18:34:44 +000086 OwningExprResult VisitCXXTypeidExpr(CXXTypeidExpr *E);
Douglas Gregor42e5b502009-05-21 17:37:52 +000087 OwningExprResult VisitCXXThrowExpr(CXXThrowExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000088 // FIXME: CXXDefaultArgExpr
Douglas Gregord94546a2009-05-20 21:38:11 +000089 OwningExprResult VisitCXXConstructExpr(CXXConstructExpr *E);
90 OwningExprResult VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *E);
91 OwningExprResult VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E);
Douglas Gregor3433cf72009-05-21 00:00:09 +000092 OwningExprResult VisitCXXNewExpr(CXXNewExpr *E);
Douglas Gregord0c02672009-05-21 17:21:12 +000093 OwningExprResult VisitCXXDeleteExpr(CXXDeleteExpr *E);
Douglas Gregor36bb03b2009-05-21 18:55:48 +000094 OwningExprResult VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000095 // FIXME: QualifiedDeclRefExpr
Douglas Gregore06274d2009-05-20 21:51:01 +000096 OwningExprResult VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E);
Douglas Gregord81e6ca2009-05-20 18:46:25 +000097 OwningExprResult VisitCXXUnresolvedConstructExpr(
98 CXXUnresolvedConstructExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +000099 OwningExprResult VisitGNUNullExpr(GNUNullExpr *E);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000100 OwningExprResult VisitUnresolvedFunctionNameExpr(
101 UnresolvedFunctionNameExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000102
Douglas Gregoraa6af222009-03-25 00:27:28 +0000103 // Base case. I'm supposed to ignore this.
104 Sema::OwningExprResult VisitStmt(Stmt *S) {
105 S->dump();
106 assert(false && "Cannot instantiate this kind of expression");
107 return SemaRef.ExprError();
108 }
109 };
110}
111
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000112Sema::OwningExprResult
113TemplateExprInstantiator::VisitPredefinedExpr(PredefinedExpr *E) {
114 return SemaRef.Clone(E);
115}
116
117Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000118TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) {
119 return SemaRef.Clone(E);
120}
121
122Sema::OwningExprResult
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000123TemplateExprInstantiator::VisitFloatingLiteral(FloatingLiteral *E) {
124 return SemaRef.Clone(E);
125}
126
127Sema::OwningExprResult
128TemplateExprInstantiator::VisitStringLiteral(StringLiteral *E) {
129 return SemaRef.Clone(E);
130}
131
132Sema::OwningExprResult
133TemplateExprInstantiator::VisitCharacterLiteral(CharacterLiteral *E) {
134 return SemaRef.Clone(E);
135}
136
Douglas Gregord8ac4362009-05-18 22:38:38 +0000137Sema::OwningExprResult
138TemplateExprInstantiator::VisitImaginaryLiteral(ImaginaryLiteral *E) {
139 return SemaRef.Clone(E);
140}
141
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000142Sema::OwningExprResult
143TemplateExprInstantiator::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
144 return SemaRef.Clone(E);
145}
146
147Sema::OwningExprResult
148TemplateExprInstantiator::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
149 return SemaRef.Clone(E);
150}
151
152Sema::OwningExprResult
153TemplateExprInstantiator::VisitGNUNullExpr(GNUNullExpr *E) {
154 return SemaRef.Clone(E);
155}
156
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000157Sema::OwningExprResult
158TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr(
159 UnresolvedFunctionNameExpr *E) {
160 return SemaRef.Clone(E);
161}
162
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000163Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000164TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
165 Decl *D = E->getDecl();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000166 ValueDecl *NewD = 0;
Douglas Gregoraa6af222009-03-25 00:27:28 +0000167 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
168 assert(NTTP->getDepth() == 0 && "No nested templates yet");
169 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
170 QualType T = Arg.getIntegralType();
171 if (T->isCharType() || T->isWideCharType())
172 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
173 Arg.getAsIntegral()->getZExtValue(),
174 T->isWideCharType(),
175 T,
176 E->getSourceRange().getBegin()));
177 else if (T->isBooleanType())
178 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
179 Arg.getAsIntegral()->getBoolValue(),
180 T,
181 E->getSourceRange().getBegin()));
182
183 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
184 *Arg.getAsIntegral(),
185 T,
186 E->getSourceRange().getBegin()));
Douglas Gregordd027302009-05-19 23:10:31 +0000187 } else if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000188 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Parm);
Douglas Gregordd027302009-05-19 23:10:31 +0000189 } else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
190 if (Var->hasLocalStorage())
191 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Var);
192 else
193 assert(false && "Cannot instantiation non-local variable declarations");
194 } else if (isa<FunctionDecl>(D) || isa<OverloadedFunctionDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000195 // FIXME: Instantiate decl!
196 NewD = cast<ValueDecl>(D);
Douglas Gregordd027302009-05-19 23:10:31 +0000197 } else
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000198 assert(false && "Unhandled declaratrion reference kind");
199
200 if (!NewD)
201 return SemaRef.ExprError();
202
203 QualType T = NewD->getType();
204 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000205 T.getNonReferenceType(),
206 E->getLocation(),
207 T->isDependentType(),
208 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000209}
210
211Sema::OwningExprResult
212TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
213 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
214 if (SubExpr.isInvalid())
215 return SemaRef.ExprError();
216
217 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
218 E->getLParen(), E->getRParen(),
219 (Expr *)SubExpr.release()));
220}
221
222Sema::OwningExprResult
223TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
224 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
225 if (Arg.isInvalid())
226 return SemaRef.ExprError();
227
228 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
229 E->getOpcode(),
230 move(Arg));
231}
232
233Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000234TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
235 Sema::OwningExprResult LHS = Visit(E->getLHS());
236 if (LHS.isInvalid())
237 return SemaRef.ExprError();
238
239 Sema::OwningExprResult RHS = Visit(E->getRHS());
240 if (RHS.isInvalid())
241 return SemaRef.ExprError();
242
243 // Since the overloaded array-subscript operator (operator[]) can
244 // only be a member function, we can make several simplifying
245 // assumptions here:
246 // 1) Normal name lookup (from the current scope) will not ever
247 // find any declarations of operator[] that won't also be found be
248 // member operator lookup, so it is safe to pass a NULL Scope
249 // during the instantiation to avoid the lookup entirely.
250 //
251 // 2) Neither normal name lookup nor argument-dependent lookup at
252 // template definition time will find any operators that won't be
253 // found at template instantiation time, so we do not need to
254 // cache the results of name lookup as we do for the binary
255 // operators.
256 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
257 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
258 /*FIXME:*/LLocFake,
259 move(RHS),
260 E->getRBracketLoc());
261}
262
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000263Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
264 // Instantiate callee
265 OwningExprResult Callee = Visit(E->getCallee());
266 if (Callee.isInvalid())
267 return SemaRef.ExprError();
268
269 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000270 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000271 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
272 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
273 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000274 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000275 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000276
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,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000286 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000287 /*FIXME:*/&FakeCommaLocs.front(),
288 E->getRParenLoc());
289}
290
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000291Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000292TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
293 Sema::OwningExprResult LHS = Visit(E->getLHS());
294 if (LHS.isInvalid())
295 return SemaRef.ExprError();
296
297 Sema::OwningExprResult RHS = Visit(E->getRHS());
298 if (RHS.isInvalid())
299 return SemaRef.ExprError();
300
301 Sema::OwningExprResult Result
302 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
303 E->getOpcode(),
304 (Expr *)LHS.get(),
305 (Expr *)RHS.get());
306 if (Result.isInvalid())
307 return SemaRef.ExprError();
308
309 LHS.release();
310 RHS.release();
311 return move(Result);
312}
313
314Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000315TemplateExprInstantiator::VisitCompoundAssignOperator(
316 CompoundAssignOperator *E) {
317 return VisitBinaryOperator(E);
318}
319
320Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000321TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
322 Sema::OwningExprResult First = Visit(E->getArg(0));
323 if (First.isInvalid())
324 return SemaRef.ExprError();
325
326 Expr *Args[2] = { (Expr *)First.get(), 0 };
327
328 Sema::OwningExprResult Second(SemaRef);
329 if (E->getNumArgs() == 2) {
330 Second = Visit(E->getArg(1));
331
332 if (Second.isInvalid())
333 return SemaRef.ExprError();
334
335 Args[1] = (Expr *)Second.get();
336 }
337
338 if (!E->isTypeDependent()) {
339 // Since our original expression was not type-dependent, we do not
340 // perform lookup again at instantiation time (C++ [temp.dep]p1).
341 // Instead, we just build the new overloaded operator call
342 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000343 OwningExprResult Callee = Visit(E->getCallee());
344 if (Callee.isInvalid())
345 return SemaRef.ExprError();
346
Douglas Gregoraa6af222009-03-25 00:27:28 +0000347 First.release();
348 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000349
Douglas Gregoraa6af222009-03-25 00:27:28 +0000350 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
351 SemaRef.Context,
352 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000353 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000354 Args, E->getNumArgs(),
355 E->getType(),
356 E->getOperatorLoc()));
357 }
358
359 bool isPostIncDec = E->getNumArgs() == 2 &&
360 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
361 if (E->getNumArgs() == 1 || isPostIncDec) {
362 if (!Args[0]->getType()->isOverloadableType()) {
363 // The argument is not of overloadable type, so try to create a
364 // built-in unary operation.
365 UnaryOperator::Opcode Opc
366 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
367
368 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
369 move(First));
370 }
371
372 // Fall through to perform overload resolution
373 } else {
374 assert(E->getNumArgs() == 2 && "Expected binary operation");
375
376 Sema::OwningExprResult Result(SemaRef);
377 if (!Args[0]->getType()->isOverloadableType() &&
378 !Args[1]->getType()->isOverloadableType()) {
379 // Neither of the arguments is an overloadable type, so try to
380 // create a built-in binary operation.
381 BinaryOperator::Opcode Opc =
382 BinaryOperator::getOverloadedOpcode(E->getOperator());
383 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
384 Args[0], Args[1]);
385 if (Result.isInvalid())
386 return SemaRef.ExprError();
387
388 First.release();
389 Second.release();
390 return move(Result);
391 }
392
393 // Fall through to perform overload resolution.
394 }
395
396 // Compute the set of functions that were found at template
397 // definition time.
398 Sema::FunctionSet Functions;
399 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
400 OverloadedFunctionDecl *Overloads
401 = cast<OverloadedFunctionDecl>(DRE->getDecl());
402
403 // FIXME: Do we have to check
404 // IsAcceptableNonMemberOperatorCandidate for each of these?
405 for (OverloadedFunctionDecl::function_iterator
406 F = Overloads->function_begin(),
407 FEnd = Overloads->function_end();
408 F != FEnd; ++F)
409 Functions.insert(*F);
410
411 // Add any functions found via argument-dependent lookup.
412 DeclarationName OpName
413 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
414 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
415
416 // Create the overloaded operator invocation.
417 if (E->getNumArgs() == 1 || isPostIncDec) {
418 UnaryOperator::Opcode Opc
419 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
420 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
421 Functions, move(First));
422 }
423
Mike Stump390b4cc2009-05-16 07:39:55 +0000424 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
425 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000426 BinaryOperator::Opcode Opc =
427 BinaryOperator::getOverloadedOpcode(E->getOperator());
428 OwningExprResult Result
429 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
430 Functions, Args[0], Args[1]);
431
432 if (Result.isInvalid())
433 return SemaRef.ExprError();
434
435 First.release();
436 Second.release();
437 return move(Result);
438}
439
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000440Sema::OwningExprResult
441TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
442 VarDecl *Var
443 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
444 SemaRef.CurContext,
445 TemplateArgs));
446 if (!Var)
447 return SemaRef.ExprError();
448
Douglas Gregore06274d2009-05-20 21:51:01 +0000449 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000450 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
451 E->getStartLoc(),
452 SourceLocation(),
453 Var));
454}
455
Douglas Gregoraa6af222009-03-25 00:27:28 +0000456Sema::OwningExprResult
457TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
458 Sema::OwningExprResult Cond = Visit(E->getCond());
459 if (Cond.isInvalid())
460 return SemaRef.ExprError();
461
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000462 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
463 TemplateArgs);
464 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000465 return SemaRef.ExprError();
466
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000467 Sema::OwningExprResult RHS = Visit(E->getRHS());
468 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000469 return SemaRef.ExprError();
470
471 if (!E->isTypeDependent()) {
472 // Since our original expression was not type-dependent, we do not
473 // perform lookup again at instantiation time (C++ [temp.dep]p1).
474 // Instead, we just build the new conditional operator call expression.
475 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
476 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000477 LHS.takeAs<Expr>(),
478 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000479 E->getType()));
480 }
481
482
483 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
484 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000485 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000486}
487
Douglas Gregorcd938172009-05-19 20:31:21 +0000488Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000489 Sema::OwningStmtResult SubStmt
490 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000491 if (SubStmt.isInvalid())
492 return SemaRef.ExprError();
493
494 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
495 E->getRParenLoc());
496}
497
Douglas Gregoraa6af222009-03-25 00:27:28 +0000498Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000499TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000500 assert(false && "__builtin_types_compatible_p is not legal in C++");
501 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000502}
503
504Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000505TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000506 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000507 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
508 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000509 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000510 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000511
512 SubExprs.push_back(SubExpr.takeAs<Expr>());
513 }
514
515 // Find the declaration for __builtin_shufflevector
516 const IdentifierInfo &Name
517 = SemaRef.Context.Idents.get("__builtin_shufflevector");
518 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
519 DeclContext::lookup_result Lookup
520 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
521 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
522
523 // Build a reference to the __builtin_shufflevector builtin
524 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
525 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
526 E->getBuiltinLoc(),
527 false, false);
528 SemaRef.UsualUnaryConversions(Callee);
529
530 // Build the CallExpr
531 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000532 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000533 SubExprs.size(),
534 Builtin->getResultType(),
535 E->getRParenLoc());
536 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
537
538 // Type-check the __builtin_shufflevector expression.
539 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
540 if (Result.isInvalid())
541 return SemaRef.ExprError();
542
543 OwnedCall.release();
544 return move(Result);
545}
546
547Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000548TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
549 OwningExprResult Cond = Visit(E->getCond());
550 if (Cond.isInvalid())
551 return SemaRef.ExprError();
552
553 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
554 if (LHS.isInvalid())
555 return SemaRef.ExprError();
556
557 OwningExprResult RHS = Visit(E->getRHS());
558 if (RHS.isInvalid())
559 return SemaRef.ExprError();
560
561 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
562 move(Cond), move(LHS), move(RHS),
563 E->getRParenLoc());
564}
565
Douglas Gregordd027302009-05-19 23:10:31 +0000566Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
567 OwningExprResult SubExpr = Visit(E->getSubExpr());
568 if (SubExpr.isInvalid())
569 return SemaRef.ExprError();
570
571 SourceLocation FakeTypeLoc
572 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
573 .getEnd());
574 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
575 /*FIXME:*/FakeTypeLoc,
576 DeclarationName());
577 if (T.isNull())
578 return SemaRef.ExprError();
579
580 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
581 T.getAsOpaquePtr(), E->getRParenLoc());
582}
583
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000584Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000585TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
586 ExprVector Inits(SemaRef);
587 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
588 OwningExprResult Init = Visit(E->getInit(I));
589 if (Init.isInvalid())
590 return SemaRef.ExprError();
591 Inits.push_back(Init.takeAs<Expr>());
592 }
593
594 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
595 E->getRBraceLoc());
596}
597
598Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000599TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
600 Designation Desig;
601
602 // Instantiate the initializer value
603 OwningExprResult Init = Visit(E->getInit());
604 if (Init.isInvalid())
605 return SemaRef.ExprError();
606
607 // Instantiate the designators.
608 ExprVector ArrayExprs(SemaRef); // Expresses used in array designators
609 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
610 DEnd = E->designators_end();
611 D != DEnd; ++D) {
612 if (D->isFieldDesignator()) {
613 Desig.AddDesignator(Designator::getField(D->getFieldName(),
614 D->getDotLoc(),
615 D->getFieldLoc()));
616 continue;
617 }
618
619 if (D->isArrayDesignator()) {
620 OwningExprResult Index = Visit(E->getArrayIndex(*D));
621 if (Index.isInvalid())
622 return SemaRef.ExprError();
623
624 Desig.AddDesignator(Designator::getArray(Index.get(),
625 D->getLBracketLoc()));
626
627 ArrayExprs.push_back(Index.release());
628 continue;
629 }
630
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000631 assert(D->isArrayRangeDesignator() && "New kind of designator?");
632 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
633 if (Start.isInvalid())
634 return SemaRef.ExprError();
635
636 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
637 if (End.isInvalid())
638 return SemaRef.ExprError();
639
640 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
641 End.get(),
642 D->getLBracketLoc(),
643 D->getEllipsisLoc()));
644
645 ArrayExprs.push_back(Start.release());
646 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000647 }
648
649 OwningExprResult Result =
650 SemaRef.ActOnDesignatedInitializer(Desig,
651 E->getEqualOrColonLoc(),
652 E->usesGNUSyntax(),
653 move(Init));
654 if (Result.isInvalid())
655 return SemaRef.ExprError();
656
657 ArrayExprs.take();
658 return move(Result);
659}
660
661Sema::OwningExprResult
662TemplateExprInstantiator::VisitImplicitValueInitExpr(
663 ImplicitValueInitExpr *E) {
664 assert(!E->isTypeDependent() && !E->isValueDependent() &&
665 "ImplicitValueInitExprs are never dependent");
666 return SemaRef.Clone(E);
667}
668
669Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000670TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
671 bool isSizeOf = E->isSizeOf();
672
673 if (E->isArgumentType()) {
674 QualType T = E->getArgumentType();
675 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000676 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000677 /*FIXME*/E->getOperatorLoc(),
678 &SemaRef.PP.getIdentifierTable().get("sizeof"));
679 if (T.isNull())
680 return SemaRef.ExprError();
681 }
682
683 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
684 E->getSourceRange());
685 }
686
687 Sema::OwningExprResult Arg = Visit(E->getArgumentExpr());
688 if (Arg.isInvalid())
689 return SemaRef.ExprError();
690
691 Sema::OwningExprResult Result
692 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
693 isSizeOf, E->getSourceRange());
694 if (Result.isInvalid())
695 return SemaRef.ExprError();
696
697 Arg.release();
698 return move(Result);
699}
700
701Sema::OwningExprResult
702TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000703 NestedNameSpecifier *NNS
704 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
705 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000706 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000707 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000708 return SemaRef.ExprError();
709
Douglas Gregorab452ba2009-03-26 23:50:42 +0000710 CXXScopeSpec SS;
711 SS.setRange(E->getQualifierRange());
712 SS.setScopeRep(NNS);
713
Douglas Gregoraa6af222009-03-25 00:27:28 +0000714 // FIXME: We're passing in a NULL scope, because
715 // ActOnDeclarationNameExpr doesn't actually use the scope when we
716 // give it a non-empty scope specifier. Investigate whether it would
717 // be better to refactor ActOnDeclarationNameExpr.
718 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
719 E->getDeclName(),
720 /*HasTrailingLParen=*/false,
721 &SS,
722 /*FIXME:isAddressOfOperand=*/false);
723}
724
725Sema::OwningExprResult
726TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
727 CXXTemporaryObjectExpr *E) {
728 QualType T = E->getType();
729 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000730 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000731 E->getTypeBeginLoc(), DeclarationName());
732 if (T.isNull())
733 return SemaRef.ExprError();
734 }
735
Douglas Gregord7e27052009-05-20 22:33:37 +0000736 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000737 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000738 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
739 ArgEnd = E->arg_end();
740 Arg != ArgEnd; ++Arg) {
741 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000742 if (InstantiatedArg.isInvalid())
743 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000744
745 Args.push_back((Expr *)InstantiatedArg.release());
746 }
747
Douglas Gregord7e27052009-05-20 22:33:37 +0000748 SourceLocation CommaLoc;
749 // FIXME: HACK!
750 if (Args.size() > 1) {
751 Expr *First = (Expr *)Args[0];
752 CommaLoc
753 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000754 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000755 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
756 /*, FIXME*/),
757 T.getAsOpaquePtr(),
758 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000759 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000760 /*HACK*/&CommaLoc,
761 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000762}
763
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000764Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
765 assert(false && "Cannot instantiate abstract CastExpr");
766 return SemaRef.ExprError();
767}
768
Douglas Gregoraa6af222009-03-25 00:27:28 +0000769Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
770 ImplicitCastExpr *E) {
771 assert(!E->isTypeDependent() && "Implicit casts must have known types");
772
773 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
774 if (SubExpr.isInvalid())
775 return SemaRef.ExprError();
776
777 ImplicitCastExpr *ICE =
778 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
779 (Expr *)SubExpr.release(),
780 E->isLvalueCast());
781 return SemaRef.Owned(ICE);
782}
783
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000784Sema::OwningExprResult
785TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
786 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
787 return SemaRef.ExprError();
788}
789
790Sema::OwningExprResult
791TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
792 // Instantiate the type that we're casting to.
793 SourceLocation TypeStartLoc
794 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
795 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
796 TemplateArgs,
797 TypeStartLoc,
798 DeclarationName());
799 if (ExplicitTy.isNull())
800 return SemaRef.ExprError();
801
802 // Instantiate the subexpression.
803 OwningExprResult SubExpr = Visit(E->getSubExpr());
804 if (SubExpr.isInvalid())
805 return SemaRef.ExprError();
806
807 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
808 ExplicitTy.getAsOpaquePtr(),
809 E->getRParenLoc(),
810 move(SubExpr));
811}
812
813Sema::OwningExprResult
814TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
815 // Figure out which cast operator we're dealing with.
816 tok::TokenKind Kind;
817 switch (E->getStmtClass()) {
818 case Stmt::CXXStaticCastExprClass:
819 Kind = tok::kw_static_cast;
820 break;
821
822 case Stmt::CXXDynamicCastExprClass:
823 Kind = tok::kw_dynamic_cast;
824 break;
825
826 case Stmt::CXXReinterpretCastExprClass:
827 Kind = tok::kw_reinterpret_cast;
828 break;
829
830 case Stmt::CXXConstCastExprClass:
831 Kind = tok::kw_const_cast;
832 break;
833
834 default:
835 assert(false && "Invalid C++ named cast");
836 return SemaRef.ExprError();
837 }
838
839 // Instantiate the type that we're casting to.
840 SourceLocation TypeStartLoc
841 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
842 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
843 TemplateArgs,
844 TypeStartLoc,
845 DeclarationName());
846 if (ExplicitTy.isNull())
847 return SemaRef.ExprError();
848
849 // Instantiate the subexpression.
850 OwningExprResult SubExpr = Visit(E->getSubExpr());
851 if (SubExpr.isInvalid())
852 return SemaRef.ExprError();
853
854 SourceLocation FakeLAngleLoc
855 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
856 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
857 SourceLocation FakeRParenLoc
858 = SemaRef.PP.getLocForEndOfToken(
859 E->getSubExpr()->getSourceRange().getEnd());
860 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
861 /*FIXME:*/FakeLAngleLoc,
862 ExplicitTy.getAsOpaquePtr(),
863 /*FIXME:*/FakeRAngleLoc,
864 /*FIXME:*/FakeRAngleLoc,
865 move(SubExpr),
866 /*FIXME:*/FakeRParenLoc);
867}
868
869Sema::OwningExprResult
870TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
871 return VisitCXXNamedCastExpr(E);
872}
873
874Sema::OwningExprResult
875TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
876 return VisitCXXNamedCastExpr(E);
877}
878
879Sema::OwningExprResult
880TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
881 CXXReinterpretCastExpr *E) {
882 return VisitCXXNamedCastExpr(E);
883}
884
885Sema::OwningExprResult
886TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
887 return VisitCXXNamedCastExpr(E);
888}
889
Anders Carlsson0712d292009-05-15 20:26:03 +0000890Sema::OwningExprResult
891TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
892 QualType ThisType =
893 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
894
895 CXXThisExpr *TE =
896 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
897
898 return SemaRef.Owned(TE);
899}
900
Douglas Gregoraa6af222009-03-25 00:27:28 +0000901Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000902TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
903 if (E->isTypeOperand()) {
904 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
905 TemplateArgs,
906 /*FIXME*/E->getSourceRange().getBegin(),
907 DeclarationName());
908 if (T.isNull())
909 return SemaRef.ExprError();
910
911 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
912 /*FIXME*/E->getSourceRange().getBegin(),
913 true, T.getAsOpaquePtr(),
914 E->getSourceRange().getEnd());
915 }
916
917 OwningExprResult Operand = Visit(E->getExprOperand());
918 if (Operand.isInvalid())
919 return SemaRef.ExprError();
920
921 OwningExprResult Result
922 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
923 /*FIXME*/E->getSourceRange().getBegin(),
924 false, Operand.get(),
925 E->getSourceRange().getEnd());
926 if (Result.isInvalid())
927 return SemaRef.ExprError();
928
929 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
930 return move(Result);
931}
932
933Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +0000934TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
935 OwningExprResult SubExpr(SemaRef, (void *)0);
936 if (E->getSubExpr()) {
937 SubExpr = Visit(E->getSubExpr());
938 if (SubExpr.isInvalid())
939 return SemaRef.ExprError();
940 }
941
942 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
943}
944
945Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +0000946TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
947 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
948 ->isDependentType() && "Dependent constructor shouldn't be here");
949
950 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
951 /*FIXME*/E->getSourceRange().getBegin(),
952 DeclarationName());
953 if (T.isNull())
954 return SemaRef.ExprError();
955
Douglas Gregord7e27052009-05-20 22:33:37 +0000956 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +0000957 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
958 ArgEnd = E->arg_end();
959 Arg != ArgEnd; ++Arg) {
960 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000961 if (ArgInst.isInvalid())
962 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +0000963
964 Args.push_back(ArgInst.takeAs<Expr>());
965 }
966
967
Douglas Gregord7e27052009-05-20 22:33:37 +0000968 VarDecl *Var = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
969 SemaRef.CurContext,
970 TemplateArgs));
971 if (!Var)
Douglas Gregord94546a2009-05-20 21:38:11 +0000972 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +0000973
Douglas Gregore06274d2009-05-20 21:51:01 +0000974 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregord94546a2009-05-20 21:38:11 +0000975 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, Var, T,
976 E->getConstructor(),
977 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +0000978 Args.takeAs<Expr>(),
979 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +0000980}
981
982Sema::OwningExprResult
983TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
984 CXXFunctionalCastExpr *E) {
985 // Instantiate the type that we're casting to.
986 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
987 TemplateArgs,
988 E->getTypeBeginLoc(),
989 DeclarationName());
990 if (ExplicitTy.isNull())
991 return SemaRef.ExprError();
992
993 // Instantiate the subexpression.
994 OwningExprResult SubExpr = Visit(E->getSubExpr());
995 if (SubExpr.isInvalid())
996 return SemaRef.ExprError();
997
998 // FIXME: The end of the type's source range is wrong
999 Expr *Sub = SubExpr.takeAs<Expr>();
1000 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1001 ExplicitTy.getAsOpaquePtr(),
1002 /*FIXME:*/E->getTypeBeginLoc(),
1003 Sema::MultiExprArg(SemaRef,
1004 (void **)&Sub,
1005 1),
1006 0,
1007 E->getRParenLoc());
1008}
1009
1010Sema::OwningExprResult
1011TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1012 return SemaRef.Clone(E);
1013}
1014
1015Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001016TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1017 // Instantiate the type that we're allocating
1018 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1019 TemplateArgs,
1020 /*FIXME:*/E->getSourceRange().getBegin(),
1021 DeclarationName());
1022 if (AllocType.isNull())
1023 return SemaRef.ExprError();
1024
1025 // Instantiate the size of the array we're allocating (if any).
1026 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1027 TemplateArgs);
1028 if (ArraySize.isInvalid())
1029 return SemaRef.ExprError();
1030
1031 // Instantiate the placement arguments (if any).
1032 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1033 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1034 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1035 if (Arg.isInvalid())
1036 return SemaRef.ExprError();
1037
1038 PlacementArgs.push_back(Arg.take());
1039 }
1040
1041 // Instantiate the constructor arguments (if any).
1042 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1043 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1044 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1045 if (Arg.isInvalid())
1046 return SemaRef.ExprError();
1047
1048 ConstructorArgs.push_back(Arg.take());
1049 }
1050
1051 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1052 E->isGlobalNew(),
1053 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001054 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001055 /*FIXME*/SourceLocation(),
1056 E->isParenTypeId(),
1057 AllocType,
1058 /*FIXME*/E->getSourceRange().getBegin(),
1059 SourceRange(),
1060 move(ArraySize),
1061 /*FIXME*/SourceLocation(),
1062 Sema::MultiExprArg(SemaRef,
1063 ConstructorArgs.take(),
1064 ConstructorArgs.size()),
1065 E->getSourceRange().getEnd());
1066}
1067
1068Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001069TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1070 OwningExprResult Operand = Visit(E->getArgument());
1071 if (Operand.isInvalid())
1072 return SemaRef.ExprError();
1073
1074 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1075 E->isGlobalDelete(),
1076 E->isArrayForm(),
1077 move(Operand));
1078}
1079
1080Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001081TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1082 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1083 /*FIXME*/E->getSourceRange().getBegin(),
1084 DeclarationName());
1085 if (T.isNull())
1086 return SemaRef.ExprError();
1087
1088 SourceLocation FakeLParenLoc
1089 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1090 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1091 E->getSourceRange().getBegin(),
1092 /*FIXME*/FakeLParenLoc,
1093 T.getAsOpaquePtr(),
1094 E->getSourceRange().getEnd());
1095}
1096
1097Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001098TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1099 CXXExprWithTemporaries *E) {
1100 OwningExprResult SubExpr = Visit(E->getSubExpr());
1101 if (SubExpr.isInvalid())
1102 return SemaRef.ExprError();
1103
1104 return SemaRef.ActOnFinishFullExpr(move(SubExpr));
1105}
1106
1107Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001108TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1109 CXXUnresolvedConstructExpr *E) {
1110 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1111 E->getTypeBeginLoc(),
1112 DeclarationName());
1113 if (T.isNull())
1114 return SemaRef.ExprError();
1115
Douglas Gregord7e27052009-05-20 22:33:37 +00001116 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001117 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1118 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1119 ArgEnd = E->arg_end();
1120 Arg != ArgEnd; ++Arg) {
1121 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001122 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001123 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001124
1125 FakeCommaLocs.push_back(
1126 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1127 Args.push_back(InstArg.takeAs<Expr>());
1128 }
1129
1130 // FIXME: The end of the type range isn't exactly correct.
1131 // FIXME: we're faking the locations of the commas
1132 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1133 E->getLParenLoc()),
1134 T.getAsOpaquePtr(),
1135 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001136 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001137 &FakeCommaLocs.front(),
1138 E->getRParenLoc());
1139}
1140
1141Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001142Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001143 if (!E)
1144 return Owned((Expr *)0);
1145
Douglas Gregor7e063902009-05-11 23:53:27 +00001146 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001147 return Instantiator.Visit(E);
1148}