[Issue 8958] New: [RFC] Make constructors/postblits/destructors work correctly with const/immutable qualifiers
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sat Nov 3 07:59:52 PDT 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8958
Summary: [RFC] Make constructors/postblits/destructors work
correctly with const/immutable qualifiers
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: enhancement
Priority: P2
Component: DMD
AssignedTo: nobody at puremagic.com
ReportedBy: verylonglogin.reg at gmail.com
--- Comment #0 from Denis Shelomovskij <verylonglogin.reg at gmail.com> 2012-11-03 17:59:49 MSK ---
A proposal to fix Issue 8956 - Ability to break typesystem with
constructor/postblit/destructor
First, lets make them qualifier-overloadable.
Then let we have such struct:
---
class C { }
struct S0
{ int i; immutable int* p; }
struct S1
{ int i; int* p; }
struct S2
{ S1 s1; }
struct S
{
int i;
int* p;
int[] darr;
int[1] sarr;
C c;
S0* pS0;
S1 s1;
S1[1] sarrS1;
S1* pS1;
S2 s2;
this(this) inout // e.g. a postblit
{
// What will we see here?
}
}
---
In an `inout` ctor/postblit/dtor we will see fields as:
* For pointers and dynamic arrays, as a result of `cast()`:
inout(int)* p;
inout(int)[] arr;
inout(S0)* pS0;
inout(S1)* pS1;
* For class references
* require Issue 5325 - Mutable references to const/immutable/shared classes
inout(C)ref c;
* For types where `inout(T)` is assignable to `T` (primitive types, some
structs/unions):
int i;
int[1] i;
S0 s0;
* For all other types (structs/unions):
inout(S1) s1;
inout(S1[1]) sarrS1;
inout(S2) s2;
* But assignment is allowed:
s1 = inout(S1)();
* Assignment by index or property is allowed if it writes to (&this)[0 ..
1] memory:
sarrS1[0] = inout(S1)();
s2.s1 = inout(S1)();
s2.s1.i = 5;
* For its fields that are in (&this)[0 .. 1] memory same type-replacement
rules apply:
is(typeof(s2.s1.i) == int)
This proposal can be consolidated in some analog of `inout(T)ref` from Issue
5325 but for structs with same syntax and one simple rule: it is mutable if it
is in (&this)[0 .. 1] memory.
You are welcome to find mistakes, improve, destroy or make a counter-proposal!
--
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