aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2004-08-24 14:13:50 +0000
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>2004-08-24 14:13:50 +0000
commite59f7322effb7542b4311ec731ce45565ef600f6 (patch)
tree6ae9210737b086cc8b633394372bbf40e57e713a
parenta1a28bb5826211ea2253231186417fb3cb6de6dd (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/search.c20
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/template/crash21.C40
-rw-r--r--gcc/testsuite/g++.dg/template/crash22.C26
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*>;