|  | // RUN: %clang_analyze_cc1 -w -analyzer-checker=core -verify %s | 
|  |  | 
|  | // expected-no-diagnostics | 
|  |  | 
|  | typedef __typeof(sizeof(int)) size_t; | 
|  | void *operator new(size_t, void *h) { return h; } | 
|  |  | 
|  | // I've no idea what this code does, but it used to crash, so let's keep it. | 
|  | namespace pr37802_v1 { | 
|  | struct J { | 
|  | int *p; | 
|  | }; | 
|  | class X { | 
|  | void *ar; | 
|  |  | 
|  | public: | 
|  | X(void *t) : ar(t) {} | 
|  | template <typename T> | 
|  | void f(const T &t) { | 
|  | new (ar) T(t); | 
|  | } | 
|  | }; | 
|  | class Y { | 
|  | public: | 
|  | template <typename T> | 
|  | void f(T &&); | 
|  | void f(J t) { | 
|  | f(*t.p); | 
|  | } | 
|  | }; | 
|  | class Z { | 
|  | int at() const {} | 
|  |  | 
|  | public: | 
|  | Z(const Z &other) { | 
|  | other.au(X(this)); | 
|  | } | 
|  | template <typename T> | 
|  | void au(T t) const { | 
|  | void *c = const_cast<Z *>(this); | 
|  | if (at()) { | 
|  | t.f(*static_cast<J *>(c)); | 
|  | } else { | 
|  | t.f(*static_cast<bool *>(c)); | 
|  | } | 
|  | } | 
|  | }; | 
|  | Z g() { | 
|  | Z az = g(); | 
|  | Z e = az; | 
|  | Y d; | 
|  | e.au(d); | 
|  | } | 
|  | } // namespace pr37802_v1 | 
|  |  | 
|  |  | 
|  | // This slightly modified code crashed differently. | 
|  | namespace pr37802_v2 { | 
|  | struct J { | 
|  | int *p; | 
|  | }; | 
|  |  | 
|  | class X { | 
|  | void *ar; | 
|  |  | 
|  | public: | 
|  | X(void *t) : ar(t) {} | 
|  | void f(const J &t) { new (ar) J(t); } | 
|  | void f(const bool &t) { new (ar) bool(t); } | 
|  | }; | 
|  |  | 
|  | class Y { | 
|  | public: | 
|  | void boolf(bool &&); | 
|  | void f(J &&); | 
|  | void f(J t) { boolf(*t.p); } | 
|  | }; | 
|  |  | 
|  | class Z { | 
|  | int at() const {} | 
|  |  | 
|  | public: | 
|  | Z(const Z &other) { other.au(X(this)); } | 
|  | void au(X t) const { | 
|  | void *c = const_cast<Z *>(this); | 
|  | if (at()) { | 
|  | t.f(*static_cast<J *>(c)); | 
|  | } else { | 
|  | t.f(*static_cast<bool *>(c)); | 
|  | } | 
|  | } | 
|  | void au(Y t) const { | 
|  | void *c = const_cast<Z *>(this); | 
|  | if (at()) { | 
|  | t.f(*static_cast<J *>(c)); | 
|  | } else { | 
|  | } | 
|  | } | 
|  | }; | 
|  |  | 
|  | Z g() { | 
|  | Z az = g(); | 
|  | Z e = az; | 
|  | Y d; | 
|  | e.au(d); | 
|  | } | 
|  | } // namespace pr37802_v2 |