# Copyright 2018-2021 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 } {
  with_test_prefix "$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 } {
  with_test_prefix "$scopes" {
      foreach scope [make_scope_list $scopes] {
	  gdb_test "print ${scope}x" " = 22"
      }
  }
}

proc test_variables_in_super { scopes } {
  with_test_prefix "$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}
}
