# Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2002, 2007, 2008
# 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/>.

# This file was written by Fred Fish. (fnf@cygnus.com)

if $tracelevel then {
	strace $tracelevel
}

if { [skip_cplus_tests] } { continue }

set testfile "misc"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
     untested misc.exp
     return -1
}

#
# Deduce language of main()
#

proc deduce_language_of_main {} {
    global gdb_prompt

    # See what language gdb thinks main() is, prior to reading full symbols.
    # I think this fails for COFF targets.
    send_gdb "show language\n"
    gdb_expect {
	-re ".* source language is \"auto; currently c\[+\]+\".*$gdb_prompt $" {
	    pass "deduced language is C++, before full symbols"
	}
	-re ".*$gdb_prompt $" {
	    fail "source language not correct for C++ (psymtabs only)"
	    return
	}
	timeout {
	    fail "can't show language (timeout)"
	    return
	}
    }

    runto_main

    # See if our idea of the language has changed.

    send_gdb "show language\n"
    gdb_expect {
	-re ".* source language is \"auto; currently c\[+\]+\".*$gdb_prompt $" {
	    pass "deduced language is C++, after full symbols"
	}
	-re ".*$gdb_prompt $" {
	    fail "source language not correct for C++ (full symbols)"
	    return
	}
	timeout {
	    fail "can't show language (timeout)"
	    return
	}
    }
}

proc test_expr { args } {
    if { [llength $args] % 2 } {
	warning "an even # of arguments should be passed to test_expr"
    }
    set last_ent [expr [llength $args] - 1];
    set testname [lindex $args $last_ent];
    if [gdb_test [lindex $args 0] "" "$testname (setup)"] {
	gdb_suppress_tests;
    }
    for {set x 1} {$x < $last_ent} {set x [expr $x + 2]} {
	if [gdb_test [lindex $args $x] [lindex $args [expr $x + 1]] "$testname ([lindex $args $x])"] {
	    gdb_suppress_tests;
	}
    }
    gdb_stop_suppressing_tests;
}

proc do_tests {} {
    global prms_id
    global bug_id
    global subdir
    global objdir
    global srcdir
    global binfile
    global gdb_prompt

    set prms_id 0
    set bug_id 0

    # Start with a fresh gdb.

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load $binfile

    deduce_language_of_main
    # Check for fixes for PRs 8916 and 8630
    gdb_test "print s.a" ".* = 0" "print s.a for foo struct (known gcc 2.7.2 and earlier bug)"
}

do_tests

test_expr "set language c++" \
    "print 1 == 1" "print.*\\$\[0-9\]* = true" \
    "print 1 == 2" "print.*\\$\[0-9\]* = false" \
    "print as bool"

# Test bool type printing, etc.
# Note: Language is already set to C++ above! 
gdb_test "print v_bool" "\\$\[0-9\]* = false" "print a bool var"

# set a bool variable
test_expr "set variable v_bool = true" \
    "print v_bool" "\\$\[0-9\]* = true" \
    "set a bool var"

# next print an array of bool
gdb_test "print v_bool_array" "\\$\[0-9\]* = \\{false, false\\}" "print a bool array"

# set elements of a bool array
test_expr "set variable v_bool_array\[1\] = true" \
    "print v_bool_array" "\\$\[0-9\]* = \\{false, true\\}" \
    "set a bool array elem"

# bool constants
gdb_test "print true" "\\$\[0-9\]* = true" "print true"
gdb_test "print false" "\\$\[0-9\]* = false" "print false"

# arithmetic conversions
gdb_test "print 1 + true" "\\$\[0-9\]* = 2" "1 + true"
gdb_test "print 3 + false" "\\$\[0-9\]* = 3" "3 + false"
gdb_test "print 1 < 2 < 3" "\\$\[0-9\]* = true" "1 < 2 < 3"
gdb_test "print 2 < 1 > 4" "\\$\[0-9\]* = false" "2 < 1 > 4"
gdb_test "print (bool)43" "\\$\[0-9\]* = true" "(bool)43"
gdb_test "print (bool)0" "\\$\[0-9\]* = false" "(bool)0"
gdb_test "print (bool)17.93" "\\$\[0-9\]* = true" "(bool)17.93"
gdb_test "print (bool)0.0" "\\$\[0-9\]* = false" "(bool)0.0"
gdb_test "print (int)true" "\\$\[0-9\]* = 1" "(int)true"
gdb_test "print (int)false" "\\$\[0-9\]* = 0" "(int)false"
