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