# Copyright (C) 2005-2021 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
# <http://www.gnu.org/licenses/>.

# 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=<bytes>[ \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
