https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65471
Wink Saville <wink at saville dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |wink at saville dot com --- Comment #3 from Wink Saville <wink at saville dot com> --- Tested on on gcc 5.3.0 on an x86_64 Arch Linux machine. When using bit field as a selector _Generic uses the default path and in the following test program outputs "unknown": $ cat test.c $ cat test.c #include <stdio.h> struct S { int b0:4; unsigned int b1:4; unsigned long long int b33:33; }; #define type2str(__x) _Generic((__x), \ int : "int", \ unsigned int : "unsigned int", \ unsigned long long int : "unsigned long long int", \ default : "unknown") int main(void) { struct S s = { .b0=3, .b1=4, .b33=0x1FFFFFFFF }; (void)s; // Not used // gcc | clang output printf("type2str(s.b0): %s\n", type2str(s.b0)); // unknown | int printf("type2str(s.b1): %s\n", type2str(s.b1)); // unknown | unsigned int printf("type2str(s.b33): %s\n", type2str(s.b33));// unknown | unsigned long long int return 0; } $ cat Makefile CC = gcc O = 3 STD = c11 M = 32 test: test.c Makefile $(CC) -O$(O) -m$(M) -Wall -std=$(STD) test.c -o test clean: rm -f test $ make clean ; make CC=gcc ; ./test rm -f test gcc -O3 -m32 -Wall -std=c11 test.c -o test type2str(s.b0): unknown type2str(s.b1): unknown type2str(s.b33): unknown $ make clean ;make CC=clang ; ./test rm -f test clang -O3 -m32 -Wall -std=c11 test.c -o test type2str(s.b0): int type2str(s.b1): unsigned int type2str(s.b33): unsigned long long int Additional discussion on gcc thread: https://gcc.gnu.org/ml/gcc/2016-02/msg00255.html