gdb
authorTom Tromey <tromey@redhat.com>
Mon, 2 Feb 2009 21:50:13 +0000 (21:50 +0000)
committerTom Tromey <tromey@redhat.com>
Mon, 2 Feb 2009 21:50:13 +0000 (21:50 +0000)
PR exp/9059:
* valops.c (find_overload_match): Follow typedefs before taking
address of object argument.
gdb/testsuite
PR exp/9059:
* gdb.cp/call-c.exp: Add regression test.
* gdb.cp/call-c.cc (FooHandle): New typedef.
(main): New variable 'handle'.

gdb/ChangeLog
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.cp/call-c.cc
gdb/testsuite/gdb.cp/call-c.exp
gdb/valops.c

index 416b389..53059c5 100644 (file)
@@ -1,3 +1,9 @@
+2009-02-02  Tom Tromey  <tromey@redhat.com>
+
+       PR exp/9059:
+       * valops.c (find_overload_match): Follow typedefs before taking
+       address of object argument.
+
 2009-02-01  Doug Evans  <dje@google.com>
 
        * target.h (target_waitstatus_to_string): Declare.
index 3b3735c..55f2d0e 100644 (file)
@@ -1,3 +1,10 @@
+2009-02-02  Tom Tromey  <tromey@redhat.com>
+
+       PR exp/9059:
+       * gdb.cp/call-c.exp: Add regression test.
+       * gdb.cp/call-c.cc (FooHandle): New typedef.
+       (main): New variable 'handle'.
+
 2009-01-30  Vladimir Prus  <vladimir@codesourcery.com>
 
        * lib/mi-support.exp (et_mi_thread_list)
index 1c54b89..cc90993 100644 (file)
@@ -28,11 +28,14 @@ struct Foo {
   int x_;
 };
 
+typedef Foo *FooHandle;
+
 int main()
 {
     Foo f;
     Foo *pf = &f;
     Foo* &rf = pf;
+    FooHandle handle = pf;
     rf->func(); /* set breakpoint here */
     return func(0);
 }
index cb3b945..a80f4dd 100644 (file)
@@ -49,3 +49,6 @@ gdb_test "b [gdb_get_line_number {breakpoint here} ${testfile}.cc ]" \
 gdb_test "print foo(1)" "\\\$$decimal = 1"
 gdb_test "continue" ".*breakpoint here.*" "continue to bp"
 gdb_test "print rf->func()" "\\\$$decimal = 1"
+
+# Regression test for method call via a typedef.
+gdb_test "print handle->func()" "\\\$$decimal = 1"
index 1c724d3..09be6dd 100644 (file)
@@ -2173,9 +2173,11 @@ find_overload_match (struct type **arg_types, int nargs,
 
   if (objp)
     {
-      if (TYPE_CODE (value_type (temp)) != TYPE_CODE_PTR
-         && (TYPE_CODE (value_type (*objp)) == TYPE_CODE_PTR
-             || TYPE_CODE (value_type (*objp)) == TYPE_CODE_REF))
+      struct type *temp_type = check_typedef (value_type (temp));
+      struct type *obj_type = check_typedef (value_type (*objp));
+      if (TYPE_CODE (temp_type) != TYPE_CODE_PTR
+         && (TYPE_CODE (obj_type) == TYPE_CODE_PTR
+             || TYPE_CODE (obj_type) == TYPE_CODE_REF))
        {
          temp = value_addr (temp);
        }