llvm-project/clang/test/Analysis/dtor-union.cpp
Jameson Nash 9b8297bc7e
[analyzer] Do not destruct fields of unions (#122330)
The C++ standard prohibits this implicit destructor call, leading to
incorrect reports from clang-analyzer. This causes projects that use
std::option (including llvm) to fail the cplusplus.NewDelete test
incorrectly when run through the analyzer.

Fixes #119415
2025-02-07 08:01:39 +01:00

39 lines
1.0 KiB
C++

// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-inlining=destructors -verify -std=c++11 %s
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-config c++-inlining=destructors -verify -std=c++17 %s
void clang_analyzer_eval(bool);
struct InlineDtor {
static int cnt;
static int dtorCalled;
~InlineDtor() {
++dtorCalled;
}
};
int InlineDtor::cnt = 0;
int InlineDtor::dtorCalled = 0;
void testUnionDtor() {
static int unionDtorCalled;
InlineDtor::cnt = 0;
InlineDtor::dtorCalled = 0;
unionDtorCalled = 0;
{
union UnionDtor {
InlineDtor kind1;
char kind2;
~UnionDtor() { unionDtorCalled++; }
};
UnionDtor u1{.kind1{}};
UnionDtor u2{.kind2{}};
auto u3 = new UnionDtor{.kind1{}};
auto u4 = new UnionDtor{.kind2{}};
delete u3;
delete u4;
}
clang_analyzer_eval(unionDtorCalled == 4); // expected-warning {{TRUE}}
clang_analyzer_eval(InlineDtor::dtorCalled == 0); // expected-warning {{TRUE}}
}