# Copyright 2010-2012 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 }

set testfile static-print-quit
set srcfile ${testfile}.cc
set executable $testfile.o
set objfile ${objdir}/${subdir}/${executable}

if { [gdb_compile $srcdir/$subdir/$srcfile $objfile object {debug c++}] != ""} {
    untested ${testfile}.exp
    return -1
}

clean_restart $executable

gdb_test_no_output "set width 80"
gdb_test_no_output "set height 2"

set test "print c - <return>"
gdb_test_multiple "print c" $test {
    -re "\\$\[0-9\]+ = \{loooooooooooooooooooooooooooooooooooooooooooooong = 0, static field = \{\r\n---Type <return>" {
	pass $test
    }
    -re "\r\n---Type <return>" {
	# gdb-7.1 did not crash with this testcase but it had the same bug.
	untested ${testfile}.exp
	return 0
    }
}

set test "print c - q <return>"
gdb_test_multiple "" $test {
    -re " to continue, or q <return>" {
	pass $test
    }
}

set test "print c - to quit"
gdb_test_multiple "" $test {
    -re " to quit---$" {
	pass $test
    }
}

gdb_test "q" ".*"

# Now the obstack is uninitialized.  Excercise it.

gdb_test_no_output "set pagination off"
gdb_test "print c" ".*" "first print"
gdb_test "print c" ".*" "second print"
