# Copyright 2011-2020 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
}

get_compiler_info
if ![test_compiler_info gcc*] {
  untested "no compiler info"
  return -1
}

# Don't use "debug" here.  Otherwise "-g" would be appended to the gcc
# command line, possibly overriding "-g3" (depending on gcc version).
set options "additional_flags=-g3"

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

if ![runto_main] {
    untested "could not run to 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\]"
gdb_test "info macro  -- " \
	 "You must follow.*with the name.*you want to see.*\[^\r\n\]*\[\r\n\]"

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"

proc gdb_test_multiple_with_read1_timeout_factor { factor command message \
						       user_code } {
    with_read1_timeout_factor $factor {
        uplevel [list gdb_test_multiple $command $message $user_code]
    }
}

set test "info macros"
set r1 ".*#define FOO \"hello\""
set r2 ".*#define ONE"
set r3 ".*\r\n$gdb_prompt"
set testname "$test 2"
gdb_test_multiple_with_read1_timeout_factor 10 "$test" $testname {
  -re "$r1$r2$r3" {
     pass $testname
  }
  -re ".*#define TWO.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define THREE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $testname
  }
}
gdb_test "next" ".*" ""

set r1 ".*#define FOO \" \""
set r2 ".*#define ONE"
set r3 ".*#define TWO"
set r4 ".*\r\n$gdb_prompt"
set testname "$test 3"
gdb_test_multiple_with_read1_timeout_factor 10 "$test" $testname {
  -re ".*#define THREE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re "$r1$r2$r3$r4" {
     pass $testname
  }
}
gdb_test "next" ".*" ""

# in alpabetical order...
set r1 ".*#define FOO \"world\""
set r2 ".*#define ONE"
set r3 ".*#define THREE"
set r4 ".*#define TWO"
set r5 ".*\r\n$gdb_prompt"
set testname "$test 4"
gdb_test_multiple_with_read1_timeout_factor 10 "$test" $testname {
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re "$r1$r2$r3$r4$r5" {
     pass $testname
  }
}
# same as above with a linespec.
set test "info macros *\$pc"
gdb_test_multiple_with_read1_timeout_factor 10 "$test" $test {
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $test
  }
  -re "$r1$r2$r3$r4$r5" {
     pass $test
  }
}
gdb_test "next" ".*" ""

set r1 ".*#define FOO \" \""
set r2 ".*#define ONE"
set r3 ".*#define TWO."
set r4 ".*\r\n$gdb_prompt"
set test "info macros"
set testname "$test 5"
gdb_test_multiple_with_read1_timeout_factor 10 "$test" $test {
  -re ".*#define THREE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re "$r1$r2$r3$r4" {
     pass $testname
  }
}
gdb_test "next" ".*" ""
gdb_test "next" ".*" ""

set r1 ".*#define DEF_MACROS"
set r2 ".*\r\n$gdb_prompt"
set testname "$test 6"
gdb_test_multiple_with_read1_timeout_factor 10 "$test" $testname {
  -re ".*#define FOO \" \".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOO \"hello\".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOO \"world\".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOO\\(a\\) foo = a.*" {
     fail $testname
  }
  -re ".*#define ONE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define TWO.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define THREE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOUR.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re "$r1$r2" {
     pass $testname
  }
}

gdb_test "next" ".*" ""
set r1 ".*#define DEF_MACROS"
set r2 ".*#define FOO\\(a\\) foo = a"
set r3 ".*#define FOUR"
set r4 ".*\r\n$gdb_prompt"
set testname "$test 7"
gdb_test_multiple_with_read1_timeout_factor 10 "$test" $testname {
  -re ".*#define FOO \" \".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOO \"hello\".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define FOO \"world\".*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define ONE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define TWO.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re ".*#define THREE.*\r\n$gdb_prompt" {
     fail $testname
  }
  -re "$r1$r2$r3$r4" {
     pass $testname
  }
}

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

set r1 ".*define DEF_MACROS"
set r2 ".*define ONE"
# info macros on the line where the #define or #include is
# fails to find the macro defined (though it works on the next line.)
setup_kfail "gdb/NNNN" *-*-*
gdb_test "$test" "$r1$r2"
