diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2004-08-24 14:13:50 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2004-08-24 14:13:50 +0000 |
commit | e59f7322effb7542b4311ec731ce45565ef600f6 (patch) | |
tree | 6ae9210737b086cc8b633394372bbf40e57e713a | |
parent | a1a28bb5826211ea2253231186417fb3cb6de6dd (diff) | |
download | gcc-e59f7322effb7542b4311ec731ce45565ef600f6.zip gcc-e59f7322effb7542b4311ec731ce45565ef600f6.tar.gz gcc-e59f7322effb7542b4311ec731ce45565ef600f6.tar.bz2 |
re PR c++/16706 (ICE in finish_member_declaration, at cp/semantics.c:2126)
PR c++/16706
* search.c (friend_accessible_p): Increment processing_template_decl
when deal with TEMPLATE_DECL of SCOPE.
* g++.dg/template/crash21.C: New test.
* g++.dg/template/crash22.C: Likewise.
From-SVN: r86482
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/search.c | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash21.C | 40 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/crash22.C | 26 |
5 files changed, 96 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ddeb19e..9ac0c74 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2004-08-24 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/16706 + * search.c (friend_accessible_p): Increment processing_template_decl + when deal with TEMPLATE_DECL of SCOPE. + 2004-08-24 Nathan Sidwell <nathan@codesourcery.com> PR c++/17149 diff --git a/gcc/cp/search.c b/gcc/cp/search.c index df5804b..81226d1 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -835,10 +835,26 @@ friend_accessible_p (tree scope, tree decl, tree binfo) /* Or an instantiation of something which is a friend. */ if (DECL_TEMPLATE_INFO (scope)) - return friend_accessible_p (DECL_TI_TEMPLATE (scope), decl, binfo); + { + int ret; + /* Increment processing_template_decl to make sure that + dependent_type_p works correctly. */ + ++processing_template_decl; + ret = friend_accessible_p (DECL_TI_TEMPLATE (scope), decl, binfo); + --processing_template_decl; + return ret; + } } else if (CLASSTYPE_TEMPLATE_INFO (scope)) - return friend_accessible_p (CLASSTYPE_TI_TEMPLATE (scope), decl, binfo); + { + int ret; + /* Increment processing_template_decl to make sure that + dependent_type_p works correctly. */ + ++processing_template_decl; + ret = friend_accessible_p (CLASSTYPE_TI_TEMPLATE (scope), decl, binfo); + --processing_template_decl; + return ret; + } return 0; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 59138e2..7264db7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2004-08-24 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/16706 + * g++.dg/template/crash21.C: New test. + * g++.dg/template/crash22.C: Likewise. + 2004-08-24 Nathan Sidwell <nathan@codesourcery.com> PR c++/17149 diff --git a/gcc/testsuite/g++.dg/template/crash21.C b/gcc/testsuite/g++.dg/template/crash21.C new file mode 100644 index 0000000..8b67491 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash21.C @@ -0,0 +1,40 @@ +// { dg-do compile } + +// Origin: Debian GCC maintainers <debian-gcc@lists.debian.org> +// Wolfgang Bangerth <bangerth@dealii.org> + +// PR c++/16706: Dependent type calculation during access checking + +template <typename> struct B { + B() throw() {} + struct S { }; + static int i; + typedef unsigned short int dummy; +}; + +template <typename _Tp> +struct allocator: B<_Tp> { + template<typename _Tp1> struct rebind + { typedef allocator<_Tp1> other; }; +}; + +template<typename T, typename> +struct X { + typename allocator<T>::template rebind<int>::other i; + typedef int* dummy; +}; + +template <class T> class A { + typedef typename X<T,allocator<T> >::dummy dummy; + template <class TP> class XWrapper; +}; + + +template <class T> +template <class TP> struct A<T>::XWrapper<TP *> +{ + XWrapper() {} + X<int,allocator<int> > x; +}; + +template class A<int>::XWrapper<int *>; diff --git a/gcc/testsuite/g++.dg/template/crash22.C b/gcc/testsuite/g++.dg/template/crash22.C new file mode 100644 index 0000000..4d0cfaa --- /dev/null +++ b/gcc/testsuite/g++.dg/template/crash22.C @@ -0,0 +1,26 @@ +// { dg-do compile } + +// Origin: Debian GCC maintainers <debian-gcc@lists.debian.org> +// Volker Reichelt <reichelt@gcc.gnu.org> + +// PR c++/16706: Dependent type calculation during access checking + +template<typename> struct A +{ + A(); + template<typename> struct X {}; +}; + +template<typename T> struct B +{ + typename A<T>::template X<int> x; + template<typename> struct C; +}; + +template<typename T> template<typename U> struct B<T>::C<U*> +{ + C() {} + A<int> a; +}; + +template struct B<int>::C<int*>; |