diff --git a/clang/test/Analysis/PR46264.cpp b/clang/test/Analysis/PR46264.cpp --- a/clang/test/Analysis/PR46264.cpp +++ b/clang/test/Analysis/PR46264.cpp @@ -33,3 +33,27 @@ return 10; } + +// PR46264 +// This case shall not crash with an assertion failure about void* dereferening. +namespace ns1 { +namespace a { +class b { +public: + typedef int b::*c; + operator c() { return d ? &b::d : 0; } + int d; +}; +} // namespace a +using a::b; +class e { + void f(); + void g(); + b h; +}; +void e::f() { + e *i; + if (h) + i->g(); // expected-warning{{Called C++ object pointer is uninitialized}} +} +} // namespace ns1 diff --git a/clang/test/Analysis/diagnostics/PR46264.cpp b/clang/test/Analysis/diagnostics/PR46264.cpp deleted file mode 100644 --- a/clang/test/Analysis/diagnostics/PR46264.cpp +++ /dev/null @@ -1,36 +0,0 @@ -// 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