# Copyright (C) 2015-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/>.

# Test basic builtin types.
# NOTE: The tests here intentionally do not require a D compiler.

load_lib "d-support.exp"

if { [skip_d_tests] } { continue }

proc test_d_sizeof {} {
    # Test use of .sizeof with types and expressions.
    gdb_test "print bool.sizeof" " = 1"
    gdb_test "print (bool).sizeof" " = 1"

    gdb_test "print char.sizeof" " = 1"
    gdb_test "print wchar.sizeof" " = 2"
    gdb_test "print dchar.sizeof" " = 4"

    gdb_test "print byte.sizeof" " = 1"
    gdb_test "print ubyte.sizeof" " = 1"
    gdb_test "print short.sizeof" " = 2"
    gdb_test "print ushort.sizeof" " = 2"
    gdb_test "print int.sizeof" " = 4"
    gdb_test "print uint.sizeof" " = 4"
    gdb_test "print long.sizeof" " = 8"
    gdb_test "print ulong.sizeof" " = 8"
    gdb_test "print cent.sizeof" " = 16"
    gdb_test "print ucent.sizeof" " = 16"

    gdb_test "print float.sizeof" " = 4"
    gdb_test "print ifloat.sizeof" " = 4"
    gdb_test "print double.sizeof" " = 8"
    gdb_test "print idouble.sizeof" " = 8"

    gdb_test "print (1).sizeof" " = 4"
    gdb_test "print (1U).sizeof" " = 4"
    gdb_test "print (1L).sizeof" " = 8"
    gdb_test "print (1UL).sizeof" " = 8"
    gdb_test "print (1.0).sizeof" " = 8"
    gdb_test "print (1.0f).sizeof" " = 4"

    gdb_test "print (7 ^^ 3).sizeof" " = 4"
    gdb_test "print (7L ^^ 3).sizeof" " = 8"
    gdb_test "print (7.0 ^^ 3).sizeof" " = 8"
    gdb_test "print (7.0f ^^ 3).sizeof" " = 4"
}

proc test_d_typeof {} {
    # Test use of typeof() with expressions.
    gdb_test "ptype typeof(false)" "type = bool"

    gdb_test "ptype typeof(1)" "type = int"
    gdb_test "ptype typeof(1U)" "type = uint"
    gdb_test "ptype typeof(1L)" "type = long"
    gdb_test "ptype typeof(1UL)" "type = ulong"
    gdb_test "ptype typeof(1.0)" "type = double"
    gdb_test "ptype typeof(1.0L)" "type = real"
    gdb_test "ptype typeof(1.0f)" "type = float"

    gdb_test "ptype typeof(cast(byte) 1)" "type = byte"
    gdb_test "ptype typeof(cast(short) 1)" "type = short"

    gdb_test "ptype typeof(7 ^^ 3)" "type = int"
    gdb_test "ptype typeof(7L ^^ 3)" "type = long"
    gdb_test "ptype typeof(7.0 ^^ 3)" "type = double"
    gdb_test "ptype typeof(7.0L ^^ 3)" "type = real"
    gdb_test "ptype typeof(7.0f ^^ 3)" "type = float"
}

# Start with a fresh gdb.

gdb_exit
gdb_start

if [set_lang_d] {
    test_d_sizeof
    test_d_typeof
} else {
    warning "D type tests suppressed."
}
