This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: optimization/5969: When function is declared func(unsigned char v), v isn't truncated
- From: David Ashley <dash at xdr dot com>
- To: dberlin at sources dot redhat dot com
- Cc: gcc-bugs at gcc dot gnu dot org, gcc-gnats at gcc dot gnu dot org, gcc-prs at gcc dot gnu dot org, nobody at gcc dot gnu dot org
- Date: Sat, 16 Mar 2002 16:10:33 -0800
- Subject: Re: optimization/5969: When function is declared func(unsigned char v), v isn't truncated
>Synopsis: When function is declared func(unsigned char v), v isn't truncated
>
>Responsible-Changed-From-To: unassigned->dberlin
>Responsible-Changed-By: dberlin
>Responsible-Changed-When: Sat Mar 16 15:01:56 2002
>Responsible-Changed-Why:
> Me
>State-Changed-From-To: open->feedback
>State-Changed-By: dberlin
>State-Changed-When: Sat Mar 16 15:01:56 2002
>State-Changed-Why:
> You have implicitly declared tst to take an int by using it before it's defined.
> Because it is inlined into main at -O2, and at that point it thinks it takes an int, it never performs the truncation.
>
> Any code after the tst function is defined to take an unsigned char will do the truncation.
>
> The problem is the code, not the compiler, AFAIK.
> The title of the bug report is misleading, you haven't declared func(unsigned char v), if you did, the problem would go away.
>
>http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=5969
I think compiled code should function exactly the same with or without -O2,
but that's just my opinion. The problem here wasn't that the function was
being called by 'c' code, it was being called by some ppc asm code. The
first thing I did was turn on -Wall, then fixed all the warnings. But I didn't
get any warnings about the ppc asm code calling the C function incorrectly,
of course.
How can the function be inlined into main even before the function is
declared? And if it is being inlined once it is declared, that means a
multi pass compiler or equivalent. So the compiler should know how to call
the function by then.
If your function is declared
void func(unsigned char x)
{
printf("sizeof(x)=%d\n",sizeof(x));
printf("x=%x\n",x);
}
You can call that from asm or from another code fragment with
func(0x21);
func(0x4321);
and get different output. But sizeof prints out 1 for 1 byte. It seems to me
inconsistent.
As far as the title of the bug report being misleading, it's not like I'm
an expert at reporting gcc bugs, there are basically no bugs :^). And it is
difficult to explain within one line what is happening...
Thanks---
Dave
dash@xdr.com