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

# Member tests for GDB's C++ compile feature.

load_lib compile-support.exp

standard_testfile .cc

if {[skip_cplus_tests]} {
    untested "skipping C++ tests"
    return
}

if {[prepare_for_testing $testfile $testfile $srcfile \
	 {debug nowarnings c++}]} {
    return -1
}

if {![runto_main]} {
    untested "could not run to main"
    return -1
}

if {[skip_compile_feature_tests]} {
    untested \
	"compile command not supported (could not find libcc1 shared library?)"
    return -1
}

gdb_breakpoint [gdb_get_line_number "break here" $srcfile]
gdb_continue_to_breakpoint "testing location"

CompileExpression::new "var"
CompileExpression::test "a.public_" 1
CompileExpression::test "a.protected_" {(21|N::NB)}
CompileExpression::test "a.private_" 3
CompileExpression::test "A::s_public_" {(10|E_A)}
CompileExpression::test "A::s_protected_" {(20|N::NA)}
CompileExpression::test "A::s_private_" {(12|E_C)}
CompileExpression::test "A::ATYPE i = 10; var = i;" 10 -explicit
CompileExpression::test "get_values (a)" 125
CompileExpression::test "myenum me = E_B; var = me;" 11 -explicit
CompileExpression::test "A::s_protected_ = N::NB; var = A::s_protected_;" \
    21 -explicit
CompileExpression::test "A::s_private_ = E_B; var = A::s_private_;" 11 -explicit
CompileExpression::test "N::ANON_NE ae = N::ND; var = ae;" 23 -explicit
CompileExpression::test {a.*pmi} 1
CompileExpression::test {a.public_ = 2; var = a.*pmi; a.public_ = 1} 2 -explicit
CompileExpression::test "g_e" {(42|AC)}

# Test some compilation failures
set failed {\r\nCompilation failed\.}
gdb_test "compile code a.s_public_ = E_B" \
    ".*assignment of read-only variable 'A::s_public_'$failed"

gdb_test "compile code get_values ()" \
    ".*too few arguments to function.*$failed"

gdb_test "compile code ATYPE i;" \
    ".*.ATYPE. was not declared in this scope$failed"

gdb_test "compile code N::ANON_NE nse = E_A" \
    ".*cannot convert.*$failed"
