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

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
}

gdb_breakpoint [gdb_get_line_number "stop inside C"]
gdb_continue_to_breakpoint "stop inside C"

gdb_test "print includefile\[0\]" " = 23"
gdb_test "print this->includefile\[0\]" " = 23"
gdb_test "print 'includefile'::some_global" " = 27" \
    "print some_global from within C"

gdb_breakpoint [gdb_get_line_number "stop inside D"]
gdb_continue_to_breakpoint "stop inside D"

gdb_test "print includefile()" " = 24"
gdb_test "print this->includefile()" " = 24"
gdb_test "print 'includefile'::some_global" " = 27"  \
    "print some_global from within D"

gdb_breakpoint [gdb_get_line_number "stop outside"]
gdb_continue_to_breakpoint "stop outside"

gdb_test "print c.includefile\[0\]" " = 23"
gdb_test "print pc->includefile\[0\]" " = 23"
gdb_test "print d.includefile()" " = 24"
gdb_test "print pd->includefile()" " = 24"
