From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21734 invoked by alias); 5 Aug 2011 13:55:11 -0000 Received: (qmail 21725 invoked by uid 22791); 5 Aug 2011 13:55:09 -0000 X-SWARE-Spam-Status: No, hits=-1.5 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from imr4.ericy.com (HELO imr4.ericy.com) (198.24.6.9) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 05 Aug 2011 13:54:54 +0000 Received: from eusaamw0706.eamcs.ericsson.se ([147.117.20.31]) by imr4.ericy.com (8.14.3/8.14.3/Debian-9.1ubuntu1) with ESMTP id p75DsUG9023770 for ; Fri, 5 Aug 2011 08:54:53 -0500 Received: from EUSAACMS0703.eamcs.ericsson.se ([169.254.1.253]) by eusaamw0706.eamcs.ericsson.se ([147.117.20.31]) with mapi; Fri, 5 Aug 2011 09:54:46 -0400 From: Marc Khouzam To: "'gdb-patches@sourceware.org'" Date: Fri, 05 Aug 2011 13:55:00 -0000 Subject: [patch] Tweak output of -var-info-path-expression Message-ID: Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 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: 2011-08/txt/msg00108.txt.bz2 Hi, I'd like to re-submit a workaround I posted about a year ago, but never followed through with. Full explanation can be found here (with session showing the problem): http://sourceware.org/ml/gdb-patches/2010-09/msg00204.html Basically, because of Bug 11912 "C++ name lookup fails" using the result of -var-info-path-expression can=20 sometimes cause a syntax error. Trying to work around it in Eclipse worries me as we'd have to create the result of -var-info-path-expression ourselves in many more cases than just the faulty ones. Tom was leaning towards this proposed workaround but=20 suggested a test. (http://sourceware.org/ml/gdb-patches/2010-09/msg00234.html) So, here is the patch with a test. The test fails with=20 the current HEAD (gets the syntax error) and succeeds with the patch applied. I've also had to update other tests to match the change. The actual change is one line but it is not=20 restricted to MI as the change is in varobj.c. No regressions (checked with the gdb.sum file :-)). Thanks Marc 2011-08-05 Marc Khouzam * varobj.c (cplus_describe_child): Add the keyword 'class' to the output of the method when dealing=20 with a cast to a base class. 2011-08-05 Marc Khouzam * gdb.mi/gdb11912.cc: New file. * gdb.mi/gdb11912.exp: New file. * gdb.mi/mi-var-cp.cc: Updated for new 'class' keyword in output of -var-info-path-expression. ### Eclipse Workspace Patch 1.0 #P src Index: gdb/testsuite/gdb.mi/gdb11912.cc =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: gdb/testsuite/gdb.mi/gdb11912.cc diff -N gdb/testsuite/gdb.mi/gdb11912.cc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb/testsuite/gdb.mi/gdb11912.cc 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,27 @@ +#include +#include + +class A +{ + int a; +}; + +class C : public A +{ + public: + C() + { + }; + void testLocation() + { + z =3D 1; + }; + int z; +}; + +int main() +{ + C c; + c.testLocation(); + return 0; +} Index: gdb/testsuite/gdb.mi/gdb11912.exp =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: gdb/testsuite/gdb.mi/gdb11912.exp diff -N gdb/testsuite/gdb.mi/gdb11912.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb/testsuite/gdb.mi/gdb11912.exp 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,78 @@ +# Copyright 2011 +# 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 . + +# +# test gdb/11912 +# + +if { [skip_cplus_tests] } { continue } + +load_lib mi-support.exp +set MIFLAGS "-i=3Dmi" + +gdb_exit +if [mi_gdb_start] { + continue +} + +set testfile gdb11912 +set srcfile "$testfile.cc" +set binfile $objdir/$subdir/$testfile + +if [get_compiler_info ${binfile} "c++"] { + return -1; +} + +if {[gdb_compile $srcdir/$subdir/$srcfile $binfile executable {debug c++}]= !=3D ""} { + untested gdb11912.exp + return -1 +} + +# Test that children of derived classes are given the proper +# path by -var-info-path-expression + +mi_gdb_load ${binfile} +mi_runto C::testLocation + +mi_create_varobj "var1" "this" "create var for THIS" + +mi_list_varobj_children "var1" { + {var1.A A 1 A} + {var1.public public 1} +} "list children of THIS" + +# We don't care what the result of -var-info-path-expression +# as long as it can be used in the -data-evaluate-expression +# that follows +mi_gdb_test "-var-info-path-expression var1.A" \ + "\\^done,path_expr=3D\".*\"" \ + "-var-info-path-expression var1.A" + +# Extract the result of the -var-info-path-expression command +# to use it in -data-evaluate-expression +set cmd_output $expect_out(2,string) +set path [lindex [split $cmd_output "\""] 1] +if $verbose>1 then { + send_user "var-info-path-expression returned $cmd_output\n" + send_user "Using $path for data-evaluate-expression\n" +} + +mi_gdb_test "-data-evaluate-expression \"$path\"" \ + "\\^done,value=3D\"\{a =3D \[0-9\]*\}\"" \ + "-data-evaluate-expression $path" + +mi_gdb_exit +return 0 Index: gdb/testsuite/gdb.mi/mi-var-cp.cc =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-var-cp.cc,v retrieving revision 1.13 diff -u -r1.13 mi-var-cp.cc --- gdb/testsuite/gdb.mi/mi-var-cp.cc 1 Jan 2011 15:33:47 -0000 1.13 +++ gdb/testsuite/gdb.mi/mi-var-cp.cc 5 Aug 2011 13:42:06 -0000 @@ -157,7 +157,7 @@ {DP.Base2 Base2 1 Base2} \ {DP.public public 1}} "list children of DP" mi_gdb_test "-var-info-path-expression DP.Base1" \ - "\\^done,path_expr=3D\"\\(\\*\\(Base1\\*\\) dp\\)\"" \ + "\\^done,path_expr=3D\"\\(\\*\\(class Base1\\*\\) dp\\)\"" \ "-var-info-path-expression DP.Base1"=20=20=20=20=20=20=20 mi_list_varobj_children DP.public { \ {DP.public.i i 0 int} \ @@ -172,7 +172,7 @@ {DP.Base1.public.i i 0 int} \ } "list children of DP.Base1.public" mi_gdb_test "-var-info-path-expression DP.Base1.public.i" \ - "\\^done,path_expr=3D\"\\(\\(\\(\\*\\(Base1\\*\\) dp\\)\\).i\\)\= "" \ + "\\^done,path_expr=3D\"\\(\\(\\(\\*\\(class Base1\\*\\) dp\\)\\)= .i\\)\"" \ "-var-info-path-expression DP.Base1.public.i" =20 mi_gdb_test "-var-info-path-expression DP.public" \ @@ -185,7 +185,7 @@ {D.Base2 Base2 1 Base2} \ {D.public public 1}} "list children of D" mi_gdb_test "-var-info-path-expression D.Base1" \ - "\\^done,path_expr=3D\"\\(\\(Base1\\) d\\)\"" \ + "\\^done,path_expr=3D\"\\(\\(class Base1\\) d\\)\"" \ "-var-info-path-expression D.Base1" :*/ int array[4] =3D {1,2,3}; Index: gdb/varobj.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/src/src/gdb/varobj.c,v retrieving revision 1.181 diff -u -r1.181 varobj.c --- gdb/varobj.c 28 Jul 2011 10:36:40 -0000 1.181 +++ gdb/varobj.c 5 Aug 2011 13:42:06 -0000 @@ -3443,8 +3443,14 @@ will create an lvalue, for all appearences, so we don't need to use more fancy: *(Base1*)(&d) - construct. */ - *cfull_expression =3D xstrprintf ("(%s(%s%s) %s)",=20 + construct. + + When we are in the scope of the base class or of one + of its children, the type field name will be interpreted + as a constructor, if it exists. Therefore, we must + indicate that the name is a class name by using the + 'class' keyword. */ + *cfull_expression =3D xstrprintf ("(%s(class %s%s) %s)", ptr,=20 TYPE_FIELD_NAME (type, index), ptr,