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


standard_testfile .cc

if [get_compiler_info] {
    return -1
}

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

############################################
# 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
if [using_clang] { setup_kfail "gdb/15502" *-*-* }
gdb_test "print x" "= 911" "print x (from M::x)"
