|  | # Copyright 1998-2023 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 file was written by Elena Zannoni (ezannoni@cygnus.com) | 
|  |  | 
|  | # This file is part of the gdb testsuite | 
|  | # | 
|  | # tests for pointer arithmetic and pointer dereferencing | 
|  | # with integer type variables and pointers to integers | 
|  | # | 
|  |  | 
|  | # | 
|  | # test running programs | 
|  | # | 
|  |  | 
|  | standard_testfile .c | 
|  |  | 
|  | if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug nowarnings}] != "" } { | 
|  | untested "failed to compile" | 
|  | return -1 | 
|  | } | 
|  |  | 
|  | clean_restart ${binfile} | 
|  |  | 
|  |  | 
|  | # | 
|  | # set it up at a breakpoint so we can play with the variable values | 
|  | # | 
|  |  | 
|  | if {![runto_main]} { | 
|  | return | 
|  | } | 
|  |  | 
|  | # These are used as expected result values. | 
|  | set false 0 | 
|  | set true 1 | 
|  |  | 
|  | gdb_test "next " "more_code.*;" "continuing after dummy()" | 
|  |  | 
|  |  | 
|  | # | 
|  | # let's see if gdb catches some illegal operations on pointers | 
|  | # | 
|  | # I must comment these out because strict type checking is not | 
|  | # supported in this version of GDB. I do not really know | 
|  | # what the expected gdb reply is. | 
|  | # | 
|  |  | 
|  | #send_gdb "print v_int_pointer2 = &v_int_pointer\n" | 
|  | #gdb_expect { | 
|  | #    -re ".*.*$gdb_prompt $" { | 
|  | #        pass "illegal pointer assignment rejected" | 
|  | #      } | 
|  | #    -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } | 
|  | #    timeout           { fail "(timeout) illegal pointer assignment rejected" } | 
|  | #  } | 
|  |  | 
|  |  | 
|  | #send_gdb "print v_unsigned_int_pointer = &v_int\n" | 
|  | #gdb_expect { | 
|  | #    -re ".*.*$gdb_prompt $" { | 
|  | #        pass "illegal pointer assignment rejected" | 
|  | #      } | 
|  | #    -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } | 
|  | #    timeout           { fail "(timeout) ilegal pointer assignment rejected" } | 
|  | #  } | 
|  |  | 
|  | #send_gdb "print v_unsigned_int_pointer == v_double_pointer\n" | 
|  | #gdb_expect { | 
|  | #    -re ".*.*$gdb_prompt $" { | 
|  | #        pass "illegal pointer operation (+) rejected" | 
|  | #      } | 
|  | #    -re ".*$gdb_prompt $" { fail "illegal pointer operation (+) rejected" } | 
|  | #    timeout           { fail "(timeout) illegal pointer operation (+) rejected" } | 
|  | #  } | 
|  |  | 
|  |  | 
|  | #send_gdb "print v_unsigned_int_pointer * v_double_pointer\n" | 
|  | #gdb_expect { | 
|  | #    -re ".*Argument to arithmetic operation not a number or boolean.*$gdb_prompt $" { | 
|  | #        pass "illegal pointer operation (*) rejected" | 
|  | #      } | 
|  | #    -re ".*$gdb_prompt $" { fail "illegal pointer operation (*) rejected" } | 
|  | #    timeout           { fail "(timeout) illegal pointer operation (*) rejected" } | 
|  | #  } | 
|  |  | 
|  |  | 
|  | #send_gdb "print v_unsigned_int_pointer = v_double_pointer\n" | 
|  | #gdb_expect { | 
|  | #    -re ".*.*$gdb_prompt $" { | 
|  | #        pass "ilegal pointer assignment rejected" | 
|  | #      } | 
|  | #    -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } | 
|  | #    timeout           { fail "(timeout) illegal pointer assignment rejected" } | 
|  | #  } | 
|  |  | 
|  |  | 
|  | #send_gdb "print v_unsigned_int_pointer = v_unsigned_int\n" | 
|  | #gdb_expect { | 
|  | #    -re ".*.*$gdb_prompt $" { | 
|  | #        pass "illegal pointer assignment rejected" | 
|  | #      } | 
|  | #    -re ".*$gdb_prompt $" { fail "illegal pointer assignment rejected" } | 
|  | #    timeout           { fail "(timeout) illegal pointer assignment rejected" } | 
|  | #  } | 
|  |  | 
|  | gdb_test_no_output "set variable v_int_pointer=&v_int_array\[0\]" \ | 
|  | "set pointer to beginning of array" | 
|  | gdb_test_no_output "set variable v_int_pointer2=&v_int_array\[1\]" \ | 
|  | "set pointer to end of array" | 
|  |  | 
|  |  | 
|  | gdb_test "print *v_int_pointer" " = 6" "print object pointed to" | 
|  |  | 
|  | gdb_test "print *v_int_pointer2" " = 18" "print object pointed to \#2" | 
|  |  | 
|  | gdb_test "print v_int_pointer == v_int_pointer2" " = $false" \ | 
|  | "pointer1==pointer2" | 
|  |  | 
|  | gdb_test "print v_int_pointer != v_int_pointer2" " = $true" \ | 
|  | "pointer1!=pointer2" | 
|  |  | 
|  | gdb_test "print v_int_pointer <= v_int_pointer2" " = $true" \ | 
|  | "pointer1<=pointer2" | 
|  |  | 
|  | gdb_test "print v_int_pointer >= v_int_pointer2" " = $false" \ | 
|  | "pointer1>=pointer2" | 
|  |  | 
|  | gdb_test "print v_int_pointer < v_int_pointer2" " = $true" \ | 
|  | "pointer1<pointer2" | 
|  |  | 
|  | gdb_test "print v_int_pointer > v_int_pointer2" " = $false" \ | 
|  | "pointer1>pointer2" | 
|  |  | 
|  | with_test_prefix "post-increment" { | 
|  | gdb_test_no_output "set variable y = *v_int_pointer++" \ | 
|  | "set y = *v_int_pointer++" | 
|  | gdb_test "print y" " = 6" "pointer assignment" | 
|  | gdb_test "print *v_int_pointer" " = 18" "and post-increment" | 
|  | } | 
|  |  | 
|  |  | 
|  | with_test_prefix "pre-decrement" { | 
|  | gdb_test_no_output "set variable y = *--v_int_pointer2" \ | 
|  | "set y = *--v_int_pointer2" | 
|  | gdb_test "print y" " = 6" "pointer assignment" | 
|  | gdb_test "print *v_int_pointer2" " = 6" "and pre-decrement" | 
|  | } | 
|  |  | 
|  |  | 
|  | gdb_test_no_output "set variable y =v_int_pointer-v_int_pointer2" \ | 
|  | "set y =v_int_pointer-v_int_pointer2" | 
|  | gdb_test "print y" " = 1" "pointer1-pointer2" | 
|  |  | 
|  |  | 
|  | gdb_test_no_output "set variable v_int_pointer=v_int_array" \ | 
|  | "set v_int_pointer=v_int_array" | 
|  | gdb_test "print *v_int_pointer" " = 6" \ | 
|  | "print array element through pointer" | 
|  |  | 
|  | gdb_test "print *(v_int_pointer+1)" " = 18" \ | 
|  | "print array element through pointer \#2" | 
|  |  | 
|  |  | 
|  | # test print elements of array through pointers | 
|  |  | 
|  | gdb_test "print (*rptr)\[0\]" " = 0" \ | 
|  | "print array element through pointer \#3" | 
|  |  | 
|  | gdb_test "print (*rptr)\[1\]" " = 1" \ | 
|  | "print array element through pointer \#4" | 
|  |  | 
|  | gdb_test "print (*rptr)\[2\]" " = 2" \ | 
|  | "print array element through pointer \#5" | 
|  |  | 
|  | gdb_test_no_output "set variable rptr = rptr+1" "increment rptr" | 
|  |  | 
|  | gdb_test "print (*rptr)\[0\]" " = 3" \ | 
|  | "print array element through pointer \#6" | 
|  |  | 
|  | gdb_test "print (*rptr)\[1\]" " = 4" \ | 
|  | "print array element through pointer \#7" | 
|  |  | 
|  | gdb_test "print (*rptr)\[2\]" " = 5" \ | 
|  | "print array element through pointer \#8" | 
|  |  | 
|  | gdb_test "print *( *(matrix+1) +2)" " = 5" \ | 
|  | "print array element w/ pointer arithmetic" | 
|  |  | 
|  | gdb_test "print **ptr_to_ptr_to_float" " = 100" \ | 
|  | "print through ptr to ptr" | 
|  |  | 
|  | # tests for pointers | 
|  | # with elementary type variables and pointers. | 
|  | # | 
|  |  | 
|  | gdb_test "break marker1" ".*" "" | 
|  | gdb_test "cont" "Break.* marker1 \\(\\) at .*:$decimal.*" \ | 
|  | "continue to marker1" | 
|  | gdb_test "up" "more_code.*" "up from marker1" | 
|  |  | 
|  | gdb_test "print *pUC" " = 21 \'.025\'.*" "print value of *pUC" | 
|  |  | 
|  | gdb_test "ptype pUC" "type = unsigned char \\*" | 
|  |  | 
|  | gdb_test "print *pS" " = -14" "print value of *pS" | 
|  |  | 
|  | gdb_test_multiple "ptype pS" "ptype pS" { | 
|  | -re "type = short \\*.*$gdb_prompt $"  { pass "ptype pS" } | 
|  | -re "type = short int \\*.*$gdb_prompt $"  { pass "ptype pS" } | 
|  | } | 
|  |  | 
|  | gdb_test "print *pUS" " = 7" "print value of *pUS" | 
|  |  | 
|  | gdb_test_multiple "ptype pUS" "ptype pUS" { | 
|  | -re "type = unsigned short \\*.*$gdb_prompt $"  { pass "ptype pUS" } | 
|  | -re "type = short unsigned int \\*.*$gdb_prompt $"  { pass "ptype pUS" } | 
|  | } | 
|  |  | 
|  | gdb_test "print *pI" " = 102" "print value of *pI" | 
|  |  | 
|  | gdb_test "ptype pI" "type = int \\*" | 
|  |  | 
|  | gdb_test "print *pUI" " = 1002" "print value of *pUI" | 
|  |  | 
|  | gdb_test "ptype pUI" "type = unsigned int \\*" | 
|  |  | 
|  | gdb_test "print *pL" " = -234" "print value of *pL" | 
|  |  | 
|  | gdb_test_multiple "ptype pL" "ptype pL" { | 
|  | -re "type = long \\*.*$gdb_prompt $" { pass "ptype pL" } | 
|  | -re "type = long int \\*.*$gdb_prompt $" { pass "ptype pL" } | 
|  | } | 
|  |  | 
|  | gdb_test "print *pUL" " = 234" "print value of *pUL" | 
|  |  | 
|  | gdb_test_multiple "ptype pUL" "ptype pUL" { | 
|  | -re "type = unsigned long \\*.*$gdb_prompt $"  { pass "ptype pUL" } | 
|  | -re "type = long unsigned int \\*.*$gdb_prompt $"  { pass "ptype pUL" } | 
|  | } | 
|  |  | 
|  | gdb_test "print *pF" " = 1.2\[0-9\]*e\\+0?10" "print value of *pF" | 
|  |  | 
|  | gdb_test "ptype pF" "type = float \\*" | 
|  |  | 
|  | gdb_test "print *pD" " = -1.2\[0-9\]*e\\-0?37" "print value of *pD" | 
|  |  | 
|  | gdb_test "ptype pD" "type = double \\*" | 
|  |  | 
|  | gdb_test "print ******ppppppC" " = 65 \'A\'" \ | 
|  | "print value of ******ppppppC" | 
|  |  | 
|  | gdb_test "ptype pC" "type = char \\*" | 
|  |  | 
|  | gdb_test "ptype ppC" "type = char \\*\\*" | 
|  |  | 
|  | gdb_test "ptype pppC" "type = char \\*\\*\\*" | 
|  |  | 
|  | gdb_test "ptype ppppC" "type = char \\*\\*\\*\\*" | 
|  |  | 
|  | gdb_test "ptype pppppC" "type = char \\*\\*\\*\\*\\*" | 
|  |  | 
|  | gdb_test "ptype ppppppC" "type = char \\*\\*\\*\\*\\*\\*" | 
|  |  | 
|  | # Regression test for a crash. | 
|  |  | 
|  | gdb_test "p instance.array_variable + 0" \ | 
|  | " = \\(long (int )?\\*\\) 0x\[0-9a-f\]* <instance>" |