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

# Tests for the bug mentioned in PR gdb/574.  It's a bit
# idiosyncratic, so I gave it its own file.

# 2002-08-16  David Carlton <carlton@math.stanford.edu>

# This file is part of the gdb testsuite

if { [skip_cplus_tests] } { continue }

#
# test running programs
#

standard_testfile .cc

if [get_compiler_info "c++"] {
    return -1
}

set flags [list debug c++]
if { [test_compiler_info gcc-*] && [gcc_major_version] >= 10 } {
    # Work around PR gcc/101452.
    lappend flags additional_flags=-fno-eliminate-unused-debug-types
}

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

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

# First, run to after we've constructed the object:

gdb_breakpoint [gdb_get_line_number "constructs-done"]
gdb_continue_to_breakpoint "end of constructors"

# This failed, as long as the code was compiled with GCC v. 2.

# Different compilers order the data for <A> differently, so I'm not
# matching the result exactly.

gdb_test "print *theB" "\\$\[0-9\]* = {<A> = {\[^}\]*}, static b = <optimized out>}" "PR gdb/574"

gdb_exit
return 0
