summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/template/memfriend17.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/template/memfriend17.C')
-rw-r--r--gcc/testsuite/g++.dg/template/memfriend17.C46
1 files changed, 46 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/template/memfriend17.C b/gcc/testsuite/g++.dg/template/memfriend17.C
new file mode 100644
index 000000000..5e163fa47
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/memfriend17.C
@@ -0,0 +1,46 @@
+// { dg-do compile }
+
+// Origin: Giovanni Bajo <giovannibajo@libero.it>
+
+// PR c++/13495: Nested class as template friend.
+
+template<typename T>
+class A{
+public:
+ class B
+ {
+ void func1(void);
+ void func2(void);
+ };
+};
+
+template<typename Q>
+class F1
+{
+ friend class A<Q>::B;
+ enum { foo = 0 }; // { dg-error "private" }
+};
+
+template<typename Q>
+class F2
+{
+ template<typename T>
+ friend class A<T>::B;
+ enum { foo = 0 };
+};
+
+template <typename T>
+void A<T>::B::func1(void)
+{
+ (void)F1<T>::foo;
+ (void)F2<T>::foo;
+}
+
+template <typename T>
+void A<T>::B::func2(void)
+{
+ (void)F1<T*>::foo; // { dg-error "context" }
+ (void)F2<T*>::foo;
+}
+
+template class A<int>; // { dg-message "instantiated" }