From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3698 invoked by alias); 2 Nov 2010 03:47:20 -0000 Received: (qmail 3690 invoked by uid 22791); 2 Nov 2010 03:47:19 -0000 X-SWARE-Spam-Status: No, hits=-0.2 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RCVD_IN_DNSWL_LOW,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.windriver.com (HELO mail.windriver.com) (147.11.1.11) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 02 Nov 2010 03:47:13 +0000 Received: from ALA-MAIL03.corp.ad.wrs.com (ala-mail03 [147.11.57.144]) by mail.windriver.com (8.14.3/8.14.3) with ESMTP id oA23lBw1014228 for ; Mon, 1 Nov 2010 20:47:11 -0700 (PDT) Received: from ala-mail06.corp.ad.wrs.com ([147.11.57.147]) by ALA-MAIL03.corp.ad.wrs.com with Microsoft SMTPSVC(6.0.3790.1830); Mon, 1 Nov 2010 20:47:11 -0700 Received: from [128.224.158.168] ([128.224.158.168]) by ala-mail06.corp.ad.wrs.com with Microsoft SMTPSVC(6.0.3790.1830); Mon, 1 Nov 2010 20:47:11 -0700 Message-ID: <4CCF89F0.5090100@windriver.com> Date: Tue, 02 Nov 2010 03:47:00 -0000 From: "Liu, Lei" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.15) Gecko/20101027 Thunderbird/3.0.10 MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: [PATCH] call cp_lookup_symbol_namespace recursively to search symbols in C++ base classes Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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: 2010-11/txt/msg00014.txt.bz2 Hi, This patch is trying to fix a bug in gdb. The problem is found in following C++ test case. #include class A { public: enum E {X,Y,Z}; }; class B : A { public: void test(E e); }; void B::test(E e) { if (e == X) { //b 14 if e==X printf("%d\n",e); } } int main() { B b; b.test(A::X); return 0; } Compiled by gcc-4.1.2 with -O0 -g. I tried to plant a conditional breakpoint in line 14 as shown in comment but got a error shows 'No symbol "X" in current context'. The symbol 'X' is accessible in that scope. The bug is that gdb did not look up enum constant symbols derived from base classes. My patch adds some code in cp_lookup_symbol_namespace to call itself recursively, so that to make gdb search symbols from all base classes. Is this patch OK? Thanks. Lei 2010-11-02 Lei Liu * cp-namespace.c (cp_lookup_symbol_namespace): Recursively call itself to search C++ base classes. --- gdb/cp-namespace.c | 27 +++++++++++++++++++++++++++ 1 files changed, 27 insertions(+), 0 deletions(-) diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 16f58ca..822423e 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -513,6 +513,8 @@ cp_lookup_symbol_namespace (const char *scope, const domain_enum domain) { struct symbol *sym; + struct symbol *scope_sym; + struct type *scope_type; /* First, try to find the symbol in the given namespace. */ sym = cp_lookup_symbol_in_namespace (scope, name, block, domain); @@ -530,6 +532,31 @@ cp_lookup_symbol_namespace (const char *scope, block = BLOCK_SUPERBLOCK (block); } + /* If scope is a C++ class, we need to search all its base classes. */ + if (scope == NULL || scope[0] == '\0') + return NULL; + + scope_sym = lookup_symbol (scope, NULL, VAR_DOMAIN, NULL); + if (scope_sym == NULL) + return NULL; + + scope_type = SYMBOL_TYPE(scope_sym); + if (scope_type == NULL) + return NULL; + + if (TYPE_CODE (scope_type) == TYPE_CODE_STRUCT) + { + int nbases = TYPE_N_BASECLASSES (scope_type); + int i; + for (i = 0; i < nbases; i++) + { + const char *base_name = TYPE_BASECLASS_NAME (scope_type, i); + sym = cp_lookup_symbol_namespace (base_name, name, block, domain); + if (sym != NULL) + return sym; + } + } + return NULL; }