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

    <tr>
        <th>Summary</th>
        <td>
            [[clang::require_explicit_initialization]] inconsistent with constructability traits (problem under -Werror)
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          higher-performance
      </td>
    </tr>
</table>

<pre>
    Someone pointed out that `[[clang::require_explicit_initialization]]` doesn't interact well with the constructability traits:

```
// -Werror=uninitialized-explicit-init

#include <type_traits>

template<class T, bool = std::is_default_constructible<T>::value>
struct DefaultValue {
    static void Get() { }
};

template<class T>
struct DefaultValue<T, true> {
 static T Get() {
        return T();
    }
};

struct S {
    int x [[clang::require_explicit_initialization]];
};

int main() {
 DefaultValue<S>::Get();
}
```

The problem is exacerbated under `-Werror` (which is precisely the desired flag here) because there is no way for code to know the truth about constructability.

On the other hand, when the attribute is a warning, then constructability technically isn't affected, and the warning can be suppressed. But I'm not sure we want `-W` to affect the trait behaviors, either.

I don't know what to do here, but I wanted to raise this issue in case we want to make any changes prior to the release of LLVM 20.

@AaronBallman
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJycVM9u4zgPfxrlQiRw5SSODzkkzdcPA8xiDy1mjwUtMTF3FMkr0U2zT7-Q7bQzHfSwGxgIIJG_PxRJTIlPnmirVnu1OsywlzbEbcunluK8o3gM8Yze0KwJ9rp9DGcKnqAL7IUshF5AWhRQ62JA2BuH_qTKnSp3kf7qOdIzvXaODcszexZGx3-jcPBqdcjfugAbKHmlK4GMGtEIXMg5uLC0IC2BCT5J7I1gw47lChKRJWWaYvjWxfQVO6UflH6A-R8UY4iqPPT-jZfs_CZmng-nbF2yN663BKq8l2tHzzf8_40RQufOoZAq743DlOBJ6XtoQnCgygMksaNjTs-Wjtg7eX6TzI3LeU8ZbAh6QdfTCD1GwGHM-ZYvQFV7VewAAJKgsIGXwBb-T6L0Ruk634OqDllYdVDl_lOFnzEMYvQ9SBxk3AgntqefqSYp-RdJ-uiz9Xw5MufzX8VMpI8_ALAXeIX_2CIj7g8EGe2M7H_W-cHk41vF3xy9I33omWL31BJ0MTSOzsAJ6BUNxQZzk_feUswdfuupdQFKby4tmzbHdpEMJ3LXoVctJY5k4ejwBC1FygobMtgnygGRco4PcMErHEMEEyyBBPjuw2VAkNhLC9jk4frY-YtR7e9-iAwZD1r0Nj_opaXxGEUiN70MTAgXjJ79aXjzHPLrNJFpPRt07go8TSIej2SEBmD0dsCdgMCgh4Yg9V0XKSWyC9j3Al-Urs7gg0DqI8ElJ3gZC5drJmFCnVwiCzTU4guHmDIPcfYzWfwCNoxShsJc8paRADZMRb2HJnMOHGTzVUQeSswJOKWegD0YTO9KJMAZvxOgv4Jp0Z8oPx6HmG-ypkiOckI4wtev334DXUxi1LLYYQx-j86d0c_strR1WeOMtndVualXm3KznrVbJHNnK42boiqN1U25Ksp6Xa2sOW7K-m45460u9KrQRXVXr-rlelEfm7Wp6mJd6mazrNZqWdAZ2S2cezkvQjzNBi_bO73WdT1z2JBLw7bWehwkrfPijtucMG_6U1LLwnGS9A4hLG5a8f96-oB9bhhOQl7GlfzJOs5DcRuhcWZuA6PrWR_dthXphqU9rOgTS9s3CxPOSj9kqdPfvIvhTzKi9MNgPSn9MLl_2ep_AgAA___EWimc">