# Copyright (C) 2012-2026 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/>.

# This file is part of the GDB testsuite.  It tests the mechanism
# exposing values to Python.

require allow_cplus_tests allow_python_tests

standard_testfile .cc

if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} {
    return -1
}

if {![runto_main]} {
   return -1
}

gdb_breakpoint [gdb_get_line_number "Break here."]
gdb_continue_to_breakpoint "Break here" ".*Break here.*"

gdb_test "python print (str(gdb.parse_and_eval(\"a\").type))" "const A &"
gdb_test "python print (str(gdb.parse_and_eval(\"a\").referenced_value().type))" "const A"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ref\").type))" "int &"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ref\").referenced_value().type))" "int"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ref\").referenced_value()))" "10"

gdb_test "python print (str(gdb.parse_and_eval(\"int_ptr_ref\").dereference().type))" "int"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ptr_ref\").referenced_value().type))" "int_ptr"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ptr_ref\").referenced_value().dereference()))" "10"
gdb_test "python print (str(gdb.parse_and_eval(\"int_ptr_ref\").referenced_value().referenced_value()))" "10"

# Tests for gdb.Value[gdb.Field]
gdb_test_no_output "python b = gdb.parse_and_eval('b')" "init b"
gdb_test_no_output "python b_fields = b.type.fields()" "init b_fields"
gdb_test_no_output "python b_obj = gdb.parse_and_eval('b_obj')" "init b_obj"
gdb_test_no_output "python b_ref = gdb.parse_and_eval('b_ref')" "init b_ref"
gdb_test_no_output "python b_td = gdb.parse_and_eval('b_td')" "init b_td"
gdb_test_no_output "python u = gdb.parse_and_eval('u')" "init u"
gdb_test_no_output "python u_fields = u.type.fields()" "init u_fields"
gdb_test_no_output "python x = gdb.parse_and_eval('x')" "init x"
gdb_test_no_output "python x_fields = x.type.fields()" "init x_fields"
gdb_test_no_output "python uu = gdb.parse_and_eval('uu')" "init uu"
gdb_test_no_output "python uu_fields = uu.type.fields()" "init uu_fields"
gdb_test_no_output "python x_ptr = gdb.parse_and_eval('x_ptr')" "init x_ptr"
gdb_test_no_output "python xtd = gdb.parse_and_eval('xtd')" "init xtd"

gdb_test "python print(b\[b_fields\[1\]\])" "97 'a'" "b.a via field"
gdb_test "python print(b\[b_fields\[0\]\].type)" "A" \
  "type of b's base class via field"
gdb_test "python print(b\[b_fields\[0\]\]\['a'\])" "10" "b.A::a via field"

gdb_test "python print(b_obj\[b_fields\[1\]\])" "98 'b'" "b_obj->a via field"
gdb_test "python print(b_obj\[b_fields\[0\]\].type.target())" "A" \
  "type of b_obj's base class via field"
gdb_test "python print(b_obj\[b_fields\[0\]\]\['a'\])" "100" \
  "b_obj->A::a via field"

gdb_test "python print(b_ref\[b_fields\[1\]\])" "98 'b'" "b_ref.a via field"
gdb_test "python print(b_ref\[b_fields\[0\]\].type.target())" "A" \
  "type of b_ref's base class via field"
gdb_test "python print(b_ref\[b_fields\[0\]\]\['a'\])" "100" \
  "b_ref.A::a via field"

gdb_test "python print(b_td\[b_fields\[1\]\])" "98 'b'" "b_td.a via field"
gdb_test "python print(b_td\[b_fields\[0\]\].type.target())" "A" \
  "type of b_td's base class via field"
gdb_test "python print(b_td\[b_fields\[0\]\]\['a'\])" "100" \
  "b_td.A::a via field"

gdb_test "python print(hex(u\[u_fields\[0\]\]))" "0x63636363.*" \
    "u's first field via field"
gdb_test "python print(u\[u_fields\[1\]\])" "99.*" "u's second field via field"

gdb_test "python print(len(x_fields))" "2" "number for fields in u"
gdb_test "python print(x\[x_fields\[0\]\]\['x'\])" "101" "x.x via field"
gdb_test "python print(x\[x_fields\[1\]\]\['a'\])" "102" "x.a via field"
gdb_test "python print(x_ptr\[x_fields\[0\]\]\['x'\])" "101" "x_ptr->x via field"
gdb_test "python print(x_ptr\[x_fields\[1\]\]\['a'\])" "102" "x_ptr->a via field"
gdb_test "python print(xtd\[x_fields\[0\]\]\['x'\])" "101" "xtd->x via field"
gdb_test "python print(xtd\[x_fields\[1\]\]\['a'\])" "102" "xtd->a via field"

gdb_test "python print(len(uu_fields))" "2" "number of fields in uu"
gdb_test "python print(uu\[uu_fields\[0\]\]\['x'\])" "1000" "uu.x via field"
gdb_test "python print(uu\[uu_fields\[1\]\]\['a'\])" "1000" "uu.a via field"

# Test overloaded operators.
gdb_test_no_output "python a = gdb.parse_and_eval('a')" "init a"
gdb_test "python print(a + 5)" "10" "a + 5"
gdb_test "python print(gdb.parse_and_eval('b')\[5\])" "102 'f'"

# Test inferior function calls of methods.
gdb_test "py print(b_obj\['static_func'\]())" "1111"
gdb_test "py print(b_obj\['arg0_func'\]())" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg0_func'\](b_obj))" "198"
gdb_test "py print(b_obj\['arg1_func'\]())" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg1_func'\](b_obj))" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg1_func'\](b_obj, 3))" "294"
gdb_test "py print(b_obj\['arg2_func'\]())" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg2_func'\](b_obj))" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg2_func'\](b_obj, 4))" ".*Too few arguments in function call.*"
gdb_test "py print(b_obj\['arg2_func'\](b_obj, 5, 6))" "496"
