diff options
author | Douglas Gregor <doug.gregor@gmail.com> | 2008-01-15 20:56:55 +0000 |
---|---|---|
committer | Doug Gregor <dgregor@gcc.gnu.org> | 2008-01-15 20:56:55 +0000 |
commit | ac90ae18fb641f365ce349efbbaf8b88a4f96b8e (patch) | |
tree | 19c08d70ffa14c0253e456831aa45704e81af591 | |
parent | 44b962f21cf33a2215e596f5d8b78aff9ae94daf (diff) | |
download | gcc-ac90ae18fb641f365ce349efbbaf8b88a4f96b8e.zip gcc-ac90ae18fb641f365ce349efbbaf8b88a4f96b8e.tar.gz gcc-ac90ae18fb641f365ce349efbbaf8b88a4f96b8e.tar.bz2 |
re PR c++/34399 (ICE on invalid friend declaration of variadic template)
2008-01-15 Douglas Gregor <doug.gregor@gmail.com>
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 <doug.gregor@gmail.com>
PR c++/34399
* g++.dg/cpp0x/vt-34399.C: New.
* g++.dg/template/friend50.C: New.
From-SVN: r131552
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/friend.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/vt-34399.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/friend50.C | 9 |
5 files changed, 32 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6fec22f..cb78daa 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2008-01-15 Douglas Gregor <doug.gregor@gmail.com> + 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 <doug.gregor@gmail.com> + PR c++/34751 * pt.c (coerce_template_parameter_pack): When substituting into the type of a non-type template parameter pack. use the diff --git a/gcc/cp/friend.c b/gcc/cp/friend.c index 95f98c4..094501b1 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 c6184f9..c9d0e6a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2008-01-15 Douglas Gregor <doug.gregor@gmail.com> + PR c++/34399 + * g++.dg/cpp0x/vt-34399.C: New. + * g++.dg/template/friend50.C: New. + +2008-01-15 Douglas Gregor <doug.gregor@gmail.com> + PR c++/34751 * g++.dg/cpp0x/vt-34751.C: New. 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 0000000..542fae5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/vt-34399.C @@ -0,0 +1,10 @@ +// { dg-options "-std=c++0x" } +template<int...> struct A +{ + void foo(); +}; + +struct B +{ + template<int N> friend void A<N>::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 0000000..93c429a --- /dev/null +++ b/gcc/testsuite/g++.dg/template/friend50.C @@ -0,0 +1,9 @@ +// PR c++/34399 +template<int> struct X +{ + void foo(); +}; + +struct Y { + template<long N> friend void X<N>::X::foo(); // { dg-error "declared as friend" } +}; |