www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 3986] New: Struct constructors bypass default initialization of member variables

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3986

           Summary: Struct constructors bypass default initialization of
                    member variables
           Product: D
           Version: 2.036
          Platform: Other
        OS/Version: Windows
            Status: NEW
          Keywords: wrong-code
          Severity: blocker
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: clugdbug yahoo.com.au



If a struct constructor is called implicitly, member variables are
not default initialized. Applies to D2.036 and later.
Here's a simple test case with an assert that fails. (Beware: this test case
doesn't capture the more complex case where one of the members is itself a
struct with a constructor). I'm pretty sure the problem is in declaration.c,
around line 1140.

struct SiberianHamster
{
   int rat = 813;
   this(string z) { }
}

void main()
{
   SiberianHamster basil = "cybil";
   assert(basil.rat == 813);
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 19 2010
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3986


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |patch



PATCH: In VarDeclaration::semantic, it should be doing a blit of the default
initializer before it calls the constructor.
Currently it only does that for explicit constructor calls.
This bug as a blocker, since it makes struct invariants unusable: if a struct
with a class invariant is used as a member of another struct, the invariant
will fail on first use of that struct.


Index: declaration.c
===================================================================
--- declaration.c    (revision 418)
+++ declaration.c    (working copy)
   -1139,6 +1139,14   
                // Rewrite as e1.ctor(arguments)
                 Expression *ector = new DotIdExp(loc, e1, Id::ctor);
                 ei->exp = new CallExp(loc, ector, ei->exp);
+                /* Before calling the constructor, initialize
+                 * variable with a bit copy of the default
+                 * initializer
+                 */
+                Expression *e = new AssignExp(loc, e1, t->defaultInit(loc));
+                e->op = TOKblit;
+                e->type = t;
+                ei->exp = new CommaExp(loc, e, ei->exp);
             } 
             else
             /* Look for opCall

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 20 2010
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3986


Walter Bright <bugzilla digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bugzilla digitalmars.com



00:34:11 PDT ---
changeset 421

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 27 2010
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=3986


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED



Fixed DMD2.043.

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