diff --git a/libc/include/sys/types.h b/libc/include/sys/types.h index 8cfeeb69d..459159fe9 100644 --- a/libc/include/sys/types.h +++ b/libc/include/sys/types.h @@ -85,7 +85,7 @@ typedef .... pthread_t; #ifndef _SSIZE_T_DEFINED_ #define _SSIZE_T_DEFINED_ -typedef long int ssize_t; +typedef __kernel_ssize_t ssize_t; #endif typedef __kernel_suseconds_t suseconds_t; diff --git a/tests/stdio_test.cpp b/tests/stdio_test.cpp index 70a71fb87..d2311fd54 100644 --- a/tests/stdio_test.cpp +++ b/tests/stdio_test.cpp @@ -169,3 +169,12 @@ TEST(stdio, getline_invalid) { ASSERT_EQ(getline(&buffer, &buffer_length, fp), -1); ASSERT_EQ(EBADF, errno); } + +TEST(stdio, printf_ssize_t) { + // We used to have a ssize_t definition that confused GCC into saying: + // error: format '%zd' expects argument of type 'signed size_t', + // but argument 4 has type 'ssize_t {aka long int}' [-Werror=format] + ssize_t v = 1; + char buf[32]; + snprintf(buf, sizeof(buf), "%zd", v); +}