mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-26 11:36:06 +00:00

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
39 lines
1.0 KiB
C++
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}}
|
|
}
|