# Copyright 2008, 2009, 2010, 2011 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/>.

if $tracelevel then {
    strace $tracelevel
}

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}

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"



