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.d http://dstress.kuehne.cn/run/c/class_25_B.d http://dstress.kuehne.cn/run/c/class_25_C.d http://dstress.kuehne.cn/run/c/class_25_D.d http://dstress.kuehne.cn/run/c/class_25_E.d Thomas -----BEGIN PGP SIGNATURE----- iD8DBQFE2FUpLK5blCcjpWoRAtYCAJ96qFiR3bU0Ciymjw+R/1h8Ae7CvwCfTQrB HxI4QMG3aHRW4t9jJj8BIQA= =fuj4 -----END PGP SIGNATURE-----