Commit e59f7322 by Kriang Lerdsuwanakij Committed by Kriang Lerdsuwanakij

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
parent a1a28bb5
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> 2004-08-24 Nathan Sidwell <nathan@codesourcery.com>
PR c++/17149 PR c++/17149
......
...@@ -835,10 +835,26 @@ friend_accessible_p (tree scope, tree decl, tree binfo) ...@@ -835,10 +835,26 @@ friend_accessible_p (tree scope, tree decl, tree binfo)
/* Or an instantiation of something which is a friend. */ /* Or an instantiation of something which is a friend. */
if (DECL_TEMPLATE_INFO (scope)) 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)) 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; return 0;
} }
......
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> 2004-08-24 Nathan Sidwell <nathan@codesourcery.com>
PR c++/17149 PR c++/17149
......
// { 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 *>;
// { 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*>;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment