]> granicus.if.org Git - clang/commitdiff
Template instantiation for GNU statement expressions
authorDouglas Gregor <dgregor@apple.com>
Tue, 19 May 2009 20:31:21 +0000 (20:31 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 19 May 2009 20:31:21 +0000 (20:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72129 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaTemplateInstantiateExpr.cpp
test/SemaTemplate/instantiate-expr-3.cpp

index 2589e301e0d1c69ae923001acf898c41ae9add20..7cf403c282ad69dd8f23e4b68269904afc99c75f 100644 (file)
@@ -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();
index 7f54c5de3c3ce8f456efdb5fa739682b41360765..d098f27860c0b277730dd57610b27cd7fbad00bc 100644 (file)
@@ -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}}