http://gcc.gnu.org/bugzilla/show_bug.cgi?id=61014

            Bug ID: 61014
           Summary: [4.6/4.7/4.8/4.9 Regression] gdb can't find symbol of
                    derived data type array in nested subroutine
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sven.buijssen at math dot uni-dortmund.de

(I am not exactly sure whether gfortran or gdb are to blame for this issue, but
I tend towards the former.)

The following causes gdb 7.4 to report missing symbols in current context when
compiled with recent gfortran versions:

$ cat <<EOF > debug.f90
program debug
  use module
  implicit none
  type(myint), dimension(1) :: bar
  call foo(bar)
end program debug
EOF
$ cat <<EOF > module.f90
module module
  implicit none
  type myint
    integer :: i = -1
  end type myint

contains
  subroutine foo(bar)
    type(myint), dimension(:) :: bar
    call subfoo()

  contains
    subroutine subfoo()
      bar(1)%i = 1
      print *, bar(1)%i
    end subroutine subfoo
  end subroutine foo
end module module
EOF
$ gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/local/gcc/4.9.0/libexec/gcc/x86_64-unknown-linux-gnu/4.9.0/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../gcc-4.9.0/configure --prefix=/usr/local/gcc/4.9.0
--enable-languages=c,c++,fortran --disable-multilib
Thread model: posix
gcc version 4.9.0 (GCC)
$ gfortran -O0 -g -fno-inline -Wall -Wextra -c module.f90
$ gfortran -O0 -g -fno-inline -Wall -Wextra -fno-lto debug.f90 module.o
$ gdb --version
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>.
$ gdb a.out
(gdb) break module.f90:10
Breakpoint 1 at 0x4007a0: file module.f90, line 10.
(gdb) break module.f90:14
Breakpoint 2 at 0x400703: file module.f90, line 14.
(gdb) run
Starting program: /tmp/a.out 

Breakpoint 1, 0x00000000004007a0 in __module_MOD_foo ()
(gdb) print bar(1)%i
No symbol "bar" in current context.
(gdb) cont
Continuing.

Breakpoint 2, 0x0000000000400703 in subfoo.2335 ()
(gdb) print bar(1)%i
No symbol "bar" in current context.

#

Dito with GCC 4.8.2.

#

With GCC 4.6.3 and 4.7.3 the respective results of the two print commands in
gdb are:
$1 = -1
value has been optimized out

#

Whereas with GCC 4.4.7 and GCC 4.5.4 the very same version of gdb is able to
show the (expected) value of component i of the first entry of array "bar" at
both breakpoints:
$1 = -1
$2 = -1

$ gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/usr/local/gcc/4.5.4/libexec/gcc/x86_64-unknown-linux-gnu/4.5.4/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../configure --prefix=/usr/local/gcc/4.5.4
--enable-languages=c,c++,fortran --disable-multilib
Thread model: posix
gcc version 4.5.4 (GCC) 

###

With Intel Fortran 14.0.1.106 (aka XE 2013 SP1 Update 1) and its accompanying
debugger one can query the value always:

$ ifort -O0 -g -Warn all -c module.f90
$ ifort -O0 -g -Warn all -c debug.f90
$ ifort -O0 -g -Warn all debug.o module.o
$ idbc a.out
Intel(R) Debugger for applications running on Intel(R) 64, Version 13.0, Build
[80.483.23]
------------------ 
object file name: a.out 
Reading symbols from /tmp/a.out...done.
(idb) break module.f90:10
Breakpoint 1 at 0x402ca5: file /tmp/module.f90, line 10.
(idb) break module.f90:14
Breakpoint 2 at 0x402ce8: file /tmp/module.f90, line 14.
(idb) run
Starting program: /tmp/a.out
[New Thread 23410 (LWP 23410)]

Breakpoint 1, MODULE::foo (bar=(...)) at /tmp/module.f90:10
10          call subfoo()
(idb) print bar(1)%i
$1 = -1
(idb) cont
Continuing.

Breakpoint 2, subfoo () at /tmp/module.f90:14
14            bar(1)%i = 1
(idb) print bar(1)%i
$2 = -1
(idb) next
15            print *, bar(1)%i
(idb) print bar(1)%i
$3 = 1

Reply via email to