Thread overview
[Issue 8118] New: Impossible to initialize a member struct without default constructor or assigment
May 19, 2012
Dmitry Olshansky
Feb 15, 2013
Marco Leise
May 19, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8118

           Summary: Impossible to initialize a member struct without
                    default constructor or assigment
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: critical
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: wfunction@hotmail.com


--- Comment #0 from wfunction@hotmail.com 2012-05-18 17:05:19 PDT ---
struct S
{
    @disable this();
    this(int) { }
    @disable void opAssign(typeof(this));
}

class Test
{
    S s = void;      // I *EXPLICITLY* told it not to be initialized, but...
    this() { s = S(to!int("1")); }
}

void main() { new Test(); }


Error: function S.opAssign is not callable because it is annotated with
@disable
Error: default construction is disabled for type Test



Structs without default constructors are pretty much impossible to use.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8118



--- Comment #1 from wfunction@hotmail.com 2012-05-18 17:05:45 PDT ---
Possibly related: http://d.puremagic.com/issues/show_bug.cgi?id=8117

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8118


Dmitry Olshansky <dmitry.olsh@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dmitry.olsh@gmail.com


--- Comment #2 from Dmitry Olshansky <dmitry.olsh@gmail.com> 2012-05-19 03:44:28 PDT ---
(In reply to comment #0)
> struct S
> {
>     @disable this();
>     this(int) { }
>     @disable void opAssign(typeof(this));
> }
> 
> class Test
> {
>     S s = void;      // I *EXPLICITLY* told it not to be initialized, but...
>     this() { s = S(to!int("1")); }
> }
> 
> void main() { new Test(); }
> 
> 
> Error: function S.opAssign is not callable because it is annotated with
> @disable
> Error: default construction is disabled for type Test
> 
> 
> 
> Structs without default constructors are pretty much impossible to use.
No bug here you just diabled too much. Undisable opAssign.

It's opAssign that gets called whne a = ... is seen:
this() { s = S(to!int("1")); }
If opAssign is trivial it replaced with bitblit. (that is disable comes first!)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8118



--- Comment #3 from wfunction@hotmail.com 2012-05-19 12:15:42 PDT ---
(In reply to comment #2)
> No bug here you just diabled too much. Undisable opAssign.
> 
> It's opAssign that gets called whne a = ... is seen:
> this() { s = S(to!int("1")); }
> If opAssign is trivial it replaced with bitblit. (that is disable comes first!)

Uh, no, it's a bug IMO.


I never asked for an assignment. I want to CONSTRUCT the object manually.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
May 19, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8118



--- Comment #4 from wfunction@hotmail.com 2012-05-19 12:17:48 PDT ---
(In reply to comment #3)
> (In reply to comment #2)
> > No bug here you just diabled too much. Undisable opAssign.
> > 
> > It's opAssign that gets called whne a = ... is seen:
> > this() { s = S(to!int("1")); }
> > If opAssign is trivial it replaced with bitblit. (that is disable comes first!)
> 
> Uh, no, it's a bug IMO.
> 
> 
> I never asked for an assignment. I want to CONSTRUCT the object manually.

For example, pretend this is the Scoped struct. I *obviously* wouldn't want to assign anything, but I'd want to construct the object.

The fact that it's **impossible** to call the constructor directly without an assignment getting in the way (as far as I see) is a bug.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
February 15, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=8118


Marco Leise <Marco.Leise@gmx.de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |Marco.Leise@gmx.de


--- Comment #5 from Marco Leise <Marco.Leise@gmx.de> 2013-02-15 06:17:42 PST ---
(In reply to comment #4)
> The fact that it's **impossible** to call the constructor directly without an assignment getting in the way (as far as I see) is a bug.

I agree with you. I have a struct that is not supposed to be copied. Now I cannot use it as a field in any other struct/class.

In some cases a work-around may be to allow assignments, but check that the receiver is S.init.

Also I tried "= void" first. So it may be the most intuitive to use for the bug fix.

I haven't checked, but it could allow code like this if not currently possible:

S s = void;
if (xyz) {
  s = S(3);
} else {
  s = S(7);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------