digitalmars.D.bugs - [Issue 3986] New: Struct constructors bypass default initialization of member variables
- d-bugmail puremagic.com (34/34) Mar 19 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3986
- d-bugmail puremagic.com (34/34) Mar 20 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3986
- d-bugmail puremagic.com (10/10) Mar 27 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3986
- d-bugmail puremagic.com (11/11) Apr 10 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3986
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
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
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
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