* gdb.c++ testsuite 1.3: member_data_static.exp (resend)
@ 2002-05-27 6:28 Benjamin Kosnik
0 siblings, 0 replies; 13+ messages in thread
From: Benjamin Kosnik @ 2002-05-27 6:28 UTC (permalink / raw)
To: gdb-patches, mec
# Copyright 2002 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.
# Tests for member static data
# 2002-05-13 Benjamin Kosnik <bkoz@redhat.com>
# This file is part of the gdb testsuite
if $tracelevel then {
strace $tracelevel
}
if { [skip_cplus_tests] } { continue }
#
# test running programs
#
set prms_id 0
set bug_id 0
set testfile "member_data_static"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${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
}
# One.
send_gdb "break 62\n"
gdb_expect {
-re "Breakpoint \[0-9\]*.*line 62\\.\r\n$gdb_prompt $" {
pass "set break at 62"
}
-re ".*$gdb_prompt $" { fail "set break at 62" }
timeout { fail "(timeout) set break at 62" }
}
send_gdb "continue\n"
gdb_expect {
-re "Continuing\\.\r\n\r\nBreakpoint.*at.*member_data_static\\.cc:62\r\n.*$gdb_prompt $" {
pass "continue to 62"
}
-re ".*$gdb_prompt $" { fail "continue to 62" }
timeout { fail "(timeout) continue to 62" }
}
# simple object, static const bool
send_gdb "print test1.test\n"
gdb_expect {
-re "true\r\n$gdb_prompt $" {
pass "simple object, static const bool"
}
-re ".*$gdb_prompt $" { fail "simple object, static const bool" }
timeout { fail "simple object, static const bool" }
}
# simple object, static const int
send_gdb "print test1.key1\n"
gdb_expect {
-re "5\r\n$gdb_prompt $" {
pass "simple object, static const int"
}
-re ".*$gdb_prompt $" { fail "simple object, static const int" }
timeout { fail "simple object, static const int" }
}
# simple object, static long
send_gdb "print test1.key2\n"
gdb_expect {
-re "77\r\n$gdb_prompt $" {
pass "simple object, static long"
}
-re ".*$gdb_prompt $" { fail "simple object, static long" }
timeout { fail "simple object, static long" }
}
# simple object, static enum
send_gdb "print test1.value\n"
gdb_expect {
-re "oriental\r\n$gdb_prompt $" {
pass "simple object, static enum"
}
-re ".*$gdb_prompt $" { fail "simple object, static enum" }
timeout { fail "simple object, static enum" }
}
# Two.
send_gdb "break 63\n"
gdb_expect {
-re "Breakpoint \[0-9\]*.*line 63\\.\r\n$gdb_prompt $" {
pass "set break at 63"
}
-re ".*$gdb_prompt $" { fail "set break at 63" }
timeout { fail "(timeout) set break at 63" }
}
send_gdb "continue\n"
gdb_expect {
-re "Continuing\\.\r\n\r\nBreakpoint.*at.*member_data_static\\.cc:63\r\n.*$gdb_prompt $" {
pass "continue to 63"
}
-re ".*$gdb_prompt $" { fail "continue to 63" }
timeout { fail "(timeout) continue to 63" }
}
# derived template object, base static const bool
send_gdb "print test2.test\n"
gdb_expect {
-re "true\r\n$gdb_prompt $" {
pass "derived template object, base static const bool"
}
-re ".*$gdb_prompt $" { fail "derived template object, base static const bool" }
timeout { fail "derived template object, base static const bool" }
}
# derived template object, base static const int
send_gdb "print test2.key1\n"
gdb_expect {
-re "5\r\n$gdb_prompt $" {
pass "derived template object, base static const int"
}
-re ".*$gdb_prompt $" { fail "derived template object, base static const int" }
timeout { fail "derived template object, base static const int" }
}
# derived template object, base static long
send_gdb "print test2.key2\n"
gdb_expect {
-re "77\r\n$gdb_prompt $" {
pass "derived template object, base static long"
}
-re ".*$gdb_prompt $" { fail "derived template object, base static long" }
timeout { fail "derived template object, base static long" }
}
# derived template object, base static enum
send_gdb "print test2.value\n"
gdb_expect {
-re "oriental\r\n$gdb_prompt $" {
pass "derived template object, base static enum"
}
-re ".*$gdb_prompt $" { fail "derived template object, base static enum" }
timeout { fail "derived template object, base static enum" }
}
# derived template object, static enum
send_gdb "print test2.value_derived\n"
gdb_expect {
-re "etruscan\r\n$gdb_prompt $" {
pass "derived template object, static enum"
}
-re ".*$gdb_prompt $" { fail "derived template object, static enum" }
timeout { fail "derived template object, static enum" }
}
# Three.
send_gdb "break 64\n"
gdb_expect {
-re "Breakpoint \[0-9\]*.*line 64\\.\r\n$gdb_prompt $" {
pass "set break at 64"
}
-re ".*$gdb_prompt $" { fail "set break at 64" }
timeout { fail "(timeout) set break at 64" }
}
send_gdb "continue\n"
gdb_expect {
-re "Continuing\\.\r\n\r\nBreakpoint.*at.*member_data_static\\.cc:64\r\n.*$gdb_prompt $" {
pass "continue to 64"
}
-re ".*$gdb_prompt $" { fail "continue to 64" }
timeout { fail "(timeout) continue to 64" }
}
# template object, static derived template data member's base static const bool
send_gdb "print test3.data.test\n"
gdb_expect {
-re "true\r\n$gdb_prompt $" {
pass "template object, static const bool"
}
-re ".*$gdb_prompt $" { fail "template object, static const bool" }
timeout { fail "template object, static const bool" }
}
# template object, static derived template data member's base static const int
send_gdb "print test3.data.key1\n"
gdb_expect {
-re "5\r\n$gdb_prompt $" {
pass "template object, static const int"
}
-re ".*$gdb_prompt $" { fail "template object, static const int" }
timeout { fail "template object, static const int" }
}
# template object, static derived template data member's base static long
send_gdb "print test3.data.key2\n"
gdb_expect {
-re "77\r\n$gdb_prompt $" {
pass "template object, static long"
}
-re ".*$gdb_prompt $" { fail "template object, static long" }
timeout { fail "template object, static long" }
}
# template object, static derived template data member's base static enum
send_gdb "print test3.data.value\n"
gdb_expect {
-re "oriental\r\n$gdb_prompt $" {
pass "template object, static enum"
}
-re ".*$gdb_prompt $" { fail "template object, static enum" }
timeout { fail "template object, static enum" }
}
# template object, static derived template data member's static enum
send_gdb "print test3.data.value_derived\n"
gdb_expect {
-re "etruscan\r\n$gdb_prompt $" {
pass "template object, static enum"
}
-re ".*$gdb_prompt $" { fail "template object, static enum" }
timeout { fail "template object, static enum" }
}
gdb_exit
return 0
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: gdb.c++ testsuite 1.3: member_data_static.exp (resend)
@ 2002-05-27 16:02 Michael Elizabeth Chastain
2002-05-28 9:17 ` Benjamin Kosnik
0 siblings, 1 reply; 13+ messages in thread
From: Michael Elizabeth Chastain @ 2002-05-27 16:02 UTC (permalink / raw)
To: bkoz, gdb-patches
As usual, send_gdb/gdb_expect => gdb_test.
This test script has 6 FAILs in each configuration tested.
FAIL: gdb.c++/m-static.exp: derived template object, static enum
FAIL: gdb.c++/m-static.exp: template object, static const bool
FAIL: gdb.c++/m-static.exp: template object, static const int
FAIL: gdb.c++/m-static.exp: template object, static long
FAIL: gdb.c++/m-static.exp: template object, static enum
FAIL: gdb.c++/m-static.exp: template object, static enum
Something in the toolchain is optimizing away unused static objects.
When I run gdb by hand, I see this:
(gdb) print test2
$1 = {<gnu_obj_1> = {static test = true, static key1 = 5, static key2 = 77,
static value = oriental}, _vptr.gnu_obj_2 = 0x804e76c,
static value_derived = <optimized out>}
(gdb) print test3
$2 = {static data = <optimized out>}
This happens with both -gdwarf-2 and -gstabs+ on all gcc's and binutil's
in my test bed.
I fixed this by adding references to the data fields, like this:
refer(&test2.value_derived);
refer(&test3.data);
refer(&test3.data.value_derived);
I'm not going to commit these test files yet. Here are the files.
Can you let me know whether these are okay?
Michael C
===
// 2002-05-13
namespace __gnu_test
{
enum region { oriental, egyptian, greek, etruscan, roman };
// Test one.
class gnu_obj_1
{
protected:
typedef region antiquities;
static const bool test = true;
static const int key1 = 5;
static long key2;
static antiquities value;
public:
gnu_obj_1(antiquities a, long l) {}
};
const bool gnu_obj_1::test;
const int gnu_obj_1::key1;
long gnu_obj_1::key2 = 77;
gnu_obj_1::antiquities gnu_obj_1::value = oriental;
// Test two.
template<typename T>
class gnu_obj_2: public virtual gnu_obj_1
{
public:
static antiquities value_derived;
public:
gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7) { }
};
template<typename T>
typename gnu_obj_2<T>::antiquities gnu_obj_2<T>::value_derived = etruscan;
// Test three.
template<typename T>
class gnu_obj_3
{
public:
typedef region antiquities;
static gnu_obj_2<int> data;
public:
gnu_obj_3(antiquities b) { }
};
template<typename T>
gnu_obj_2<int> gnu_obj_3<T>::data(etruscan);
}
// gcc optimizes out unused template statics
void refer(const void *) { }
int main()
{
using namespace __gnu_test;
gnu_obj_1 test1(egyptian, 4589);
gnu_obj_2<long> test2(roman);
gnu_obj_3<long> test3(greek);
refer(&test2.value_derived);
refer(&test3.data);
refer(&test3.data.value_derived);
return 0;
}
===
# Copyright 2002 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.
# Tests for member static data
# 2002-05-13 Benjamin Kosnik <bkoz@redhat.com>
# This file is part of the gdb testsuite
if $tracelevel then {
strace $tracelevel
}
if { [skip_cplus_tests] } { continue }
#
# test running programs
#
set prms_id 0
set bug_id 0
set testfile "m-static"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${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
}
# One.
gdb_test "break 66" "Breakpoint \[0-9\]*.*line 66\\."
gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*m-static\\.cc:66\r\n.*" "continue to 66"
# simple object, static const bool
gdb_test "print test1.test" "\\$\[0-9\]* = true" "simple object, static const bool"
# simple object, static const int
gdb_test "print test1.key1" "\\$\[0-9\]* = 5" "simple object, static const int"
# simple object, static long
gdb_test "print test1.key2" "\\$\[0-9\]* = 77" "simple object, static long"
# simple object, static enum
gdb_test "print test1.value" "\\$\[0-9\]* = oriental" "simple object, static enum"
# Two.
gdb_test "break 67" "Breakpoint \[0-9\]*.*line 67\\."
gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*m-static\\.cc:67\r\n.*" "continue to 67"
# derived template object, base static const bool
gdb_test "print test2.test" "\\$\[0-9\]* = true" "derived template object, base static const bool"
# derived template object, base static const int
gdb_test "print test2.key1" "\\$\[0-9\]* = 5" "derived template object, base static const int"
# derived template object, base static long
gdb_test "print test2.key2" "\\$\[0-9\]* = 77" "derived template object, base static long"
# derived template object, base static enum
gdb_test "print test2.value" "\\$\[0-9\].* = oriental" "derived template object, base static enum"
# derived template object, static enum
gdb_test "print test2.value_derived" "\\$\[0-9\].* = etruscan" "derived template object, static enum"
# Three.
gdb_test "break 73" "Breakpoint \[0-9\]*.*line 73\\."
gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*m-static\\.cc:73\r\n.*" "continue to 73"
# template object, static derived template data member's base static const bool
gdb_test "print test3.data.test" "\\$\[0-9\].* = true" "template object, static const bool"
# template object, static derived template data member's base static const int
gdb_test "print test3.data.key1" "\\$\[0-9\].* = 5" "template object, static const int"
# template object, static derived template data member's base static long
gdb_test "print test3.data.key2" "\\$\[0-9\].* = 77" "template object, static long"
# template object, static derived template data member's base static enum
gdb_test "print test3.data.value" "\\$\[0-9\].* = oriental" "template object, static enum"
# template object, static derived template data member's static enum
gdb_test "print test3.data.value_derived" "\\$\[0-9\].* = etruscan" "template object, static derived enum"
gdb_exit
return 0
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: gdb.c++ testsuite 1.3: member_data_static.exp (resend)
2002-05-27 16:02 Michael Elizabeth Chastain
@ 2002-05-28 9:17 ` Benjamin Kosnik
2002-05-28 9:47 ` Daniel Jacobowitz
0 siblings, 1 reply; 13+ messages in thread
From: Benjamin Kosnik @ 2002-05-28 9:17 UTC (permalink / raw)
To: Michael Elizabeth Chastain; +Cc: gdb-patches
> This test script has 6 FAILs in each configuration tested.
>
> FAIL: gdb.c++/m-static.exp: derived template object, static enum
> FAIL: gdb.c++/m-static.exp: template object, static const bool
> FAIL: gdb.c++/m-static.exp: template object, static const int
> FAIL: gdb.c++/m-static.exp: template object, static long
> FAIL: gdb.c++/m-static.exp: template object, static enum
> FAIL: gdb.c++/m-static.exp: template object, static enum
That is what I get too.
> Something in the toolchain is optimizing away unused static objects.
Right. I need this to work as the testsuite is written please.
> static value_derived = <optimized out>}
>
> (gdb) print test3
> $2 = {static data = <optimized out>}
... which makes debugging C++ a pain in the ass, and the reason I sat
down and wrote this file. I consider gdb to be broken. Hopefully this
test case will facilitate a fix to the problem noted above.
> This happens with both -gdwarf-2 and -gstabs+ on all gcc's and
> binutil's in my test bed.
Me too.
> I fixed this by adding references to the data fields, like this:
>
> refer(&test2.value_derived);
> refer(&test3.data);
> refer(&test3.data.value_derived);
Errr. No, unless you expect everybody using gdb and C++ do to this as
well. In which case, you should put this in the FAQ.
Is there something I am missing?
-benjamin
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: gdb.c++ testsuite 1.3: member_data_static.exp (resend)
2002-05-28 9:17 ` Benjamin Kosnik
@ 2002-05-28 9:47 ` Daniel Jacobowitz
0 siblings, 0 replies; 13+ messages in thread
From: Daniel Jacobowitz @ 2002-05-28 9:47 UTC (permalink / raw)
To: Benjamin Kosnik; +Cc: Michael Elizabeth Chastain, gdb-patches
On Tue, May 28, 2002 at 09:03:31AM -0700, Benjamin Kosnik wrote:
>
> > This test script has 6 FAILs in each configuration tested.
> >
> > FAIL: gdb.c++/m-static.exp: derived template object, static enum
> > FAIL: gdb.c++/m-static.exp: template object, static const bool
> > FAIL: gdb.c++/m-static.exp: template object, static const int
> > FAIL: gdb.c++/m-static.exp: template object, static long
> > FAIL: gdb.c++/m-static.exp: template object, static enum
> > FAIL: gdb.c++/m-static.exp: template object, static enum
>
> That is what I get too.
>
> > Something in the toolchain is optimizing away unused static objects.
>
> Right. I need this to work as the testsuite is written please.
>
> > static value_derived = <optimized out>}
> >
> > (gdb) print test3
> > $2 = {static data = <optimized out>}
>
> ... which makes debugging C++ a pain in the ass, and the reason I sat
> down and wrote this file. I consider gdb to be broken. Hopefully this
> test case will facilitate a fix to the problem noted above.
>
> > This happens with both -gdwarf-2 and -gstabs+ on all gcc's and
> > binutil's in my test bed.
>
> Me too.
>
> > I fixed this by adding references to the data fields, like this:
> >
> > refer(&test2.value_derived);
> > refer(&test3.data);
> > refer(&test3.data.value_derived);
>
> Errr. No, unless you expect everybody using gdb and C++ do to this as
> well. In which case, you should put this in the FAQ.
>
> Is there something I am missing?
Is the data truly optimized out of the file? If it is, then
considering GDB to be broken doesn't help anything; the information
isn't there to work with. On the other hand, if it isn't and GDB is
not finding it, then that is a different problem and something worth
testing.
--
Daniel Jacobowitz Carnegie Mellon University
MontaVista Software Debian GNU/Linux Developer
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb.c++ testsuite 1.3: member_data_static.exp (resend)
@ 2002-05-28 15:26 Michael Elizabeth Chastain
2002-05-29 8:09 ` Benjamin Kosnik
0 siblings, 1 reply; 13+ messages in thread
From: Michael Elizabeth Chastain @ 2002-05-28 15:26 UTC (permalink / raw)
To: bkoz; +Cc: gdb-patches
Hi Benjamin,
mec> (gdb) print test3
mec> $2 = {static data = <optimized out>}
bk> ... which makes debugging C++ a pain in the ass, and the reason I sat
bk> down and wrote this file. I consider gdb to be broken. Hopefully this
bk> test case will facilitate a fix to the problem noted above.
As far as I can tell, gdb is reporting what's actually in the executable
file. 'test3' has one static member and no non-static members.
So perhaps gcc is broken, but I don't understand your view that
gdb is broken. Can you explain more? What do you *want* gdb to print
here?
> Errr. No, unless you expect everybody using gdb and C++ do to this as
> well. In which case, you should put this in the FAQ.
Okay, I'll forget about my 'refer' kludge. I thought that the 'refer'
kludge was working around a side issue, but optimizing away the static
data is the *main* issue for this test. So I should not work around it.
Michael C
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: gdb.c++ testsuite 1.3: member_data_static.exp (resend)
2002-05-28 15:26 Michael Elizabeth Chastain
@ 2002-05-29 8:09 ` Benjamin Kosnik
2002-05-29 8:19 ` Daniel Jacobowitz
0 siblings, 1 reply; 13+ messages in thread
From: Benjamin Kosnik @ 2002-05-29 8:09 UTC (permalink / raw)
To: Michael Elizabeth Chastain; +Cc: gdb-patches
> As far as I can tell, gdb is reporting what's actually in the
> executable file. 'test3' has one static member and no non-static
> members. So perhaps gcc is broken, but I don't understand your view
> that gdb is broken. Can you explain more? What do you *want* gdb to
> print here?
Perhaps it is a gcc error, I don't know.
I'd like
mec> (gdb) print test3
mec> $2 = {static data = <optimized out>}
to be
(gdb) print test3
$2 =
{<gnu_obj_2> = {static test = true, static key1 = 5, static key2 = 77,
static value = oriental}, _vptr.gnu_obj_2 = 0x8092efc,
static value_derived = etruscian }
I have
Alternatively, I'd like to be able to use explicit qualifications, to
look at static data members, like so:
(gdb) print gnu_obj_2<long>::antiquities;
$3 = etruscian
Seem reasonable?
-benjamin
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: gdb.c++ testsuite 1.3: member_data_static.exp (resend)
2002-05-29 8:09 ` Benjamin Kosnik
@ 2002-05-29 8:19 ` Daniel Jacobowitz
2002-05-29 8:34 ` B. Kosnik
0 siblings, 1 reply; 13+ messages in thread
From: Daniel Jacobowitz @ 2002-05-29 8:19 UTC (permalink / raw)
To: Benjamin Kosnik; +Cc: Michael Elizabeth Chastain, gdb-patches
On Wed, May 29, 2002 at 03:00:04AM -0700, Benjamin Kosnik wrote:
>
> > As far as I can tell, gdb is reporting what's actually in the
> > executable file. 'test3' has one static member and no non-static
> > members. So perhaps gcc is broken, but I don't understand your view
> > that gdb is broken. Can you explain more? What do you *want* gdb to
> > print here?
>
> Perhaps it is a gcc error, I don't know.
>
> I'd like
>
> mec> (gdb) print test3
> mec> $2 = {static data = <optimized out>}
>
> to be
>
> (gdb) print test3
> $2 =
> {<gnu_obj_2> = {static test = true, static key1 = 5, static key2 = 77,
> static value = oriental}, _vptr.gnu_obj_2 = 0x8092efc,
> static value_derived = etruscian }
>
> I have
>
>
> Alternatively, I'd like to be able to use explicit qualifications, to
> look at static data members, like so:
>
> (gdb) print gnu_obj_2<long>::antiquities;
> $3 = etruscian
>
> Seem reasonable?
Unfortunately, no.
Compile the testcase (just -c will do). Then run `nm' over the
symbols. Look for the `data' member; it isn't there. <optimized out>
is correct. My C++ lawyering is a little rusty, but I believe this is
correct; it's a templated member, and not explicitly instantiated, and
not even implicitly instantiated. I don't see a reason for it to be
emitted, and if it isn't emitted GDB can't help you figure out what its
value is.
--
Daniel Jacobowitz Carnegie Mellon University
MontaVista Software Debian GNU/Linux Developer
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: gdb.c++ testsuite 1.3: member_data_static.exp (resend)
2002-05-29 8:19 ` Daniel Jacobowitz
@ 2002-05-29 8:34 ` B. Kosnik
2002-05-29 9:39 ` Daniel Jacobowitz
0 siblings, 1 reply; 13+ messages in thread
From: B. Kosnik @ 2002-05-29 8:34 UTC (permalink / raw)
To: Daniel Jacobowitz; +Cc: mec, gdb-patches
> Compile the testcase (just -c will do). Then run `nm' over the
> symbols. Look for the `data' member; it isn't there. <optimized out>
> is correct. My C++ lawyering is a little rusty, but I believe this is
> correct; it's a templated member, and not explicitly instantiated, and
> not even implicitly instantiated. I don't see a reason for it to be
> emitted, and if it isn't emitted GDB can't help you figure out what
> its value is.
Aaah. You are correct.
Adding:
template class __gnu_test::gnu_obj_3<long>;
template class __gnu_test::gnu_obj_2<int>;
Gives:
(gdb) p test3
$1 = {static data = {<gnu_obj_1> = {static test = true, static key1 = 5,
static key2 = 77, static value = oriental}, _vptr.gnu_obj_2 =
0x8092fac,
static value_derived = etruscan}}
So, with this addition, this test case would pass, no?
-benjamin
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: gdb.c++ testsuite 1.3: member_data_static.exp (resend)
2002-05-29 8:34 ` B. Kosnik
@ 2002-05-29 9:39 ` Daniel Jacobowitz
2002-05-30 7:56 ` Benjamin Kosnik
0 siblings, 1 reply; 13+ messages in thread
From: Daniel Jacobowitz @ 2002-05-29 9:39 UTC (permalink / raw)
To: bkoz; +Cc: mec, gdb-patches
On Wed, May 29, 2002 at 08:19:30AM -0700, B. Kosnik wrote:
>
> > Compile the testcase (just -c will do). Then run `nm' over the
> > symbols. Look for the `data' member; it isn't there. <optimized out>
> > is correct. My C++ lawyering is a little rusty, but I believe this is
> > correct; it's a templated member, and not explicitly instantiated, and
> > not even implicitly instantiated. I don't see a reason for it to be
> > emitted, and if it isn't emitted GDB can't help you figure out what
> > its value is.
>
> Aaah. You are correct.
>
> Adding:
> template class __gnu_test::gnu_obj_3<long>;
> template class __gnu_test::gnu_obj_2<int>;
>
> Gives:
>
> (gdb) p test3
> $1 = {static data = {<gnu_obj_1> = {static test = true, static key1 = 5,
>
> static key2 = 77, static value = oriental}, _vptr.gnu_obj_2 =
> 0x8092fac,
> static value_derived = etruscan}}
>
> So, with this addition, this test case would pass, no?
Looks that way to me. That sounds like the right solution.
--
Daniel Jacobowitz Carnegie Mellon University
MontaVista Software Debian GNU/Linux Developer
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb.c++ testsuite 1.3: member_data_static.exp (resend)
@ 2002-05-29 8:34 Michael Elizabeth Chastain
0 siblings, 0 replies; 13+ messages in thread
From: Michael Elizabeth Chastain @ 2002-05-29 8:34 UTC (permalink / raw)
To: bkoz; +Cc: drow, gdb-patches
> template class __gnu_test::gnu_obj_3<long>;
> template class __gnu_test::gnu_obj_2<int>;
I'm happy with this. It's better than my "refer" kludge.
I'll try this out on the next iteration, which will be in a day or two
(my test bed is busy right now).
Michael C
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: gdb.c++ testsuite 1.3: member_data_static.exp (resend)
@ 2002-05-30 12:12 Michael Elizabeth Chastain
0 siblings, 0 replies; 13+ messages in thread
From: Michael Elizabeth Chastain @ 2002-05-30 12:12 UTC (permalink / raw)
To: bkoz; +Cc: drow, gdb-patches
Benjamin Kosnik writes:
> template class __gnu_test::gnu_obj_3<long>;
> template class __gnu_test::gnu_obj_2<int>;
This technique works for me in all tested configurations.
I added an instantiation for gnu_obj_2<long> as well.
I'm about to commit these files. Here is what I'm committing.
Michael C
=== m-static.cc
// 2002-05-13
namespace __gnu_test
{
enum region { oriental, egyptian, greek, etruscan, roman };
// Test one.
class gnu_obj_1
{
protected:
typedef region antiquities;
static const bool test = true;
static const int key1 = 5;
static long key2;
static antiquities value;
public:
gnu_obj_1(antiquities a, long l) {}
};
const bool gnu_obj_1::test;
const int gnu_obj_1::key1;
long gnu_obj_1::key2 = 77;
gnu_obj_1::antiquities gnu_obj_1::value = oriental;
// Test two.
template<typename T>
class gnu_obj_2: public virtual gnu_obj_1
{
public:
static antiquities value_derived;
public:
gnu_obj_2(antiquities b): gnu_obj_1(oriental, 7) { }
};
template<typename T>
typename gnu_obj_2<T>::antiquities gnu_obj_2<T>::value_derived = etruscan;
// Test three.
template<typename T>
class gnu_obj_3
{
public:
typedef region antiquities;
static gnu_obj_2<int> data;
public:
gnu_obj_3(antiquities b) { }
};
template<typename T>
gnu_obj_2<int> gnu_obj_3<T>::data(etruscan);
}
// instantiate templates explicitly so their static members will exist
template class __gnu_test::gnu_obj_2<int>;
template class __gnu_test::gnu_obj_2<long>;
template class __gnu_test::gnu_obj_3<long>;
int main()
{
using namespace __gnu_test;
gnu_obj_1 test1(egyptian, 4589);
gnu_obj_2<long> test2(roman);
gnu_obj_3<long> test3(greek);
return 0;
}
=== m-static.exp
# Copyright 2002 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.
# Tests for member static data
# 2002-05-13 Benjamin Kosnik <bkoz@redhat.com>
# This file is part of the gdb testsuite
if $tracelevel then {
strace $tracelevel
}
if { [skip_cplus_tests] } { continue }
#
# test running programs
#
set prms_id 0
set bug_id 0
set testfile "m-static"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${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
}
# One.
gdb_test "break 68" "Breakpoint \[0-9\]*.*line 68\\."
gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*m-static\\.cc:68\r\n.*" "continue to 68"
# simple object, static const bool
gdb_test "print test1.test" "\\$\[0-9\]* = true" "simple object, static const bool"
# simple object, static const int
gdb_test "print test1.key1" "\\$\[0-9\]* = 5" "simple object, static const int"
# simple object, static long
gdb_test "print test1.key2" "\\$\[0-9\]* = 77" "simple object, static long"
# simple object, static enum
gdb_test "print test1.value" "\\$\[0-9\]* = oriental" "simple object, static enum"
# Two.
gdb_test "break 69" "Breakpoint \[0-9\]*.*line 69\\."
gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*m-static\\.cc:69\r\n.*" "continue to 69"
# derived template object, base static const bool
gdb_test "print test2.test" "\\$\[0-9\]* = true" "derived template object, base static const bool"
# derived template object, base static const int
gdb_test "print test2.key1" "\\$\[0-9\]* = 5" "derived template object, base static const int"
# derived template object, base static long
gdb_test "print test2.key2" "\\$\[0-9\]* = 77" "derived template object, base static long"
# derived template object, base static enum
gdb_test "print test2.value" "\\$\[0-9\].* = oriental" "derived template object, base static enum"
# derived template object, static enum
gdb_test "print test2.value_derived" "\\$\[0-9\].* = etruscan" "derived template object, static enum"
# Three.
gdb_test "break 71" "Breakpoint \[0-9\]*.*line 71\\."
gdb_test "continue" "Continuing\\.\r\n\r\nBreakpoint.*at.*m-static\\.cc:71\r\n.*" "continue to 71"
# template object, static derived template data member's base static const bool
gdb_test "print test3.data.test" "\\$\[0-9\].* = true" "template object, static const bool"
# template object, static derived template data member's base static const int
gdb_test "print test3.data.key1" "\\$\[0-9\].* = 5" "template object, static const int"
# template object, static derived template data member's base static long
gdb_test "print test3.data.key2" "\\$\[0-9\].* = 77" "template object, static long"
# template object, static derived template data member's base static enum
gdb_test "print test3.data.value" "\\$\[0-9\].* = oriental" "template object, static enum"
# template object, static derived template data member's static enum
gdb_test "print test3.data.value_derived" "\\$\[0-9\].* = etruscan" "template object, static derived enum"
gdb_exit
return 0
^ permalink raw reply [flat|nested] 13+ messages in thread* Re: gdb.c++ testsuite 1.3: member_data_static.exp (resend)
@ 2002-05-30 12:29 Michael Elizabeth Chastain
0 siblings, 0 replies; 13+ messages in thread
From: Michael Elizabeth Chastain @ 2002-05-30 12:29 UTC (permalink / raw)
To: bkoz; +Cc: drow, gdb-patches
Committed.
All tests PASS in all configurations tested: native i686-pc-linux-gnu,
v2 and v3, dwarf-2 and stabs+, -g2 and -g3.
Thanks Benjamin for the new tests.
Michael C
2002-05-30 Michael Chastain <mec@shout.net>
From Benjamin Kosnik <bkoz@redhat.com>
* gdb.c++/m-static.cc: New file.
* gdb.c++/m-static.exp: New file.
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2002-05-30 19:12 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-05-27 6:28 gdb.c++ testsuite 1.3: member_data_static.exp (resend) Benjamin Kosnik
2002-05-27 16:02 Michael Elizabeth Chastain
2002-05-28 9:17 ` Benjamin Kosnik
2002-05-28 9:47 ` Daniel Jacobowitz
2002-05-28 15:26 Michael Elizabeth Chastain
2002-05-29 8:09 ` Benjamin Kosnik
2002-05-29 8:19 ` Daniel Jacobowitz
2002-05-29 8:34 ` B. Kosnik
2002-05-29 9:39 ` Daniel Jacobowitz
2002-05-30 7:56 ` Benjamin Kosnik
2002-05-29 8:34 Michael Elizabeth Chastain
2002-05-30 12:12 Michael Elizabeth Chastain
2002-05-30 12:29 Michael Elizabeth Chastain
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox