From ae54ec16cdaf815a4e416e8193dd9e645b73fdab Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Thu, 17 Feb 2005 19:25:05 +0000 Subject: [PATCH] re PR c++/20028 (class and then template class gives an ICE) gcc/cp/ChangeLog: PR c++/20028 * class.c (finish_struct): Initialize TYPE_SIZE_UNIT of a template along with TYPE_SIZE. gcc/testsuite/ChangeLog: PR c++/20028 * g++.dg/template/crash34.C: New. From-SVN: r95182 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/class.c | 1 + gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/template/crash34.C | 12 ++++++++++++ 4 files changed, 20 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/crash34.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f1406be7438..cdbbfa51d80 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2005-02-17 Alexandre Oliva + PR c++/20028 + * class.c (finish_struct): Initialize TYPE_SIZE_UNIT of a + template along with TYPE_SIZE. + PR c++/20022 * semantics.c (perform_deferred_access_checks): Use get_deferred_access_checks to get the top of the stack. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index ae73f522121..77e9b80f4f9 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -5111,6 +5111,7 @@ finish_struct (tree t, tree attributes) finish_struct_methods (t); TYPE_SIZE (t) = bitsize_zero_node; + TYPE_SIZE_UNIT (t) = size_zero_node; /* We need to emit an error message if this type was used as a parameter and it is an abstract type, even if it is a template. We construct diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4d58a108233..d03c81fa06f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2005-02-17 Alexandre Oliva + PR c++/20028 + * g++.dg/template/crash34.C: New. + PR c++/20022 * g++.dg/other/access3.C: New. diff --git a/gcc/testsuite/g++.dg/template/crash34.C b/gcc/testsuite/g++.dg/template/crash34.C new file mode 100644 index 00000000000..9cca62f0539 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash34.C @@ -0,0 +1,12 @@ +// { dg-do compile } + +// PR c++/20028 + +// We used to crash when referencing TYPE_SIZE_UNIT of the messed-up +// type used for x, because it was not initialized. + +class Foo; + +template class Foo { }; // { dg-error "not a template type" } + +Foo x; // { dg-error "not a template" } -- 2.30.2