| # Copyright 1998-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 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 |
| } |
| |
| if [get_compiler_info] { |
| return -1 |
| } |
| |
| clean_restart ${binfile} |
| |
| |
| # |
| # set it up at a breakpoint so we can play with the variable values |
| # |
| |
| if ![runto_main] then { |
| perror "couldn't run to breakpoint" |
| continue |
| } |
| |
| 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" |
| |
| 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" |
| |
| |
| |
| 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>" |