[Issue 7180] New: Documentation bug of "Const and Invariant Structs"

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Dec 28 23:48:43 PST 2011


http://d.puremagic.com/issues/show_bug.cgi?id=7180

           Summary: Documentation bug of "Const and Invariant Structs"
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: spec
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: andrei at metalanguage.com
        ReportedBy: k.hara.pg at gmail.com


--- Comment #0 from Kenji Hara <k.hara.pg at gmail.com> 2011-12-28 23:48:35 PST ---
>From http://d-programming-language.org/struct.html

> Const and Invariant Structs
> 
> A struct declaration can have a storage class of const, immutable or shared.
> It has an equivalent effect as declaring each member of the struct as const,
> immutable or shared.
> 
> const struct S { int a; int b = 2; }
> 
> void main() {
>   S s = S(3); // initializes s.a to 3
>   S t;        // initializes t.a to 0
>   t = s;      // ok, t.a is now 3       // (line 6)
>   t.a = 4;    // error, t.a is const    // (line 7)
> }

Current dmd (2.058head) raises following errors against the sample code:

test.d(6): Error: variable test.main.t cannot modify const
test.d(7): Error: can only initialize const member a inside constructor

Because the definition of S is internally translated to:

struct __S { int a; int b = 2; }
alias const(__S) S;

But, if you replace the definition to

struct S { const int a; const int b = 2; }

the compilation still raises:

test.d(6): Error: variable test.main.t cannot modify struct with immutable
members
test.d(7): Error: can only initialize const member a inside constructor

Because mutable object that has non-mutable members is "not assignable", then t
= s is invalid, even if t and s are mutable S.

Finally I think this is documentation bug.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list