From: Paolo Carlini Date: Tue, 27 Sep 2011 21:52:19 +0000 (+0000) Subject: re PR c++/31489 (error says struct when it should say class) X-Git-Tag: releases/gcc-4.7.0~3500 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2427db200d7e56fda1cf034ca0d1cb2999b5b970;p=thirdparty%2Fgcc.git re PR c++/31489 (error says struct when it should say class) /cp 2011-09-27 Paolo Carlini PR c++/31489 * parser.c (cp_parser_elaborated_type_specifier): For RECORD_TYPE, set CLASSTYPE_DECLARED_CLASS. /testsuite 2011-09-27 Paolo Carlini PR c++/31489 * g++.dg/parse/error40.C: New. * g++.dg/warn/incomplete1.C: Adjust. From-SVN: r179293 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 24068c8168b8..596d4a97f707 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-09-27 Paolo Carlini + + PR c++/31489 + * parser.c (cp_parser_elaborated_type_specifier): For RECORD_TYPE, + set CLASSTYPE_DECLARED_CLASS. + 2011-09-27 Jakub Jelinek * decl.c (duplicate_decls): If compatible stpcpy prototype diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 9600aa954384..83d7b71c8c4c 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -13423,7 +13423,13 @@ cp_parser_elaborated_type_specifier (cp_parser* parser, } if (tag_type != enum_type) - cp_parser_check_class_key (tag_type, type); + { + /* Indicate whether this class was declared as a `class' or as a + `struct'. */ + if (TREE_CODE (type) == RECORD_TYPE) + CLASSTYPE_DECLARED_CLASS (type) = (tag_type == class_type); + cp_parser_check_class_key (tag_type, type); + } /* A "<" cannot follow an elaborated type specifier. If that happens, the user was probably trying to form a template-id. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1f47b452c1b4..01eed5cca7ef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2011-09-27 Paolo Carlini + + PR c++/31489 + * g++.dg/parse/error40.C: New. + * g++.dg/warn/incomplete1.C: Adjust. + 2011-09-27 Jan Hubicka PR middle-end/49463 diff --git a/gcc/testsuite/g++.dg/parse/error40.C b/gcc/testsuite/g++.dg/parse/error40.C new file mode 100644 index 000000000000..9ab7552ae839 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error40.C @@ -0,0 +1,10 @@ +// PR c++/31489 + +class foo; // { dg-error "'class foo'" } +struct bar; // { dg-error "'struct bar'" } + +int main() +{ + foo* f = new foo; // { dg-error "'class foo'" } + bar* b = new bar; // { dg-error "'struct bar'" } +} diff --git a/gcc/testsuite/g++.dg/warn/incomplete1.C b/gcc/testsuite/g++.dg/warn/incomplete1.C index 26cfe2eae4bd..9dc645d82f9d 100644 --- a/gcc/testsuite/g++.dg/warn/incomplete1.C +++ b/gcc/testsuite/g++.dg/warn/incomplete1.C @@ -9,7 +9,7 @@ // (But the deletion does not constitute an ill-formed program. So the // program should nevertheless compile, but it should give a warning.) -class A; // { dg-warning "forward declaration of 'struct A'" "" } +class A; // { dg-warning "forward declaration of 'class A'" "" } A *a; // { dg-warning "'a' has incomplete type" "" }