diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-05-19 20:31:21 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-05-19 20:31:21 +0000 |
| commit | 8d7fef3cf23ace576679e9cb51636d6f2c36c3ad (patch) | |
| tree | 6c87a10264d19b8b53eeef61aa81b9ce9cdd0e4d /clang | |
| parent | 115652db4af81d77d3de1ade54f4de0faf6bc0fb (diff) | |
| download | bcm5719-llvm-8d7fef3cf23ace576679e9cb51636d6f2c36c3ad.tar.gz bcm5719-llvm-8d7fef3cf23ace576679e9cb51636d6f2c36c3ad.zip | |
Template instantiation for GNU statement expressions
llvm-svn: 72129
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaTemplateInstantiateExpr.cpp | 12 | ||||
| -rw-r--r-- | clang/test/SemaTemplate/instantiate-expr-3.cpp | 13 |
2 files changed, 25 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp index 2589e301e0d..7cf403c282a 100644 --- a/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -54,6 +54,8 @@ namespace { OwningExprResult VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E); OwningExprResult VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E); OwningExprResult VisitConditionalOperator(ConditionalOperator *E); + // FIXME: AddrLabelExpr + OwningExprResult VisitStmtExpr(StmtExpr *E); OwningExprResult VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E); OwningExprResult VisitUnresolvedDeclRefExpr(UnresolvedDeclRefExpr *E); OwningExprResult VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E); @@ -453,6 +455,16 @@ TemplateExprInstantiator::VisitConditionalOperator(ConditionalOperator *E) { move(Cond), move(LHS), move(RHS)); } +Sema::OwningExprResult TemplateExprInstantiator::VisitStmtExpr(StmtExpr *E) { + Sema::OwningStmtResult SubStmt = SemaRef.InstantiateStmt(E->getSubStmt(), + TemplateArgs); + if (SubStmt.isInvalid()) + return SemaRef.ExprError(); + + return SemaRef.ActOnStmtExpr(E->getLParenLoc(), move(SubStmt), + E->getRParenLoc()); +} + Sema::OwningExprResult TemplateExprInstantiator::VisitSizeOfAlignOfExpr(SizeOfAlignOfExpr *E) { bool isSizeOf = E->isSizeOf(); diff --git a/clang/test/SemaTemplate/instantiate-expr-3.cpp b/clang/test/SemaTemplate/instantiate-expr-3.cpp index 7f54c5de3c3..d098f27860c 100644 --- a/clang/test/SemaTemplate/instantiate-expr-3.cpp +++ b/clang/test/SemaTemplate/instantiate-expr-3.cpp @@ -56,3 +56,16 @@ struct Conditional0 { }; template struct Conditional0<int, int, int>; + +// --------------------------------------------------------------------- +// Statement expressions +// --------------------------------------------------------------------- +template<typename T> +struct StatementExpr0 { + void f(T t) { + (void)({ if (t) t = t + 17; }); // expected-error{{invalid}} + } +}; + +template struct StatementExpr0<int>; +template struct StatementExpr0<N1::X>; // expected-note{{instantiation}} |

