# Copyright (C) 2015-2024 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"

require allow_d_tests

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"
}

clean_restart

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