------- Comment #23 from hjl dot tools at gmail dot com  2009-04-08 23:41 
-------
This looks like an ABI issue:

[...@gnu-6 pr39678]$ cat pr39678.c
#include <stdio.h>

struct Y {};
struct X {
  struct Y y;
  __complex__ float val;
};

struct X __attribute__((noinline))
foo (float *p)
{
  struct X x;
  __real x.val = p[0];
  __imag x.val = p[1];
  return x;
}
#ifdef __cplusplus
extern "C"
#endif
void abort (void);
float a[2] = { 3., -2. };
int main()
{
  struct X x = foo(a);
  printf ("X: %d\n", (int) sizeof (struct X));
  printf ("Y: %d\n", (int) sizeof (struct Y));
  if (__real x.val != 3.)
    abort ();
  if (__imag x.val != -2.)
    abort ();
  return 0;
}
[...@gnu-6 pr39678]$ gcc pr39678.c
[...@gnu-6 pr39678]$ ./a.out 
X: 8
Y: 0
[...@gnu-6 pr39678]$ g++ pr39678.c
[...@gnu-6 pr39678]$ ./a.out 
X: 12
Y: 1
Aborted
[...@gnu-6 pr39678]$ 

"struct Y {};" isn't handled properly in C++.


-- 

hjl dot tools at gmail dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jh at suse dot cz
            Summary|std::transform is incorrect |C++ empty struct is passed
                   |with std::multiples and     |incorrectly
                   |bind2nd for complex<float>  |


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39678

Reply via email to