# Copyright 2006, 2007, 2008, 2009, 2010 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 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_no_output "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_no_output "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"
