From 9ce986499ee815d3adf734463ee6d7eda61a1c2f Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 15 Mar 2013 17:10:45 +0000 Subject: [PATCH] PR c++/15116: * gdbtypes.c (types_equal): Handle TYPE_CODE_FUNC. gdb/testsuite * gdb.cp/overload.cc (intintfunc): New. * gdb.cp/overload.exp: Add regression test. --- gdb/ChangeLog | 5 +++++ gdb/gdbtypes.c | 19 +++++++++++++++++++ gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.cp/overload.cc | 2 ++ gdb/testsuite/gdb.cp/overload.exp | 3 +++ 5 files changed, 34 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cf668375e2..07cb80d4d3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2013-03-15 Tom Tromey + + PR c++/15116: + * gdbtypes.c (types_equal): Handle TYPE_CODE_FUNC. + 2013-03-14 Tom Tromey * gdb_bfd.c (struct gdb_bfd_data) : diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 12730d7b12..a1c4018e69 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -2456,6 +2456,25 @@ types_equal (struct type *a, struct type *b) if (a == b) return 1; + /* Two function types are equal if their argument and return types + are equal. */ + if (TYPE_CODE (a) == TYPE_CODE_FUNC) + { + int i; + + if (TYPE_NFIELDS (a) != TYPE_NFIELDS (b)) + return 0; + + if (!types_equal (TYPE_TARGET_TYPE (a), TYPE_TARGET_TYPE (b))) + return 0; + + for (i = 0; i < TYPE_NFIELDS (a); ++i) + if (!types_equal (TYPE_FIELD_TYPE (a, i), TYPE_FIELD_TYPE (b, i))) + return 0; + + return 1; + } + return 0; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 2cf73451e8..9d0a7c473c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-03-15 Tom Tromey + + * gdb.cp/overload.cc (intintfunc): New. + * gdb.cp/overload.exp: Add regression test. + 2013-03-15 Yao Qi * gdb.threads/non-ldr-exc-1.exp (do_test): Fix the indent of diff --git a/gdb/testsuite/gdb.cp/overload.cc b/gdb/testsuite/gdb.cp/overload.cc index ba0678f496..5c782a4610 100644 --- a/gdb/testsuite/gdb.cp/overload.cc +++ b/gdb/testsuite/gdb.cp/overload.cc @@ -97,6 +97,8 @@ class D: C {}; int bar (A) { return 11; } int bar (B) { return 22; } +int intintfunc (int x) { return x; } + int main () { char arg2 = 2; diff --git a/gdb/testsuite/gdb.cp/overload.exp b/gdb/testsuite/gdb.cp/overload.exp index 3ebc6423e0..9d495167cd 100644 --- a/gdb/testsuite/gdb.cp/overload.exp +++ b/gdb/testsuite/gdb.cp/overload.exp @@ -139,6 +139,9 @@ gdb_test "print foo_instance3" "\\$\[0-9\]+ = \{ifoo = 222, ccpfoo = $hex \"A\"\ gdb_test "print foo_instance1.overloadargs(1)" "\\$\[0-9\]+ = 1" \ "print call overloaded func 1 arg" +# Regression test for overloading with function pointer type. +gdb_test "print foo_instance1.overloadfnarg(23, intintfunc)" " = 23" + # If GDB fails to restore the selected frame properly after the # inferior function call above (see GDB PR 1155 for an explanation of # why this might happen), all the subsequent tests will fail. We -- 2.34.1