diff options
Diffstat (limited to 'gdb/testsuite')
-rwxr-xr-x | gdb/testsuite/gdb.fortran/oop_extend_type.exp | 159 | ||||
-rwxr-xr-x | gdb/testsuite/gdb.fortran/oop_extend_type.f90 | 69 |
2 files changed, 228 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.fortran/oop_extend_type.exp b/gdb/testsuite/gdb.fortran/oop_extend_type.exp new file mode 100755 index 00000000000..eefc66c9514 --- /dev/null +++ b/gdb/testsuite/gdb.fortran/oop_extend_type.exp @@ -0,0 +1,159 @@ +# Copyright 2022 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/>. + +standard_testfile ".f90" +load_lib "fortran.exp" + +if { [skip_fortran_tests] } { + return -1 +} + +if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} \ + {debug f90 quiet}] } { + return -1 +} + +if ![fortran_runto_main] { + perror "could not run to main" + return -1 +} + +# Depending on the compiler being used, the type names can be printed differently. +set real [fortran_real4] +set logical [fortran_logical4] + +set line1 [gdb_get_line_number "! Before vla allocation"] +gdb_breakpoint $line1 +gdb_continue_to_breakpoint "line1" ".*$srcfile:$line1.*" + +gdb_test "whatis wp_vla" "type = Type waypoint, allocatable \\(:\\)" \ + "whatis wp_vla before allocation" + +set line2 [gdb_get_line_number "! After value assignment"] +gdb_breakpoint $line2 +gdb_continue_to_breakpoint "line2" ".*$srcfile:$line2.*" + +# test print of wp +set test "p wp%coo" +gdb_test_multiple "$test" "$test" { + -re " = \\(1, 2, 1\\)\r\n$gdb_prompt $" { + pass "$test" + } + -re "There is no member named coo.\r\n$gdb_prompt $" { + kfail "gcc/49475" "$test" + } +} +gdb_test "p wp%point%coo" " = \\(1, 2, 1\\)" +gdb_test "p wp%point" " = \\( coo = \\(1, 2, 1\\) \\)" +gdb_test "p wp" " = \\( point = \\( coo = \\(1, 2, 1\\) \\), angle = 100 \\)" + +gdb_test "whatis wp" "type = Type waypoint" +gdb_test "ptype wp" \ + [multi_line "type = Type waypoint" \ + " Type point :: point" \ + " $real :: angle" \ + "End Type waypoint"] + +set test "ptype wp%coo" +gdb_test_multiple "$test" "$test" { + -re "$real \\(3\\)\r\n$gdb_prompt $" { + pass "$test" + } + -re "There is no member named coo.\r\n$gdb_prompt $" { + kfail "gcc/49475" "$test" + } +} +gdb_test "ptype wp%point%coo" "$real \\(3\\)" + +# test print of fwp +set test "p fwp%coo" +gdb_test_multiple "$test" "$test" { + -re " = \\(1, 2, 2\\)\r\n$gdb_prompt $" { + pass "$test" + } + -re "There is no member named coo.\r\n$gdb_prompt $" { + kfail "gcc/49475" "$test" + } +} +gdb_test "p fwp%waypoint%point%coo" " = \\(1, 2, 2\\)" +gdb_test "p fwp%waypoint%point" " = \\( coo = \\(1, 2, 2\\) \\)" +gdb_test "p fwp%waypoint" \ + " = \\( point = \\( coo = \\(1, 2, 2\\) \\), angle = 10 \\)" +gdb_test "p fwp" \ + " = \\( waypoint = \\( point = \\( coo = \\(1, 2, 2\\) \\), angle = 10 \\), is_fancy = \.TRUE\. \\)" + +set test "p fwp%angle" +gdb_test_multiple "$test" "$test" { + -re " = 10\r\n$gdb_prompt $" { + pass "$test" + } + -re "There is no member named angle.\r\n$gdb_prompt $" { + kfail "gcc/49475" "$test" + } +} + +gdb_test "whatis fwp" "type = Type fancywaypoint" +gdb_test "ptype fwp" \ + [multi_line "type = Type fancywaypoint" \ + " Type waypoint :: waypoint" \ + " $logical :: is_fancy" \ + "End Type fancywaypoint"] + +set test "ptype fwp%coo" +gdb_test_multiple "$test" "$test" { + -re "$real \\(3\\)\r\n$gdb_prompt $" { + pass "$test" + } + -re "There is no member named coo.\r\n$gdb_prompt $" { + kfail "gcc/49475" "$test" + } +} +gdb_test "ptype fwp%waypoint%point%coo" "$real \\(3\\)" + +# test print of wp_vla +set test "p wp_vla(1)%coo" +gdb_test_multiple "$test" "$test" { + -re " = \\(10, 12, 10\\)\r\n$gdb_prompt $" { + pass "$test" + } + -re "There is no member named coo.\r\n$gdb_prompt $" { + kfail "gcc/49475" "$test" + } +} + +gdb_test "p wp_vla(1)%point%coo" " = \\(10, 12, 10\\)" +gdb_test "p wp_vla(1)%point" " = \\( coo = \\(10, 12, 10\\) \\)" +gdb_test "p wp_vla(1)" " = \\( point = \\( coo = \\(10, 12, 10\\) \\), angle = 101 \\)" + +gdb_test "whatis wp_vla" "type = Type waypoint, allocatable \\(3\\)" \ + "whatis wp_vla after allocation" + +gdb_test "ptype wp_vla" \ + [multi_line "type = Type waypoint" \ + " Type point :: point" \ + " $real :: angle" \ + "End Type waypoint, allocatable \\(3\\)"] + +set test "ptype wp_vla(1)%coo" +gdb_test_multiple "$test" "$test" { + -re "$real \\(3\\)\r\n$gdb_prompt $" { + pass "$test" + } + -re "There is no member named coo.\r\n$gdb_prompt $" { + kfail "gcc/49475" "$test" + } +} + +gdb_test "ptype wp_vla(1)%point%coo" "$real \\(3\\)" diff --git a/gdb/testsuite/gdb.fortran/oop_extend_type.f90 b/gdb/testsuite/gdb.fortran/oop_extend_type.f90 new file mode 100755 index 00000000000..dc91c45c60a --- /dev/null +++ b/gdb/testsuite/gdb.fortran/oop_extend_type.f90 @@ -0,0 +1,69 @@ +! Copyright 2022 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/>. + +! Test fortran extends feature (also for chained extends). +module testmod + implicit none + type :: point + real :: coo(3) + end type + + type, extends(point) :: waypoint + real :: angle + end type + + type, extends(waypoint) :: fancywaypoint + logical :: is_fancy + end type +end module + +program testprog + use testmod + implicit none + + logical l + type(waypoint) :: wp + type(fancywaypoint) :: fwp + type(waypoint), allocatable :: wp_vla(:) + + l = .FALSE. + allocate(wp_vla(3)) ! Before vla allocation + + l = allocated(wp_vla) ! After vla allocation + + wp%angle = 100.00 + wp%coo(:) = 1.00 + wp%coo(2) = 2.00 + + fwp%is_fancy = .TRUE. + fwp%angle = 10.00 + fwp%coo(:) = 2.00 + fwp%coo(1) = 1.00 + + wp_vla(1)%angle = 101.00 + wp_vla(1)%coo(:) = 10.00 + wp_vla(1)%coo(2) = 12.00 + + wp_vla(2)%angle = 102.00 + wp_vla(2)%coo(:) = 20.00 + wp_vla(2)%coo(2) = 22.00 + + wp_vla(3)%angle = 103.00 + wp_vla(3)%coo(:) = 30.00 + wp_vla(3)%coo(2) = 32.00 + + print *, wp, wp_vla, fwp ! After value assignment + +end program |