From: Paolo Carlini Date: Mon, 21 Jan 2008 01:49:29 +0000 (+0000) Subject: re PR c++/34776 (ICE with invalid member declaration in template class) X-Git-Tag: releases/gcc-4.3.0~510 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dbc21af5a938e0fe7ed40a3bba24555658f83eb9;p=thirdparty%2Fgcc.git re PR c++/34776 (ICE with invalid member declaration in template class) /cp 2008-01-20 Paolo Carlini PR c++/34776 PR c++/34486 * name-lookup.c (do_class_using_decl): Do not call constructor_name_p on non-IS_AGGR_TYPE type scope. (constructor_name_p): Assert IS_AGGR_TYPE. /testsuite 2008-01-20 Paolo Carlini PR c++/34776 PR c++/34486 * g++.dg/template/crash75.C: New. * g++.dg/template/crash76.C: Likewise. From-SVN: r131686 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 91909a1fb1ff..453ad48a0db9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2008-01-20 Paolo Carlini + + PR c++/34776 + PR c++/34486 + * name-lookup.c (do_class_using_decl): Do not call constructor_name_p + on non-IS_AGGR_TYPE scope. + (constructor_name_p): Assert IS_AGGR_TYPE. + 2008-01-18 Ian Lance Taylor PR c++/33407 diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 98c866f3a19e..c21940c0b519 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -1730,13 +1730,16 @@ constructor_name (tree type) return name; } -/* Returns TRUE if NAME is the name for the constructor for TYPE. */ +/* Returns TRUE if NAME is the name for the constructor for TYPE, + which must be a class type. */ bool constructor_name_p (tree name, tree type) { tree ctor_name; + gcc_assert (IS_AGGR_TYPE (type)); + if (!name) return false; @@ -2824,7 +2827,7 @@ do_class_using_decl (tree scope, tree name) error ("%<%T::%D%> names destructor", scope, name); return NULL_TREE; } - if (constructor_name_p (name, scope)) + if (IS_AGGR_TYPE (scope) && constructor_name_p (name, scope)) { error ("%<%T::%D%> names constructor", scope, name); return NULL_TREE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d0e06564daae..f45329eeb019 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2008-01-20 Paolo Carlini + + PR c++/34776 + PR c++/34486 + * g++.dg/template/crash75.C: New. + * g++.dg/template/crash76.C: Likewise. + 2008-01-20 Kaz Kojima PR rtl-optimization/34808 diff --git a/gcc/testsuite/g++.dg/template/crash75.C b/gcc/testsuite/g++.dg/template/crash75.C new file mode 100644 index 000000000000..462be95b2f7f --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash75.C @@ -0,0 +1,8 @@ +// PR c++/34776 + +template struct A +{ + T::X<0> x; // { dg-error "non-template|T::template|base type" } +}; + +A a; diff --git a/gcc/testsuite/g++.dg/template/crash76.C b/gcc/testsuite/g++.dg/template/crash76.C new file mode 100644 index 000000000000..851cdd8c436d --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash76.C @@ -0,0 +1,13 @@ +// PR c++/34486 + +template struct A +{ + typedef A* X; +}; + +template struct B +{ + using A::X::Y; // { dg-error "not a base type" } +}; + +B b;