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

# This file is part of the gdb testsuite

if {[skip_cplus_tests]} { continue }

standard_testfile .cc

if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug c++}]} {
    return -1
}

if {![runto_main]} {
    return -1
}

gdb_breakpoint [gdb_get_line_number "Break here"]
gdb_continue_to_breakpoint "Break here"

gdb_test "p a.geta()" ".* = 12345" "a.geta()"
gdb_test "p a_ptr->geta()" ".* = 12345" "a_ptr->geta()"

gdb_test "p false ? a.geta() : 123" ".* = 123" "ternop 1"
gdb_test "p false ? a_ptr->geta() : 123" ".* = 123" "ternop 2"
gdb_test "p (true ? 123 : a.geta()) + 123" ".* = 246" "ternop 3"
gdb_test "p (true ? 123 : a_ptr->geta()) + 123" ".* = 246" "ternop 4"
gdb_test "p false ? (a.*m1)() : 123" ".* = 123" "ternop 5"
gdb_test "p false ? (a_ptr->*m1)() : 123" ".* = 123" "ternop 6"
gdb_test "p (true ? 123 : (a.*m1)()) + 123" ".* = 246" "ternop 7"
gdb_test "p (true ? 123 : (a_ptr->*m1)()) + 123" ".* = 246" "ternop 8"

gdb_test "p false ? a.adda(456) : 123" ".* = 123" "ternop 9"
gdb_test "p false ? a_ptr->adda(456) : 123" ".* = 123" "ternop 10"
gdb_test "p (true ? 123 : a.adda(456)) + 123" ".* = 246" "ternop 11"
gdb_test "p (true ? 123 : a_ptr->adda(456)) + 123" ".* = 246" "ternop 12"
gdb_test "p false ? (a.*m2)(123) : 123" ".* = 123" "ternop 13"
gdb_test "p false ? (a_ptr->*m2)(123) : 123" ".* = 123" "ternop 14"
gdb_test "p (true ? 123 : (a.*m2)(123)) + 123" ".* = 246" "ternop 15"
gdb_test "p (true ? 123 : (a_ptr->*m2)(123)) + 123" ".* = 246" "ternop 16"

gdb_test "p false ? (a.*(&A::f))(1, 2) : 123" ".* = 123" "ternop 17"
gdb_test "p false ? (a_ptr->*(&A::f))(1, 2) : 123" ".* = 123" "ternop 18"
gdb_test "p (true ? 123 : (a.*(&A::f))(1, 2)) + 123" ".* = 246" "ternop 19"
gdb_test "p (true ? 123 : (a_ptr->*(&A::f))(1, 2)) + 123" ".* = 246" "ternop 20"
