diff options
author | Keven Boell <keven.boell@intel.com> | 2013-10-25 12:10:57 +0100 |
---|---|---|
committer | Keven Boell <keven.boell@intel.com> | 2013-12-19 13:18:11 +0100 |
commit | 7f9b20bb352768e14cfa7361a82373b8539bebed (patch) | |
tree | 34deb1ab6cadd180d1b66111fb3b8c98685e6879 /gdb | |
parent | f6ec89e7bc631c0bd48cb6c4b960b29266e19550 (diff) | |
download | gdb-7f9b20bb352768e14cfa7361a82373b8539bebed.zip gdb-7f9b20bb352768e14cfa7361a82373b8539bebed.tar.gz gdb-7f9b20bb352768e14cfa7361a82373b8539bebed.tar.bz2 |
fortran: enable ptype/whatis for user defined types.
(gdb) ptype type
old> No symbol "type" in current context.
new> type = Type type
integer(kind=4) :: t_i
End Type type
2013-11-19 Sanimir Agovic <sanimir.agovic@intel.com>
Keven Boell <keven.boell@intel.com>
* f-exp.y (yylex): Add domain array to enable lookup
in multiple domains. Loop over lookup domains and try
to find requested symbol. Add STRUCT_DOMAIN to lookup
domains to be able to query for user defined types.
testsuite/
* gdb.fortran/type.f90: New file.
* gdb.fortran/whatis_type.f90: New file.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/f-exp.y | 33 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.fortran/type.f90 | 28 | ||||
-rw-r--r-- | gdb/testsuite/gdb.fortran/whatis_type.exp | 48 |
4 files changed, 102 insertions, 12 deletions
diff --git a/gdb/f-exp.y b/gdb/f-exp.y index 567cd00..a7e59df 100644 --- a/gdb/f-exp.y +++ b/gdb/f-exp.y @@ -1175,21 +1175,30 @@ yylex (void) char *tmp = copy_name (yylval.sval); struct symbol *sym; struct field_of_this_result is_a_field_of_this; + enum domain_enum_tag lookup_domains[] = {STRUCT_DOMAIN, VAR_DOMAIN}; + int i; int hextype; - - /* Initialize this in case we *don't* use it in this call; that - way we can refer to it unconditionally below. */ - memset (&is_a_field_of_this, 0, sizeof (is_a_field_of_this)); - - sym = lookup_symbol (tmp, expression_context_block, - VAR_DOMAIN, - parse_language->la_language == language_cplus - ? &is_a_field_of_this : NULL); - if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF) + + for (i = 0; i < ARRAY_SIZE (lookup_domains); ++i) { - yylval.tsym.type = SYMBOL_TYPE (sym); - return TYPENAME; + /* Initialize this in case we *don't* use it in this call; that + way we can refer to it unconditionally below. */ + memset (&is_a_field_of_this, 0, sizeof (is_a_field_of_this)); + + sym = lookup_symbol (tmp, expression_context_block, + lookup_domains[i], + parse_language->la_language == language_cplus + ? &is_a_field_of_this : NULL); + if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF) + { + yylval.tsym.type = SYMBOL_TYPE (sym); + return TYPENAME; + } + + if (sym) + break; } + yylval.tsym.type = language_lookup_primitive_type_by_name (parse_language, parse_gdbarch, tmp); diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index e36e835..b5983cd 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-12-19 Keven Boell <keven.boell@intel.com> + + * gdb.fortran/type.f90: New file. + * gdb.fortran/whatis_type.f90: New file. + 2013-12-18 Sergio Durigan Junior <sergiodj@redhat.com> * gdb.base/catch-syscall.c: Include <sys/syscall.h>. diff --git a/gdb/testsuite/gdb.fortran/type.f90 b/gdb/testsuite/gdb.fortran/type.f90 new file mode 100644 index 0000000..e0c699e --- /dev/null +++ b/gdb/testsuite/gdb.fortran/type.f90 @@ -0,0 +1,28 @@ +! Copyright 2013 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/>. + +program type + implicit none + + type :: t1 + integer :: t1_i + real :: t1_r + end type t1 + + type (t1) :: t1v + + t1v%t1_i = 42 + t1v%t1_r = 42.24 ! bp1 +end program type diff --git a/gdb/testsuite/gdb.fortran/whatis_type.exp b/gdb/testsuite/gdb.fortran/whatis_type.exp new file mode 100644 index 0000000..9d6151f --- /dev/null +++ b/gdb/testsuite/gdb.fortran/whatis_type.exp @@ -0,0 +1,48 @@ +# Copyright 2013 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/>. + +if { [skip_fortran_tests] } { continue } + +standard_testfile type.f90 + +if { [prepare_for_testing ${testfile}.exp ${testfile} \ + ${srcfile} {debug f90}] } { + return -1 +} + +if ![runto MAIN__] { + fail "run to MAIN__" + return +} + +gdb_breakpoint [gdb_get_line_number "bp1"] +gdb_continue_to_breakpoint "bp1" + +set t1_i "integer\\\(kind=4\\\) :: t1_i" +set t1_r "real\\\(kind=4\\\) :: t1_r" + +gdb_test "whatis t1" \ + "type = Type t1\r\n${t1_i}\r\n${t1_r}\r\nEnd Type t1" \ + "whatis t1" +gdb_test "whatis t1v" \ + "type = Type t1\r\n${t1_i}\r\n${t1_r}\r\nEnd Type t1" \ + "whatis t1v" + +gdb_test "ptype t1" \ + "type = Type t1\r\n ${t1_i}\r\n ${t1_r}\r\nEnd Type t1" \ + "ptype t1" +gdb_test "ptype t1v" \ + "type = Type t1\r\n ${t1_i}\r\n ${t1_r}\r\nEnd Type t1" \ + "ptype t1v" |