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