From: Volker Reichelt Date: Wed, 8 Jun 2005 11:09:13 +0000 (+0000) Subject: re PR c++/19894 (pointer-to-void member not rejected in template) X-Git-Tag: misc/cutover-cvs2svn~2528 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cb6d4a9fce89e5bea9476338870125bac9b83e96;p=thirdparty%2Fgcc.git re PR c++/19894 (pointer-to-void member not rejected in template) 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 87a9da7075d7..c15f9b404336 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2005-06-08 Volker Reichelt + + 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 * cp-tree.def (DEFAULT_ARG): Adjust documentation. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 24cb027d3271..cb389d24afe9 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -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)) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index f7eb93576ec1..292dc0ae78b7 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 224d3ae90408..05aa1b4f33cf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2005-06-08 Volker Reichelt + + 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 * 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 index 000000000000..80b50a799815 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/label4.C @@ -0,0 +1,6 @@ +// PR c++/20563: ICE (--enable-checking), infinite loop (--disable-checking) +// Origin: Giovanni Bajo + +// { 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 index 000000000000..553d2953fd9c --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem15.C @@ -0,0 +1,9 @@ +// PR c++/19894 +// Origin: Volker Reichelt + +template struct A +{ + T A::* p; // { dg-error "void" } +}; + +A a; // { dg-error "instantiated" }