tested on rawhide, with glibc-2.11.90-10.x86_64: $ cat regex-check.c #include <config.h> #include <limits.h> #include <regex.h> #include <string.h> int main (int argc, char **argv) { char *regexp = (2 <= argc ? argv[1] : "a[b-a]"); struct re_pattern_buffer regex; /* Ensure that [b-a] is diagnosed as invalid. */ re_set_syntax (RE_SYNTAX_POSIX_EGREP); memset (®ex, 0, sizeof regex); const char *s = re_compile_pattern (regexp, strlen (regexp), ®ex); return s == NULL; } $ echo '#define _GNU_SOURCE 1' > config.h $ gcc -g -Wall -W -Wextra regex-check.c -I. $ ./a.out [Exit 1] It looks like the code intends to diagnose that condition with REG_ERANGE, but something is not working: start_collseq = lookup_collation_sequence_value (start_elem); end_collseq = lookup_collation_sequence_value (end_elem); /* Check start/end collation sequence values. */ if (BE (start_collseq == UINT_MAX || end_collseq == UINT_MAX, 0)) return REG_ECOLLATE; if (BE ((syntax & RE_NO_EMPTY_RANGES) && start_collseq > end_collseq, 0)) return REG_ERANGE;
(RE_SYNTAX_POSIX_EGREP & RE_NO_EMPTY_RANGES) == 0
(In reply to comment #1) > (RE_SYNTAX_POSIX_EGREP & RE_NO_EMPTY_RANGES) == 0 Thanks. The real problem is that the non-_LIBC code (which is used in gnulib) performs the range test regardless of whether RE_NO_EMPTY_RANGES is set. The non-LIBC function currently lacks access to the "syntax" variable.