You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
1.7 KiB
108 lines
1.7 KiB
4 months ago
|
// 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
|