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