September 17, 2014 [Issue 13488] New: [reg] implicit conversions to immutable broken | ||||
---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=13488 Issue ID: 13488 Summary: [reg] implicit conversions to immutable broken Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: regression Priority: P1 Component: DMD Assignee: nobody@puremagic.com Reporter: bugzilla@digitalmars.com I had this working earlier, but subsequent fixes broke it: struct T { const(int)* p = null; this(const(int)* q) pure { p = q; } } void foo() { int x; T p1 = T(&x); // ok // immutable(T) p2 = T(&x); // error immutable int y; immutable(T) p3 = T(&y); // line 14, should be ok immutable(T)* p4 = new T(&y); // line 15, should be ok } C:\cbx\mars>dmd -c foo DMD v2.066 DEBUG foo.d(14): Error: cannot implicitly convert expression ((T __ctmp2 = T; , __ctmp2).this(& y)) of type T to immutable(T) foo.d(15): Error: cannot implicitly convert expression (new T(& y)) of type T* to immutable(T)* The non-constructor version of it also fails: struct S { const(int)* p; } void bar() { int x; // immutable(S)* q1 = new S(&x); // Error, &x is not unique immutable(S)* q2 = new S(null); // Ok immutable y = 3; immutable(S)* q3 = new S(&y); // line 11, this should work immutable(S)* q4 = new S(new int); // Ok immutable(int)* i2; immutable(S)* q5 = new S(i2); // line 14, this should work pure int* foo(); immutable(S)* q6 = new S(foo()); // Ok } C:\cbx\mars>dmd -c foo2 DMD v2.066 DEBUG foo2.d(11): Error: cannot implicitly convert expression (new S(& y)) of type S* to immutable(S)* foo2.d(14): Error: cannot implicitly convert expression (new S(cast(const(int)*)i2)) of type S* to immutable(S)* It's critical that these get fixed. -- |
Copyright © 1999-2021 by the D Language Foundation