diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6fec22f833d..cb78daa5d55 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-01-15 Douglas Gregor + + PR c++/34399 + * friend.c (do_friend): Don't query TYPE_BEING_DEFINED unless we + know we have a class type. + 2008-01-15 Douglas Gregor PR c++/34751 diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c index 95f98c45397..094501b109a 100644 --- a/gcc/cp/friend.c +++ b/gcc/cp/friend.c @@ -468,7 +468,7 @@ do_friend (tree ctype, tree declarator, tree decl, the process of being defined. */ if (class_template_depth || COMPLETE_TYPE_P (ctype) - || TYPE_BEING_DEFINED (ctype)) + || (CLASS_TYPE_P (ctype) && TYPE_BEING_DEFINED (ctype))) { if (DECL_TEMPLATE_INFO (decl)) /* DECL is a template specialization. No need to diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c6184f91da7..c9d0e6a6923 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2008-01-15 Douglas Gregor + + PR c++/34399 + * g++.dg/cpp0x/vt-34399.C: New. + * g++.dg/template/friend50.C: New. + 2008-01-15 Douglas Gregor PR c++/34751 diff --git a/gcc/testsuite/g++.dg/cpp0x/vt-34399.C b/gcc/testsuite/g++.dg/cpp0x/vt-34399.C new file mode 100644 index 00000000000..542fae586ca --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34399.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++0x" } +template struct A +{ + void foo(); +}; + +struct B +{ + template friend void A::A::foo(); // { dg-error "declared as friend" } +}; diff --git a/gcc/testsuite/g++.dg/template/friend50.C b/gcc/testsuite/g++.dg/template/friend50.C new file mode 100644 index 00000000000..93c429ab161 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend50.C @@ -0,0 +1,9 @@ +// PR c++/34399 +template struct X +{ + void foo(); +}; + +struct Y { + template friend void X::X::foo(); // { dg-error "declared as friend" } +};