From: mmitchel Date: Mon, 24 May 2004 02:29:34 +0000 (+0000) Subject: PR c++/15044 X-Git-Tag: upstream/4.9.2~71080 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e67a67ea884547a3da4d2d33b2aeff903d0276cb;p=platform%2Fupstream%2Flinaro-gcc.git PR c++/15044 * parser.c (cp_parser_class_head): Robustify. PR c++/15317 * parser.c (cp_parser_decl_specifier_seq): Correct error in comment. (cp_parser_constructor_declarator_p): Treat attributes as decl-specifiers. PR c++/15329 * typeck.c (build_unary_op): Do not attempt to resolve casts to base classes in templates. PR c++/15044 * g++.dg/template/error12.C: New test. PR c++/15317 * g++.dg/ext/attrib15.C: New test. PR c++/15329 * g++.dg/template/ptrmem9.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82191 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a517716..8e5e03a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,20 @@ 2004-05-23 Mark Mitchell + PR c++/15044 + * parser.c (cp_parser_class_head): Robustify. + + PR c++/15317 + * parser.c (cp_parser_decl_specifier_seq): Correct error in + comment. + (cp_parser_constructor_declarator_p): Treat attributes + as decl-specifiers. + + PR c++/15329 + * typeck.c (build_unary_op): Do not attempt to resolve casts to + base classes in templates. + +2004-05-23 Mark Mitchell + PR c++/15165 * pt.c (instantiate_template): Robustify. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 59ef23f..44c820a 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -6659,8 +6659,8 @@ cp_parser_simple_declaration (cp_parser* parser, GNU Extension: - decl-specifier-seq: - decl-specifier-seq [opt] attributes + decl-specifier: + attributes Returns a TREE_LIST, giving the decl-specifiers in the order they appear in the source code. The TREE_VALUE of each node is the @@ -12101,7 +12101,8 @@ cp_parser_class_head (cp_parser* parser, pop_deferring_access_checks (); - cp_parser_check_for_invalid_template_id (parser, id); + if (id) + cp_parser_check_for_invalid_template_id (parser, id); /* If it's not a `:' or a `{' then we can't really be looking at a class-head, since a class-head only appears as part of a @@ -14154,6 +14155,10 @@ cp_parser_constructor_declarator_p (cp_parser *parser, bool friend_p) { if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN) && cp_lexer_next_token_is_not (parser->lexer, CPP_ELLIPSIS) + /* A parameter declaration begins with a decl-specifier, + which is either the "attribute" keyword, a storage class + specifier, or (usually) a type-specifier. */ + && !cp_lexer_next_token_is_keyword (parser->lexer, RID_ATTRIBUTE) && !cp_parser_storage_class_specifier_opt (parser)) { tree type; diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 603f655..fb00f58 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -4046,7 +4046,11 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert) { tree addr; - if (TREE_CODE (arg) != COMPONENT_REF) + if (TREE_CODE (arg) != COMPONENT_REF + /* Inside a template, we are processing a non-dependent + expression so we can just form an ADDR_EXPR with the + correct type. */ + || processing_template_decl) addr = build_address (arg); else if (TREE_CODE (TREE_OPERAND (arg, 1)) == BASELINK) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d32a76d..667a742 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2004-05-23 Mark Mitchell + + PR c++/15044 + * g++.dg/template/error12.C: New test. + + PR c++/15317 + * g++.dg/ext/attrib15.C: New test. + + PR c++/15329 + * g++.dg/template/ptrmem9.C: New test. + 2004-05-25 Paul Brook * gfortran.fortran-torture/compile/inquiry_1.f90: New test. diff --git a/gcc/testsuite/g++.dg/ext/attrib15.C b/gcc/testsuite/g++.dg/ext/attrib15.C new file mode 100644 index 0000000..05de12c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/attrib15.C @@ -0,0 +1,9 @@ +// PR c++/15317 + +struct A +{ + A(char); +}; +A::A(__attribute__((unused)) char i2) +{} + diff --git a/gcc/testsuite/g++.dg/template/error12.C b/gcc/testsuite/g++.dg/template/error12.C new file mode 100644 index 0000000..c15961f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error12.C @@ -0,0 +1,4 @@ +// PR c++/15044 + +template class class a { num_t n; } // { dg-error "" } + diff --git a/gcc/testsuite/g++.dg/template/ptrmem9.C b/gcc/testsuite/g++.dg/template/ptrmem9.C new file mode 100644 index 0000000..55e8815 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem9.C @@ -0,0 +1,9 @@ +// PR c++/15329 + +struct S {}; + +template struct X { + S s; + void foo (void (S::*p)()) + { (s.*p)(); } +};