Discussion:
Is this a bug when creating proxies in classes?
Gary Willoughby via Digitalmars-d-learn
2014-08-25 18:10:32 UTC
Permalink
Compiling the following code:

import std.typecons;

class Foo
{
private int foo;

mixin Proxy!(foo);

this(int x)
{
this.foo = x;
}
}

void main()
{
}

Produces this error:

:!rdmd --force -de -debug -w test.d
/usr/include/dmd/phobos/std/typecons.d(4043): Error: template
instance isArray!(typeof(a)) template 'isArray' is not defined
test.d(7): Error: mixin test.Foo.Proxy!(foo) error instantiating
Failed: ["dmd", "-de", "-debug", "-w", "-v", "-o-", "test.d",
"-I."]

Can anyone else confirm or am i doing something wrong. I'm using
DMD 2.066.0 64bit Ubuntu 14.04.
Ali Çehreli via Digitalmars-d-learn
2014-08-25 18:30:31 UTC
Permalink
Post by Gary Willoughby via Digitalmars-d-learn
import std.typecons;
class Foo
{
private int foo;
mixin Proxy!(foo);
this(int x)
{
this.foo = x;
}
}
void main()
{
}
:!rdmd --force -de -debug -w test.d
/usr/include/dmd/phobos/std/typecons.d(4043): Error: template instance
isArray!(typeof(a)) template 'isArray' is not defined
test.d(7): Error: mixin test.Foo.Proxy!(foo) error instantiating
Failed: ["dmd", "-de", "-debug", "-w", "-v", "-o-", "test.d", "-I."]
Can anyone else confirm or am i doing something wrong. I'm using DMD
2.066.0 64bit Ubuntu 14.04.
isArray is defined in std.traits. I don't know why it doesn't work even
though std.typecons does import it.

The workaround is to import it yourself in your program:

import std.traits;

Ali
via Digitalmars-d-learn
2014-08-25 18:38:36 UTC
Permalink
Post by Gary Willoughby via Digitalmars-d-learn
:!rdmd --force -de -debug -w test.d
/usr/include/dmd/phobos/std/typecons.d(4043): Error: template
instance isArray!(typeof(a)) template 'isArray' is not defined
test.d(7): Error: mixin test.Foo.Proxy!(foo) error instantiating
Failed: ["dmd", "-de", "-debug", "-w", "-v", "-o-", "test.d",
"-I."]
Can anyone else confirm or am i doing something wrong. I'm
using DMD 2.066.0 64bit Ubuntu 14.04.
It stopped working after this PR was merged:

https://github.com/D-Programming-Language/phobos/pull/1899

But I suspect that something else is going on. The PR only
introduced the call to `isArray` into `std.typecons.Proxy`.
Ali Çehreli via Digitalmars-d-learn
2014-08-25 18:44:35 UTC
Permalink
Post by via Digitalmars-d-learn
Post by Gary Willoughby via Digitalmars-d-learn
:!rdmd --force -de -debug -w test.d
/usr/include/dmd/phobos/std/typecons.d(4043): Error: template instance
isArray!(typeof(a)) template 'isArray' is not defined
test.d(7): Error: mixin test.Foo.Proxy!(foo) error instantiating
Failed: ["dmd", "-de", "-debug", "-w", "-v", "-o-", "test.d", "-I."]
Can anyone else confirm or am i doing something wrong. I'm using DMD
2.066.0 64bit Ubuntu 14.04.
https://github.com/D-Programming-Language/phobos/pull/1899
But I suspect that something else is going on. The PR only introduced
the call to `isArray` into `std.typecons.Proxy`.
It can be explained if the mixed-in template is evaluated at the mixin
context without bringing in the imported modules to that context. I
don't know whether it is true or whether it is a known limitation.

Ali
via Digitalmars-d-learn
2014-08-25 19:12:47 UTC
Permalink
Post by Ali Çehreli via Digitalmars-d-learn
It can be explained if the mixed-in template is evaluated at
the mixin context without bringing in the imported modules to
that context. I don't know whether it is true or whether it is
a known limitation.
You're right, that's it! It works when I import std.traits first.

So... the fix is to import std.traits inside template Proxy.
Going to submit a PR.
via Digitalmars-d-learn
2014-08-25 19:17:20 UTC
Permalink
Post by via Digitalmars-d-learn
Post by Ali Çehreli via Digitalmars-d-learn
It can be explained if the mixed-in template is evaluated at
the mixin context without bringing in the imported modules to
that context. I don't know whether it is true or whether it is
a known limitation.
You're right, that's it! It works when I import std.traits
first.
So... the fix is to import std.traits inside template Proxy.
Going to submit a PR.
https://github.com/D-Programming-Language/phobos/pull/2463
Gary Willoughby via Digitalmars-d-learn
2014-08-25 19:31:08 UTC
Permalink
Post by via Digitalmars-d-learn
Post by via Digitalmars-d-learn
Post by Ali Çehreli via Digitalmars-d-learn
It can be explained if the mixed-in template is evaluated at
the mixin context without bringing in the imported modules to
that context. I don't know whether it is true or whether it
is a known limitation.
You're right, that's it! It works when I import std.traits
first.
So... the fix is to import std.traits inside template Proxy.
Going to submit a PR.
https://github.com/D-Programming-Language/phobos/pull/2463
Smashing, ta.
Ali Çehreli via Digitalmars-d-learn
2014-08-25 21:14:42 UTC
Permalink
Post by via Digitalmars-d-learn
Post by via Digitalmars-d-learn
Post by Ali Çehreli via Digitalmars-d-learn
It can be explained if the mixed-in template is evaluated at the
mixin context without bringing in the imported modules to that
context. I don't know whether it is true or whether it is a known
limitation.
You're right, that's it! It works when I import std.traits first.
So... the fix is to import std.traits inside template Proxy. Going to
submit a PR.
https://github.com/D-Programming-Language/phobos/pull/2463
Thanks! And I learned from you in the pull request the following fact:

<quote>
Quoting http://dlang.org/template-mixin :
"Unlike a template instantiation, a template mixin's body is evaluated
within the scope where the mixin appears, not where the template
declaration is defined. It is analogous to cutting and pasting the body
of the template into the location of the mixin."
</quote>

Ali
Gary Willoughby via Digitalmars-d-learn
2014-08-26 18:13:50 UTC
Permalink
Post by Ali Çehreli via Digitalmars-d-learn
Post by via Digitalmars-d-learn
Post by via Digitalmars-d-learn
Post by Ali Çehreli via Digitalmars-d-learn
It can be explained if the mixed-in template is evaluated at the
mixin context without bringing in the imported modules to
that
context. I don't know whether it is true or whether it is a
known
limitation.
You're right, that's it! It works when I import std.traits
first.
So... the fix is to import std.traits inside template Proxy.
Going to
submit a PR.
https://github.com/D-Programming-Language/phobos/pull/2463
Thanks! And I learned from you in the pull request the
<quote>
"Unlike a template instantiation, a template mixin's body is
evaluated within the scope where the mixin appears, not where
the template declaration is defined. It is analogous to cutting
and pasting the body of the template into the location of the
mixin."
</quote>
Ali
With that in mind what is strange is that if in my example you
change the class for a struct everything works as expected. Why
is that?
via Digitalmars-d-learn
2014-08-26 20:41:46 UTC
Permalink
Post by Gary Willoughby via Digitalmars-d-learn
With that in mind what is strange is that if in my example you
change the class for a struct everything works as expected. Why
is that?
This is bizarre... I tried a few things, but I have no idea. At
first I thought the `static if` that calls `isArray` is inside
another `static if`, but this is not the case.

Might be a compiler bug?
Gary Willoughby via Digitalmars-d-learn
2014-08-28 15:50:49 UTC
Permalink
On Tuesday, 26 August 2014 at 18:13:52 UTC, Gary Willoughby
Post by Gary Willoughby via Digitalmars-d-learn
With that in mind what is strange is that if in my example you
change the class for a struct everything works as expected.
Why is that?
This is bizarre... I tried a few things, but I have no idea. At
first I thought the `static if` that calls `isArray` is inside
another `static if`, but this is not the case.
Might be a compiler bug?
Anyone else know or can reduce this if it's a bug?
anonymous via Digitalmars-d-learn
2014-08-28 16:23:47 UTC
Permalink
Post by Gary Willoughby via Digitalmars-d-learn
With that in mind what is strange is that if in my example you
change the class for a struct everything works as expected. Why
is that?
That's because when not mixed into a class, Proxy did import
std.traits:

static if (!is(typeof(this) == class))
{
private import std.traits;
Gary Willoughby via Digitalmars-d-learn
2014-08-28 16:54:19 UTC
Permalink
On Tuesday, 26 August 2014 at 18:13:52 UTC, Gary Willoughby
Post by Gary Willoughby via Digitalmars-d-learn
With that in mind what is strange is that if in my example you
change the class for a struct everything works as expected.
Why is that?
That's because when not mixed into a class, Proxy did import
static if (!is(typeof(this) == class))
{
private import std.traits;
Ah right, yes. ta.
Martin Nowak via Digitalmars-d-learn
2014-10-16 22:43:21 UTC
Permalink
Post by Gary Willoughby via Digitalmars-d-learn
class Foo
{
private int foo;
mixin Proxy!(foo);
this(int x)
{
this.foo = x;
}
}
Apparently Proxy doesn't work correctly inside classes.
Is wrapping something inside a class particularly useful?
Please comment on https://issues.dlang.org/show_bug.cgi?id=13623.
Loading...