[nullability] New test: Calling a `noreturn` destructor is considered to terminate the program. Among other things, this is intended to demonstrate that Abseil's logging instruction `LOG(FATAL)` (which creates an object with a `noreturn` destructor) is correctly interpreted as terminating the program. PiperOrigin-RevId: 576141364 Change-Id: I712c134919a3c6aeecd34fc22859e72422835288
diff --git a/nullability/test/function_calls.cc b/nullability/test/function_calls.cc index e9d9434..6748432 100644 --- a/nullability/test/function_calls.cc +++ b/nullability/test/function_calls.cc
@@ -644,5 +644,26 @@ )cc")); } +TEST(PointerNullabilityTest, CallNoreturnDestructor) { + // This test demonstrates that the check considers program execution to end + // when a `noreturn` destructor is called. + // Among other things, this is intended to demonstrate that Abseil's logging + // instruction `LOG(FATAL)` (which creates an object with a `noreturn` + // destructor) is correctly interpreted as terminating the program. + EXPECT_TRUE(checkDiagnostics(R"cc( + struct Fatal { + __attribute__((noreturn)) ~Fatal(); + void method(int); + }; + void target(int* _Nullable p) { + // Do warn here, as the `*p` dereference happens before the `Fatal` object + // is destroyed. + Fatal().method(*p); // [[unsafe]] + // Don't warn here: We know that this code never gets executed. + *p; + } + )cc")); +} + } // namespace } // namespace clang::tidy::nullability