bitwise icon indicating copy to clipboard operation
bitwise copied to clipboard

size_t isnt usize and usize isnt size_t (at least on Macos)

Open uucidl opened this issue 7 years ago • 2 comments

See repro at: https://github.com/uucidl/bitwise/commit/a96b0369f8fe062953906e1a3471a73bb910d582

ion -os osx -arch x64 bugs && \
  cc out_bugs.c -o bugs.elf && \
  ./bugs.elf ; echo "rc:$?"

Expected:

Processed 101 symbols in 2 packages
Generated out_bugs.c
rc:42

Got:

Processed 101 symbols in 2 packages
Generated out_bugs.c
<foo>/Desktop/bitwise/ion/bugs/size_bug.ion:10:25: warning:
      incompatible pointer types passing 'ullong *' (aka 'unsigned long long *')
      to parameter of type 'size_t *' (aka 'unsigned long *')
      [-Wincompatible-pointer-types]
    fetch_value(&(num), &(num_size));
                        ^~~~~~~~~~~
<foo>/Desktop/bitwise/ion/bugs/size_bug.h:3:41: note: passing argument
      to parameter 'dest_size_ptr' here
int fetch_value(void* dest_ptr, size_t* dest_size_ptr);
                                        ^
1 warning generated.
rc:42

I would have expected C apis expressed in terms of size_t to be exposed in ion via usize. It appears that on Macos at least:

cc -E out_bugs.c | grep -E '(typedef.* uint64_t;|typedef.* size_t;)'
typedef unsigned long long uint64_t;
typedef long unsigned int size_t;

Since usize is defined as uint64, we see that these types differ.

uucidl avatar Jul 16 '18 08:07 uucidl

Not reproduced on Windows, where it seems we have:

typedef unsigned long long uint64_t;
typedef unsigned __int64 size_t;

Ah well. I think that usize = uint64 is kind of the correct answer, and that the long/int/short C integer zoo is messy.

Maybe usize can stay purely uint64 and builtins could simply have a c_size synonymous with size_t.

uucidl avatar Jul 16 '18 08:07 uucidl

I tested the idea of having a c_size, it creates some friction, as now size_t and the return value of sizeof are not anymore synonymous.

uucidl avatar Jul 17 '18 07:07 uucidl