digitalmars.D.bugs - [Issue 3139] New: compiler dies "Error: out of memory" with case range
- d-bugmail puremagic.com (38/38) Jul 06 2009 http://d.puremagic.com/issues/show_bug.cgi?id=3139
- d-bugmail puremagic.com (70/70) May 12 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3139
- d-bugmail puremagic.com (12/12) May 16 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3139
http://d.puremagic.com/issues/show_bug.cgi?id=3139 Summary: compiler dies "Error: out of memory" with case range Product: D Version: 2.031 Platform: x86 OS/Version: Linux Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: echochamber gmail.com % cat -n foo.d 1 import std.conv; 2 import std.stdio; 3 4 void main(string[] args) 5 { 6 int i = to!int(args[0]); 7 8 switch (i) { 9 case -9: .. case -1: // line 9 10 writefln("negative"); 11 break; 12 case 0: 13 writefln("zero"); 14 break; 15 default: 16 writefln("positive"); 17 break; 18 } 19 } % dmd foo.d Error: out of memory % -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jul 06 2009
http://d.puremagic.com/issues/show_bug.cgi?id=3139 Don <clugdbug yahoo.com.au> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |patch, wrong-code It goes into an infinite loop because the loop termination condition in CaseRangeStatement::semantic() uses <=. This fails whenever the last case is -1 or ulong.max. x <= -1u is true for all uint x. Worse, if the range goes from negative to positive, wrong code is generated. In my patch, I've also added an error message to detect wrongly-ordered ranges. eg, case 3:..case 2: currently produces "more than 256 cases in case range" which is a bit silly. This also fixes a related accepts-invalid test case. -- TEST CASES FOR TEST SUITE -- void hang3139(int x) { switch(x) { case -9: .. case -1: default: } } int wrongcode3139(int x) { switch(x) { case -9: .. case 2: return 3; default: return 4; } } static assert(wrongcode3139(-5)==3); // bug 3139, accepts-invalid in DMD2.045. static assert(!is(typeof( (long x) { switch(x) { case long.max: .. case -long.max: default:} return 4; }(3) ))); --- PATCH Index: statement.c =================================================================== --- statement.c (revision 484) +++ statement.c (working copy) -3033,6 +3033,14 last = last->optimize(WANTvalue | WANTinterpret); dinteger_t lval = last->toInteger(); + if ( (first->type->isunsigned() && fval > lval) || + (!first->type->isunsigned() && (sinteger_t)fval > (sinteger_t)lval)) + { + error ("first case %s must be less than last case %s", + first->toChars(), last->toChars()); + lval = fval; + } + if (lval - fval > 256) { error("more than 256 cases in case range"); lval = fval + 256; -3049,7 +3057,7 */ Statements *statements = new Statements(); - for (dinteger_t i = fval; i <= lval; i++) + for (dinteger_t i = fval; i != lval + 1; i++) { Statement *s = statement; if (i != lval) -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 12 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3139 Walter Bright <bugzilla digitalmars.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED CC| |bugzilla digitalmars.com Resolution| |FIXED 11:11:02 PDT --- changelog 491 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
May 16 2010