# Copyright 2013-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

# Test expressions which assume an implicit "this" with a qualified
# name.

require allow_cplus_tests

standard_testfile .cc

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

set gcc_used [test_compiler_info gcc-*-*]

# First test expressions when there is no context.
with_test_prefix "before run" {
    gdb_test "print i" "No symbol \"i\" in current context."
    gdb_test "print D::i" "Cannot reference non-static field \"i\""
    gdb_test "print D::B<int>::i" "Cannot reference non-static field \"i\""
    gdb_test "print B<int>::i" "Cannot reference non-static field \"i\""
    gdb_test "print D::C::i" "Cannot reference non-static field \"i\""
    gdb_test "print C::i" "Cannot reference non-static field \"i\""
    gdb_test "print D::B<int>::A<int>::i" \
	"Cannot reference non-static field \"i\""
    gdb_test "print B<int>::A<int>::i" "Cannot reference non-static field \"i\""
    gdb_test "print A<int>::i" "Cannot reference non-static field \"i\""
    gdb_test "print D::C::A<int>::i" "Cannot reference non-static field \"i\""
    gdb_test "print C::A<int>::i" "Cannot reference non-static field \"i\""
    gdb_test "print D::x" "Cannot reference non-static field \"x\""
    gdb_test "print x" "No symbol \"x\" in current context."
    gdb_test "print D::C::c" "Cannot reference non-static field \"c\""
    gdb_test "print C::c" "Cannot reference non-static field \"c\""
    gdb_test "print c" "No symbol \"c\" in current context."
    gdb_test "print D::A<int>::i" "Cannot reference non-static field \"i\""
}

# Run to D::f.
if {![runto_main]} {
    return
}

gdb_breakpoint "D::f"
gdb_continue_to_breakpoint "continue to D::f"

# Now test valid expressions in the class hierarchy for D.
with_test_prefix "at D::f (valid expressions)" {
    gdb_test "print i" "= 4"
    gdb_test "print D::i" "= 4"
    gdb_test "print D::B<int>::i" "= 2"
    gdb_test "print B<int>::i" "= 2"

    if {$gcc_used} {
	setup_xfail *-*-* gcc/60833
    }
    gdb_test "print D::Bint::i" "= 2"

    gdb_test "print Bint::i" "= 2"
    gdb_test "print D::C::i" "= 3"
    gdb_test "print C::i" "= 3"
    gdb_test "print D::B<int>::A<int>::i" "= 1"
    gdb_test "print B<int>::A<int>::i" "= 1"

    if {$gcc_used} {
	setup_xfail *-*-* gcc/60833
    }
    gdb_test "print D::Bint::A<int>::i" "= 1"

    gdb_test "print Bint::A<int>::i" "= 1"
    gdb_test "print A<int>::i" "= 1"
    gdb_test "print D::C::A<int>::i" "= 1"
    gdb_test "print C::A<int>::i" "= 1"
    gdb_test "print D::x" "= 40"
    gdb_test "print x" "= 40"
    gdb_test "print D::C::c" "= 30"
    gdb_test "print C::c" "= 30"
    gdb_test "print c" "= 30"
    gdb_test "print D::A<int>::i" "= 1"
}

# Test some invalid expressions
with_test_prefix "at D::f (invalid expressions)" {
    gdb_test "print D::B<int>::c" "There is no field named c"
    gdb_test "print D::B<int>::A<int>::c" "There is no field named c"

    if {$gcc_used} {
	setup_xfail *-*-* gcc/60833
    }
    gdb_test "print D::Bint::c" "There is no field named c"
    if {$gcc_used} {
	setup_xfail *-*-* gcc/60833
    }
    gdb_test "print D::Bint::A<int>::c" "There is no field named c"

    gdb_test "print D::C::A<int>::c" "There is no field named c"
    gdb_test "print B<int>::c" "There is no field named c"
    gdb_test "print B<int>::A<int>::c" "There is no field named c"
    gdb_test "print Bint::c" "There is no field named c"
    gdb_test "print Bint::A<int>::c" "There is no field named c"
    gdb_test "print C::A<int>::c" "There is no field named c"
    gdb_test "print D::B<int>::x" "There is no field named x"
    gdb_test "print D::B<int>::A<int>::x" "There is no field named x"

    if {$gcc_used} {
	setup_xfail *-*-* gcc/60833
    }
    gdb_test "print D::Bint::x" "There is no field named x"
    if {$gcc_used} {
	setup_xfail *-*-* gcc/60833
    }
    gdb_test "print D::Bint::A<int>::x" "There is no field named x"

    gdb_test "print B<int>::x" "There is no field named x"
    gdb_test "print B<int>::A<int>::x" "There is no field named x"
    gdb_test "print Bint::x" "There is no field named x"
    gdb_test "print Bint::A<int>::x" "There is no field named x"
    gdb_test "print D::C::x" "There is no field named x"
    gdb_test "print C::x" "There is no field named x"
    gdb_test "print D::C::A<int>::x" "There is no field named x"
    gdb_test "print C::A<int>::x" "There is no field named x"
}

# Test some ambiguous names
with_test_prefix "at D::f (ambiguous names)" {
    gdb_test "print B<int>::common" " = 200"
    gdb_test "print Bint::common" " = 200"
    gdb_test "print C::common" " = 300"
    gdb_test "print am.i" " = 1000"
    gdb_test "print am.A<int>::i" \
	"base class 'A<int>' is ambiguous in type 'Ambig'"
    gdb_test "print am.BB::A<int>::i" \
	"base class 'A<int>' is ambiguous in type 'Ambig'"
    gdb_test "print am.CC::A<int>::i" \
	"base class 'A<int>' is ambiguous in type 'Ambig'"
}
