OSDN Git Service

PR c++/6579
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Oct 2002 23:44:25 +0000 (23:44 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Oct 2002 23:44:25 +0000 (23:44 +0000)
* spew.c (snarf_parenthesized_expression): New function.
(snarf_block): Use it.

PR c++/6579
* g++.dg/parse/stmtexpr3.C: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58427 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/spew.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/stmtexpr3.C [new file with mode: 0644]

index 6f73ad9..2529697 100644 (file)
@@ -1,3 +1,9 @@
+2002-10-22  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/6579
+       * spew.c (snarf_parenthesized_expression): New function.
+       (snarf_block): Use it.
+
 2002-10-22  Richard Henderson  <rth@redhat.com>
 
        * method.c (use_thunk): Always compute vcall_value; assert that
index 8633bb8..1d67125 100644 (file)
@@ -133,6 +133,7 @@ static struct unparsed_text * alloc_unparsed_text
 
 static void snarf_block PARAMS ((struct unparsed_text *t));
 static tree snarf_defarg PARAMS ((void));
+static void snarf_parenthesized_expression (struct unparsed_text *);
 static int frob_id PARAMS ((int, int, tree *));
 
 /* The list of inline functions being held off until we reach the end of
@@ -1067,6 +1068,30 @@ alloc_unparsed_text (locus, decl, interface)
   return r;
 }
 
+/* Accumulate the tokens that make up a parenthesized expression in T,
+   having already read the opening parenthesis.  */
+
+static void
+snarf_parenthesized_expression (struct unparsed_text *t)
+{
+  int yyc;
+  int level = 1;
+
+  while (1)
+    {
+      yyc = next_token (space_for_token (t));
+      if (yyc == '(')
+       ++level;
+      else if (yyc == ')' && --level == 0)
+       break;
+      else if (yyc == 0)
+       {
+         error ("%Hend of file read inside definition", &t->locus);
+         break;
+       }
+    }
+}
+
 /* Subroutine of snarf_method, deals with actual absorption of the block.  */
 
 static void
@@ -1145,6 +1170,8 @@ snarf_block (t)
          else if (look_for_semicolon && blev == 0)
            break;
        }
+      else if (yyc == '(' && blev == 0)
+       snarf_parenthesized_expression (t);
       else if (yyc == 0)
        {
          error ("%Hend of file read inside definition", &t->locus);
index 78e7417..8635fdc 100644 (file)
@@ -1,3 +1,8 @@
+2002-10-22  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/6579
+       * g++.dg/parse/stmtexpr3.C: New test.
+
 2002-10-22  Nathan Sidwell  <nathan@codesourcery.com>
 
        * g++.dg/expr/cond1.C: New test.
diff --git a/gcc/testsuite/g++.dg/parse/stmtexpr3.C b/gcc/testsuite/g++.dg/parse/stmtexpr3.C
new file mode 100644 (file)
index 0000000..79f6893
--- /dev/null
@@ -0,0 +1,8 @@
+// { dg-do compile }
+// { dg-options "" }
+
+struct B
+{
+  int a;
+  B() : a(({ 1; })) {}
+};