[clang] Sema: filter out invalid base-specifiers before attaching (PR #147213)

2025-07-06 Thread Shashi Shankar via cfe-commits

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)

2025-07-08 Thread Shashi Shankar via cfe-commits


@@ -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)

2025-07-08 Thread Shashi Shankar via cfe-commits

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)

2025-07-08 Thread Shashi Shankar via cfe-commits

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)

2025-07-06 Thread Shashi Shankar via cfe-commits

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)

2025-07-06 Thread Shashi Shankar via cfe-commits

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)

2025-07-06 Thread Shashi Shankar via cfe-commits

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)

2025-07-06 Thread Shashi Shankar via cfe-commits

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)

2025-07-07 Thread Shashi Shankar via cfe-commits

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)

2025-07-07 Thread Shashi Shankar via cfe-commits

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)

2025-07-07 Thread Shashi Shankar via cfe-commits

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)

2025-07-08 Thread Shashi Shankar via cfe-commits

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)

2025-07-08 Thread Shashi Shankar via cfe-commits


@@ -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)

2025-07-08 Thread Shashi Shankar via cfe-commits


@@ -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)

2025-07-09 Thread Shashi Shankar via cfe-commits

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)

2025-07-09 Thread Shashi Shankar via cfe-commits

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)

2025-07-09 Thread Shashi Shankar via cfe-commits

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)

2025-07-08 Thread Shashi Shankar via cfe-commits

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)

2025-07-08 Thread Shashi Shankar via cfe-commits

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)

2025-07-08 Thread Shashi Shankar via cfe-commits

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)

2025-07-08 Thread Shashi Shankar via cfe-commits

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)

2025-07-11 Thread Shashi Shankar via cfe-commits

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)

2025-07-11 Thread Shashi Shankar via cfe-commits

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)

2025-07-11 Thread Shashi Shankar via cfe-commits

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)

2025-07-11 Thread Shashi Shankar via cfe-commits

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)

2025-07-18 Thread Shashi Shankar via cfe-commits

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