June 28, 2010
Hi D users,

I created/tested a little logging class under DMD 1.062:

//-------------------------------------------------------------------------
//
// helper class for debugging/logging
//
import std.string;
import std.stdio;

scope class LogEnter
{
  static int mIndent;
  static char[] doindent()
  {
    return "\n" ~ repeat(" ", mIndent);
  }

  this(char[] text)
  {
    mText = text;
    writef(doindent() ~ "<" ~ mText ~ ">");
    mIndent += 2;
  }

  ~this()
  {
    mIndent -= 2;
    writef(doindent() ~ "</" ~ mText ~ ">");
  }

  char[] mText;
}

//-------------------------------------------------------------------------
//
// logging with scope keyword
//

void C()
{
  scope auto log = new LogEnter("C");
  D();
}

void D()
{
  scope auto log = new LogEnter("D");
}

void main()
{
  // C();
}
//-------------------------------------------------------------------------

Together with the scope keyword this works as expected. The output looks like:
<C>
  <D>
  </D>
</C>

After that I tried to move the LogEnter instantiation into a template mixin, as follows:

//-------------------------------------------------------------------------
//
// logging via template mixin
//
template Log(char[] msg)
{
  scope auto log = new LogEnter(msg);
}

void A()
{
  mixin Log!("A");
  B();
}

void B()
{
  mixin Log!("B");
}

void main()
{
  A();
}
//-------------------------------------------------------------------------

I get the following output:

<A>
  <B>

IMO the template mixin variant should behave the same. Did I miss something or is this a bug ?
I already searched bugzilla for similar bugs, but I found none.
Thanks in advance for your help

KlausO