From 296a1c465de6cfea333bf7bb7950f02b3ef80b12 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 8 May 2024 13:49:37 +0200 Subject: [PATCH v1 1/7] Add -Wmissing-variable-declarations to the standard compilation flags This warning flag detects global variables not declared in header files. This is similar to what -Wmissing-prototypes does for functions. (More correctly, it is similar to what -Wmissing-declarations does for functions, but -Wmissing-prototypes is a superset of that in C.) This flag is new in GCC 14. Clang has supported it for a while. XXX many warnings to fix first --- configure | 99 +++++++++++++++++++++++ configure.ac | 9 +++ meson.build | 10 +++ src/Makefile.global.in | 1 + src/interfaces/ecpg/test/Makefile.regress | 2 +- src/interfaces/ecpg/test/meson.build | 1 + src/makefiles/meson.build | 2 + src/tools/pg_bsd_indent/Makefile | 2 + src/tools/pg_bsd_indent/meson.build | 1 + 9 files changed, 126 insertions(+), 1 deletion(-) diff --git a/configure b/configure index 89644f2249e..70fd1de88b5 100755 --- a/configure +++ b/configure @@ -741,6 +741,7 @@ CXXFLAGS_SL_MODULE CFLAGS_SL_MODULE CFLAGS_VECTORIZE CFLAGS_UNROLL_LOOPS +PERMIT_MISSING_VARIABLE_DECLARATIONS PERMIT_DECLARATION_AFTER_STATEMENT LLVM_BINPATH LLVM_CXXFLAGS @@ -6080,6 +6081,104 @@ if test x"$pgac_cv_prog_CXX_cxxflags__Wformat_security" = x"yes"; then fi + # gcc 14+, clang for a while + save_CFLAGS=$CFLAGS + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -Wmissing-variable-declarations, for CFLAGS" >&5 +$as_echo_n "checking whether ${CC} supports -Wmissing-variable-declarations, for CFLAGS... " >&6; } +if ${pgac_cv_prog_CC_cflags__Wmissing_variable_declarations+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CFLAGS=$CFLAGS +pgac_save_CC=$CC +CC=${CC} +CFLAGS="${CFLAGS} -Wmissing-variable-declarations" +ac_save_c_werror_flag=$ac_c_werror_flag +ac_c_werror_flag=yes +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + pgac_cv_prog_CC_cflags__Wmissing_variable_declarations=yes +else + pgac_cv_prog_CC_cflags__Wmissing_variable_declarations=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_c_werror_flag=$ac_save_c_werror_flag +CFLAGS="$pgac_save_CFLAGS" +CC="$pgac_save_CC" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CC_cflags__Wmissing_variable_declarations" >&5 +$as_echo "$pgac_cv_prog_CC_cflags__Wmissing_variable_declarations" >&6; } +if test x"$pgac_cv_prog_CC_cflags__Wmissing_variable_declarations" = x"yes"; then + CFLAGS="${CFLAGS} -Wmissing-variable-declarations" +fi + + + PERMIT_MISSING_VARIABLE_DECLARATIONS= + if test x"$save_CFLAGS" != x"$CFLAGS"; then + PERMIT_MISSING_VARIABLE_DECLARATIONS=-Wno-missing-variable-declarations + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CXX} supports -Wmissing-variable-declarations, for CXXFLAGS" >&5 +$as_echo_n "checking whether ${CXX} supports -Wmissing-variable-declarations, for CXXFLAGS... " >&6; } +if ${pgac_cv_prog_CXX_cxxflags__Wmissing_variable_declarations+:} false; then : + $as_echo_n "(cached) " >&6 +else + pgac_save_CXXFLAGS=$CXXFLAGS +pgac_save_CXX=$CXX +CXX=${CXX} +CXXFLAGS="${CXXFLAGS} -Wmissing-variable-declarations" +ac_save_cxx_werror_flag=$ac_cxx_werror_flag +ac_cxx_werror_flag=yes +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + pgac_cv_prog_CXX_cxxflags__Wmissing_variable_declarations=yes +else + pgac_cv_prog_CXX_cxxflags__Wmissing_variable_declarations=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_cxx_werror_flag=$ac_save_cxx_werror_flag +CXXFLAGS="$pgac_save_CXXFLAGS" +CXX="$pgac_save_CXX" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_prog_CXX_cxxflags__Wmissing_variable_declarations" >&5 +$as_echo "$pgac_cv_prog_CXX_cxxflags__Wmissing_variable_declarations" >&6; } +if test x"$pgac_cv_prog_CXX_cxxflags__Wmissing_variable_declarations" = x"yes"; then + CXXFLAGS="${CXXFLAGS} -Wmissing-variable-declarations" +fi + + # Disable strict-aliasing rules; needed for gcc 3.3+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${CC} supports -fno-strict-aliasing, for CFLAGS" >&5 diff --git a/configure.ac b/configure.ac index c7322e292cc..f644c067b66 100644 --- a/configure.ac +++ b/configure.ac @@ -530,6 +530,15 @@ if test "$GCC" = yes -a "$ICC" = no; then # This was included in -Wall/-Wformat in older GCC versions PGAC_PROG_CC_CFLAGS_OPT([-Wformat-security]) PGAC_PROG_CXX_CFLAGS_OPT([-Wformat-security]) + # gcc 14+, clang for a while + save_CFLAGS=$CFLAGS + PGAC_PROG_CC_CFLAGS_OPT([-Wmissing-variable-declarations]) + PERMIT_MISSING_VARIABLE_DECLARATIONS= + if test x"$save_CFLAGS" != x"$CFLAGS"; then + PERMIT_MISSING_VARIABLE_DECLARATIONS=-Wno-missing-variable-declarations + fi + AC_SUBST(PERMIT_MISSING_VARIABLE_DECLARATIONS) + PGAC_PROG_CXX_CFLAGS_OPT([-Wmissing-variable-declarations]) # Disable strict-aliasing rules; needed for gcc 3.3+ PGAC_PROG_CC_CFLAGS_OPT([-fno-strict-aliasing]) PGAC_PROG_CXX_CFLAGS_OPT([-fno-strict-aliasing]) diff --git a/meson.build b/meson.build index 1c0579d5a6b..868fdb23a72 100644 --- a/meson.build +++ b/meson.build @@ -1877,6 +1877,16 @@ if cc.has_argument('-Wdeclaration-after-statement') cflags_no_decl_after_statement += '-Wno-declaration-after-statement' endif +# Some code does not used this option. +cflags_no_missing_var_decls = [] +if cc.has_argument('-Wmissing-variable-declarations') + cflags_warn += '-Wmissing-variable-declarations' + cflags_no_missing_var_decls += '-Wno-missing-variable-declarations' +endif +if llvm.found() + cxxflags_warn += cpp.get_supported_arguments(['-Wmissing-variable-declarations']) +endif + # The following tests want to suppress various unhelpful warnings by adding # -Wno-foo switches. But gcc won't complain about unrecognized -Wno-foo diff --git a/src/Makefile.global.in b/src/Makefile.global.in index a00c909681e..0a0ba0719f5 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -266,6 +266,7 @@ CFLAGS_POPCNT = @CFLAGS_POPCNT@ CFLAGS_CRC = @CFLAGS_CRC@ CFLAGS_XSAVE = @CFLAGS_XSAVE@ PERMIT_DECLARATION_AFTER_STATEMENT = @PERMIT_DECLARATION_AFTER_STATEMENT@ +PERMIT_MISSING_VARIABLE_DECLARATIONS = @PERMIT_MISSING_VARIABLE_DECLARATIONS@ CXXFLAGS = @CXXFLAGS@ LLVM_CPPFLAGS = @LLVM_CPPFLAGS@ diff --git a/src/interfaces/ecpg/test/Makefile.regress b/src/interfaces/ecpg/test/Makefile.regress index b0647cd2c5f..9bf0efa40b9 100644 --- a/src/interfaces/ecpg/test/Makefile.regress +++ b/src/interfaces/ecpg/test/Makefile.regress @@ -3,7 +3,7 @@ override CPPFLAGS := -I../../include -I$(top_srcdir)/src/interfaces/ecpg/include \ -I$(libpq_srcdir) $(CPPFLAGS) -override CFLAGS += $(PTHREAD_CFLAGS) +override CFLAGS += $(PTHREAD_CFLAGS) $(PERMIT_MISSING_VARIABLE_DECLARATIONS) LDFLAGS_INTERNAL += -L../../ecpglib -lecpg -L../../pgtypeslib -lpgtypes $(libpq) diff --git a/src/interfaces/ecpg/test/meson.build b/src/interfaces/ecpg/test/meson.build index c1e508ccc82..8fd284071f2 100644 --- a/src/interfaces/ecpg/test/meson.build +++ b/src/interfaces/ecpg/test/meson.build @@ -27,6 +27,7 @@ testprep_targets += pg_regress_ecpg # create .c files and executables from .pgc files ecpg_test_exec_kw = { + 'c_args': cflags_no_missing_var_decls, 'dependencies': [frontend_code, libpq], 'include_directories': [ecpg_inc], 'link_with': [ecpglib_so, ecpg_compat_so, ecpg_pgtypes_so], diff --git a/src/makefiles/meson.build b/src/makefiles/meson.build index 5618050b306..850e9275845 100644 --- a/src/makefiles/meson.build +++ b/src/makefiles/meson.build @@ -98,6 +98,8 @@ pgxs_kv = { 'CXXFLAGS_SL_MODULE': ' '.join(cxxflags_mod), 'PERMIT_DECLARATION_AFTER_STATEMENT': ' '.join(cflags_no_decl_after_statement), + 'PERMIT_MISSING_VARIABLE_DECLARATIONS': + ' '.join(cflags_no_missing_var_decls), 'CFLAGS_CRC': ' '.join(cflags_crc), 'CFLAGS_POPCNT': ' '.join(cflags_popcnt), diff --git a/src/tools/pg_bsd_indent/Makefile b/src/tools/pg_bsd_indent/Makefile index d922013e40b..f721dfb0d19 100644 --- a/src/tools/pg_bsd_indent/Makefile +++ b/src/tools/pg_bsd_indent/Makefile @@ -25,6 +25,8 @@ OBJS = \ parse.o \ pr_comment.o +$(OBJS): CFLAGS += $(PERMIT_MISSING_VARIABLE_DECLARATIONS) + all: pg_bsd_indent pg_bsd_indent: $(OBJS) | submake-libpgport diff --git a/src/tools/pg_bsd_indent/meson.build b/src/tools/pg_bsd_indent/meson.build index 4387c47740e..87ed4292975 100644 --- a/src/tools/pg_bsd_indent/meson.build +++ b/src/tools/pg_bsd_indent/meson.build @@ -18,6 +18,7 @@ endif pg_bsd_indent = executable('pg_bsd_indent', pg_bsd_indent_sources, + c_args: cflags_no_missing_var_decls, dependencies: [frontend_code], include_directories: include_directories('.'), kwargs: default_bin_args + { base-commit: e305f71565e203e08e47d7094082188f5737317f -- 2.44.0