static if - unexpected results

Steven Schveighoffer schveiguy at gmail.com
Fri Jun 23 18:43:06 UTC 2023


On 6/23/23 10:31 AM, FeepingCreature wrote:
> On Friday, 23 June 2023 at 14:22:24 UTC, DLearner wrote:
>> Hi
>>
>> Was looking for compile-time detection of a struct variable.
>> However, the following test code gave the two 'FAILS' shown below.
>> Comments?
>> ```
>> void main() {
>>    import std.stdio : writeln;
>>    import std.traits;
>>
>>    string mxnTst(string VarName) {
>>       return
>>
>>       `static if (is(typeof(` ~ VarName ~ `) == char)) {` ~
>>          `writeln("` ~ VarName ~ ` ", " is a char");` ~
>>       `} else static if (__traits(isPOD, typeof(` ~ VarName ~ `))) {` ~
>>          `writeln("` ~ VarName ~ ` ", " is a struct");` ~
>>       `} else static if (is(typeof(` ~ VarName ~ `) == int)) {` ~
>>          `writeln("` ~ VarName ~ ` ", " is an int");` ~
>>       `} else {` ~
>>          `static assert(false, "mxnTst Variable '` ~ VarName  ~ `' is 
>> of unknown type");` ~
>>       `}`
>>        ;
>>    }
>>
>>    char char1;
>>    int  int1;
>>    byte byte1;
>>
>>    struct foo {
>>       int  fooint;
>>       char foochar;
>>    }
>>    foo foovar1;
>>
>>    mixin(mxnTst("char1"));   // Expected: char1 is a char. Actual: 
>> char1 is a char. (ok)
>>    mixin(mxnTst("int1"));    // Expected: int1 is an int. Actual: int1 
>> is a struct. (FAIL)
>>    mixin(mxnTst("foovar1")); // Expected: foovar1 is a struct. Actual: 
>> foovar1 is a struct. (ok)
>>    mixin(mxnTst("byte1"));   // Expected: Run to fail with the static 
>> assert message. Actual: byte1 is a struct. (FAIL)
>> }
>> ```
> 
> ```
> static assert(__traits(isPOD, int)); // ok.
> static assert(__traits(isPOD, byte)); // ok.
> ```
> It's a bug in either the spec or the compiler.

It should be a spec change. Change POD to say "type" instead of "struct".

The goal of `isPOD` is to determine how careful generic code needs to be 
to pass the type around, or copy it. Changing it to false implies that 
it is not "plain old data". I.e. it has a destructor, it has hidden 
members, or it cannot be copied via bit copying (all of these do not fit 
the type in question).

The only other option is to error on calling `__traits(isPOD, char)`, 
but I think that's even worse.

-Steve


More information about the Digitalmars-d-learn mailing list