digitalmars.D.bugs - [Issue 832] New: Struct copying changed in 1.0
- d-bugmail puremagic.com (56/56) Jan 12 2007 http://d.puremagic.com/issues/show_bug.cgi?id=832
- d-bugmail puremagic.com (10/10) Jan 12 2007 http://d.puremagic.com/issues/show_bug.cgi?id=832
- Lionello Lunesu (1/5) Jan 12 2007 Find the differences.. :S
- d-bugmail puremagic.com (36/36) Jan 27 2007 http://d.puremagic.com/issues/show_bug.cgi?id=832
- d-bugmail puremagic.com (5/5) Jan 31 2007 http://d.puremagic.com/issues/show_bug.cgi?id=832
- d-bugmail puremagic.com (9/9) Feb 09 2007 http://d.puremagic.com/issues/show_bug.cgi?id=832
- d-bugmail puremagic.com (5/5) Feb 15 2007 http://d.puremagic.com/issues/show_bug.cgi?id=832
http://d.puremagic.com/issues/show_bug.cgi?id=832 Summary: Struct copying changed in 1.0 Product: D Version: 1.00 Platform: PC OS/Version: Linux Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: bugzilla digitalmars.com ReportedBy: alan akbkhome.com The behaviour changed in dmd-0.178 such that foreach on an array of structs only appears to do a shallow copy, rather than a deep copy. output of the code below is 29/30 or <.178, and a random number on 178/1.0. import std.stdio; const char[] XML_PUBLIC_ID_SYNCML_SYNCML11 ="-//SYNCML//DTD SyncML 1.1//EN"; struct WBXMLPublicIDEntry { int wbxmlPublicID; /**< WBXML Public ID */ char[] xmlPublicID; /**< XML Public ID */ char[] xmlRootElt; /**< XML Root Element */ char[] xmlDTD; /**< XML DTD */ } const WBXMLPublicIDEntry sv_wml11_public_id = { 33, XML_PUBLIC_ID_SYNCML_SYNCML11, "wml", "http://www.wapforum.org/DTD/wml.xml" }; struct WBXMLLangEntry { int langID; /**< Language ID */ WBXMLPublicIDEntry publicID; /**< Public ID */ } const WBXMLLangEntry mainTable[] = [ { 123, sv_wml11_public_id }, { 132, sv_wml11_public_id } ]; void main() { WBXMLLangEntry mt = getfirst(); WBXMLPublicIDEntry pie = getName(mt); writefln("got %d", pie.xmlPublicID.length); } static WBXMLLangEntry getfirst() { foreach(mt;mainTable) { return mt; } } WBXMLPublicIDEntry getName(WBXMLLangEntry mt) { return mt.publicID; } --
Jan 12 2007
http://d.puremagic.com/issues/show_bug.cgi?id=832 wbaxter gmail.com changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|Struct copying changed in |Struct copying changed in |1.0 |1.0 Probably also NRVO-related. See http://d.puremagic.com/issues/show_bug.cgi?id=829 also. --
Jan 12 2007
What |Removed |Added ---------------------------------------------------------------------------- Summary|Struct copying changed in |Struct copying changed in |1.0 |1.0Find the differences.. :S
Jan 12 2007
http://d.puremagic.com/issues/show_bug.cgi?id=832 lio lunesu.com changed: What |Removed |Added ---------------------------------------------------------------------------- Severity|normal |major Keywords| |wrong-code Summary|Struct copying changed in |NRVO: return inside foreach |1.0 |results in junk // Smaller program with same problem. // Should print "1" three times, but only first is OK import std.stdio; struct Struct { int langID; long _force_nrvo; } Struct[1] table; Struct getfirst() { foreach(v; table) { //inout also doesn't work writefln(v.langID);// not OK return v; } } void main() { table[0].langID = 1; foreach(v; table) { writefln(v.langID);//OK break; } auto v = getfirst(); writefln(v.langID);// not OK } --
Jan 27 2007
http://d.puremagic.com/issues/show_bug.cgi?id=832 For reference, the workaround is to return pointers to the struct, rather than passing around the Struct. --
Jan 31 2007
http://d.puremagic.com/issues/show_bug.cgi?id=832 lio lunesu.com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |FIXED Tested both programs, work OK in 1.005 --
Feb 09 2007
http://d.puremagic.com/issues/show_bug.cgi?id=832 Added to DStress as http://dstress.kuehne.cn/run/s/struct_27_A.d --
Feb 15 2007