re PR c++/33207 (ICE redeclaring namespace as struct)
authorSimon Martin <simartin@users.sourceforge.net>
Tue, 25 Sep 2007 18:34:05 +0000 (18:34 +0000)
committerSimon Martin <simartin@gcc.gnu.org>
Tue, 25 Sep 2007 18:34:05 +0000 (18:34 +0000)
gcc/cp/

2007-09-25  Simon Martin  <simartin@users.sourceforge.net>

PR c++/33207
* name-lookup.c (pushtag): Do not create an implicit typedef before
the associated type declaration is known to be valid.

gcc/testsuite/

2007-09-25  Simon Martin  <simartin@users.sourceforge.net>

PR c++/33207
* g++.dg/parse/crash38.C: New test.

From-SVN: r128769

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/crash38.C [new file with mode: 0644]

index 991a669d4070d7c0565181c2c24d265c5f6fd89a..b47c802399aeebc7cbc94d6685ee1af1c08b5547 100644 (file)
@@ -1,3 +1,9 @@
+2007-09-25  Simon Martin  <simartin@users.sourceforge.net>
+
+       PR c++/33207
+       * name-lookup.c (pushtag): Do not create an implicit typedef before
+       the associated type declaration is known to be valid.
+
 2007-09-25  Jakub Jelinek  <jakub@redhat.com>
 
        * tree.c (cxx_printable_name): Compare FUNCTION_DECL uids
index 5b5e99d76e4aa27761c80c0c2251f4689b395447..70a395b2f3c5500ddc9397050bf636361e90df88 100644 (file)
@@ -4944,9 +4944,6 @@ pushtag (tree name, tree type, tag_scope scope)
       if (decl == error_mark_node)
        POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl);
 
-      if (! in_class)
-       set_identifier_type_value_with_scope (name, tdef, b);
-
       if (b->kind == sk_class)
        {
          if (!PROCESSING_REAL_TEMPLATE_DECL_P ())
@@ -4965,6 +4962,9 @@ pushtag (tree name, tree type, tag_scope scope)
            POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, decl);
        }
 
+      if (! in_class)
+       set_identifier_type_value_with_scope (name, tdef, b);
+
       TYPE_CONTEXT (type) = DECL_CONTEXT (decl);
 
       /* If this is a local class, keep track of it.  We need this
index ed4ce2530028dc0b18edc2f42c15f49643341f3a..592aba59abfddeb5b5ddf6992c7d7169bb257d93 100644 (file)
@@ -1,3 +1,8 @@
+2007-09-25  Simon Martin  <simartin@users.sourceforge.net>
+
+       PR c++/33207
+       * g++.dg/parse/crash38.C: New test.
+
 2007-09-25  Michael Meissner  <michael.meissner@amd.com>
 
        PR c/33524
diff --git a/gcc/testsuite/g++.dg/parse/crash38.C b/gcc/testsuite/g++.dg/parse/crash38.C
new file mode 100644 (file)
index 0000000..c050b93
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR c++/33207  */
+
+/* This would not ICE.  */
+namespace M { } /* { dg-error "previous declaration" } */
+struct M; /* { dg-error "redeclared as different kind of symbol" } */
+M *p; /* { dg-error "expected constructor" } */
+
+/* This would ICE when processing 'p'.  */
+namespace N { } /* { dg-error "previous declaration" } */
+struct N; /* { dg-error "redeclared as different kind of symbol" } */
+struct N* p; /* { dg-error "redeclared as different kind of symbol|invalid type" } */