From dbc21af5a938e0fe7ed40a3bba24555658f83eb9 Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Mon, 21 Jan 2008 01:49:29 +0000 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/name-lookup.c | 7 +++++-- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/g++.dg/template/crash75.C | 8 ++++++++ gcc/testsuite/g++.dg/template/crash76.C | 13 +++++++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/template/crash75.C create mode 100644 gcc/testsuite/g++.dg/template/crash76.C 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; -- 2.47.2