Le jeudi 05 mars 2015, 22:13:17 Edmund Grimley Evans a écrit :
> Can anyone think of an argument for preserving the way TCC currently
> stores an integer constant in one of the following union members?
> 
>     int i;
>     unsigned int ui;
>     unsigned int ul; /* address (should be unsigned long on 64 bit cpu) */
>     long long ll;
>     unsigned long long ull;

Funny, I never thought about it. Digging into the history 
(25618c0430b58d1d5522091c83c89cdde83135f1) one can see that there was no such 
duplication for integer initially. There is this for float but I suppose it's 
to not have more precision than the programmer requested.

> 
> To me it seems to make the implementation more complicated while
> inviting people to rely on undefined behaviour such as signed overflow
> and writing to one member of a union then reading from another. The
> obvious thing to do is to use unsigned long long (or uint64_t or
> uintmax_t) for all integer constants, but I've not actually tried
> changing the code.

If there is a lot of such union some space might be saved but I'm not 
convinced it's significant. Setting a value in one field and accessing it in 
another is forbidden by the C standard I think (aliasing?) and anyway only 
make sense for downcasting on little endian target. I don't think the 
endianness is such a big problem because this assumption must already be all 
over the place but avoiding bug and simplifying the code is a good reason to 
get rid of this.

Best regards,

Thomas

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
Tinycc-devel mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to