<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/64951>64951</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [libc++abi] coredump case of __dynamic_cast
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Jolyon0202
      </td>
    </tr>
</table>

<pre>
    We found a testcast(from dejac++) coredump when using libc++'s dynamic_cast. And we are not sure that it's used ro crash while looking in A for my_module. The test case if here: https://godbolt.org/z/6rh6zf88e

`
extern "C" int puts (const char *);
extern "C" void abort ();

struct my_object
{
 my_object() { puts ("in my_object ctor");}
  virtual ~my_object() { puts ("in my_object dtor"); }
};

my_object* my_module_ptr = 0;

struct my_module : my_object
{
  my_module()
  {
 puts ("in my_module ctor, setting up ptr");
    my_module_ptr = this;
  }
  ~my_module() { puts ("in my_module dtor");}
};

struct D
{
  D() { puts ("in D ctor"); }
 virtual ~D();
};

D::~D()
{
  puts ("in D dtor");
  puts ("before DCASTing to my_module*");
  if (my_module_ptr == 0){
 puts ("nullptr");
  }
  my_module* m = dynamic_cast<my_module*>(my_module_ptr);
  puts ("ok");
  if (m != my_module_ptr){
    puts ("abort");
    abort ();
}
  puts ("after DCASTing to my_module*");
}

struct my_interface
{
 my_interface() { puts ("in my_interface ctor");}
  ~my_interface() { puts ("in my_interface dtor");}
};

struct myif : virtual my_interface
{
  myif() { puts ("in myif ctor");}
  ~myif() { puts ("in myif dtor");}
};

struct A: virtual myif
{
  A() { puts ("in A ctor"); }
  ~A() { puts ("in A dtor"); }
  D d;
};

struct B: virtual myif
{
  B() { puts ("in B ctor"); }
  ~B() { puts ("in B dtor"); }
  D d;
};

struct C : my_module, A, B
{
  C() { puts ("in C ctor");}
  ~C() { puts ("in C dtor"); }
};

int main(int, char**)
{
  C t;
}
`

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVkuPozgQ_jXmUpqImITHgQOBzWGvO9IeI4NN8AzYkW26N3Po374yoQMJj-lopBaN4q---urhoojW_CwYi9H-gPaZQ1pTSRX_LeurFC52sZNLeo3_ZVDKVlAgYJg2BdEG4bBUsgHKfpAC4UP3F0EhFaNtc4H3igloNRdnqHl-RwQa6FWQhhcny7KBRFB4Z0AUAyEN6FYxMBUxwE2HbjWjoCQUiugK3iteM6il_GmJuYAESqmguZ4aSduabeB7xTqNUBDNgJdQMcWQl0BlzEUjL0H4iPDxLGkua7OR6ozw8RfCR19V_q8yDBlyM-Qm_dN3by_sP8OUAIRxijAGLgxcWqMB4bCQwrqriAKEE4Qj5B1mjd4kp0ByqYw1GwNvT21UWxgbjMx_sML0Z0EPGh101oCCw10EwpiLAQGFkQph3DsJsp4C3rgyLanh4xUyOiaDO5t9eYxgRJoMRTldjALkZeAuBnwDgq3TYvgDrs9e__OAmOjvaW_JSEEzY2zftBe4mFF6eiKYkWwqrkeQUSY_nuTMZ7BXQGfLMU1gn5FsEnu26CR7rPVI4r3W2XO7Tfxm9mJ4yR357P7Z5WM8U1DOSqkYZGnyz3ebcSPH1Usmpry0hpP035oGR7MlFm1dz5VxVKOxT2i6go6nD_LSB1XeX88iFgOUP5diAIS31tGEJxg12oipGwgzvTg_KIbYxhSlYeqryR667-kOcmGYKknBZubOcLbS63fQ4vT5eJ3qxZvTXG0ZvKH51wLr0CsyeLkWye9MX1SePKrm5URtsugvWZwB8LFmtTDYwd7wlWnRKz78VvFh0fdhRfGa1Z8pTj-_MJ-XI7VJTeEwUZ4uakiXe2LN6MvfULtaNIQLhEMujFVnV4vuHidzozkFM3O3P_cWh8YejbyIOCze-hEOfc_DrlPFmISY7HLiEcZ8smdku6XED_0wIEUZ4NLhMXax54Z45wa7cOduKMY0CvfbvRsVQUkJ2rmsIbze1PVbYxcph2vdstjfRfutU5Oc1brbKzEW7B26Q5uBfeao2Np8y9uzRju35trogcVwU3cL6bA3kpyjfTYsl91uJ0s4ncbj3GlVHT-tedxUbb4pZIPw0Xro_327KHnbU46dLm0XQKv7_wAAAP__qKcW1w">