diff options
author | Lee Millward <lee.millward@codesourcery.com> | 2006-09-21 18:33:49 +0000 |
---|---|---|
committer | Lee Millward <lmillward@gcc.gnu.org> | 2006-09-21 18:33:49 +0000 |
commit | 32273f9fa66e66aa0e5316b68ec56c6290c22b65 (patch) | |
tree | 01824585fe7dd4573fbcd63220aa1f7eb2c8f775 /gcc | |
parent | d2a8ac2cf23c32f56a8aa2a820859aa91b810f31 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/decl.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/init/error1.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash55.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/typedef6.C | 8 |
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" } |