aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2013-05-20 17:13:47 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2013-05-20 17:13:47 +0000
commit9bbc95654de572e68a6afe4dd892721d34304ed6 (patch)
tree8374e95e085b76ea9278b61fa12de7e51d6bc314 /gcc
parent32bfcf80647d3fd3a658c7032a5aebe767341893 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/parser.c5
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/parse/error3.C1
-rw-r--r--gcc/testsuite/g++.dg/parse/error36.C1
-rw-r--r--gcc/testsuite/g++.dg/parse/error52.C11
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" }