# Copyright 2008-2021 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 { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \
	  {debug c++ additional_flags=-Wno-unused-comparison}] } {
    return -1
}

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

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

# Test global operator
gdb_test "p a == 1" "= 11" "global operator"
gdb_test "p a == 'a'" "= 12" "global operator overload"

# Test ADL operator
gdb_test "p bc == 1" "= 22" "ADL operator"
gdb_test "p bc == 'a'" "= 23" "ADL operator overload"
gdb_test "p B::BD::operator== (bc,'a')" "= 24" "fully qualified explicit operator call"

# Test operator imported from anonymous namespace
gdb_test "p d == 1" "= 33" "anonymous namespace operator"
gdb_test "p d == 'a'" "= 34" "anonymous namespace operator overload"
gdb_test "p d == 1.0f" "= 35" "anonymous namespace operator overload float"

# Test operator imported by using directive
gdb_test "p e == 1" "= 44" "imported operator"
gdb_test "p e == 'a'" "= 45" "imported operator overload"
gdb_test "p e == 1.0f" "= 46" "imported operator overload float"

# Test member operator
gdb_test "p g == 1" "= 55" "member operator"
gdb_test "p g == 'a'" "= 56" "member operator overload"

# Test that operators are not wrongly imported
# by import declarations and namespace aliases
gdb_test "p h == 1" "Cannot resolve function operator== to any overloaded instance" "namespace alias"
gdb_test "p j == 1" "Cannot resolve function operator== to any overloaded instance" "imported declaration"

# Test that indirectly imported operators work
gdb_test "p l == 1" "= 88"

# Test that we don't fall into an import loop
gdb_test {p x[0]} {No symbol "operator\[\]" in current context.}
