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

# Test UTF-8 identifiers.

load_lib "ada.exp"

require allow_ada_tests

# Enable basic use of UTF-8.  LC_ALL gets reset for each testfile.  We
# want this despite the program itself using Latin-1, as this test is
# written using UTF-8.
setenv LC_ALL C.UTF-8

standard_ada_testfile prog

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

# Restart without an executable so that we can set the encoding early.
clean_restart

gdb_test_no_output "set ada source-charset ISO-8859-3"

gdb_load ${binfile}

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

gdb_test "print VAR_Ż" " = 23"
gdb_test "print var_ż" " = 23"

gdb_breakpoint "FUNC_Ż" message
gdb_breakpoint "func_ż" message

gdb_test "print var_𝕯" "warning: charset conversion failure.*"
