digitalmars.D.learn - Initialising invariant associative array
- David Ferenczi (26/26) Jun 18 2008 The following code gives the following compilation error:
- Gide Nwawudu (28/54) Jun 18 2008 D uses 'static this' to initialise static members. This is done to
- David Ferenczi (5/80) Jun 18 2008 Thank you very much for your help. Initialising in the static constructo...
- David Ferenczi (3/5) Jun 19 2008 David
- Gide Nwawudu (5/10) Jun 24 2008 I think this is a bug, see
- David Ferenczi (5/23) Jun 24 2008 I haven't found this former issue, so I also filed a bug:
The following code gives the following compilation error: src/test/test.d(13): Error: non-constant expression ["s1":cast(FOO 9223372036854775808LU,"s2":cast(FOO)4611686018427387904LU] src/test/test.d(14): Error: non-constant expression [cast(FOO 9223372036854775808LU:"s1",cast(FOO)4611686018427387904LU:"s2"] --------------------------8<------------------------------------ import std.stdint: uint_fast64_t; class A { typedef uint_fast64_t FOO; static invariant FOO fooValue1 = cast(FOO) 0x8000000000000000LU; static invariant FOO fooValue2 = cast(FOO) 0x4000000000000000LU; static invariant FOO[string] fooArray = ["s1":fooValue1, "s2":fooValue2]; static invariant string[FOO] strArray = [fooValue1:"s1", fooValue2:"s2"]; } int main(string[] args) { A a; return 0; } --------------------------8<------------------------------------ Can somebody explain me why? Thanks, David
Jun 18 2008
On Wed, 18 Jun 2008 10:21:05 +0200, David Ferenczi <raggae ferenczi.net> wrote:The following code gives the following compilation error: src/test/test.d(13): Error: non-constant expression ["s1":cast(FOO 9223372036854775808LU,"s2":cast(FOO)4611686018427387904LU] src/test/test.d(14): Error: non-constant expression [cast(FOO 9223372036854775808LU:"s1",cast(FOO)4611686018427387904LU:"s2"] --------------------------8<------------------------------------ import std.stdint: uint_fast64_t; class A { typedef uint_fast64_t FOO; static invariant FOO fooValue1 = cast(FOO) 0x8000000000000000LU; static invariant FOO fooValue2 = cast(FOO) 0x4000000000000000LU; static invariant FOO[string] fooArray = ["s1":fooValue1, "s2":fooValue2]; static invariant string[FOO] strArray = [fooValue1:"s1", fooValue2:"s2"]; } int main(string[] args) { A a; return 0; } --------------------------8<------------------------------------ Can somebody explain me why? Thanks, DavidD uses 'static this' to initialise static members. This is done to remove order of evaluation issues. The docs contain more info on static constructors, see http://www.digitalmars.com/d/2.0/class.html section 'Static Constructors'. import std.stdint: uint_fast64_t; class A { typedef uint_fast64_t FOO; static invariant FOO fooValue1; static invariant FOO fooValue2; static invariant FOO[string] fooArray; static invariant string[FOO] strArray; static this() { fooValue1 = cast(FOO) 0x8000000000000000LU; fooValue2 = cast(FOO) 0x4000000000000000LU; fooArray = ["s1":fooValue1, "s2":fooValue2]; strArray = [fooValue1:"s1", fooValue2:"s2"]; } } int main(string[] args) { A a; return 0; } Gide
Jun 18 2008
Gide Nwawudu wrote:On Wed, 18 Jun 2008 10:21:05 +0200, David Ferenczi <raggae ferenczi.net> wrote:Thank you very much for your help. Initialising in the static constructor works well. Thanks, DavidThe following code gives the following compilation error: src/test/test.d(13): Error: non-constant expression ["s1":cast(FOO 9223372036854775808LU,"s2":cast(FOO)4611686018427387904LU] src/test/test.d(14): Error: non-constant expression [cast(FOO 9223372036854775808LU:"s1",cast(FOO)4611686018427387904LU:"s2"] --------------------------8<------------------------------------ import std.stdint: uint_fast64_t; class A { typedef uint_fast64_t FOO; static invariant FOO fooValue1 = cast(FOO) 0x8000000000000000LU; static invariant FOO fooValue2 = cast(FOO) 0x4000000000000000LU; static invariant FOO[string] fooArray = ["s1":fooValue1, "s2":fooValue2]; static invariant string[FOO] strArray = [fooValue1:"s1", fooValue2:"s2"]; } int main(string[] args) { A a; return 0; } --------------------------8<------------------------------------ Can somebody explain me why? Thanks, DavidD uses 'static this' to initialise static members. This is done to remove order of evaluation issues. The docs contain more info on static constructors, see http://www.digitalmars.com/d/2.0/class.html section 'Static Constructors'. import std.stdint: uint_fast64_t; class A { typedef uint_fast64_t FOO; static invariant FOO fooValue1; static invariant FOO fooValue2; static invariant FOO[string] fooArray; static invariant string[FOO] strArray; static this() { fooValue1 = cast(FOO) 0x8000000000000000LU; fooValue2 = cast(FOO) 0x4000000000000000LU; fooArray = ["s1":fooValue1, "s2":fooValue2]; strArray = [fooValue1:"s1", fooValue2:"s2"]; } } int main(string[] args) { A a; return 0; } Gide
Jun 18 2008
The code compiles, but it generates a segmentation fault. The problem is caused by the array initialisation:fooArray = ["s1":fooValue1, "s2":fooValue2]; strArray = [fooValue1:"s1", fooValue2:"s2"];David
Jun 19 2008
On Thu, 19 Jun 2008 10:40:48 +0200, David Ferenczi <raggae ferenczi.net> wrote:The code compiles, but it generates a segmentation fault. The problem is caused by the array initialisation:I think this is a bug, see http://d.puremagic.com/issues/show_bug.cgi?id=1727 GidefooArray = ["s1":fooValue1, "s2":fooValue2]; strArray = [fooValue1:"s1", fooValue2:"s2"];David
Jun 24 2008
Gide Nwawudu wrote:On Thu, 19 Jun 2008 10:40:48 +0200, David Ferenczi <raggae ferenczi.net> wrote:I haven't found this former issue, so I also filed a bug: http://d.puremagic.com/issues/show_bug.cgi?id=2158 It may be then a duplicate. DavidThe code compiles, but it generates a segmentation fault. The problem is caused by the array initialisation:I think this is a bug, see http://d.puremagic.com/issues/show_bug.cgi?id=1727 GidefooArray = ["s1":fooValue1, "s2":fooValue2]; strArray = [fooValue1:"s1", fooValue2:"s2"];David
Jun 24 2008