blob: fd88b934fbf30ddc4a877b0d57e6b78a42fe38c7 [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
Douglas Gregor690dc7f2009-05-21 23:48:18 +000052 OwningExprResult VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
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 Gregor690dc7f2009-05-21 23:48:18 +0000292TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
293 SourceLocation FakeTypeLoc
294 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
295 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
296 FakeTypeLoc,
297 DeclarationName());
298 if (T.isNull())
299 return SemaRef.ExprError();
300
301 OwningExprResult Init = Visit(E->getInitializer());
302 if (Init.isInvalid())
303 return SemaRef.ExprError();
304
305 return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
306 T.getAsOpaquePtr(),
307 /*FIXME*/E->getLParenLoc(),
308 move(Init));
309}
310
311Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000312TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
313 Sema::OwningExprResult LHS = Visit(E->getLHS());
314 if (LHS.isInvalid())
315 return SemaRef.ExprError();
316
317 Sema::OwningExprResult RHS = Visit(E->getRHS());
318 if (RHS.isInvalid())
319 return SemaRef.ExprError();
320
321 Sema::OwningExprResult Result
322 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
323 E->getOpcode(),
324 (Expr *)LHS.get(),
325 (Expr *)RHS.get());
326 if (Result.isInvalid())
327 return SemaRef.ExprError();
328
329 LHS.release();
330 RHS.release();
331 return move(Result);
332}
333
334Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000335TemplateExprInstantiator::VisitCompoundAssignOperator(
336 CompoundAssignOperator *E) {
337 return VisitBinaryOperator(E);
338}
339
340Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000341TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
342 Sema::OwningExprResult First = Visit(E->getArg(0));
343 if (First.isInvalid())
344 return SemaRef.ExprError();
345
346 Expr *Args[2] = { (Expr *)First.get(), 0 };
347
348 Sema::OwningExprResult Second(SemaRef);
349 if (E->getNumArgs() == 2) {
350 Second = Visit(E->getArg(1));
351
352 if (Second.isInvalid())
353 return SemaRef.ExprError();
354
355 Args[1] = (Expr *)Second.get();
356 }
357
358 if (!E->isTypeDependent()) {
359 // Since our original expression was not type-dependent, we do not
360 // perform lookup again at instantiation time (C++ [temp.dep]p1).
361 // Instead, we just build the new overloaded operator call
362 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000363 OwningExprResult Callee = Visit(E->getCallee());
364 if (Callee.isInvalid())
365 return SemaRef.ExprError();
366
Douglas Gregoraa6af222009-03-25 00:27:28 +0000367 First.release();
368 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000369
Douglas Gregoraa6af222009-03-25 00:27:28 +0000370 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
371 SemaRef.Context,
372 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000373 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000374 Args, E->getNumArgs(),
375 E->getType(),
376 E->getOperatorLoc()));
377 }
378
379 bool isPostIncDec = E->getNumArgs() == 2 &&
380 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
381 if (E->getNumArgs() == 1 || isPostIncDec) {
382 if (!Args[0]->getType()->isOverloadableType()) {
383 // The argument is not of overloadable type, so try to create a
384 // built-in unary operation.
385 UnaryOperator::Opcode Opc
386 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
387
388 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
389 move(First));
390 }
391
392 // Fall through to perform overload resolution
393 } else {
394 assert(E->getNumArgs() == 2 && "Expected binary operation");
395
396 Sema::OwningExprResult Result(SemaRef);
397 if (!Args[0]->getType()->isOverloadableType() &&
398 !Args[1]->getType()->isOverloadableType()) {
399 // Neither of the arguments is an overloadable type, so try to
400 // create a built-in binary operation.
401 BinaryOperator::Opcode Opc =
402 BinaryOperator::getOverloadedOpcode(E->getOperator());
403 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
404 Args[0], Args[1]);
405 if (Result.isInvalid())
406 return SemaRef.ExprError();
407
408 First.release();
409 Second.release();
410 return move(Result);
411 }
412
413 // Fall through to perform overload resolution.
414 }
415
416 // Compute the set of functions that were found at template
417 // definition time.
418 Sema::FunctionSet Functions;
419 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
420 OverloadedFunctionDecl *Overloads
421 = cast<OverloadedFunctionDecl>(DRE->getDecl());
422
423 // FIXME: Do we have to check
424 // IsAcceptableNonMemberOperatorCandidate for each of these?
425 for (OverloadedFunctionDecl::function_iterator
426 F = Overloads->function_begin(),
427 FEnd = Overloads->function_end();
428 F != FEnd; ++F)
429 Functions.insert(*F);
430
431 // Add any functions found via argument-dependent lookup.
432 DeclarationName OpName
433 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
434 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
435
436 // Create the overloaded operator invocation.
437 if (E->getNumArgs() == 1 || isPostIncDec) {
438 UnaryOperator::Opcode Opc
439 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
440 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
441 Functions, move(First));
442 }
443
Mike Stump390b4cc2009-05-16 07:39:55 +0000444 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
445 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000446 BinaryOperator::Opcode Opc =
447 BinaryOperator::getOverloadedOpcode(E->getOperator());
448 OwningExprResult Result
449 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
450 Functions, Args[0], Args[1]);
451
452 if (Result.isInvalid())
453 return SemaRef.ExprError();
454
455 First.release();
456 Second.release();
457 return move(Result);
458}
459
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000460Sema::OwningExprResult
461TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
462 VarDecl *Var
463 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
464 SemaRef.CurContext,
465 TemplateArgs));
466 if (!Var)
467 return SemaRef.ExprError();
468
Douglas Gregore06274d2009-05-20 21:51:01 +0000469 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000470 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
471 E->getStartLoc(),
472 SourceLocation(),
473 Var));
474}
475
Douglas Gregoraa6af222009-03-25 00:27:28 +0000476Sema::OwningExprResult
477TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
478 Sema::OwningExprResult Cond = Visit(E->getCond());
479 if (Cond.isInvalid())
480 return SemaRef.ExprError();
481
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000482 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
483 TemplateArgs);
484 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000485 return SemaRef.ExprError();
486
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000487 Sema::OwningExprResult RHS = Visit(E->getRHS());
488 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000489 return SemaRef.ExprError();
490
491 if (!E->isTypeDependent()) {
492 // Since our original expression was not type-dependent, we do not
493 // perform lookup again at instantiation time (C++ [temp.dep]p1).
494 // Instead, we just build the new conditional operator call expression.
495 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
496 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000497 LHS.takeAs<Expr>(),
498 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000499 E->getType()));
500 }
501
502
503 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
504 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000505 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000506}
507
Douglas Gregorcd938172009-05-19 20:31:21 +0000508Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000509 Sema::OwningStmtResult SubStmt
510 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000511 if (SubStmt.isInvalid())
512 return SemaRef.ExprError();
513
514 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
515 E->getRParenLoc());
516}
517
Douglas Gregoraa6af222009-03-25 00:27:28 +0000518Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000519TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000520 assert(false && "__builtin_types_compatible_p is not legal in C++");
521 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000522}
523
524Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000525TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000526 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000527 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
528 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000529 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000530 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000531
532 SubExprs.push_back(SubExpr.takeAs<Expr>());
533 }
534
535 // Find the declaration for __builtin_shufflevector
536 const IdentifierInfo &Name
537 = SemaRef.Context.Idents.get("__builtin_shufflevector");
538 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
539 DeclContext::lookup_result Lookup
540 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
541 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
542
543 // Build a reference to the __builtin_shufflevector builtin
544 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
545 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
546 E->getBuiltinLoc(),
547 false, false);
548 SemaRef.UsualUnaryConversions(Callee);
549
550 // Build the CallExpr
551 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000552 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000553 SubExprs.size(),
554 Builtin->getResultType(),
555 E->getRParenLoc());
556 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
557
558 // Type-check the __builtin_shufflevector expression.
559 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
560 if (Result.isInvalid())
561 return SemaRef.ExprError();
562
563 OwnedCall.release();
564 return move(Result);
565}
566
567Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000568TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
569 OwningExprResult Cond = Visit(E->getCond());
570 if (Cond.isInvalid())
571 return SemaRef.ExprError();
572
573 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
574 if (LHS.isInvalid())
575 return SemaRef.ExprError();
576
577 OwningExprResult RHS = Visit(E->getRHS());
578 if (RHS.isInvalid())
579 return SemaRef.ExprError();
580
581 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
582 move(Cond), move(LHS), move(RHS),
583 E->getRParenLoc());
584}
585
Douglas Gregordd027302009-05-19 23:10:31 +0000586Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
587 OwningExprResult SubExpr = Visit(E->getSubExpr());
588 if (SubExpr.isInvalid())
589 return SemaRef.ExprError();
590
591 SourceLocation FakeTypeLoc
592 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
593 .getEnd());
594 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
595 /*FIXME:*/FakeTypeLoc,
596 DeclarationName());
597 if (T.isNull())
598 return SemaRef.ExprError();
599
600 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
601 T.getAsOpaquePtr(), E->getRParenLoc());
602}
603
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000604Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000605TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
606 ExprVector Inits(SemaRef);
607 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
608 OwningExprResult Init = Visit(E->getInit(I));
609 if (Init.isInvalid())
610 return SemaRef.ExprError();
611 Inits.push_back(Init.takeAs<Expr>());
612 }
613
614 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
615 E->getRBraceLoc());
616}
617
618Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000619TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
620 Designation Desig;
621
622 // Instantiate the initializer value
623 OwningExprResult Init = Visit(E->getInit());
624 if (Init.isInvalid())
625 return SemaRef.ExprError();
626
627 // Instantiate the designators.
628 ExprVector ArrayExprs(SemaRef); // Expresses used in array designators
629 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
630 DEnd = E->designators_end();
631 D != DEnd; ++D) {
632 if (D->isFieldDesignator()) {
633 Desig.AddDesignator(Designator::getField(D->getFieldName(),
634 D->getDotLoc(),
635 D->getFieldLoc()));
636 continue;
637 }
638
639 if (D->isArrayDesignator()) {
640 OwningExprResult Index = Visit(E->getArrayIndex(*D));
641 if (Index.isInvalid())
642 return SemaRef.ExprError();
643
644 Desig.AddDesignator(Designator::getArray(Index.get(),
645 D->getLBracketLoc()));
646
647 ArrayExprs.push_back(Index.release());
648 continue;
649 }
650
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000651 assert(D->isArrayRangeDesignator() && "New kind of designator?");
652 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
653 if (Start.isInvalid())
654 return SemaRef.ExprError();
655
656 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
657 if (End.isInvalid())
658 return SemaRef.ExprError();
659
660 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
661 End.get(),
662 D->getLBracketLoc(),
663 D->getEllipsisLoc()));
664
665 ArrayExprs.push_back(Start.release());
666 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000667 }
668
669 OwningExprResult Result =
670 SemaRef.ActOnDesignatedInitializer(Desig,
671 E->getEqualOrColonLoc(),
672 E->usesGNUSyntax(),
673 move(Init));
674 if (Result.isInvalid())
675 return SemaRef.ExprError();
676
677 ArrayExprs.take();
678 return move(Result);
679}
680
681Sema::OwningExprResult
682TemplateExprInstantiator::VisitImplicitValueInitExpr(
683 ImplicitValueInitExpr *E) {
684 assert(!E->isTypeDependent() && !E->isValueDependent() &&
685 "ImplicitValueInitExprs are never dependent");
686 return SemaRef.Clone(E);
687}
688
689Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000690TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
691 bool isSizeOf = E->isSizeOf();
692
693 if (E->isArgumentType()) {
694 QualType T = E->getArgumentType();
695 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000696 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000697 /*FIXME*/E->getOperatorLoc(),
698 &SemaRef.PP.getIdentifierTable().get("sizeof"));
699 if (T.isNull())
700 return SemaRef.ExprError();
701 }
702
703 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
704 E->getSourceRange());
705 }
706
707 Sema::OwningExprResult Arg = Visit(E->getArgumentExpr());
708 if (Arg.isInvalid())
709 return SemaRef.ExprError();
710
711 Sema::OwningExprResult Result
712 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
713 isSizeOf, E->getSourceRange());
714 if (Result.isInvalid())
715 return SemaRef.ExprError();
716
717 Arg.release();
718 return move(Result);
719}
720
721Sema::OwningExprResult
722TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000723 NestedNameSpecifier *NNS
724 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
725 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000726 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000727 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000728 return SemaRef.ExprError();
729
Douglas Gregorab452ba2009-03-26 23:50:42 +0000730 CXXScopeSpec SS;
731 SS.setRange(E->getQualifierRange());
732 SS.setScopeRep(NNS);
733
Douglas Gregoraa6af222009-03-25 00:27:28 +0000734 // FIXME: We're passing in a NULL scope, because
735 // ActOnDeclarationNameExpr doesn't actually use the scope when we
736 // give it a non-empty scope specifier. Investigate whether it would
737 // be better to refactor ActOnDeclarationNameExpr.
738 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
739 E->getDeclName(),
740 /*HasTrailingLParen=*/false,
741 &SS,
742 /*FIXME:isAddressOfOperand=*/false);
743}
744
745Sema::OwningExprResult
746TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
747 CXXTemporaryObjectExpr *E) {
748 QualType T = E->getType();
749 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000750 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000751 E->getTypeBeginLoc(), DeclarationName());
752 if (T.isNull())
753 return SemaRef.ExprError();
754 }
755
Douglas Gregord7e27052009-05-20 22:33:37 +0000756 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000757 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000758 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
759 ArgEnd = E->arg_end();
760 Arg != ArgEnd; ++Arg) {
761 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000762 if (InstantiatedArg.isInvalid())
763 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000764
765 Args.push_back((Expr *)InstantiatedArg.release());
766 }
767
Douglas Gregord7e27052009-05-20 22:33:37 +0000768 SourceLocation CommaLoc;
769 // FIXME: HACK!
770 if (Args.size() > 1) {
771 Expr *First = (Expr *)Args[0];
772 CommaLoc
773 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000774 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000775 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
776 /*, FIXME*/),
777 T.getAsOpaquePtr(),
778 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000779 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000780 /*HACK*/&CommaLoc,
781 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000782}
783
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000784Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
785 assert(false && "Cannot instantiate abstract CastExpr");
786 return SemaRef.ExprError();
787}
788
Douglas Gregoraa6af222009-03-25 00:27:28 +0000789Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
790 ImplicitCastExpr *E) {
791 assert(!E->isTypeDependent() && "Implicit casts must have known types");
792
793 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
794 if (SubExpr.isInvalid())
795 return SemaRef.ExprError();
796
797 ImplicitCastExpr *ICE =
798 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
799 (Expr *)SubExpr.release(),
800 E->isLvalueCast());
801 return SemaRef.Owned(ICE);
802}
803
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000804Sema::OwningExprResult
805TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
806 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
807 return SemaRef.ExprError();
808}
809
810Sema::OwningExprResult
811TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
812 // Instantiate the type that we're casting to.
813 SourceLocation TypeStartLoc
814 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
815 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
816 TemplateArgs,
817 TypeStartLoc,
818 DeclarationName());
819 if (ExplicitTy.isNull())
820 return SemaRef.ExprError();
821
822 // Instantiate the subexpression.
823 OwningExprResult SubExpr = Visit(E->getSubExpr());
824 if (SubExpr.isInvalid())
825 return SemaRef.ExprError();
826
827 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
828 ExplicitTy.getAsOpaquePtr(),
829 E->getRParenLoc(),
830 move(SubExpr));
831}
832
833Sema::OwningExprResult
834TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
835 // Figure out which cast operator we're dealing with.
836 tok::TokenKind Kind;
837 switch (E->getStmtClass()) {
838 case Stmt::CXXStaticCastExprClass:
839 Kind = tok::kw_static_cast;
840 break;
841
842 case Stmt::CXXDynamicCastExprClass:
843 Kind = tok::kw_dynamic_cast;
844 break;
845
846 case Stmt::CXXReinterpretCastExprClass:
847 Kind = tok::kw_reinterpret_cast;
848 break;
849
850 case Stmt::CXXConstCastExprClass:
851 Kind = tok::kw_const_cast;
852 break;
853
854 default:
855 assert(false && "Invalid C++ named cast");
856 return SemaRef.ExprError();
857 }
858
859 // Instantiate the type that we're casting to.
860 SourceLocation TypeStartLoc
861 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
862 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
863 TemplateArgs,
864 TypeStartLoc,
865 DeclarationName());
866 if (ExplicitTy.isNull())
867 return SemaRef.ExprError();
868
869 // Instantiate the subexpression.
870 OwningExprResult SubExpr = Visit(E->getSubExpr());
871 if (SubExpr.isInvalid())
872 return SemaRef.ExprError();
873
874 SourceLocation FakeLAngleLoc
875 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
876 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
877 SourceLocation FakeRParenLoc
878 = SemaRef.PP.getLocForEndOfToken(
879 E->getSubExpr()->getSourceRange().getEnd());
880 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
881 /*FIXME:*/FakeLAngleLoc,
882 ExplicitTy.getAsOpaquePtr(),
883 /*FIXME:*/FakeRAngleLoc,
884 /*FIXME:*/FakeRAngleLoc,
885 move(SubExpr),
886 /*FIXME:*/FakeRParenLoc);
887}
888
889Sema::OwningExprResult
890TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
891 return VisitCXXNamedCastExpr(E);
892}
893
894Sema::OwningExprResult
895TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
896 return VisitCXXNamedCastExpr(E);
897}
898
899Sema::OwningExprResult
900TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
901 CXXReinterpretCastExpr *E) {
902 return VisitCXXNamedCastExpr(E);
903}
904
905Sema::OwningExprResult
906TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
907 return VisitCXXNamedCastExpr(E);
908}
909
Anders Carlsson0712d292009-05-15 20:26:03 +0000910Sema::OwningExprResult
911TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
912 QualType ThisType =
913 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
914
915 CXXThisExpr *TE =
916 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
917
918 return SemaRef.Owned(TE);
919}
920
Douglas Gregoraa6af222009-03-25 00:27:28 +0000921Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000922TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
923 if (E->isTypeOperand()) {
924 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
925 TemplateArgs,
926 /*FIXME*/E->getSourceRange().getBegin(),
927 DeclarationName());
928 if (T.isNull())
929 return SemaRef.ExprError();
930
931 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
932 /*FIXME*/E->getSourceRange().getBegin(),
933 true, T.getAsOpaquePtr(),
934 E->getSourceRange().getEnd());
935 }
936
937 OwningExprResult Operand = Visit(E->getExprOperand());
938 if (Operand.isInvalid())
939 return SemaRef.ExprError();
940
941 OwningExprResult Result
942 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
943 /*FIXME*/E->getSourceRange().getBegin(),
944 false, Operand.get(),
945 E->getSourceRange().getEnd());
946 if (Result.isInvalid())
947 return SemaRef.ExprError();
948
949 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
950 return move(Result);
951}
952
953Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +0000954TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
955 OwningExprResult SubExpr(SemaRef, (void *)0);
956 if (E->getSubExpr()) {
957 SubExpr = Visit(E->getSubExpr());
958 if (SubExpr.isInvalid())
959 return SemaRef.ExprError();
960 }
961
962 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
963}
964
965Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +0000966TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
967 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
968 ->isDependentType() && "Dependent constructor shouldn't be here");
969
970 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
971 /*FIXME*/E->getSourceRange().getBegin(),
972 DeclarationName());
973 if (T.isNull())
974 return SemaRef.ExprError();
975
Douglas Gregord7e27052009-05-20 22:33:37 +0000976 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +0000977 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
978 ArgEnd = E->arg_end();
979 Arg != ArgEnd; ++Arg) {
980 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000981 if (ArgInst.isInvalid())
982 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +0000983
984 Args.push_back(ArgInst.takeAs<Expr>());
985 }
986
987
Douglas Gregord7e27052009-05-20 22:33:37 +0000988 VarDecl *Var = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
989 SemaRef.CurContext,
990 TemplateArgs));
991 if (!Var)
Douglas Gregord94546a2009-05-20 21:38:11 +0000992 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +0000993
Douglas Gregore06274d2009-05-20 21:51:01 +0000994 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregord94546a2009-05-20 21:38:11 +0000995 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, Var, T,
996 E->getConstructor(),
997 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +0000998 Args.takeAs<Expr>(),
999 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001000}
1001
1002Sema::OwningExprResult
1003TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1004 CXXFunctionalCastExpr *E) {
1005 // Instantiate the type that we're casting to.
1006 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1007 TemplateArgs,
1008 E->getTypeBeginLoc(),
1009 DeclarationName());
1010 if (ExplicitTy.isNull())
1011 return SemaRef.ExprError();
1012
1013 // Instantiate the subexpression.
1014 OwningExprResult SubExpr = Visit(E->getSubExpr());
1015 if (SubExpr.isInvalid())
1016 return SemaRef.ExprError();
1017
1018 // FIXME: The end of the type's source range is wrong
1019 Expr *Sub = SubExpr.takeAs<Expr>();
1020 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1021 ExplicitTy.getAsOpaquePtr(),
1022 /*FIXME:*/E->getTypeBeginLoc(),
1023 Sema::MultiExprArg(SemaRef,
1024 (void **)&Sub,
1025 1),
1026 0,
1027 E->getRParenLoc());
1028}
1029
1030Sema::OwningExprResult
1031TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1032 return SemaRef.Clone(E);
1033}
1034
1035Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001036TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1037 // Instantiate the type that we're allocating
1038 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1039 TemplateArgs,
1040 /*FIXME:*/E->getSourceRange().getBegin(),
1041 DeclarationName());
1042 if (AllocType.isNull())
1043 return SemaRef.ExprError();
1044
1045 // Instantiate the size of the array we're allocating (if any).
1046 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1047 TemplateArgs);
1048 if (ArraySize.isInvalid())
1049 return SemaRef.ExprError();
1050
1051 // Instantiate the placement arguments (if any).
1052 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1053 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1054 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1055 if (Arg.isInvalid())
1056 return SemaRef.ExprError();
1057
1058 PlacementArgs.push_back(Arg.take());
1059 }
1060
1061 // Instantiate the constructor arguments (if any).
1062 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1063 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1064 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1065 if (Arg.isInvalid())
1066 return SemaRef.ExprError();
1067
1068 ConstructorArgs.push_back(Arg.take());
1069 }
1070
1071 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1072 E->isGlobalNew(),
1073 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001074 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001075 /*FIXME*/SourceLocation(),
1076 E->isParenTypeId(),
1077 AllocType,
1078 /*FIXME*/E->getSourceRange().getBegin(),
1079 SourceRange(),
1080 move(ArraySize),
1081 /*FIXME*/SourceLocation(),
1082 Sema::MultiExprArg(SemaRef,
1083 ConstructorArgs.take(),
1084 ConstructorArgs.size()),
1085 E->getSourceRange().getEnd());
1086}
1087
1088Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001089TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1090 OwningExprResult Operand = Visit(E->getArgument());
1091 if (Operand.isInvalid())
1092 return SemaRef.ExprError();
1093
1094 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1095 E->isGlobalDelete(),
1096 E->isArrayForm(),
1097 move(Operand));
1098}
1099
1100Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001101TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1102 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1103 /*FIXME*/E->getSourceRange().getBegin(),
1104 DeclarationName());
1105 if (T.isNull())
1106 return SemaRef.ExprError();
1107
1108 SourceLocation FakeLParenLoc
1109 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1110 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1111 E->getSourceRange().getBegin(),
1112 /*FIXME*/FakeLParenLoc,
1113 T.getAsOpaquePtr(),
1114 E->getSourceRange().getEnd());
1115}
1116
1117Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001118TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1119 CXXExprWithTemporaries *E) {
1120 OwningExprResult SubExpr = Visit(E->getSubExpr());
1121 if (SubExpr.isInvalid())
1122 return SemaRef.ExprError();
1123
1124 return SemaRef.ActOnFinishFullExpr(move(SubExpr));
1125}
1126
1127Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001128TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1129 CXXUnresolvedConstructExpr *E) {
1130 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1131 E->getTypeBeginLoc(),
1132 DeclarationName());
1133 if (T.isNull())
1134 return SemaRef.ExprError();
1135
Douglas Gregord7e27052009-05-20 22:33:37 +00001136 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001137 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1138 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1139 ArgEnd = E->arg_end();
1140 Arg != ArgEnd; ++Arg) {
1141 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001142 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001143 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001144
1145 FakeCommaLocs.push_back(
1146 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1147 Args.push_back(InstArg.takeAs<Expr>());
1148 }
1149
1150 // FIXME: The end of the type range isn't exactly correct.
1151 // FIXME: we're faking the locations of the commas
1152 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1153 E->getLParenLoc()),
1154 T.getAsOpaquePtr(),
1155 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001156 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001157 &FakeCommaLocs.front(),
1158 E->getRParenLoc());
1159}
1160
1161Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001162Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001163 if (!E)
1164 return Owned((Expr *)0);
1165
Douglas Gregor7e063902009-05-11 23:53:27 +00001166 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001167 return Instantiator.Visit(E);
1168}