On Fri, Mar 1, 2013 at 3:43 PM, Ian Lance Taylor <i...@google.com> wrote: > On Fri, Mar 1, 2013 at 4:57 AM, Uros Bizjak <ubiz...@gmail.com> wrote: >> >> Due to the fact that libFFI does not handle C99 _Complex arguments >> correctly [1], libgo passes Complex64 and Complex128 arguments via a >> temporary structure. However, passing parts of complex number in a >> structure is not the same as passing true C99 _Complex value, so this >> workaround introduces ABI mismatch between caller and callee. This >> mismatch results in wrong passed values of complex types. >> >> Fortunately all x86 ABIs tolerate this mismatch, but other targets >> (i.e. alpha) don't have this privilege. > > Is there a PR open against libffi?
Not that I know of, but I can open one if requested. > Do we have any idea which targets pass complex in a manner different > than a struct of two float/doubles? Your patch assumes that only x86 > targets work, but I would expect that many targets work that way. Maybe a test could be added to reflect package that calls foreign function with _Complex arguments/return value? The function should do some basic arithmetic on complex values and the test could check if it returns expected values. This test would reliably catch affected targets. Uros.