# 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++}] != "" } {
     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"
