Merge "use architecture-specific ssize_t definition"
diff --git a/libc/include/sys/types.h b/libc/include/sys/types.h
index 8cfeeb6..459159f 100644
--- a/libc/include/sys/types.h
+++ b/libc/include/sys/types.h
@@ -85,7 +85,7 @@
 
 #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 70a71fb..d2311fd 100644
--- a/tests/stdio_test.cpp
+++ b/tests/stdio_test.cpp
@@ -169,3 +169,12 @@
   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);
+}