<div dir="ltr">IIRC there were concerns that __has_feature might not be the right place to be surfacing these traits.<div><br></div><div>Some of the traits don't work in general (and support just enough to get through the MS headers); I don't recall exactly which ones, though, and I think it was more than just __is_*_destructible. Alp, do you recall? (Maybe it was the __is_nothrow_* ones?)</div>
<div><br></div><div>Do we advertise support for the __has_* ones? We should stop doing that if we do -- they're fundamentally broken and pretty much useless (they exist to support libstdc++ and give wrong answers in some cases for GCC compatibility). Eventually I would ilke to make them synonyms for the correct traits, but I'm concerned that people might be relying on the GCC bugs that we emulate for them.</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, May 1, 2014 at 7:48 AM, Marshall Clow <span dir="ltr"><<a href="mailto:mclow.lists@gmail.com" target="_blank">mclow.lists@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Recently, reading llvm/tools/clang/docs/LanguageExtensions.rst, I saw a list of type_trait primitives<br>
supported by clang.<br>
<br>
One of them caught my eye: __is_nothrow_constructible  — that could be handy for use in libc++.<br>
<br>
So I ran a quick test:<br>
<br>
        __is_nothrow_constructible(int)<br>
and it returned true.<br>
<br>
Then I tried:<br>
        __has_feature(is_nothrow_constructible)<br>
and it returned false.<br>
<br>
Well, that’s not useful to me; I need to be able to tell when I can use that feature.<br>
So I whipped up a program to test all of the type_traits listed in that file (attached),<br>
and to see if I can check (using __has_feature) whether or not they are implemented.<br>
<br>
Turns out that __has_feature returns false for the following type traits:<br>
<br>
        __has_feature(is_interface_class) = 0<br>
        __has_feature(is_destructible) = 0<br>
        __has_feature(is_nothrow_destructible) = 0<br>
        __has_feature(is_nothrow_assignable) = 0<br>
        __has_feature(is_nothrow_constructible) = 0<br>
<br>
__is_interface_class is a MS extension; so that’s fine.<br>
__is_destructible and __is_nothrow_destructible are described as “partially implemented”, and attempts to use them fail.<br>
<br>
On the other hand:<br>
        __is_nothrow_constructible(int) returns 1<br>
        __is_nothrow_assignable(int&, int) returns 1<br>
<br>
So these two seem to work (for at least one case)<br>
It seems to me that we should have feature tests for these type traits if we expect people to use them<br>
<br>
So, I’d like to see<br>
        __has_feature(is_nothrow_constructible)<br>
and     __has_feature(is_nothrow_assignable)<br>
<br>
return 1<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
— Marshall<br>
<br>
<br>
</font></span></blockquote></div><br></div>