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

# Make sure printing virtual base class data member works correctly (PR16841)

if { [skip_cplus_tests] } { continue }

standard_testfile .cc

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

if {![runto_main]} then {
    perror "couldn't run to main"
    continue
}

# From a list of nested scopes, generate all possible ways of accessing something
# in those scopes.  For example, with the argument {foo bar baz}, this proc will
# return:
#  - {} (empty string)
#  - baz::
#  - bar::
#  - bar::baz::
#  - foo::
#  - foo::baz::
#  - foo::bar::
#  - foo::bar::baz::

proc make_scope_list { scopes } {
    if { [llength $scopes] == 1 } {
        return [list "" "${scopes}::"]
    }

    # Pop the first element, save the first scope.
    set this_scope [lindex $scopes 0]
    set scopes [lreplace $scopes 0 0]

    set child_result [make_scope_list $scopes]

    # Add a copy of the child's result without this scope...
    set result $child_result

    # ... and a copy of the child's result with this scope.
    foreach r $child_result {
        lappend result "${this_scope}::$r"
    }

    return $result
}

proc test_variables_in_base { scopes } {
    foreach scope [make_scope_list $scopes] {
        gdb_test "print ${scope}i" " = 55"
        gdb_test "print ${scope}d" " = 6.25"
        gdb_test "print ${scope}x" " = 22"
    }
}

proc test_variables_in_superbase { scopes } {
    foreach scope [make_scope_list $scopes] {
        gdb_test "print ${scope}x" " = 22"
    }
}

proc test_variables_in_super { scopes } {
    foreach scope [make_scope_list $scopes] {
        gdb_test "print ${scope}w" " = 17"
    }
}

with_test_prefix "derived::func_d" {
    gdb_breakpoint "derived::func_d"
    gdb_continue_to_breakpoint "continue to derived::func_d"
    test_variables_in_base {derived base}
    test_variables_in_superbase {derived base superbase}
    test_variables_in_superbase {base superbase}
    test_variables_in_superbase {derived superbase}
    test_variables_in_superbase {superbase}
    test_variables_in_superbase {base}
    test_variables_in_super {super}
    test_variables_in_super {derived super}
}

with_test_prefix "foo::func_f" {
    gdb_breakpoint "foo::func_f"
    gdb_continue_to_breakpoint "continue to foo::func_f"
    test_variables_in_base {foo derived base}
    test_variables_in_base {foo base}
    test_variables_in_base {base}
    test_variables_in_superbase {superbase}
    test_variables_in_superbase {foo superbase}
    test_variables_in_superbase {foo derived superbase}
    test_variables_in_superbase {foo derived base superbase}
    test_variables_in_super {super}
    test_variables_in_super {foo super}
    test_variables_in_super {foo derived super}
}
