D.gnu - [Issue 10] New: ARM: runnable/opover2.d fails: xopEquals fallback
- gdc-bugzilla gdcproject.org (81/81) Sep 25 2012 http://gdcproject.org/bugzilla/show_bug.cgi?id=10
http://gdcproject.org/bugzilla/show_bug.cgi?id=10 Summary: ARM: runnable/opover2.d fails: xopEquals fallback aborts instead of throwing Exception Classification: Unclassified Product: GDC Version: development Platform: ARM OS/Version: Linux Status: NEW Severity: normal Priority: Normal Component: gdc AssignedTo: ibuclaw gdcproject.org ReportedBy: johannespfau gmail.com Reduced example: -------------- void main() { // xopEquals NG struct S2a { bool opEquals(S2a rhs) //Add const here and everything OK {return false; } } S2a s; //Should throw exception, instead aborts typeid(S2a).equals(&s, &s); } --------------- Compile: gdc opover2.d -o opover2.exe ./opover2.exe Aborted Incomplete gdb backtrace: --------------- Program received signal SIGABRT, Aborted. 0x40106bfc in raise () from /lib/arm-linux-gnueabihf/libc.so.6 (gdb) bt Backtrace stopped: previous frame identical to this frame (corrupt stack?) --------------- I started looking into this issue, this is what I found: The TypeInfoStruct.equals function is set in TypeInfoStructDeclaration::toDt (typinf.c): --------------- if (sd->xeq) dtxoff(pdt, sd->xeq->toSymbol(), 0, TYnptr); else dtsize_t(pdt, 0); --------------- xeq is built in clone.c, StructDeclaration::buildXopEquals. * If no opEquals function is defined, it return NULL. This is working. * If an opEquals function was found, it tries to produce code to call this function. If this succeeds, everything is working. If this fails, for example because opEquals isn't const, it returns the object._xopEquals function. This is what happens in this test case and isn't working. object._xopEquals is defined in druntime: bool _xopEquals(in void*, in void*) { throw new Error("TypeInfo.equals is not implemented"); } calling it directly is working: object._xopEquals(null, null); //Throws as expected. I'm not sure if this is the root cause, but this is fishy: (TypeInfo_Struct) override equals_t equals(in void* p1, in void* p2) trusted pure nothrow const but: bool _xopEquals(in void*, in void*) Could be another issue of the recent commit, fixing pure/nothrow attributes on functions with asserts: d-decls.cc(FuncDeclaration::toSymbol): Don't set any pure/nothrow attributes if asserts are generated in code. This can't detect the thrown Error in this case, as it's thown via a function pointer. -- Configure issuemail: http://gdcproject.org/bugzilla/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are watching all issue changes.
Sep 25 2012