PR c++/19894
authorreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Jun 2005 11:09:13 +0000 (11:09 +0000)
committerreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Jun 2005 11:09:13 +0000 (11:09 +0000)
* pt.c (tsubst): Reject pointer-to-member of type void.

* g++.dg/template/ptrmem15.C: New test.

PR c++/20563
* parser.c (cp_parser_label_declaration): Deal with invalid/missing
identifiers.

* g++.dg/ext/label4.C: New test.

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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/label4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/ptrmem15.C [new file with mode: 0644]

index 87a9da7..c15f9b4 100644 (file)
@@ -1,3 +1,12 @@
+2005-06-08  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/19894
+       * pt.c (tsubst): Reject pointer-to-member of type void.
+
+       PR c++/20563
+       * parser.c (cp_parser_label_declaration): Deal with invalid/missing
+       identifiers.
+
 2005-06-07  Nathan Sidwell  <nathan@codesourcery.com>
 
        * cp-tree.def (DEFAULT_ARG): Adjust documentation.
index 24cb027..cb389d2 100644 (file)
@@ -14392,7 +14392,10 @@ cp_parser_label_declaration (cp_parser* parser)
 
       /* Look for an identifier.  */
       identifier = cp_parser_identifier (parser);
-      /* Declare it as a lobel.  */
+      /* If we failed, stop.  */
+      if (identifier == error_mark_node)
+       break;
+      /* Declare it as a label.  */
       finish_label_decl (identifier);
       /* If the next token is a `;', stop.  */
       if (cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON))
index f7eb935..292dc0a 100644 (file)
@@ -7271,7 +7271,12 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
          {
            if (complain & tf_error)
              error ("creating pointer to member reference type %qT", type);
-           
+           return error_mark_node;
+         }
+       if (TREE_CODE (type) == VOID_TYPE)
+         {
+           if (complain & tf_error)
+             error ("creating pointer to member of type void");
            return error_mark_node;
          }
        gcc_assert (TREE_CODE (type) != METHOD_TYPE);
index 224d3ae..05aa1b4 100644 (file)
@@ -1,3 +1,11 @@
+2005-06-08  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/19894
+       * g++.dg/template/ptrmem15.C: New test.
+
+       PR c++/20563
+       * g++.dg/ext/label4.C: New test.
+
 2005-06-08  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * gcc.dg/tls/debug-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/ext/label4.C b/gcc/testsuite/g++.dg/ext/label4.C
new file mode 100644 (file)
index 0000000..80b50a7
--- /dev/null
@@ -0,0 +1,6 @@
+// PR c++/20563: ICE (--enable-checking), infinite loop (--disable-checking)
+// Origin:       Giovanni Bajo <giovannibajo@libero.it>
+
+// { dg-do compile }
+
+__label__ *l;  // { dg-error "before" }
diff --git a/gcc/testsuite/g++.dg/template/ptrmem15.C b/gcc/testsuite/g++.dg/template/ptrmem15.C
new file mode 100644 (file)
index 0000000..553d295
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/19894
+// Origin: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+template<typename T> struct A
+{
+    T A::* p;  // { dg-error "void" }
+};
+
+A<void> a;     // { dg-error "instantiated" }