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

>From c6b4a421c0087a06111df3a6f79b929e7285644b Mon Sep 17 00:00:00 2001
From: Samarth Narang <snar...@umass.edu>
Date: Sat, 28 Jun 2025 15:31:37 -0400
Subject: [PATCH] Emit a suggestion to explicitly mark the function with
 [[noreturn]] if -Wmissing-noreturn is enabled.

---
 clang/docs/ReleaseNotes.rst                   |  3 +--
 clang/lib/Sema/SemaDeclAttr.cpp               |  7 ++++++
 .../SemaCXX/wmissing-noreturn-suggestion.cpp  | 23 +++++++++++++++++++
 3 files changed, 31 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/SemaCXX/wmissing-noreturn-suggestion.cpp

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index d9847fadc21e5..73a2618bb580c 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -654,9 +654,8 @@ Improvements to Clang's diagnostics
   a call to a function that is trivially known to always throw (i.e., its
   body consists solely of a `throw` statement). This avoids certain
   false positives in exception-heavy code, though only simple patterns
-  are currently recognized.
+  are currently recognized. Additionally, if -Wmissing-noreturn is enabled, 
emit a suggestion to explicitly mark the function with [[noreturn]].
 
-  
 Improvements to Clang's time-trace
 ----------------------------------
 
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 52313e6a15ff1..e7da8e673a9ec 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -1979,6 +1979,13 @@ void clang::inferNoReturnAttr(Sema &S, const Decl *D) {
   if (!FD->hasAttr<NoReturnAttr>() && !FD->hasAttr<InferredNoReturnAttr>() &&
       isKnownToAlwaysThrow(FD)) {
     NonConstFD->addAttr(InferredNoReturnAttr::CreateImplicit(S.Context));
+
+    // Conditionally, emit the suggestion warning.
+    if (!Diags.isIgnored(diag::warn_suggest_noreturn_function,
+                         FD->getLocation())) {
+      S.Diag(FD->getLocation(), diag::warn_suggest_noreturn_function)
+          << 0 << FD;
+    }
   }
 }
 
diff --git a/clang/test/SemaCXX/wmissing-noreturn-suggestion.cpp 
b/clang/test/SemaCXX/wmissing-noreturn-suggestion.cpp
new file mode 100644
index 0000000000000..7548ba8904a71
--- /dev/null
+++ b/clang/test/SemaCXX/wmissing-noreturn-suggestion.cpp
@@ -0,0 +1,23 @@
+// RUN: %clang_cc1 -fsyntax-only -fcxx-exceptions -fexceptions -Wreturn-type 
-Wmissing-noreturn -verify %s
+
+namespace std {
+  class string {
+  public:
+    string(const char*);
+  };
+  class runtime_error {
+  public:
+    runtime_error(const string&);
+  };
+}
+
+// This function always throws. Suggest [[noreturn]].
+void throwError(const std::string& msg) { // expected-warning {{function 
'throwError' could be declared with attribute 'noreturn'}}
+  throw std::runtime_error(msg);
+}
+
+// The non-void caller should not warn about missing return.
+int ensureZero(int i) {
+  if (i == 0) return 0;
+  throwError("ERROR"); // no-warning
+}

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

Reply via email to