D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 7180 - Documentation bug of "Const and Invariant Structs"
Summary: Documentation bug of "Const and Invariant Structs"
Status: RESOLVED WORKSFORME
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P2 normal
Assignee: Andrei Alexandrescu
URL:
Keywords: spec
Depends on:
Blocks:
 
Reported: 2011-12-28 23:48 UTC by Kenji Hara
Modified: 2012-01-21 01:18 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Kenji Hara 2011-12-28 23:48:35 UTC
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.
Comment 1 Walter Bright 2012-01-21 01:18:28 UTC
The documentation was recently fixed.