diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2013-05-20 17:13:47 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2013-05-20 17:13:47 +0000 |
commit | 9bbc95654de572e68a6afe4dd892721d34304ed6 (patch) | |
tree | 8374e95e085b76ea9278b61fa12de7e51d6bc314 /gcc | |
parent | 32bfcf80647d3fd3a658c7032a5aebe767341893 (diff) | |
download | gcc-9bbc95654de572e68a6afe4dd892721d34304ed6.zip gcc-9bbc95654de572e68a6afe4dd892721d34304ed6.tar.gz gcc-9bbc95654de572e68a6afe4dd892721d34304ed6.tar.bz2 |
re PR c++/12288 (unintelligible error message for constructor declaration with misspelled type)
/cp
2013-05-20 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/12288
* parser.c (cp_parser_parameter_declaration): Check return value
of cp_parser_parse_and_diagnose_invalid_type_name.
/testsuite
2013-05-20 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/12288
* g++.dg/parse/error52.C: New.
* g++.dg/parse/error3.C: Adjust.
* g++.dg/parse/error36.C: Likewise.
From-SVN: r199115
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/parser.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/error3.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/error36.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/error52.C | 11 |
6 files changed, 27 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b08afd9..d1e3bb6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2013-05-20 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/12288 + * parser.c (cp_parser_parameter_declaration): Check return value + of cp_parser_parse_and_diagnose_invalid_type_name. + 2013-05-20 Jason Merrill <jason@redhat.com> PR c++/57319 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 91e6615..c3096d3 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -17844,8 +17844,9 @@ cp_parser_parameter_declaration (cp_parser *parser, &declares_class_or_enum); /* Complain about missing 'typename' or other invalid type names. */ - if (!decl_specifiers.any_type_specifiers_p) - cp_parser_parse_and_diagnose_invalid_type_name (parser); + if (!decl_specifiers.any_type_specifiers_p + && cp_parser_parse_and_diagnose_invalid_type_name (parser)) + decl_specifiers.type = error_mark_node; /* If an error occurred, there's no reason to attempt to parse the rest of the declaration. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 85aac1e..4e8e6e4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2013-05-20 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/12288 + * g++.dg/parse/error52.C: New. + * g++.dg/parse/error3.C: Adjust. + * g++.dg/parse/error36.C: Likewise. + 2013-05-20 Oleg Endo <olegendo@gcc.gnu.org> PR target/56547 diff --git a/gcc/testsuite/g++.dg/parse/error3.C b/gcc/testsuite/g++.dg/parse/error3.C index 5873993..938ab45 100644 --- a/gcc/testsuite/g++.dg/parse/error3.C +++ b/gcc/testsuite/g++.dg/parse/error3.C @@ -5,5 +5,4 @@ static void InstantiateConstraint(const float&, unsigned, void(*AddFunction)(const TYPE&,bool&, char*, char*, unsigned*)); -// { dg-error "64: ISO C\\+\\+ forbids declaration of 'parameter' with no type" "forbids" { target *-*-* } { 5 } } // { dg-error "60: 'TYPE' does not name a type" "does not" { target *-*-* } { 5 } } diff --git a/gcc/testsuite/g++.dg/parse/error36.C b/gcc/testsuite/g++.dg/parse/error36.C index a99ad29..92e27a9 100644 --- a/gcc/testsuite/g++.dg/parse/error36.C +++ b/gcc/testsuite/g++.dg/parse/error36.C @@ -26,7 +26,6 @@ template <class T> struct B // PR c++/40738 template <class T> void g(const A<T>::type &t); // { dg-error "typename" "typename" } -// { dg-error "no type" "no type" { target *-*-* } 28 } // PR c++/18451 template <class T> A<T>::B A<T>::b; // { dg-error "typename" } diff --git a/gcc/testsuite/g++.dg/parse/error52.C b/gcc/testsuite/g++.dg/parse/error52.C new file mode 100644 index 0000000..d1c6e4a --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/error52.C @@ -0,0 +1,11 @@ +// PR c++/12288 + +class X {}; + +struct S { + explicit S (const X::T&) {} // { dg-error "does not name a type" } +}; + +class Y {}; + +typedef Y::T xt; // { dg-error "does not name a type" } |