# Copyright 2008, 2010 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 testfile nsusing
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
}

if [get_compiler_info ${binfile}] {
    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 that names are not printed when they
# are not imported

gdb_breakpoint marker3
gdb_continue_to_breakpoint "marker3"

#send_gdb "break marker3\n"
#send_gdb "continue\n"

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

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


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

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

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"


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

############################################
# test printing of namespace imported into
# file scope.


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

gdb_test "print cc" "= 3"

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


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

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

gdb_test "print B::_a" "= 1"

gdb_test "print _a" "No symbol \"_a\" in current context." \
    "print _a in namespace alias scope"

gdb_test "print x" "No symbol \"x\" in current context." \
    "print x in namespace alias scope"

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


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

if {![runto marker3]} {
    perror "couldn't run to breakpoint marker3"
}

# gcc-4-3 puts import statements for aliases in
# the global scope instead of the corresponding
# function scope. These wrong import statements throw
# this test off. This is fixed in gcc-4-4.
if [test_compiler_info gcc-4-3-*] then { setup_xfail *-*-* }

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

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

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

gdb_test "print dx" "= 4"

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

if ![runto marker5] then {
    perror "couldn't run to marker5"
    continue
}

gdb_test "print efx" "= 5"

############################################
# Test printing of variables imported from
# nested namespaces

if ![runto I::marker7] then {
    perror "couldn't run to breakpoint I::marker7"
    continue
}

gdb_test "print ghx" "= 6"

############################################
# Test that variables are not printed in a namespace
# that is sibling to the namespace containing an import

if ![runto L::marker8] then {
    perror "couldn't run to breakpoint L::marker8"
    continue
}

gdb_test "print jx" "= 44"

gdb_breakpoint "K::marker9"
gdb_continue_to_breakpoint "K::marker9"

gdb_test "print jx" "No symbol \"jx\" in current context."

############################################
# Test that variables are only printed after the line
# containing the import

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

gdb_breakpoint [gdb_get_line_number "marker10 stop"]
gdb_continue_to_breakpoint "marker10 stop"

if { [test_compiler_info {gcc-[0-3]-*}] ||
     [test_compiler_info {gcc-4-[0-3]-*}]} {
    setup_xfail *-*-* 
}

# Assert that M::x is printed and not N::x
gdb_test "print x" "= 911" "print x (from M::x)"
