www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 2740] New: Template Mixins do not work as advertised

reply d-bugmail puremagic.com writes:
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"
}


-- 
Mar 17 2009
next sibling parent d-bugmail puremagic.com writes:
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.


-- 
Mar 17 2009
prev sibling next sibling parent d-bugmail puremagic.com writes:
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: -------
Sep 08 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
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: -------
Sep 08 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
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: -------
Dec 03 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
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: -------
Dec 03 2010
prev sibling parent d-bugmail puremagic.com writes:
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: -------
Feb 19 2011