llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Samarth Narang (snarang181) <details> <summary>Changes</summary> Implements https://github.com/llvm/llvm-project/issues/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 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 +} `````````` </details> https://github.com/llvm/llvm-project/pull/146234 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits