On 02/19/2016 11:25 AM, Wink Saville wrote:
I'm using gcc 5.3.0:
$ gcc --version
gcc (GCC) 5.3.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
And I've tried to use _Generic to print the type of a bit field but
the compiler fails with:
$ make
gcc -Wall -std=c11 -o test.o -c test.c
test.c: In function ‘main’:
test.c:8:35: error: ‘_Generic’ selector of type ‘unsigned char:2’ is
not compatible with any association
#define type_to_str(__x) _Generic((__x), \
^
test.c:17:18: note: in expansion of macro ‘type_to_str’
printf("%s\n", type_to_str(b.f1));
^
Makefile:7: recipe for target 'test.o' failed
make: *** [test.o] Error 1
bash: ./test: No such file or directory
The test program is:
$ cat test.c
#include <stdio.h>
struct bits {
unsigned char f0;
unsigned char f1:2;
};
#define type_to_str(__x) _Generic((__x), \
unsigned char : "unsigned char")
int main(void) {
struct bits b = { .f0 = 255, .f1 = 3 };
printf("%d\n", b.f0);
printf("%s\n", type_to_str(b.f0));
printf("%d\n", b.f1);
printf("%s\n", type_to_str(b.f1));
return 0;
}
...
How do I create a type association for a bit field?
I suspect this falls under the set of issues that fall under bug
65471 - type interpretation in _Generic. The C language rules
for _Generic aren't completely clear about what conversions are
to take place. It would be helpful if you could your test case
to the bug to make sure the bitfield case is considered when
the issue is discussed by the C committee.
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65471
The only idea for a workaround that comes to mind is to trick GCC
into forgetting that it's a bit-field. This hack seems to work:
#define type_to_str(__x) _Generic((0)?(__x):(__x), \
Martin