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


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)"
