xbolva00 created this revision.
xbolva00 added a reviewer: rsmith.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

Solves https://bugs.llvm.org/show_bug.cgi?id=45634
Be more agressive than GCC with -Wdeprecated-copy. Also provide 
-W(no-)deprecated-copy-user-provided options to on/off this behaviour.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D79714

Files:
  clang/include/clang/Basic/DiagnosticGroups.td
  clang/include/clang/Basic/DiagnosticSemaKinds.td
  clang/lib/Sema/SemaDeclCXX.cpp
  clang/test/SemaCXX/deprecated-copy.cpp
  clang/test/SemaCXX/deprecated.cpp

Index: clang/test/SemaCXX/deprecated.cpp
===================================================================
--- clang/test/SemaCXX/deprecated.cpp
+++ clang/test/SemaCXX/deprecated.cpp
@@ -103,10 +103,10 @@
   void g() { c1 = c2; } // expected-note {{implicit copy assignment operator for 'DeprecatedCopy::Dtor' first required here}}
 
   struct DefaultedDtor {
-    ~DefaultedDtor() = default;
-  };
-  DefaultedDtor d1, d2(d1);
-  void h() { d1 = d2; }
+    ~DefaultedDtor() = default; // expected-warning {{definition of implicit copy constructor for 'DefaultedDtor' is deprecated because it has a user-declared destructor}}
+  };                            // expected-warning@-1 {{definition of implicit copy assignment operator for 'DefaultedDtor' is deprecated because it has a user-declared destructor}}
+  DefaultedDtor d1, d2(d1);     // expected-note {{in implicit copy constructor for 'DeprecatedCopy::DefaultedDtor' first required here}}
+  void h() { d1 = d2; }         // expected-note {{in implicit copy assignment operator for 'DeprecatedCopy::DefaultedDtor' first required here}}
 }
 #endif
 
Index: clang/test/SemaCXX/deprecated-copy.cpp
===================================================================
--- clang/test/SemaCXX/deprecated-copy.cpp
+++ clang/test/SemaCXX/deprecated-copy.cpp
@@ -1,7 +1,12 @@
 // RUN: %clang_cc1 -std=c++11 %s -Wdeprecated-copy -verify
+// RUN: %clang_cc1 -std=c++11 %s -Wno-deprecated-copy-user-provided -DNO_USER_PROVIDED -verify
 // RUN: %clang_cc1 -std=c++11 %s -Wdeprecated-copy-dtor -DDEPRECATED_COPY_DTOR -verify
 // RUN: %clang_cc1 -std=c++11 %s -Wextra -verify
 
+#ifdef NO_USER_PROVIDED
+// expected-no-diagnostics
+#endif
+
 #ifdef DEPRECATED_COPY_DTOR
 struct A {
   int *ptr;
@@ -14,10 +19,30 @@
 }
 #else
 struct B {
-  B &operator=(const B &); // expected-warning {{definition of implicit copy constructor for 'B' is deprecated because it has a user-declared copy assignment operator}}
+  B &operator=(const B &);
+#ifndef NO_USER_PROVIDED
+// expected-warning@-2 {{definition of implicit copy constructor for 'B' is deprecated because it has a user-declared copy assignment operator}}
+#endif
 };
 
 void bar() {
-  B b1, b2(b1); // expected-note {{implicit copy constructor for 'B' first required here}}
+  B b1, b2(b1);
+#ifndef NO_USER_PROVIDED
+// expected-note@-2 {{implicit copy constructor for 'B' first required here}}
+#endif
 }
+
+struct S {
+  int i;
+  S &operator=(const S &) = delete;
+#ifndef NO_USER_PROVIDED
+// expected-warning@-2 {{definition of implicit copy constructor for 'S' is deprecated because it has a user-declared copy assignment operator}}
+#endif
+};
+
+S test(const S &s) { return S(s); }
+#ifndef NO_USER_PROVIDED
+// expected-note@-2  {{in implicit copy constructor for 'S' first required here}}
+#endif
+
 #endif
Index: clang/lib/Sema/SemaDeclCXX.cpp
===================================================================
--- clang/lib/Sema/SemaDeclCXX.cpp
+++ clang/lib/Sema/SemaDeclCXX.cpp
@@ -13850,11 +13850,17 @@
     assert(UserDeclaredOperation);
   }
 
-  if (UserDeclaredOperation && UserDeclaredOperation->isUserProvided()) {
-    S.Diag(UserDeclaredOperation->getLocation(),
-           isa<CXXDestructorDecl>(UserDeclaredOperation)
-               ? diag::warn_deprecated_copy_dtor_operation
-               : diag::warn_deprecated_copy_operation)
+  if (UserDeclaredOperation) {
+    unsigned DiagID;
+    if (UserDeclaredOperation->isUserProvided())
+      DiagID = isa<CXXDestructorDecl>(UserDeclaredOperation)
+                   ? diag::warn_deprecated_copy_dtor_operation_user_provided
+                   : diag::warn_deprecated_copy_operation_user_provided;
+    else
+      DiagID = isa<CXXDestructorDecl>(UserDeclaredOperation)
+                   ? diag::warn_deprecated_copy_dtor_operation
+                   : diag::warn_deprecated_copy_operation;
+    S.Diag(UserDeclaredOperation->getLocation(), DiagID)
         << RD << /*copy assignment*/ !isa<CXXConstructorDecl>(CopyOp);
   }
 }
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -561,6 +561,12 @@
   "definition of implicit copy %select{constructor|assignment operator}1 "
   "for %0 is deprecated because it has a user-declared destructor">,
   InGroup<DeprecatedCopyDtor>, DefaultIgnore;
+def warn_deprecated_copy_operation_user_provided : Warning<
+  warn_deprecated_copy_operation.Text>,
+  InGroup<DeprecatedCopyUserProvided>, DefaultIgnore;
+def warn_deprecated_copy_dtor_operation_user_provided : Warning<
+  warn_deprecated_copy_dtor_operation.Text>,
+  InGroup<DeprecatedCopyDtorUserProvided>, DefaultIgnore;
 def warn_cxx17_compat_exception_spec_in_signature : Warning<
   "mangled name of %0 will change in C++17 due to non-throwing exception "
   "specification in function signature">, InGroup<CXX17CompatMangling>;
Index: clang/include/clang/Basic/DiagnosticGroups.td
===================================================================
--- clang/include/clang/Basic/DiagnosticGroups.td
+++ clang/include/clang/Basic/DiagnosticGroups.td
@@ -152,8 +152,10 @@
 def DeprecatedArrayCompare : DiagGroup<"deprecated-array-compare">;
 def DeprecatedAttributes : DiagGroup<"deprecated-attributes">;
 def DeprecatedCommaSubscript : DiagGroup<"deprecated-comma-subscript">;
-def DeprecatedCopy : DiagGroup<"deprecated-copy">;
-def DeprecatedCopyDtor : DiagGroup<"deprecated-copy-dtor">;
+def DeprecatedCopyUserProvided : DiagGroup<"deprecated-copy-user-provided">;
+def DeprecatedCopyDtorUserProvided : DiagGroup<"deprecated-copy-dtor-user-provided">;
+def DeprecatedCopy : DiagGroup<"deprecated-copy", [DeprecatedCopyUserProvided]>;
+def DeprecatedCopyDtor : DiagGroup<"deprecated-copy-dtor", [DeprecatedCopyDtorUserProvided]>;
 def DeprecatedDeclarations : DiagGroup<"deprecated-declarations">;
 def UnavailableDeclarations : DiagGroup<"unavailable-declarations">;
 def UnguardedAvailabilityNew : DiagGroup<"unguarded-availability-new">;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to