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

    <tr>
        <th>Summary</th>
        <td>
            crash on invalid if derived-to-base conversion is performed on incomplete class
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            bug,
            c++,
            clang:frontend,
            accepts-invalid
      </td>
    </tr>

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

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

<pre>
    Testcase:

```
struct B { void f() {} };

struct D : B {
    static D d;
    static constexpr B *b = &d;
    int x;
};

static_assert(sizeof(D) == sizeof(int));
```

This results in a derived-to-base conversion being performed on `D*` before `D` is complete. Record layout asserts because it's asked to lay out an incomplete type. (In a non-asserts build, we can instead see wrong code generation because record layout is performed before the complete set of members of `D`, including `x`, is known. For example, the `static_assert` fails.)

Presumably we're missing a `RequireCompleteType` somewhere.

There's a similar issue for derived-to-base pointer-to-member conversions, but this one only seems to be an accepts-invalid rather than an assert or wrong-code bug:

```
struct D2 : B {
    static constexpr void (D2::*sm)() = &B::f;
};
```

(Testcase derived from one by @daveedvdv, with permission to use in our test suite.)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVM2O6jgTfRqzKYGM0ySwyKLpCOnbfbrq_ciOK8RzHZtxOXRzn35UCdAw07oayQq4bJ_6OXVKE7ljQKzFZi82zUKPuY-p_nU5Rh-dXZhoL_U7Um41oShehWyEvH1LeV3TlnIa2wx7ENUeztFZ6ITaCrVjg6gaEFUjiv0jwvVJA6J4nR_OdgAAyjq7Fhqw90cP5jYGyvh5SvxMvRoQRQNClc-XXcjw-eXzG_8M9ocmwpSF2pL7hZGjbqawi4ZR70YXslA7XneU5wrM3_feESSk0WcCF0CDxeTOaJc5Lo0m5ODPmMjFAAZdOMIJUxfTgBZiAFHKRijGBoNdTDhbSgmOoI3DyWPGFfzANiYLXl_imGFOgcBgq0dCcFmoikDTT7SQI1-D6V4AF24gkC8nXIFQ2_9xmCGG5R1ndN4K9QYfCO30iDJqC4QIHymGI7TRIhwxYNJ5zmT2nJ7icvSQ3DWd3OM9DyDMEDsYcDCYiP9es2XnLrR-tFwhUcrPm5HgZ4gfYQWHmAA_NSPxAeOKUj6TWkrotPO0Yt4eWPo_MzRo4y_wgUJVCWFwROxLM8oP_Gt0Cd-ucb5fTshYFAf86DHh6plyTDgXHMgNzusEjmhE6GL6F_2n6ELGxPs57YeGIE7EjBkyd1EMCDH4C5d9IObRIFOo2xZPmZYunLV3FpLOPSbIPZ-FazNATDNVy4kqMx7_k34b9Rs1fsluEjgrRTFq8SrUKw2TPLZX7bAc9_Nh970Gv1OPUNvbuLkVDroUh6kW5gLiRVp9RrRne5760-WeW2wiLwau0dT_AeKYICNloNFlZP4Xti7srtjpBdbrsiqKrSpktejrsrOV3BSy2ODOVEqt17v1Fg0a1a4326pcuFpJVcj1WiqpNrJaVdaUuGkNdrjValOKF4mDdn7l_XlYxXRcTPzXm91OyYXXBj1NM1YpJkIpod6EUq1Q-2nd9l4HpqlLMWQM9n7wD8bZvmkWqWZ3SzMeSbxI7yjTVwDZZY91mzT1PFZuveK6382jJ73Gp2HRek20GJOv-5xPNHF-EOpwdLkfzaqNg1AH9n79WZ5S_BPbLNRhqgUJdZjK8XcAAAD__1pABHM">