# Copyright 2003-2004, 2007-2012 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 <http://www.gnu.org/licenses/>.

# 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-16: 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 { [skip_cplus_tests] } { continue }

#
# test running programs
#

standard_testfile rtti1.cc rtti2.cc

if [get_compiler_info "c++"] {
    return -1
}

if {[prepare_for_testing $testfile.exp $testfile \
	 [list $srcfile $srcfile2] {debug c++}]} {
    return -1
}

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 "main-constructs-done" "$srcfile"]
gdb_continue_to_breakpoint "end of constructors in main"

gdb_test_multiple "print *e1" "print *e1" {
    -re "warning: RTTI symbol not found for class 'n1::D1'.*$gdb_prompt $" {
	# gdb HEAD 2003-12-05
	kfail "gdb/488" "print *e1"
    }
    -re "warning: can't find class named `n1::D1', as given by C\\+\\+ RTTI.*$gdb_prompt $" {
	# gdb 6.0
	kfail "gdb/488" "print *e1"
    }
    -re "\\$\[0-9\]* = {<n1::Base1> = .*}\r\n$gdb_prompt $" {
	pass "print *e1"
    }
    -re "\\$\[0-9\]* = {<Base1> = .*}\r\n$gdb_prompt $" {
	# NOTE: carlton/2003-05-16: If code is compiled by GCC2, we
	# don't print the warning (for no particular reason), but we
	# still call the class via the wrong name; PR gdb/57 is our
	# catch-all PR for nested type problems.
	kfail "gdb/57" "print *e1"
    }
}

# NOTE: carlton/2004-01-14: This test 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, I don't
# think there's anything that GDB can do about this case until G++
# starts emitting DW_TAG_namespace info; this should arrive with GCC
# 3.4.

gdb_test_multiple "print *e2" "print *e2" {
    -re "warning: RTTI symbol not found for class 'n2::D2'.*$gdb_prompt $" {
	# gdb HEAD 2003-12-05
	kfail "gdb/488" "print *e2"
    }
    -re "warning: can't find class named `n2::D2', as given by C\\+\\+ RTTI.*$gdb_prompt $" {
	# gdb 6.0
	kfail "gdb/488" "print *e2"
    }
    -re "\\$\[0-9\]* = <incomplete type>\r\n$gdb_prompt $" {
	kfail "gdb/1511" "print *e2"
    }
    -re "\\$\[0-9\]* = {<n2::Base2> = .*}\r\n$gdb_prompt $" {
	pass "print *e2"
    }
    -re "\\$\[0-9\]* = {<Base2> = .*}\r\n$gdb_prompt $" {
	kfail "gdb/57" "print *e2"
    }
}

# Now we test the hack that's been implemented to get around some
# instances of PR gdb/1511.

gdb_breakpoint [gdb_get_line_number "func-constructs-done" "$srcfile"]
gdb_continue_to_breakpoint "end of constructors in func"

gdb_test "print *obj" "\\$\[0-9\]* = {<n2::Base2> = .*}"

gdb_breakpoint [gdb_get_line_number "func3-constructs-done" "$srcfile"]
gdb_continue_to_breakpoint "end of constructors in func3"

gdb_test "print *obj3" "\\$\[0-9\]* = {<n2::C2> = .*}"

gdb_exit
return 0
