[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