https://github.com/term-est created 
https://github.com/llvm/llvm-project/pull/148695

The following snippet,

```c++
#include <cassert>
#include <stdexcept>

[[noreturn]] void foo() { throw std::runtime_error("Why...?"); }

int main() {
    try {
        foo();
    } catch (std::runtime_error const& ex) {
        (void)ex;
    }
}
```

is diagnosed with `error: function 'foo' could be declared with attribute 
'noreturn' [-Werror,-Wmissing-noreturn]` when compiled with clang_trunk using 
`-Werror=missing-noreturn` flag. See more at 
[godbolt](https://godbolt.org/z/5zMsev4as)


AST shows
```
| `-CXX11NoReturnAttr 0x1896e81eb00 <line:2:20> Inherited noreturn
|-FunctionDecl 0x1896e81ebd8 <line:10:14, col:46> col:19 used foo 'void ()'
| |-CompoundStmt 0x1896e81ee20 <col:25, col:46>
| | `-CXXThrowExpr 0x1896e81ee08 <col:27, col:43> 'void'
| |   `-ImplicitCastExpr 0x1896e81edf0 <col:33, col:43> 'const char *' 
<ArrayToPointerDecay>
| |     `-ParenExpr 0x1896e81eda0 <col:33, col:43> 'const char[8]' lvalue
| |       `-StringLiteral 0x1896e81ed80 <col:34> 'const char[8]' lvalue 
"Why...?"
| |-CXX11NoReturnAttr 0x1896e81ec80 <col:3> noreturn
| `-InferredNoReturnAttr 0x1896e81ee38 <<invalid sloc>> Implicit
```

but the responsible code only checks for `NoReturnAttr`, adding a check for 
`CXX11NoReturnAttr` before emitting the diagnostic should fix this issue.

>From f8082dde0f087436df3c6e8e2f36099893f1dae4 Mon Sep 17 00:00:00 2001
From: term-est <eurasia.s...@gmail.com>
Date: Mon, 14 Jul 2025 21:07:58 +0300
Subject: [PATCH] Fix an issue where we erroneously diagnose a `[[noreturn]]`
 function with `warn_suggest_noreturn_function`

---
 clang/lib/Sema/SemaDeclAttr.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index 099207727c8c8..6d0a5d71d49ff 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -1976,7 +1976,7 @@ void clang::inferNoReturnAttr(Sema &S, const Decl *D) {
       Diags.isIgnored(diag::warn_suggest_noreturn_function, FD->getLocation()))
     return;
 
-  if (!FD->hasAttr<NoReturnAttr>() && !FD->hasAttr<InferredNoReturnAttr>() &&
+  if (!FD->hasAttr<NoReturnAttr>() && !FD->hasAttr<CXX11NoReturnAttr>() && 
!FD->hasAttr<InferredNoReturnAttr>() &&
       isKnownToAlwaysThrow(FD)) {
     NonConstFD->addAttr(InferredNoReturnAttr::CreateImplicit(S.Context));
 

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

Reply via email to