[clang] Sema: filter out invalid base-specifiers before attaching (PR #147213)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147213 >From 05211dac479bf25aaf6d8ecc3a53871a51f7ffdd Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Sun, 6 Jul 2025 22:25:48 +0200 Subject: [PATCH] Sema: filter out invalid base-specifiers before attaching ActOnBaseSpecifiers now skips nullptr entries returned for invalid bases, avoiding ICE on invalid inheritance. Added regression test in SemaCXX/invalid-inheritance.cpp. Fixes #147186 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaDeclCXX.cpp | 17 - clang/test/SemaCXX/invalid-base-inheritance.cpp | 13 + 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaCXX/invalid-base-inheritance.cpp diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index f0247f865ba40..231610241d8ee 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3031,8 +3031,23 @@ void Sema::ActOnBaseSpecifiers(Decl *ClassDecl, if (!ClassDecl || Bases.empty()) return; + // --- drop any bases already diagnosed invalid --- + SmallVector ValidBases; + ValidBases.reserve(Bases.size()); + for (auto *BS : Bases) + if (BS) + ValidBases.push_back(BS); + if (ValidBases.empty()) + return; + + if (ValidBases.empty()) +return; // nothing valid to attach + AdjustDeclIfTemplate(ClassDecl); - AttachBaseSpecifiers(cast(ClassDecl), Bases); + // Attach only the valid bases so downstream never ICEs + AttachBaseSpecifiers(cast(ClassDecl), + llvm::MutableArrayRef( + ValidBases.data(), ValidBases.size())); } bool Sema::IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, diff --git a/clang/test/SemaCXX/invalid-base-inheritance.cpp b/clang/test/SemaCXX/invalid-base-inheritance.cpp new file mode 100644 index 0..21b3eb57ef914 --- /dev/null +++ b/clang/test/SemaCXX/invalid-base-inheritance.cpp @@ -0,0 +1,13 @@ +// Tests that invalid base-specifiers no longer crash the compiler. +// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s + +class X; // expected-note {{forward declaration of 'X'}} expected-note {{forward declaration of 'X'}} + +class A : X { // expected-error {{base class has incomplete type}} +}; + +class Y : int { // expected-error {{expected class name}} +}; + +class Z : X*, virtual int { // expected-error {{base class has incomplete type}} expected-error {{expected class name}} +}; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
@@ -547,6 +547,15 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, return; } case AR_Deprecated: +// Suppress -Wdeprecated-declarations in purely implicit special-member functions. +if (auto *MD = dyn_cast_if_present(S.getCurFunctionDecl()); +MD && MD->isImplicit() && MD->isDefaulted() && +(isa(MD) || +MD->isCopyAssignmentOperator() || +MD->isMoveAssignmentOperator())) { +return; +} + shashi1687 wrote: **“dyn_cast_if_present” causes compile errors** There is no FunctionDeck class in Clang’s AST, so that cast will never compile. The correct cast here is to CXXMethodDecl (or at most to FunctionDecl). We’ve updated the code to use: ``` if (auto *MD = dyn_cast_if_present(…); MD && MD->isImplicit() /*…etc…*/ ) return; ``` This change compiles cleanly and continues to limit suppression to only the implicitly-generated special-member methods. https://github.com/llvm/llvm-project/pull/147400 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Sema: suppress deprecated field warnings in implicit special-member functions Fixes: https://github.com/llvm/llvm-project/issues/147293 (PR #147400)
shashi1687 wrote: Hello @zwuis/everyone, Thank you again for your thorough review. I’ve incorporated all suggestions: * Moved the suppression guard into the `case AR_Deprecated:` block * Used `dyn_cast_if_present` with a single `isImplicit() && isDefaulted()` check * Combined constructor & destructor detection via `isa<…>` * Cleaned up the release notes entry All Sema tests (`check-clang`) pass locally. Could you please take another look when you have a chance? I really appreciate your time and guidance on this. Thanks so much! 😊 https://github.com/llvm/llvm-project/pull/147400 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Sema: filter out invalid base-specifiers before attaching (PR #147213)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147213 >From 05211dac479bf25aaf6d8ecc3a53871a51f7ffdd Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Sun, 6 Jul 2025 22:25:48 +0200 Subject: [PATCH 1/3] Sema: filter out invalid base-specifiers before attaching ActOnBaseSpecifiers now skips nullptr entries returned for invalid bases, avoiding ICE on invalid inheritance. Added regression test in SemaCXX/invalid-inheritance.cpp. Fixes #147186 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaDeclCXX.cpp | 17 - clang/test/SemaCXX/invalid-base-inheritance.cpp | 13 + 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaCXX/invalid-base-inheritance.cpp diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index f0247f865ba40..231610241d8ee 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3031,8 +3031,23 @@ void Sema::ActOnBaseSpecifiers(Decl *ClassDecl, if (!ClassDecl || Bases.empty()) return; + // --- drop any bases already diagnosed invalid --- + SmallVector ValidBases; + ValidBases.reserve(Bases.size()); + for (auto *BS : Bases) + if (BS) + ValidBases.push_back(BS); + if (ValidBases.empty()) + return; + + if (ValidBases.empty()) +return; // nothing valid to attach + AdjustDeclIfTemplate(ClassDecl); - AttachBaseSpecifiers(cast(ClassDecl), Bases); + // Attach only the valid bases so downstream never ICEs + AttachBaseSpecifiers(cast(ClassDecl), + llvm::MutableArrayRef( + ValidBases.data(), ValidBases.size())); } bool Sema::IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, diff --git a/clang/test/SemaCXX/invalid-base-inheritance.cpp b/clang/test/SemaCXX/invalid-base-inheritance.cpp new file mode 100644 index 0..21b3eb57ef914 --- /dev/null +++ b/clang/test/SemaCXX/invalid-base-inheritance.cpp @@ -0,0 +1,13 @@ +// Tests that invalid base-specifiers no longer crash the compiler. +// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s + +class X; // expected-note {{forward declaration of 'X'}} expected-note {{forward declaration of 'X'}} + +class A : X { // expected-error {{base class has incomplete type}} +}; + +class Y : int { // expected-error {{expected class name}} +}; + +class Z : X*, virtual int { // expected-error {{base class has incomplete type}} expected-error {{expected class name}} +}; >From 53984191e3e45d3964f6ff71d70df7c030659369 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Wed, 9 Jul 2025 00:10:51 +0200 Subject: [PATCH 2/3] ParseDeclCXX: reject unusable base classes via isUsableType In Parser::ParseBaseSpecifier, replace the previous `isInvalid` check with `!BaseTy->isUsableType()` so that we early-reject any non-instantiable class/struct/union as a base. Add a one-line entry to clang/docs/ReleaseNotes.rst. Fixes #147213. --- clang/docs/ReleaseNotes.rst | 1 + clang/lib/Parse/ParseDeclCXX.cpp | 5 - clang/lib/Sema/SemaDeclCXX.cpp | 17 + 3 files changed, 6 insertions(+), 17 deletions(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index a919f3a71c9cf..141391a164814 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -920,6 +920,7 @@ Bug Fixes to C++ Support - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) - Fix a crash when trying to instantiate an ambiguous specialization. (#GH51866) +- Switch `ParseBaseClause` to use `BaseResult::isUsable()` instead of `isInvalid()`, fixing dropped or mis-parsed base specifiers in C++ classes. (#GH147186) Bug Fixes to AST Handling ^ diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index eae8281964692..e7bb5b48058d0 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -2252,7 +2252,10 @@ void Parser::ParseBaseClause(Decl *ClassDecl) { while (true) { // Parse a base-specifier. BaseResult Result = ParseBaseSpecifier(ClassDecl); -if (Result.isInvalid()) { +// Skip any base-specifier we couldn’t actually build into a usable +// CXXBaseSpecifier (covers both syntactic invalidity and +// other un-usable cases). +if (!Result.isUsable()) { // Skip the rest of this base specifier, up until the comma or // opening brace. SkipUntil(tok::comma, tok::l_brace, StopAtSemi | StopBeforeMatch); diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 231610241d8ee..f0247f865ba40 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3031,23 +3031,8 @@ void Sema::ActOnBaseSpecifiers(Decl *ClassDecl, if (!ClassDecl || Bases.empty()) return; -
[clang] Sema: filter out invalid base-specifiers before attaching (PR #147213)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147213 >From 6184a8edfbe7173f0b23ccebd4da80d8fb5e1485 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Sun, 6 Jul 2025 22:25:48 +0200 Subject: [PATCH] Sema: filter out invalid base-specifiers before attaching ActOnBaseSpecifiers now skips nullptr entries returned for invalid bases, avoiding ICE on invalid inheritance. Added regression test in SemaCXX/invalid-inheritance.cpp. Fixes #147186 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaDeclCXX.cpp | 17 - clang/test/SemaCXX/invalid-base-inheritance.cpp | 17 + 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaCXX/invalid-base-inheritance.cpp diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index f0247f865ba40..231610241d8ee 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3031,8 +3031,23 @@ void Sema::ActOnBaseSpecifiers(Decl *ClassDecl, if (!ClassDecl || Bases.empty()) return; + // --- drop any bases already diagnosed invalid --- + SmallVector ValidBases; + ValidBases.reserve(Bases.size()); + for (auto *BS : Bases) + if (BS) + ValidBases.push_back(BS); + if (ValidBases.empty()) + return; + + if (ValidBases.empty()) +return; // nothing valid to attach + AdjustDeclIfTemplate(ClassDecl); - AttachBaseSpecifiers(cast(ClassDecl), Bases); + // Attach only the valid bases so downstream never ICEs + AttachBaseSpecifiers(cast(ClassDecl), + llvm::MutableArrayRef( + ValidBases.data(), ValidBases.size())); } bool Sema::IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, diff --git a/clang/test/SemaCXX/invalid-base-inheritance.cpp b/clang/test/SemaCXX/invalid-base-inheritance.cpp new file mode 100644 index 0..e37b77bcd3fea --- /dev/null +++ b/clang/test/SemaCXX/invalid-base-inheritance.cpp @@ -0,0 +1,17 @@ +// Tests that invalid base-specifiers no longer crash the compiler. +// RUN: %clang_cc1 -fsyntax-only -verify %s + +class X; // forward declaration + +class A : X { // incomplete base → error, but no ICE +// expected-error@-1 {{base class has incomplete type}} +}; + +class Y : int { // base not a class → error, but no ICE + // expected-error@-1 {{expected class name}} +}; + +class Z : X*, virtual int { // mixed invalid specifiers +// expected-error@-2 {{base class has incomplete type}} +// expected-error@-1 {{expected class name}} +}; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Sema: filter out invalid base-specifiers before attaching (PR #147213)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147213 >From 2b109b30c7db2fe48b562a38ac2543c56cb1beca Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Sun, 6 Jul 2025 22:25:48 +0200 Subject: [PATCH] Sema: filter out invalid base-specifiers before attaching ActOnBaseSpecifiers now skips nullptr entries returned for invalid bases, avoiding ICE on invalid inheritance. Added regression test in SemaCXX/invalid-inheritance.cpp. Fixes #147186 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaDeclCXX.cpp | 17 - clang/test/SemaCXX/invalid-base-inheritance.cpp | 17 + 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaCXX/invalid-base-inheritance.cpp diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index f0247f865ba40..231610241d8ee 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3031,8 +3031,23 @@ void Sema::ActOnBaseSpecifiers(Decl *ClassDecl, if (!ClassDecl || Bases.empty()) return; + // --- drop any bases already diagnosed invalid --- + SmallVector ValidBases; + ValidBases.reserve(Bases.size()); + for (auto *BS : Bases) + if (BS) + ValidBases.push_back(BS); + if (ValidBases.empty()) + return; + + if (ValidBases.empty()) +return; // nothing valid to attach + AdjustDeclIfTemplate(ClassDecl); - AttachBaseSpecifiers(cast(ClassDecl), Bases); + // Attach only the valid bases so downstream never ICEs + AttachBaseSpecifiers(cast(ClassDecl), + llvm::MutableArrayRef( + ValidBases.data(), ValidBases.size())); } bool Sema::IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, diff --git a/clang/test/SemaCXX/invalid-base-inheritance.cpp b/clang/test/SemaCXX/invalid-base-inheritance.cpp new file mode 100644 index 0..e37b77bcd3fea --- /dev/null +++ b/clang/test/SemaCXX/invalid-base-inheritance.cpp @@ -0,0 +1,17 @@ +// Tests that invalid base-specifiers no longer crash the compiler. +// RUN: %clang_cc1 -fsyntax-only -verify %s + +class X; // forward declaration + +class A : X { // incomplete base → error, but no ICE +// expected-error@-1 {{base class has incomplete type}} +}; + +class Y : int { // base not a class → error, but no ICE + // expected-error@-1 {{expected class name}} +}; + +class Z : X*, virtual int { // mixed invalid specifiers +// expected-error@-2 {{base class has incomplete type}} +// expected-error@-1 {{expected class name}} +}; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Sema: filter out invalid base-specifiers before attaching (PR #147213)
https://github.com/shashi1687 created https://github.com/llvm/llvm-project/pull/147213 ### Summary Briefly what this PR does, in one or two sentences. > Filters out invalid (null) base-specifiers in `ActOnBaseSpecifiers()`, > preventing ICEs on incomplete or non-class bases. ### Motivation Why this change is needed. > When you inherit from a forward‐declared class or non-class type, Sema used > to emit an error _and_ still hand the bad pointer to later code, causing an > internal compiler error. We now drop those invalid entries immediately. ### Root Cause Analysis A very short bulleted “root cause.” - `ActOnBaseSpecifier` returns `nullptr` for invalid bases. - `ActOnBaseSpecifiers` passed **all** pointers (including null) to `AttachBaseSpecifiers`. - Later layout or special‐member lookup on null caused the ICE. ### Changes in this PR List the key files and rough diff summary. - **clang/lib/Sema/SemaDeclCXX.cpp** - In `ActOnBaseSpecifiers()`, gather `Bases` into a `SmallVector`, skipping null entries. - **clang/test/SemaCXX/invalid-base-inheritance.cpp** - New regression test checking for the proper diagnostics and that no ICE occurs. ### Test Plan How you verified the change. 1. **Local build/test** ```bash mkdir build && cd build cmake -G Ninja ../llvm \ -DLLVM_ENABLE_PROJECTS="clang" \ -DCMAKE_BUILD_TYPE=Release ninja clang ninja check-clang >From 36559cab1bce1bbd8b501521c6c252d6d3fa00ce Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Sun, 6 Jul 2025 22:25:48 +0200 Subject: [PATCH] Sema: filter out invalid base-specifiers before attaching ActOnBaseSpecifiers now skips nullptr entries returned for invalid bases, avoiding ICE on invalid inheritance. Added regression test in SemaCXX/invalid-inheritance.cpp. Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaDeclCXX.cpp | 17 - clang/test/SemaCXX/invalid-base-inheritance.cpp | 17 + 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaCXX/invalid-base-inheritance.cpp diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index f0247f865ba40..231610241d8ee 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3031,8 +3031,23 @@ void Sema::ActOnBaseSpecifiers(Decl *ClassDecl, if (!ClassDecl || Bases.empty()) return; + // --- drop any bases already diagnosed invalid --- + SmallVector ValidBases; + ValidBases.reserve(Bases.size()); + for (auto *BS : Bases) + if (BS) + ValidBases.push_back(BS); + if (ValidBases.empty()) + return; + + if (ValidBases.empty()) +return; // nothing valid to attach + AdjustDeclIfTemplate(ClassDecl); - AttachBaseSpecifiers(cast(ClassDecl), Bases); + // Attach only the valid bases so downstream never ICEs + AttachBaseSpecifiers(cast(ClassDecl), + llvm::MutableArrayRef( + ValidBases.data(), ValidBases.size())); } bool Sema::IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, diff --git a/clang/test/SemaCXX/invalid-base-inheritance.cpp b/clang/test/SemaCXX/invalid-base-inheritance.cpp new file mode 100644 index 0..e37b77bcd3fea --- /dev/null +++ b/clang/test/SemaCXX/invalid-base-inheritance.cpp @@ -0,0 +1,17 @@ +// Tests that invalid base-specifiers no longer crash the compiler. +// RUN: %clang_cc1 -fsyntax-only -verify %s + +class X; // forward declaration + +class A : X { // incomplete base → error, but no ICE +// expected-error@-1 {{base class has incomplete type}} +}; + +class Y : int { // base not a class → error, but no ICE + // expected-error@-1 {{expected class name}} +}; + +class Z : X*, virtual int { // mixed invalid specifiers +// expected-error@-2 {{base class has incomplete type}} +// expected-error@-1 {{expected class name}} +}; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Sema: filter out invalid base-specifiers before attaching (PR #147213)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147213 >From 8e0ec03d5d587df2d68775bc7bb7f3d8331db7b8 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Sun, 6 Jul 2025 22:25:48 +0200 Subject: [PATCH] Sema: filter out invalid base-specifiers before attaching ActOnBaseSpecifiers now skips nullptr entries returned for invalid bases, avoiding ICE on invalid inheritance. Added regression test in SemaCXX/invalid-inheritance.cpp. Fixes #147186 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaDeclCXX.cpp | 17 - clang/test/SemaCXX/invalid-base-inheritance.cpp | 17 + 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaCXX/invalid-base-inheritance.cpp diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index f0247f865ba40..231610241d8ee 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3031,8 +3031,23 @@ void Sema::ActOnBaseSpecifiers(Decl *ClassDecl, if (!ClassDecl || Bases.empty()) return; + // --- drop any bases already diagnosed invalid --- + SmallVector ValidBases; + ValidBases.reserve(Bases.size()); + for (auto *BS : Bases) + if (BS) + ValidBases.push_back(BS); + if (ValidBases.empty()) + return; + + if (ValidBases.empty()) +return; // nothing valid to attach + AdjustDeclIfTemplate(ClassDecl); - AttachBaseSpecifiers(cast(ClassDecl), Bases); + // Attach only the valid bases so downstream never ICEs + AttachBaseSpecifiers(cast(ClassDecl), + llvm::MutableArrayRef( + ValidBases.data(), ValidBases.size())); } bool Sema::IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, diff --git a/clang/test/SemaCXX/invalid-base-inheritance.cpp b/clang/test/SemaCXX/invalid-base-inheritance.cpp new file mode 100644 index 0..e37b77bcd3fea --- /dev/null +++ b/clang/test/SemaCXX/invalid-base-inheritance.cpp @@ -0,0 +1,17 @@ +// Tests that invalid base-specifiers no longer crash the compiler. +// RUN: %clang_cc1 -fsyntax-only -verify %s + +class X; // forward declaration + +class A : X { // incomplete base → error, but no ICE +// expected-error@-1 {{base class has incomplete type}} +}; + +class Y : int { // base not a class → error, but no ICE + // expected-error@-1 {{expected class name}} +}; + +class Z : X*, virtual int { // mixed invalid specifiers +// expected-error@-2 {{base class has incomplete type}} +// expected-error@-1 {{expected class name}} +}; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Sema: suppress deprecated field warnings in implicit special-member functions Fixes: https://github.com/llvm/llvm-project/issues/147293 (PR #147400)
https://github.com/shashi1687 edited https://github.com/llvm/llvm-project/pull/147400 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Sema: suppress deprecated field warnings in implicit special-member functions Fixes: https://github.com/llvm/llvm-project/issues/147293 (PR #147400)
https://github.com/shashi1687 ready_for_review https://github.com/llvm/llvm-project/pull/147400 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Sema: suppress deprecated field warnings in implicit special-member functions Fixes: https://github.com/llvm/llvm-project/issues/147293 (PR #147400)
https://github.com/shashi1687 edited https://github.com/llvm/llvm-project/pull/147400 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Sema: suppress deprecated field warnings in implicit special-member functions Fixes: https://github.com/llvm/llvm-project/issues/147293 (PR #147400)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147400 >From 29c3c9c6d25cc7c47d01a9d819ea37e92361aea2 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Mon, 7 Jul 2025 22:54:22 +0200 Subject: [PATCH 1/3] Sema: suppress deprecated field warnings in implicit special-member functions Only explicit uses of deprecated fields should warn. Defaulted constructors and copy/move assignment operators (when implicitly generated) no longer trigger -Wdeprecated-declarations. * In SemaExpr.cpp, early-return in DiagnoseUseOfDecl for implicit SM. * Add lit regression test in clang/test/SemaCXX/deprecated-no-implicit-warning.cpp. Fixes: https://github.com/llvm/llvm-project/issues/147293 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaAvailability.cpp | 22 + .../implicit-special-member-deprecated.cpp| 24 +++ 2 files changed, 46 insertions(+) create mode 100644 clang/test/Sema/implicit-special-member-deprecated.cpp diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index 8c6a17301fba6..a3ff53abd3188 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -452,6 +452,28 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, } } } + // Suppress -Wdeprecated-declarations in purely implicit special-member functions. + if (K == AR_Deprecated) { +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Implicit, defaulted constructor (default / copy / move) + if (auto *CD = dyn_cast(FD)) { +if (CD->isImplicit() && CD->isDefaulted()) + return; + } + //Implicit, defaulted destructor + if (auto *DD = dyn_cast(FD)) { +if (DD->isImplicit() && DD->isDefaulted()) + return; + } + //Implicit copy- or move-assignment operator + if (auto *MD = dyn_cast(FD)) { +if (MD->isImplicit() && +(MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) + return; + } +} + } + switch (K) { case AR_NotYetIntroduced: { 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 0..f65fc5171eaab --- /dev/null +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -0,0 +1,24 @@ +// clang/test/Sema/implicit-deprecated-special-member.cpp +// RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s + +struct A { + [[deprecated("use something else")]] int x = 42; // expected-note {{has been explicitly marked deprecated here}} +}; + +A makeDefaultA() {// implicit default ctor: no diagnostics + return {}; +} + +A copyA(const A &a) { // implicit copy ctor: no diagnostics + return a; +} + +void assignA() { + A a, b; + a = b; // implicit copy-assign: no diagnostics +} + +void useA() { + A a; + (void)a.x; // expected-warning {{is deprecated}} +} \ No newline at end of file >From 159e35de70a0d4ada07f8f6bc340a2a3d165b463 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 01:33:39 +0200 Subject: [PATCH 2/3] Docs: add release note for implicit-special-member deprecation fix --- clang/docs/ReleaseNotes.rst| 1 + clang/test/Sema/implicit-special-member-deprecated.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 581338924943b..711e45f44ac6e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -907,6 +907,7 @@ Bug Fixes to C++ Support - Fix a bug where private access specifier of overloaded function not respected. (#GH107629) - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) +- Suppress -Wdeprecated-declarations in implicitly generated special-member functions for deprecated data-members; only explicit uses still warn. (PR #147400, Issue #147293) Bug Fixes to AST Handling ^ diff --git a/clang/test/Sema/implicit-special-member-deprecated.cpp b/clang/test/Sema/implicit-special-member-deprecated.cpp index f65fc5171eaab..6b0042f5d2bb5 100644 --- a/clang/test/Sema/implicit-special-member-deprecated.cpp +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -1,4 +1,3 @@ -// clang/test/Sema/implicit-deprecated-special-member.cpp // RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s struct A { >From df268388567a1510f8b108f57b6bc8cafbb7f0b3 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 10:37:41 +0200 Subject: [PATCH 3/3] Sema: move deprecation-suppression into switch, dedupe implicit/defaulted checks - Suppression guard is now inside - Use to coalesce + - Drop PR number from rele
[clang] Sema: suppress deprecated field warnings in implicit special-member functions Fixes: https://github.com/llvm/llvm-project/issues/147293 (PR #147400)
@@ -547,6 +547,20 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, return; } case AR_Deprecated: +// Suppress -Wdeprecated-declarations in purely implicit special-member functions. +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Only proceed if this is an implicit, defaulted member function: + if (auto *MD = dyn_cast_if_present(FD); shashi1687 wrote: Thank you for the feedback! I’ve made the changes https://github.com/llvm/llvm-project/pull/147400 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] Sema: suppress deprecated field warnings in implicit special-member functions Fixes: https://github.com/llvm/llvm-project/issues/147293 (PR #147400)
@@ -547,6 +547,20 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, return; } case AR_Deprecated: +// Suppress -Wdeprecated-declarations in purely implicit special-member functions. +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Only proceed if this is an implicit, defaulted member function: + if (auto *MD = dyn_cast_if_present(FD); + MD && MD->isImplicit() && MD->isDefaulted()) { +// Match any special-member kind: +if (isa(MD) || +isa(MD) || shashi1687 wrote: Thank you for the feedback! I’ve made the changes https://github.com/llvm/llvm-project/pull/147400 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147400 >From 29c3c9c6d25cc7c47d01a9d819ea37e92361aea2 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Mon, 7 Jul 2025 22:54:22 +0200 Subject: [PATCH 1/3] Sema: suppress deprecated field warnings in implicit special-member functions Only explicit uses of deprecated fields should warn. Defaulted constructors and copy/move assignment operators (when implicitly generated) no longer trigger -Wdeprecated-declarations. * In SemaExpr.cpp, early-return in DiagnoseUseOfDecl for implicit SM. * Add lit regression test in clang/test/SemaCXX/deprecated-no-implicit-warning.cpp. Fixes: https://github.com/llvm/llvm-project/issues/147293 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaAvailability.cpp | 22 + .../implicit-special-member-deprecated.cpp| 24 +++ 2 files changed, 46 insertions(+) create mode 100644 clang/test/Sema/implicit-special-member-deprecated.cpp diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index 8c6a17301fba6..a3ff53abd3188 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -452,6 +452,28 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, } } } + // Suppress -Wdeprecated-declarations in purely implicit special-member functions. + if (K == AR_Deprecated) { +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Implicit, defaulted constructor (default / copy / move) + if (auto *CD = dyn_cast(FD)) { +if (CD->isImplicit() && CD->isDefaulted()) + return; + } + //Implicit, defaulted destructor + if (auto *DD = dyn_cast(FD)) { +if (DD->isImplicit() && DD->isDefaulted()) + return; + } + //Implicit copy- or move-assignment operator + if (auto *MD = dyn_cast(FD)) { +if (MD->isImplicit() && +(MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) + return; + } +} + } + switch (K) { case AR_NotYetIntroduced: { 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 0..f65fc5171eaab --- /dev/null +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -0,0 +1,24 @@ +// clang/test/Sema/implicit-deprecated-special-member.cpp +// RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s + +struct A { + [[deprecated("use something else")]] int x = 42; // expected-note {{has been explicitly marked deprecated here}} +}; + +A makeDefaultA() {// implicit default ctor: no diagnostics + return {}; +} + +A copyA(const A &a) { // implicit copy ctor: no diagnostics + return a; +} + +void assignA() { + A a, b; + a = b; // implicit copy-assign: no diagnostics +} + +void useA() { + A a; + (void)a.x; // expected-warning {{is deprecated}} +} \ No newline at end of file >From 159e35de70a0d4ada07f8f6bc340a2a3d165b463 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 01:33:39 +0200 Subject: [PATCH 2/3] Docs: add release note for implicit-special-member deprecation fix --- clang/docs/ReleaseNotes.rst| 1 + clang/test/Sema/implicit-special-member-deprecated.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 581338924943b..711e45f44ac6e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -907,6 +907,7 @@ Bug Fixes to C++ Support - Fix a bug where private access specifier of overloaded function not respected. (#GH107629) - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) +- Suppress -Wdeprecated-declarations in implicitly generated special-member functions for deprecated data-members; only explicit uses still warn. (PR #147400, Issue #147293) Bug Fixes to AST Handling ^ diff --git a/clang/test/Sema/implicit-special-member-deprecated.cpp b/clang/test/Sema/implicit-special-member-deprecated.cpp index f65fc5171eaab..6b0042f5d2bb5 100644 --- a/clang/test/Sema/implicit-special-member-deprecated.cpp +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -1,4 +1,3 @@ -// clang/test/Sema/implicit-deprecated-special-member.cpp // RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s struct A { >From 1d206a0a8e147230ce82b20ed70f6feb5f2eda65 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 10:37:41 +0200 Subject: [PATCH 3/3] Sema: move deprecation-suppression into switch, dedupe implicit/defaulted checks - Suppression guard is now inside - Use to coalesce + - Drop PR number from rele
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147400 >From 29c3c9c6d25cc7c47d01a9d819ea37e92361aea2 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Mon, 7 Jul 2025 22:54:22 +0200 Subject: [PATCH 1/3] Sema: suppress deprecated field warnings in implicit special-member functions Only explicit uses of deprecated fields should warn. Defaulted constructors and copy/move assignment operators (when implicitly generated) no longer trigger -Wdeprecated-declarations. * In SemaExpr.cpp, early-return in DiagnoseUseOfDecl for implicit SM. * Add lit regression test in clang/test/SemaCXX/deprecated-no-implicit-warning.cpp. Fixes: https://github.com/llvm/llvm-project/issues/147293 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaAvailability.cpp | 22 + .../implicit-special-member-deprecated.cpp| 24 +++ 2 files changed, 46 insertions(+) create mode 100644 clang/test/Sema/implicit-special-member-deprecated.cpp diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index 8c6a17301fba6..a3ff53abd3188 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -452,6 +452,28 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, } } } + // Suppress -Wdeprecated-declarations in purely implicit special-member functions. + if (K == AR_Deprecated) { +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Implicit, defaulted constructor (default / copy / move) + if (auto *CD = dyn_cast(FD)) { +if (CD->isImplicit() && CD->isDefaulted()) + return; + } + //Implicit, defaulted destructor + if (auto *DD = dyn_cast(FD)) { +if (DD->isImplicit() && DD->isDefaulted()) + return; + } + //Implicit copy- or move-assignment operator + if (auto *MD = dyn_cast(FD)) { +if (MD->isImplicit() && +(MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) + return; + } +} + } + switch (K) { case AR_NotYetIntroduced: { 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 0..f65fc5171eaab --- /dev/null +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -0,0 +1,24 @@ +// clang/test/Sema/implicit-deprecated-special-member.cpp +// RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s + +struct A { + [[deprecated("use something else")]] int x = 42; // expected-note {{has been explicitly marked deprecated here}} +}; + +A makeDefaultA() {// implicit default ctor: no diagnostics + return {}; +} + +A copyA(const A &a) { // implicit copy ctor: no diagnostics + return a; +} + +void assignA() { + A a, b; + a = b; // implicit copy-assign: no diagnostics +} + +void useA() { + A a; + (void)a.x; // expected-warning {{is deprecated}} +} \ No newline at end of file >From 159e35de70a0d4ada07f8f6bc340a2a3d165b463 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 01:33:39 +0200 Subject: [PATCH 2/3] Docs: add release note for implicit-special-member deprecation fix --- clang/docs/ReleaseNotes.rst| 1 + clang/test/Sema/implicit-special-member-deprecated.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 581338924943b..711e45f44ac6e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -907,6 +907,7 @@ Bug Fixes to C++ Support - Fix a bug where private access specifier of overloaded function not respected. (#GH107629) - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) +- Suppress -Wdeprecated-declarations in implicitly generated special-member functions for deprecated data-members; only explicit uses still warn. (PR #147400, Issue #147293) Bug Fixes to AST Handling ^ diff --git a/clang/test/Sema/implicit-special-member-deprecated.cpp b/clang/test/Sema/implicit-special-member-deprecated.cpp index f65fc5171eaab..6b0042f5d2bb5 100644 --- a/clang/test/Sema/implicit-special-member-deprecated.cpp +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -1,4 +1,3 @@ -// clang/test/Sema/implicit-deprecated-special-member.cpp // RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s struct A { >From 1d206a0a8e147230ce82b20ed70f6feb5f2eda65 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 10:37:41 +0200 Subject: [PATCH 3/3] Sema: move deprecation-suppression into switch, dedupe implicit/defaulted checks - Suppression guard is now inside - Use to coalesce + - Drop PR number from rele
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147400 >From 29c3c9c6d25cc7c47d01a9d819ea37e92361aea2 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Mon, 7 Jul 2025 22:54:22 +0200 Subject: [PATCH 1/3] Sema: suppress deprecated field warnings in implicit special-member functions Only explicit uses of deprecated fields should warn. Defaulted constructors and copy/move assignment operators (when implicitly generated) no longer trigger -Wdeprecated-declarations. * In SemaExpr.cpp, early-return in DiagnoseUseOfDecl for implicit SM. * Add lit regression test in clang/test/SemaCXX/deprecated-no-implicit-warning.cpp. Fixes: https://github.com/llvm/llvm-project/issues/147293 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaAvailability.cpp | 22 + .../implicit-special-member-deprecated.cpp| 24 +++ 2 files changed, 46 insertions(+) create mode 100644 clang/test/Sema/implicit-special-member-deprecated.cpp diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index 8c6a17301fba6..a3ff53abd3188 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -452,6 +452,28 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, } } } + // Suppress -Wdeprecated-declarations in purely implicit special-member functions. + if (K == AR_Deprecated) { +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Implicit, defaulted constructor (default / copy / move) + if (auto *CD = dyn_cast(FD)) { +if (CD->isImplicit() && CD->isDefaulted()) + return; + } + //Implicit, defaulted destructor + if (auto *DD = dyn_cast(FD)) { +if (DD->isImplicit() && DD->isDefaulted()) + return; + } + //Implicit copy- or move-assignment operator + if (auto *MD = dyn_cast(FD)) { +if (MD->isImplicit() && +(MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) + return; + } +} + } + switch (K) { case AR_NotYetIntroduced: { 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 0..f65fc5171eaab --- /dev/null +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -0,0 +1,24 @@ +// clang/test/Sema/implicit-deprecated-special-member.cpp +// RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s + +struct A { + [[deprecated("use something else")]] int x = 42; // expected-note {{has been explicitly marked deprecated here}} +}; + +A makeDefaultA() {// implicit default ctor: no diagnostics + return {}; +} + +A copyA(const A &a) { // implicit copy ctor: no diagnostics + return a; +} + +void assignA() { + A a, b; + a = b; // implicit copy-assign: no diagnostics +} + +void useA() { + A a; + (void)a.x; // expected-warning {{is deprecated}} +} \ No newline at end of file >From 159e35de70a0d4ada07f8f6bc340a2a3d165b463 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 01:33:39 +0200 Subject: [PATCH 2/3] Docs: add release note for implicit-special-member deprecation fix --- clang/docs/ReleaseNotes.rst| 1 + clang/test/Sema/implicit-special-member-deprecated.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 581338924943b..711e45f44ac6e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -907,6 +907,7 @@ Bug Fixes to C++ Support - Fix a bug where private access specifier of overloaded function not respected. (#GH107629) - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) +- Suppress -Wdeprecated-declarations in implicitly generated special-member functions for deprecated data-members; only explicit uses still warn. (PR #147400, Issue #147293) Bug Fixes to AST Handling ^ diff --git a/clang/test/Sema/implicit-special-member-deprecated.cpp b/clang/test/Sema/implicit-special-member-deprecated.cpp index f65fc5171eaab..6b0042f5d2bb5 100644 --- a/clang/test/Sema/implicit-special-member-deprecated.cpp +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -1,4 +1,3 @@ -// clang/test/Sema/implicit-deprecated-special-member.cpp // RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s struct A { >From 1d206a0a8e147230ce82b20ed70f6feb5f2eda65 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 10:37:41 +0200 Subject: [PATCH 3/3] Sema: move deprecation-suppression into switch, dedupe implicit/defaulted checks - Suppression guard is now inside - Use to coalesce + - Drop PR number from rele
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147400 >From 29c3c9c6d25cc7c47d01a9d819ea37e92361aea2 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Mon, 7 Jul 2025 22:54:22 +0200 Subject: [PATCH 1/3] Sema: suppress deprecated field warnings in implicit special-member functions Only explicit uses of deprecated fields should warn. Defaulted constructors and copy/move assignment operators (when implicitly generated) no longer trigger -Wdeprecated-declarations. * In SemaExpr.cpp, early-return in DiagnoseUseOfDecl for implicit SM. * Add lit regression test in clang/test/SemaCXX/deprecated-no-implicit-warning.cpp. Fixes: https://github.com/llvm/llvm-project/issues/147293 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaAvailability.cpp | 22 + .../implicit-special-member-deprecated.cpp| 24 +++ 2 files changed, 46 insertions(+) create mode 100644 clang/test/Sema/implicit-special-member-deprecated.cpp diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index 8c6a17301fba6..a3ff53abd3188 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -452,6 +452,28 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, } } } + // Suppress -Wdeprecated-declarations in purely implicit special-member functions. + if (K == AR_Deprecated) { +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Implicit, defaulted constructor (default / copy / move) + if (auto *CD = dyn_cast(FD)) { +if (CD->isImplicit() && CD->isDefaulted()) + return; + } + //Implicit, defaulted destructor + if (auto *DD = dyn_cast(FD)) { +if (DD->isImplicit() && DD->isDefaulted()) + return; + } + //Implicit copy- or move-assignment operator + if (auto *MD = dyn_cast(FD)) { +if (MD->isImplicit() && +(MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) + return; + } +} + } + switch (K) { case AR_NotYetIntroduced: { 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 0..f65fc5171eaab --- /dev/null +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -0,0 +1,24 @@ +// clang/test/Sema/implicit-deprecated-special-member.cpp +// RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s + +struct A { + [[deprecated("use something else")]] int x = 42; // expected-note {{has been explicitly marked deprecated here}} +}; + +A makeDefaultA() {// implicit default ctor: no diagnostics + return {}; +} + +A copyA(const A &a) { // implicit copy ctor: no diagnostics + return a; +} + +void assignA() { + A a, b; + a = b; // implicit copy-assign: no diagnostics +} + +void useA() { + A a; + (void)a.x; // expected-warning {{is deprecated}} +} \ No newline at end of file >From 159e35de70a0d4ada07f8f6bc340a2a3d165b463 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 01:33:39 +0200 Subject: [PATCH 2/3] Docs: add release note for implicit-special-member deprecation fix --- clang/docs/ReleaseNotes.rst| 1 + clang/test/Sema/implicit-special-member-deprecated.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 581338924943b..711e45f44ac6e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -907,6 +907,7 @@ Bug Fixes to C++ Support - Fix a bug where private access specifier of overloaded function not respected. (#GH107629) - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) +- Suppress -Wdeprecated-declarations in implicitly generated special-member functions for deprecated data-members; only explicit uses still warn. (PR #147400, Issue #147293) Bug Fixes to AST Handling ^ diff --git a/clang/test/Sema/implicit-special-member-deprecated.cpp b/clang/test/Sema/implicit-special-member-deprecated.cpp index f65fc5171eaab..6b0042f5d2bb5 100644 --- a/clang/test/Sema/implicit-special-member-deprecated.cpp +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -1,4 +1,3 @@ -// clang/test/Sema/implicit-deprecated-special-member.cpp // RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s struct A { >From 1d206a0a8e147230ce82b20ed70f6feb5f2eda65 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 10:37:41 +0200 Subject: [PATCH 3/3] Sema: move deprecation-suppression into switch, dedupe implicit/defaulted checks - Suppression guard is now inside - Use to coalesce + - Drop PR number from rele
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147400 >From 29c3c9c6d25cc7c47d01a9d819ea37e92361aea2 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Mon, 7 Jul 2025 22:54:22 +0200 Subject: [PATCH 1/3] Sema: suppress deprecated field warnings in implicit special-member functions Only explicit uses of deprecated fields should warn. Defaulted constructors and copy/move assignment operators (when implicitly generated) no longer trigger -Wdeprecated-declarations. * In SemaExpr.cpp, early-return in DiagnoseUseOfDecl for implicit SM. * Add lit regression test in clang/test/SemaCXX/deprecated-no-implicit-warning.cpp. Fixes: https://github.com/llvm/llvm-project/issues/147293 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaAvailability.cpp | 22 + .../implicit-special-member-deprecated.cpp| 24 +++ 2 files changed, 46 insertions(+) create mode 100644 clang/test/Sema/implicit-special-member-deprecated.cpp diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index 8c6a17301fba6..a3ff53abd3188 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -452,6 +452,28 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, } } } + // Suppress -Wdeprecated-declarations in purely implicit special-member functions. + if (K == AR_Deprecated) { +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Implicit, defaulted constructor (default / copy / move) + if (auto *CD = dyn_cast(FD)) { +if (CD->isImplicit() && CD->isDefaulted()) + return; + } + //Implicit, defaulted destructor + if (auto *DD = dyn_cast(FD)) { +if (DD->isImplicit() && DD->isDefaulted()) + return; + } + //Implicit copy- or move-assignment operator + if (auto *MD = dyn_cast(FD)) { +if (MD->isImplicit() && +(MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) + return; + } +} + } + switch (K) { case AR_NotYetIntroduced: { 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 0..f65fc5171eaab --- /dev/null +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -0,0 +1,24 @@ +// clang/test/Sema/implicit-deprecated-special-member.cpp +// RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s + +struct A { + [[deprecated("use something else")]] int x = 42; // expected-note {{has been explicitly marked deprecated here}} +}; + +A makeDefaultA() {// implicit default ctor: no diagnostics + return {}; +} + +A copyA(const A &a) { // implicit copy ctor: no diagnostics + return a; +} + +void assignA() { + A a, b; + a = b; // implicit copy-assign: no diagnostics +} + +void useA() { + A a; + (void)a.x; // expected-warning {{is deprecated}} +} \ No newline at end of file >From 159e35de70a0d4ada07f8f6bc340a2a3d165b463 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 01:33:39 +0200 Subject: [PATCH 2/3] Docs: add release note for implicit-special-member deprecation fix --- clang/docs/ReleaseNotes.rst| 1 + clang/test/Sema/implicit-special-member-deprecated.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 581338924943b..711e45f44ac6e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -907,6 +907,7 @@ Bug Fixes to C++ Support - Fix a bug where private access specifier of overloaded function not respected. (#GH107629) - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) +- Suppress -Wdeprecated-declarations in implicitly generated special-member functions for deprecated data-members; only explicit uses still warn. (PR #147400, Issue #147293) Bug Fixes to AST Handling ^ diff --git a/clang/test/Sema/implicit-special-member-deprecated.cpp b/clang/test/Sema/implicit-special-member-deprecated.cpp index f65fc5171eaab..6b0042f5d2bb5 100644 --- a/clang/test/Sema/implicit-special-member-deprecated.cpp +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -1,4 +1,3 @@ -// clang/test/Sema/implicit-deprecated-special-member.cpp // RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s struct A { >From 1d206a0a8e147230ce82b20ed70f6feb5f2eda65 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 10:37:41 +0200 Subject: [PATCH 3/3] Sema: move deprecation-suppression into switch, dedupe implicit/defaulted checks - Suppression guard is now inside - Use to coalesce + - Drop PR number from rele
[clang] Sema: filter out invalid base-specifiers before attaching (PR #147213)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147213 >From 05211dac479bf25aaf6d8ecc3a53871a51f7ffdd Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Sun, 6 Jul 2025 22:25:48 +0200 Subject: [PATCH] Sema: filter out invalid base-specifiers before attaching ActOnBaseSpecifiers now skips nullptr entries returned for invalid bases, avoiding ICE on invalid inheritance. Added regression test in SemaCXX/invalid-inheritance.cpp. Fixes #147186 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaDeclCXX.cpp | 17 - clang/test/SemaCXX/invalid-base-inheritance.cpp | 13 + 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 clang/test/SemaCXX/invalid-base-inheritance.cpp diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index f0247f865ba40..231610241d8ee 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -3031,8 +3031,23 @@ void Sema::ActOnBaseSpecifiers(Decl *ClassDecl, if (!ClassDecl || Bases.empty()) return; + // --- drop any bases already diagnosed invalid --- + SmallVector ValidBases; + ValidBases.reserve(Bases.size()); + for (auto *BS : Bases) + if (BS) + ValidBases.push_back(BS); + if (ValidBases.empty()) + return; + + if (ValidBases.empty()) +return; // nothing valid to attach + AdjustDeclIfTemplate(ClassDecl); - AttachBaseSpecifiers(cast(ClassDecl), Bases); + // Attach only the valid bases so downstream never ICEs + AttachBaseSpecifiers(cast(ClassDecl), + llvm::MutableArrayRef( + ValidBases.data(), ValidBases.size())); } bool Sema::IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, diff --git a/clang/test/SemaCXX/invalid-base-inheritance.cpp b/clang/test/SemaCXX/invalid-base-inheritance.cpp new file mode 100644 index 0..21b3eb57ef914 --- /dev/null +++ b/clang/test/SemaCXX/invalid-base-inheritance.cpp @@ -0,0 +1,13 @@ +// Tests that invalid base-specifiers no longer crash the compiler. +// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s + +class X; // expected-note {{forward declaration of 'X'}} expected-note {{forward declaration of 'X'}} + +class A : X { // expected-error {{base class has incomplete type}} +}; + +class Y : int { // expected-error {{expected class name}} +}; + +class Z : X*, virtual int { // expected-error {{base class has incomplete type}} expected-error {{expected class name}} +}; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147400 >From 29c3c9c6d25cc7c47d01a9d819ea37e92361aea2 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Mon, 7 Jul 2025 22:54:22 +0200 Subject: [PATCH 1/3] Sema: suppress deprecated field warnings in implicit special-member functions Only explicit uses of deprecated fields should warn. Defaulted constructors and copy/move assignment operators (when implicitly generated) no longer trigger -Wdeprecated-declarations. * In SemaExpr.cpp, early-return in DiagnoseUseOfDecl for implicit SM. * Add lit regression test in clang/test/SemaCXX/deprecated-no-implicit-warning.cpp. Fixes: https://github.com/llvm/llvm-project/issues/147293 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaAvailability.cpp | 22 + .../implicit-special-member-deprecated.cpp| 24 +++ 2 files changed, 46 insertions(+) create mode 100644 clang/test/Sema/implicit-special-member-deprecated.cpp diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index 8c6a17301fba6..a3ff53abd3188 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -452,6 +452,28 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, } } } + // Suppress -Wdeprecated-declarations in purely implicit special-member functions. + if (K == AR_Deprecated) { +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Implicit, defaulted constructor (default / copy / move) + if (auto *CD = dyn_cast(FD)) { +if (CD->isImplicit() && CD->isDefaulted()) + return; + } + //Implicit, defaulted destructor + if (auto *DD = dyn_cast(FD)) { +if (DD->isImplicit() && DD->isDefaulted()) + return; + } + //Implicit copy- or move-assignment operator + if (auto *MD = dyn_cast(FD)) { +if (MD->isImplicit() && +(MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) + return; + } +} + } + switch (K) { case AR_NotYetIntroduced: { 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 0..f65fc5171eaab --- /dev/null +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -0,0 +1,24 @@ +// clang/test/Sema/implicit-deprecated-special-member.cpp +// RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s + +struct A { + [[deprecated("use something else")]] int x = 42; // expected-note {{has been explicitly marked deprecated here}} +}; + +A makeDefaultA() {// implicit default ctor: no diagnostics + return {}; +} + +A copyA(const A &a) { // implicit copy ctor: no diagnostics + return a; +} + +void assignA() { + A a, b; + a = b; // implicit copy-assign: no diagnostics +} + +void useA() { + A a; + (void)a.x; // expected-warning {{is deprecated}} +} \ No newline at end of file >From 159e35de70a0d4ada07f8f6bc340a2a3d165b463 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 01:33:39 +0200 Subject: [PATCH 2/3] Docs: add release note for implicit-special-member deprecation fix --- clang/docs/ReleaseNotes.rst| 1 + clang/test/Sema/implicit-special-member-deprecated.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 581338924943b..711e45f44ac6e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -907,6 +907,7 @@ Bug Fixes to C++ Support - Fix a bug where private access specifier of overloaded function not respected. (#GH107629) - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) +- Suppress -Wdeprecated-declarations in implicitly generated special-member functions for deprecated data-members; only explicit uses still warn. (PR #147400, Issue #147293) Bug Fixes to AST Handling ^ diff --git a/clang/test/Sema/implicit-special-member-deprecated.cpp b/clang/test/Sema/implicit-special-member-deprecated.cpp index f65fc5171eaab..6b0042f5d2bb5 100644 --- a/clang/test/Sema/implicit-special-member-deprecated.cpp +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -1,4 +1,3 @@ -// clang/test/Sema/implicit-deprecated-special-member.cpp // RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s struct A { >From ab1112f3c3665de1ef93203667176c604ebde3b4 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 10:37:41 +0200 Subject: [PATCH 3/3] Sema: move deprecation-suppression into switch, dedupe implicit/defaulted checks - Suppression guard is now inside - Use to coalesce + - Drop PR number from rele
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147400 >From 29c3c9c6d25cc7c47d01a9d819ea37e92361aea2 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Mon, 7 Jul 2025 22:54:22 +0200 Subject: [PATCH 1/3] Sema: suppress deprecated field warnings in implicit special-member functions Only explicit uses of deprecated fields should warn. Defaulted constructors and copy/move assignment operators (when implicitly generated) no longer trigger -Wdeprecated-declarations. * In SemaExpr.cpp, early-return in DiagnoseUseOfDecl for implicit SM. * Add lit regression test in clang/test/SemaCXX/deprecated-no-implicit-warning.cpp. Fixes: https://github.com/llvm/llvm-project/issues/147293 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaAvailability.cpp | 22 + .../implicit-special-member-deprecated.cpp| 24 +++ 2 files changed, 46 insertions(+) create mode 100644 clang/test/Sema/implicit-special-member-deprecated.cpp diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index 8c6a17301fba6..a3ff53abd3188 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -452,6 +452,28 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, } } } + // Suppress -Wdeprecated-declarations in purely implicit special-member functions. + if (K == AR_Deprecated) { +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Implicit, defaulted constructor (default / copy / move) + if (auto *CD = dyn_cast(FD)) { +if (CD->isImplicit() && CD->isDefaulted()) + return; + } + //Implicit, defaulted destructor + if (auto *DD = dyn_cast(FD)) { +if (DD->isImplicit() && DD->isDefaulted()) + return; + } + //Implicit copy- or move-assignment operator + if (auto *MD = dyn_cast(FD)) { +if (MD->isImplicit() && +(MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) + return; + } +} + } + switch (K) { case AR_NotYetIntroduced: { 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 0..f65fc5171eaab --- /dev/null +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -0,0 +1,24 @@ +// clang/test/Sema/implicit-deprecated-special-member.cpp +// RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s + +struct A { + [[deprecated("use something else")]] int x = 42; // expected-note {{has been explicitly marked deprecated here}} +}; + +A makeDefaultA() {// implicit default ctor: no diagnostics + return {}; +} + +A copyA(const A &a) { // implicit copy ctor: no diagnostics + return a; +} + +void assignA() { + A a, b; + a = b; // implicit copy-assign: no diagnostics +} + +void useA() { + A a; + (void)a.x; // expected-warning {{is deprecated}} +} \ No newline at end of file >From 159e35de70a0d4ada07f8f6bc340a2a3d165b463 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 01:33:39 +0200 Subject: [PATCH 2/3] Docs: add release note for implicit-special-member deprecation fix --- clang/docs/ReleaseNotes.rst| 1 + clang/test/Sema/implicit-special-member-deprecated.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 581338924943b..711e45f44ac6e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -907,6 +907,7 @@ Bug Fixes to C++ Support - Fix a bug where private access specifier of overloaded function not respected. (#GH107629) - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) +- Suppress -Wdeprecated-declarations in implicitly generated special-member functions for deprecated data-members; only explicit uses still warn. (PR #147400, Issue #147293) Bug Fixes to AST Handling ^ diff --git a/clang/test/Sema/implicit-special-member-deprecated.cpp b/clang/test/Sema/implicit-special-member-deprecated.cpp index f65fc5171eaab..6b0042f5d2bb5 100644 --- a/clang/test/Sema/implicit-special-member-deprecated.cpp +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -1,4 +1,3 @@ -// clang/test/Sema/implicit-deprecated-special-member.cpp // RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s struct A { >From 1d206a0a8e147230ce82b20ed70f6feb5f2eda65 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 10:37:41 +0200 Subject: [PATCH 3/3] Sema: move deprecation-suppression into switch, dedupe implicit/defaulted checks - Suppression guard is now inside - Use to coalesce + - Drop PR number from rele
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
shashi1687 wrote: Hi All, I’ve pushed an update addressing the feedback: - Moved the suppression guard into the case AR_Deprecated: block - Used dyn_cast_if_present and combined isImplicit()/isDefaulted() in one check - Consolidated constructor/destructor detection with isa - Removed the FunctionDeck typo—now correctly casting to CXXMethodDecl - Dropped the PR number from the release notes entry All Sema tests (check-clang)pass locally. Please take another look when you have a moment, and let me know if there’s anything else I can improve! Thank you for your guidance, Shashi https://github.com/llvm/llvm-project/pull/147400 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
https://github.com/shashi1687 updated https://github.com/llvm/llvm-project/pull/147400 >From 29c3c9c6d25cc7c47d01a9d819ea37e92361aea2 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Mon, 7 Jul 2025 22:54:22 +0200 Subject: [PATCH 1/3] Sema: suppress deprecated field warnings in implicit special-member functions Only explicit uses of deprecated fields should warn. Defaulted constructors and copy/move assignment operators (when implicitly generated) no longer trigger -Wdeprecated-declarations. * In SemaExpr.cpp, early-return in DiagnoseUseOfDecl for implicit SM. * Add lit regression test in clang/test/SemaCXX/deprecated-no-implicit-warning.cpp. Fixes: https://github.com/llvm/llvm-project/issues/147293 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaAvailability.cpp | 22 + .../implicit-special-member-deprecated.cpp| 24 +++ 2 files changed, 46 insertions(+) create mode 100644 clang/test/Sema/implicit-special-member-deprecated.cpp diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index 8c6a17301fba6..a3ff53abd3188 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -452,6 +452,28 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, } } } + // Suppress -Wdeprecated-declarations in purely implicit special-member functions. + if (K == AR_Deprecated) { +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Implicit, defaulted constructor (default / copy / move) + if (auto *CD = dyn_cast(FD)) { +if (CD->isImplicit() && CD->isDefaulted()) + return; + } + //Implicit, defaulted destructor + if (auto *DD = dyn_cast(FD)) { +if (DD->isImplicit() && DD->isDefaulted()) + return; + } + //Implicit copy- or move-assignment operator + if (auto *MD = dyn_cast(FD)) { +if (MD->isImplicit() && +(MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) + return; + } +} + } + switch (K) { case AR_NotYetIntroduced: { 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 0..f65fc5171eaab --- /dev/null +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -0,0 +1,24 @@ +// clang/test/Sema/implicit-deprecated-special-member.cpp +// RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s + +struct A { + [[deprecated("use something else")]] int x = 42; // expected-note {{has been explicitly marked deprecated here}} +}; + +A makeDefaultA() {// implicit default ctor: no diagnostics + return {}; +} + +A copyA(const A &a) { // implicit copy ctor: no diagnostics + return a; +} + +void assignA() { + A a, b; + a = b; // implicit copy-assign: no diagnostics +} + +void useA() { + A a; + (void)a.x; // expected-warning {{is deprecated}} +} \ No newline at end of file >From 159e35de70a0d4ada07f8f6bc340a2a3d165b463 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 01:33:39 +0200 Subject: [PATCH 2/3] Docs: add release note for implicit-special-member deprecation fix --- clang/docs/ReleaseNotes.rst| 1 + clang/test/Sema/implicit-special-member-deprecated.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 581338924943b..711e45f44ac6e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -907,6 +907,7 @@ Bug Fixes to C++ Support - Fix a bug where private access specifier of overloaded function not respected. (#GH107629) - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) +- Suppress -Wdeprecated-declarations in implicitly generated special-member functions for deprecated data-members; only explicit uses still warn. (PR #147400, Issue #147293) Bug Fixes to AST Handling ^ diff --git a/clang/test/Sema/implicit-special-member-deprecated.cpp b/clang/test/Sema/implicit-special-member-deprecated.cpp index f65fc5171eaab..6b0042f5d2bb5 100644 --- a/clang/test/Sema/implicit-special-member-deprecated.cpp +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -1,4 +1,3 @@ -// clang/test/Sema/implicit-deprecated-special-member.cpp // RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s struct A { >From 1d206a0a8e147230ce82b20ed70f6feb5f2eda65 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 10:37:41 +0200 Subject: [PATCH 3/3] Sema: move deprecation-suppression into switch, dedupe implicit/defaulted checks - Suppression guard is now inside - Use to coalesce + - Drop PR number from rele
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
https://github.com/shashi1687 edited https://github.com/llvm/llvm-project/pull/147400 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] suppress deprecated field warnings in implicit special-member functions (PR #147400)
https://github.com/shashforge updated https://github.com/llvm/llvm-project/pull/147400 >From 29c3c9c6d25cc7c47d01a9d819ea37e92361aea2 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Mon, 7 Jul 2025 22:54:22 +0200 Subject: [PATCH 1/3] Sema: suppress deprecated field warnings in implicit special-member functions Only explicit uses of deprecated fields should warn. Defaulted constructors and copy/move assignment operators (when implicitly generated) no longer trigger -Wdeprecated-declarations. * In SemaExpr.cpp, early-return in DiagnoseUseOfDecl for implicit SM. * Add lit regression test in clang/test/SemaCXX/deprecated-no-implicit-warning.cpp. Fixes: https://github.com/llvm/llvm-project/issues/147293 Signed-off-by: Shashi Shankar --- clang/lib/Sema/SemaAvailability.cpp | 22 + .../implicit-special-member-deprecated.cpp| 24 +++ 2 files changed, 46 insertions(+) create mode 100644 clang/test/Sema/implicit-special-member-deprecated.cpp diff --git a/clang/lib/Sema/SemaAvailability.cpp b/clang/lib/Sema/SemaAvailability.cpp index 8c6a17301fba6..a3ff53abd3188 100644 --- a/clang/lib/Sema/SemaAvailability.cpp +++ b/clang/lib/Sema/SemaAvailability.cpp @@ -452,6 +452,28 @@ static void DoEmitAvailabilityWarning(Sema &S, AvailabilityResult K, } } } + // Suppress -Wdeprecated-declarations in purely implicit special-member functions. + if (K == AR_Deprecated) { +if (const FunctionDecl *FD = S.getCurFunctionDecl()) { + // Implicit, defaulted constructor (default / copy / move) + if (auto *CD = dyn_cast(FD)) { +if (CD->isImplicit() && CD->isDefaulted()) + return; + } + //Implicit, defaulted destructor + if (auto *DD = dyn_cast(FD)) { +if (DD->isImplicit() && DD->isDefaulted()) + return; + } + //Implicit copy- or move-assignment operator + if (auto *MD = dyn_cast(FD)) { +if (MD->isImplicit() && +(MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator())) + return; + } +} + } + switch (K) { case AR_NotYetIntroduced: { 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 0..f65fc5171eaab --- /dev/null +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -0,0 +1,24 @@ +// clang/test/Sema/implicit-deprecated-special-member.cpp +// RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s + +struct A { + [[deprecated("use something else")]] int x = 42; // expected-note {{has been explicitly marked deprecated here}} +}; + +A makeDefaultA() {// implicit default ctor: no diagnostics + return {}; +} + +A copyA(const A &a) { // implicit copy ctor: no diagnostics + return a; +} + +void assignA() { + A a, b; + a = b; // implicit copy-assign: no diagnostics +} + +void useA() { + A a; + (void)a.x; // expected-warning {{is deprecated}} +} \ No newline at end of file >From 159e35de70a0d4ada07f8f6bc340a2a3d165b463 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 01:33:39 +0200 Subject: [PATCH 2/3] Docs: add release note for implicit-special-member deprecation fix --- clang/docs/ReleaseNotes.rst| 1 + clang/test/Sema/implicit-special-member-deprecated.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 581338924943b..711e45f44ac6e 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -907,6 +907,7 @@ Bug Fixes to C++ Support - Fix a bug where private access specifier of overloaded function not respected. (#GH107629) - Correctly handle allocations in the condition of a ``if constexpr``.(#GH120197) (#GH134820) - Fixed a crash when handling invalid member using-declaration in C++20+ mode. (#GH63254) +- Suppress -Wdeprecated-declarations in implicitly generated special-member functions for deprecated data-members; only explicit uses still warn. (PR #147400, Issue #147293) Bug Fixes to AST Handling ^ diff --git a/clang/test/Sema/implicit-special-member-deprecated.cpp b/clang/test/Sema/implicit-special-member-deprecated.cpp index f65fc5171eaab..6b0042f5d2bb5 100644 --- a/clang/test/Sema/implicit-special-member-deprecated.cpp +++ b/clang/test/Sema/implicit-special-member-deprecated.cpp @@ -1,4 +1,3 @@ -// clang/test/Sema/implicit-deprecated-special-member.cpp // RUN: %clang_cc1 -std=c++20 -Wdeprecated-declarations -verify %s struct A { >From 1d206a0a8e147230ce82b20ed70f6feb5f2eda65 Mon Sep 17 00:00:00 2001 From: Shashi Shankar Date: Tue, 8 Jul 2025 10:37:41 +0200 Subject: [PATCH 3/3] Sema: move deprecation-suppression into switch, dedupe implicit/defaulted checks - Suppression guard is now inside - Use to coalesce + - Drop PR number from rele