Compiler Bug, Pelles C V8.00 RC3 64-bit, simple example included

Started by RichieL, May 08, 2014, 12:37:35 PM

Previous topic - Next topic

RichieL

The following program will print "true" with optimization turned off, and "false" when optimization is set to "Maximize Speed", if you input 0 when it runs:

#include <stdio.h>
int main(int argc, char *argv[])
{
struct foo
    {
unsigned char a;
unsigned char b;
};
#define Civility(X) ((int)X.a * 100 + (int)X.b)

struct foo Ralf[2]   = {{1,14}, {0, 0}};
struct foo baboon[2] = {{3,13}, {0, 0}};
int        j;

scanf("%d", &j);
    printf((Civility(Ralf[j]) < Civility(baboon[j])) ? "true\n" : "false\n");
}

The correct answer is "true" - Civility(Ralf[j]) < Civility(baboon[j]) for all j.

The problem appears to be that despite the explicit casts to int in the conditional expression, the compiler generates byte arithmetic and a byte compare with optimiztion on, and does byte-to-int conversions with optimization off. If I read the C specification correctly, the "usual arithmetic conversions" should cause byte-to-int conversions even in the absence of the explicit casts.

I have not tested this on the 32-bit version of RC3. The 32-bit version of V7.00 does 32-bit compares even with optimizations turned on.

        Richie

Pelle

/Pelle