static if - unexpected results

FeepingCreature feepingcreature at gmail.com
Fri Jun 23 14:31:45 UTC 2023


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.


More information about the Digitalmars-d-learn mailing list