1# Copyright 2003, 2004 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 2 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program; if not, write to the Free Software 15# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 16 17# This file is part of the gdb testsuite. 18 19# This contains tests for GDB's use of RTTI information. This stems 20# from a bug reported in PR gdb/488 and other places, which leads to 21# statements like 'warning: can't find class named 'C::D', as given by 22# C++ RTTI'. It arises from GDB not knowing about classes that are 23# defined in namespaces. 24 25# NOTE: carlton/2003-05-16: I suspect it could arise from nested class 26# issues, too, and even once we fix that, there might be situations 27# (involving templates, in particular) where this problem triggers 28# because GDB and GCC have different ideas what a class is called. 29 30if $tracelevel then { 31 strace $tracelevel 32 } 33 34if { [skip_cplus_tests] } { continue } 35 36# 37# test running programs 38# 39set prms_id 0 40set bug_id 0 41 42set testfile "rtti" 43set srcfile1 "${testfile}1.cc" 44set objfile1 "${testfile}1.o" 45set srcfile2 "${testfile}2.cc" 46set objfile2 "${testfile}2.o" 47set binfile "${objdir}/${subdir}/${testfile}" 48 49if { [gdb_compile "$srcdir/$subdir/$srcfile1" "$objdir/$subdir/$objfile1" object {debug c++}] != "" } { 50 gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." 51} 52 53if { [gdb_compile "$srcdir/$subdir/$srcfile2" "$objdir/$subdir/$objfile2" object {debug c++}] != "" } { 54 gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." 55} 56 57if { [gdb_compile "$objdir/$subdir/$objfile1 $objdir/$subdir/$objfile2" "${binfile}" executable {debug c++}] != "" } { 58 gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." 59} 60 61if [get_compiler_info ${binfile} "c++"] { 62 return -1 63} 64 65gdb_exit 66gdb_start 67gdb_reinitialize_dir $srcdir/$subdir 68gdb_load ${binfile} 69 70 71if ![runto_main] then { 72 perror "couldn't run to breakpoint" 73 continue 74} 75 76# First, run to after we've constructed the object: 77 78gdb_breakpoint [gdb_get_line_number "main-constructs-done" "$srcfile1"] 79gdb_continue_to_breakpoint "end of constructors in main" 80 81gdb_test_multiple "print *e1" "print *e1" { 82 -re "warning: RTTI symbol not found for class 'n1::D1'.*$gdb_prompt $" { 83 # gdb HEAD 2003-12-05 84 kfail "gdb/488" "print *e1" 85 } 86 -re "warning: can't find class named `n1::D1', as given by C\\+\\+ RTTI.*$gdb_prompt $" { 87 # gdb 6.0 88 kfail "gdb/488" "print *e1" 89 } 90 -re "\\$\[0-9\]* = {<n1::Base1> = .*}\r\n$gdb_prompt $" { 91 pass "print *e1" 92 } 93 -re "\\$\[0-9\]* = {<Base1> = .*}\r\n$gdb_prompt $" { 94 # NOTE: carlton/2003-05-16: If code is compiled by GCC2, we 95 # don't print the warning (for no particular reason), but we 96 # still call the class via the wrong name; PR gdb/57 is our 97 # catch-all PR for nested type problems. 98 kfail "gdb/57" "print *e1" 99 } 100} 101 102# NOTE: carlton/2004-01-14: This test with an "<incomplete type>" 103# message because, within rtt1.cc, GDB has no way of knowing that the 104# class is called 'n2::D2' instead of just 'D2'. This is an artifical 105# test case, though: if we were using these classes in a more 106# substantial way, G++ would emit more debug info. As is, I don't 107# think there's anything that GDB can do about this case until G++ 108# starts emitting DW_TAG_namespace info; this should arrive with GCC 109# 3.4. 110 111gdb_test_multiple "print *e2" "print *e2" { 112 -re "warning: RTTI symbol not found for class 'n2::D2'.*$gdb_prompt $" { 113 # gdb HEAD 2003-12-05 114 kfail "gdb/488" "print *e2" 115 } 116 -re "warning: can't find class named `n2::D2', as given by C\\+\\+ RTTI.*$gdb_prompt $" { 117 # gdb 6.0 118 kfail "gdb/488" "print *e2" 119 } 120 -re "\\$\[0-9\]* = <incomplete type>\r\n$gdb_prompt $" { 121 kfail "gdb/1511" "print *e2" 122 } 123 -re "\\$\[0-9\]* = {<n2::Base2> = .*}\r\n$gdb_prompt $" { 124 pass "print *e2" 125 } 126 -re "\\$\[0-9\]* = {<Base2> = .*}\r\n$gdb_prompt $" { 127 kfail "gdb/57" "print *e2" 128 } 129} 130 131# Now we test the hack that's been implemented to get around some 132# instances of PR gdb/1511. 133 134gdb_breakpoint [gdb_get_line_number "func-constructs-done" "$srcfile1"] 135gdb_continue_to_breakpoint "end of constructors in func" 136 137gdb_test "print *obj" "\\$\[0-9\]* = {<n2::Base2> = .*}" 138 139gdb_breakpoint [gdb_get_line_number "func3-constructs-done" "$srcfile1"] 140gdb_continue_to_breakpoint "end of constructors in func3" 141 142gdb_test "print *obj3" "\\$\[0-9\]* = {<n2::C2> = .*}" 143 144gdb_exit 145return 0 146