On Monday, 3 September 2018 at 13:39:25 UTC, agorkvmh wrote:
Hi all,

Running this:
---
static assert(Foo(1).pos == 2);


struct Foo
{
    this(int i){ advance(); }

    size_t pos =1;

    void advance()
    {
        pragma(msg, pos);
        pos = pos+1;
        pragma(msg, pos);
    }
}

dmd -o- -unittest source/pgs/parser.d
1LU
1LU
---

The static assert passes, but why the second pragma print '1'?

Thanks

It prints 1, because pragma(msg) is called when the compiler is analyzing the code through the semantic process and not when the body of the function is executed during CTFE.

And since "pos = pos+1" is a runtime construct (technically) then the expression is ignored, unless the function is called during CTFE, but by the time the function is called during CTFE then the pragma(msg) has already been executed.

Reply via email to