# Copyright 2011-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 this program.  If not, see <http://www.gnu.org/licenses/>.

standard_testfile .c

# Fission doesn't support macros yet.  Bug 15954.
if [using_fission] {
    untested "fission does not support macros yet"
    return -1
}

set options {debug}

get_compiler_info
if { [test_compiler_info gcc*] } {
    lappend options "additional_flags=-g3"
} elseif { [test_compiler_info clang*] } {
    lappend options "additional_flags=-fdebug-macro"
} else {
    untested "no compiler info"
    return -1
}

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} $options] } {
    return -1
}

if ![runto_main] {
    return -1
}

# Test various error messages.
gdb_test "info macro -- -all" \
	 "The symbol `-all' has no definition .*\r\nat .*$srcfile:\[0-9\]+"
gdb_test "info macro  -- -all" \
	 "The symbol `-all' has no definition .*\r\nat .*$srcfile:\[0-9\]+"

gdb_test "info macro -all --" \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]"

gdb_test "info macro -all  --" \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]"

gdb_test "info macro  -all  --" \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]"

gdb_test "info macro --" \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]"

gdb_test "info macro -- " \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]" \
	 "info macro -- <EOL>"
gdb_test "info macro  -- " \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]" \
	 "info macro  -- <EOL>"

gdb_test "info macro -invalid-option" \
	 "Unrecognized option.*Try \"help info macro\"\."

gdb_test "info macro  -invalid-option" \
	 "Unrecognized option.*Try \"help info macro\"\."

gdb_test "info macro -invalid-option FOO" \
	 "Unrecognized option.*Try \"help info macro\"\."
gdb_test "info macro  -invalid-option FOO" \
	 "Unrecognized option.*Try \"help info macro\"\."

# Single macro lookups.
gdb_test "info macro -- FOO" \
	 ".*#define FOO \"hello\""

gdb_test "info macro  -- FOO" \
	 ".*#define FOO \"hello\""

gdb_test "info macro --  FOO" \
	 ".*#define FOO \"hello\""

gdb_test "info macro FOO" \
	 ".*#define FOO \"hello\""

gdb_test "info macro  FOO" \
	 ".*#define FOO \"hello\""

# Multiple macro lookups.
set test "info macro -a FOO"
set r1 ".*#define FOO \"hello\""
set r2 ".*#define FOO \" \""
set r3 ".*#define FOO \"world\""
set r4 ".*#define FOO\\(a\\) foo = a"
set testname "$test 1"
gdb_test "$test" "$r1$r2$r3$r4" "$testname"

set test "info macro -a -- FOO"
set testname "$test 1"
gdb_test "$test" "$r1$r2$r3$r4" "$testname"

set test "info macro -all -- FOO"
set testname "$test 1"
gdb_test "$test" "$r1$r2$r3$r4" "$testname"

set test "info macro -a  --  FOO"
gdb_test "$test" "$r1$r2$r3$r4"

set test "info macro  -a  --  FOO"
gdb_test "$test" "$r1$r2$r3$r4"

set test "info macros"
set r1 "#define FOO \"hello\""
set r2 "#define ONE"
set testname "$test 2"
gdb_test_lines $test $testname $r1.*$r2 \
    -re-not "#define TWO" \
    -re-not "#define THREE" \
    -re-not "#define FOUR"

gdb_test "next" ".*" ""

set r1 "#define FOO \" \""
set r2 "#define ONE"
set r3 "#define TWO"
set testname "$test 3"
gdb_test_lines $test $testname $r1.*$r2.*$r3 \
    -re-not "#define THREE" \
    -re-not "#define FOUR"

gdb_test "next" ".*" ""

# in alpabetical order...
set r1 "#define FOO \"world\""
set r2 "#define ONE"
set r3 "#define THREE"
set r4 "#define TWO"
set testname "$test 4"
gdb_test_lines $test $testname $r1.*$r2.*$r3.*$r4 \
    -re-not "#define FOUR"

# same as above with a linespec.
set test "info macros *\$pc"
gdb_test_lines $test "" $r1.*$r2.*$r3.*$r4 \
    -re-not "#define FOUR"
gdb_test "next" ".*" ""

set r1 "#define FOO \" \""
set r2 "#define ONE"
set r3 "#define TWO."
set test "info macros"
set testname "$test 5"
gdb_test_lines $test $testname $r1.*$r2.*$r3 \
    -re-not "#define THREE" \
    -re-not "#define FOUR"
gdb_test "next" ".*" ""
gdb_test "next" ".*" ""

set r1 "#define DEF_MACROS"
set testname "$test 6"
gdb_test_lines $test $testname $r1 \
    -re-not "#define FOO" \
    -re-not "#define ONE" \
    -re-not "#define TWO" \
    -re-not "#define THREE" \
    -re-not "#define FOUR"

gdb_test "next" ".*" ""
set r1 "#define DEF_MACROS"
set r2 "#define FOO\\(a\\) foo = a"
set r3 "#define FOUR"
set testname "$test 7"
gdb_test_lines $test $testname $r1.*$r2.*$r3 \
    -re-not "#define FOO \" \"" \
    -re-not "#define FOO \"hello\"" \
    -re-not "#define FOO \"world\"" \
    -re-not "#define ONE" \
    -re-not "#define TWO" \
    -re-not "#define THREE"

set test "info macros info-macros.c:42"

set r1 "#define DEF_MACROS "
set r2 "#define ONE"
gdb_test_lines "$test" "" [multi_line \
			       "" \
			       "$r1" \
			       "(.*\r\n)?$r2"]
