# Copyright 2006 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 test checks that the if .. else .. end construct works and may
# contain empty bodies without crashing.

if $tracelevel then {
    strace $tracelevel
}

gdb_exit
gdb_start

# First test that the if command works with an empty body
# Test with different conditions because the body is ignored
# if it is not executed.

#    with true condition
set message "if 1 with empty body"
gdb_test_multiple "if 1\nend" $message {
    -re "$gdb_prompt $" {pass $message}
    eof {
	fail "$message (crashed)"
	gdb_exit
	gdb_start
    }
}

#    with false condition
set message "if 0 with empty body"
gdb_test_multiple "if 0\nend" $message {
    -re "$gdb_prompt $" {pass $message}
    eof {
	fail "$message (crashed)"
	gdb_exit
	gdb_start
    }
}

# Second, do the same tests with an empty else body.
# This fails in GDB <=6.5

# Unfortunately it was an uninitialised memory problem so
# sometimes it just works. Preceed it with an if else end with
# bodies and hopefully the memory with be dirty and the problem
# will show itself (this works at time of writing).

gdb_test "if 1\necho true\\n\nelse\necho false\\n\nend" "true" ""

#    with true condition
set message "if 1 .. else with empty body"
gdb_test_multiple "if 1\nelse\nend" $message {
    -re "$gdb_prompt $" {pass $message}
    eof {
	fail "$message (crashed)"
	gdb_exit
	gdb_start
    }
}

# dirty memory
gdb_test "if 1\necho true\\n\nelse\necho false\\n\nend" "true" ""

#    with false condition
set message "if 0 .. else with empty body"
gdb_test_multiple "if 0\nelse\nend" $message {
    -re "$gdb_prompt $" {pass $message}
    eof {
	fail "$message (crashed)"
	gdb_exit
	gdb_start
    }
}

gdb_test "set confirm off" "" ""

# Test that a define with an empty else can be replaced.
# If there is memory corruption then free will fail.
# dirty memory
gdb_test "if 1\necho true\\n\nelse\necho false\\n\nend" "true" ""
# create
gdb_test "define abc\nif 1\nelse\nend\nend" "" "create define with empty else"
# call (note that condition is 1 so should pass)
gdb_test "abc" "" "call original define"
# replace
set message "replace define with if .. else with empty body"
gdb_test_multiple "define abc\necho got here\\n\nend" $message {
    -re "$gdb_prompt $" {pass $message}
    eof {fail "$message (crashed)"}
}
# call
gdb_test "abc" "got here" "call replacement define"
