summaryrefslogtreecommitdiffstats
path: root/test/CXX/class.access/class.friend/p9-cxx0x.cpp
diff options
context:
space:
mode:
authordim <dim@FreeBSD.org>2012-08-15 20:02:54 +0000
committerdim <dim@FreeBSD.org>2012-08-15 20:02:54 +0000
commit554bcb69c2d785a011a30e7db87a36a87fe7db10 (patch)
tree9abb1a658a297776086f4e0dfa6ca533de02104e /test/CXX/class.access/class.friend/p9-cxx0x.cpp
parentbb67ca86b31f67faee50bd10c3b036d65751745a (diff)
downloadFreeBSD-src-554bcb69c2d785a011a30e7db87a36a87fe7db10.zip
FreeBSD-src-554bcb69c2d785a011a30e7db87a36a87fe7db10.tar.gz
Vendor import of clang trunk r161861:
http://llvm.org/svn/llvm-project/cfe/trunk@161861
Diffstat (limited to 'test/CXX/class.access/class.friend/p9-cxx0x.cpp')
-rw-r--r--test/CXX/class.access/class.friend/p9-cxx0x.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/test/CXX/class.access/class.friend/p9-cxx0x.cpp b/test/CXX/class.access/class.friend/p9-cxx0x.cpp
new file mode 100644
index 0000000..f748a2b
--- /dev/null
+++ b/test/CXX/class.access/class.friend/p9-cxx0x.cpp
@@ -0,0 +1,117 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+// C++98 [class.friend]p7:
+// C++11 [class.friend]p9:
+// A name nominated by a friend declaration shall be accessible in
+// the scope of the class containing the friend declaration.
+
+// PR12328
+// Simple, non-templated case.
+namespace test0 {
+ class X {
+ void f(); // expected-note {{implicitly declared private here}}
+ };
+
+ class Y {
+ friend void X::f(); // expected-error {{friend function 'f' is a private member of 'test0::X'}}
+ };
+}
+
+// Templated but non-dependent.
+namespace test1 {
+ class X {
+ void f(); // expected-note {{implicitly declared private here}}
+ };
+
+ template <class T> class Y {
+ friend void X::f(); // expected-error {{friend function 'f' is a private member of 'test1::X'}}
+ };
+}
+
+// Dependent but instantiated at the right type.
+namespace test2 {
+ template <class T> class Y;
+
+ class X {
+ void f();
+ friend class Y<int>;
+ };
+
+ template <class T> class Y {
+ friend void X::f();
+ };
+
+ template class Y<int>;
+}
+
+// Dependent and instantiated at the wrong type.
+namespace test3 {
+ template <class T> class Y;
+
+ class X {
+ void f(); // expected-note {{implicitly declared private here}}
+ friend class Y<int>;
+ };
+
+ template <class T> class Y {
+ friend void X::f(); // expected-error {{friend function 'f' is a private member of 'test3::X'}}
+ };
+
+ template class Y<float>; // expected-note {{in instantiation}}
+}
+
+// Dependent because dependently-scoped.
+namespace test4 {
+ template <class T> class X {
+ void f();
+ };
+
+ template <class T> class Y {
+ friend void X<T>::f();
+ };
+}
+
+// Dependently-scoped, no friends.
+namespace test5 {
+ template <class T> class X {
+ void f(); // expected-note {{implicitly declared private here}}
+ };
+
+ template <class T> class Y {
+ friend void X<T>::f(); // expected-error {{friend function 'f' is a private member of 'test5::X<int>'}}
+ };
+
+ template class Y<int>; // expected-note {{in instantiation}}
+}
+
+// Dependently-scoped, wrong friend.
+namespace test6 {
+ template <class T> class Y;
+
+ template <class T> class X {
+ void f(); // expected-note {{implicitly declared private here}}
+ friend class Y<float>;
+ };
+
+ template <class T> class Y {
+ friend void X<T>::f(); // expected-error {{friend function 'f' is a private member of 'test6::X<int>'}}
+ };
+
+ template class Y<int>; // expected-note {{in instantiation}}
+}
+
+// Dependently-scoped, right friend.
+namespace test7 {
+ template <class T> class Y;
+
+ template <class T> class X {
+ void f();
+ friend class Y<int>;
+ };
+
+ template <class T> class Y {
+ friend void X<T>::f();
+ };
+
+ template class Y<int>;
+}
OpenPOWER on IntegriCloud