summaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.ada
diff options
context:
space:
mode:
authorPierre-Marie de Rodat <derodat@adacore.com>2015-09-03 17:34:58 +0200
committerPierre-Marie de Rodat <derodat@adacore.com>2015-12-07 13:32:43 +0100
commitd72413e64a3444868e72e315ba2ceaf5a9d2bf6f (patch)
tree694d66bcd4e6f944f1a3f1948c101d0f7d3c5e89 /gdb/testsuite/gdb.ada
parent1b36b65787bcb905fb6a2c7b790b07dcaacbe1cb (diff)
downloadbinutils-gdb-d72413e64a3444868e72e315ba2ceaf5a9d2bf6f.tar.gz
Enhance the menu to select function overloads with signatures
So far, trying to evaluate an expression involving a function call for which GDB could find multiple function candidates outputs a menu so that the user can select the one to run. For instance, with the two following functions: type New_Integer is new Integer; function F (I : Integer) return Boolean; function F (I : New_Integer) return Boolean; Then we get the following GDB session: (gdb) print f(1) Multiple matches for f [0] cancel [1] foo.f at foo.adb:23 [2] foo.f at foo.adb.28 > While the source location information is sufficient in order to determine which one to select, one has to look for them in source files, which is not convenient. This commit tunes this menu in order to also include the list of formal and return types (if any) in each entry. The above then becomes: (gdb) print f(1) Multiple matches for f [0] cancel [1] foo.f (integer) return boolean at foo.adb:23 [2] foo.f (foo.new_integer) return boolean at foo.adb.28 > Since this output is more verbose than previously, this change also introduces an option (set/show ada print-signatures) to get the original output. gdb/ChangeLog: * ada-lang.c (print_signatures): New. (ada_print_symbol_signature): New. (user_select_syms): Add signatures to the output of candidate symbols using ada_print_symbol_signature. (_initialize_ada_language): Add a "set/show ada print-signatures" boolean option. gdb/testsuite/ChangeLog: * gdb.ada/fun_overload_menu.exp: New testcase. * gdb.ada/fun_overload_menu/foo.adb: New testcase. Tested on x86_64-linux, no regression.
Diffstat (limited to 'gdb/testsuite/gdb.ada')
-rw-r--r--gdb/testsuite/gdb.ada/fun_overload_menu.exp71
-rw-r--r--gdb/testsuite/gdb.ada/fun_overload_menu/foo.adb47
2 files changed, 118 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.ada/fun_overload_menu.exp b/gdb/testsuite/gdb.ada/fun_overload_menu.exp
new file mode 100644
index 00000000000..5a1c37a8294
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/fun_overload_menu.exp
@@ -0,0 +1,71 @@
+# Copyright 2015 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/>.
+
+load_lib "ada.exp"
+
+standard_ada_testfile foo
+
+if {[gdb_compile_ada "$srcfile" "$binfile" executable [list debug]] != "" } {
+ return -1
+}
+
+clean_restart ${testfile}
+
+set bp_location [gdb_get_line_number "BREAK" ${testdir}/foo.adb]
+runto "foo.adb:$bp_location"
+
+
+proc test_menu {expr function menu_entries selection output} {
+ set menu [multi_line "Multiple matches for $function" \
+ "\\\[0\\\] cancel" \
+ "$menu_entries" \
+ "> $"]
+ set test_name "multiple matches for $function ($expr)"
+ gdb_test_multiple "print $expr" "$test_name" \
+ {
+ -re "$menu" {
+ pass "$test_name"
+ }
+ default {
+ fail "$test_name"
+ }
+ }
+ gdb_test "$selection" "$output"
+}
+
+
+# Check that function signatures in overload menus are displayed as expected.
+
+# 1. Test with overloaded functions
+test_menu "f (1, null)" "f" \
+ [multi_line \
+ "\\\[1\\\] foo\.f \\(integer; foo\.integer_access\\) return boolean at .*foo.adb:.*" \
+ "\\\[2\\\] foo\.f \\(foo\.new_integer; foo\.integer_access\\) return boolean at .*foo.adb:.*"] \
+ "1" "= true"
+
+# 2. Test with overloaded procedures
+test_menu "p (1, null)" "p" \
+ [multi_line \
+ "\\\[1\\\] foo\.p \\(integer; foo\.integer_access\\) at .*foo.adb:.*" \
+ "\\\[2\\\] foo\.p \\(foo\.new_integer; foo\.integer_access\\) at .*foo.adb:.*" ] \
+ "1" "= (void)"
+
+# 3. Test with signatures disabled
+gdb_test "set ada print-signatures off" ""
+test_menu "f (1, null)" "f" \
+ [multi_line \
+ "\\\[1\\\] foo\.f at .*foo.adb:.*" \
+ "\\\[2\\\] foo\.f at .*foo.adb:.*"] \
+ "1" "= true"
diff --git a/gdb/testsuite/gdb.ada/fun_overload_menu/foo.adb b/gdb/testsuite/gdb.ada/fun_overload_menu/foo.adb
new file mode 100644
index 00000000000..75009ae40c5
--- /dev/null
+++ b/gdb/testsuite/gdb.ada/fun_overload_menu/foo.adb
@@ -0,0 +1,47 @@
+-- Copyright 2015 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/>.
+
+procedure Foo is
+
+ type New_Integer is new Integer;
+ type Integer_Access is access Integer;
+
+ function F (I : Integer; A : Integer_Access) return Boolean is
+ begin
+ return True;
+ end F;
+
+ function F (I : New_Integer; A : Integer_Access) return Boolean is
+ begin
+ return False;
+ end F;
+
+ procedure P (I : Integer; A : Integer_Access) is
+ begin
+ null;
+ end P;
+
+ procedure P (I : New_Integer; A : Integer_Access) is
+ begin
+ null;
+ end P;
+
+ B1 : constant Boolean := F (Integer'(1), null); -- BREAK
+ B2 : constant Boolean := F (New_Integer'(2), null);
+
+begin
+ P (Integer'(3), null);
+ P (New_Integer'(4), null);
+end Foo;