const struct not accepted as initializer by dmd 2.002

torhu fake at address.dude
Fri Jul 13 07:14:33 PDT 2007


Regan Heath wrote:
> 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?

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.



More information about the Digitalmars-d mailing list