digitalmars.D - const struct not accepted as initializer by dmd 2.002
- torhu (23/23) Jul 13 2007 Reposting from D.learn, since there were no answers there.
- Regan Heath (5/35) Jul 13 2007 I can't think of anything.
- torhu (21/57) Jul 13 2007 The are several simple workarounds. I guess my real question is if this...
- Stewart Gordon (7/41) Jul 13 2007 There's D_Version2.
- torhu (2/28) Jul 14 2007 Filed as bug #1342.
Reposting from D.learn, since there were no answers there. --- struct Inner { int value; } struct Outer { //const(Inner) i; // this fixes it, but is not valid in D 1.0 Inner i; } const Inner ic = { 5 }; // const or invariant here makes no difference Outer outer = { i: ic // line 14 //i: { 5 } // this is allowed }; --- c:\prog\test\D>dmd -c test test.d(14): Error: non-constant expression cast(Inner)ic --- Since the value of ic is fixed at compile time, shouldn't it be equivalent to a literal? I'm trying to make this code work in D version 1 too, and since it's for an example, I'm trying to avoid any string mixins or other ugly workarounds.
Jul 13 2007
torhu wrote:Reposting from D.learn, since there were no answers there. --- struct Inner { int value; } struct Outer { //const(Inner) i; // this fixes it, but is not valid in D 1.0 Inner i; } const Inner ic = { 5 }; // const or invariant here makes no difference Outer outer = { i: ic // line 14 //i: { 5 } // this is allowed }; --- c:\prog\test\D>dmd -c test test.d(14): Error: non-constant expression cast(Inner)ic --- Since the value of ic is fixed at compile time, shouldn't it be equivalent to a literal? I'm trying to make this code work in D version 1 too, and since it's for an example, I'm trying to avoid any string mixins or other ugly workarounds.I can't think of anything. Is there a pre-defined version specifier for D1.0 and D2.0 you could use to conditionally select code which works for each? Regan
Jul 13 2007
Regan Heath wrote:torhu wrote:The are several simple workarounds. I guess my real question is if this not working is a bug or not. Shouldn't a struct value that's const or invariant be equal to a literal? The value of 'ic' is known at compile-time. Isn't that enough? And can anyone explain this? If I replace this --- struct Outer { Inner i; } --- with this --- struct Outer { const(Inner) i; } --- then i'm actually allowed to initialize outer's i with the const ic variable. That seems a bit backwards, since I've actually changed i from non-const to const.Reposting from D.learn, since there were no answers there. --- struct Inner { int value; } struct Outer { //const(Inner) i; // this fixes it, but is not valid in D 1.0 Inner i; } const Inner ic = { 5 }; // const or invariant here makes no difference Outer outer = { i: ic // line 14 //i: { 5 } // this is allowed }; --- c:\prog\test\D>dmd -c test test.d(14): Error: non-constant expression cast(Inner)ic --- Since the value of ic is fixed at compile time, shouldn't it be equivalent to a literal? I'm trying to make this code work in D version 1 too, and since it's for an example, I'm trying to avoid any string mixins or other ugly workarounds.I can't think of anything. Is there a pre-defined version specifier for D1.0 and D2.0 you could use to conditionally select code which works for each?
Jul 13 2007
"Regan Heath" <regan netmail.co.nz> wrote in message news:f77ov6$1hem$1 digitalmars.com...torhu wrote:There's D_Version2. But there's still a problem - code that is CC'd out still has to be syntactically valid. You'd have to put the code that relies on 2.0 syntax in a separate, conditionally imported module. Stewart.Reposting from D.learn, since there were no answers there. --- struct Inner { int value; } struct Outer { //const(Inner) i; // this fixes it, but is not valid in D 1.0 Inner i; } const Inner ic = { 5 }; // const or invariant here makes no difference Outer outer = { i: ic // line 14 //i: { 5 } // this is allowed }; --- c:\prog\test\D>dmd -c test test.d(14): Error: non-constant expression cast(Inner)ic --- Since the value of ic is fixed at compile time, shouldn't it be equivalent to a literal? I'm trying to make this code work in D version 1 too, and since it's for an example, I'm trying to avoid any string mixins or other ugly workarounds.I can't think of anything. Is there a pre-defined version specifier for D1.0 and D2.0 you could use to conditionally select code which works for each?
Jul 13 2007
torhu wrote:Reposting from D.learn, since there were no answers there. --- struct Inner { int value; } struct Outer { //const(Inner) i; // this fixes it, but is not valid in D 1.0 Inner i; } const Inner ic = { 5 }; // const or invariant here makes no difference Outer outer = { i: ic // line 14 //i: { 5 } // this is allowed }; --- c:\prog\test\D>dmd -c test test.d(14): Error: non-constant expression cast(Inner)ic --- Since the value of ic is fixed at compile time, shouldn't it be equivalent to a literal?
Jul 14 2007