[clang] 31db0f0 - [Clang] Suppress deprecated field warnings in implicit functions definitions (#147400)

via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 23 23:48:30 PDT 2025


Author: Shashi Shankar
Date: 2025-07-24T08:48:27+02:00
New Revision: 31db0f0a7ae43981fdfadc693662c239f921a05b

URL: https://github.com/llvm/llvm-project/commit/31db0f0a7ae43981fdfadc693662c239f921a05b
DIFF: https://github.com/llvm/llvm-project/commit/31db0f0a7ae43981fdfadc693662c239f921a05b.diff

LOG: [Clang] Suppress deprecated field warnings in implicit functions definitions (#147400)

Do not warn on deprecated member used in an implicit definition (such as a defaulted special member function).

Co-authored-by: Corentin Jabot <corentinjabot at gmail.com>

Fixes #147293

Added: 
    clang/test/Sema/implicit-special-member-deprecated.cpp

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/lib/Sema/SemaAvailability.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index dd6b44dd0c657..e685233e2400c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -988,6 +988,7 @@ Bug Fixes to C++ Support
   non-empty initializer list. (#GH147949)
 - Fixed constant evaluation of equality comparisons of constexpr-unknown references. (#GH147663)
 - Diagnose binding a reference to ``*nullptr`` during constant evaluation. (#GH48665)
+- Suppress -Wdeprecated-declarations in implicitly generated functions. (#GH147293)
 
 Bug Fixes to AST Handling
 ^^^^^^^^^^^^^^^^^^^^^^^^^

diff  --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp
index 8c6a17301fba6..68a698fea1815 100644
--- a/clang/lib/Sema/SemaAvailability.cpp
+++ b/clang/lib/Sema/SemaAvailability.cpp
@@ -547,6 +547,12 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K,
     return;
   }
   case AR_Deprecated:
+    // Suppress -Wdeprecated-declarations in implicit
+    // functions.
+    if (const auto *FD = dyn_cast_or_null<FunctionDecl>(S.getCurFunctionDecl());
+        FD && FD->isImplicit())
+      return;
+
     if (ObjCPropertyAccess)
       diag = diag::warn_property_method_deprecated;
     else if (S.currentEvaluationContext().IsCaseExpr)

diff  --git a/clang/test/Sema/implicit-special-member-deprecated.cpp b/clang/test/Sema/implicit-special-member-deprecated.cpp
new file mode 100644
index 0000000000000..8e23404552f53
--- /dev/null
+++ b/clang/test/Sema/implicit-special-member-deprecated.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s
+
+struct A {
+  [[deprecated("use something else")]] int x = 42; // expected-note {{marked deprecated here}}
+};
+
+A makeDefaultA() { return {}; }    // ctor is implicit → no warn
+A copyA(const A &a) { return a; }  // copy-ctor implicit → no warn
+
+void assignA() {
+  A a, b;
+  a = b;                           // copy-assign implicit → no warn
+}
+
+void useA() {
+  A a;
+  (void)a.x;                       // expected-warning {{is deprecated}}
+}
+
+// Explicitly-defaulted ctor – now silent
+struct B {
+  [[deprecated]] int y;
+  B() = default;                   // no warning under new policy
+};


        


More information about the cfe-commits mailing list