Hi, Martin,
Looks like that there is some issue when I tried to use the _Generic for the
testing cases, and then I narrowed down to a
small testing case that shows the problem without any change to GCC.
[opc@qinzhao-ol8u3-x86 gcc]$ cat t1.c
struct annotated {
char b;
int c[];
} *array_annotated;
extern void * counted_by_ref (int *);
int main(int argc, char *argv[])
{
typeof(counted_by_ref (array_annotated->c)) ret
= counted_by_ref (array_annotated->c);
_Generic (ret, void* : (void)0, default: *ret = 10);
return 0;
}
[opc@qinzhao-ol8u3-x86 gcc]$ /home/opc/Install/latest/bin/gcc t1.c
t1.c: In function ‘main’:
t1.c:12:44: warning: dereferencing ‘void *’ pointer
12 | _Generic (ret, void* : (void)0, default: *ret = 10);
| ^~~~
t1.c:12:49: error: invalid use of void expression
12 | _Generic (ret, void* : (void)0, default: *ret = 10);
| ^
Actually, I debugged this issue into gcc’s C routine
“c_parser_generic_selection”.
And found that, the “default” branch of the _Generic is always parsed even
though there is already
a match in the previous conditions. Therefore, *ret = 10 is parsed even when
ret is a void *, therefore the compilation error.
So, I am not sure whether this is the correct behavior of the operator
_Generic?
Or is there any obvious error in the above small testing case?
If So, then looks like that we cannot use the _Generic operator for this
purpose.
Any comments on this?
Thanks a lot for your help.
Qing
> On Aug 21, 2024, at 11:43, Martin Uecker <[email protected]> wrote:
>
> Am Mittwoch, dem 21.08.2024 um 15:24 +0000 schrieb Qing Zhao:
>>>
>>> But if we changed it to return a void pointer, we could make this
>>> a compile-time check:
>>>
>>> auto ret = __builtin_get_counted_by(__p->FAM);
>>>
>>> _Generic(ret, void*: (void)0, default: *ret = COUNT);
>>
>> Is there any benefit to return a void pointer than a SIZE_T pointer for
>> the NULL pointer?
>
> Yes! You can test with _Generic (or __builtin_types_compatible_p)
> at compile-time based on the type whether you can set *ret to COUNT
> or not as in the example above.
>
> So it is not a weird run-time test which needs to be optimized
> away.
>