From: Douglas Gregor Date: Tue, 19 May 2009 20:31:21 +0000 (+0000) Subject: Template instantiation for GNU statement expressions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=cd938172a40c6f1aca357cf7bad3cf6c208b6136;p=clang Template instantiation for GNU statement expressions git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72129 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp index 2589e301e0..7cf403c282 100644 --- a/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/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/test/SemaTemplate/instantiate-expr-3.cpp b/test/SemaTemplate/instantiate-expr-3.cpp index 7f54c5de3c..d098f27860 100644 --- a/test/SemaTemplate/instantiate-expr-3.cpp +++ b/test/SemaTemplate/instantiate-expr-3.cpp @@ -56,3 +56,16 @@ struct Conditional0 { }; template struct Conditional0; + +// --------------------------------------------------------------------- +// Statement expressions +// --------------------------------------------------------------------- +template +struct StatementExpr0 { + void f(T t) { + (void)({ if (t) t = t + 17; }); // expected-error{{invalid}} + } +}; + +template struct StatementExpr0; +template struct StatementExpr0; // expected-note{{instantiation}}