summaryrefslogtreecommitdiff
path: root/contrib/check_warning_flags.sh
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /contrib/check_warning_flags.sh
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'contrib/check_warning_flags.sh')
-rwxr-xr-xcontrib/check_warning_flags.sh180
1 files changed, 180 insertions, 0 deletions
diff --git a/contrib/check_warning_flags.sh b/contrib/check_warning_flags.sh
new file mode 100755
index 000000000..d9c5735ab
--- /dev/null
+++ b/contrib/check_warning_flags.sh
@@ -0,0 +1,180 @@
+#! /bin/sh
+#
+# Check that the warning flags documented in invoke.texi match up
+# with what the compiler accepts.
+#
+# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+# Written by Ralf Wildenhues <Ralf.Wildenhues@gmx.de>.
+#
+# This script is Free Software, and it can be copied, distributed and
+# modified as defined in the GNU General Public License. A copy of
+# its license can be downloaded from http://www.gnu.org/copyleft/gpl.html
+#
+# Call this script as
+# check_warning_flags.sh path/to/invoke.texi
+# with CC set to the compiler to be tested.
+# The script scribbles in the current directory.
+
+progname=`echo "$0" | sed 's,.*/,,'`
+usage ()
+{
+ echo "usage: $progname path/to/gcc/doc"
+ echo "set \$CC to the compiler to be checked"
+ exit 1
+}
+
+ret=0
+LC_ALL=C
+export LC_ALL
+: ${CC=gcc}
+test $# = 1 || usage
+gcc_docdir=$1
+invoke_texi=$gcc_docdir/invoke.texi
+test -r "$invoke_texi" || {
+ echo "$progname: error: cannot read '$invoke_texi'" >&2
+ usage
+}
+filebase=check_warning_flags_file$$
+stderr=check_warning_flags_stderr$$
+
+remove_problematic_flags='
+ /-Wlarger-than-/d
+ /-Wframe-larger-than/d
+ /-Wdisallowed-function-list/d
+ /-W[alp],/d
+ /-Werror/d
+ /-Wpadded/d
+ /pedantic-ms-format/d
+ /=/d'
+
+# Ensure that indexed warnings are accepted.
+set x `sed '/^@opindex W/{
+ s/^@opindex /-/
+ '"$remove_problematic_flags"'
+ /-W[alp]$/d
+ p
+}
+d' <"$invoke_texi"`
+shift
+: >$filebase.c
+$CC -c $filebase.c "$@" 2>&1 |
+ grep -v 'command line option.*is valid for.*but not for' >$stderr
+if test -s $stderr; then
+ echo "options listed in @opindex but not accepted by the compiler:" >&2
+ cat $stderr >&2
+ ret=1
+fi
+rm -f $filebase.c $stderr
+
+# Check documentation of warning options.
+for lang in c c++ objc obj-c++; do
+ case $lang in
+ c) ext=c; langmatch='[^-]C[^+].*only' ;;
+ c++) ext=C; langmatch='[^-]C++.*only' ;;
+ objc) ext=m; langmatch='Objective-C[^+].*only' ;;
+ obj-c++) ext=M; langmatch='Objective-C++.*only' ;;
+ esac
+ file=$filebase.$ext
+ : >$file
+ $CC -c $file 2>$stderr
+ if grep 'not installed on this system' $stderr >/dev/null ||
+ grep 'installation problem, cannot exec' $stderr >/dev/null ||
+ grep 'error trying to exec' $stderr >/dev/null
+ then
+ echo "$progname: $CC is not configured for language $lang, skipping checks" >&2
+ rm -f $file $filebase.o $filebase.obj $stderr
+ continue
+ fi
+
+ # Verify good warning flags.
+ set x `sed '
+ t a
+ :a
+ /^@item -W/{
+ /'"$langmatch"'/b x
+ / only)/d
+ b x
+ }
+ d
+ :x
+ '"$remove_problematic_flags"'
+ s/^@item //
+ s/ .*//
+ ' <"$invoke_texi"`
+ shift
+ $CC -c $file -O "$@" 2>$stderr
+ if test -s $stderr; then
+ echo failures: >&2
+ cat $stderr >&2
+ ret=1
+ fi
+
+ # Verify bad warning flags.
+ set x `sed '
+ t a
+ :a
+ /^@item -W/{
+ / only)/!d
+ /'"$langmatch"'/d
+ b x
+ }
+ d
+ :x
+ '"$remove_problematic_flags"'
+ s/^@item //
+ s/ .*//
+ ' <"$invoke_texi"`
+ shift
+ $CC -c $file -O "$@" 2>$stderr
+ # cat $stderr >&2
+ test $# = `grep 'command line option.*valid.*but not for' <$stderr | wc -l` || {
+ for warning
+ do
+ grep "command line option.*$warning.*valid" <$stderr >&2 ||
+ echo "valid for $lang but not annotated as such: $warning"
+ done
+ ret=1
+ }
+ rm -f $file $filebase.o $filebase.obj $stderr
+done
+
+
+remove_problematic_help_flags='
+ /^W$/d
+ /^W[alp]$/d
+ /^Werror-implicit-function-declaration$/d
+ /^Wsynth$/d
+ /-$/d
+ /=/d'
+help_flags=`
+ $CC --help -v 2>/dev/null | tr ' ' '\012' |
+ sed -n '
+ b a
+ :a
+ s/^-\(W[^<,]*\).*/\1/
+ t x
+ d
+ :x
+ '"$remove_problematic_help_flags"'
+ p' | sort -u`
+: >$filebase.c
+for flag in $help_flags; do
+ $CC -c $filebase.c -$flag 2>/dev/null || {
+ echo "warning -$flag not supported" >&2
+ ret=1
+ }
+ grep "@item.*$flag" $gcc_docdir/../*/*.texi >/dev/null || {
+ # For @item, we are satisfied with either -Wfoo or -Wno-foo.
+ inverted_flag=`echo "$flag" | sed '
+ s/^Wno-/W/
+ t
+ s/^W/Wno-/'`
+ grep "@item.*$inverted_flag" $gcc_docdir/../*/*.texi >/dev/null || {
+ echo "warning -$flag not documented in $gcc_docdir/../*/*.texi" >&2
+ ret=1
+ }
+ }
+done
+rm -f $filebase.c $filebase.o
+
+exit $ret