diff options
author | Volker Reichelt <reichelt@igpm.rwth-aachen.de> | 2006-07-25 00:57:10 +0000 |
---|---|---|
committer | Volker Reichelt <reichelt@gcc.gnu.org> | 2006-07-25 00:57:10 +0000 |
commit | 709f9dcf15b2efc1962f941bdc763d8f9bd57128 (patch) | |
tree | 3b7cde3085cbafc4836b2bf05e3b74de24dee8d2 /gcc | |
parent | 04afa2cbfc94977432c8e0199783744acf935dbc (diff) | |
download | gcc-709f9dcf15b2efc1962f941bdc763d8f9bd57128.zip gcc-709f9dcf15b2efc1962f941bdc763d8f9bd57128.tar.gz gcc-709f9dcf15b2efc1962f941bdc763d8f9bd57128.tar.bz2 |
re PR c++/27572 (ICE on typedef in parameter declaration)
PR c++/27572
* decl.c (grokdeclarator): Return error_mark_node after invalid
typedef.
* g++.dg/other/typedef1.C: New test.
* g++.dg/template/typedef4.C: New test.
* g++.dg/template/typedef5.C: New test.
From-SVN: r115729
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/decl.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/other/typedef1.C | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/typedef4.C | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/typedef5.C | 7 |
6 files changed, 40 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index d0bbac5..44f6c23 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-07-24 Volker Reichelt <reichelt@igpm.rwth-aachen.de> + + PR c++/27572 + * decl.c (grokdeclarator): Return error_mark_node after invalid + typedef. + 2006-07-23 Daniel Jacobowitz <dan@codesourcery.com> PR c++/28460 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index ad35161..20ad2e9 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -7351,7 +7351,10 @@ grokdeclarator (const cp_declarator *declarator, if (decl_context == PARM) { if (declspecs->specs[(int)ds_typedef]) - error ("typedef declaration invalid in parameter declaration"); + { + error ("typedef declaration invalid in parameter declaration"); + return error_mark_node; + } else if (storage_class == sc_static || storage_class == sc_extern || thread_p) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 815c793..6ca06c6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2006-07-24 Volker Reichelt <reichelt@igpm.rwth-aachen.de> + + PR c++/27572 + * g++.dg/other/typedef1.C: New test. + * g++.dg/template/typedef4.C: New test. + * g++.dg/template/typedef5.C: New test. + 2006-07-24 Erik Edelmann <eedelman@gcc.gnu.org> PR fortran/28416 diff --git a/gcc/testsuite/g++.dg/other/typedef1.C b/gcc/testsuite/g++.dg/other/typedef1.C new file mode 100644 index 0000000..55d62bb --- /dev/null +++ b/gcc/testsuite/g++.dg/other/typedef1.C @@ -0,0 +1,7 @@ +// PR c++/27572 +// { dg-do compile } + +void f1(typedef) {} // { dg-error "no type|typedef declaration" } +void f2(typedef x) {} // { dg-error "no type|typedef declaration" } +void f3(typedef x[]) {} // { dg-error "no type|typedef declaration" } +void f4(typedef int x) {} // { dg-error "typedef declaration" } diff --git a/gcc/testsuite/g++.dg/template/typedef4.C b/gcc/testsuite/g++.dg/template/typedef4.C new file mode 100644 index 0000000..8337110 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef4.C @@ -0,0 +1,9 @@ +// PR c++/27572 +// { dg-do compile } + +template<typedef> void foo(); // { dg-error "no type|typedef declaration" } + +void bar() +{ + foo<int>(); // { dg-error "matching" } +} diff --git a/gcc/testsuite/g++.dg/template/typedef5.C b/gcc/testsuite/g++.dg/template/typedef5.C new file mode 100644 index 0000000..843d1a9 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/typedef5.C @@ -0,0 +1,7 @@ +// PR c++/27572 +// { dg-do compile } + +template<typedef,int> struct A1; // { dg-error "no type|typedef declaration" } +template<typedef x,int> struct A2; // { dg-error "no type|typedef declaration" } +template<typedef x[],int> struct A3; // { dg-error "no type|typedef declaration" } +template<typedef int x, int> struct A4; // { dg-error "typedef declaration" } |