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

standard_testfile .cc

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

############################################

if {![runto_main]} {
    return
}

gdb_breakpoint [gdb_get_line_number "end of main"]
gdb_continue_to_breakpoint "end of main"

# Test that overloaded arrow operator works
gdb_test "p mp->foo()"            "= 11"

# Test that regular arrow operator still works
gdb_test "p mtp->foo()"            "= 11"

# Test that normal '.' operator still works.
gdb_test "p mt1.foo()"             "= 11"

# test that gdb extension '.' for pointers still works.
gdb_test "p mt4p.a"                "= 11"

# test that gdb extension '->' for structs still works.
gdb_test "p mt4->a"                "= 11"

# Test that templated smart pointers work
gdb_test "p sp1->foo()"            "= 11"
gdb_test "p sp2->foo()"            "= 22"

# Test that overload resolution works properly
# with smart pointers
gdb_test "p sp3->foo(1)"           "= 33"
gdb_test "p sp3->foo('a')"         "= 44"

# Test smart pointers work for member references
gdb_test "p sp4->a"         "= 11"
gdb_test "p sp4->b"         "= 12"

# Test regular arrow operator still works for
# member references
gdb_test "p mt4p->a"         "= 11"
gdb_test "p mt4p->b"         "= 12"

# Test that incorrect use of the arrow operator
# is still handled correctly.
gdb_test "p mt4->fake"       "There is no member named fake."
gdb_test "p mt4->fake()"     "Couldn't find method Type4::fake"

# Test that overloading of -> works recursively
gdb_test "p b->foo()"         "= 66"
gdb_test "p c->foo()"         "= 66"
gdb_test "p c->inta"          "= 77"

gdb_test "p c2->inta"          "= 77"
