On Saturday, 13 June 2015 at 23:51:32 UTC, JDemler wrote:
I have another one :)

module test;

struct S{
  string member1;
  int member2;
}

string test(string[] a)
{
  const S s = { member1:"It is also important to go to Mars!"};
  const string y = a[0];
  return y;
}

void main()
{
  enum e = ["member1","member2"];
  pragma(msg, e[0]);
  pragma(msg, test(e));
}

Compiles, works fine while

module test;

struct S{
  string member1;
  int member2;
}

string test(string[] a)
{
  const S s = { member1:"It is also important to go to Mars!"};
  const string y = a[0];
  return __traits(getMember, s, y);
}

void main()
{
  enum e = ["member1","member2"];
  pragma(msg, e[0]);
  pragma(msg, test(e));
}

spits out following:

test.d(11): Error: variable a cannot be read at compile time
test.d(12):        while evaluating y.init
test.d(12): Error: string expected as second argument of __traits getMember instead of __error test.d(12): Error: cannot implicitly convert expression (false) of type bool to string
member1
test.d(19): Error: CTFE failed because of previous errors in test test.d(19): while evaluating pragma(msg, test(["member1", "member2"]))

If i use "member1" directly it works.

What am I missing here?

Thanks for your help

After a bit of rethinking:

I guess the compiler goes through 2 loops:
the first resolves __traits, the second does ctfe.

That would explain this behavior. "a" is not present to the compiler while it tries to resolve my __traits call, but will be present in case of ctfe.

Is there a workaround for that?


Reply via email to