diff options
author | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
---|---|---|
committer | upstream source tree <ports@midipix.org> | 2015-03-15 20:14:05 -0400 |
commit | 554fd8c5195424bdbcabf5de30fdc183aba391bd (patch) | |
tree | 976dc5ab7fddf506dadce60ae936f43f58787092 /contrib/check_warning_flags.sh | |
download | cbb-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-x | contrib/check_warning_flags.sh | 180 |
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 |