summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-10-18 18:33:57 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-10-18 18:33:57 +0000
commitc30493db3c7c3ef32dbd3824d6864007a18fbd6c (patch)
tree9acf5c3323e8107fadb21330f2fd2fa822f15a27
parent9e320909f5cac99268df2348fda135d9cf636551 (diff)
downloadbcm5719-llvm-c30493db3c7c3ef32dbd3824d6864007a18fbd6c.tar.gz
bcm5719-llvm-c30493db3c7c3ef32dbd3824d6864007a18fbd6c.zip
In C++11, a class's members are allowed to be nominated as friends.
llvm-svn: 142393
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp2
-rw-r--r--clang/test/CXX/class/class.friend/p1-cxx11.cpp12
2 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index a39584a107a..38bce96360c 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -10045,7 +10045,7 @@ Decl *Sema::ActOnFriendFunctionDecl(Scope *S, Declarator &D,
// C++ [class.friend]p1: A friend of a class is a function or
// class that is not a member of the class . . .
- if (DC->Equals(CurContext))
+ if (DC->Equals(CurContext) && !getLangOptions().CPlusPlus0x)
Diag(DS.getFriendSpecLoc(), diag::err_friend_is_member);
if (D.isFunctionDefinition()) {
diff --git a/clang/test/CXX/class/class.friend/p1-cxx11.cpp b/clang/test/CXX/class/class.friend/p1-cxx11.cpp
new file mode 100644
index 00000000000..235f295d127
--- /dev/null
+++ b/clang/test/CXX/class/class.friend/p1-cxx11.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
+
+class A {
+ class AInner {
+ };
+
+ void a_member();
+ friend void A::a_member(); // ok in c++11, ill-formed in c++98
+ friend void a_member(); // ok in both, refers to non-member
+ friend class A::AInner; // ok in c++11, extension in c++98
+ friend class AInner; // ok in both, refers to non-member
+};
OpenPOWER on IntegriCloud