https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114731
--- Comment #20 from Alejandro Colomar <alx at kernel dot org> ---
Hmmmm, I like the _Generic() to assert the type. Thanks!
With that, I find it more acceptable. At least I don't need to use GNU
extensions, and the cast is coupled with the verification of the type. It's a
bit repetitive, but acceptable.
I agree that using heuristics to fix this would be bad.
Feel free to close as WONTFIX.
Have a lovely day!
Alex
Below is the program using _Generic() to assert the type.
alx@debian:~/tmp/c$ cat g.c
#include <assert.h>
#include <bsd/inttypes.h>
#include <errno.h>
#include <time.h>
#define a2i(TYPE, n, s, endp, base, min, max) \
({ \
_Generic((TYPE) 0, \
long: a2sl(_Generic(n, TYPE *: (long *) n), s,
endp, base, min, max), \
int: a2si(_Generic(n, TYPE *: (int *) n), s,
endp, base, min, max) \
); \
})
#define a2sl(n, s, endp, base, min, max) \
( \
_Generic(endp, \
const char **: a2sl_c, \
char **: a2sl_nc, \
void *: a2sl_nc \
)(n, s, endp, base, min, max) \
)
#define a2si(n, s, endp, base, min, max) \
( \
_Generic(endp, \
const char **: a2si_c, \
char **: a2si_nc, \
void *: a2si_nc \
)(n, s, endp, base, min, max) \
)
static inline int a2sl_c(long *restrict n, const char *s,
const char **restrict endp, int base, long min, long max);
static inline int a2si_c(int *restrict n, const char *s,
const char **restrict endp, int base, int min, int max);
static inline int a2sl_nc(long *restrict n, const char *s,
char **restrict endp, int base, long min, long max);
static inline int a2si_nc(int *restrict n, const char *s,
char **restrict endp, int base, int min, int max);
static inline int
a2sl_c(long *restrict n, const char *s,
const char **restrict endp, int base, long min, long max)
{
return a2sl_nc(n, s, (char **) endp, base, min, max);
}
static inline int
a2si_c(int *restrict n, const char *s,
const char **restrict endp, int base, int min, int max)
{
return a2si_nc(n, s, (char **) endp, base, min, max);
}
static inline int
a2sl_nc(long *restrict n, const char *s,
char **restrict endp, int base, long min, long max)
{
int status;
*n = strtoi(s, endp, base, min, max, &status);
if (status != 0) {
errno = status;
return -1;
}
return 0;
}
static inline int
a2si_nc(int *restrict n, const char *s,
char **restrict endp, int base, int min, int max)
{
int status;
*n = strtoi(s, endp, base, min, max, &status);
if (status != 0) {
errno = status;
return -1;
}
return 0;
}
int
main(void)
{
time_t t;
a2i(time_t, &t, "42", NULL, 0, 0, 10);
}
alx@debian:~/tmp/c$ cc -Wall -Wextra g.c -S
alx@debian:~/tmp/c$