brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · 9acfeba Raw
108 lines · cpp
1// RUN: %clang_analyze_cc1 -w -analyzer-checker=core -verify %s2 3// expected-no-diagnostics4 5typedef __typeof(sizeof(int)) size_t;6void *operator new(size_t, void *h) { return h; }7 8// I've no idea what this code does, but it used to crash, so let's keep it.9namespace pr37802_v1 {10struct J {11  int *p;12};13class X {14  void *ar;15 16public:17  X(void *t) : ar(t) {}18  template <typename T>19  void f(const T &t) {20    new (ar) T(t);21  }22};23class Y {24public:25  template <typename T>26  void f(T &&);27  void f(J t) {28    f(*t.p);29  }30};31class Z {32  int at() const {}33 34public:35  Z(const Z &other) {36    other.au(X(this));37  }38  template <typename T>39  void au(T t) const {40    void *c = const_cast<Z *>(this);41    if (at()) {42      t.f(*static_cast<J *>(c));43    } else {44      t.f(*static_cast<bool *>(c));45    }46  }47};48Z g() {49  Z az = g();50  Z e = az;51  Y d;52  e.au(d);53}54} // namespace pr37802_v155 56 57// This slightly modified code crashed differently.58namespace pr37802_v2 {59struct J {60  int *p;61};62 63class X {64  void *ar;65 66public:67  X(void *t) : ar(t) {}68  void f(const J &t) { new (ar) J(t); }69  void f(const bool &t) { new (ar) bool(t); }70};71 72class Y {73public:74  void boolf(bool &&);75  void f(J &&);76  void f(J t) { boolf(*t.p); }77};78 79class Z {80  int at() const {}81 82public:83  Z(const Z &other) { other.au(X(this)); }84  void au(X t) const {85    void *c = const_cast<Z *>(this);86    if (at()) {87      t.f(*static_cast<J *>(c));88    } else {89      t.f(*static_cast<bool *>(c));90    }91  }92  void au(Y t) const {93    void *c = const_cast<Z *>(this);94    if (at()) {95      t.f(*static_cast<J *>(c));96    } else {97    }98  }99};100 101Z g() {102  Z az = g();103  Z e = az;104  Y d;105  e.au(d);106}107} // namespace pr37802_v2108