[Issue 9404] Nullable is unusable with 2.061
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Wed Jan 30 20:29:50 PST 2013
http://d.puremagic.com/issues/show_bug.cgi?id=9404
Kenji Hara <k.hara.pg at gmail.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |pull, rejects-valid
Platform|x86_64 |All
OS/Version|Linux |All
Severity|enhancement |regression
--- Comment #6 from Kenji Hara <k.hara.pg at gmail.com> 2013-01-30 20:29:48 PST ---
https://github.com/D-Programming-Language/dmd/pull/1585
https://github.com/D-Programming-Language/phobos/pull/1105
---
(In reply to comment #2)
> ----------------
> The real question is: Why did the first example ever work at all? I've tracked
> it down to this usecase, with *at least*, a 3-level nest:
>
> //----
> import std.typecons;
> import std.stdio;
>
> struct S
> {
> void opAssign(int){writeln("opAssign");}
> int get(){writeln("get"); return 1;}
> alias get this;
> }
>
> struct SS
> {
> S s;
> }
>
> struct SSS
> {
> SS ss;
> this(SS i)
> {
> ss = i;
> }
> }
>
> void main() {
> SS ss;
> SSS(ss);
> }
> //----
>
> DMD 2.060:
> //----
> //----
>
> DMD 2.061:
> //----
> get
> opAssign
> //----
>
> AFAIK, 2.061 is the correct behavior. Something must have been fixed in 2.061,
> so that explains the *change* in behavior. So there should be nothing to fix
> there... But I'll let own of the compiler guys confirm.
>
> In any case, I'll fix open a pull to improve Nullable to accept assignment from
> another nullable.
Yes, it is intended behavior in 2.061. The pull request had merged:
https://github.com/D-Programming-Language/dmd/pull/166
Was for implementing it.
But, sorry, it was not complete. In 2.061, user-defined opAssign is now
_overly_ considered and used for the identity assignment. It is a compiler
regression.
In this case, Nullable!T should generate bitwise copy for identity assignment.
> alias N = Nullable!int;
> void foo(N a) {
> N b;
> b = a; // must be bitwise, must not invoke Nullable!int.opAssign(int)
> }
If the assignment is not identity, user-defined opAssing should be called.
void foo(N a) {
N b;
b = 1; // b.opAssign(1) is called
b = ""; // b.opAssign("") is called, and compiler will cause an error
}
--
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