Bug 279 – Nested class can't access var in outer function scope, if nested in class
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D1 (retired)
Platform
x86
OS
Linux
Creation time
2006-08-05T14:19:00Z
Last change time
2014-02-15T13:20:03Z
Keywords
wrong-code
Assigned to
bugzilla
Creator
web
Comments
Comment #0 by web — 2006-08-05T14:19:14Z
The nested class can refer to members of the enclosing class, but not variables in the enclosing function.
I assume the problem is that the context pointer of the anonymous class nested within Foo's constructor refers to the Foo instance, and not to the stack-frame of the constructor.
Whether intentional or not, the compiler accepts the program and generates buggy code.
--- Test case ---
import std.stdio;
void foo()
{
int x = 42;
new class Object
{
this() { writef("%s\n", x); }
};
}
class Foo
{
this()
{
int x = 42;
new class Object
{
this() { writef("%s\n", x); }
// Can't access 'x'. Any members of Foo are accessible, however.
};
}
}
void main()
{
foo(); // prints 42
new Foo(); // prints garbage integer (e.g. 0, on my system.)
}
Comment #1 by bugzilla — 2006-08-11T19:19:06Z
Fixed DMD 0.164
Comment #2 by thomas-dloop — 2006-08-14T06:50:40Z
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
[email protected] schrieb am 2006-08-05:
> http://d.puremagic.com/issues/show_bug.cgi?id=279
> The nested class can refer to members of the enclosing class, but not variables
> in the enclosing function.
>
> I assume the problem is that the context pointer of the anonymous class nested
> within Foo's constructor refers to the Foo instance, and not to the stack-frame
> of the constructor.
>
> Whether intentional or not, the compiler accepts the program and generates
> buggy code.
>
> --- Test case ---
>
> import std.stdio;
>
> void foo()
> {
> int x = 42;
>
> new class Object
> {
> this() { writef("%s\n", x); }
> };
> }
>
> class Foo
> {
> this()
> {
> int x = 42;
>
> new class Object
> {
> this() { writef("%s\n", x); }
> // Can't access 'x'. Any members of Foo are accessible, however.
> };
> }
> }
>
> void main()
> {
> foo(); // prints 42
>
> new Foo(); // prints garbage integer (e.g. 0, on my system.)
> }
Added to DStress as
http://dstress.kuehne.cn/run/c/class_25_A.dhttp://dstress.kuehne.cn/run/c/class_25_B.dhttp://dstress.kuehne.cn/run/c/class_25_C.dhttp://dstress.kuehne.cn/run/c/class_25_D.dhttp://dstress.kuehne.cn/run/c/class_25_E.d
Thomas
-----BEGIN PGP SIGNATURE-----
iD8DBQFE2FUpLK5blCcjpWoRAtYCAJ96qFiR3bU0Ciymjw+R/1h8Ae7CvwCfTQrB
HxI4QMG3aHRW4t9jJj8BIQA=
=fuj4
-----END PGP SIGNATURE-----