| // 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}} | |
| } |