__traits(getMember) works only the second time

2014-10-10 Thread andre via Digitalmars-d-learn

Hi,

by executing the example source code,
following output is returned:

Reference: Child
false
true

At first "childStr" is not found, then it is found?
Is this a bug?

Kind regards
André

-

module app;

import test;

class Child : Parent
{
  mixin ComponentTemplate;
  @property string childStr(){return "";}
}

void main()
{
  auto child = new Child();
  child.getParameters();
}

-

module test;

template Params(this MyType)
{
  string[] Params()
  {
pragma(msg, "Reference: " ~ MyType.stringof);
pragma(msg, is(typeof(__traits(getMember, MyType, 
"childStr";
pragma(msg, is(typeof(__traits(getMember, MyType, 
"childStr";

return [];
  }
}

mixin template ComponentTemplate()
{
  private enum parameters = Params!(typeof(this));

  string[] getParameters()
  {
return parameters;
  }
}

class Parent
{
  @property string parentStr(){return "";}
}





Re: __traits(getMember) works only the second time

2014-10-10 Thread Rikki Cattermole via Digitalmars-d-learn

On 10/10/2014 8:08 p.m., andre wrote:

Hi,

by executing the example source code,
following output is returned:

Reference: Child
false
true

At first "childStr" is not found, then it is found?
Is this a bug?

Kind regards
André

-

module app;

import test;

class Child : Parent
{
   mixin ComponentTemplate;
   @property string childStr(){return "";}
}

void main()
{
   auto child = new Child();
   child.getParameters();
}

-

module test;

template Params(this MyType)
{
   string[] Params()
   {
 pragma(msg, "Reference: " ~ MyType.stringof);
 pragma(msg, is(typeof(__traits(getMember, MyType, "childStr";
 pragma(msg, is(typeof(__traits(getMember, MyType, "childStr";
 return [];
   }
}

mixin template ComponentTemplate()
{
   private enum parameters = Params!(typeof(this));

   string[] getParameters()
   {
 return parameters;
   }
}

class Parent
{
   @property string parentStr(){return "";}
}


Wrong trait for the job. Use hasMember instead.
Although interesting use case. Could be a bug somewhere in there.


Re: __traits(getMember) works only the second time

2014-10-10 Thread via Digitalmars-d-learn

Certainly a bug; please file a report at https://issues.dlang.org/


Re: __traits(getMember) works only the second time

2014-10-10 Thread andre via Digitalmars-d-learn
I use the syntax "is(typeof(__traits(getMember, MyType, 
"childStr")))" to check whether a member is public visible or 
not. (The example above is only a reduced example)


By the way hasMember works correctly.
I will file an issue.

Kind regards
André

On Friday, 10 October 2014 at 07:25:28 UTC, Rikki Cattermole 
wrote:

On 10/10/2014 8:08 p.m., andre wrote:




Wrong trait for the job. Use hasMember instead.
Although interesting use case. Could be a bug somewhere in 
there.