This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] new tests gdb.c++/rtti.exp


This file adds some tests about the "can't find class named XXX, as
given by C++ RTTI" warning mentioned in PR gdb/488.  The warning is
basically a symptom of our bad support for nested types, but it's
idiosyncratic enough that it seems to me to deserve its own tests.
And I couldn't find a good file to put them in, so I put it in its own
file; maybe we could eventually add other RTTI-related tests to it.

This warning is only printed by the GCC v3 reader, not by the GCC v2
reader; in the v2 case, though, we still call the base class by the
wrong name.  This falls under the general "GDB doesn't know about
nested types" problem, which we're kfailing wrt PR gdb/57.

There are two tests here.  The first just demonstrates the basic
problem.  The second behaves like the first on mainline; on my branch,
though, it has an additional problem that, because the test is split
between two files, the compiler doesn't generate enough debug info for
us to get this right at all.

Tested on GCC 2.95.3 and GCC 3.1 with default debug info (stabs+ and
DWARF 2, respectively), on i686-pc-linux-gnu.  I'm planning to commit
this next week (probably Monday) if nobody objects.

David Carlton
carlton@bactrian.org

2003-05-16  David Carlton  <carlton@bactrian.org>

	* gdb.c++/rtti.exp: New file, containing tests for PR c++/488.
	* gdb.c++/rtti.h, gdb.c++/rtti1.cc, gdb.c++/rtti2.cc: Ditto.

--- /dev/null	2002-08-30 16:31:37.000000000 -0700
+++ gdb.c++/rtti.exp	2003-05-16 11:33:25.000000000 -0700
@@ -0,0 +1,116 @@
+# Copyright 2003 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 2 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+# This file is part of the gdb testsuite.
+
+# This contains tests for GDB's use of RTTI information.  This stems
+# from a bug reported in PR gdb/488 and other places, which leads to
+# statements like 'warning: can't find class named 'C::D', as given by
+# C++ RTTI.  It arises from GDB not knowing about classes that are
+# defined in namespaces.
+
+# NOTE: carlton/2003-05-02: I suspect it could arise from nested class
+# issues, too, and even once we fix that, there might be situations
+# (involving templates, in particular) where this problem triggers
+# because GDB and GCC have different ideas what a class is called.
+
+if $tracelevel then {
+        strace $tracelevel
+        }
+
+if { [skip_cplus_tests] } { continue }
+
+#
+# test running programs
+#
+set prms_id 0
+set bug_id 0
+
+set testfile "rtti"
+set srcfile1 "${srcdir}/${subdir}/${testfile}1.cc"
+set objfile1 "${objdir}/${subdir}/${testfile}1.o"
+set srcfile2 "${srcdir}/${subdir}/${testfile}2.cc"
+set objfile2 "${objdir}/${subdir}/${testfile}2.o"
+set binfile ${objdir}/${subdir}/${testfile}
+
+# gdb_get_line_number needs this to be called srcfile.
+set srcfile "${srcfile1}"
+
+if  { [gdb_compile "${srcfile1}" "${objfile1}" object {debug c++}] != "" } {
+     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+}
+
+if  { [gdb_compile "${srcfile2}" "${objfile2}" object {debug c++}] != "" } {
+     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+}
+
+if  { [gdb_compile "${objfile1} ${objfile2}" "${binfile}" executable {debug c++}] != "" } {
+     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+}
+
+if [get_compiler_info ${binfile} "c++"] {
+    return -1
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+
+if ![runto_main] then {
+    perror "couldn't run to breakpoint"
+    continue
+}
+
+# First, run to after we've constructed the object:
+
+gdb_breakpoint [gdb_get_line_number "constructs-done"]
+gdb_continue_to_breakpoint "end of constructors"
+
+gdb_test_multiple "print *e1" "print *e1" {
+    -re "warning: can't find class named `n1::D1', as given by C\\+\\+ RTTI.*$gdb_prompt $" {
+	kfail "gdb/488" "print *e1"
+    }
+    -re "\\$\[0-9\]* = {<n1::Base1> = .*}\r\n$gdb_prompt $" {
+	pass "print *e1"
+    }
+}
+
+# NOTE: carlton/2003-05-16: This test fails on my branch with an
+# "<incomplete type>" message because, within rtt1.cc, GDB has no way
+# of knowing that the class is called 'n2::D2' instead of just 'D2'.
+# This is an artifical test case, though: if we were using these
+# classes in a more substantial way, G++ would emit more debug info.
+# As is, there's nothing that GDB can do about it; when that part of
+# the branch gets merged in, then we'll probably want to convert that
+# fail branch to an xfail.
+
+gdb_test_multiple "print *e2" "print *e2" {
+    -re "warning: can't find class named `n2::D2', as given by C\\+\\+ RTTI.*$gdb_prompt $" {
+	kfail "gdb/488" "print *e2"
+    }
+    -re "\\$\[0-9\]* = <incomplete type>\r\n$gdb_prompt $" {
+	# See above NOTE.
+	fail "print *e2"
+    }
+    -re "\\$\[0-9\]* = {<n2::Base2> = .*}\r\n$gdb_prompt $" {
+	pass "print *e2"
+    }
+}
+
+gdb_exit
+return 0
--- /dev/null	2002-08-30 16:31:37.000000000 -0700
+++ gdb.c++/rtti.h	2003-05-16 11:28:57.000000000 -0700
@@ -0,0 +1,48 @@
+/* Code to go along with tests in rtti.exp.
+   
+   Copyright 2003 Free Software Foundation, Inc.
+
+   Contributed by David Carlton <carlton@bactrian.org> and by Kealia,
+   Inc.
+
+   This file is part of GDB.
+
+   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 2 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, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+namespace n2 {
+
+  class C2;
+
+  class Base2 {
+  public:
+    virtual ~Base2() { }
+  };
+
+
+  class C2: public Base2 {
+  public:
+  };
+
+  class D2 : public C2{
+  public:
+    D2(C2 *, C2 *);
+    
+    C2* expr_1_;
+    C2* expr_2_;
+  };
+
+  extern C2 *create2();
+}
--- /dev/null	2002-08-30 16:31:37.000000000 -0700
+++ gdb.c++/rtti1.cc	2003-05-16 11:28:56.000000000 -0700
@@ -0,0 +1,67 @@
+/* Code to go along with tests in rtti.exp.
+   
+   Copyright 2003 Free Software Foundation, Inc.
+
+   Contributed by David Carlton <carlton@bactrian.org> and by Kealia,
+   Inc.
+
+   This file is part of GDB.
+
+   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 2 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, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include "rtti.h"
+
+namespace n1 {
+
+  class C1;
+
+  class Base1 {
+  public:
+    virtual ~Base1() { }
+  };
+
+
+  class C1: public Base1 {
+  public:
+  };
+
+  class D1 : public C1{
+  public:
+    D1(C1 *, C1 *);
+    
+    C1* expr_1_;
+    C1* expr_2_;
+  };
+  
+  D1::D1(C1 *expr_1, C1 *expr_2)
+    : expr_1_(expr_1), expr_2_(expr_2) { }
+
+  C1 *create1() {
+    return new D1(0, 0);
+  }
+
+} // n1
+
+int main()
+{
+    using namespace n1;
+    using namespace n2;
+
+    C1 *e1 = create1();
+    C2 *e2 = create2();
+
+    return 0;				// constructs-done
+}
--- /dev/null	2002-08-30 16:31:37.000000000 -0700
+++ gdb.c++/rtti2.cc	2003-05-16 11:28:57.000000000 -0700
@@ -0,0 +1,36 @@
+/* Code to go along with tests in rtti.exp.
+   
+   Copyright 2003 Free Software Foundation, Inc.
+
+   Contributed by David Carlton <carlton@bactrian.org> and by Kealia,
+   Inc.
+
+   This file is part of GDB.
+
+   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 2 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, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include "rtti.h"
+
+namespace n2 {
+  
+  D2::D2(C2 *expr_1, C2 *expr_2)
+    : expr_1_(expr_1), expr_2_(expr_2) { }
+
+  C2 *create2() {
+    return new D2(0, 0);
+  }
+
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]