diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-06-08 01:30:54 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-06-08 01:30:54 +0000 |
| commit | 337a5a1c3f450a1bfe69bef54dd46d6fac823e06 (patch) | |
| tree | 53245da1f8ceb2fddec2a17847dcc37224a42722 | |
| parent | 055e9479eb3e041a10a49124c0e4eb0abbb10813 (diff) | |
| download | bcm5719-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.cpp | 2 | ||||
| -rw-r--r-- | clang/test/SemaCXX/cxx0x-defaulted-functions.cpp | 6 |
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&&); +}; |

