]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/19894 (pointer-to-void member not rejected in template)
authorVolker Reichelt <reichelt@igpm.rwth-aachen.de>
Wed, 8 Jun 2005 11:09:13 +0000 (11:09 +0000)
committerVolker Reichelt <reichelt@gcc.gnu.org>
Wed, 8 Jun 2005 11:09:13 +0000 (11:09 +0000)
PR c++/19894
* 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.

From-SVN: r100754

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 87a9da7075d7375ddc585b1f11cf441cd00ebae6..c15f9b4043360555f26988a40c9ac90dda390f61 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 24cb027d32713e838c74627e9b19efe83ca73ca0..cb389d24afe9a6112c27b8535da8d85ba8ad108d 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 f7eb93576ec1b00d2ce1e0f3945587cadde63d05..292dc0ae78b7b7a8e9df44bea26edf4522054dc5 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 224d3ae90408884de9b92c62ec2d00c782f92c72..05aa1b4f33cf1dfc587a88bf3671db1d727e6cda 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" }