#! /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 . # # 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 /-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 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 ' ' '\n' | 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