# Copyright 1992, 1994, 1995, 1996, 1997, 1999, 2002 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# 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++}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

#
# 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"
