# Copyright 2015-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/>.

load_lib "ada.exp"

if { [skip_ada_tests] } { return -1 }

standard_ada_testfile fun_renaming

if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } {
  return -1
}

clean_restart ${testfile}

set bp_location [gdb_get_line_number "BREAK" ${testdir}/fun_renaming.adb]
runto "fun_renaming.adb:$bp_location"

# Sanity check: make sure we can call a regular global function.
gdb_test "print fun_rename_test_next(1)" " = 2"

# Starting with GCC 6, renamed subprograms are materialized in the debugging
# information: make sure we can call the regular global function using its
# multiple names.

set test "print fun_rename_test_n(1)"
gdb_test_multiple $test $test {
    -re " = 2\..*$gdb_prompt $"  {
        pass $test
    }
    -re "No definition of \"fun_rename_test_n\" in current context\..*$gdb_prompt $" {
        if {[test_compiler_info {gcc-6*}]} {
            fail $test
        } else {
            xfail $test
        }
    }

}
set test "print renamed_fun_rename_test_next(1)"
gdb_test_multiple $test $test {
    -re " = 2\..*$gdb_prompt $" {
        pass $test
    }
    -re "No definition of \"renamed_fun_rename_test_next\" in current context\..*$gdb_prompt $" {
        if {[test_compiler_info {gcc-6*}]} {
            fail $test
        } else {
            xfail $test
        }
    }
}

set test "print pack.renamed_fun_rename_test_next(1)"
gdb_test_multiple $test $test {
    -re " = 2\..*$gdb_prompt $" {
        pass $test
    }
    -re "No definition of \"pack\.renamed_fun_rename_test_next\" in current context\..*$gdb_prompt $" {
        if {[test_compiler_info {gcc-6*}]} {
            fail $test
        } else {
            xfail $test
        }
    }
    -re "Type <data variable, no debug info> is not a structure or union type\..*$gdb_prompt $" {
        if {[test_compiler_info {gcc-6*}]} {
            fail $test
        } else {
            xfail $test
        }
    }
}
