diff options
author | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-05-24 02:29:34 +0000 |
---|---|---|
committer | mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-05-24 02:29:34 +0000 |
commit | e67a67ea884547a3da4d2d33b2aeff903d0276cb (patch) | |
tree | 53a75488b33cd796dfcbd46bc8916fe219c7f84b | |
parent | ce3af53703b54f2c0f79f107b3c55c52efc20b98 (diff) | |
download | gcc-e67a67ea884547a3da4d2d33b2aeff903d0276cb.tar.gz |
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
-rw-r--r-- | gcc/cp/ChangeLog | 15 | ||||
-rw-r--r-- | gcc/cp/parser.c | 11 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/attrib15.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/error12.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/ptrmem9.C | 9 |
7 files changed, 61 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a517716fc21..8e5e03adcf9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,20 @@ 2004-05-23 Mark Mitchell <mark@codesourcery.com> + 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 <mark@codesourcery.com> + PR c++/15165 * pt.c (instantiate_template): Robustify. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 59ef23ff855..44c820a2868 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 603f655c832..fb00f58d815 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 d32a76d7866..667a742a8ec 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2004-05-23 Mark Mitchell <mark@codesourcery.com> + + 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 <paul@codesourcery.com> * 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 00000000000..05de12ccecb --- /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 00000000000..c15961fc33e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error12.C @@ -0,0 +1,4 @@ +// PR c++/15044 + +template class <num_t> 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 00000000000..55e88159935 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem9.C @@ -0,0 +1,9 @@ +// PR c++/15329 + +struct S {}; + +template <typename> struct X { + S s; + void foo (void (S::*p)()) + { (s.*p)(); } +}; |