www.digitalmars.com         C & C++   DMDScript  

D.gnu - [Issue 10] New: ARM: runnable/opover2.d fails: xopEquals fallback

http://gdcproject.org/bugzilla/show_bug.cgi?id=10

             Bug #: 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
#0  0x40106bfc in raise () from /lib/arm-linux-gnueabihf/libc.so.6
#1  0x4010a97c in abort () from /lib/arm-linux-gnueabihf/libc.so.6
#2  0x00008bd8 in ?? ()
#3  0x00008bd8 in ?? ()
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