# Copyright 2008, 2009, 2010 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
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

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"



