Bug 5533 – Regression(2.051, Linux only): segv: -gc, associative arrays, const pointers to self
Status
RESOLVED
Resolution
DUPLICATE
Severity
regression
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Linux
Creation time
2011-02-06T12:50:00Z
Last change time
2011-12-19T10:08:15Z
Keywords
ice-on-valid-code
Assigned to
nobody
Creator
webmaster
Comments
Comment #0 by webmaster — 2011-02-06T12:50:03Z
Regression from 2.050 to 2.051 (Linux).
When compiling with -gc -c, the testcase below will cause 2.051 to segv.
File compiles OK on 2.050.
File also compiles just fine (even on 2.051) if -gc is omitted.
DMD produces expected link errors if you compile with only -gc argument.
The key issues appear to be:
- The foreach loop inside the function.
- The parent pointer in Foo must be *BOTH* const and a pointer to its own
type. If you make it non-const, or a pointer to something else, it works.
TESTCASE:
void DMD_BUG_WORKAROUND() // issue 3770
{
/* if you don't have a dummy function like this in the module where a type
* was declared, then dmd won't give it to you when you use it in an
* associative array elsewhere, and you'll get link errors.
*/
Foo tmp;
string dummy;
foreach(name; tmp.table.keys)
dummy ~= name;
}
struct Foo
{
const(Foo) *parent;
FooElem*[string] table;
};
struct FooElem
{
};
Comment #1 by yebblies — 2011-07-03T09:35:02Z
This works for me on win32 with dmd head (2.054).
Can anybody reproduce this on linux with the current dmd?
Comment #2 by webmaster — 2011-07-25T21:45:17Z
I tested this on 2.054 (Linux: Fedora 14 x86 32-bit), and the problem still exists.
Comment #3 by webmaster — 2011-08-26T13:50:27Z
I built dmd and ran it under gdb, and it appears that the problem is infinite recursion in the function dwarf_typidx(TYPE*).
Comment #4 by code — 2011-12-19T10:08:15Z
*** This issue has been marked as a duplicate of issue 7127 ***