From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30446 invoked by alias); 22 Nov 2012 07:32:41 -0000 Received: (qmail 30350 invoked by uid 22791); 22 Nov 2012 07:32:40 -0000 X-SWARE-Spam-Status: No, hits=-4.5 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,TW_PM X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 22 Nov 2012 07:32:36 +0000 Received: from svr-orw-fem-01.mgc.mentorg.com ([147.34.98.93]) by relay1.mentorg.com with esmtp id 1TbRH1-0001a1-Lp from Yao_Qi@mentor.com for gdb-patches@sourceware.org; Wed, 21 Nov 2012 23:32:35 -0800 Received: from SVR-ORW-FEM-02.mgc.mentorg.com ([147.34.96.206]) by svr-orw-fem-01.mgc.mentorg.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Wed, 21 Nov 2012 23:32:35 -0800 Received: from qiyao.dyndns.org.dyndns.org.dyndns.org (147.34.91.1) by svr-orw-fem-02.mgc.mentorg.com (147.34.96.168) with Microsoft SMTP Server id 14.1.289.1; Wed, 21 Nov 2012 23:32:34 -0800 From: Yao Qi To: Subject: [PATCH 1/4] testcase - pointer to member function Date: Thu, 22 Nov 2012 07:32:00 -0000 Message-ID: <1353569539-744-2-git-send-email-yao@codesourcery.com> In-Reply-To: <1353569539-744-1-git-send-email-yao@codesourcery.com> References: <1353569539-744-1-git-send-email-yao@codesourcery.com> MIME-Version: 1.0 Content-Type: text/plain X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-11/txt/msg00593.txt.bz2 Hi, The new test cases expose some problem in GDB on handling member pointers, and there are two fails shown below on current GDB trunk. print (diamond.*diamond_pfunc_ptr) (20)^M Non-pointer-to-member value used in pointer-to-member construct^M FAIL: gdb.cp/member-ptr.exp: print (diamond.*diamond_pfunc_ptr)(20) ptype (a.*pmf)(3)^M type = int (A * const, int)^M FAIL: gdb.cp/member-ptr.exp: ptype (a.*pmf)(3) The following patches will fix them. gdb/testsuite: 2012-11-22 Daniel Jacobowitz * gdb.cp/member-ptr.cc (class Diamond): Add func_ptr. (func): New function. (main): Initialize diamond.func_ptr and add diamond_pfunc_ptr. * gdb.cp/member-ptr.exp: Add new tests for ptype and for pointers to members with pointer-to-function type. --- gdb/testsuite/gdb.cp/member-ptr.cc | 17 +++++++++++++++++ gdb/testsuite/gdb.cp/member-ptr.exp | 28 ++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 0 deletions(-) diff --git a/gdb/testsuite/gdb.cp/member-ptr.cc b/gdb/testsuite/gdb.cp/member-ptr.cc index 17f022c..6cb87ef 100644 --- a/gdb/testsuite/gdb.cp/member-ptr.cc +++ b/gdb/testsuite/gdb.cp/member-ptr.cc @@ -137,6 +137,7 @@ class Diamond : public Padding, public Left, public Right { public: virtual int vget_base (); + int (*func_ptr) (int); }; int Diamond::vget_base () @@ -144,6 +145,12 @@ int Diamond::vget_base () return this->Left::x + 2000; } +int +func (int x) +{ + return 19 + x; +} + int main () { A a; @@ -161,6 +168,7 @@ int main () int (Diamond::*right_vpmf) (); int (Base::*base_vpmf) (); int Diamond::*diamond_pmi; + int (* Diamond::*diamond_pfunc_ptr) (int); PMI null_pmi; PMF null_pmf; @@ -178,6 +186,7 @@ int main () diamond.Left::x = 77; diamond.Right::x = 88; + diamond.func_ptr = func; /* Some valid pointer to members from a base class. */ left_pmf = (int (Diamond::*) ()) (int (Left::*) ()) (&Base::get_x); @@ -192,11 +201,19 @@ int main () /* A pointer to data member from a base class. */ diamond_pmi = (int Diamond::*) (int Left::*) &Base::x; + /* A pointer to data member, where the member is itself a pointer to + a function. */ + diamond_pfunc_ptr = (int (* Diamond::*) (int)) &Diamond::func_ptr; + null_pmi = NULL; null_pmf = NULL; pmi = NULL; /* Breakpoint 1 here. */ + // Invalid (uses diamond_pfunc_ptr as a function): + // diamond.*diamond_pfunc_ptr (20); + (diamond.*diamond_pfunc_ptr) (20); + k = (a.*pmf)(3); pmi = &A::jj; diff --git a/gdb/testsuite/gdb.cp/member-ptr.exp b/gdb/testsuite/gdb.cp/member-ptr.exp index f569ca9..ae2b8b4 100644 --- a/gdb/testsuite/gdb.cp/member-ptr.exp +++ b/gdb/testsuite/gdb.cp/member-ptr.exp @@ -376,6 +376,33 @@ gdb_test_multiple "print ((int) pmi) == ((char *) &a.j - (char *) & a)" $name { } } +# Check pointers to data members, which are themselves pointers to +# functions. These behave like data members, not like pointers to +# member functions. + +gdb_test "ptype diamond_pfunc_ptr" \ + "type = int \\(\\*Diamond::\\*\\)\\(int\\)" + +gdb_test "ptype diamond.*diamond_pfunc_ptr" \ + "type = int \\(\\*\\)\\(int\\)" + +# This one is invalid; () binds more tightly than .*, so it tries to +# call the member pointer as a normal pointer-to-function. + +gdb_test "print diamond.*diamond_pfunc_ptr (20)" \ + "Invalid data type for function to be called." + +# With parentheses, it is valid. + +gdb_test "print (diamond.*diamond_pfunc_ptr) (20)" \ + "$vhn = 39" + +# Make sure that we do not interpret this as either a member pointer +# call or a member function call. + +gdb_test "print diamond.func_ptr (20)" \ + "$vhn = 39" + # ========================== # pointer to member function # ========================== @@ -595,6 +622,7 @@ gdb_test_multiple "print (a.*pmf)(3)" $name { } gdb_test "ptype a.*pmf" "type = int \\(A \\*( const)?, int\\)" +gdb_test "ptype (a.*pmf)(3)" "type = int" # Print out a pointer to data member which requires looking into # a base class. -- 1.7.7.6