From 0d932b2f8eccc885b1bd4644c12c176b7c128046 Mon Sep 17 00:00:00 2001 From: Marc Khouzam Date: Fri, 26 Aug 2011 12:32:59 +0000 Subject: [PATCH] 2011-08-26 Marc Khouzam PR mi/11912 * varobj.c (cplus_describe_child): Add the keyword 'class' to the output of the method when dealing with a cast to a base class. 2011-08-26 Marc Khouzam PR mi/11912 * gdb.mi/mi-inheritance-syntax-error.cc: New file. * gdb.mi/mi-inheritance-syntax-error.exp: New file. * gdb.mi/mi-var-cp.cc: Updated for new 'class' keyword in output of -var-info-path-expression. --- gdb/ChangeLog | 7 ++ gdb/testsuite/ChangeLog | 8 ++ .../gdb.mi/mi-inheritance-syntax-error.cc | 29 ++++++++ .../gdb.mi/mi-inheritance-syntax-error.exp | 73 +++++++++++++++++++ gdb/testsuite/gdb.mi/mi-var-cp.cc | 6 +- gdb/varobj.c | 10 ++- 6 files changed, 128 insertions(+), 5 deletions(-) create mode 100644 gdb/testsuite/gdb.mi/mi-inheritance-syntax-error.cc create mode 100644 gdb/testsuite/gdb.mi/mi-inheritance-syntax-error.exp diff --git a/gdb/ChangeLog b/gdb/ChangeLog index aad31ec95ff..3a5b491b1e4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2011-08-26 Marc Khouzam + + PR mi/11912 + * varobj.c (cplus_describe_child): Add the keyword + 'class' to the output of the method when dealing + with a cast to a base class. + 2011-08-26 Jan Kratochvil No functionality change. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index bb152a850f0..82496a01df6 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-08-26 Marc Khouzam + + PR mi/11912 + * gdb.mi/mi-inheritance-syntax-error.cc: New file. + * gdb.mi/mi-inheritance-syntax-error.exp: New file. + * gdb.mi/mi-var-cp.cc: Updated for new 'class' + keyword in output of -var-info-path-expression. + 2011-08-26 Jan Kratochvil * gdb.trace/backtrace.exp: Use is_lp64_target to check 64bit target. diff --git a/gdb/testsuite/gdb.mi/mi-inheritance-syntax-error.cc b/gdb/testsuite/gdb.mi/mi-inheritance-syntax-error.cc new file mode 100644 index 00000000000..9cc0518e5d3 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-inheritance-syntax-error.cc @@ -0,0 +1,29 @@ +// Test for -var-info-path-expression syntax error +// caused by PR 11912 +#include +#include + +class A +{ + int a; +}; + +class C : public A +{ + public: + C() + { + }; + void testLocation() + { + z = 1; + }; + int z; +}; + +int main() +{ + C c; + c.testLocation(); + return 0; +} diff --git a/gdb/testsuite/gdb.mi/mi-inheritance-syntax-error.exp b/gdb/testsuite/gdb.mi/mi-inheritance-syntax-error.exp new file mode 100644 index 00000000000..e24019b6018 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-inheritance-syntax-error.exp @@ -0,0 +1,73 @@ +# 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 . + +if { [skip_cplus_tests] } { continue } + +load_lib mi-support.exp +set MIFLAGS "-i=mi" + +gdb_exit +if [mi_gdb_start] { + continue +} + +set testfile mi-inheritance-syntax-error +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++}] != ""} { + untested mi-inheritance-syntax-error.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=\".*\"" \ + "-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] +verbose "var-info-path-expression returned $cmd_output" 2 +verbose "Using $path for data-evaluate-expression" 2 + + +mi_gdb_test "-data-evaluate-expression \"$path\"" \ + "\\^done,value=\"\{a = \[0-9\]*\}\"" \ + "-data-evaluate-expression $path" + +mi_gdb_exit +return 0 diff --git a/gdb/testsuite/gdb.mi/mi-var-cp.cc b/gdb/testsuite/gdb.mi/mi-var-cp.cc index 0a552559544..54439e65be6 100644 --- a/gdb/testsuite/gdb.mi/mi-var-cp.cc +++ b/gdb/testsuite/gdb.mi/mi-var-cp.cc @@ -157,7 +157,7 @@ int path_expression () {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=\"\\(\\*\\(Base1\\*\\) dp\\)\"" \ + "\\^done,path_expr=\"\\(\\*\\(class Base1\\*\\) dp\\)\"" \ "-var-info-path-expression DP.Base1" mi_list_varobj_children DP.public { \ {DP.public.i i 0 int} \ @@ -172,7 +172,7 @@ int path_expression () {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=\"\\(\\(\\(\\*\\(Base1\\*\\) dp\\)\\).i\\)\"" \ + "\\^done,path_expr=\"\\(\\(\\(\\*\\(class Base1\\*\\) dp\\)\\).i\\)\"" \ "-var-info-path-expression DP.Base1.public.i" mi_gdb_test "-var-info-path-expression DP.public" \ @@ -185,7 +185,7 @@ int path_expression () {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=\"\\(\\(Base1\\) d\\)\"" \ + "\\^done,path_expr=\"\\(\\(class Base1\\) d\\)\"" \ "-var-info-path-expression D.Base1" :*/ int array[4] = {1,2,3}; diff --git a/gdb/varobj.c b/gdb/varobj.c index eadd62bda0b..7c68a93bb03 100644 --- a/gdb/varobj.c +++ b/gdb/varobj.c @@ -3443,8 +3443,14 @@ cplus_describe_child (struct varobj *parent, int index, will create an lvalue, for all appearences, so we don't need to use more fancy: *(Base1*)(&d) - construct. */ - *cfull_expression = xstrprintf ("(%s(%s%s) %s)", + 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. See PR mi/11912 */ + *cfull_expression = xstrprintf ("(%s(class %s%s) %s)", ptr, TYPE_FIELD_NAME (type, index), ptr, -- 2.30.2