# # Test of type compatibility (positive tests). # See also errortest/mainapp/typecompat.slul for negative tests. # # Copyright © 2022-2024 Samuel Lidén Borell # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # data bool b1 = true data bool b2 = false data bool b3 = b4 data bool b4 = b1 or b2 data string s1 = "" data string s2 = "Abc\G;Δ\C;Д\L;D" data string s3 = s4 data string s4 = "\x41" "BC" data [0]int a1 = [] data [1-1]int a2 = a1 data [2]bool a3 = a4 data [2]bool a4 = [true, false] data [3,2]int a5 = [[1,2], [3,4], [5,6]] type TypeCompat1 = int data int tc1 = tc2 data TypeCompat1 tc2 = 123 data int tc3 = tc2 type TypeCompatEnum = enum { a b } data TypeCompatEnum tc_enum1 = tc_enum2 data TypeCompatEnum tc_enum2 = .a func typecompat_builtins() { var int i = 123 var int8 i8 = 123 var int16 i16 = 123 var int32 i32 = 123 var int64 i64 = 123 var uint ui = 123 var byte u8 = 123 var uint16 u16 = 123 var uint32 u32 = 123 var uint64 u64 = 123 var wuint wui = 123 var wuint8 wu8 = 123 var wuint16 wu16 = 123 var wuint32 wu32 = 123 var wuint64 wu64 = 123 var usize us = 123 var ssize ss = 123 var fileoffs fo = 123 i = i i = i8 i = i16 i = i32 i = u8 i = u16 i = wu8 i = wu16 i8 = i8 i16 = i8 i16 = i16 i16 = u8 i32 = i i32 = i8 i32 = i16 i32 = i32 i32 = u8 i32 = u16 i32 = wu8 i32 = wu16 i64 = i i64 = i8 i64 = i16 i64 = i32 i64 = i64 i64 = u8 i64 = u16 i64 = u32 i64 = wu8 i64 = wu16 i64 = wu32 u8 = u8 u8 = wu8 u16 = u8 u16 = u16 u16 = wu8 u16 = wu16 u32 = ui u32 = u8 u32 = u16 u32 = u32 u32 = wu8 u32 = wu16 u32 = wu32 u64 = ui u64 = u8 u64 = u16 u64 = u32 u64 = u64 u64 = wu8 u64 = wu16 u64 = wu32 u64 = wu64 wu8 = u8 wu8 = wu8 wui = ui wui = ui wui = wui wui = u8 wui = u32 wui = wu32 wu64 = u64 wu64 = wu64 us = ui us = u8 us = u16 us = u32 us = us ss = i ss = i8 ss = i16 ss = i32 ss = u8 ss = u16 ss = ss fo = i fo = i8 fo = i16 fo = i32 fo = u8 fo = u16 fo = fo } # Like typecompat_builtins, but with variables allocated on stack func typecompat_builtins_stack() { # Take up all available registers var int padding00 = 0 var int padding01 = 1 var int padding02 = 2 var int padding03 = 3 var int padding04 = 4 var int padding05 = 5 var int padding06 = 6 var int padding07 = 7 var int padding08 = 8 var int padding09 = 9 var int padding10 = 10 var int padding11 = 11 var int padding12 = 12 var int padding13 = 13 var int padding14 = 14 var int padding15 = 15 var int padding16 = 16 var int padding17 = 17 var int padding18 = 18 var int padding19 = 19 var int padding20 = 20 var int padding21 = 21 var int padding22 = 22 var int padding23 = 23 var int padding24 = 24 var int padding25 = 25 var int padding26 = 26 var int padding27 = 27 var int padding28 = 28 var int padding29 = 29 var int padding30 = 30 var int padding31 = 31 var int padding32 = 32 var int padding33 = 33 var int padding34 = 34 var int padding35 = 35 var int padding36 = 36 var int padding37 = 37 var int padding38 = 38 var int padding39 = 39 var int i = 123 var int8 i8 = 123 var int16 i16 = 123 var int32 i32 = 123 var int64 i64 = 123 var uint ui = 123 var byte u8 = 123 var uint16 u16 = 123 var uint32 u32 = 123 var uint64 u64 = 123 var wuint wui = 123 var wuint8 wu8 = 123 var wuint16 wu16 = 123 var wuint32 wu32 = 123 var wuint64 wu64 = 123 var usize us = 123 var ssize ss = 123 var fileoffs fo = 123 int i1 = i i = i8 i = i16 i = i32 i = u8 i = u16 i = wu8 i = wu16 i8 = i8 i16 = i8 i16 = i16 i16 = u8 i32 = i i32 = i8 i32 = i16 i32 = i32 i32 = u8 i32 = u16 i32 = wu8 i32 = wu16 i64 = i i64 = i8 i64 = i16 i64 = i32 i64 = i64 i64 = u8 i64 = u16 i64 = u32 i64 = wu8 i64 = wu16 i64 = wu32 u8 = u8 u8 = wu8 u16 = u8 u16 = u16 u16 = wu8 u16 = wu16 u32 = ui u32 = u8 u32 = u16 u32 = u32 u32 = wu8 u32 = wu16 u32 = wu32 u64 = ui u64 = u8 u64 = u16 u64 = u32 u64 = u64 u64 = wu8 u64 = wu16 u64 = wu32 u64 = wu64 wu8 = u8 wu8 = wu8 wui = ui wui = ui wui = wui wui = u8 wui = u32 wui = wu32 wu64 = u64 wu64 = wu64 us = ui us = u8 us = u16 us = u32 us = us ss = i ss = i8 ss = i16 ss = i32 ss = u8 ss = u16 ss = ss fo = i fo = i8 fo = i16 fo = i32 fo = u8 fo = u16 fo = fo } func get_ref() -> ref var TypeCompat1 { while true {} } func get_arena() -> arena var TypeCompat1 { while true {} } func get_own() -> own var TypeCompat1 { while true {} } func take_ref(ref TypeCompat1 x) { while true {} } func take_arena(arena TypeCompat1 x) { while true {} } func take_own(own TypeCompat1 x) { while true {} } func get_refref() -> ref ref var TypeCompat1 { while true {} } func take_refref(ref ref var TypeCompat1 x) { while true {} } func typecompat_refs() { take_ref(get_ref()) take_arena(get_arena()) take_own(get_own()) take_ref(get_arena()) own TypeCompat1 owned = get_own() take_ref(owned) take_own(owned) ref ref var TypeCompat1 rr = get_refref() take_refref(rr) take_refref(get_refref()) ref aliased TypeCompat1 quals1 = get_ref() ref threaded TypeCompat1 quals2 = get_ref() ref aliased ref var TypeCompat1 quals3 = get_refref() var ref TypeCompat1 quals4 = get_ref() var ref aliased ref var TypeCompat1 quals5 = get_refref() # Open types own SomeThing st = make_some_thing() free_some_thing(st) } func typecompat_reftargets() { byte b = 123 ref byte bp = refto b int i = deref bp } func typecompat_test() { typecompat_builtins() typecompat_builtins_stack() #typecompat_refs() # TODO get_ref() etc are simply endless loops for now typecompat_reftargets() }