# Copyright 2008-2012 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"

set testdir "homonym"
set testfile "${testdir}/homonym_main"
set srcfile ${srcdir}/${subdir}/${testfile}.adb
set binfile ${objdir}/${subdir}/${testfile}

file mkdir ${objdir}/${subdir}/${testdir}
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } {
  return -1
}

clean_restart ${testfile}


# Do these tests before running, so we are operating in a known
# environment.

gdb_test "break Get_Value" \
    "Breakpoint \[0-9\]+ at $hex: Get_Value. .2 locations." \
    "set breakpoint at Get_Value"

gdb_test "break homonym.adb:Get_Value" \
    "Breakpoint \[0-9\]+ at $hex: homonym.adb:Get_Value. .2 locations." \
    "set breakpoint at homonym.adb:Get_Value"

gdb_test "break <homonym__get_value>" \
    "Breakpoint \[0-9\]+ at $hex: <homonym__get_value>. .2 locations." \
    "set breakpoint at <homonym__get_value>"

delete_breakpoints

set bp_location [gdb_get_line_number "BREAK_1" ${testdir}/homonym.adb]
runto "homonym.adb:$bp_location"

# Check the variables and types defined inside the current scope.
# There are some homonyms in a different scope, so we want to make
# sure that the debugger doesn't get mixed up.

gdb_test "ptype local_type" \
         "type = range -100 \\.\\. 100" \
         "ptype local_type at BREAK_1"

gdb_test "ptype local_type_subtype" \
         "type = range -100 \\.\\. 100" \
         "ptype local_type_subtype at BREAK_1"

gdb_test "ptype int_type" \
         "type = range -100 \\.\\. 100" \
         "ptype int_type at BREAK_1"

gdb_test "ptype lcl" \
         "type = range -100 \\.\\. 100" \
         "ptype lcl at BREAK_1"

gdb_test "print lcl" \
         "= 29" \
         "print lcl at BREAK_1"

# Now, continue until reaching BREAK_2, and do the same commands
# as above.  The result should be different since the definitions
# in the new scope are different.

set bp_location [gdb_get_line_number "BREAK_2" ${testdir}/homonym.adb]
gdb_test "break homonym.adb:$bp_location" \
         "Breakpoint \[0-9\]+ at 0x\[0-9a-fA-F\]+: file .*homonym\.adb, line \[0-9\]+\." \
         "break at BREAK_2"

gdb_test "continue" \
         ".*Breakpoint \[0-9\]+, homonym\\.get_value \\(\\) at .*homonym\\.adb:.*" \
         "continue until BREAK_2"

gdb_test "ptype local_type" \
         "type = range 1 \\.\\. 19740804" \
         "ptype local_type at BREAK_2"

gdb_test "ptype local_type_subtype" \
         "type = range 1 \\.\\. 19740804" \
         "ptype local_type_subtype at BREAK_2"

gdb_test "ptype lcl" \
         "type = range 1 \\.\\. 19740804" \
         "ptype lcl at BREAK_2"

gdb_test "print lcl" \
         "= 17" \
         "print lcl at BREAK_2"
