Thread overview
[Issue 2740] New: Template Mixins do not work as advertised
Mar 18, 2009
d-bugmail
Mar 18, 2009
d-bugmail
Sep 08, 2010
David Simcha
Sep 08, 2010
David Simcha
Dec 03, 2010
Bruno Medeiros
Dec 03, 2010
Sobirari Muhomori
Feb 19, 2011
akb825@gmail.com
Jul 09, 2011
Kenji Hara
Oct 14, 2011
Walter Bright
March 18, 2009
http://d.puremagic.com/issues/show_bug.cgi?id=2740

           Summary: Template Mixins do not work as advertised
           Product: D
           Version: unspecified
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: bugzilla@digitalmars.com
        ReportedBy: andrew.livesay@gmail.com


// As I understand TFM, all three calls to go() should be printing 'false'.

import std.stdio;

interface IFooable {
  bool foo();
}

template TFoo() {
  bool foo() { return true; }
}

class Foo : IFooable {
  mixin TFoo;
  bool foo() { return false; }
}

class _Foo : IFooable {
  mixin TFoo;
}

class Foo2 : _Foo {
  bool foo() { return false; }
}

class Foo3 : IFooable {
  bool foo() { return false; }
}

void go(IFooable p) {
  writefln(p.foo);
}

void main() {
  Foo p = new Foo();
  Foo2 p2 = new Foo2();
  Foo3 p3 = new Foo3();
  go(p); // output is "true" <------- Why isn't this false?
  go(p2); // output is "false"
  go(p3); // output is "false"
}


-- 

March 18, 2009
http://d.puremagic.com/issues/show_bug.cgi?id=2740





------- Comment #1 from andrew.livesay@gmail.com  2009-03-17 21:31 -------
Issue appears to be dependent on the order the mixin is imported.  If you redefine foo() before "mixin TFoo;", it works as expected.


-- 

September 08, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2740


David Simcha <dsimcha@yahoo.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dsimcha@yahoo.com
           Severity|normal                      |critical


--- Comment #2 from David Simcha <dsimcha@yahoo.com> 2010-09-08 10:40:17 PDT ---
This seems to happen iff the class is called from its interface handle:

import std.stdio;

interface IFooable {
  bool foo();
}

mixin template TFoo() {
  override bool foo() { return true; }
}

class Foo : IFooable {
  mixin TFoo;
  override bool foo() { return false; }
}

void go(IFooable p) {
  writeln(p.foo);
}

void main() {
  Foo p = new Foo();
  go(p);            // true
  writeln(p.foo);   // false
  IFooable i = p;
  writeln(i.foo);   // true
}

Marking as critical because this is an extremely subtle wrong-code bug that can lead to some pretty frustrating debugging.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
September 08, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2740



--- Comment #3 from David Simcha <dsimcha@yahoo.com> 2010-09-08 10:42:34 PDT ---
Oh yeah, doesn't happen for abstract classes either.  Looks like only the interface vtbl info is wrong.

import std.stdio;

abstract class IFooable {
  abstract bool foo();
}

mixin template TFoo() {
  override bool foo() { return true; }
}

class Foo : IFooable {
  mixin TFoo;
  override bool foo() { return false; }
}

void go(IFooable p) {
  writeln(p.foo);
}

void main() {
  Foo p = new Foo();
  go(p);            // false
  writeln(p.foo);   // false
  IFooable i = p;
  writeln(i.foo);   // false
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 03, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2740


Bruno Medeiros <bdom.pub+deebugz@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bdom.pub+deebugz@gmail.com


--- Comment #4 from Bruno Medeiros <bdom.pub+deebugz@gmail.com> 2010-12-03 06:33:18 PST ---
Hum, I suspect the code above should not even compile. Instantiating the mixin
"is analogous to cutting and pasting the body of the template into the location
of the mixin." http://www.digitalmars.com/d/2.0/template-mixin.html
Thus it should be the same as:

class Foo : IFooable {
  bool foo() { return false; }
  bool foo() { return false; }
}


which should be a semantic error, I think. See http://d.puremagic.com/issues/show_bug.cgi?id=5312

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
December 03, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2740



--- Comment #5 from Sobirari Muhomori <dfj1esp02@sneakemail.com> 2010-12-03 11:57:37 PST ---
The right code can't be generated for such input.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
February 19, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=2740


akb825@gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |akb825@gmail.com


--- Comment #6 from akb825@gmail.com 2011-02-19 12:18:10 PST ---
(In reply to comment #4)
> Hum, I suspect the code above should not even compile. Instantiating the mixin
> "is analogous to cutting and pasting the body of the template into the location
> of the mixin." http://www.digitalmars.com/d/2.0/template-mixin.html
> Thus it should be the same as:
> 
> class Foo : IFooable {
>   bool foo() { return false; }
>   bool foo() { return false; }
> }
> 
> 
> which should be a semantic error, I think. See http://d.puremagic.com/issues/show_bug.cgi?id=5312

From http://www.digitalmars.com/d/2.0/template-mixin.html: "The declarations in
a mixin are ‘imported’ into the surrounding scope. If the name of a declaration
in a mixin is the same as a declaration in the surrounding scope, the
surrounding declaration overrides the mixin one." In other words, declarations
in the current scope always hide declarations in the mixin.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
July 09, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=2740


Kenji Hara <k.hara.pg@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |patch
                 CC|                            |k.hara.pg@gmail.com


--- Comment #7 from Kenji Hara <k.hara.pg@gmail.com> 2011-07-09 16:45:34 PDT ---
https://github.com/D-Programming-Language/dmd/pull/223

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 14, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=2740


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bugzilla@digitalmars.com
         Resolution|                            |FIXED


--- Comment #8 from Walter Bright <bugzilla@digitalmars.com> 2011-10-13 19:40:50 PDT ---
https://github.com/D-Programming-Language/dmd/commit/4081225e4407ca08d6c8f9a390e1bb6def057c29

https://github.com/D-Programming-Language/dmd/commit/73e600b38ec0fdcadd3855db4b0ccac53a451da0

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------