# Copyright 2008 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/>.

if $tracelevel then {
    strace $tracelevel
}

set prms_id 0
set bug_id 0

set testfile namespace-using
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
    untested "Couldn't compile test program"
    return -1
}

# Get things started.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

############################################
# test printing of namespace imported within
# the function.

if ![runto_main] then {
    perror "couldn't run to breakpoint main"
    continue
}

gdb_test "print _a" "= 1"

############################################
# test printing of namespace imported into 
# a scope containing the pc.

gdb_breakpoint [gdb_get_line_number "marker1 stop"]
gdb_continue_to_breakpoint "marker1 stop"

gdb_test "print _a" "= 1" "print _a in a nested scope"

############################################
# Test printing of namespace aliases

setup_kfail "gdb/7935" "*-*-*"
if ![runto marker2] then {
    perror "couldn't run to breakpoint marker2"
    continue
}

gdb_test "print B::a" "= 1"

############################################
# Test that names are not printed when they 
# are not imported

gdb_breakpoint "marker3"
gdb_continue_to_breakpoint "marker3"

gdb_test "print _a" "No symbol \"_a\" in current context." "Print a without import"

############################################
# Test printing of individually imported elements

setup_kfail "gdb/7936" "*-*-*"
if ![runto marker4] then {
    perror "couldn't run to breakpoint marker4"
    continue
}

gdb_test "print x" "= 2"
