| # Copyright 2006-2021 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. |
| |
| 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. Precede 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" \ |
| "if true else false #1" |
| |
| # 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" \ |
| "if true else false #2" |
| |
| # 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" \ |
| "if true else false #3" |
| # 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" |