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

    <tr>
        <th>Summary</th>
        <td>
            [clang] erroneous UBSAN report 
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    Compile the following C++ with `-fsanitize=undefined -O1`:

```c++
template <class T>
auto make() {
  return T{};
}

template <class T>
struct box {
  T t;
  box() : t(make<T>()) {}
};

template <class A, class B>
struct pair : box<A>, box<B> {
};

struct A {};

template <class A>
struct B {
  B() {
    box<B>* pbox = reinterpret_cast<box<B>*>(this);
 (void)static_cast<pair<A, B>*>(pbox);
  }
};

int main() {
 pair<A, B<A>> p;
}
```

Executing the following code results in:

```
/app/example.cpp:25:11: runtime error: downcast of address 0x7fff4fa07ff6 with insufficient space for an object of type 'pair<A, B<A>>'
0x7fff4fa07ff6: note: pointer points here
 e7 fe c4 60 00 00  90 9d 42 13 15 7a 00 00  08 81 a0 4f ff 7f 00 00  98 ae e7 fe c4 60 00 00  60 4f
             ^ 
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /app/example.cpp:25:11 
```

The problem seems to happen when casting pointers to objects that are only partially constructed.

GCC's UB sanitizer accepts the code without complaint:
https://godbolt.org/z/1hzcMosov

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx8VU9v-ygQ_TTkMmqEIYnjgw-J0-ypu9K2PexphfE4ZhcDAtx_n_4nbCdN218bWcEwzJvnNzMgQlAng1iS9Z6sDwsxxM76Er2SRmGt0S9q27yWle2d0gixQ2it1vZZmRNUhO0J28Ozih2QDb1pgzAqqjck_DCYBltlsIGbvzKyoYTvCD0Qev7f0OmRE8i0GrF3WkQEwiupRQjwQPjtZBNDtNCL_5GwLWEFkHx2AvAYB2_gIS3lB8JnQ3q_CvkTeIh-kBFq-3KN-wDxAgbJeA7NdxAJ245seDXCjJYzr0vgazbfkNgRVsH0uv_Mxwnlx2gpNq92Y6BqnqXd72y_hpoxdvBZlm-JfIq-v9Zi_1V2uCJC2A7cKB8_gEdlInrnMf4rRYiEVx92TnrFToWk2UVhwrZPVjWEFSGKqOTZN6kwfj2r4AOCG1NyhQA_KK9MhF4o8-U7PsFPKvNbcL8ppHPVXgPfvqAcYmqIj-0hbYPgMQw6BlDmuwaYp-wonCPsiC-idxqX0jnCd2xN-C7LUgn4wUTVI6D31qeFxj6bpBDYFkTTeAwB6Evetu2qFTRv283UmcqEoW2VVGgiBCdkIulBGLD1fyhH__jqEAjLv9GCsHyi-RE_sTA2YhqdHXM-jQE69Djrizm0CHIFGwp0fKCgUDSwYpBxyNaQi7OBbmGbgaCwaqFtIW8vHlsQ-DuoTdr7XpGXH1nfwrR8_3h3t_v7n0Ty8Xwo7bETT8r6-_nAGgW9HFk39WyGn9MCP1TFQ4fgvK019hAQ-wDRQiecQwPPHRpIqUtlMgs32qeEBIidiCA8gjX6FZzwUQmtX0FaM_UmNsvrYH9UFWF5gMc9nI9gD0JKdCMYTrWYqsEOEaRNra9MvJRkF6MLacaOhB1PtqmtjkvrT4Qd3wg7Zt2bvLPBPk3bF03Jm4IXYoFlljPGC7qm2aIrt7jOG4lM5GuarXLJOZfbgsm22XLJN_VClYyyFc15RrPVlmVLXmS0XeVFsS42rNhkZEWxF0ovtX7qE4OFCmHAMqMZyzcLLWrUYbyuGJNamBNhLN1cvkwON_VwCmRFtQoxvENEFfV4x00e68PYRAbtkCS73_0JHp31ERaD1-UnMVTshnopbU_YMSHOw43zNiWLsOPIMCSZJpJPJfsVAAD__6zEG54">