summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2012-06-08 01:30:54 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2012-06-08 01:30:54 +0000
commit337a5a1c3f450a1bfe69bef54dd46d6fac823e06 (patch)
tree53245da1f8ceb2fddec2a17847dcc37224a42722
parent055e9479eb3e041a10a49124c0e4eb0abbb10813 (diff)
downloadbcm5719-llvm-337a5a1c3f450a1bfe69bef54dd46d6fac823e06.tar.gz
bcm5719-llvm-337a5a1c3f450a1bfe69bef54dd46d6fac823e06.zip
Allow friend declarations of defaulted special member functions. Only
definitions of such members are prohibited, not mere declarations. llvm-svn: 158186
-rw-r--r--clang/lib/Sema/SemaDecl.cpp2
-rw-r--r--clang/test/SemaCXX/cxx0x-defaulted-functions.cpp6
2 files changed, 7 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index fdda9014dc1..68f74694577 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -2039,7 +2039,7 @@ bool Sema::MergeFunctionDecl(FunctionDecl *New, Decl *OldD, Scope *S) {
<< New << getSpecialMember(OldMethod);
return true;
}
- } else if (OldMethod->isExplicitlyDefaulted()) {
+ } else if (OldMethod->isExplicitlyDefaulted() && !isFriend) {
Diag(NewMethod->getLocation(),
diag::err_definition_of_explicitly_defaulted_member)
<< getSpecialMember(OldMethod);
diff --git a/clang/test/SemaCXX/cxx0x-defaulted-functions.cpp b/clang/test/SemaCXX/cxx0x-defaulted-functions.cpp
index 2ab0f73eae5..595d428806f 100644
--- a/clang/test/SemaCXX/cxx0x-defaulted-functions.cpp
+++ b/clang/test/SemaCXX/cxx0x-defaulted-functions.cpp
@@ -51,3 +51,9 @@ template<typename T> struct S : T {
struct lit { constexpr lit() {} };
S<lit> s_lit; // ok
S<bar> s_bar; // ok
+
+struct Friends {
+ friend S<bar>::S();
+ friend S<bar>::S(const S&);
+ friend S<bar>::S(S&&);
+};
OpenPOWER on IntegriCloud