]> granicus.if.org Git - clang/commitdiff
Improve diagnostic wording for when an implicitly-deleted special member
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 28 Dec 2012 12:23:24 +0000 (12:23 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 28 Dec 2012 12:23:24 +0000 (12:23 +0000)
function is selected by overload resolution.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
lib/Sema/SemaOverload.cpp
test/CXX/expr/expr.prim/expr.prim.lambda/p19.cpp
test/CXX/special/class.copy/implicit-move.cpp
test/CXX/special/class.copy/p23-cxx11.cpp

index 8631f9f152f3a1545c64442635d40e08e24d8924..934bb30cfad0abf98487513cdc0e2cb14763a132 100644 (file)
@@ -2512,9 +2512,10 @@ def err_ovl_no_viable_oper : Error<"no viable overloaded '%0'">;
 def err_ovl_deleted_oper : Error<
   "overload resolution selected %select{unavailable|deleted}0 operator '%1'%2">;
 def err_ovl_deleted_special_oper : Error<
-  "overload resolution selected implicitly-deleted %select{default constructor|"
-  "copy constructor|move constructor|copy assignment operator|move assignment "
-  "operator|destructor|'%1'}0%2">;
+  "object of type %0 cannot be %select{constructed|copied|moved|assigned|"
+  "assigned|destroyed}1 because its %select{default constructor|"
+  "copy constructor|move constructor|copy assignment operator|"
+  "move assignment operator|destructor}1 is implicitly deleted">;
 def err_ovl_no_viable_subscript :
     Error<"no viable overloaded operator[] for type %0">;
 def err_ovl_no_oper :
index 191a26d105eab913c5ca29454bc40e7a804a949f..e573a15d6a04702cf96478cee9cbd94a064910b7 100644 (file)
@@ -287,12 +287,6 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, SourceLocation Loc,
 /// diagnostic complaining about the given function being deleted or
 /// unavailable.
 std::string Sema::getDeletedOrUnavailableSuffix(const FunctionDecl *FD) {
-  // FIXME: C++0x implicitly-deleted special member functions could be
-  // detected here so that we could improve diagnostics to say, e.g.,
-  // "base class 'A' had a deleted copy constructor".
-  if (FD->isDeleted())
-    return std::string();
-
   std::string Message;
   if (FD->getAvailability(&Message))
     return ": " + Message;
index e5af2b16d70db51744a4c7ab4439832f23070fe1..7ae6d9d5af7d2ba0ed83ea28543fe46c6ce1be75 100644 (file)
@@ -10386,16 +10386,13 @@ Sema::CreateOverloadedBinOp(SourceLocation OpLoc,
       if (isImplicitlyDeleted(Best->Function)) {
         CXXMethodDecl *Method = cast<CXXMethodDecl>(Best->Function);
         Diag(OpLoc, diag::err_ovl_deleted_special_oper)
-          << getSpecialMember(Method)
-          << BinaryOperator::getOpcodeStr(Opc)
-          << getDeletedOrUnavailableSuffix(Best->Function);
+          << Context.getRecordType(Method->getParent())
+          << getSpecialMember(Method);
 
-        if (getSpecialMember(Method) != CXXInvalid) {
-          // The user probably meant to call this special member. Just
-          // explain why it's deleted.
-          NoteDeletedFunction(Method);
-          return ExprError();
-        }
+        // The user probably meant to call this special member. Just
+        // explain why it's deleted.
+        NoteDeletedFunction(Method);
+        return ExprError();
       } else {
         Diag(OpLoc, diag::err_ovl_deleted_oper)
           << Best->Function->isDeleted()
index 6fe3b25259fd7a646759a54c195623641bfb050c..8a6e79273d55f05e1af663d8206f3b77a8643b68 100644 (file)
@@ -13,7 +13,7 @@ void test_special_member_functions(MoveOnly mo, int i) {
   decltype(lambda1) lambda2; // expected-error{{call to implicitly-deleted default constructor of 'decltype(lambda1)' (aka '<lambda}}
 
   // Copy assignment operator
-  lambda1 = lambda1; // expected-error{{overload resolution selected implicitly-deleted copy assignment operator}}
+  lambda1 = lambda1; // expected-error{{copy assignment operator is implicitly deleted}}
 
   // Move assignment operator
   lambda1 = move(lambda1);
index 597e327a414d81760e129b14d5f05df105683255..33374129f71852ef6bb98eb0ae5ccd86d56a70d9 100644 (file)
@@ -54,7 +54,7 @@ void test_basic_exclusion() {
 
   static_assert(noexcept(HasMoveConstructor((HasMoveConstructor()))), "");
   HasMoveConstructor hmc;
-  hmc = HasMoveConstructor(); // expected-error {{selected implicitly-deleted copy assignment}}
+  hmc = HasMoveConstructor(); // expected-error {{object of type 'HasMoveConstructor' cannot be assigned because its copy assignment operator is implicitly deleted}}
 
   (HasMoveAssignment(HasMoveAssignment())); // expected-error {{uses deleted function}}
   HasMoveAssignment hma;
index 7c04a8201804cd809755b8c45b957e217f5330f6..90945c5803a1945471f4da738cdc0bd81df23974 100644 (file)
@@ -143,6 +143,6 @@ namespace PR13381 {
   };
   void g() {
     T t;
-    t = T(); // expected-error{{implicitly-deleted copy assignment}}
+    t = T(); // expected-error{{object of type 'PR13381::T' cannot be assigned because its copy assignment operator is implicitly deleted}}
   }
 }