aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDouglas Gregor <doug.gregor@gmail.com>2008-01-15 20:56:55 +0000
committerDoug Gregor <dgregor@gcc.gnu.org>2008-01-15 20:56:55 +0000
commitac90ae18fb641f365ce349efbbaf8b88a4f96b8e (patch)
tree19c08d70ffa14c0253e456831aa45704e81af591 /gcc
parent44b962f21cf33a2215e596f5d8b78aff9ae94daf (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/friend.c2
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/vt-34399.C10
-rw-r--r--gcc/testsuite/g++.dg/template/friend50.C9
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" }
+};