changed: pointer promotes to multi-pointer
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 23 Mar 2023 23:58:20 +0000 (18:58 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Thu, 23 Mar 2023 23:58:20 +0000 (18:58 -0500)
compiler/src/types.c
core/alloc/alloc.onyx
core/conv/conv.onyx
core/conv/format.onyx
core/conv/parse.onyx
core/runtime/platform/onyx/fs.onyx
core/string/string.onyx

index ba0c25ef35bb1456d2e8e140d1f1589010157023..4611cbedd1e7778c8165ed375059271036416618 100644 (file)
@@ -135,6 +135,15 @@ b32 types_are_compatible_(Type* t1, Type* t2, b32 recurse_pointers) {
                 }
             }
 
+            // Pointers promote to multi-pointers
+            // &u8 -> [&] u8
+            if (t2->kind == Type_Kind_MultiPointer) {
+                if (!recurse_pointers) return 1;
+
+                if (types_are_compatible(t1->Pointer.elem, t2->Pointer.elem)) return 1;
+            }
+
+            // Pointer decays to rawptr
             if (t2->kind == Type_Kind_Basic && t2->Basic.kind == Basic_Kind_Rawptr) return 1;
 
             break;
index b9733c0f0a5d80399c5a95028c6f773999e90113..0577b32b13051d7cfe95ec25e3d8132480a8d609 100644 (file)
@@ -16,12 +16,12 @@ as_allocator :: #match {
 from_stack :: macro (size: u32) -> rawptr {
     // This should do something about the alignment...
     // Everything so far has assume that the stack is aligned to 16 bytes.
-    defer __stack_top = ~~(cast([&]u8) __stack_top + size);
+    defer __stack_top = cast([&]u8, __stack_top) + size;
     return __stack_top;
 }
 
 array_from_stack :: macro ($T: type_expr, size: u32) -> [] T {
-    defer __stack_top = ~~(cast([&]u8) __stack_top + size * sizeof T);
+    defer __stack_top = cast([&]u8, __stack_top) + size * sizeof T;
     return (cast([&]T) __stack_top)[0 .. size];
 }
 
index e3dbdb6924dc6d1580034e0812891bb67387a915..e3975f64bba3582002fa500dd9f3685f9330928e 100644 (file)
@@ -155,7 +155,7 @@ i64_to_str :: (n: i64, base: u64, buf: [] u8, min_length := 0, prefix := false)
         n = -n;
     }
 
-    c: [&] u8 = ~~&buf[buf.count - 1];
+    c: [&] u8 = &buf[buf.count - 1];
     len := 0;
 
     BASE64_MAP := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
@@ -217,7 +217,7 @@ i64_to_str :: (n: i64, base: u64, buf: [] u8, min_length := 0, prefix := false)
 // Converts an unsigned number into a string using the buffer provided.
 // Behaves like i64_to_str.
 u64_to_str :: (n: u64, base: u64, buf: [] u8, min_length := 0, prefix := false) -> str {
-    c: [&] u8 = ~~&buf[buf.count - 1];
+    c: [&] u8 = &buf[buf.count - 1];
     len := 0;
 
     BASE64_MAP := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/";
index 2744345c23c3c28e7e66ca55375668125f03c468..59a4c196c71d4888aa5743a425a61fc7531b0e17 100644 (file)
@@ -252,7 +252,7 @@ format_va :: (buffer: &dyn_str, format: str, va: [] any) -> str {
         flush=.{ buffer, flush_to_dyn_str }
     };
 
-    final := format_va(&output, format, ~~va);
+    final := format_va(&output, format, va);
     string.concat(buffer, final);
     return *buffer;
 }
@@ -339,7 +339,7 @@ format_va :: (output: &Format_Output, format: str, va: [] any) -> str {
                             i += 1;
                         }
 
-                        formatting.minimum_width = ~~digits;
+                        formatting.minimum_width = digits;
                     }
 
                     case #char "!" {
@@ -551,7 +551,7 @@ format_any :: (output: &Format_Output, formatting: &Format, v: any) {
                         format.quote_strings = true;
 
                         output->write("Some(");
-                        format_any(output, &format, .{ ~~(cast([&] u8) v.data + s.members[1].offset), s.members[1].type });
+                        format_any(output, &format, .{ cast([&] u8) v.data + s.members[1].offset, s.members[1].type });
                         output->write(")");
 
                     } else {
@@ -586,7 +586,7 @@ format_any :: (output: &Format_Output, formatting: &Format, v: any) {
                         output->write(member.name);
                         output->write(" = ");
 
-                        format_any(output, &format, .{ ~~(cast([&] u8) v.data + member.offset), member.type });
+                        format_any(output, &format, .{ cast([&] u8) v.data + member.offset, member.type });
                     }
                 }
                 
@@ -645,7 +645,7 @@ format_any :: (output: &Format_Output, formatting: &Format, v: any) {
                         for _: format.indentation do output->write(#char " ");
                     }
 
-                    format_any(output, &format, .{ ~~(cast([&] u8) data + get_type_info(a.of).size * i), a.of });
+                    format_any(output, &format, .{ cast([&] u8) data + get_type_info(a.of).size * i, a.of });
                 }
 
 
@@ -669,7 +669,7 @@ format_any :: (output: &Format_Output, formatting: &Format, v: any) {
                 for i: a.count {
                     if i != 0 do output->write(", ");
 
-                    format_any(output, formatting, .{ ~~(cast([&] u8) data + get_type_info(a.of).size * i), a.of });
+                    format_any(output, formatting, .{ cast([&] u8) data + get_type_info(a.of).size * i, a.of });
                 }
 
                 output->write(" ]");
index 1e708be35c1335dfb7891ec9941e530df9f14c87..d0f7fe1e3fa779271f855c136d04bac5cd19b1f1 100644 (file)
@@ -56,7 +56,7 @@ parse_any :: (target: rawptr, data_type: type_expr, to_parse: str, string_alloca
 
         case f64 {
             dest := cast(&f64) target;
-            *dest = ~~ str_to_f64(to_parse);
+            *dest = str_to_f64(to_parse);
             return true;
         }
 
index 8ef4f1b973a027919bb0101c7af3105128820337..3b49f1bfa6ed8238bccd5c8ca7519b2cc3f2f217 100644 (file)
@@ -97,7 +97,7 @@ __file_stream_vtable := io.Stream_Vtable.{
     write_byte = (use fs: &os.File, byte: u8) -> io.Error {
         b := byte;
         bytes_wrote: u64;
-        error := __file_write(data, .{ ~~&b, 1 }, &bytes_wrote);
+        error := __file_write(data, .{ &b, 1 }, &bytes_wrote);
         return error;
     },
 
index e03097259de9dffe5145c59c27adce7744788228..ab4dc6f8d1e2687002223ac700a9e819108f15ee 100644 (file)
@@ -48,7 +48,7 @@ copy :: (orig: str, dest: str) {
 
 #match as_str from_cstr
 from_cstr :: (s: cstr) -> str {
-    return .{ data = ~~s, count = length(s) };
+    return .{ data = s, count = length(s) };
 }