------- Additional Comments From dirk at cle-mens dot de  2005-02-24 12:21 
-------
(In reply to comment #1)
> Invalid for the same reason as PR 20184...
> 

I get the same failure if I use (little endian system)
  inline data::operator uint64 () const 
        { return *reinterpret_cast<const uint64*>(this); }
or
  inline data::operator uint64 () const 
        { return *reinterpret_cast<const uint64*>(&lo); }
or
  inline data::operator uint64 () const 
        { return *(uint64*)&lo; }

It looks like an optimation failure.
The function has to copy 64 bits, but it only copies the low 32 bits into the
result. For verifying this, I have changed the values of table 'tab[]' into
{1,1,1,1,1}

Let's have a lokk into the assembler listing

        movl    $1, -48(%ebp)
        movl    $0, -44(%ebp)  // this is data::data(1) -> u64

        pushl   %edx            // the hi-32-bits of u64, but edx was not set
        movl    -48(%ebp), %eax // the low-32-bit of u64
        pushl   %eax
        pushl   $.LC3
        call    printf

And again: This failure appears only with the combination of inline and the
option -O2.

-------
Another question: I marked this bug 'reopen' while I'm posting this. Is this the
correct way?

-- 
           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |UNCONFIRMED
         Resolution|INVALID                     |


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

Reply via email to