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









d-bugmail puremagic.com 