summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorrwild <rwild@138bc75d-0d04-0410-961f-82ee72b054a4>2008-02-15 05:50:37 +0000
committerrwild <rwild@138bc75d-0d04-0410-961f-82ee72b054a4>2008-02-15 05:50:37 +0000
commit0007fbefcbf6234de43b4cf4c78ab76722162385 (patch)
treec61104c64e35ced6f21746fa51fde15f2766036e /contrib
parente729f00eb25819fe41a3c7c8a3f6c96365123935 (diff)
downloadgcc-0007fbefcbf6234de43b4cf4c78ab76722162385.tar.gz
* check_warning_flags.sh: New file.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@132332 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'contrib')
-rw-r--r--contrib/ChangeLog4
-rwxr-xr-xcontrib/check_warning_flags.sh136
2 files changed, 140 insertions, 0 deletions
diff --git a/contrib/ChangeLog b/contrib/ChangeLog
index 1449506e509..8f8153d4675 100644
--- a/contrib/ChangeLog
+++ b/contrib/ChangeLog
@@ -1,3 +1,7 @@
+2008-02-15 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
+ * check_warning_flags.sh: New file.
+
2008-01-25 Joseph Myers <joseph@codesourcery.com>
* paranoia.cc (main): Remove handling of c4x_single and
diff --git a/contrib/check_warning_flags.sh b/contrib/check_warning_flags.sh
new file mode 100755
index 00000000000..95640f7758d
--- /dev/null
+++ b/contrib/check_warning_flags.sh
@@ -0,0 +1,136 @@
+#! /bin/sh
+#
+# Check that the warning flags documented in invoke.texi match up
+# with what the compiler accepts.
+#
+# Copyright (C) 2008 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/invoke.texi"
+ echo "set \$CC to the compiler to be checked"
+ exit 1
+}
+
+ret=0
+LC_ALL=C
+export LC_ALL
+: ${CC=gcc}
+test $# = 1 || usage
+invoke_texi=$1
+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
+ /-W[alp],/d
+ /-Werror/d
+ /-Wpadded/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
+exit $ret