# Copyright 2008, 2011 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 koenig
set srcfile ${testfile}.cc
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} {debug c++}] } {
     return -1
}

############################################

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

# Test that koenig lookup finds correct function
gdb_test "p first(c)" "= 11"

# Change the number of parameters and position of
# the qualifying parameter
gdb_test "p second(0,0,c,0,0)" "= 33"

# Test the name "entry" being used for `variablename@entry' entry values.
gdb_test "p entry (c)" " = 44"

# Test that koenig lookup finds correct function
# even if it is overloaded
gdb_test "p first(0,c)" "= 22"

# Test that koenig lookup finds correct function
# when the argument is an expression
gdb_test "p first(b.c)" "= 11"

# test that resolutions can be made across namespaces
gdb_test "p foo(eo)"         "= 1"
gdb_test "p foo(eo, eo)"     "= 2"
gdb_test "p foo(eo, eo, 1)"  "= 3"
gdb_test "p foo(fo, eo)"     "= 4"
gdb_test "p foo(1 ,fo, eo)"  "= 5"
gdb_test "p foo(go, fo, eo)" "= 6"

#test that gdb fails gracefully
gdb_test "p fake(eo)" "No symbol \"fake\" in current context."
gdb_test "p foo (fake)" "No symbol \"fake\" in current context."

#test that namespaces of base classes are searched
gdb_test "p foo(io)" "= 7"
gdb_test "p foo(ix)" "Cannot resolve function foo to any overloaded instance"

#test for other types
gdb_test "p foo(ju)" "= 8"
gdb_test "p foo(js)" "= 9"
gdb_test "p foo(je)" "= 10"

#test for class members
setup_xfail "*-*-*"
gdb_test "p foo(jab)" "= 11"

gdb_test "p foo(jap)" "= 12"
gdb_test "p foo(japp)" "= 13"
gdb_test "p foo(jca)" "= 14"

#test overload resolution
gdb_test "p foo(ko,1)" "= 15"
gdb_test "p foo(ko,1.0f)" "= 16"
setup_xfail "*-*-*"
gdb_test "p bar(ko,1)" "= -1"

#test lookup of objects belonging to nested namespaces
gdb_test "p foo(labo)" "= 17"

#test koenig found function do not compete with qualified
#names
gdb_test "p ma.foo('a')" "= 18"
gdb_test "p foo(ma,'a')" "= 19"
gdb_test "p M::N::foo(ma,'a')" "= 20"
gdb_test "p M::FAKE::foo(ma,'a')" "No type \"FAKE\" within class or namespace \"M\"."
gdb_test "p M::N::fake(ma,'a')" "No symbol \"fake\" in namespace \"M::N\"."

gdb_test "p M::bar('a')" "= 21"
gdb_test "p M::N::bar('a')" "= 22"

#test that lookup supports typedef
gdb_test "p foo(ttoa, 'a')" "= 23"

#test that lookup is not thwarted by anonymous types
gdb_test "p foo (p_union)" \
  "Cannot resolve function foo to any overloaded instance"

# test lookup of namespace user-defined operators
# and overload resolution:

# within class
gdb_test "p q == 5" "= 24"
gdb_test "p q == 5.0f" "= 25"

# within namespace
gdb_test "p q != 5" "= 27"
gdb_test "p q != 5.0f" "= 28"

# across namespace and class
gdb_test "p q + 5.0f" "= 26"
gdb_test "p q + 5" "= 29"

# some unary operators for good measure
# Cannot resolve function operator++ to any overloaded instance
gdb_test "p ++q" "= 30"

# Test that koening lookup does not affect
# member variable lookup.
gdb_test "p r.rfoo()" "= 31"

# Do the same from inside class R.
gdb_breakpoint [gdb_get_line_number "marker1"]
gdb_continue_to_breakpoint "marker1"

gdb_test "p rfoo()" "= 31"
gdb_test "p this->rfoo()" "= 31"
