__traits(compiles) is true with warnings as errors
Tejas
notrealemail at gmail.com
Thu Oct 14 05:41:01 UTC 2021
On Wednesday, 13 October 2021 at 17:58:23 UTC, Jonathan Levi
wrote:
> When dmd is passed the "-w" tag, it "treats warnings as errors"
> but not with the "__traits(compiles)" expression. Is this the
> intended action?
>
> This code should compile even with "-w", but it does not.
>
> int i;
> static if (__traits(compiles,i += 5.2))
> i += 5.2;
>
>
> `pragma(msg, __traits(compiles,i += 5.2))` is `true`, even
> though it will stop the compiler.
>
> My specific use case, where I am hindered by this, is with a
> guarded template function akin to this:
>
> void fun(T,U)(ref T a, const U b)
> if (__traits(compiles, a += b))
> {
> a += b;
> }
>
> I think this is a bug. The Docs for __traits compiles state
> "Returns a bool true if all of the arguments compile . . ."
> which is not holding true.
But it _is_ compiling, just with a warning.
If you wish to force the code to compile, you can manually cast
it to prevent the compiler from erroring out:
```d
void main(){
int i;
static if (__traits(compiles,i += 5.2))
i += cast(int)5.2;
}
```
Or in general:
```d
void fun(T,U)(ref T a, const U b)
if (__traits(compiles, a += b))
{
a += cast(T)b;
}
```
It seems the `__traits(compiles, ..)` feature was designed to
operate independent of the command line flags passed to the D
compiler.
I don't know if that's a bug or not though; best wait for someone
more experienced to chime in.
More information about the Digitalmars-d-learn
mailing list