[clang] [Analysis] Avoid some warnings about exit from noreturn function (PR #144408)
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 16 12:17:58 PDT 2025
================
@@ -0,0 +1,107 @@
+// RUN: %clang_cc1 -fsyntax-only %s -verify
+
+[[noreturn]] extern void noret();
+[[noreturn]] extern void noret2();
+extern void ordinary();
+
+typedef void (*func_type)(void);
+
+// Constant initialization.
+
+void (* const const_fptr)() = noret;
+[[noreturn]] void test_global_const() {
+ const_fptr();
+}
+
+const func_type const_fptr_cast = (func_type)noret2;
+[[noreturn]] void test_global_cast() {
+ const_fptr_cast();
+}
+
+void (* const const_fptr_list)() = {noret};
+[[noreturn]] void test_global_list() {
+ const_fptr_list();
+}
+
+const func_type const_fptr_fcast = func_type(noret2);
+[[noreturn]] void test_global_fcast() {
+ const_fptr_fcast();
+}
+
+[[noreturn]] void test_local_const() {
+ void (* const fptr)() = noret;
+ fptr();
+}
+
+// Global variable assignment.
+void (*global_fptr)() = noret;
+
+[[noreturn]] void test_global_noassign() {
+ global_fptr();
+} // expected-warning {{function declared 'noreturn' should not return}}
+
+[[noreturn]] void test_global_assign() {
+ global_fptr = noret;
+ global_fptr();
+}
+
+[[noreturn]] void test_global_override() {
+ global_fptr = ordinary;
+ global_fptr = noret;
+ global_fptr();
+}
+
+[[noreturn]] void test_global_switch_01(int x) {
+ switch(x) {
+ case 1:
+ global_fptr = noret;
+ break;
+ default:
+ global_fptr = noret2;
+ break;
+ }
+ global_fptr();
+}
+
+[[noreturn]] void test_global_switch_02(int x) {
+ switch(x) {
+ case 1:
+ global_fptr = ordinary;
+ break;
+ default:
+ global_fptr = noret;
+ break;
+ }
+ global_fptr();
----------------
AaronBallman wrote:
I think it's a bug that we don't emit a diagnostic here. Even barring thread shenanigans, this can very easily lead to returning if `x` is `1`.
https://github.com/llvm/llvm-project/pull/144408
More information about the cfe-commits
mailing list