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

standard_testfile

if { [prepare_for_testing ${testfile}.exp "$testfile"] } {
    return -1
}

if ![runto_main] {
    return -1
}

if {[skip_compile_feature_tests]} {
    untested "compile command not supported (could not find libcc1 shared library?)"
    return -1
}

gdb_test "compile print varint" " = 10"
gdb_test "compile print vararray" " = \\{1, 2, 3, 4, 5\\}"
gdb_test "compile print main" " = \\{int \\(void\\)\\} 0x\[0-9a-f\]+"

set test "compile print *vararray@3"
gdb_test_multiple $test $test {
    -re " = \\{1, 2, 3\\}\r\n$gdb_prompt $" {
	pass $test
    }
    -re ": error: stray '@' in program\r\n.*\r\n$gdb_prompt $" {
	kfail compile/18489 "$test"
    }
}

set test "compile print *vararrayp@3"
gdb_test_multiple $test $test {
    -re " = \\{1, 2, 3\\}\r\n$gdb_prompt $" {
	pass $test
    }
    -re ": error: stray '@' in program\r\n.*\r\n$gdb_prompt $" {
	kfail compile/18489 "$test"
    }
}

gdb_test "compile print/x 256" " = 0x100"
gdb_test {print $} " = 256"

gdb_test "compile print varobject" { = {field = 1}}
