From 31ff141c226d00ce8c85562e7812ff1178cb45ed Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 17 May 2013 22:32:17 -0700 Subject: [PATCH] Port --enable-gcc-warnings to clang. * configure.ac (nw): Remove obsolescent warnings. These aren't needed for clang, or for gcc for that matter. (emacs_cv_clang): New var, which tests for clang. Omit warnings that clang is too picky about. (GLIB_DISABLE_DEPRECATION_WARNINGS): Define this; needed for Ubuntu 13.04 + clang + --enable-gcc-warnings. * lib-src/etags.c: Omit unnecessary forward decls. (print_version, print_help): Declare _Noreturn. * lib-src/pop.c (socket_connection) [HAVE_GETADDRINFO]: Simplify. * src/bytecode.c (exec_byte_code): * src/regex.c: Redo diagnostic pragmas to pacify clang, too. * src/dbusbind.c (xd_retrieve_arg): Do not use uninitialized variable. * src/editfns.c (Fencode_time): * src/fileio.c (file_accessible_directory_p): * src/font.c (font_unparse_xlfd): Use '&"string"[index]' instead of '"string" + (index)'. * src/undo.c (user_error): Remove; unused. --- ChangeLog | 8 ++++++++ configure.ac | 47 ++++++++++++++++++++++++++++------------------- lib-src/ChangeLog | 7 +++++++ lib-src/etags.c | 13 ++----------- lib-src/pop.c | 36 +++++++++++++++--------------------- src/ChangeLog | 13 +++++++++++++ src/bytecode.c | 7 +++++-- src/dbusbind.c | 2 +- src/editfns.c | 2 +- src/fileio.c | 2 +- src/font.c | 4 ++-- src/regex.c | 7 +++++-- src/undo.c | 6 ------ 13 files changed, 88 insertions(+), 66 deletions(-) diff --git a/ChangeLog b/ChangeLog index 280aa2fbc4d..ed30fc35ad1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2013-05-18 Paul Eggert + Port --enable-gcc-warnings to clang. + * configure.ac (nw): Remove obsolescent warnings. + These aren't needed for clang, or for gcc for that matter. + (emacs_cv_clang): New var, which tests for clang. + Omit warnings that clang is too picky about. + (GLIB_DISABLE_DEPRECATION_WARNINGS): Define this; + needed for Ubuntu 13.04 + clang + --enable-gcc-warnings. + * make-dist (files): Add nt/Makefile.in, nt/gnulib.mk. Otherwise, 'configure; make' fails on non-Windows builds. diff --git a/configure.ac b/configure.ac index 54f499e2126..00c841e77b0 100644 --- a/configure.ac +++ b/configure.ac @@ -554,7 +554,7 @@ case "${canonical}" in i[3456]86-*-* ) case "${canonical}" in *-darwin* ) opsys=darwin ;; - *-mingw32 ) + *-mingw32 ) opsys=mingw32 # MinGW overrides and adds some system headers in nt/inc. GCC_TEST_OPTIONS="-I $srcdir/nt/inc" @@ -747,27 +747,13 @@ else esac AC_SUBST([WERROR_CFLAGS]) - nw="$nw -Waggregate-return" # anachronistic - nw="$nw -Wlong-long" # C90 is anachronistic - nw="$nw -Wc++-compat" # We don't care about C++ compilers - nw="$nw -Wundef" # Warns on '#if GNULIB_FOO' etc in gnulib - nw="$nw -Wtraditional" # Warns on #elif which we use often - nw="$nw -Wcast-qual" # Too many warnings for now - nw="$nw -Wconversion" # Too many warnings for now nw="$nw -Wsystem-headers" # Don't let system headers trigger warnings - nw="$nw -Wsign-conversion" # Too many warnings for now nw="$nw -Woverlength-strings" # Not a problem these days - nw="$nw -Wtraditional-conversion" # Too many warnings for now - nw="$nw -Wunreachable-code" # so buggy that it's now silently ignored - nw="$nw -Wpadded" # Our structs are not padded - nw="$nw -Wredundant-decls" # we regularly (re)declare functions nw="$nw -Wlogical-op" # any use of fwrite provokes this nw="$nw -Wformat-nonliteral" # we do this a lot nw="$nw -Wvla" # warnings in gettext.h nw="$nw -Wnested-externs" # use of XARGMATCH/verify_function__ - nw="$nw -Wswitch-enum" # Too many warnings for now nw="$nw -Wswitch-default" # Too many warnings for now - nw="$nw -Wfloat-equal" # warns about high-quality code nw="$nw -Winline" # OK to ignore 'inline' nw="$nw -Wjump-misses-init" # We sometimes safely jump over init. nw="$nw -Wstrict-overflow" # OK to optimize assuming that @@ -785,6 +771,20 @@ else # The following line should be removable at some point. nw="$nw -Wsuggest-attribute=pure" + # clang is unduly picky about some things. + AC_CACHE_CHECK([whether the compiler is clang], [emacs_cv_clang], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[ + #ifndef __clang__ + #error "not clang" + #endif + ]])], + [emacs_cv_clang=yes], + [emacs_cv_clang=no])]) + if test $emacs_cv_clang = yes; then + nw="$nw -Wcast-align" + fi + gl_MANYWARN_ALL_GCC([ws]) gl_MANYWARN_COMPLEMENT([ws], [$ws], [$nw]) for w in $ws; do @@ -801,6 +801,14 @@ else # gcc 4.5.0 20090517. gl_WARN_ADD([-Wno-logical-op]) + # More things that clang is unduly picky about. + if test $emacs_cv_clang = yes; then + gl_WARN_ADD([-Wno-format-extra-args]) + gl_WARN_ADD([-Wno-tautological-constant-out-of-range-compare]) + gl_WARN_ADD([-Wno-unused-command-line-argument]) + gl_WARN_ADD([-Wno-unused-value]) + fi + gl_WARN_ADD([-fdiagnostics-show-option]) gl_WARN_ADD([-funit-at-a-time]) @@ -1604,15 +1612,15 @@ W32_RES_LINK= EMACS_MANIFEST= if test "${with_w32}" != no; then case "${opsys}" in - cygwin) + cygwin) AC_CHECK_HEADER([windows.h], [HAVE_W32=yes], [AC_MSG_ERROR([`--with-w32' was specified, but windows.h - cannot be found.])]) + cannot be found.])]) ;; mingw32) ## Using --with-w32 with MinGW is a no-op, but we allow it. ;; - *) + *) AC_MSG_ERROR([Using w32 with an autotools build is only supported for Cygwin and MinGW32.]) ;; esac @@ -1626,7 +1634,7 @@ if test "${opsys}" = "mingw32"; then [[void test(PIMAGE_NT_HEADERS pHeader) {PIMAGE_SECTION_HEADER pSection = IMAGE_FIRST_SECTION(pHeader);}]])], [emacs_cv_w32api=yes - HAVE_W32=yes], + HAVE_W32=yes], emacs_cv_w32api=no) AC_MSG_RESULT($emacs_cv_w32api) if test "${emacs_cv_w32api}" = "no"; then @@ -2074,6 +2082,7 @@ if test "${opsys}" != "mingw32"; then USE_GTK_TOOLKIT="GTK3" if test "x$ac_enable_gtk_deprecation_warnings" = x; then GTK_CFLAGS="$GTK_CFLAGS -DGDK_DISABLE_DEPRECATION_WARNINGS" + GTK_CFLAGS="$GTK_CFLAGS -DGLIB_DISABLE_DEPRECATION_WARNINGS" fi else check_gtk2=yes diff --git a/lib-src/ChangeLog b/lib-src/ChangeLog index 6ff653b7be6..e565983e147 100644 --- a/lib-src/ChangeLog +++ b/lib-src/ChangeLog @@ -1,3 +1,10 @@ +2013-05-18 Paul Eggert + + Port --enable-gcc-warnings to clang. + * etags.c: Omit unnecessary forward decls. + (print_version, print_help): Declare _Noreturn. + * pop.c (socket_connection) [HAVE_GETADDRINFO]: Simplify. + 2013-05-16 Eli Zaretskii * update-game-score.c [WINDOWSNT]: Include "ntlib.h". diff --git a/lib-src/etags.c b/lib-src/etags.c index 27a853a954a..f6b173bf465 100644 --- a/lib-src/etags.c +++ b/lib-src/etags.c @@ -316,15 +316,7 @@ static void Texinfo_nodes (FILE *); static void Yacc_entries (FILE *); static void just_read_file (FILE *); -static void print_language_names (void); -static void print_version (void); -static void print_help (argument *); -int main (int, char **); - -static compressor *get_compressor_from_suffix (char *, char **); static language *get_language_from_langname (const char *); -static language *get_language_from_interpreter (char *); -static language *get_language_from_filename (char *, bool); static void readline (linebuffer *, FILE *); static long readline_internal (linebuffer *, FILE *); static bool nocase_tail (const char *); @@ -346,7 +338,6 @@ static void find_entries (FILE *); static void free_tree (node *); static void free_fdesc (fdesc *); static void pfnote (char *, bool, char *, int, int, long); -static void make_tag (const char *, int, bool, char *, int, int, long); static void invalidate_nodes (fdesc *, node **); static void put_entries (node *); @@ -816,7 +807,7 @@ etags --help --lang=ada."); #ifndef VERSION # define VERSION "17.38.1.4" #endif -static void +static _Noreturn void print_version (void) { char emacs_copyright[] = COPYRIGHT; @@ -832,7 +823,7 @@ print_version (void) # define PRINT_UNDOCUMENTED_OPTIONS_HELP FALSE #endif -static void +static _Noreturn void print_help (argument *argbuffer) { bool help_for_lang = FALSE; diff --git a/lib-src/pop.c b/lib-src/pop.c index 1f3f82baa68..a269144c915 100644 --- a/lib-src/pop.c +++ b/lib-src/pop.c @@ -1075,28 +1075,22 @@ socket_connection (char *host, int flags) } } while (ret != 0); - if (ret == 0) - { - it = res; - while (it) - { - if (it->ai_addrlen == sizeof (addr)) - { - struct sockaddr_in *in_a = (struct sockaddr_in *) it->ai_addr; - addr.sin_addr = in_a->sin_addr; - if (! connect (sock, (struct sockaddr *) &addr, sizeof (addr))) - break; - } - it = it->ai_next; - } - connect_ok = it != NULL; - if (connect_ok) - { - realhost = alloca (strlen (it->ai_canonname) + 1); - strcpy (realhost, it->ai_canonname); - } - freeaddrinfo (res); + for (it = res; it; it = it->ai_next) + if (it->ai_addrlen == sizeof addr) + { + struct sockaddr_in *in_a = (struct sockaddr_in *) it->ai_addr; + addr.sin_addr = in_a->sin_addr; + if (! connect (sock, (struct sockaddr *) &addr, sizeof addr)) + break; + } + connect_ok = it != NULL; + if (connect_ok) + { + realhost = alloca (strlen (it->ai_canonname) + 1); + strcpy (realhost, it->ai_canonname); } + freeaddrinfo (res); + #else /* !HAVE_GETADDRINFO */ do { diff --git a/src/ChangeLog b/src/ChangeLog index 6909367dccb..e1f7a56aede 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,16 @@ +2013-05-18 Paul Eggert + + Port --enable-gcc-warnings to clang. + * bytecode.c (exec_byte_code): + * regex.c: + Redo diagnostic pragmas to pacify clang, too. + * dbusbind.c (xd_retrieve_arg): Do not use uninitialized variable. + * editfns.c (Fencode_time): + * fileio.c (file_accessible_directory_p): + * font.c (font_unparse_xlfd): + Use '&"string"[index]' instead of '"string" + (index)'. + * undo.c (user_error): Remove; unused. + 2013-05-16 Eli Zaretskii * insdel.c (insert_1_both): Document the arguments, instead of diff --git a/src/bytecode.c b/src/bytecode.c index 7676c8550a4..4940fd5c182 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -660,9 +660,12 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, the table clearer. */ #define LABEL(OP) [OP] = &&insn_ ## OP -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__) # pragma GCC diagnostic push # pragma GCC diagnostic ignored "-Woverride-init" +#elif defined __clang__ +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Winitializer-overrides" #endif /* This is the dispatch table for the threaded interpreter. */ @@ -676,7 +679,7 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth, #undef DEFINE }; -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__) || defined __clang__ # pragma GCC diagnostic pop #endif diff --git a/src/dbusbind.c b/src/dbusbind.c index 863f7634eb5..3ec3c28431b 100644 --- a/src/dbusbind.c +++ b/src/dbusbind.c @@ -882,7 +882,7 @@ xd_retrieve_arg (int dtype, DBusMessageIter *iter) #endif { dbus_uint32_t val; - unsigned int pval = val; + unsigned int pval; dbus_message_iter_get_basic (iter, &val); pval = val; XD_DEBUG_MESSAGE ("%c %u", dtype, pval); diff --git a/src/editfns.c b/src/editfns.c index e0b0347fe69..cc6b4cff895 100644 --- a/src/editfns.c +++ b/src/editfns.c @@ -1946,7 +1946,7 @@ usage: (encode-time SECOND MINUTE HOUR DAY MONTH YEAR &optional ZONE) */) EMACS_INT zone_hr = abszone / (60*60); int zone_min = (abszone/60) % 60; int zone_sec = abszone % 60; - sprintf (tzbuf, tzbuf_format, "-" + (XINT (zone) < 0), + sprintf (tzbuf, tzbuf_format, &"-"[XINT (zone) < 0], zone_hr, zone_min, zone_sec); tzstring = tzbuf; } diff --git a/src/fileio.c b/src/fileio.c index fe1bce16ca0..f20721251e6 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -2873,7 +2873,7 @@ file_accessible_directory_p (char const *file) and it's a safe optimization here. */ char *buf = SAFE_ALLOCA (len + 3); memcpy (buf, file, len); - strcpy (buf + len, "/." + (file[len - 1] == '/')); + strcpy (buf + len, &"/."[file[len - 1] == '/']); dir = buf; } diff --git a/src/font.c b/src/font.c index ad601177b50..7bd44a5e52f 100644 --- a/src/font.c +++ b/src/font.c @@ -1219,7 +1219,7 @@ font_unparse_xlfd (Lisp_Object font, int pixel_size, char *name, int nbytes) return -1; f[j] = p = alloca (alloc); sprintf (p, "%s%s-*", SDATA (val), - "*" + (SDATA (val)[SBYTES (val) - 1] == '*')); + &"*"[SDATA (val)[SBYTES (val) - 1] == '*']); } else f[j] = SSDATA (val); @@ -1618,7 +1618,7 @@ font_unparse_fcname (Lisp_Object font, int pixel_size, char *name, int nbytes) } if (point_size > 0) { - int len = snprintf (p, lim - p, "-%d" + (p == name), point_size); + int len = snprintf (p, lim - p, &"-%d"[p == name], point_size); if (! (0 <= len && len < lim - p)) return -1; p += len; diff --git a/src/regex.c b/src/regex.c index 04429386f84..79fb28ba12a 100644 --- a/src/regex.c +++ b/src/regex.c @@ -33,10 +33,9 @@ /* Ignore some GCC warnings for now. This section should go away once the Emacs and Gnulib regex code is merged. */ -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +#if 4 < __GNUC__ + (5 <= __GNUC_MINOR__) || defined __clang__ # pragma GCC diagnostic ignored "-Wstrict-overflow" # ifndef emacs -# pragma GCC diagnostic ignored "-Wunused-but-set-variable" # pragma GCC diagnostic ignored "-Wunused-function" # pragma GCC diagnostic ignored "-Wunused-macros" # pragma GCC diagnostic ignored "-Wunused-result" @@ -44,6 +43,10 @@ # endif #endif +#if 4 < __GNUC__ + (5 <= __GNUC_MINOR__) && ! defined __clang__ +# pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#endif + #include #include diff --git a/src/undo.c b/src/undo.c index 63edc8e9b8d..d8711882fbf 100644 --- a/src/undo.c +++ b/src/undo.c @@ -445,12 +445,6 @@ truncate_undo_list (struct buffer *b) unbind_to (count, Qnil); } -static _Noreturn void -user_error (const char *msg) -{ - xsignal1 (Quser_error, build_string (msg)); -} - void syms_of_undo (void) -- 2.39.2