# Copyright (C) 2005-2022 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GCC; see the file COPYING3. If not see # . # This file contains a set of test that check that gcc options are # documented in --help, and that the various --help* options work. load_lib options.exp load_lib gcc-defs.exp # These tests don't run runtest_file_p consistently if it # doesn't return the same values, so disable parallelization # of this *.exp file. The first parallel runtest to reach # this will run all the tests serially. if ![gcc_parallel_test_run_p help] { return } gcc_parallel_test_enable 0 # GCC breaks up --help output into lines at most $COLUMNS characters # wide (or 80 when COLUMNS is not defined), set the COLUMNS environment # variable to a value large enough to prevent this (and restore it when # done). global env if [ info exists env(COLUMNS) ] { set prev_columns $env(COLUMNS) } set env(COLUMNS) 1024 # Document --version. Ideally, there should be no undocumented switches # in --help. check_for_options c "--help" "--version" "This option lacks documentation" "" # Output from different subprocesses should not be intermingled # (we check for some patterns that could be seen with a missing # fflush in gcc.c). check_for_options c "-v --help" "" { [^\n]The following options -Wconversion[^\n]*lacks documentation " -g " } "" # There are still undocumented switches in -v --help. check_for_options c "-v --help" "" "This option lacks documentation" "xfail" # Check whether multiline conversion in optc-gen is broken. check_for_options c "-v --help" "" {are likely to\n -std} "" # Try various --help= classes and qualifiers. check_for_options c "--help=optimizers" "-O" " -g " "" check_for_options c "--help=params" "maximum number of" "-Wunsafe-loop-optimizations" "" check_for_options_with_filter c "--help=params" \ "^The following options control parameters:$" "" {[^.]$} "" check_for_options c "--help=C" "-ansi" "-gnatO" "" check_for_options c {--help=C++} {-std=c\+\+} "-gnatO" "" check_for_options c "--help=common" "-dumpbase" "-gnatO" "" check_for_options c "--help=undocumented" "This option lacks documentation" "" "" # Undocumented flags are not yet consistently marked as such. check_for_options c "--help=^undocumented" "-Wall" "This option lacks documentation" "xfail" # Try some --help=* examples from the manual. check_for_options c "--help=target,undocumented" "" "" "" check_for_options c "--help=target,optimizers" "" "" "" check_for_options c "--help=warnings,^joined,^undocumented" "" "" "" check_for_options c "-Q -O2 --help=optimizers" { -O -ftree-loop-vectorize[^\n]*enabled } " -g " "" check_for_options c "-Q -O3 --help=optimizers" { -O -ftree-loop-vectorize[^\n]*enabled } " -g " "" # Try repeated --help=. check_for_options c "--help=params --help=optimizers" { maximum number of -O } "" "" # Verify that a C++/Objective C++ only option is indicated as such # by the C compiler. check_for_options c "-Q --help=warnings" { -Wclass-memaccess[ \t]+\[available in C\+\+, ObjC\+\+\] } "" "" # Do the same for a C/Objective C only option and the C++ compiler. check_for_options c++ "-Q --help=warnings" { -Wabsolute-value[ \t]+\[available in C, ObjC\] } "" "" # Verify that an option that's an alias for another option is shown # with the other option as the value. check_for_options c "-Q --help=warnings" { --all-warnings[ \t]+\-Wall -W[ \t]+-Wextra -Wmissing-format-attribute[ \t]+-Wsuggest-attribute=format -Wno-alloc-size-larger-than[ \t]+-Walloc-size-larger-than=[1-9][0-9]+ -Wno-vla-larger-than[ \t]+-Wvla-larger-than=[1-9][0-9]+ } "" "" # Verify that an option that expects a byte-size argument is shown with # a meaningful byte-size argument as the value. check_for_options c "-Q --help=warnings" { -Walloc-size-larger-than=[ \t]+[1-9][0-9]+ bytes -Wlarger-than=[^\n\r]+[1-9][0-9]+ bytes } "" "" # Ensure PR 37805 is fixed. # Specify patterns (arguments 3 and later) that match option names # at the beginning of the line and not when they are referenced by # some other options later on. check_for_options c "--help=joined" \ "^ +-Wformat=" "^ +-fstrict-prototype" "" check_for_options c "--help=separate" \ "^ +-MF" "^ +-fstrict-prototype" "" check_for_options c "--help=warnings,joined" \ "^ +-Wformat=" "^ +-Wtrigraphs" "" check_for_options c "--help=warnings,^joined" \ "^ +-Wtrigraphs" "^ +-Wformat=" "" check_for_options c "--help=joined,separate" \ "^ +-I" "" "" check_for_options c "--help=joined,^separate" \ "^ +--help=" "" "" check_for_options c "--help=joined,undocumented" "" "" "" # Check to make sure the description for every option is a complete # sentence ending in a period. This matters not just for consistency # but also because other sentences may be appended to it by the help # subsystem. Do this one help class at a time to make it easier to # find the source a failure. foreach cls { "ada" "c" "c++" "d" "fortran" "go" \ "common" "optimizers" "param" "target" "warnings" } { check_for_options c "--help=$cls" "" "^ +-.*\[^:.\]$" "" } # Listing only excludes gives empty results. check_for_options c "--help=^joined,^separate" "" "" "" if [ info exists prev_columns ] { # Reset the enviroment variable to its oriuginal value. set env(COLUMNS) $prev_columns } else { # Remove the variable from the environment if it didn't exist # to begin with to avoid affecting subsequent tests. array unset env COLUMNS } gcc_parallel_test_enable 1