From: Pete B. <pb...@gm...> - 2011-01-18 11:43:08
|
On 2011.01.18 01:53, Segher Boessenkool wrote: > So the union has a 4-byte and an 8-byte member. Hrm. Yeah. Nothing fancy about that. > Do you use -fms-extensions? Nope. > Do you use -Wall -Wextra? Does that tell you anything? Nothing about anonymous structs/unions being dropped. But I'll cut down to the chase: 1. The problem is due to using -std=c99. As pointed by [1]: "Anonymous unions are a GNU extension, not part of any standard version of the C language." and if you compile a test program with anonymous struct/unions an -std=c99, you'll get the warning: "warning: declaration does not declare anything". With std=gnu99, everything is fine (and OVERLAPPED are 20 bytes). I guess, since we fixed the shadow warning errors, we could switch back to gnu99 for cygwin, but the switch was also there to prevent Windows code contributors testing only on a GNU platform from using GNU extensions which MS compilers wouldn't know how to handle (and even then, MSVC compilers are entirely not C99 compliant). 2. For some reason, despite using -Wall and everything, we're not getting the warning highlighted above when compiling files that use OVERLAPPED in c99 mode. Doesn't seem to be a libtool issue, as issuing a line like: $ gcc -DHAVE_CONFIG_H -I. -I.. -I../.. -std=c99 -Wall -Wextra -Wundef -Wunused -Wstrict-prototypes -Werror-implicit -function-declaration -Wshadow -g -O2 -c -o poll_windows.o poll_windows.c ,which is pretty much a verbatim copy of how gcc is invoked for poll_windows (with -Wextra added), does not report anything wrong about the OVERLAPPED from winbase.h. So much for -Wall giving us a heads up... > What is the exact GCC version? As reported before, these would be the latest from cygwin, hence gcc 3.4.4 AND gcc 4.3.4. I also confirmed, as expected from the above, that MinGW (gcc 3.4.5) would have the same issue if using anonymous struct/unions for OVERLAPPED in winbase.h. So there you have it. Our 2 course of actions are: - telling the cygwin guys that using GNU extensions and all is fine as long as they expect all source code to be GNU compliant, but it's going to restrict people who want to use C99 on code that they crafted at being compiled by non GNU. Therefore, they should try to avoid GNU extensions in their headers. Of course, that'd only fix the issue once people upgrade their cygwin. - using gnu99 for cygwin compilation Regards, /Pete [1] http://stackoverflow.com/questions/3228104/anonymous-union-within-struct-not-in-c99 |