<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60321>60321</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Type trait assertions give the wrong result if used inside a containing struct
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jacobsa
</td>
</tr>
</table>
<pre>
Here is a tiny program that shows `std::is_default_constructible_v` is happy with a struct that contains a member initializer:
```c++
#include <type_traits>
struct Foo {
int a = 0;
};
static_assert(std::is_default_constructible_v<Foo>);
```
This [compiles fine](https://godbolt.org/z/6rx68Yx1b) with `-std=c++17`. It also [works fine](https://godbolt.org/z/Es3GKTvfa) if we embed the struct inside of another one:
```c++
#include <type_traits>
struct Bar {
struct Baz {
int a = 0;
};
};
static_assert(std::is_default_constructible_v<Bar::Baz>);
```
However if we add another type trait use inside of the parent struct, then *both* type trait assertions [fail](https://godbolt.org/z/7E4j9fPc4):
```c++
#include <type_traits>
struct Bar {
struct Baz {
int a = 0;
};
static_assert(std::is_default_constructible_v<Baz>);
};
static_assert(std::is_default_constructible_v<Bar::Baz>);
```
```
<source>:8:3: error: static assertion failed due to requirement 'std::is_default_constructible_v<Bar::Baz>'
static_assert(std::is_default_constructible_v<Baz>);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:11:1: error: static assertion failed due to requirement 'std::is_default_constructible_v<Bar::Baz>'
static_assert(std::is_default_constructible_v<Bar::Baz>);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```
This seems wrong—`Baz` is already a complete type at the point that the assertion inside `Bar` is made, right?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVk1z6jYU_TWXzZ1khOQPWHgBIfR1uukim64Y2brGSmWLSjI8suhv78g2gb6mM2kmnfc8HgPC91ydc-QjS-_1viMqIF1DupnJPjTWFc-ysqWXs9Kqc_GFHKH2KDHo7owHZ_dOthgaGdA39uQRMuaDArECsdJ-p6iWvQm7ynY-uL4KujS0O0LGIkwjD4cznnRoUOL4_4hV2S5I3cVGLbUlOdSdDloa_UIugrMNsMs1Y-NZAV_HcxzlQneV6RUhiIdwPtAuOKmDB_F4Wz113VqLkE-1iLoLKBHEBhmIC2K-uX6famXQ1U56Ty4AX7yHuHjYWhvnwJdXtAuDW_CnRnuEdF3Z9qANeax1R5BugC-aEA4-duJb4Nu9VaU14d66PfDtC_Bt5r5mi9--zkvgy1FdyNjdMLvNJNI8h4zd488BpfE29jlZ9_t_afLoxU-_PB1rGZvoGk-E0SmFoaGLl7rzWhHaGmVnQ0MObUf_h31r6W7tex19uR1921bEvxn7SSavpRvvWsuX97j9xZ7oGJf5IKRU6lWxyB0H7th7upE06nyQjrow8QX-EAc7BL4qbWiAr26rRwbadsOyqqU27zM6f0yel_WvVTKQ-JG9e0X4mGP_MOo7rYVvB8WDt72rKNaK1QLESoBYITlnI_DE9-ovRm9JoeoJg0VHf_TaURsXCvD8g3POP1tdREgf8fb48x3Hm5LM5_Hy3TT5_FXxAWFu1fnX7cQTtR5PznZ7eOSwYLBMIGNxBuOGLI0jqc4oMW47hgKNCSLDGDc2PoXDDh1_XtWdUmnAchNWKxXFSHJ63wQQ25kqhFqKpZxRMc_yJM-XLGezplimaVanGRNVWefzTIpKVSKpFctYmixkOtMFZ1ywOc8Z44lg9ylLE1JpXlfzTPK6hoRRK7W5N-bYxuiaae97KjIm-HxmZEnGX15rXBFvuiv7vYeEGe2Dv5YFHQwVT2-G5l4faaA96IeOfG9CDOzek7ooIC-vLrrbT1E2650pvglZHZq-vK9sC3wbm08fdwdnnykm-XYg4ONmHjn8FQAA__9X4fph">