Skip to content

[clang] [Sema] Suggest [[noreturn]] for void functions that always throw #146234

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

snarang181
Copy link
Contributor

@snarang181 snarang181 commented Jun 28, 2025

Implements #146223.

@snarang181 snarang181 force-pushed the clang-emit-noreturn-suggestion branch from 6f450c2 to c6b4a42 Compare June 28, 2025 19:34
@snarang181 snarang181 marked this pull request as ready for review June 28, 2025 19:50
@llvmbot llvmbot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" labels Jun 28, 2025
@llvmbot
Copy link
Member

llvmbot commented Jun 28, 2025

@llvm/pr-subscribers-clang

Author: Samarth Narang (snarang181)

Changes

Implements #146223.


Full diff: https://github.com/llvm/llvm-project/pull/146234.diff

3 Files Affected:

  • (modified) clang/docs/ReleaseNotes.rst (+1-2)
  • (modified) clang/lib/Sema/SemaDeclAttr.cpp (+7)
  • (added) clang/test/SemaCXX/wmissing-noreturn-suggestion.cpp (+23)
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
+}

@snarang181 snarang181 force-pushed the clang-emit-noreturn-suggestion branch from c6b4a42 to 1c9aa48 Compare June 29, 2025 15:16
@snarang181 snarang181 force-pushed the clang-emit-noreturn-suggestion branch from 1c9aa48 to 8a0e8f8 Compare June 29, 2025 15:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants