From 623c65f1732d0ee0fc163921272d152b50211710 Mon Sep 17 00:00:00 2001 From: Lee Millward Date: Mon, 21 Aug 2006 17:34:44 +0000 Subject: [PATCH] re PR c++/28505 (ICE with invalid constructors) PR c++/28505 * decl.c (grokdeclarator): Return early after issuing diagnostic about an incomplete type. * g++.dg/parse/ctor7.C: New test. * g++.dg/parse/ctor8.C: Likewise. From-SVN: r116302 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/decl.c | 3 +-- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/g++.dg/parse/ctor7.C | 15 +++++++++++++++ gcc/testsuite/g++.dg/parse/ctor8.C | 9 +++++++++ 5 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/parse/ctor7.C create mode 100644 gcc/testsuite/g++.dg/parse/ctor8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 366aa69f858..10d0538f80b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -3,6 +3,10 @@ PR c++/26269 * decl.c (duplicate_decls): Return early if either newdecl or olddecl is error_mark_node. + + PR c++/28505 + * decl.c (grokdeclarator): Return early after + issuing diagnostic about an incomplete type. 2006-08-20 Mark Mitchell diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index b67aea76a78..b5b417fc668 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -8354,8 +8354,7 @@ grokdeclarator (const cp_declarator *declarator, error (" in instantiation of template %qT", current_class_type); - type = error_mark_node; - decl = NULL_TREE; + return error_mark_node; } else { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d61c5ae9fd9..a277501ab34 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -2,6 +2,10 @@ PR c++/26269 * g++.dg/other/error14.C: New test. + + PR c++/28505 + * g++.dg/parse/ctor7.C: New test. + * g++.dg/parse/ctor8.C: Likewise. 2006-08-21 Olivier Hainque diff --git a/gcc/testsuite/g++.dg/parse/ctor7.C b/gcc/testsuite/g++.dg/parse/ctor7.C new file mode 100644 index 00000000000..9fa051b7981 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor7.C @@ -0,0 +1,15 @@ +//PR c++/28505 + +struct A +{ + A : (); // { dg-error "primary-expression|incomplete type" } + A : (int); // { dg-error "primary-expression|incomplete type|'int'" } +}; + +struct B +{ + char c; + A a; +}; + +B b = (B){0}; // { dg-error "compound-literals" } diff --git a/gcc/testsuite/g++.dg/parse/ctor8.C b/gcc/testsuite/g++.dg/parse/ctor8.C new file mode 100644 index 00000000000..e43ce4023a4 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/ctor8.C @@ -0,0 +1,9 @@ +//PR c++/28505 + +struct A +{ + A : (); // { dg-error "primary-expression|incomplete type" } + A : (int); // { dg-error "primary-expression|incomplete type|'int'" } +}; + +A a = (A){0}; // { dg-error "too many initializers|compound-literals" }