https://github.com/snarang181 updated 
https://github.com/llvm/llvm-project/pull/150003

>From ff5dfd4fae47cd212a0882895396c0cb855e29a3 Mon Sep 17 00:00:00 2001
From: Samarth Narang <snar...@umass.edu>
Date: Tue, 22 Jul 2025 07:38:22 -0400
Subject: [PATCH 1/3] [Sema] Avoid attaching 'noreturn' attribute to explicit
 function template specializations

---
 clang/lib/Sema/SemaDecl.cpp     | 8 ++++++++
 clang/lib/Sema/SemaDeclAttr.cpp | 3 +++
 2 files changed, 11 insertions(+)

diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 14403e65e8f42..bb412ef6788e7 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -3267,6 +3267,14 @@ void Sema::mergeDeclAttributes(NamedDecl *New, Decl *Old,
     if (isa<UsedAttr>(I) || isa<RetainAttr>(I))
       continue;
 
+    if (isa<InferredNoReturnAttr>(I)) {
+      if (auto *FD = dyn_cast<FunctionDecl>(New)) {
+        if (FD->getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
+          continue; // Don't propagate inferred noreturn attributes to explicit
+                    // specializations.
+      }
+    }
+
     if (mergeDeclAttribute(*this, New, I, LocalAMK))
       foundAny = true;
   }
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 78f4804202ddc..a61d10c166578 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -1970,6 +1970,9 @@ void clang::inferNoReturnAttr(Sema &S, const Decl *D) {
   if (!FD)
     return;
 
+  if (FD->getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
+    return; // Don't infer noreturn for explicit specializations.
+
   auto *NonConstFD = const_cast<FunctionDecl *>(FD);
   DiagnosticsEngine &Diags = S.getDiagnostics();
   if (Diags.isIgnored(diag::warn_falloff_nonvoid, FD->getLocation()) &&

>From eba957a9674942eae435b7693f7b6228b5ec63a6 Mon Sep 17 00:00:00 2001
From: Samarth Narang <snar...@umass.edu>
Date: Tue, 22 Jul 2025 09:13:20 -0400
Subject: [PATCH 2/3] Add LIT test

---
 clang/test/SemaCXX/wreturn-always-throws.cpp | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/clang/test/SemaCXX/wreturn-always-throws.cpp 
b/clang/test/SemaCXX/wreturn-always-throws.cpp
index addcadd1183dc..c307bc675c14b 100644
--- a/clang/test/SemaCXX/wreturn-always-throws.cpp
+++ b/clang/test/SemaCXX/wreturn-always-throws.cpp
@@ -44,3 +44,18 @@ void testTemplates() {
   throwErrorTemplate("ERROR");
   (void)ensureZeroTemplate(42);
 }
+
+// Ensure that explicit specialization of a member function does not inherit
+// the warning from the primary template.
+
+template<typename T>
+struct S {
+  void f();
+};
+
+template<typename T>
+void S<T>::f() { throw 0; } 
+template<>
+void S<int>::f() {} // expected-no-diagnostics
+
+

>From 0228989202ed928886231436ea2ad65836cf012a Mon Sep 17 00:00:00 2001
From: Samarth Narang <snar...@umass.edu>
Date: Tue, 22 Jul 2025 10:18:50 -0400
Subject: [PATCH 3/3] Update test case

---
 clang/test/SemaCXX/wreturn-always-throws.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/clang/test/SemaCXX/wreturn-always-throws.cpp 
b/clang/test/SemaCXX/wreturn-always-throws.cpp
index c307bc675c14b..279ac2524fbd5 100644
--- a/clang/test/SemaCXX/wreturn-always-throws.cpp
+++ b/clang/test/SemaCXX/wreturn-always-throws.cpp
@@ -51,11 +51,15 @@ void testTemplates() {
 template<typename T>
 struct S {
   void f();
+  void g();
 };
 
 template<typename T>
 void S<T>::f() { throw 0; } 
 template<>
-void S<int>::f() {} // expected-no-diagnostics
-
+void S<int>::f() {}
 
+template<typename T> 
+void S<T>::g() {}  
+template<> 
+void S<int>::g() { throw 0; }
\ No newline at end of file

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to