blob: 1e57e1b5a375607166389369e65397cd8b466f75 [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 Gregor1c0ca592009-05-22 21:13:27 +000051 OwningExprResult VisitMemberExpr(MemberExpr *E);
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 Gregor76658232009-05-22 23:25:52 +000058 OwningExprResult VisitAddrLabelExpr(AddrLabelExpr *E);
Douglas Gregorcd938172009-05-19 20:31:21 +000059 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 Gregorbec53e72009-05-22 23:07:44 +000067 OwningExprResult VisitExtVectorElementExpr(ExtVectorElementExpr *E);
Douglas Gregor05295192009-05-19 23:29:16 +000068 // 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 Gregor08d3e7c2009-05-22 21:26:58 +000077 OwningExprResult VisitCXXMemberCallExpr(CXXMemberCallExpr *E);
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);
Douglas Gregor1c0ca592009-05-22 21:13:27 +000099 OwningExprResult VisitCXXUnresolvedMemberExpr(CXXUnresolvedMemberExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000100 OwningExprResult VisitGNUNullExpr(GNUNullExpr *E);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000101 OwningExprResult VisitUnresolvedFunctionNameExpr(
102 UnresolvedFunctionNameExpr *E);
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000103
Douglas Gregoraa6af222009-03-25 00:27:28 +0000104 // Base case. I'm supposed to ignore this.
105 Sema::OwningExprResult VisitStmt(Stmt *S) {
106 S->dump();
107 assert(false && "Cannot instantiate this kind of expression");
108 return SemaRef.ExprError();
109 }
110 };
111}
112
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000113Sema::OwningExprResult
114TemplateExprInstantiator::VisitPredefinedExpr(PredefinedExpr *E) {
115 return SemaRef.Clone(E);
116}
117
118Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000119TemplateExprInstantiator::VisitIntegerLiteral(IntegerLiteral *E) {
120 return SemaRef.Clone(E);
121}
122
123Sema::OwningExprResult
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000124TemplateExprInstantiator::VisitFloatingLiteral(FloatingLiteral *E) {
125 return SemaRef.Clone(E);
126}
127
128Sema::OwningExprResult
129TemplateExprInstantiator::VisitStringLiteral(StringLiteral *E) {
130 return SemaRef.Clone(E);
131}
132
133Sema::OwningExprResult
134TemplateExprInstantiator::VisitCharacterLiteral(CharacterLiteral *E) {
135 return SemaRef.Clone(E);
136}
137
Douglas Gregord8ac4362009-05-18 22:38:38 +0000138Sema::OwningExprResult
139TemplateExprInstantiator::VisitImaginaryLiteral(ImaginaryLiteral *E) {
140 return SemaRef.Clone(E);
141}
142
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000143Sema::OwningExprResult
144TemplateExprInstantiator::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
145 return SemaRef.Clone(E);
146}
147
148Sema::OwningExprResult
149TemplateExprInstantiator::VisitCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *E) {
150 return SemaRef.Clone(E);
151}
152
153Sema::OwningExprResult
154TemplateExprInstantiator::VisitGNUNullExpr(GNUNullExpr *E) {
155 return SemaRef.Clone(E);
156}
157
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000158Sema::OwningExprResult
159TemplateExprInstantiator::VisitUnresolvedFunctionNameExpr(
160 UnresolvedFunctionNameExpr *E) {
161 return SemaRef.Clone(E);
162}
163
Sebastian Redl8b0b4752009-05-16 18:50:46 +0000164Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000165TemplateExprInstantiator::VisitDeclRefExpr(DeclRefExpr *E) {
166 Decl *D = E->getDecl();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000167 ValueDecl *NewD = 0;
Douglas Gregoraa6af222009-03-25 00:27:28 +0000168 if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) {
169 assert(NTTP->getDepth() == 0 && "No nested templates yet");
170 const TemplateArgument &Arg = TemplateArgs[NTTP->getPosition()];
171 QualType T = Arg.getIntegralType();
172 if (T->isCharType() || T->isWideCharType())
173 return SemaRef.Owned(new (SemaRef.Context) CharacterLiteral(
174 Arg.getAsIntegral()->getZExtValue(),
175 T->isWideCharType(),
176 T,
177 E->getSourceRange().getBegin()));
178 else if (T->isBooleanType())
179 return SemaRef.Owned(new (SemaRef.Context) CXXBoolLiteralExpr(
180 Arg.getAsIntegral()->getBoolValue(),
181 T,
182 E->getSourceRange().getBegin()));
183
184 return SemaRef.Owned(new (SemaRef.Context) IntegerLiteral(
185 *Arg.getAsIntegral(),
186 T,
187 E->getSourceRange().getBegin()));
Douglas Gregordd027302009-05-19 23:10:31 +0000188 } else if (ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000189 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Parm);
Douglas Gregordd027302009-05-19 23:10:31 +0000190 } else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
191 if (Var->hasLocalStorage())
192 NewD = SemaRef.CurrentInstantiationScope->getInstantiationOf(Var);
193 else
194 assert(false && "Cannot instantiation non-local variable declarations");
195 } else if (isa<FunctionDecl>(D) || isa<OverloadedFunctionDecl>(D)) {
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000196 // FIXME: Instantiate decl!
197 NewD = cast<ValueDecl>(D);
Douglas Gregordd027302009-05-19 23:10:31 +0000198 } else
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000199 assert(false && "Unhandled declaratrion reference kind");
200
201 if (!NewD)
202 return SemaRef.ExprError();
203
204 QualType T = NewD->getType();
205 return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(NewD,
Douglas Gregor48dd19b2009-05-14 21:44:34 +0000206 T.getNonReferenceType(),
207 E->getLocation(),
208 T->isDependentType(),
209 T->isDependentType()));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000210}
211
212Sema::OwningExprResult
213TemplateExprInstantiator::VisitParenExpr(ParenExpr *E) {
214 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
215 if (SubExpr.isInvalid())
216 return SemaRef.ExprError();
217
218 return SemaRef.Owned(new (SemaRef.Context) ParenExpr(
219 E->getLParen(), E->getRParen(),
220 (Expr *)SubExpr.release()));
221}
222
223Sema::OwningExprResult
224TemplateExprInstantiator::VisitUnaryOperator(UnaryOperator *E) {
225 Sema::OwningExprResult Arg = Visit(E->getSubExpr());
226 if (Arg.isInvalid())
227 return SemaRef.ExprError();
228
229 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(),
230 E->getOpcode(),
231 move(Arg));
232}
233
234Sema::OwningExprResult
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000235TemplateExprInstantiator::VisitArraySubscriptExpr(ArraySubscriptExpr *E) {
236 Sema::OwningExprResult LHS = Visit(E->getLHS());
237 if (LHS.isInvalid())
238 return SemaRef.ExprError();
239
240 Sema::OwningExprResult RHS = Visit(E->getRHS());
241 if (RHS.isInvalid())
242 return SemaRef.ExprError();
243
244 // Since the overloaded array-subscript operator (operator[]) can
245 // only be a member function, we can make several simplifying
246 // assumptions here:
247 // 1) Normal name lookup (from the current scope) will not ever
248 // find any declarations of operator[] that won't also be found be
249 // member operator lookup, so it is safe to pass a NULL Scope
250 // during the instantiation to avoid the lookup entirely.
251 //
252 // 2) Neither normal name lookup nor argument-dependent lookup at
253 // template definition time will find any operators that won't be
254 // found at template instantiation time, so we do not need to
255 // cache the results of name lookup as we do for the binary
256 // operators.
257 SourceLocation LLocFake = ((Expr*)LHS.get())->getSourceRange().getBegin();
258 return SemaRef.ActOnArraySubscriptExpr(/*Scope=*/0, move(LHS),
259 /*FIXME:*/LLocFake,
260 move(RHS),
261 E->getRBracketLoc());
262}
263
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000264Sema::OwningExprResult TemplateExprInstantiator::VisitCallExpr(CallExpr *E) {
265 // Instantiate callee
266 OwningExprResult Callee = Visit(E->getCallee());
267 if (Callee.isInvalid())
268 return SemaRef.ExprError();
269
270 // Instantiate arguments
Douglas Gregord7e27052009-05-20 22:33:37 +0000271 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000272 llvm::SmallVector<SourceLocation, 4> FakeCommaLocs;
273 for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
274 OwningExprResult Arg = Visit(E->getArg(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000275 if (Arg.isInvalid())
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000276 return SemaRef.ExprError();
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000277
278 FakeCommaLocs.push_back(
279 SemaRef.PP.getLocForEndOfToken(E->getArg(I)->getSourceRange().getEnd()));
280 Args.push_back(Arg.takeAs<Expr>());
281 }
282
283 SourceLocation FakeLParenLoc
284 = ((Expr *)Callee.get())->getSourceRange().getBegin();
285 return SemaRef.ActOnCallExpr(/*Scope=*/0, move(Callee),
286 /*FIXME:*/FakeLParenLoc,
Douglas Gregor45db71d2009-05-21 16:25:11 +0000287 move_arg(Args),
Douglas Gregor4a2487a2009-05-19 00:38:01 +0000288 /*FIXME:*/&FakeCommaLocs.front(),
289 E->getRParenLoc());
290}
291
Douglas Gregor3384c9c2009-05-19 00:01:19 +0000292Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +0000293TemplateExprInstantiator::VisitMemberExpr(MemberExpr *E) {
294 // Instantiate the base of the expression.
295 OwningExprResult Base = Visit(E->getBase());
296 if (Base.isInvalid())
297 return SemaRef.ExprError();
298
299 // FIXME: Handle declaration names here
300 SourceLocation FakeOperatorLoc =
301 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
302 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
303 move(Base),
304 /*FIXME*/FakeOperatorLoc,
305 E->isArrow()? tok::arrow
306 : tok::period,
307 E->getMemberLoc(),
308 /*FIXME:*/*E->getMemberDecl()->getIdentifier(),
309 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
310}
311
312Sema::OwningExprResult
Douglas Gregor690dc7f2009-05-21 23:48:18 +0000313TemplateExprInstantiator::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
314 SourceLocation FakeTypeLoc
315 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
316 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
317 FakeTypeLoc,
318 DeclarationName());
319 if (T.isNull())
320 return SemaRef.ExprError();
321
322 OwningExprResult Init = Visit(E->getInitializer());
323 if (Init.isInvalid())
324 return SemaRef.ExprError();
325
326 return SemaRef.ActOnCompoundLiteral(E->getLParenLoc(),
327 T.getAsOpaquePtr(),
328 /*FIXME*/E->getLParenLoc(),
329 move(Init));
330}
331
332Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000333TemplateExprInstantiator::VisitBinaryOperator(BinaryOperator *E) {
334 Sema::OwningExprResult LHS = Visit(E->getLHS());
335 if (LHS.isInvalid())
336 return SemaRef.ExprError();
337
338 Sema::OwningExprResult RHS = Visit(E->getRHS());
339 if (RHS.isInvalid())
340 return SemaRef.ExprError();
341
342 Sema::OwningExprResult Result
343 = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(),
344 E->getOpcode(),
345 (Expr *)LHS.get(),
346 (Expr *)RHS.get());
347 if (Result.isInvalid())
348 return SemaRef.ExprError();
349
350 LHS.release();
351 RHS.release();
352 return move(Result);
353}
354
355Sema::OwningExprResult
Douglas Gregor6731c312009-05-19 20:02:01 +0000356TemplateExprInstantiator::VisitCompoundAssignOperator(
357 CompoundAssignOperator *E) {
358 return VisitBinaryOperator(E);
359}
360
361Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000362TemplateExprInstantiator::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
363 Sema::OwningExprResult First = Visit(E->getArg(0));
364 if (First.isInvalid())
365 return SemaRef.ExprError();
366
367 Expr *Args[2] = { (Expr *)First.get(), 0 };
368
369 Sema::OwningExprResult Second(SemaRef);
370 if (E->getNumArgs() == 2) {
371 Second = Visit(E->getArg(1));
372
373 if (Second.isInvalid())
374 return SemaRef.ExprError();
375
376 Args[1] = (Expr *)Second.get();
377 }
378
379 if (!E->isTypeDependent()) {
380 // Since our original expression was not type-dependent, we do not
381 // perform lookup again at instantiation time (C++ [temp.dep]p1).
382 // Instead, we just build the new overloaded operator call
383 // expression.
Douglas Gregor05295192009-05-19 23:29:16 +0000384 OwningExprResult Callee = Visit(E->getCallee());
385 if (Callee.isInvalid())
386 return SemaRef.ExprError();
387
Douglas Gregoraa6af222009-03-25 00:27:28 +0000388 First.release();
389 Second.release();
Douglas Gregor05295192009-05-19 23:29:16 +0000390
Douglas Gregoraa6af222009-03-25 00:27:28 +0000391 return SemaRef.Owned(new (SemaRef.Context) CXXOperatorCallExpr(
392 SemaRef.Context,
393 E->getOperator(),
Douglas Gregor05295192009-05-19 23:29:16 +0000394 Callee.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000395 Args, E->getNumArgs(),
396 E->getType(),
397 E->getOperatorLoc()));
398 }
399
400 bool isPostIncDec = E->getNumArgs() == 2 &&
401 (E->getOperator() == OO_PlusPlus || E->getOperator() == OO_MinusMinus);
402 if (E->getNumArgs() == 1 || isPostIncDec) {
403 if (!Args[0]->getType()->isOverloadableType()) {
404 // The argument is not of overloadable type, so try to create a
405 // built-in unary operation.
406 UnaryOperator::Opcode Opc
407 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
408
409 return SemaRef.CreateBuiltinUnaryOp(E->getOperatorLoc(), Opc,
410 move(First));
411 }
412
413 // Fall through to perform overload resolution
414 } else {
415 assert(E->getNumArgs() == 2 && "Expected binary operation");
416
417 Sema::OwningExprResult Result(SemaRef);
418 if (!Args[0]->getType()->isOverloadableType() &&
419 !Args[1]->getType()->isOverloadableType()) {
420 // Neither of the arguments is an overloadable type, so try to
421 // create a built-in binary operation.
422 BinaryOperator::Opcode Opc =
423 BinaryOperator::getOverloadedOpcode(E->getOperator());
424 Result = SemaRef.CreateBuiltinBinOp(E->getOperatorLoc(), Opc,
425 Args[0], Args[1]);
426 if (Result.isInvalid())
427 return SemaRef.ExprError();
428
429 First.release();
430 Second.release();
431 return move(Result);
432 }
433
434 // Fall through to perform overload resolution.
435 }
436
437 // Compute the set of functions that were found at template
438 // definition time.
439 Sema::FunctionSet Functions;
440 DeclRefExpr *DRE = cast<DeclRefExpr>(E->getCallee());
441 OverloadedFunctionDecl *Overloads
442 = cast<OverloadedFunctionDecl>(DRE->getDecl());
443
444 // FIXME: Do we have to check
445 // IsAcceptableNonMemberOperatorCandidate for each of these?
446 for (OverloadedFunctionDecl::function_iterator
447 F = Overloads->function_begin(),
448 FEnd = Overloads->function_end();
449 F != FEnd; ++F)
450 Functions.insert(*F);
451
452 // Add any functions found via argument-dependent lookup.
453 DeclarationName OpName
454 = SemaRef.Context.DeclarationNames.getCXXOperatorName(E->getOperator());
455 SemaRef.ArgumentDependentLookup(OpName, Args, E->getNumArgs(), Functions);
456
457 // Create the overloaded operator invocation.
458 if (E->getNumArgs() == 1 || isPostIncDec) {
459 UnaryOperator::Opcode Opc
460 = UnaryOperator::getOverloadedOpcode(E->getOperator(), isPostIncDec);
461 return SemaRef.CreateOverloadedUnaryOp(E->getOperatorLoc(), Opc,
462 Functions, move(First));
463 }
464
Mike Stump390b4cc2009-05-16 07:39:55 +0000465 // FIXME: This would be far less ugly if CreateOverloadedBinOp took in ExprArg
466 // arguments!
Douglas Gregoraa6af222009-03-25 00:27:28 +0000467 BinaryOperator::Opcode Opc =
468 BinaryOperator::getOverloadedOpcode(E->getOperator());
469 OwningExprResult Result
470 = SemaRef.CreateOverloadedBinOp(E->getOperatorLoc(), Opc,
471 Functions, Args[0], Args[1]);
472
473 if (Result.isInvalid())
474 return SemaRef.ExprError();
475
476 First.release();
477 Second.release();
478 return move(Result);
479}
480
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000481Sema::OwningExprResult
482TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) {
483 VarDecl *Var
484 = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
485 SemaRef.CurContext,
486 TemplateArgs));
487 if (!Var)
488 return SemaRef.ExprError();
489
Douglas Gregore06274d2009-05-20 21:51:01 +0000490 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregor4a2e2042009-05-15 21:45:53 +0000491 return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr(
492 E->getStartLoc(),
493 SourceLocation(),
494 Var));
495}
496
Douglas Gregoraa6af222009-03-25 00:27:28 +0000497Sema::OwningExprResult
498TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) {
499 Sema::OwningExprResult Cond = Visit(E->getCond());
500 if (Cond.isInvalid())
501 return SemaRef.ExprError();
502
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000503 Sema::OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(),
504 TemplateArgs);
505 if (LHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000506 return SemaRef.ExprError();
507
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000508 Sema::OwningExprResult RHS = Visit(E->getRHS());
509 if (RHS.isInvalid())
Douglas Gregoraa6af222009-03-25 00:27:28 +0000510 return SemaRef.ExprError();
511
512 if (!E->isTypeDependent()) {
513 // Since our original expression was not type-dependent, we do not
514 // perform lookup again at instantiation time (C++ [temp.dep]p1).
515 // Instead, we just build the new conditional operator call expression.
516 return SemaRef.Owned(new (SemaRef.Context) ConditionalOperator(
517 Cond.takeAs<Expr>(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000518 LHS.takeAs<Expr>(),
519 RHS.takeAs<Expr>(),
Douglas Gregoraa6af222009-03-25 00:27:28 +0000520 E->getType()));
521 }
522
523
524 return SemaRef.ActOnConditionalOp(/*FIXME*/E->getCond()->getLocEnd(),
525 /*FIXME*/E->getFalseExpr()->getLocStart(),
Douglas Gregord5f3a0f2009-05-19 20:13:50 +0000526 move(Cond), move(LHS), move(RHS));
Douglas Gregoraa6af222009-03-25 00:27:28 +0000527}
528
Douglas Gregor76658232009-05-22 23:25:52 +0000529Sema::OwningExprResult
530TemplateExprInstantiator::VisitAddrLabelExpr(AddrLabelExpr *E) {
531 return SemaRef.ActOnAddrLabel(E->getAmpAmpLoc(),
532 E->getLabelLoc(),
533 E->getLabel()->getID());
534}
535
Douglas Gregorcd938172009-05-19 20:31:21 +0000536Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) {
Douglas Gregor66b46be2009-05-20 22:57:03 +0000537 Sema::OwningStmtResult SubStmt
538 = SemaRef.InstantiateCompoundStmt(E->getSubStmt(), TemplateArgs, true);
Douglas Gregorcd938172009-05-19 20:31:21 +0000539 if (SubStmt.isInvalid())
540 return SemaRef.ExprError();
541
542 return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt),
543 E->getRParenLoc());
544}
545
Douglas Gregoraa6af222009-03-25 00:27:28 +0000546Sema::OwningExprResult
Douglas Gregordc241b42009-05-19 20:55:31 +0000547TemplateExprInstantiator::VisitTypesCompatibleExpr(TypesCompatibleExpr *E) {
Douglas Gregorc12a9c52009-05-19 22:28:02 +0000548 assert(false && "__builtin_types_compatible_p is not legal in C++");
549 return SemaRef.ExprError();
Douglas Gregordc241b42009-05-19 20:55:31 +0000550}
551
552Sema::OwningExprResult
Douglas Gregorcde01732009-05-19 22:10:17 +0000553TemplateExprInstantiator::VisitShuffleVectorExpr(ShuffleVectorExpr *E) {
Douglas Gregord7e27052009-05-20 22:33:37 +0000554 ASTOwningVector<&ActionBase::DeleteExpr> SubExprs(SemaRef);
Douglas Gregorcde01732009-05-19 22:10:17 +0000555 for (unsigned I = 0, N = E->getNumSubExprs(); I != N; ++I) {
556 OwningExprResult SubExpr = Visit(E->getExpr(I));
Douglas Gregord7e27052009-05-20 22:33:37 +0000557 if (SubExpr.isInvalid())
Douglas Gregorcde01732009-05-19 22:10:17 +0000558 return SemaRef.ExprError();
Douglas Gregorcde01732009-05-19 22:10:17 +0000559
560 SubExprs.push_back(SubExpr.takeAs<Expr>());
561 }
562
563 // Find the declaration for __builtin_shufflevector
564 const IdentifierInfo &Name
565 = SemaRef.Context.Idents.get("__builtin_shufflevector");
566 TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
567 DeclContext::lookup_result Lookup
568 = TUDecl->lookup(SemaRef.Context, DeclarationName(&Name));
569 assert(Lookup.first != Lookup.second && "No __builtin_shufflevector?");
570
571 // Build a reference to the __builtin_shufflevector builtin
572 FunctionDecl *Builtin = cast<FunctionDecl>(*Lookup.first);
573 Expr *Callee = new (SemaRef.Context) DeclRefExpr(Builtin, Builtin->getType(),
574 E->getBuiltinLoc(),
575 false, false);
576 SemaRef.UsualUnaryConversions(Callee);
577
578 // Build the CallExpr
579 CallExpr *TheCall = new (SemaRef.Context) CallExpr(SemaRef.Context, Callee,
Douglas Gregord7e27052009-05-20 22:33:37 +0000580 SubExprs.takeAs<Expr>(),
Douglas Gregorcde01732009-05-19 22:10:17 +0000581 SubExprs.size(),
582 Builtin->getResultType(),
583 E->getRParenLoc());
584 OwningExprResult OwnedCall(SemaRef.Owned(TheCall));
585
586 // Type-check the __builtin_shufflevector expression.
587 OwningExprResult Result = SemaRef.SemaBuiltinShuffleVector(TheCall);
588 if (Result.isInvalid())
589 return SemaRef.ExprError();
590
591 OwnedCall.release();
592 return move(Result);
593}
594
595Sema::OwningExprResult
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000596TemplateExprInstantiator::VisitChooseExpr(ChooseExpr *E) {
597 OwningExprResult Cond = Visit(E->getCond());
598 if (Cond.isInvalid())
599 return SemaRef.ExprError();
600
601 OwningExprResult LHS = SemaRef.InstantiateExpr(E->getLHS(), TemplateArgs);
602 if (LHS.isInvalid())
603 return SemaRef.ExprError();
604
605 OwningExprResult RHS = Visit(E->getRHS());
606 if (RHS.isInvalid())
607 return SemaRef.ExprError();
608
609 return SemaRef.ActOnChooseExpr(E->getBuiltinLoc(),
610 move(Cond), move(LHS), move(RHS),
611 E->getRParenLoc());
612}
613
Douglas Gregordd027302009-05-19 23:10:31 +0000614Sema::OwningExprResult TemplateExprInstantiator::VisitVAArgExpr(VAArgExpr *E) {
615 OwningExprResult SubExpr = Visit(E->getSubExpr());
616 if (SubExpr.isInvalid())
617 return SemaRef.ExprError();
618
619 SourceLocation FakeTypeLoc
620 = SemaRef.PP.getLocForEndOfToken(E->getSubExpr()->getSourceRange()
621 .getEnd());
622 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
623 /*FIXME:*/FakeTypeLoc,
624 DeclarationName());
625 if (T.isNull())
626 return SemaRef.ExprError();
627
628 return SemaRef.ActOnVAArg(E->getBuiltinLoc(), move(SubExpr),
629 T.getAsOpaquePtr(), E->getRParenLoc());
630}
631
Douglas Gregorc9ecc572009-05-19 22:43:30 +0000632Sema::OwningExprResult
Douglas Gregorccb97f52009-05-21 21:38:12 +0000633TemplateExprInstantiator::VisitInitListExpr(InitListExpr *E) {
634 ExprVector Inits(SemaRef);
635 for (unsigned I = 0, N = E->getNumInits(); I != N; ++I) {
636 OwningExprResult Init = Visit(E->getInit(I));
637 if (Init.isInvalid())
638 return SemaRef.ExprError();
639 Inits.push_back(Init.takeAs<Expr>());
640 }
641
642 return SemaRef.ActOnInitList(E->getLBraceLoc(), move_arg(Inits),
643 E->getRBraceLoc());
644}
645
646Sema::OwningExprResult
Douglas Gregor9ea62762009-05-21 23:17:49 +0000647TemplateExprInstantiator::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
648 Designation Desig;
649
650 // Instantiate the initializer value
651 OwningExprResult Init = Visit(E->getInit());
652 if (Init.isInvalid())
653 return SemaRef.ExprError();
654
655 // Instantiate the designators.
656 ExprVector ArrayExprs(SemaRef); // Expresses used in array designators
657 for (DesignatedInitExpr::designators_iterator D = E->designators_begin(),
658 DEnd = E->designators_end();
659 D != DEnd; ++D) {
660 if (D->isFieldDesignator()) {
661 Desig.AddDesignator(Designator::getField(D->getFieldName(),
662 D->getDotLoc(),
663 D->getFieldLoc()));
664 continue;
665 }
666
667 if (D->isArrayDesignator()) {
668 OwningExprResult Index = Visit(E->getArrayIndex(*D));
669 if (Index.isInvalid())
670 return SemaRef.ExprError();
671
672 Desig.AddDesignator(Designator::getArray(Index.get(),
673 D->getLBracketLoc()));
674
675 ArrayExprs.push_back(Index.release());
676 continue;
677 }
678
Douglas Gregorc4bb7bf2009-05-21 23:30:39 +0000679 assert(D->isArrayRangeDesignator() && "New kind of designator?");
680 OwningExprResult Start = Visit(E->getArrayRangeStart(*D));
681 if (Start.isInvalid())
682 return SemaRef.ExprError();
683
684 OwningExprResult End = Visit(E->getArrayRangeEnd(*D));
685 if (End.isInvalid())
686 return SemaRef.ExprError();
687
688 Desig.AddDesignator(Designator::getArrayRange(Start.get(),
689 End.get(),
690 D->getLBracketLoc(),
691 D->getEllipsisLoc()));
692
693 ArrayExprs.push_back(Start.release());
694 ArrayExprs.push_back(End.release());
Douglas Gregor9ea62762009-05-21 23:17:49 +0000695 }
696
697 OwningExprResult Result =
698 SemaRef.ActOnDesignatedInitializer(Desig,
699 E->getEqualOrColonLoc(),
700 E->usesGNUSyntax(),
701 move(Init));
702 if (Result.isInvalid())
703 return SemaRef.ExprError();
704
705 ArrayExprs.take();
706 return move(Result);
707}
708
709Sema::OwningExprResult
710TemplateExprInstantiator::VisitImplicitValueInitExpr(
711 ImplicitValueInitExpr *E) {
712 assert(!E->isTypeDependent() && !E->isValueDependent() &&
713 "ImplicitValueInitExprs are never dependent");
714 return SemaRef.Clone(E);
715}
716
717Sema::OwningExprResult
Douglas Gregorbec53e72009-05-22 23:07:44 +0000718TemplateExprInstantiator::VisitExtVectorElementExpr(ExtVectorElementExpr *E) {
719 OwningExprResult Base = Visit(E->getBase());
720 if (Base.isInvalid())
721 return SemaRef.ExprError();
722
723 SourceLocation FakeOperatorLoc =
724 SemaRef.PP.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
725 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
726 move(Base),
727 /*FIXME*/FakeOperatorLoc,
728 tok::period,
729 E->getAccessorLoc(),
730 E->getAccessor(),
731 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
732}
733
734Sema::OwningExprResult
Douglas Gregoraa6af222009-03-25 00:27:28 +0000735TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) {
736 bool isSizeOf = E->isSizeOf();
737
738 if (E->isArgumentType()) {
739 QualType T = E->getArgumentType();
740 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000741 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000742 /*FIXME*/E->getOperatorLoc(),
743 &SemaRef.PP.getIdentifierTable().get("sizeof"));
744 if (T.isNull())
745 return SemaRef.ExprError();
746 }
747
748 return SemaRef.CreateSizeOfAlignOfExpr(T, E->getOperatorLoc(), isSizeOf,
749 E->getSourceRange());
750 }
751
752 Sema::OwningExprResult Arg = Visit(E->getArgumentExpr());
753 if (Arg.isInvalid())
754 return SemaRef.ExprError();
755
756 Sema::OwningExprResult Result
757 = SemaRef.CreateSizeOfAlignOfExpr((Expr *)Arg.get(), E->getOperatorLoc(),
758 isSizeOf, E->getSourceRange());
759 if (Result.isInvalid())
760 return SemaRef.ExprError();
761
762 Arg.release();
763 return move(Result);
764}
765
766Sema::OwningExprResult
767TemplateExprInstantiator::VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E) {
Douglas Gregorab452ba2009-03-26 23:50:42 +0000768 NestedNameSpecifier *NNS
769 = SemaRef.InstantiateNestedNameSpecifier(E->getQualifier(),
770 E->getQualifierRange(),
Douglas Gregor7e063902009-05-11 23:53:27 +0000771 TemplateArgs);
Douglas Gregorab452ba2009-03-26 23:50:42 +0000772 if (!NNS)
Douglas Gregoraa6af222009-03-25 00:27:28 +0000773 return SemaRef.ExprError();
774
Douglas Gregorab452ba2009-03-26 23:50:42 +0000775 CXXScopeSpec SS;
776 SS.setRange(E->getQualifierRange());
777 SS.setScopeRep(NNS);
778
Douglas Gregoraa6af222009-03-25 00:27:28 +0000779 // FIXME: We're passing in a NULL scope, because
780 // ActOnDeclarationNameExpr doesn't actually use the scope when we
781 // give it a non-empty scope specifier. Investigate whether it would
782 // be better to refactor ActOnDeclarationNameExpr.
783 return SemaRef.ActOnDeclarationNameExpr(/*Scope=*/0, E->getLocation(),
784 E->getDeclName(),
785 /*HasTrailingLParen=*/false,
786 &SS,
787 /*FIXME:isAddressOfOperand=*/false);
788}
789
790Sema::OwningExprResult
791TemplateExprInstantiator::VisitCXXTemporaryObjectExpr(
792 CXXTemporaryObjectExpr *E) {
793 QualType T = E->getType();
794 if (T->isDependentType()) {
Douglas Gregor7e063902009-05-11 23:53:27 +0000795 T = SemaRef.InstantiateType(T, TemplateArgs,
Douglas Gregoraa6af222009-03-25 00:27:28 +0000796 E->getTypeBeginLoc(), DeclarationName());
797 if (T.isNull())
798 return SemaRef.ExprError();
799 }
800
Douglas Gregord7e27052009-05-20 22:33:37 +0000801 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregoraa6af222009-03-25 00:27:28 +0000802 Args.reserve(E->getNumArgs());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000803 for (CXXTemporaryObjectExpr::arg_iterator Arg = E->arg_begin(),
804 ArgEnd = E->arg_end();
805 Arg != ArgEnd; ++Arg) {
806 OwningExprResult InstantiatedArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +0000807 if (InstantiatedArg.isInvalid())
808 return SemaRef.ExprError();
Douglas Gregoraa6af222009-03-25 00:27:28 +0000809
810 Args.push_back((Expr *)InstantiatedArg.release());
811 }
812
Douglas Gregord7e27052009-05-20 22:33:37 +0000813 SourceLocation CommaLoc;
814 // FIXME: HACK!
815 if (Args.size() > 1) {
816 Expr *First = (Expr *)Args[0];
817 CommaLoc
818 = SemaRef.PP.getLocForEndOfToken(First->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000819 }
Douglas Gregord7e27052009-05-20 22:33:37 +0000820 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()
821 /*, FIXME*/),
822 T.getAsOpaquePtr(),
823 /*FIXME*/E->getTypeBeginLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +0000824 move_arg(Args),
Douglas Gregord7e27052009-05-20 22:33:37 +0000825 /*HACK*/&CommaLoc,
826 E->getSourceRange().getEnd());
Douglas Gregoraa6af222009-03-25 00:27:28 +0000827}
828
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000829Sema::OwningExprResult TemplateExprInstantiator::VisitCastExpr(CastExpr *E) {
830 assert(false && "Cannot instantiate abstract CastExpr");
831 return SemaRef.ExprError();
832}
833
Douglas Gregoraa6af222009-03-25 00:27:28 +0000834Sema::OwningExprResult TemplateExprInstantiator::VisitImplicitCastExpr(
835 ImplicitCastExpr *E) {
836 assert(!E->isTypeDependent() && "Implicit casts must have known types");
837
838 Sema::OwningExprResult SubExpr = Visit(E->getSubExpr());
839 if (SubExpr.isInvalid())
840 return SemaRef.ExprError();
841
842 ImplicitCastExpr *ICE =
843 new (SemaRef.Context) ImplicitCastExpr(E->getType(),
844 (Expr *)SubExpr.release(),
845 E->isLvalueCast());
846 return SemaRef.Owned(ICE);
847}
848
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000849Sema::OwningExprResult
850TemplateExprInstantiator::VisitExplicitCastExpr(ExplicitCastExpr *E) {
851 assert(false && "Cannot instantiate abstract ExplicitCastExpr");
852 return SemaRef.ExprError();
853}
854
855Sema::OwningExprResult
856TemplateExprInstantiator::VisitCStyleCastExpr(CStyleCastExpr *E) {
857 // Instantiate the type that we're casting to.
858 SourceLocation TypeStartLoc
859 = SemaRef.PP.getLocForEndOfToken(E->getLParenLoc());
860 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
861 TemplateArgs,
862 TypeStartLoc,
863 DeclarationName());
864 if (ExplicitTy.isNull())
865 return SemaRef.ExprError();
866
867 // Instantiate the subexpression.
868 OwningExprResult SubExpr = Visit(E->getSubExpr());
869 if (SubExpr.isInvalid())
870 return SemaRef.ExprError();
871
872 return SemaRef.ActOnCastExpr(E->getLParenLoc(),
873 ExplicitTy.getAsOpaquePtr(),
874 E->getRParenLoc(),
875 move(SubExpr));
876}
877
878Sema::OwningExprResult
Douglas Gregor08d3e7c2009-05-22 21:26:58 +0000879TemplateExprInstantiator::VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
880 return VisitCallExpr(E);
881}
882
883Sema::OwningExprResult
Douglas Gregora3a7b8e2009-05-19 19:05:47 +0000884TemplateExprInstantiator::VisitCXXNamedCastExpr(CXXNamedCastExpr *E) {
885 // Figure out which cast operator we're dealing with.
886 tok::TokenKind Kind;
887 switch (E->getStmtClass()) {
888 case Stmt::CXXStaticCastExprClass:
889 Kind = tok::kw_static_cast;
890 break;
891
892 case Stmt::CXXDynamicCastExprClass:
893 Kind = tok::kw_dynamic_cast;
894 break;
895
896 case Stmt::CXXReinterpretCastExprClass:
897 Kind = tok::kw_reinterpret_cast;
898 break;
899
900 case Stmt::CXXConstCastExprClass:
901 Kind = tok::kw_const_cast;
902 break;
903
904 default:
905 assert(false && "Invalid C++ named cast");
906 return SemaRef.ExprError();
907 }
908
909 // Instantiate the type that we're casting to.
910 SourceLocation TypeStartLoc
911 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
912 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
913 TemplateArgs,
914 TypeStartLoc,
915 DeclarationName());
916 if (ExplicitTy.isNull())
917 return SemaRef.ExprError();
918
919 // Instantiate the subexpression.
920 OwningExprResult SubExpr = Visit(E->getSubExpr());
921 if (SubExpr.isInvalid())
922 return SemaRef.ExprError();
923
924 SourceLocation FakeLAngleLoc
925 = SemaRef.PP.getLocForEndOfToken(E->getOperatorLoc());
926 SourceLocation FakeRAngleLoc = E->getSubExpr()->getSourceRange().getBegin();
927 SourceLocation FakeRParenLoc
928 = SemaRef.PP.getLocForEndOfToken(
929 E->getSubExpr()->getSourceRange().getEnd());
930 return SemaRef.ActOnCXXNamedCast(E->getOperatorLoc(), Kind,
931 /*FIXME:*/FakeLAngleLoc,
932 ExplicitTy.getAsOpaquePtr(),
933 /*FIXME:*/FakeRAngleLoc,
934 /*FIXME:*/FakeRAngleLoc,
935 move(SubExpr),
936 /*FIXME:*/FakeRParenLoc);
937}
938
939Sema::OwningExprResult
940TemplateExprInstantiator::VisitCXXStaticCastExpr(CXXStaticCastExpr *E) {
941 return VisitCXXNamedCastExpr(E);
942}
943
944Sema::OwningExprResult
945TemplateExprInstantiator::VisitCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
946 return VisitCXXNamedCastExpr(E);
947}
948
949Sema::OwningExprResult
950TemplateExprInstantiator::VisitCXXReinterpretCastExpr(
951 CXXReinterpretCastExpr *E) {
952 return VisitCXXNamedCastExpr(E);
953}
954
955Sema::OwningExprResult
956TemplateExprInstantiator::VisitCXXConstCastExpr(CXXConstCastExpr *E) {
957 return VisitCXXNamedCastExpr(E);
958}
959
Anders Carlsson0712d292009-05-15 20:26:03 +0000960Sema::OwningExprResult
961TemplateExprInstantiator::VisitCXXThisExpr(CXXThisExpr *E) {
962 QualType ThisType =
963 cast<CXXMethodDecl>(SemaRef.CurContext)->getThisType(SemaRef.Context);
964
965 CXXThisExpr *TE =
966 new (SemaRef.Context) CXXThisExpr(E->getLocStart(), ThisType);
967
968 return SemaRef.Owned(TE);
969}
970
Douglas Gregoraa6af222009-03-25 00:27:28 +0000971Sema::OwningExprResult
Douglas Gregor12d0c302009-05-21 18:34:44 +0000972TemplateExprInstantiator::VisitCXXTypeidExpr(CXXTypeidExpr *E) {
973 if (E->isTypeOperand()) {
974 QualType T = SemaRef.InstantiateType(E->getTypeOperand(),
975 TemplateArgs,
976 /*FIXME*/E->getSourceRange().getBegin(),
977 DeclarationName());
978 if (T.isNull())
979 return SemaRef.ExprError();
980
981 return SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
982 /*FIXME*/E->getSourceRange().getBegin(),
983 true, T.getAsOpaquePtr(),
984 E->getSourceRange().getEnd());
985 }
986
987 OwningExprResult Operand = Visit(E->getExprOperand());
988 if (Operand.isInvalid())
989 return SemaRef.ExprError();
990
991 OwningExprResult Result
992 = SemaRef.ActOnCXXTypeid(E->getSourceRange().getBegin(),
993 /*FIXME*/E->getSourceRange().getBegin(),
994 false, Operand.get(),
995 E->getSourceRange().getEnd());
996 if (Result.isInvalid())
997 return SemaRef.ExprError();
998
999 Operand.release(); // FIXME: since ActOnCXXTypeid silently took ownership
1000 return move(Result);
1001}
1002
1003Sema::OwningExprResult
Douglas Gregor42e5b502009-05-21 17:37:52 +00001004TemplateExprInstantiator::VisitCXXThrowExpr(CXXThrowExpr *E) {
1005 OwningExprResult SubExpr(SemaRef, (void *)0);
1006 if (E->getSubExpr()) {
1007 SubExpr = Visit(E->getSubExpr());
1008 if (SubExpr.isInvalid())
1009 return SemaRef.ExprError();
1010 }
1011
1012 return SemaRef.ActOnCXXThrow(E->getThrowLoc(), move(SubExpr));
1013}
1014
1015Sema::OwningExprResult
Douglas Gregord94546a2009-05-20 21:38:11 +00001016TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) {
1017 assert(!cast<CXXRecordDecl>(E->getConstructor()->getDeclContext())
1018 ->isDependentType() && "Dependent constructor shouldn't be here");
1019
1020 QualType T = SemaRef.InstantiateType(E->getType(), TemplateArgs,
1021 /*FIXME*/E->getSourceRange().getBegin(),
1022 DeclarationName());
1023 if (T.isNull())
1024 return SemaRef.ExprError();
1025
Douglas Gregord7e27052009-05-20 22:33:37 +00001026 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord94546a2009-05-20 21:38:11 +00001027 for (CXXConstructExpr::arg_iterator Arg = E->arg_begin(),
1028 ArgEnd = E->arg_end();
1029 Arg != ArgEnd; ++Arg) {
1030 OwningExprResult ArgInst = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001031 if (ArgInst.isInvalid())
1032 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001033
1034 Args.push_back(ArgInst.takeAs<Expr>());
1035 }
1036
1037
Douglas Gregord7e27052009-05-20 22:33:37 +00001038 VarDecl *Var = cast_or_null<VarDecl>(SemaRef.InstantiateDecl(E->getVarDecl(),
1039 SemaRef.CurContext,
1040 TemplateArgs));
1041 if (!Var)
Douglas Gregord94546a2009-05-20 21:38:11 +00001042 return SemaRef.ExprError();
Douglas Gregord94546a2009-05-20 21:38:11 +00001043
Douglas Gregore06274d2009-05-20 21:51:01 +00001044 SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var);
Douglas Gregord94546a2009-05-20 21:38:11 +00001045 return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, Var, T,
1046 E->getConstructor(),
1047 E->isElidable(),
Douglas Gregord7e27052009-05-20 22:33:37 +00001048 Args.takeAs<Expr>(),
1049 Args.size()));
Douglas Gregord94546a2009-05-20 21:38:11 +00001050}
1051
1052Sema::OwningExprResult
1053TemplateExprInstantiator::VisitCXXFunctionalCastExpr(
1054 CXXFunctionalCastExpr *E) {
1055 // Instantiate the type that we're casting to.
1056 QualType ExplicitTy = SemaRef.InstantiateType(E->getTypeAsWritten(),
1057 TemplateArgs,
1058 E->getTypeBeginLoc(),
1059 DeclarationName());
1060 if (ExplicitTy.isNull())
1061 return SemaRef.ExprError();
1062
1063 // Instantiate the subexpression.
1064 OwningExprResult SubExpr = Visit(E->getSubExpr());
1065 if (SubExpr.isInvalid())
1066 return SemaRef.ExprError();
1067
1068 // FIXME: The end of the type's source range is wrong
1069 Expr *Sub = SubExpr.takeAs<Expr>();
1070 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc()),
1071 ExplicitTy.getAsOpaquePtr(),
1072 /*FIXME:*/E->getTypeBeginLoc(),
1073 Sema::MultiExprArg(SemaRef,
1074 (void **)&Sub,
1075 1),
1076 0,
1077 E->getRParenLoc());
1078}
1079
1080Sema::OwningExprResult
1081TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
1082 return SemaRef.Clone(E);
1083}
1084
1085Sema::OwningExprResult
Douglas Gregor3433cf72009-05-21 00:00:09 +00001086TemplateExprInstantiator::VisitCXXNewExpr(CXXNewExpr *E) {
1087 // Instantiate the type that we're allocating
1088 QualType AllocType = SemaRef.InstantiateType(E->getAllocatedType(),
1089 TemplateArgs,
1090 /*FIXME:*/E->getSourceRange().getBegin(),
1091 DeclarationName());
1092 if (AllocType.isNull())
1093 return SemaRef.ExprError();
1094
1095 // Instantiate the size of the array we're allocating (if any).
1096 OwningExprResult ArraySize = SemaRef.InstantiateExpr(E->getArraySize(),
1097 TemplateArgs);
1098 if (ArraySize.isInvalid())
1099 return SemaRef.ExprError();
1100
1101 // Instantiate the placement arguments (if any).
1102 ASTOwningVector<&ActionBase::DeleteExpr> PlacementArgs(SemaRef);
1103 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1104 OwningExprResult Arg = Visit(E->getPlacementArg(I));
1105 if (Arg.isInvalid())
1106 return SemaRef.ExprError();
1107
1108 PlacementArgs.push_back(Arg.take());
1109 }
1110
1111 // Instantiate the constructor arguments (if any).
1112 ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(SemaRef);
1113 for (unsigned I = 0, N = E->getNumConstructorArgs(); I != N; ++I) {
1114 OwningExprResult Arg = Visit(E->getConstructorArg(I));
1115 if (Arg.isInvalid())
1116 return SemaRef.ExprError();
1117
1118 ConstructorArgs.push_back(Arg.take());
1119 }
1120
1121 return SemaRef.BuildCXXNew(E->getSourceRange().getBegin(),
1122 E->isGlobalNew(),
1123 /*FIXME*/SourceLocation(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001124 move_arg(PlacementArgs),
Douglas Gregor3433cf72009-05-21 00:00:09 +00001125 /*FIXME*/SourceLocation(),
1126 E->isParenTypeId(),
1127 AllocType,
1128 /*FIXME*/E->getSourceRange().getBegin(),
1129 SourceRange(),
1130 move(ArraySize),
1131 /*FIXME*/SourceLocation(),
1132 Sema::MultiExprArg(SemaRef,
1133 ConstructorArgs.take(),
1134 ConstructorArgs.size()),
1135 E->getSourceRange().getEnd());
1136}
1137
1138Sema::OwningExprResult
Douglas Gregord0c02672009-05-21 17:21:12 +00001139TemplateExprInstantiator::VisitCXXDeleteExpr(CXXDeleteExpr *E) {
1140 OwningExprResult Operand = Visit(E->getArgument());
1141 if (Operand.isInvalid())
1142 return SemaRef.ExprError();
1143
1144 return SemaRef.ActOnCXXDelete(E->getSourceRange().getBegin(),
1145 E->isGlobalDelete(),
1146 E->isArrayForm(),
1147 move(Operand));
1148}
1149
1150Sema::OwningExprResult
Douglas Gregor36bb03b2009-05-21 18:55:48 +00001151TemplateExprInstantiator::VisitUnaryTypeTraitExpr(UnaryTypeTraitExpr *E) {
1152 QualType T = SemaRef.InstantiateType(E->getQueriedType(), TemplateArgs,
1153 /*FIXME*/E->getSourceRange().getBegin(),
1154 DeclarationName());
1155 if (T.isNull())
1156 return SemaRef.ExprError();
1157
1158 SourceLocation FakeLParenLoc
1159 = SemaRef.PP.getLocForEndOfToken(E->getSourceRange().getBegin());
1160 return SemaRef.ActOnUnaryTypeTrait(E->getTrait(),
1161 E->getSourceRange().getBegin(),
1162 /*FIXME*/FakeLParenLoc,
1163 T.getAsOpaquePtr(),
1164 E->getSourceRange().getEnd());
1165}
1166
1167Sema::OwningExprResult
Douglas Gregore06274d2009-05-20 21:51:01 +00001168TemplateExprInstantiator::VisitCXXExprWithTemporaries(
1169 CXXExprWithTemporaries *E) {
1170 OwningExprResult SubExpr = Visit(E->getSubExpr());
1171 if (SubExpr.isInvalid())
1172 return SemaRef.ExprError();
1173
1174 return SemaRef.ActOnFinishFullExpr(move(SubExpr));
1175}
1176
1177Sema::OwningExprResult
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001178TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr(
1179 CXXUnresolvedConstructExpr *E) {
1180 QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs,
1181 E->getTypeBeginLoc(),
1182 DeclarationName());
1183 if (T.isNull())
1184 return SemaRef.ExprError();
1185
Douglas Gregord7e27052009-05-20 22:33:37 +00001186 ASTOwningVector<&ActionBase::DeleteExpr> Args(SemaRef);
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001187 llvm::SmallVector<SourceLocation, 8> FakeCommaLocs;
1188 for (CXXUnresolvedConstructExpr::arg_iterator Arg = E->arg_begin(),
1189 ArgEnd = E->arg_end();
1190 Arg != ArgEnd; ++Arg) {
1191 OwningExprResult InstArg = Visit(*Arg);
Douglas Gregord7e27052009-05-20 22:33:37 +00001192 if (InstArg.isInvalid())
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001193 return SemaRef.ExprError();
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001194
1195 FakeCommaLocs.push_back(
1196 SemaRef.PP.getLocForEndOfToken((*Arg)->getSourceRange().getEnd()));
1197 Args.push_back(InstArg.takeAs<Expr>());
1198 }
1199
1200 // FIXME: The end of the type range isn't exactly correct.
1201 // FIXME: we're faking the locations of the commas
1202 return SemaRef.ActOnCXXTypeConstructExpr(SourceRange(E->getTypeBeginLoc(),
1203 E->getLParenLoc()),
1204 T.getAsOpaquePtr(),
1205 E->getLParenLoc(),
Douglas Gregor45db71d2009-05-21 16:25:11 +00001206 move_arg(Args),
Douglas Gregord81e6ca2009-05-20 18:46:25 +00001207 &FakeCommaLocs.front(),
1208 E->getRParenLoc());
1209}
1210
1211Sema::OwningExprResult
Douglas Gregor1c0ca592009-05-22 21:13:27 +00001212TemplateExprInstantiator::VisitCXXUnresolvedMemberExpr(
1213 CXXUnresolvedMemberExpr *E) {
1214 // Instantiate the base of the expression.
1215 OwningExprResult Base = Visit(E->getBase());
1216 if (Base.isInvalid())
1217 return SemaRef.ExprError();
1218
1219 // FIXME: Instantiate the declaration name.
1220 return SemaRef.ActOnMemberReferenceExpr(/*Scope=*/0,
1221 move(Base), E->getOperatorLoc(),
1222 E->isArrow()? tok::arrow
1223 : tok::period,
1224 E->getMemberLoc(),
1225 /*FIXME:*/*E->getMember().getAsIdentifierInfo(),
1226 /*FIXME?*/Sema::DeclPtrTy::make((Decl*)0));
1227}
1228
1229Sema::OwningExprResult
Douglas Gregor7e063902009-05-11 23:53:27 +00001230Sema::InstantiateExpr(Expr *E, const TemplateArgumentList &TemplateArgs) {
Douglas Gregor50557a72009-05-15 20:47:12 +00001231 if (!E)
1232 return Owned((Expr *)0);
1233
Douglas Gregor7e063902009-05-11 23:53:27 +00001234 TemplateExprInstantiator Instantiator(*this, TemplateArgs);
Douglas Gregoraa6af222009-03-25 00:27:28 +00001235 return Instantiator.Visit(E);
1236}