regex: fix a SIZE_MAX macro redefinition warning
PATCH v2 1/1 regex: fix a SIZE_MAX macro redefinition warning
Since commit 56a1a3ab ("Silence GCC's \"cast of pointer to integer of a different size\" warning", 26-10-2015), sparse has been issuing a macro redefinition warning for the SIZE_MAX macro. However, gcc did not issue any such warning.
After commit 56a1a3ab, in terms of the order of #includes and #defines, the code looked something like:
$ cat -n junk.c
1 #include <stddef.h>
2
3 #define SIZE_MAX ((size_t) -1)
4
5 #include <stdint.h>
6
7 int main(int argc, char *argv[])
8 {
9 return 0;
10 }
$
$ gcc junk.c
$However, if you compile that file with -Wsystem-headers, then it will also issue a warning. Having set -Wsystem-headers in CFLAGS, using the config.mak file, then (on cygwin):
$ make compat/regex/regex.o
CC compat/regex/regex.o
In file included from /usr/lib/gcc/x86_64-pc-cygwin/4.9.3/include/stdint.h:9:0,
from compat/regex/regcomp.c:21,
from compat/regex/regex.c:77:
/usr/include/stdint.h:362:0: warning: "SIZE_MAX" redefined
#define SIZE_MAX (__SIZE_MAX__)
^
In file included from compat/regex/regex.c:69:0:
compat/regex/regex_internal.h:108:0: note: this is the location of the previous definition
# define SIZE_MAX ((size_t) -1)
^
$The compilation of the compat/regex code is somewhat unusual in that the regex.c file directly #includes the other c files (regcomp.c, regexec.c and regex_internal.c). Commit 56a1a3ab added an #include of <stdint.h> to the regcomp.c file, which results in the redefinition, since this is included after the regex_internal.h header. This header file contains a 'fallback' definition for SIZE_MAX, in order to support systems which do not have the <stdint.h> header (the HAVE_STDINT_H macro is not defined).
In order to suppress the warning, we move the #include of <stdint.h> from regcomp.c to the start of the compilation unit, close to the top of regex.c, prior to the #include of the regex_internal.h header.
---
Change from v1:
- add the #include <stdint.h> to the top of regex.c, rather than use HAVE_STDINT_H to 'activate' the conditional inclusion of <stdint.h> in the regex_internal.h header.
Junio and Johannes - thanks for the feedback on v1 of the patch.
ATB,
Ramsay Jones
compat/regex/regcomp.c | 2 -- compat/regex/regex.c | 1 + 2 files changed, 1 insertion(+), 2 deletions(-)
compat/regex/regcomp.c +0 -2
@@ -18,8 +18,6 @@Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include <stdint.h> -static reg_errcode_t re_compile_internal (regex_t *preg,const char * pattern,size_t length,reg_syntax_t syntax); static void re_compile_fastmap_iter (regex_t *bufp,
compat/regex/regex.c +1 -0
@@ -60,6 +60,7 @@GNU regex allows. Include it before <regex.h>, which correctly #undefs RE_DUP_MAX and sets it to the right value. */ #include <limits.h> +#include <stdint.h> #ifdef GAWK #undef alloca
Signature · 1 line
2.8.0