# Copyright 2012-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 a

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

clean_restart ${testfile}

set bp_location [gdb_get_line_number "STOP" ${testdir}/a.adb]
if ![runto "a.adb:$bp_location" ] then {
  perror "Couldn't run ${testfile}"
  return
}

# Verify that assigning to Nnn (a basic string) works...

gdb_test "print nnn" \
         "= \"12345\"" \
         "print nnn before assignment"

gdb_test_no_output "set variable nnn := \"qcyom\""

gdb_test "print nnn" \
         "= \"qcyom\"" \
         "print nnn after assignment"

# Same with Www (a wide string)...

gdb_test "print www" \
         "= \"12345\"" \
         "print www before assignment"

gdb_test_no_output "set variable www := \"zenrk\""

gdb_test "print www" \
         "= \"zenrk\"" \
         "print www after assignment"

# Same with Rws (a wide wide string)...

gdb_test "print rws" \
         "= \"12345\"" \
         "print rws before assignment"

gdb_test_no_output "set variable rws := \"ndhci\""

gdb_test "print rws" \
         "= \"ndhci\"" \
         "print rws after assignment"

# Also, check that GDB doesn't get tricked if we assign to Www a
# string twice the length of Www.  The debugger should reject the
# assignment, because the array lengths are different (the debugger
# used to get tricked because the array size was the same).

gdb_test "set variable www := \"1#2#3#4#5#\"" \
         "cannot assign arrays of different length"

# However, reassigning an array of a different length should work when
# the LHS is a convenience variable.
gdb_test_no_output "set variable \$str := \"1234\""
gdb_test_no_output "set variable \$str := \"12345\""
