]> granicus.if.org Git - clang/commitdiff
Allow friend declarations of defaulted special member functions. Only
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 8 Jun 2012 01:30:54 +0000 (01:30 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 8 Jun 2012 01:30:54 +0000 (01:30 +0000)
definitions of such members are prohibited, not mere declarations.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158186 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/SemaCXX/cxx0x-defaulted-functions.cpp

index fdda9014dc106495e57d74a7287eedab862f6f04..68f74694577be369ac30705bd151bb9d49b24da8 100644 (file)
@@ -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);
index 2ab0f73eae5315f8c8a35c508e5622470e836c63..595d428806f7f7745ca1b472c57e42cd282b7043 100644 (file)
@@ -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&&);
+};