From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13446 invoked by alias); 3 Feb 2009 01:02:01 -0000 Received: (qmail 13247 invoked by uid 22791); 3 Feb 2009 01:02:00 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL,BAYES_00,HK_OBFDOM,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mx2.redhat.com (HELO mx2.redhat.com) (66.187.237.31) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 03 Feb 2009 01:01:54 +0000 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n130xpRB011245; Mon, 2 Feb 2009 19:59:51 -0500 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n130xnQ1030501; Mon, 2 Feb 2009 19:59:50 -0500 Received: from opsy.redhat.com (vpn-12-182.rdu.redhat.com [10.11.12.182]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n130xnfl012930; Mon, 2 Feb 2009 19:59:49 -0500 Received: by opsy.redhat.com (Postfix, from userid 500) id 75BA35080FB; Mon, 2 Feb 2009 17:59:47 -0700 (MST) To: Pedro Alves Cc: gdb-patches@sourceware.org Subject: Re: RFA: fix PR gdb/2489 References: <200810212324.38183.pedro@codesourcery.com> From: Tom Tromey Reply-To: Tom Tromey Date: Tue, 03 Feb 2009 01:02:00 -0000 In-Reply-To: <200810212324.38183.pedro@codesourcery.com> (Pedro Alves's message of "Tue\, 21 Oct 2008 23\:24\:37 +0100") Message-ID: User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 2009-02/txt/msg00045.txt.bz2 >>>>> "Pedro" == Pedro Alves writes: Finally getting back to this old patch... Tom> This patch fixes PR gdb/2489. Tom> The bug is that field name completion does not consider methods. Tom> + for (i = TYPE_NFN_FIELDS (type) - 1; i >=0; --i) Pedro> ^ missing space Fixed. Pedro> + for (i = TYPE_NFN_FIELDS (type) - 1; i >=0; --i) Pedro> + { Pedro> + char *name = TYPE_FN_FIELDLIST_NAME (type, i); Pedro> + if (name && ! strncmp (name, fieldname, namelen)) Pedro> + { Pedro> + if (!type_name) Pedro> + type_name = type_name_no_tag (type); Pedro> + /* Omit constructors from the completion list. */ Pedro> + if (strcmp (type_name, name)) Pedro> + { Pedro> Can type_name ever be NULL here then? The reason for the check here is that we compute type_name the first time we need it. It is initialized to NULL, but only set once. Tom> +# Please email any bugs, comments, and/or additions to this file to: Tom> +# bug-gdb@prep.ai.mit.edu Pedro> Please remove this bit. Whoops, fixed. Tom> + untested completion.exp Pedro> s/completions.exp/cpcompletion.exp/ Thanks -- fixed. Pedro> (I wish we had a function we could call that abstracted and Pedro> made easier to write/read these completion tests.) I rewrote the tests to use the "complete" command rather than sending a TAB. This makes them much simpler. Pedro> What do you think about extending the test a little bit? Pedro> I think it would be nice to have, Pedro> Plain inheritance testing that the base class methods are completed. [...] Pedro> Inheritance + masking, something like: [...] Pedro> Anonymous struct with method, [...] Pedro> Also, would it make sense to add a test that made sure the Pedro> ctors aren't completed? I added these, thanks for the suggestions. I've appended the final patch. I am checking this in. Tom 2009-02-02 Tom Tromey PR gdb/2489: * completer.c (count_struct_fields): Count method names. (add_struct_fields): Add matching method names. 2009-02-02 Tom Tromey * gdb.cp/Makefile.in (EXECUTABLES): Add pr2489. * gdb.cp/pr2489.cc: New file. * gdb.cp/cpcompletion.exp: New file. Index: completer.c =================================================================== RCS file: /cvs/src/src/gdb/completer.c,v retrieving revision 1.30 diff -u -r1.30 completer.c --- completer.c 3 Jan 2009 05:57:51 -0000 1.30 +++ completer.c 3 Feb 2009 00:56:41 -0000 @@ -339,7 +339,7 @@ } /* Helper for expression_completer which recursively counts the number - of named fields in a structure or union type. */ + of named fields and methods in a structure or union type. */ static int count_struct_fields (struct type *type) { @@ -353,17 +353,25 @@ else if (TYPE_FIELD_NAME (type, i)) ++result; } + + for (i = TYPE_NFN_FIELDS (type) - 1; i >= 0; --i) + { + if (TYPE_FN_FIELDLIST_NAME (type, i)) + ++result; + } + return result; } -/* Helper for expression_completer which recursively adds field names - from TYPE, a struct or union type, to the array OUTPUT. This - function assumes that OUTPUT is correctly-sized. */ +/* Helper for expression_completer which recursively adds field and + method names from TYPE, a struct or union type, to the array + OUTPUT. This function assumes that OUTPUT is correctly-sized. */ static void add_struct_fields (struct type *type, int *nextp, char **output, char *fieldname, int namelen) { int i; + char *type_name = NULL; CHECK_TYPEDEF (type); for (i = 0; i < TYPE_NFIELDS (type); ++i) @@ -378,6 +386,22 @@ ++*nextp; } } + + for (i = TYPE_NFN_FIELDS (type) - 1; i >= 0; --i) + { + char *name = TYPE_FN_FIELDLIST_NAME (type, i); + if (name && ! strncmp (name, fieldname, namelen)) + { + if (!type_name) + type_name = type_name_no_tag (type); + /* Omit constructors from the completion list. */ + if (strcmp (type_name, name)) + { + output[*nextp] = xstrdup (name); + ++*nextp; + } + } + } } /* Complete on expressions. Often this means completing on symbol Index: testsuite/gdb.cp/Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.cp/Makefile.in,v retrieving revision 1.3 diff -u -r1.3 Makefile.in --- testsuite/gdb.cp/Makefile.in 28 Mar 2007 00:32:41 -0000 1.3 +++ testsuite/gdb.cp/Makefile.in 3 Feb 2009 00:56:43 -0000 @@ -4,7 +4,7 @@ EXECUTABLES = ambiguous annota2 anon-union cplusfuncs cttiadd \ derivation inherit local member-ptr method misc \ overload ovldbreak ref-typ ref-typ2 templates userdef virtfunc namespace \ - ref-types ref-params method2 + ref-types ref-params method2 pr2489 all info install-info dvi install uninstall installcheck check: @echo "Nothing to be done for $@..." Index: testsuite/gdb.cp/cpcompletion.exp =================================================================== RCS file: testsuite/gdb.cp/cpcompletion.exp diff -N testsuite/gdb.cp/cpcompletion.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ testsuite/gdb.cp/cpcompletion.exp 3 Feb 2009 00:56:43 -0000 @@ -0,0 +1,72 @@ +# Copyright 2009 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 . + +# This file is part of the gdb testsuite. + +if $tracelevel then { + strace $tracelevel +} + +if { [skip_cplus_tests] } { continue } + +set testfile pr2489 +set binfile ${objdir}/${subdir}/${testfile} + +if {[gdb_compile "${srcdir}/${subdir}/${testfile}.cc" "${testfile}.o" object {c++ debug}] != ""} { + untested cpcompletion.exp + return -1 +} + +if {[gdb_compile "${testfile}.o" ${binfile} executable {c++ debug}] != "" } { + untested cpcompletion.exp + return -1 +} + +gdb_exit + +# Don't let a .inputrc file or an existing setting of INPUTRC mess up +# the test results. Even if /dev/null doesn't exist on the particular +# platform, the readline library will use the default setting just by +# failing to open the file. OTOH, opening /dev/null successfully will +# also result in the default settings being used since nothing will be +# read from this file. +global env +if [info exists env(INPUTRC)] { + set old_inputrc $env(INPUTRC) +} +set env(INPUTRC) "/dev/null" + +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +set bp_location [gdb_get_line_number "Set breakpoint here" ${testfile}.cc] + +if {![runto $bp_location]} { + perror "test suppressed" +} + +# This also tests inheritance -- completion should only see a single +# "get_foo". +gdb_test "complete p foo1.g" "p foo1\\.get_foo" + +# Test inheritance without overriding. +gdb_test "complete p foo1.base" "p foo1\\.base_function_only" + +# Test non-completion of constructor names. +gdb_test "complete p foo1.Fo" "p foo1\\.Foofoo" + +# Test completion with an anonymous struct. +gdb_test "complete p a.g" "p a\\.get" Index: testsuite/gdb.cp/pr2489.cc =================================================================== RCS file: testsuite/gdb.cp/pr2489.cc diff -N testsuite/gdb.cp/pr2489.cc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ testsuite/gdb.cp/pr2489.cc 3 Feb 2009 00:56:43 -0000 @@ -0,0 +1,51 @@ + +class Base +{ +public: + virtual int get_foo () { return 1; } + int base_function_only () { return 2; } +}; + +class Foo : public Base +{ + +private: + int foo_value; + +public: + Foo () { foo_value = 0;} + Foo (int i) { foo_value = i;} + ~Foo () { } + void set_foo (int value); + int get_foo (); + + // Something similar to a constructor name. + void Foofoo (); + + bool operator== (const Foo &other) { return foo_value == other.foo_value; } +}; + +void Foo::set_foo (int value) +{ + foo_value = value; +} + +int Foo::get_foo () +{ + return foo_value; +} + +void Foo::Foofoo () +{ +} + +int main () +{ + // Anonymous struct with method. + struct { + int get() { return 5; } + } a; + Foo foo1; + foo1.set_foo (42); // Set breakpoint here. + return 0; +}