It's going to be long as I'm going to post all the code...
Basically there is a bug in the type system or __traits when the program is split in static lib and exe (as opposed to all in one).

My test case:
- I have a all in one console application which output "true true"
- I have a project with the exact same code split into a static lib and an exe and it output "false false"

The bug is that the output is different!

=== first the all in one, outputing "true, true" =========
module main;

import std.variant;
import std.stdio;
import std.metastrings : Format;
import std.traits;

public mixin template property(T, string name)
{
   mixin(Format!("private T _%s;
                 @property public T %s() { return _%s; }
                 @property public void %s(T value) { _%s = value; }", name,
name, name, name, name));
}

interface IInter
{
}

class Foo : IInter
{
   static this()
   {
       Compiled!(Foo, "FP");
       Compiled!(Foo, "Subfoo");
   }

   @property public Foo FP() { return new Foo(); }
   @property public void FP(Foo f) { }

   mixin property!(Foo, "Subfoo");
}

int main(string[] argv)
{
   return 0;
}
void Compiled(T, string memberName)()
{
   T t;
writeln(mixin( "__traits(compiles, t." ~memberName ~" = (" ~typeof(__traits(getMember, T, memberName)).stringof ~").init)" ));
}
==============================================


now the splitted program, outputting "false, false"
whereas it should output "true, true" just like above, shouldn't it!?!

===== lib.d ====
module lib;

import std.variant;
import std.stdio;
import std.metastrings : Format;
import std.traits;

public mixin template property(T, string name)
{
   mixin(Format!("private T _%s;
                 @property public T %s() { return _%s; }
@property public void %s(T value) { _%s = value; }", name, name, name, name, name));
}

interface IInter
{
}

void Compiled(T, string memberName)()
{
   T t;
writeln(mixin( "__traits(compiles, t." ~memberName ~" = " ~typeof(__traits(getMember, T, memberName)).stringof ~").init" ));
}
====== main.d =====
module main;

import lib;

class Foo : IInter
{
   static this()
   {
       Compiled!(Foo, "FP");
       Compiled!(Foo, "Subfoo");
   }

   @property public Foo FP() { return new Foo(); }
   @property public void FP(Foo f) { }

   mixin property!(Foo, "Subfoo");
}

int main(string[] argv)
{
   return 0;
}
===================== buildrun.bat =========
dmd -lib -g -debug -X -of"lib1.lib" lib.d
dmd -g -debug -X main.d lib1.lib
main
====================================

Reply via email to