digitalmars.D.bugs - [Issue 12150] New: Regression (2.063): char[] implicitly converts to string in .dup expression
- d-bugmail puremagic.com (40/40) Feb 13 2014 https://d.puremagic.com/issues/show_bug.cgi?id=12150
- d-bugmail puremagic.com (22/22) Feb 13 2014 https://d.puremagic.com/issues/show_bug.cgi?id=12150
- d-bugmail puremagic.com (6/6) Feb 13 2014 https://d.puremagic.com/issues/show_bug.cgi?id=12150
- d-bugmail puremagic.com (8/8) Feb 13 2014 https://d.puremagic.com/issues/show_bug.cgi?id=12150
- d-bugmail puremagic.com (11/13) Feb 13 2014 https://d.puremagic.com/issues/show_bug.cgi?id=12150
- d-bugmail puremagic.com (14/17) Feb 13 2014 https://d.puremagic.com/issues/show_bug.cgi?id=12150
- d-bugmail puremagic.com (25/28) Feb 13 2014 https://d.puremagic.com/issues/show_bug.cgi?id=12150
- d-bugmail puremagic.com (29/33) Feb 13 2014 https://d.puremagic.com/issues/show_bug.cgi?id=12150
https://d.puremagic.com/issues/show_bug.cgi?id=12150 Summary: Regression (2.063): char[] implicitly converts to string in .dup expression Product: D Version: D2 Platform: All OS/Version: All Status: NEW Keywords: accepts-invalid Severity: regression Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: andrej.mitrovich gmail.com 02:10:17 PST --- ----- int foo(string arg) { return foo(arg.dup); // calls itself, stack overflow! } void main() { foo("foo"); } ----- Note that storing the .dup to a variable first avoids the accepts-invalid: ----- int foo(string arg) { auto duped = arg.dup; return foo(duped); // NG, caught at compile-time } void main() { foo("foo"); } ----- -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 13 2014
https://d.puremagic.com/issues/show_bug.cgi?id=12150 02:12:32 PST --- Here's the slightly reduced example code of where I ran into the issue: ----- import std.file; int parseCode(string code) { return parseCode(code.dup); } int parseCode(ubyte[] code) { return 0; } void main() { parseCode(cast(ubyte[])std.file.read("test.d")); // ok parseCode("foo"); // stack overflow } ----- -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 13 2014
https://d.puremagic.com/issues/show_bug.cgi?id=12150 This is an intended change. See issue 9656. -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 13 2014
https://d.puremagic.com/issues/show_bug.cgi?id=12150 07:28:15 PST --- But the regression is likely unintended. Did anyone actually request for the feature in Issue 9656? Magical built-in behavior is something we should avoid IMHO, exactly because of issues like this.. -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 13 2014
https://d.puremagic.com/issues/show_bug.cgi?id=12150 bearophile_hugs eml.cc changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bearophile_hugs eml.ccMagical built-in behavior is something we should avoid IMHO, exactly because of issues like this..On the other hand the change of Issue 9656 seems useful. -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 13 2014
https://d.puremagic.com/issues/show_bug.cgi?id=12150 Jakob Ovrum <jakobovrum gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jakobovrum gmail.com ---But the regression is likely unintended. Did anyone actually request for the feature in Issue 9656? Magical built-in behavior is something we should avoid IMHO, exactly because of issues like this..I might be missing something, but where is the regression? The example you posted doesn't seem to be a regression because char[] isn't implicitly convertible to either `string` or `ubyte[]`, so surely the code would simply not compile. -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 13 2014
https://d.puremagic.com/issues/show_bug.cgi?id=12150But the regression is likely unintended. Did anyone actually request for the feature in Issue 9656? Magical built-in behavior is something we should avoid IMHO, exactly because of issues like this..That is not magic. It is consistent with the implicit conversion for the returned value from pure function. E[] dup(E)(const(E)[] src) pure { E[] r; r.reserve(src.length); foreach (ref e; src) r ~= e; return r; } int foo(string arg) { return foo(dup(arg)); // returned char[] is implicitly convertible to string } void main() { foo("foo"); } -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 13 2014
https://d.puremagic.com/issues/show_bug.cgi?id=12150 Andrej Mitrovic <andrej.mitrovich gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |INVALID 07:42:50 PST ---I might be missing something, but where is the regression? The example you posted doesn't seem to be a regression because char[] isn't implicitly convertible to either `string` or `ubyte[]`, so surely the code would simply not compile.Ah I thought it would compile, after I added an explicit cast to avoid the recursive call it ended up compiling, but it wouldn't otherwise even though I thought it would. So you're right. There's no regression here. The below test-case works properly: ----- int foo(string arg) { return foo(arg.dup); // calls second overload } int foo(char[] b) { assert(0); } void main() { auto x = foo(""); } ----- -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 13 2014