diff options
author | rwild <rwild@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-02-15 05:50:37 +0000 |
---|---|---|
committer | rwild <rwild@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-02-15 05:50:37 +0000 |
commit | 0007fbefcbf6234de43b4cf4c78ab76722162385 (patch) | |
tree | c61104c64e35ced6f21746fa51fde15f2766036e /contrib | |
parent | e729f00eb25819fe41a3c7c8a3f6c96365123935 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rwxr-xr-x | contrib/check_warning_flags.sh | 136 |
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 |