aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorLee Millward <lee.millward@codesourcery.com>2006-09-21 18:33:49 +0000
committerLee Millward <lmillward@gcc.gnu.org>2006-09-21 18:33:49 +0000
commit32273f9fa66e66aa0e5316b68ec56c6290c22b65 (patch)
tree01824585fe7dd4573fbcd63220aa1f7eb2c8f775 /gcc
parentd2a8ac2cf23c32f56a8aa2a820859aa91b810f31 (diff)
downloadgcc-32273f9fa66e66aa0e5316b68ec56c6290c22b65.zip
gcc-32273f9fa66e66aa0e5316b68ec56c6290c22b65.tar.gz
gcc-32273f9fa66e66aa0e5316b68ec56c6290c22b65.tar.bz2
re PR c++/28303 (ICE on invalid typedef)
PR c++/28303 * decl.c (grokdeclarator): Return error_mark_node on declaration with two or more data types. * g++.dg/template/typedef6.C: New test. * g++.dg/init/error1.C: Adjust error markers. * g++.dg/parse/crash9.C: Likewise. * g++.dg/template/crash55.C: Likewise. From-SVN: r117118
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog4
-rw-r--r--gcc/cp/decl.c6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/init/error1.C2
-rw-r--r--gcc/testsuite/g++.dg/template/crash55.C2
-rw-r--r--gcc/testsuite/g++.dg/template/typedef6.C8
6 files changed, 25 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fce58ed..f6b83bd 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -3,6 +3,10 @@
PR c++/28861
* decl.c (shadow_tag): Return error_mark_node
if maybe_process_partial_specialization failed.
+
+ PR c++/28303
+ * decl.c (grokdeclarator): Return error_mark_node on
+ declaration with two or more data types.
2006-09-20 Danny Smith <dannysmith@users.sourceforge.net>
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 1d83aa3..7b932c0 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -7117,7 +7117,11 @@ grokdeclarator (const cp_declarator *declarator,
/* If there were multiple types specified in the decl-specifier-seq,
issue an error message. */
if (declspecs->multiple_types_p)
- error ("two or more data types in declaration of %qs", name);
+ {
+ error ("two or more data types in declaration of %qs", name);
+ return error_mark_node;
+ }
+
/* Extract the basic type from the decl-specifier-seq. */
type = declspecs->type;
if (type == error_mark_node)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f1be2ad..49ea825 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -3,6 +3,12 @@
PR c++/28861
* g++.dg/template/spec32.C: New test.
* g++.dg/parse/crash9.C: Adjust error markers.
+
+ PR c++/28303
+ * g++.dg/template/typedef6.C: New test.
+ * g++.dg/init/error1.C: Adjust error markers.
+ * g++.dg/parse/crash9.C: Likewise.
+ * g++.dg/template/crash55.C: Likewise.
2006-09-21 Janis Johnson <janis187@us.ibm.com>
diff --git a/gcc/testsuite/g++.dg/init/error1.C b/gcc/testsuite/g++.dg/init/error1.C
index e930fc7..dd12e4c 100644
--- a/gcc/testsuite/g++.dg/init/error1.C
+++ b/gcc/testsuite/g++.dg/init/error1.C
@@ -1,7 +1,7 @@
// PR c++/12696
struct A {
- static float b[10]; // { dg-error "" }
+ static float b[10];
}
float A::b[] = {1,2,3}; // { dg-error "" }
diff --git a/gcc/testsuite/g++.dg/template/crash55.C b/gcc/testsuite/g++.dg/template/crash55.C
index 0e3fe4c..377603d 100644
--- a/gcc/testsuite/g++.dg/template/crash55.C
+++ b/gcc/testsuite/g++.dg/template/crash55.C
@@ -1,6 +1,6 @@
//PR c++/27668
template<typename class T, T = T()> // { dg-error "nested-name-specifier|two or more|valid type" }
-struct A {}; // { dg-error "definition"
+struct A {}; // { dg-error "definition|template" }
template<int> void foo(A<int>); // { dg-error "mismatch|constant|template argument" }
diff --git a/gcc/testsuite/g++.dg/template/typedef6.C b/gcc/testsuite/g++.dg/template/typedef6.C
new file mode 100644
index 0000000..cd2db63
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/typedef6.C
@@ -0,0 +1,8 @@
+//PR c++/28303
+
+template<typename T> struct A
+{
+ typedef struct typename T::X X; // { dg-error "expected identifier|two or more" }
+};
+
+template<typename T> A<T>::X::X() {} // { dg-error "not a type|forbids declaration" }