"unsupported language" error in info types when using Ada.
authorJoel Brobecker <brobecker@gnat.com>
Tue, 20 Apr 2010 22:38:02 +0000 (22:38 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Tue, 20 Apr 2010 22:38:02 +0000 (22:38 +0000)
This implements a rudimentary version of the la_print_typedef method
for Ada.  Ada usually does not use typedefs, but there is one exception:
pointers to unconstrained arrays.  Without this patch, we sometimes
get an error in the "info types" output:

    (gdb) info types new_integer_type
    All types matching regular expression "new_integer_type":

    File foo.adb:
    Language not supported.

For now, we treat the typedef as if it did not exist - using the
underlying type instead.  This is the right thing to do for most cases,
the only exception being access to array types.  Since we already have
a general issue in handling these pointers (we confuse them with fat
pointers), we will enhance ada_print_typedef to handle these pointers
at the same time we address the general issue.

gdb/ChangeLog:

        * ada-typeprint.c (ada_print_typedef): New function.
        * ada-lang.h (ada_print_typedef): Add declaration.
        * ada-lang.c (ada_language_defn): set la_print_typdef field
        to ada_print_typedef.

gdb/testsuite/ChangeLog:

        * info_types.c, info_types.exp: New files.

Tested on x86_64-linux.

gdb/ChangeLog
gdb/ada-lang.c
gdb/ada-lang.h
gdb/ada-typeprint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.ada/info_types.c [new file with mode: 0644]
gdb/testsuite/gdb.ada/info_types.exp [new file with mode: 0644]

index 8684d81f1ff951bd971fe3f3d0ebd63b0dc1369a..fe8bcb790c4812c7085be6a71d04b76541199732 100644 (file)
@@ -1,3 +1,10 @@
+2010-04-20  Joel Brobecker  <brobecker@adacore.com>
+
+       * ada-typeprint.c (ada_print_typedef): New function.
+       * ada-lang.h (ada_print_typedef): Add declaration.
+       * ada-lang.c (ada_language_defn): set la_print_typdef field
+       to ada_print_typedef.
+
 2010-04-20  Joel Brobecker  <brobecker@adacore.com>
 
        * procfs.c (procfs_address_to_host_pointer): Only define when used.
index df8ff19f19534f17d03fb539d1da67ee0ac00254..a598c6db791bcbc558d544887866411d7eb448f1 100644 (file)
@@ -11276,7 +11276,7 @@ const struct language_defn ada_language_defn = {
   ada_printstr,                 /* Function to print string constant */
   emit_char,                    /* Function to print single char (not used) */
   ada_print_type,               /* Print a type using appropriate syntax */
-  default_print_typedef,       /* Print a typedef using appropriate syntax */
+  ada_print_typedef,            /* Print a typedef using appropriate syntax */
   ada_val_print,                /* Print a value using appropriate syntax */
   ada_value_print,              /* Print a top-level value */
   NULL,                         /* Language specific skip_trampoline */
index 017cff2548b1f5f1dd5dcce0b631e6f950e54987..3d60f8f8a1d7553428a4e36d45d3a9bc271e6f01 100644 (file)
@@ -159,6 +159,9 @@ extern void ada_error (char *); /* Defined in ada-exp.y */
 extern void ada_print_type (struct type *, char *, struct ui_file *, int,
                             int);
 
+extern void ada_print_typedef (struct type *type, struct symbol *new_symbol,
+                              struct ui_file *stream);
+
 extern int ada_val_print (struct type *, const gdb_byte *, int, CORE_ADDR,
                           struct ui_file *, int,
                          const struct value_print_options *);
index 74eaabf2afbe8abd6b95a8c90b6ba7f2364fa7c0..17d3594250df8801e1a5cb951a6a7249205b994d 100644 (file)
@@ -828,3 +828,14 @@ ada_print_type (struct type *type0, char *varstring, struct ui_file *stream,
        break;
       }
 }
+
+/* Implement the la_print_typedef language method for Ada.  */
+
+void
+ada_print_typedef (struct type *type, struct symbol *new_symbol,
+                   struct ui_file *stream)
+{
+  type = ada_check_typedef (type);
+  ada_print_type (type, "", stream, 0, 0);
+  fprintf_filtered (stream, "\n");
+}
index 8913d8962b9b8f9517f71fb919948e1164a41405..1a1df4c779c503bce21909b50cadec63c6d2d0a4 100644 (file)
@@ -1,3 +1,7 @@
+2010-04-20  Joel Brobecker  <brobecker@adacore.com>
+
+       * info_types.c, info_types.exp: New files.
+
 2010-04-20  Joel Brobecker  <brobecker@adacore.com>
 
        * gdb.ada/dyn_loc: New testcase.
diff --git a/gdb/testsuite/gdb.ada/info_types.c b/gdb/testsuite/gdb.ada/info_types.c
new file mode 100644 (file)
index 0000000..c7fd3f4
--- /dev/null
@@ -0,0 +1,35 @@
+/* This test program is part of GDB, the GNU debugger.
+
+   Copyright 2010 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/>.
+   */
+
+typedef int new_integer_type;
+
+void
+do_something (int *val)
+{
+  *val = *val + 1;
+}
+
+int
+main (void)
+{
+  new_integer_type toto = 30;
+
+  do_something(&toto);
+  return 0;
+}
+
diff --git a/gdb/testsuite/gdb.ada/info_types.exp b/gdb/testsuite/gdb.ada/info_types.exp
new file mode 100644 (file)
index 0000000..a62da35
--- /dev/null
@@ -0,0 +1,31 @@
+# Copyright 2010 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/>.
+
+set testfile info_types
+set srcfile ${testfile}.c
+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
+    return -1
+}
+
+# Force the language to Ada.  We used a C program because it was trivial
+# to get a typedef type, but the situation we are trying to reproduce is
+# when the Ada language is being used.
+gdb_test "set lang ada" ""
+
+set eol "\[\r\n\]+"
+
+gdb_test "info types new_integer_type" \
+         "All types matching regular expression \"new_integer_type\":${eol}File .*info_types.c:${eol}int"
+