| // RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=text -verify %s |
| |
| // PR46264 |
| // This case shall not crash with an assertion failure about void* dereferening. |
| // The crash has been last seen on commit |
| // `3ed8ebc2f6b8172bed48cc5986d3b7af4cfca1bc` from 24.05.2020. |
| namespace ns1 { |
| namespace a { |
| class b { |
| public: |
| typedef int b::*c; |
| operator c() { return d ? &b::d : 0; } |
| // expected-note@-1{{'?' condition is true}} |
| // expected-note@-2{{Assuming field 'd' is not equal to 0}} |
| // expected-note@-3{{Returning value, which participates in a condition later}} |
| int d; |
| }; |
| } // namespace a |
| using a::b; |
| class e { |
| void f(); |
| void g(); |
| b h; |
| }; |
| void e::f() { |
| e *i; |
| // expected-note@-1{{'i' declared without an initial value}} |
| if (h) |
| // expected-note@-1{{Taking true branch}} |
| // expected-note@-2{{'b::operator int ns1::a::b::*'}} |
| // expected-note@-3{{Returning from 'b::operator int ns1::a::b::*'}} |
| i->g(); |
| // expected-note@-1{{Called C++ object pointer is uninitialized}} |
| // expected-warning@-2{{Called C++ object pointer is uninitialized}} |
| } |
| } // namespace ns1 |