Make wuffs_base__status a struct
diff --git a/doc/changelog.md b/doc/changelog.md
index dcbcbed..8afddbc 100644
--- a/doc/changelog.md
+++ b/doc/changelog.md
@@ -1,6 +1,11 @@
 # Changelog
 
 
+## Work In Progress
+
+- Made `wuffs_base__status` a struct.
+
+
 ## 2019-12-19 version 0.2.0
 
 The headline feature is that the GIF decoder is now of production quality.
@@ -96,4 +101,4 @@
 
 ---
 
-Updated on December 2019.
+Updated on January 2020.
diff --git a/doc/note/statuses.md b/doc/note/statuses.md
index f7e2b59..eb4dbbd 100644
--- a/doc/note/statuses.md
+++ b/doc/note/statuses.md
@@ -67,10 +67,10 @@
 
 ## C Implementation
 
-In terms of C implementation, a status value is just its string message: a
-`const char *`, with `ok` being the null pointer. That C string is statically
-allocated and should never be `free`'d. Status values can be compared by the
-`==` operator and not just by `strcmp`.
+In terms of C implementation, a status' `repr` (representation) is just its
+string message: a `const char *`, with `ok` being the null pointer. That C
+string is statically allocated and should never be `free`'d. Status `repr`s can
+be compared by the `==` operator and not just by `strcmp`.
 
 The C string's contents has the Wuffs package name inserted by the Wuffs
 compiler, just after that first byte. For example, the `std/deflate` package
diff --git a/example/crc32/crc32.cc b/example/crc32/crc32.cc
index 92c964b..2348514 100644
--- a/example/crc32/crc32.cc
+++ b/example/crc32/crc32.cc
@@ -59,8 +59,8 @@
 int main(int argc, char** argv) {
   wuffs_crc32__ieee_hasher h;
   wuffs_base__status status = h.initialize(sizeof h, WUFFS_VERSION, 0);
-  if (status) {
-    fprintf(stderr, "%s\n", wuffs_base__status__message(status));
+  if (!status.is_ok()) {
+    fprintf(stderr, "%s\n", status.message());
     return 1;
   }
 
diff --git a/example/gifplayer/gifplayer.c b/example/gifplayer/gifplayer.c
index d2374e7..d9cb3dc 100644
--- a/example/gifplayer/gifplayer.c
+++ b/example/gifplayer/gifplayer.c
@@ -294,8 +294,8 @@
   wuffs_gif__decoder dec;
   wuffs_base__status status =
       wuffs_gif__decoder__initialize(&dec, sizeof dec, WUFFS_VERSION, 0);
-  if (status) {
-    return wuffs_base__status__message(status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    return wuffs_base__status__message(&status);
   }
 
   if (quirk_honor_background_color_flag) {
@@ -314,8 +314,8 @@
   if (first_play) {
     wuffs_base__image_config ic = {0};
     status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-    if (status) {
-      return wuffs_base__status__message(status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      return wuffs_base__status__message(&status);
     }
     if (!wuffs_base__image_config__is_valid(&ic)) {
       return "invalid image configuration";
@@ -336,8 +336,8 @@
       return msg;
     }
     status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg, pixbuf);
-    if (status) {
-      return wuffs_base__status__message(status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      return wuffs_base__status__message(&status);
     }
     memset(pixbuf.ptr, 0, pixbuf.len);
   }
@@ -346,11 +346,11 @@
     wuffs_base__frame_config fc = {0};
     wuffs_base__status status =
         wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
-    if (status) {
-      if (status == wuffs_base__warning__end_of_data) {
+    if (!wuffs_base__status__is_ok(&status)) {
+      if (status.repr == wuffs_base__warning__end_of_data) {
         break;
       }
-      return wuffs_base__status__message(status);
+      return wuffs_base__status__message(&status);
     }
 
     if (wuffs_base__frame_config__index(&fc) == 0) {
@@ -372,7 +372,7 @@
 
     wuffs_base__status decode_frame_status =
         wuffs_gif__decoder__decode_frame(&dec, &pb, &src, workbuf, NULL);
-    if (decode_frame_status == wuffs_base__warning__end_of_data) {
+    if (decode_frame_status.repr == wuffs_base__warning__end_of_data) {
       break;
     }
 
@@ -422,8 +422,8 @@
 
     // TODO: should a zero duration mean to show this frame forever?
 
-    if (decode_frame_status) {
-      return wuffs_base__status__message(decode_frame_status);
+    if (!wuffs_base__status__is_ok(&decode_frame_status)) {
+      return wuffs_base__status__message(&decode_frame_status);
     }
   }
 
diff --git a/example/library/library.c b/example/library/library.c
index 5c654d2..0fa24d9 100644
--- a/example/library/library.c
+++ b/example/library/library.c
@@ -101,16 +101,16 @@
   wuffs_base__status status = wuffs_gzip__decoder__initialize(
       dec, sizeof__wuffs_gzip__decoder(), WUFFS_VERSION,
       WUFFS_INITIALIZE__ALREADY_ZEROED);
-  if (status) {
+  if (!wuffs_base__status__is_ok(&status)) {
     free(dec);
-    return wuffs_base__status__message(status);
+    return wuffs_base__status__message(&status);
   }
   status = wuffs_gzip__decoder__decode_io_writer(
       dec, &dst, &src,
       wuffs_base__make_slice_u8(work_buffer, WORK_BUFFER_SIZE));
-  if (status) {
+  if (!wuffs_base__status__is_ok(&status)) {
     free(dec);
-    return wuffs_base__status__message(status);
+    return wuffs_base__status__message(&status);
   }
   fwrite(dst.data.ptr, sizeof(uint8_t), dst.meta.wi, stdout);
   free(dec);
diff --git a/example/zcat/zcat.c b/example/zcat/zcat.c
index 9bdf2f7..c7a1dfa 100644
--- a/example/zcat/zcat.c
+++ b/example/zcat/zcat.c
@@ -87,8 +87,8 @@
   wuffs_gzip__decoder dec;
   wuffs_base__status status =
       wuffs_gzip__decoder__initialize(&dec, sizeof dec, WUFFS_VERSION, 0);
-  if (status) {
-    return wuffs_base__status__message(status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    return wuffs_base__status__message(&status);
   }
 
   wuffs_base__io_buffer dst;
@@ -135,13 +135,13 @@
         wuffs_base__io_buffer__compact(&dst);
       }
 
-      if (status == wuffs_base__suspension__short_read) {
+      if (status.repr == wuffs_base__suspension__short_read) {
         break;
       }
-      if (status == wuffs_base__suspension__short_write) {
+      if (status.repr == wuffs_base__suspension__short_write) {
         continue;
       }
-      return wuffs_base__status__message(status);
+      return wuffs_base__status__message(&status);
     }
 
     wuffs_base__io_buffer__compact(&src);
diff --git a/fuzz/c/std/gif_fuzzer.c b/fuzz/c/std/gif_fuzzer.c
index 2858c1c..5e083fa 100644
--- a/fuzz/c/std/gif_fuzzer.c
+++ b/fuzz/c/std/gif_fuzzer.c
@@ -57,19 +57,19 @@
   // variable initialization" warnings.
   {
     wuffs_gif__decoder dec;
-    const char* status = wuffs_gif__decoder__initialize(
+    wuffs_base__status status = wuffs_gif__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         (hash & 1) ? WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED
                    : 0);
-    if (status) {
-      ret = status;
+    if (!wuffs_base__status__is_ok(&status)) {
+      ret = wuffs_base__status__message(&status);
       goto exit;
     }
 
     wuffs_base__image_config ic = ((wuffs_base__image_config){});
     status = wuffs_gif__decoder__decode_image_config(&dec, &ic, src);
-    if (status) {
-      ret = status;
+    if (!wuffs_base__status__is_ok(&status)) {
+      ret = wuffs_base__status__message(&status);
       goto exit;
     }
     if (!wuffs_base__image_config__is_valid(&ic)) {
@@ -107,8 +107,8 @@
 
     wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
     status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg, pixbuf);
-    if (status) {
-      ret = status;
+    if (!wuffs_base__status__is_ok(&status)) {
+      ret = wuffs_base__status__message(&status);
       goto exit;
     }
 
@@ -116,9 +116,9 @@
     while (true) {
       wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
       status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, src);
-      if (status) {
-        if ((status != wuffs_base__warning__end_of_data) || !seen_ok) {
-          ret = status;
+      if (!wuffs_base__status__is_ok(&status)) {
+        if ((status.repr != wuffs_base__warning__end_of_data) || !seen_ok) {
+          ret = wuffs_base__status__message(&status);
         }
         goto exit;
       }
@@ -134,9 +134,9 @@
         goto exit;
       }
 
-      if (status) {
-        if ((status != wuffs_base__warning__end_of_data) || !seen_ok) {
-          ret = status;
+      if (!wuffs_base__status__is_ok(&status)) {
+        if ((status.repr != wuffs_base__warning__end_of_data) || !seen_ok) {
+          ret = wuffs_base__status__message(&status);
         }
         goto exit;
       }
diff --git a/fuzz/c/std/zlib_fuzzer.c b/fuzz/c/std/zlib_fuzzer.c
index b452582..80a75a2 100644
--- a/fuzz/c/std/zlib_fuzzer.c
+++ b/fuzz/c/std/zlib_fuzzer.c
@@ -62,11 +62,11 @@
 
 const char* fuzz(wuffs_base__io_buffer* src, uint32_t hash) {
   wuffs_zlib__decoder dec;
-  const char* status = wuffs_zlib__decoder__initialize(
+  wuffs_base__status status = wuffs_zlib__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       (hash & 1) ? WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED : 0);
-  if (status) {
-    return status;
+  if (!wuffs_base__status__is_ok(&status)) {
+    return wuffs_base__status__message(&status);
   }
 
   // Ignore the checksum for 99.99%-ish of all input. When fuzzers generate
@@ -89,7 +89,7 @@
                                                        .ptr = work_buffer,
                                                        .len = WORK_BUFFER_SIZE,
                                                    }));
-    if (status != wuffs_base__suspension__short_write) {
+    if (status.repr != wuffs_base__suspension__short_write) {
       break;
     }
     if (dst.meta.wi == 0) {
@@ -98,5 +98,5 @@
       intentional_segfault();
     }
   }
-  return status;
+  return wuffs_base__status__message(&status);
 }
diff --git a/hello-wuffs-c/main.c b/hello-wuffs-c/main.c
index b6cbaea..7704d6a 100644
--- a/hello-wuffs-c/main.c
+++ b/hello-wuffs-c/main.c
@@ -47,8 +47,8 @@
 
   status = wuffs_demo__parser__initialize(parser, sizeof__wuffs_demo__parser(),
                                           WUFFS_VERSION, 0);
-  if (!wuffs_base__status__is_ok(status)) {
-    printf("initialize: %s\n", wuffs_base__status__message(status));
+  if (!wuffs_base__status__is_ok(&status)) {
+    printf("initialize: %s\n", wuffs_base__status__message(&status));
     free(parser);
     return 0;
   }
@@ -62,8 +62,8 @@
   iobuf.meta.closed = true;
 
   status = wuffs_demo__parser__parse(parser, &iobuf);
-  if (!wuffs_base__status__is_ok(status)) {
-    printf("parse: %s\n", wuffs_base__status__message(status));
+  if (!wuffs_base__status__is_ok(&status)) {
+    printf("parse: %s\n", wuffs_base__status__message(&status));
     free(parser);
     return 0;
   }
diff --git a/internal/cgen/base/core-private.h b/internal/cgen/base/core-private.h
index 9e74d3e..e633a87 100644
--- a/internal/cgen/base/core-private.h
+++ b/internal/cgen/base/core-private.h
@@ -55,9 +55,9 @@
   case n:;
 
 #define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \
-  if (!status) {                                                \
+  if (!status.repr) {                                           \
     goto ok;                                                    \
-  } else if (*status != '$') {                                  \
+  } else if (*status.repr != '$') {                             \
     goto exit;                                                  \
   }                                                             \
   coro_susp_point = n;                                          \
@@ -417,6 +417,6 @@
   return wuffs_base__make_slice_u8(NULL, 0);
 }
 
-// ---------------- Slices and Tables (Utility)
+  // ---------------- Slices and Tables (Utility)
 
 #define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8
diff --git a/internal/cgen/base/core-public.h b/internal/cgen/base/core-public.h
index 1838e15..b4544c2 100644
--- a/internal/cgen/base/core-public.h
+++ b/internal/cgen/base/core-public.h
@@ -135,51 +135,99 @@
 // --------
 
 // See https://github.com/google/wuffs/blob/master/doc/note/statuses.md
-typedef const char* wuffs_base__status;
+typedef struct {
+  const char* repr;
+
+#ifdef __cplusplus
+  inline bool is_complete() const;
+  inline bool is_error() const;
+  inline bool is_ok() const;
+  inline bool is_suspension() const;
+  inline bool is_warning() const;
+  inline const char* message() const;
+#endif  // __cplusplus
+
+} wuffs_base__status;
 
 // !! INSERT wuffs_base__status names.
 
 static inline wuffs_base__status  //
 wuffs_base__make_status(const char* repr) {
-  return repr;
+  wuffs_base__status z;
+  z.repr = repr;
+  return z;
 }
 
 static inline bool  //
-wuffs_base__status__is_complete(wuffs_base__status z) {
-  return (z == NULL) || ((*z != '$') && (*z != '#'));
+wuffs_base__status__is_complete(const wuffs_base__status* z) {
+  return (z->repr == NULL) || ((*z->repr != '$') && (*z->repr != '#'));
 }
 
 static inline bool  //
-wuffs_base__status__is_error(wuffs_base__status z) {
-  return z && (*z == '#');
+wuffs_base__status__is_error(const wuffs_base__status* z) {
+  return z->repr && (*z->repr == '#');
 }
 
 static inline bool  //
-wuffs_base__status__is_ok(wuffs_base__status z) {
-  return z == NULL;
+wuffs_base__status__is_ok(const wuffs_base__status* z) {
+  return z->repr == NULL;
 }
 
 static inline bool  //
-wuffs_base__status__is_suspension(wuffs_base__status z) {
-  return z && (*z == '$');
+wuffs_base__status__is_suspension(const wuffs_base__status* z) {
+  return z->repr && (*z->repr == '$');
 }
 
 static inline bool  //
-wuffs_base__status__is_warning(wuffs_base__status z) {
-  return z && (*z != '$') && (*z != '#');
+wuffs_base__status__is_warning(const wuffs_base__status* z) {
+  return z->repr && (*z->repr != '$') && (*z->repr != '#');
 }
 
 // wuffs_base__status__message strips the leading '$', '#' or '@'.
 static inline const char*  //
-wuffs_base__status__message(wuffs_base__status z) {
-  if (z) {
-    if ((*z == '$') || (*z == '#') || (*z == '@')) {
-      return z + 1;
+wuffs_base__status__message(const wuffs_base__status* z) {
+  if (z->repr) {
+    if ((*z->repr == '$') || (*z->repr == '#') || (*z->repr == '@')) {
+      return z->repr + 1;
     }
   }
-  return z;
+  return z->repr;
 }
 
+#ifdef __cplusplus
+
+inline bool  //
+wuffs_base__status::is_complete() const {
+  return wuffs_base__status__is_complete(this);
+}
+
+inline bool  //
+wuffs_base__status::is_error() const {
+  return wuffs_base__status__is_error(this);
+}
+
+inline bool  //
+wuffs_base__status::is_ok() const {
+  return wuffs_base__status__is_ok(this);
+}
+
+inline bool  //
+wuffs_base__status::is_suspension() const {
+  return wuffs_base__status__is_suspension(this);
+}
+
+inline bool  //
+wuffs_base__status::is_warning() const {
+  return wuffs_base__status__is_warning(this);
+}
+
+inline const char*  //
+wuffs_base__status::message() const {
+  return wuffs_base__status__message(this);
+}
+
+#endif  // __cplusplus
+
 // --------
 
 // FourCC constants.
diff --git a/internal/cgen/cgen.go b/internal/cgen/cgen.go
index 2c9d1eb..8c26db6 100644
--- a/internal/cgen/cgen.go
+++ b/internal/cgen/cgen.go
@@ -1053,7 +1053,7 @@
 		b.printf("wuffs_base__status z = %s%s__initialize("+
 			"&self->private_data.%s%s, sizeof(self->private_data.%s%s), WUFFS_VERSION, initialize_flags);\n",
 			prefix, qid[1].Str(g.tm), fPrefix, f.Name().Str(g.tm), fPrefix, f.Name().Str(g.tm))
-		b.printf("if (z) { return z; }\n")
+		b.printf("if (z.repr) { return z; }\n")
 		b.printf("}\n")
 	}
 
diff --git a/internal/cgen/data.go b/internal/cgen/data.go
index 04ee65b..6310ec8 100644
--- a/internal/cgen/data.go
+++ b/internal/cgen/data.go
@@ -35,7 +35,7 @@
 
 const baseCorePrivateH = "" +
 	"static inline wuffs_base__empty_struct  //\nwuffs_base__ignore_status(wuffs_base__status z) {\n  return wuffs_base__make_empty_struct();\n}\n\n// WUFFS_BASE__MAGIC is a magic number to check that initializers are called.\n// It's not foolproof, given C doesn't automatically zero memory before use,\n// but it should catch 99.99% of cases.\n//\n// Its (non-zero) value is arbitrary, based on md5sum(\"wuffs\").\n#define WUFFS_BASE__MAGIC ((uint32_t)0x3CCB6C71)\n\n// WUFFS_BASE__DISABLED is a magic number to indicate that a non-recoverable\n// error was previously encountered.\n//\n// Its (non-zero) value is arbitrary, based on md5sum(\"disabled\").\n#define WUFFS_BASE__DISABLED ((uint32_t)0x075AE3D2)\n\n// Denote intentional fallthroughs for -Wimplicit-fallthrough.\n//\n// The order matters here. Clang also defines \"__GNUC__\".\n#if defined(__clang__) && defined(__cplusplus) && (__cplusplus >= 201103L)\n#define WUFFS_BASE__FALLTHROUGH [[clang::fallthrough]]\n#elif !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 7)\n#define WUFFS_BAS" +
-	"E__FALLTHROUGH __attribute__((fallthrough))\n#else\n#define WUFFS_BASE__FALLTHROUGH\n#endif\n\n// Use switch cases for coroutine suspension points, similar to the technique\n// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html\n//\n// We use trivial macros instead of an explicit assignment and case statement\n// so that clang-format doesn't get confused by the unusual \"case\"s.\n#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:;\n#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \\\n  coro_susp_point = n;                            \\\n  WUFFS_BASE__FALLTHROUGH;                        \\\n  case n:;\n\n#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \\\n  if (!status) {                                                \\\n    goto ok;                                                    \\\n  } else if (*status != '$') {                                  \\\n    goto exit;                                                  \\\n  }                                                             \\\n  coro_susp_point" +
+	"E__FALLTHROUGH __attribute__((fallthrough))\n#else\n#define WUFFS_BASE__FALLTHROUGH\n#endif\n\n// Use switch cases for coroutine suspension points, similar to the technique\n// in https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html\n//\n// We use trivial macros instead of an explicit assignment and case statement\n// so that clang-format doesn't get confused by the unusual \"case\"s.\n#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_0 case 0:;\n#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT(n) \\\n  coro_susp_point = n;                            \\\n  WUFFS_BASE__FALLTHROUGH;                        \\\n  case n:;\n\n#define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \\\n  if (!status.repr) {                                           \\\n    goto ok;                                                    \\\n  } else if (*status.repr != '$') {                             \\\n    goto exit;                                                  \\\n  }                                                             \\\n  coro_susp_point" +
 	" = n;                                          \\\n  goto suspend;                                                 \\\n  case n:;\n\n// Clang also defines \"__GNUC__\".\n#if defined(__GNUC__)\n#define WUFFS_BASE__LIKELY(expr) (__builtin_expect(!!(expr), 1))\n#define WUFFS_BASE__UNLIKELY(expr) (__builtin_expect(!!(expr), 0))\n#else\n#define WUFFS_BASE__LIKELY(expr) (expr)\n#define WUFFS_BASE__UNLIKELY(expr) (expr)\n#endif\n\n// The helpers below are functions, instead of macros, because their arguments\n// can be an expression that we shouldn't evaluate more than once.\n//\n// They are static, so that linking multiple wuffs .o files won't complain about\n// duplicate function definitions.\n//\n// They are explicitly marked inline, even if modern compilers don't use the\n// inline attribute to guide optimizations such as inlining, to avoid the\n// -Wunused-function warning, and we like to compile with -Wall -Werror.\n\n" +
 	"" +
 	"// ---------------- Numeric Types\n\nstatic inline uint8_t  //\nwuffs_base__load_u8be(uint8_t* p) {\n  return p[0];\n}\n\nstatic inline uint16_t  //\nwuffs_base__load_u16be(uint8_t* p) {\n  return (uint16_t)(((uint16_t)(p[0]) << 8) | ((uint16_t)(p[1]) << 0));\n}\n\nstatic inline uint16_t  //\nwuffs_base__load_u16le(uint8_t* p) {\n  return (uint16_t)(((uint16_t)(p[0]) << 0) | ((uint16_t)(p[1]) << 8));\n}\n\nstatic inline uint32_t  //\nwuffs_base__load_u24be(uint8_t* p) {\n  return ((uint32_t)(p[0]) << 16) | ((uint32_t)(p[1]) << 8) |\n         ((uint32_t)(p[2]) << 0);\n}\n\nstatic inline uint32_t  //\nwuffs_base__load_u24le(uint8_t* p) {\n  return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |\n         ((uint32_t)(p[2]) << 16);\n}\n\nstatic inline uint32_t  //\nwuffs_base__load_u32be(uint8_t* p) {\n  return ((uint32_t)(p[0]) << 24) | ((uint32_t)(p[1]) << 16) |\n         ((uint32_t)(p[2]) << 8) | ((uint32_t)(p[3]) << 0);\n}\n\nstatic inline uint32_t  //\nwuffs_base__load_u32le(uint8_t* p) {\n  return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]" +
@@ -55,7 +55,7 @@
 	"// ---------------- Slices and Tables\n\n// wuffs_base__slice_u8__prefix returns up to the first up_to bytes of s.\nstatic inline wuffs_base__slice_u8  //\nwuffs_base__slice_u8__prefix(wuffs_base__slice_u8 s, uint64_t up_to) {\n  if ((uint64_t)(s.len) > up_to) {\n    s.len = up_to;\n  }\n  return s;\n}\n\n// wuffs_base__slice_u8__suffix returns up to the last up_to bytes of s.\nstatic inline wuffs_base__slice_u8  //\nwuffs_base__slice_u8__suffix(wuffs_base__slice_u8 s, uint64_t up_to) {\n  if ((uint64_t)(s.len) > up_to) {\n    s.ptr += (uint64_t)(s.len) - up_to;\n    s.len = up_to;\n  }\n  return s;\n}\n\n// wuffs_base__slice_u8__copy_from_slice calls memmove(dst.ptr, src.ptr, len)\n// where len is the minimum of dst.len and src.len.\n//\n// Passing a wuffs_base__slice_u8 with all fields NULL or zero (a valid, empty\n// slice) is valid and results in a no-op.\nstatic inline uint64_t  //\nwuffs_base__slice_u8__copy_from_slice(wuffs_base__slice_u8 dst,\n                                      wuffs_base__slice_u8 src) {\n  size_t len = dst.l" +
 	"en < src.len ? dst.len : src.len;\n  if (len > 0) {\n    memmove(dst.ptr, src.ptr, len);\n  }\n  return len;\n}\n\n" +
 	"" +
-	"// --------\n\nstatic inline wuffs_base__slice_u8  //\nwuffs_base__table_u8__row(wuffs_base__table_u8 t, uint32_t y) {\n  if (y < t.height) {\n    return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width);\n  }\n  return wuffs_base__make_slice_u8(NULL, 0);\n}\n\n" +
+	"// --------\n\nstatic inline wuffs_base__slice_u8  //\nwuffs_base__table_u8__row(wuffs_base__table_u8 t, uint32_t y) {\n  if (y < t.height) {\n    return wuffs_base__make_slice_u8(t.ptr + (t.stride * y), t.width);\n  }\n  return wuffs_base__make_slice_u8(NULL, 0);\n}\n\n  " +
 	"" +
 	"// ---------------- Slices and Tables (Utility)\n\n#define wuffs_base__utility__empty_slice_u8 wuffs_base__empty_slice_u8\n" +
 	""
@@ -69,8 +69,9 @@
 	"// --------\n\n// wuffs_base__empty_struct is used when a Wuffs function returns an empty\n// struct. In C, if a function f returns void, you can't say \"x = f()\", but in\n// Wuffs, if a function g returns empty, you can say \"y = g()\".\ntypedef struct {\n  // private_impl is a placeholder field. It isn't explicitly used, except that\n  // without it, the sizeof a struct with no fields can differ across C/C++\n  // compilers, and it is undefined behavior in C99. For example, gcc says that\n  // the sizeof an empty struct is 0, and g++ says that it is 1. This leads to\n  // ABI incompatibility if a Wuffs .c file is processed by one compiler and\n  // its .h file with another compiler.\n  //\n  // Instead, we explicitly insert an otherwise unused field, so that the\n  // sizeof this struct is always 1.\n  uint8_t private_impl;\n} wuffs_base__empty_struct;\n\nstatic inline wuffs_base__empty_struct  //\nwuffs_base__make_empty_struct() {\n  wuffs_base__empty_struct ret;\n  ret.private_impl = 0;\n  return ret;\n}\n\n// wuffs_base__utility is" +
 	" a placeholder receiver type. It enables what Java\n// calls static methods, as opposed to regular methods.\ntypedef struct {\n  // private_impl is a placeholder field. It isn't explicitly used, except that\n  // without it, the sizeof a struct with no fields can differ across C/C++\n  // compilers, and it is undefined behavior in C99. For example, gcc says that\n  // the sizeof an empty struct is 0, and g++ says that it is 1. This leads to\n  // ABI incompatibility if a Wuffs .c file is processed by one compiler and\n  // its .h file with another compiler.\n  //\n  // Instead, we explicitly insert an otherwise unused field, so that the\n  // sizeof this struct is always 1.\n  uint8_t private_impl;\n} wuffs_base__utility;\n\n" +
 	"" +
-	"// --------\n\n// See https://github.com/google/wuffs/blob/master/doc/note/statuses.md\ntypedef const char* wuffs_base__status;\n\n// !! INSERT wuffs_base__status names.\n\nstatic inline wuffs_base__status  //\nwuffs_base__make_status(const char* repr) {\n  return repr;\n}\n\nstatic inline bool  //\nwuffs_base__status__is_complete(wuffs_base__status z) {\n  return (z == NULL) || ((*z != '$') && (*z != '#'));\n}\n\nstatic inline bool  //\nwuffs_base__status__is_error(wuffs_base__status z) {\n  return z && (*z == '#');\n}\n\nstatic inline bool  //\nwuffs_base__status__is_ok(wuffs_base__status z) {\n  return z == NULL;\n}\n\nstatic inline bool  //\nwuffs_base__status__is_suspension(wuffs_base__status z) {\n  return z && (*z == '$');\n}\n\nstatic inline bool  //\nwuffs_base__status__is_warning(wuffs_base__status z) {\n  return z && (*z != '$') && (*z != '#');\n}\n\n// wuffs_base__status__message strips the leading '$', '#' or '@'.\nstatic inline const char*  //\nwuffs_base__status__message(wuffs_base__status z) {\n  if (z) {\n    if ((*z == '$') || (*z " +
-	"== '#') || (*z == '@')) {\n      return z + 1;\n    }\n  }\n  return z;\n}\n\n" +
+	"// --------\n\n// See https://github.com/google/wuffs/blob/master/doc/note/statuses.md\ntypedef struct {\n  const char* repr;\n\n#ifdef __cplusplus\n  inline bool is_complete() const;\n  inline bool is_error() const;\n  inline bool is_ok() const;\n  inline bool is_suspension() const;\n  inline bool is_warning() const;\n  inline const char* message() const;\n#endif  // __cplusplus\n\n} wuffs_base__status;\n\n// !! INSERT wuffs_base__status names.\n\nstatic inline wuffs_base__status  //\nwuffs_base__make_status(const char* repr) {\n  wuffs_base__status z;\n  z.repr = repr;\n  return z;\n}\n\nstatic inline bool  //\nwuffs_base__status__is_complete(const wuffs_base__status* z) {\n  return (z->repr == NULL) || ((*z->repr != '$') && (*z->repr != '#'));\n}\n\nstatic inline bool  //\nwuffs_base__status__is_error(const wuffs_base__status* z) {\n  return z->repr && (*z->repr == '#');\n}\n\nstatic inline bool  //\nwuffs_base__status__is_ok(const wuffs_base__status* z) {\n  return z->repr == NULL;\n}\n\nstatic inline bool  //\nwuffs_base__status__is_suspension(c" +
+	"onst wuffs_base__status* z) {\n  return z->repr && (*z->repr == '$');\n}\n\nstatic inline bool  //\nwuffs_base__status__is_warning(const wuffs_base__status* z) {\n  return z->repr && (*z->repr != '$') && (*z->repr != '#');\n}\n\n// wuffs_base__status__message strips the leading '$', '#' or '@'.\nstatic inline const char*  //\nwuffs_base__status__message(const wuffs_base__status* z) {\n  if (z->repr) {\n    if ((*z->repr == '$') || (*z->repr == '#') || (*z->repr == '@')) {\n      return z->repr + 1;\n    }\n  }\n  return z->repr;\n}\n\n#ifdef __cplusplus\n\ninline bool  //\nwuffs_base__status::is_complete() const {\n  return wuffs_base__status__is_complete(this);\n}\n\ninline bool  //\nwuffs_base__status::is_error() const {\n  return wuffs_base__status__is_error(this);\n}\n\ninline bool  //\nwuffs_base__status::is_ok() const {\n  return wuffs_base__status__is_ok(this);\n}\n\ninline bool  //\nwuffs_base__status::is_suspension() const {\n  return wuffs_base__status__is_suspension(this);\n}\n\ninline bool  //\nwuffs_base__status::is_warning() const {\n  re" +
+	"turn wuffs_base__status__is_warning(this);\n}\n\ninline const char*  //\nwuffs_base__status::message() const {\n  return wuffs_base__status__message(this);\n}\n\n#endif  // __cplusplus\n\n" +
 	"" +
 	"// --------\n\n// FourCC constants.\n\n// !! INSERT FourCCs.\n\n" +
 	"" +
diff --git a/internal/cgen/expr.go b/internal/cgen/expr.go
index 97ca01b..d87a7e8 100644
--- a/internal/cgen/expr.go
+++ b/internal/cgen/expr.go
@@ -276,14 +276,24 @@
 	if err := g.writeExpr(b, n.LHS().AsExpr(), depth); err != nil {
 		return err
 	}
+	if g.hasRepr(n.LHS().AsExpr()) {
+		b.writes(".repr")
+	}
 	b.writes(opName)
 	if err := g.writeExpr(b, n.RHS().AsExpr(), depth); err != nil {
 		return err
 	}
+	if g.hasRepr(n.RHS().AsExpr()) {
+		b.writes(".repr")
+	}
 	b.writeb(')')
 	return nil
 }
 
+func (g *gen) hasRepr(n *a.Expr) bool {
+	return n.MType().IsStatus()
+}
+
 func (g *gen) writeExprAs(b *buffer, lhs *a.Expr, rhs *a.TypeExpr, depth uint32) error {
 	b.writes("((")
 	// TODO: watch for passing an array type to writeCTypeName? In C, an array
@@ -325,8 +335,6 @@
 	recvTyp, addr := recv.MType(), "&"
 	if p := recvTyp.Decorator(); p == t.IDNptr || p == t.IDPtr {
 		recvTyp, addr = recvTyp.Inner(), ""
-	} else if recvTyp.IsStatus() {
-		addr = ""
 	}
 	if recvTyp.Decorator() != 0 {
 		return fmt.Errorf("cannot generate user-defined method call %q for receiver type %q",
diff --git a/internal/cgen/func.go b/internal/cgen/func.go
index 154a426..e754e9f 100644
--- a/internal/cgen/func.go
+++ b/internal/cgen/func.go
@@ -371,11 +371,11 @@
 		b.writes("goto suspend;suspend:") // The goto avoids the "unused label" warning.
 
 		b.printf("self->private_impl.%s%s[0] = "+
-			"wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;\n",
+			"wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;\n",
 			pPrefix, g.currFunk.astFunc.FuncName().Str(g.tm))
 		if g.currFunk.astFunc.Public() {
 			b.printf("self->private_impl.active_coroutine = "+
-				"wuffs_base__status__is_suspension(status) ? %d : 0;\n", g.currFunk.coroID)
+				"wuffs_base__status__is_suspension(&status) ? %d : 0;\n", g.currFunk.coroID)
 		}
 		if err := g.writeResumeSuspend(b, &g.currFunk, true); err != nil {
 			return err
@@ -406,7 +406,7 @@
 		(g.currFunk.returnsStatus && (len(g.currFunk.derivedVars) > 0)) {
 
 		if g.currFunk.astFunc.Public() {
-			b.writes("if (wuffs_base__status__is_error(status)) { " +
+			b.writes("if (wuffs_base__status__is_error(&status)) { " +
 				"self->private_impl.magic = WUFFS_BASE__DISABLED; }\n")
 		}
 		b.writes("return status;\n")
diff --git a/internal/cgen/statement.go b/internal/cgen/statement.go
index 225e720..ff2472d 100644
--- a/internal/cgen/statement.go
+++ b/internal/cgen/statement.go
@@ -162,7 +162,7 @@
 		}
 
 		if op != t.IDEqQuestion && rhs.Effect().Coroutine() {
-			b.writes("if (status) { goto suspend; }\n")
+			b.writes("if (status.repr) { goto suspend; }\n")
 		}
 	}
 
@@ -464,8 +464,8 @@
 		} else {
 			g.currFunk.hasGotoOK = true
 			// TODO: the "goto exit"s can be "goto ok".
-			b.writes("if (wuffs_base__status__is_error(status)) { goto exit; }" +
-				"else if (wuffs_base__status__is_suspension(status)) { " +
+			b.writes("if (wuffs_base__status__is_error(&status)) { goto exit; }" +
+				"else if (wuffs_base__status__is_suspension(&status)) { " +
 				"status = wuffs_base__make_status(wuffs_base__error__cannot_return_a_suspension); goto exit; } goto ok;")
 		}
 		return nil
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 42f7f35..6a3228c 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -157,7 +157,19 @@
 // --------
 
 // See https://github.com/google/wuffs/blob/master/doc/note/statuses.md
-typedef const char* wuffs_base__status;
+typedef struct {
+  const char* repr;
+
+#ifdef __cplusplus
+  inline bool is_complete() const;
+  inline bool is_error() const;
+  inline bool is_ok() const;
+  inline bool is_suspension() const;
+  inline bool is_warning() const;
+  inline const char* message() const;
+#endif  // __cplusplus
+
+} wuffs_base__status;
 
 extern const char* wuffs_base__warning__end_of_data;
 extern const char* wuffs_base__warning__metadata_reported;
@@ -183,45 +195,81 @@
 
 static inline wuffs_base__status  //
 wuffs_base__make_status(const char* repr) {
-  return repr;
+  wuffs_base__status z;
+  z.repr = repr;
+  return z;
 }
 
 static inline bool  //
-wuffs_base__status__is_complete(wuffs_base__status z) {
-  return (z == NULL) || ((*z != '$') && (*z != '#'));
+wuffs_base__status__is_complete(const wuffs_base__status* z) {
+  return (z->repr == NULL) || ((*z->repr != '$') && (*z->repr != '#'));
 }
 
 static inline bool  //
-wuffs_base__status__is_error(wuffs_base__status z) {
-  return z && (*z == '#');
+wuffs_base__status__is_error(const wuffs_base__status* z) {
+  return z->repr && (*z->repr == '#');
 }
 
 static inline bool  //
-wuffs_base__status__is_ok(wuffs_base__status z) {
-  return z == NULL;
+wuffs_base__status__is_ok(const wuffs_base__status* z) {
+  return z->repr == NULL;
 }
 
 static inline bool  //
-wuffs_base__status__is_suspension(wuffs_base__status z) {
-  return z && (*z == '$');
+wuffs_base__status__is_suspension(const wuffs_base__status* z) {
+  return z->repr && (*z->repr == '$');
 }
 
 static inline bool  //
-wuffs_base__status__is_warning(wuffs_base__status z) {
-  return z && (*z != '$') && (*z != '#');
+wuffs_base__status__is_warning(const wuffs_base__status* z) {
+  return z->repr && (*z->repr != '$') && (*z->repr != '#');
 }
 
 // wuffs_base__status__message strips the leading '$', '#' or '@'.
 static inline const char*  //
-wuffs_base__status__message(wuffs_base__status z) {
-  if (z) {
-    if ((*z == '$') || (*z == '#') || (*z == '@')) {
-      return z + 1;
+wuffs_base__status__message(const wuffs_base__status* z) {
+  if (z->repr) {
+    if ((*z->repr == '$') || (*z->repr == '#') || (*z->repr == '@')) {
+      return z->repr + 1;
     }
   }
-  return z;
+  return z->repr;
 }
 
+#ifdef __cplusplus
+
+inline bool  //
+wuffs_base__status::is_complete() const {
+  return wuffs_base__status__is_complete(this);
+}
+
+inline bool  //
+wuffs_base__status::is_error() const {
+  return wuffs_base__status__is_error(this);
+}
+
+inline bool  //
+wuffs_base__status::is_ok() const {
+  return wuffs_base__status__is_ok(this);
+}
+
+inline bool  //
+wuffs_base__status::is_suspension() const {
+  return wuffs_base__status__is_suspension(this);
+}
+
+inline bool  //
+wuffs_base__status::is_warning() const {
+  return wuffs_base__status__is_warning(this);
+}
+
+inline const char*  //
+wuffs_base__status::message() const {
+  return wuffs_base__status__message(this);
+}
+
+#endif  // __cplusplus
+
 // --------
 
 // FourCC constants.
@@ -3817,9 +3865,9 @@
   case n:;
 
 #define WUFFS_BASE__COROUTINE_SUSPENSION_POINT_MAYBE_SUSPEND(n) \
-  if (!status) {                                                \
+  if (!status.repr) {                                           \
     goto ok;                                                    \
-  } else if (*status != '$') {                                  \
+  } else if (*status.repr != '$') {                             \
     goto exit;                                                  \
   }                                                             \
   coro_susp_point = n;                                          \
@@ -6242,11 +6290,11 @@
         }
         v_status = t_0;
       }
-      if (!wuffs_base__status__is_suspension(v_status)) {
+      if (!wuffs_base__status__is_suspension(&v_status)) {
         status = v_status;
-        if (wuffs_base__status__is_error(status)) {
+        if (wuffs_base__status__is_error(&status)) {
           goto exit;
-        } else if (wuffs_base__status__is_suspension(status)) {
+        } else if (wuffs_base__status__is_suspension(&status)) {
           status = wuffs_base__make_status(
               wuffs_base__error__cannot_return_a_suspension);
           goto exit;
@@ -6269,9 +6317,9 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_io_writer[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
-      wuffs_base__status__is_suspension(status) ? 1 : 0;
+      wuffs_base__status__is_suspension(&status) ? 1 : 0;
 
   goto exit;
 exit:
@@ -6279,7 +6327,7 @@
     a_dst->meta.wi = ((size_t)(iop_a_dst - a_dst->data.ptr));
   }
 
-  if (wuffs_base__status__is_error(status)) {
+  if (wuffs_base__status__is_error(&status)) {
     self->private_impl.magic = WUFFS_BASE__DISABLED;
   }
   return status;
@@ -6346,17 +6394,17 @@
         if (a_src) {
           iop_a_src = a_src->data.ptr + a_src->meta.ri;
         }
-        if (status) {
+        if (status.repr) {
           goto suspend;
         }
         goto label_0_continue;
       } else if (v_type == 1) {
         v_status = wuffs_deflate__decoder__init_fixed_huffman(self);
-        if (!wuffs_base__status__is_ok(v_status)) {
+        if (!wuffs_base__status__is_ok(&v_status)) {
           status = v_status;
-          if (wuffs_base__status__is_error(status)) {
+          if (wuffs_base__status__is_error(&status)) {
             goto exit;
-          } else if (wuffs_base__status__is_suspension(status)) {
+          } else if (wuffs_base__status__is_suspension(&status)) {
             status = wuffs_base__make_status(
                 wuffs_base__error__cannot_return_a_suspension);
             goto exit;
@@ -6372,7 +6420,7 @@
         if (a_src) {
           iop_a_src = a_src->data.ptr + a_src->meta.ri;
         }
-        if (status) {
+        if (status.repr) {
           goto suspend;
         }
       } else {
@@ -6389,7 +6437,7 @@
         if (a_src) {
           iop_a_src = a_src->data.ptr + a_src->meta.ri;
         }
-        if (wuffs_base__status__is_error(v_status)) {
+        if (wuffs_base__status__is_error(&v_status)) {
           status = v_status;
           goto exit;
         }
@@ -6405,7 +6453,7 @@
         if (a_src) {
           iop_a_src = a_src->data.ptr + a_src->meta.ri;
         }
-        if (status) {
+        if (status.repr) {
           goto suspend;
         }
         if (self->private_impl.f_end_of_block) {
@@ -6423,7 +6471,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_blocks[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_data.s_decode_blocks[0].v_final = v_final;
 
   goto exit;
@@ -6549,7 +6597,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_uncompressed[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_data.s_decode_uncompressed[0].v_length = v_length;
 
   goto exit;
@@ -6592,11 +6640,11 @@
     v_i += 1;
   }
   v_status = wuffs_deflate__decoder__init_huff(self, 0, 0, 288, 257);
-  if (wuffs_base__status__is_error(v_status)) {
+  if (wuffs_base__status__is_error(&v_status)) {
     return v_status;
   }
   v_status = wuffs_deflate__decoder__init_huff(self, 1, 288, 320, 0);
-  if (wuffs_base__status__is_error(v_status)) {
+  if (wuffs_base__status__is_error(&v_status)) {
     return v_status;
   }
   return wuffs_base__make_status(NULL);
@@ -6715,7 +6763,7 @@
       v_i += 1;
     }
     v_status = wuffs_deflate__decoder__init_huff(self, 0, 0, 19, 4095);
-    if (wuffs_base__status__is_error(v_status)) {
+    if (wuffs_base__status__is_error(&v_status)) {
       status = v_status;
       goto exit;
     }
@@ -6820,13 +6868,13 @@
       goto exit;
     }
     v_status = wuffs_deflate__decoder__init_huff(self, 0, 0, v_n_lit, 257);
-    if (wuffs_base__status__is_error(v_status)) {
+    if (wuffs_base__status__is_error(&v_status)) {
       status = v_status;
       goto exit;
     }
     v_status = wuffs_deflate__decoder__init_huff(self, 1, v_n_lit,
                                                  (v_n_lit + v_n_dist), 0);
-    if (wuffs_base__status__is_error(v_status)) {
+    if (wuffs_base__status__is_error(&v_status)) {
       status = v_status;
       goto exit;
     }
@@ -6842,7 +6890,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_init_dynamic_huffman[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_data.s_init_dynamic_huffman[0].v_bits = v_bits;
   self->private_data.s_init_dynamic_huffman[0].v_n_bits = v_n_bits;
   self->private_data.s_init_dynamic_huffman[0].v_n_lit = v_n_lit;
@@ -7827,7 +7875,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_huffman_slow[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_data.s_decode_huffman_slow[0].v_bits = v_bits;
   self->private_data.s_decode_huffman_slow[0].v_n_bits = v_n_bits;
   self->private_data.s_decode_huffman_slow[0].v_table_entry = v_table_entry;
@@ -8030,7 +8078,7 @@
       if (self->private_impl.f_output_wi > 0) {
         WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
         status = wuffs_lzw__decoder__write_to(self, a_dst);
-        if (status) {
+        if (status.repr) {
           goto suspend;
         }
       }
@@ -8061,13 +8109,13 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_io_writer[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
-      wuffs_base__status__is_suspension(status) ? 1 : 0;
+      wuffs_base__status__is_suspension(&status) ? 1 : 0;
 
   goto exit;
 exit:
-  if (wuffs_base__status__is_error(status)) {
+  if (wuffs_base__status__is_error(&status)) {
     self->private_impl.magic = WUFFS_BASE__DISABLED;
   }
   return status;
@@ -8326,7 +8374,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_write_to[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
 
   goto exit;
 exit:
@@ -8525,7 +8573,7 @@
     wuffs_base__status z = wuffs_lzw__decoder__initialize(
         &self->private_data.f_lzw, sizeof(self->private_data.f_lzw),
         WUFFS_VERSION, initialize_flags);
-    if (z) {
+    if (z.repr) {
       return z;
     }
   }
@@ -8614,12 +8662,12 @@
     if (self->private_impl.f_call_sequence == 0) {
       WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
       status = wuffs_gif__decoder__decode_header(self, a_src);
-      if (status) {
+      if (status.repr) {
         goto suspend;
       }
       WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
       status = wuffs_gif__decoder__decode_lsd(self, a_src);
-      if (status) {
+      if (status.repr) {
         goto suspend;
       }
     } else if (self->private_impl.f_call_sequence != 2) {
@@ -8628,7 +8676,7 @@
     }
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
     status = wuffs_gif__decoder__decode_up_to_id_part1(self, a_src);
-    if (status) {
+    if (status.repr) {
       goto suspend;
     }
     v_ffio = !self->private_impl.f_gc_has_transparent_index;
@@ -8662,13 +8710,13 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_image_config[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
-      wuffs_base__status__is_suspension(status) ? 1 : 0;
+      wuffs_base__status__is_suspension(&status) ? 1 : 0;
 
   goto exit;
 exit:
-  if (wuffs_base__status__is_error(status)) {
+  if (wuffs_base__status__is_error(&status)) {
     self->private_impl.magic = WUFFS_BASE__DISABLED;
   }
   return status;
@@ -8786,9 +8834,9 @@
   goto suspend;
 suspend:
   self->private_impl.p_ack_metadata_chunk[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
-      wuffs_base__status__is_suspension(status) ? 2 : 0;
+      wuffs_base__status__is_suspension(&status) ? 2 : 0;
 
   goto exit;
 exit:
@@ -8796,7 +8844,7 @@
     a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
   }
 
-  if (wuffs_base__status__is_error(status)) {
+  if (wuffs_base__status__is_error(&status)) {
     self->private_impl.magic = WUFFS_BASE__DISABLED;
   }
   return status;
@@ -9011,7 +9059,7 @@
         if (a_src) {
           iop_a_src = a_src->data.ptr + a_src->meta.ri;
         }
-        if (status) {
+        if (status.repr) {
           goto suspend;
         }
       } else if (self->private_impl.f_call_sequence != 3) {
@@ -9024,7 +9072,7 @@
           if (a_src) {
             iop_a_src = a_src->data.ptr + a_src->meta.ri;
           }
-          if (status) {
+          if (status.repr) {
             goto suspend;
           }
         }
@@ -9036,7 +9084,7 @@
         if (a_src) {
           iop_a_src = a_src->data.ptr + a_src->meta.ri;
         }
-        if (status) {
+        if (status.repr) {
           goto suspend;
         }
       }
@@ -9094,9 +9142,9 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_frame_config[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
-      wuffs_base__status__is_suspension(status) ? 3 : 0;
+      wuffs_base__status__is_suspension(&status) ? 3 : 0;
   self->private_data.s_decode_frame_config[0].v_blend = v_blend;
   self->private_data.s_decode_frame_config[0].v_background_color =
       v_background_color;
@@ -9107,7 +9155,7 @@
     a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
   }
 
-  if (wuffs_base__status__is_error(status)) {
+  if (wuffs_base__status__is_error(&status)) {
     self->private_impl.magic = WUFFS_BASE__DISABLED;
   }
   return status;
@@ -9184,7 +9232,7 @@
     if (a_src) {
       iop_a_src = a_src->data.ptr + a_src->meta.ri;
     }
-    if (status) {
+    if (status.repr) {
       goto suspend;
     }
     if (self->private_impl.f_quirk_enabled_delay_num_decoded_frames) {
@@ -9204,7 +9252,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_skip_frame[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
 
   goto exit;
 exit:
@@ -9255,7 +9303,7 @@
     if (self->private_impl.f_call_sequence != 4) {
       WUFFS_BASE__COROUTINE_SUSPENSION_POINT(1);
       status = wuffs_gif__decoder__decode_frame_config(self, NULL, a_src);
-      if (status) {
+      if (status.repr) {
         goto suspend;
       }
     }
@@ -9269,12 +9317,12 @@
     }
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT(2);
     status = wuffs_gif__decoder__decode_id_part1(self, a_dst, a_src);
-    if (status) {
+    if (status.repr) {
       goto suspend;
     }
     WUFFS_BASE__COROUTINE_SUSPENSION_POINT(3);
     status = wuffs_gif__decoder__decode_id_part2(self, a_dst, a_src, a_workbuf);
-    if (status) {
+    if (status.repr) {
       goto suspend;
     }
     wuffs_base__u64__sat_add_indirect(
@@ -9290,13 +9338,13 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_frame[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
-      wuffs_base__status__is_suspension(status) ? 4 : 0;
+      wuffs_base__status__is_suspension(&status) ? 4 : 0;
 
   goto exit;
 exit:
-  if (wuffs_base__status__is_error(status)) {
+  if (wuffs_base__status__is_error(&status)) {
     self->private_impl.magic = WUFFS_BASE__DISABLED;
   }
   return status;
@@ -9373,7 +9421,7 @@
         if (a_src) {
           iop_a_src = a_src->data.ptr + a_src->meta.ri;
         }
-        if (status) {
+        if (status.repr) {
           goto suspend;
         }
       } else if (v_block_type == 44) {
@@ -9390,7 +9438,7 @@
         if (a_src) {
           iop_a_src = a_src->data.ptr + a_src->meta.ri;
         }
-        if (status) {
+        if (status.repr) {
           goto suspend;
         }
         goto label_0_break;
@@ -9418,7 +9466,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_up_to_id_part1[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
 
   goto exit;
 exit:
@@ -9485,7 +9533,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_header[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   memcpy(self->private_data.s_decode_header[0].v_c, v_c, sizeof(v_c));
   self->private_data.s_decode_header[0].v_i = v_i;
 
@@ -9700,7 +9748,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_lsd[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_data.s_decode_lsd[0].v_flags = v_flags;
   self->private_data.s_decode_lsd[0].v_background_color_index =
       v_background_color_index;
@@ -9761,7 +9809,7 @@
       if (a_src) {
         iop_a_src = a_src->data.ptr + a_src->meta.ri;
       }
-      if (status) {
+      if (status.repr) {
         goto suspend;
       }
       status = wuffs_base__make_status(NULL);
@@ -9775,7 +9823,7 @@
       if (a_src) {
         iop_a_src = a_src->data.ptr + a_src->meta.ri;
       }
-      if (status) {
+      if (status.repr) {
         goto suspend;
       }
       status = wuffs_base__make_status(NULL);
@@ -9789,7 +9837,7 @@
     if (a_src) {
       iop_a_src = a_src->data.ptr + a_src->meta.ri;
     }
-    if (status) {
+    if (status.repr) {
       goto suspend;
     }
 
@@ -9802,7 +9850,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_extension[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
 
   goto exit;
 exit:
@@ -9875,7 +9923,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_skip_blocks[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
 
   goto exit;
 exit:
@@ -10120,7 +10168,7 @@
     if (a_src) {
       iop_a_src = a_src->data.ptr + a_src->meta.ri;
     }
-    if (status) {
+    if (status.repr) {
       goto suspend;
     }
 
@@ -10133,7 +10181,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_ae[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_data.s_decode_ae[0].v_block_size = v_block_size;
   self->private_data.s_decode_ae[0].v_is_animexts = v_is_animexts;
   self->private_data.s_decode_ae[0].v_is_netscape = v_is_netscape;
@@ -10272,7 +10320,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_gc[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
 
   goto exit;
 exit:
@@ -10448,7 +10496,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_id_part0[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
 
   goto exit;
 exit:
@@ -10601,11 +10649,11 @@
         1191444488,
         wuffs_base__make_slice_u8(
             self->private_data.f_palettes[v_which_palette], 1024));
-    if (!wuffs_base__status__is_ok(v_status)) {
+    if (!wuffs_base__status__is_ok(&v_status)) {
       status = v_status;
-      if (wuffs_base__status__is_error(status)) {
+      if (wuffs_base__status__is_error(&status)) {
         goto exit;
-      } else if (wuffs_base__status__is_suspension(status)) {
+      } else if (wuffs_base__status__is_suspension(&status)) {
         status = wuffs_base__make_status(
             wuffs_base__error__cannot_return_a_suspension);
         goto exit;
@@ -10643,7 +10691,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_id_part1[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_data.s_decode_id_part1[0].v_which_palette = v_which_palette;
   self->private_data.s_decode_id_part1[0].v_num_palette_entries =
       v_num_palette_entries;
@@ -10810,12 +10858,12 @@
         if (((uint64_t)(v_uncompressed.len)) > 0) {
           v_copy_status = wuffs_gif__decoder__copy_to_image_buffer(
               self, a_dst, v_uncompressed);
-          if (wuffs_base__status__is_error(v_copy_status)) {
+          if (wuffs_base__status__is_error(&v_copy_status)) {
             status = v_copy_status;
             goto exit;
           }
         }
-        if (wuffs_base__status__is_ok(v_lzw_status)) {
+        if (wuffs_base__status__is_ok(&v_lzw_status)) {
           self->private_impl.f_previous_lzw_decode_ended_abruptly = false;
           if (v_need_block_size || (v_block_size > 0)) {
             self->private_data.s_decode_id_part2[0].scratch =
@@ -10839,22 +10887,24 @@
             if (a_src) {
               iop_a_src = a_src->data.ptr + a_src->meta.ri;
             }
-            if (status) {
+            if (status.repr) {
               goto suspend;
             }
           }
           goto label_0_break;
-        } else if (v_lzw_status == wuffs_base__make_status(
-                                       wuffs_base__suspension__short_read)) {
+        } else if (v_lzw_status.repr ==
+                   wuffs_base__make_status(wuffs_base__suspension__short_read)
+                       .repr) {
           goto label_0_continue;
-        } else if (v_lzw_status == wuffs_base__make_status(
-                                       wuffs_base__suspension__short_write)) {
+        } else if (v_lzw_status.repr ==
+                   wuffs_base__make_status(wuffs_base__suspension__short_write)
+                       .repr) {
           goto label_2_continue;
         }
         status = v_lzw_status;
-        if (wuffs_base__status__is_error(status)) {
+        if (wuffs_base__status__is_error(&status)) {
           goto exit;
-        } else if (wuffs_base__status__is_suspension(status)) {
+        } else if (wuffs_base__status__is_suspension(&status)) {
           status = wuffs_base__make_status(
               wuffs_base__error__cannot_return_a_suspension);
           goto exit;
@@ -10883,7 +10933,7 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_id_part2[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_data.s_decode_id_part2[0].v_block_size = v_block_size;
   self->private_data.s_decode_id_part2[0].v_need_block_size = v_need_block_size;
   self->private_data.s_decode_id_part2[0].v_lzw_status = v_lzw_status;
@@ -11125,7 +11175,7 @@
     wuffs_base__status z = wuffs_crc32__ieee_hasher__initialize(
         &self->private_data.f_checksum, sizeof(self->private_data.f_checksum),
         WUFFS_VERSION, initialize_flags);
-    if (z) {
+    if (z.repr) {
       return z;
     }
   }
@@ -11133,7 +11183,7 @@
     wuffs_base__status z = wuffs_deflate__decoder__initialize(
         &self->private_data.f_flate, sizeof(self->private_data.f_flate),
         WUFFS_VERSION, initialize_flags);
-    if (z) {
+    if (z.repr) {
       return z;
     }
   }
@@ -11438,7 +11488,7 @@
                              v_mark, ((uint64_t)(iop_a_dst - io0_a_dst))) &
                          4294967295)));
       }
-      if (wuffs_base__status__is_ok(v_status)) {
+      if (wuffs_base__status__is_ok(&v_status)) {
         goto label_2_break;
       }
       status = v_status;
@@ -11521,9 +11571,9 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_io_writer[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
-      wuffs_base__status__is_suspension(status) ? 1 : 0;
+      wuffs_base__status__is_suspension(&status) ? 1 : 0;
   self->private_data.s_decode_io_writer[0].v_flags = v_flags;
   self->private_data.s_decode_io_writer[0].v_checksum_got = v_checksum_got;
   self->private_data.s_decode_io_writer[0].v_decoded_length_got =
@@ -11539,7 +11589,7 @@
     a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
   }
 
-  if (wuffs_base__status__is_error(status)) {
+  if (wuffs_base__status__is_error(&status)) {
     self->private_impl.magic = WUFFS_BASE__DISABLED;
   }
   return status;
@@ -11615,7 +11665,7 @@
     wuffs_base__status z = wuffs_adler32__hasher__initialize(
         &self->private_data.f_checksum, sizeof(self->private_data.f_checksum),
         WUFFS_VERSION, initialize_flags);
-    if (z) {
+    if (z.repr) {
       return z;
     }
   }
@@ -11624,7 +11674,7 @@
         &self->private_data.f_dict_id_hasher,
         sizeof(self->private_data.f_dict_id_hasher), WUFFS_VERSION,
         initialize_flags);
-    if (z) {
+    if (z.repr) {
       return z;
     }
   }
@@ -11632,7 +11682,7 @@
     wuffs_base__status z = wuffs_deflate__decoder__initialize(
         &self->private_data.f_flate, sizeof(self->private_data.f_flate),
         WUFFS_VERSION, initialize_flags);
-    if (z) {
+    if (z.repr) {
       return z;
     }
   }
@@ -11909,7 +11959,7 @@
             wuffs_base__io__since(v_mark, ((uint64_t)(iop_a_dst - io0_a_dst)),
                                   io0_a_dst));
       }
-      if (wuffs_base__status__is_ok(v_status)) {
+      if (wuffs_base__status__is_ok(&v_status)) {
         goto label_0_break;
       }
       status = v_status;
@@ -11961,9 +12011,9 @@
   goto suspend;
 suspend:
   self->private_impl.p_decode_io_writer[0] =
-      wuffs_base__status__is_suspension(status) ? coro_susp_point : 0;
+      wuffs_base__status__is_suspension(&status) ? coro_susp_point : 0;
   self->private_impl.active_coroutine =
-      wuffs_base__status__is_suspension(status) ? 1 : 0;
+      wuffs_base__status__is_suspension(&status) ? 1 : 0;
   self->private_data.s_decode_io_writer[0].v_checksum_got = v_checksum_got;
 
   goto exit;
@@ -11975,7 +12025,7 @@
     a_src->meta.ri = ((size_t)(iop_a_src - a_src->data.ptr));
   }
 
-  if (wuffs_base__status__is_error(status)) {
+  if (wuffs_base__status__is_error(&status)) {
     self->private_impl.magic = WUFFS_BASE__DISABLED;
   }
   return status;
diff --git a/test/c/std/adler32.c b/test/c/std/adler32.c
index 8c76737..4f4a653 100644
--- a/test/c/std/adler32.c
+++ b/test/c/std/adler32.c
@@ -133,8 +133,8 @@
       wuffs_base__status status = wuffs_adler32__hasher__initialize(
           &checksum, sizeof checksum, WUFFS_VERSION,
           WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-      if (status) {
-        RETURN_FAIL("initialize: \"%s\"", status);
+      if (!wuffs_base__status__is_ok(&status)) {
+        RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
       }
 
       uint32_t got = 0;
@@ -201,11 +201,11 @@
   int i;
   for (i = 0; i < 100; i++) {
     wuffs_adler32__hasher checksum;
-    const char* status = wuffs_adler32__hasher__initialize(
+    wuffs_base__status status = wuffs_adler32__hasher__initialize(
         &checksum, sizeof checksum, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("initialize: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
     }
     uint32_t got = wuffs_adler32__hasher__update_u32(
         &checksum, ((wuffs_base__slice_u8){
@@ -234,10 +234,10 @@
     len = wuffs_base__u64__min(len, rlimit);
   }
   wuffs_adler32__hasher checksum;
-  const char* status = wuffs_adler32__hasher__initialize(
+  wuffs_base__status status = wuffs_adler32__hasher__initialize(
       &checksum, sizeof checksum, WUFFS_VERSION, wuffs_initialize_flags);
-  if (status) {
-    return status;
+  if (!wuffs_base__status__is_ok(&status)) {
+    return wuffs_base__status__message(&status);
   }
   global_wuffs_adler32_unused_u32 = wuffs_adler32__hasher__update_u32(
       &checksum, ((wuffs_base__slice_u8){
diff --git a/test/c/std/crc32.c b/test/c/std/crc32.c
index 32c9ad7..c85ce43 100644
--- a/test/c/std/crc32.c
+++ b/test/c/std/crc32.c
@@ -133,8 +133,8 @@
       wuffs_base__status status = wuffs_crc32__ieee_hasher__initialize(
           &checksum, sizeof checksum, WUFFS_VERSION,
           WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-      if (status) {
-        RETURN_FAIL("initialize: \"%s\"", status);
+      if (!wuffs_base__status__is_ok(&status)) {
+        RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
       }
 
       uint32_t got = 0;
@@ -222,11 +222,11 @@
 
     } else {
       wuffs_crc32__ieee_hasher checksum;
-      const char* status = wuffs_crc32__ieee_hasher__initialize(
+      wuffs_base__status status = wuffs_crc32__ieee_hasher__initialize(
           &checksum, sizeof checksum, WUFFS_VERSION,
           WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-      if (status) {
-        RETURN_FAIL("initialize: \"%s\"", status);
+      if (!wuffs_base__status__is_ok(&status)) {
+        RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
       }
       got = wuffs_crc32__ieee_hasher__update_u32(&checksum, data);
     }
@@ -269,10 +269,10 @@
     len = wuffs_base__u64__min(len, rlimit);
   }
   wuffs_crc32__ieee_hasher checksum;
-  const char* status = wuffs_crc32__ieee_hasher__initialize(
+  wuffs_base__status status = wuffs_crc32__ieee_hasher__initialize(
       &checksum, sizeof checksum, WUFFS_VERSION, wuffs_initialize_flags);
-  if (status) {
-    return status;
+  if (!wuffs_base__status__is_ok(&status)) {
+    return wuffs_base__status__message(&status);
   }
   global_wuffs_crc32_unused_u32 = wuffs_crc32__ieee_hasher__update_u32(
       &checksum, ((wuffs_base__slice_u8){
diff --git a/test/c/std/deflate.c b/test/c/std/deflate.c
index d2d966a..f258b6e 100644
--- a/test/c/std/deflate.c
+++ b/test/c/std/deflate.c
@@ -161,10 +161,10 @@
                                  uint64_t wlimit,
                                  uint64_t rlimit) {
   wuffs_deflate__decoder dec;
-  const char* status = wuffs_deflate__decoder__initialize(
+  wuffs_base__status status = wuffs_deflate__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION, wuffs_initialize_flags);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
 
   while (true) {
@@ -178,12 +178,12 @@
     src->meta.ri += limited_src.meta.ri;
 
     if (((wlimit < UINT64_MAX) &&
-         (status == wuffs_base__suspension__short_write)) ||
+         (status.repr == wuffs_base__suspension__short_write)) ||
         ((rlimit < UINT64_MAX) &&
-         (status == wuffs_base__suspension__short_read))) {
+         (status.repr == wuffs_base__suspension__short_read))) {
       continue;
     }
-    return status;
+    return wuffs_base__status__message(&status);
   }
 }
 
@@ -219,7 +219,9 @@
   const char* got = do_test_io_buffers(wuffs_deflate_decode,
                                        &deflate_deflate_distance_code_31_gt,
                                        UINT64_MAX, UINT64_MAX);
-  if (got != wuffs_deflate__error__bad_huffman_code) {
+  // The +1 caters for wuffs_deflate_decode calling
+  // wuffs_base__status__message.
+  if (got != (wuffs_deflate__error__bad_huffman_code + 1)) {
     RETURN_FAIL("got \"%s\", want \"%s\"", got,
                 wuffs_deflate__error__bad_huffman_code);
   }
@@ -255,13 +257,14 @@
   wuffs_deflate__decoder dec;
   wuffs_base__status status = wuffs_deflate__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION, WUFFS_INITIALIZE__DEFAULT_OPTIONS);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   status = wuffs_deflate__decoder__decode_io_writer(&dec, &got, &src,
                                                     global_work_slice);
-  if (status) {
-    RETURN_FAIL("decode_io_writer: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_io_writer: \"%s\"",
+                wuffs_base__status__message(&status));
   }
 
   int i;
@@ -360,29 +363,30 @@
     wuffs_base__status status = wuffs_deflate__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("initialize: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
     }
 
     src.meta.closed = false;
     src.meta.ri = gt->src_offset0;
     src.meta.wi = split;
-    const char* z0 = wuffs_deflate__decoder__decode_io_writer(
+    wuffs_base__status z0 = wuffs_deflate__decoder__decode_io_writer(
         &dec, &got, &src, global_work_slice);
 
     src.meta.closed = true;
     src.meta.ri = split;
     src.meta.wi = gt->src_offset1;
-    const char* z1 = wuffs_deflate__decoder__decode_io_writer(
+    wuffs_base__status z1 = wuffs_deflate__decoder__decode_io_writer(
         &dec, &got, &src, global_work_slice);
 
-    if (z0 != wuffs_base__suspension__short_read) {
-      RETURN_FAIL("i=%d: z0: got \"%s\", want \"%s\"", i, z0,
+    if (z0.repr != wuffs_base__suspension__short_read) {
+      RETURN_FAIL("i=%d: z0: got \"%s\", want \"%s\"", i,
+                  wuffs_base__status__message(&z0),
                   wuffs_base__suspension__short_read);
     }
 
-    if (z1) {
-      RETURN_FAIL("i=%d: z1: got \"%s\"", i, z1);
+    if (z1.repr) {
+      RETURN_FAIL("i=%d: z1: got \"%s\"", i, wuffs_base__status__message(&z1));
     }
 
     char prefix[64];
@@ -412,13 +416,13 @@
 
   dec->private_impl.f_history_index = starting_history_index;
 
-  const char* got_z = wuffs_deflate__decoder__decode_io_writer(
+  wuffs_base__status got_z = wuffs_deflate__decoder__decode_io_writer(
       dec, &limited_got, src, global_work_slice);
   got->meta.wi += limited_got.meta.wi;
-  if (got_z != want_z) {
+  if (got_z.repr != want_z) {
     RETURN_FAIL("i=%d: starting_history_index=0x%04" PRIX32
-                ": decode status: got \"%s\", want \"%s\"",
-                i, starting_history_index, got_z, want_z);
+                ": decode: got \"%s\", want \"%s\"",
+                i, starting_history_index, got_z.repr, want_z);
   }
   return NULL;
 }
@@ -454,8 +458,8 @@
     wuffs_base__status status = wuffs_deflate__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("initialize: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
     }
 
     status_msg = do_test_wuffs_deflate_history(
@@ -535,8 +539,8 @@
     wuffs_base__status status = wuffs_deflate__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("initialize: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
     }
 
     status_msg = do_test_wuffs_deflate_history(
@@ -620,11 +624,11 @@
   // 2nd is the key in the second level table (variable bits).
 
   wuffs_deflate__decoder dec;
-  const char* status = wuffs_deflate__decoder__initialize(
+  wuffs_base__status status = wuffs_deflate__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   memset(&(dec.private_data.f_huffs), 0, sizeof(dec.private_data.f_huffs));
 
@@ -646,8 +650,8 @@
   dec.private_data.f_code_lengths[n++] = 13;
 
   status = wuffs_deflate__decoder__init_huff(&dec, 0, 0, n, 257);
-  if (status) {
-    RETURN_FAIL("init_huff: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("init_huff: \"%s\"", wuffs_base__status__message(&status));
   }
 
   // There is one 1st-level table (9 bits), and three 2nd-level tables (3, 3
diff --git a/test/c/std/gif.c b/test/c/std/gif.c
index 6aebf74..14fa3d7 100644
--- a/test/c/std/gif.c
+++ b/test/c/std/gif.c
@@ -73,9 +73,11 @@
 const char* test_basic_bad_receiver() {
   CHECK_FOCUS(__func__);
   wuffs_base__image_config ic = ((wuffs_base__image_config){});
-  const char* status = wuffs_gif__decoder__decode_image_config(NULL, &ic, NULL);
-  if (status != wuffs_base__error__bad_receiver) {
-    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status,
+  wuffs_base__status status =
+      wuffs_gif__decoder__decode_image_config(NULL, &ic, NULL);
+  if (status.repr != wuffs_base__error__bad_receiver) {
+    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"",
+                wuffs_base__status__message(&status),
                 wuffs_base__error__bad_receiver);
   }
   return NULL;
@@ -84,11 +86,12 @@
 const char* test_basic_bad_sizeof_receiver() {
   CHECK_FOCUS(__func__);
   wuffs_gif__decoder dec;
-  const char* status = wuffs_gif__decoder__initialize(
+  wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, 0, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status != wuffs_base__error__bad_sizeof_receiver) {
-    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status,
+  if (status.repr != wuffs_base__error__bad_sizeof_receiver) {
+    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"",
+                wuffs_base__status__message(&status),
                 wuffs_base__error__bad_sizeof_receiver);
   }
   return NULL;
@@ -97,11 +100,12 @@
 const char* test_basic_bad_wuffs_version() {
   CHECK_FOCUS(__func__);
   wuffs_gif__decoder dec;
-  const char* status = wuffs_gif__decoder__initialize(
+  wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION ^ 0x123456789ABC,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status != wuffs_base__error__bad_wuffs_version) {
-    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status,
+  if (status.repr != wuffs_base__error__bad_wuffs_version) {
+    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"",
+                wuffs_base__status__message(&status),
                 wuffs_base__error__bad_wuffs_version);
   }
   return NULL;
@@ -111,9 +115,11 @@
   CHECK_FOCUS(__func__);
   wuffs_gif__decoder dec = ((wuffs_gif__decoder){});
   wuffs_base__image_config ic = ((wuffs_base__image_config){});
-  const char* status = wuffs_gif__decoder__decode_image_config(&dec, &ic, NULL);
-  if (status != wuffs_base__error__initialize_not_called) {
-    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status,
+  wuffs_base__status status =
+      wuffs_gif__decoder__decode_image_config(&dec, &ic, NULL);
+  if (status.repr != wuffs_base__error__initialize_not_called) {
+    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"",
+                wuffs_base__status__message(&status),
                 wuffs_base__error__initialize_not_called);
   }
   return NULL;
@@ -121,16 +127,21 @@
 
 const char* test_basic_status_is_error() {
   CHECK_FOCUS(__func__);
-  if (wuffs_base__status__is_error(NULL)) {
+  wuffs_base__status status;
+  status.repr = NULL;
+  if (wuffs_base__status__is_error(&status)) {
     RETURN_FAIL("is_error(NULL) returned true");
   }
-  if (!wuffs_base__status__is_error(wuffs_base__error__bad_wuffs_version)) {
+  status.repr = wuffs_base__error__bad_wuffs_version;
+  if (!wuffs_base__status__is_error(&status)) {
     RETURN_FAIL("is_error(BAD_WUFFS_VERSION) returned false");
   }
-  if (wuffs_base__status__is_error(wuffs_base__suspension__short_write)) {
+  status.repr = wuffs_base__suspension__short_write;
+  if (wuffs_base__status__is_error(&status)) {
     RETURN_FAIL("is_error(SHORT_WRITE) returned true");
   }
-  if (!wuffs_base__status__is_error(wuffs_gif__error__bad_header)) {
+  status.repr = wuffs_gif__error__bad_header;
+  if (!wuffs_base__status__is_error(&status)) {
     RETURN_FAIL("is_error(BAD_HEADER) returned false");
   }
   return NULL;
@@ -171,11 +182,11 @@
 const char* test_basic_sub_struct_initializer() {
   CHECK_FOCUS(__func__);
   wuffs_gif__decoder dec;
-  const char* status = wuffs_gif__decoder__initialize(
+  wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   if (dec.private_impl.magic != WUFFS_BASE__MAGIC) {
     RETURN_FAIL("outer magic: got %" PRIu32 ", want %" PRIu32 "",
@@ -195,17 +206,18 @@
                              wuffs_base__pixel_format pixfmt,
                              wuffs_base__io_buffer* src) {
   wuffs_gif__decoder dec;
-  const char* status = wuffs_gif__decoder__initialize(
+  wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION, wuffs_initialize_flags);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
 
   wuffs_base__image_config ic = ((wuffs_base__image_config){});
   wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
   status = wuffs_gif__decoder__decode_image_config(&dec, &ic, src);
-  if (status) {
-    RETURN_FAIL("decode_image_config: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_image_config: \"%s\"",
+                wuffs_base__status__message(&status));
   }
 
   wuffs_base__pixel_config__set(&ic.pixcfg, pixfmt,
@@ -216,22 +228,23 @@
   wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
   status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                     global_pixel_slice);
-  if (status) {
-    RETURN_FAIL("set_from_slice: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("set_from_slice: \"%s\"", wuffs_base__status__message(&status));
   }
 
   while (true) {
     status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, src);
-    if (status == wuffs_base__warning__end_of_data) {
+    if (status.repr == wuffs_base__warning__end_of_data) {
       break;
-    } else if (status) {
-      RETURN_FAIL("decode_frame_config: \"%s\"", status);
+    } else if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("decode_frame_config: \"%s\"",
+                  wuffs_base__status__message(&status));
     }
 
     status = wuffs_gif__decoder__decode_frame(&dec, &pb, src, global_work_slice,
                                               NULL);
-    if (status) {
-      RETURN_FAIL("decode_frame: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("decode_frame: \"%s\"", wuffs_base__status__message(&status));
     }
 
     const char* status_msg = copy_to_io_buffer_from_pixel_buffer(
@@ -264,8 +277,8 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
 
   wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
@@ -274,8 +287,9 @@
   {
     wuffs_base__image_config ic = ((wuffs_base__image_config){});
     status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-    if (status) {
-      RETURN_FAIL("decode_image_config: got \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("decode_image_config: got \"%s\"",
+                  wuffs_base__status__message(&status));
     }
     if (wuffs_base__pixel_config__pixel_format(&ic.pixcfg) !=
         WUFFS_BASE__PIXEL_FORMAT__INDEXED__BGRA_BINARY) {
@@ -302,8 +316,9 @@
 
     status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                       global_pixel_slice);
-    if (status) {
-      RETURN_FAIL("set_from_slice: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("set_from_slice: \"%s\"",
+                  wuffs_base__status__message(&status));
     }
 
     uint32_t got = wuffs_gif__decoder__num_animation_loops(&dec);
@@ -326,11 +341,12 @@
     status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, &limited_src);
     src.meta.ri += limited_src.meta.ri;
 
-    if (!status) {
+    if (wuffs_base__status__is_ok(&status)) {
       break;
     }
-    if (status != wuffs_base__suspension__short_read) {
-      RETURN_FAIL("decode_frame_config: got \"%s\", want \"%s\"", status,
+    if (status.repr != wuffs_base__suspension__short_read) {
+      RETURN_FAIL("decode_frame_config: got \"%s\", want \"%s\"",
+                  wuffs_base__status__message(&status),
                   wuffs_base__suspension__short_read);
     }
 
@@ -347,15 +363,16 @@
     wuffs_base__io_buffer limited_src = make_limited_reader(src, rlimit);
     size_t old_ri = src.meta.ri;
 
-    const char* status = wuffs_gif__decoder__decode_frame(
+    wuffs_base__status status = wuffs_gif__decoder__decode_frame(
         &dec, &pb, &limited_src, global_work_slice, NULL);
     src.meta.ri += limited_src.meta.ri;
 
-    if (!status) {
+    if (wuffs_base__status__is_ok(&status)) {
       break;
     }
-    if (status != wuffs_base__suspension__short_read) {
-      RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status,
+    if (status.repr != wuffs_base__suspension__short_read) {
+      RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"",
+                  wuffs_base__status__message(&status),
                   wuffs_base__suspension__short_read);
     }
 
@@ -479,8 +496,9 @@
     }
     status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src,
                                               global_work_slice, NULL);
-    if (status != wuffs_base__warning__end_of_data) {
-      RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status,
+    if (status.repr != wuffs_base__warning__end_of_data) {
+      RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"",
+                  wuffs_base__status__message(&status),
                   wuffs_base__warning__end_of_data);
     }
     if (src.meta.ri != src.meta.wi) {
@@ -497,11 +515,11 @@
                                                const char* want_status,
                                                bool want_dirty_rect_is_empty) {
   wuffs_gif__decoder dec;
-  const char* status = wuffs_gif__decoder__initialize(
+  wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   if (quirk) {
     wuffs_gif__decoder__set_quirk_enabled(&dec, quirk, true);
@@ -510,21 +528,23 @@
   wuffs_base__image_config ic = ((wuffs_base__image_config){});
 
   status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-  if (status) {
-    RETURN_FAIL("decode_image_config: got \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_image_config: got \"%s\"",
+                wuffs_base__status__message(&status));
   }
 
   wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
   status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                     global_pixel_slice);
-  if (status) {
-    RETURN_FAIL("set_from_slice: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("set_from_slice: \"%s\"", wuffs_base__status__message(&status));
   }
 
   status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src, global_work_slice,
                                             NULL);
-  if (status != want_status) {
-    RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status, want_status);
+  if (status.repr != want_status) {
+    RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"",
+                wuffs_base__status__message(&status), want_status);
   }
 
   wuffs_base__rect_ie_u32 r = wuffs_gif__decoder__frame_dirty_rect(&dec);
@@ -553,16 +573,17 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
 
   {
     wuffs_base__io_buffer limited_src = make_limited_reader(src, 700);
     status = wuffs_gif__decoder__decode_frame_config(&dec, NULL, &limited_src);
     src.meta.ri += limited_src.meta.ri;
-    if (status != wuffs_base__suspension__short_read) {
-      RETURN_FAIL("decode_frame_config: got \"%s\", want \"%s\"", status,
+    if (status.repr != wuffs_base__suspension__short_read) {
+      RETURN_FAIL("decode_frame_config: got \"%s\", want \"%s\"",
+                  wuffs_base__status__message(&status),
                   wuffs_base__suspension__short_read);
     }
   }
@@ -573,8 +594,9 @@
 
   {
     status = wuffs_gif__decoder__decode_image_config(&dec, NULL, &src);
-    if (status != wuffs_base__error__interleaved_coroutine_calls) {
-      RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status,
+    if (status.repr != wuffs_base__error__interleaved_coroutine_calls) {
+      RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"",
+                  wuffs_base__status__message(&status),
                   wuffs_base__error__interleaved_coroutine_calls);
     }
   }
@@ -598,18 +620,20 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
 
   status = wuffs_gif__decoder__decode_image_config(&dec, NULL, &src);
-  if (status) {
-    RETURN_FAIL("decode_image_config: got \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_image_config: got \"%s\"",
+                wuffs_base__status__message(&status));
   }
 
   status = wuffs_gif__decoder__decode_image_config(&dec, NULL, &src);
-  if (status != wuffs_base__error__bad_call_sequence) {
-    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status,
+  if (status.repr != wuffs_base__error__bad_call_sequence) {
+    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"",
+                wuffs_base__status__message(&status),
                 wuffs_base__error__bad_call_sequence);
   }
   return NULL;
@@ -633,15 +657,16 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
 
   wuffs_base__image_config ic = ((wuffs_base__image_config){});
 
   status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-  if (status) {
-    RETURN_FAIL("decode_image_config: got \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_image_config: got \"%s\"",
+                wuffs_base__status__message(&status));
   }
 
   uint32_t got_num_loops = wuffs_gif__decoder__num_animation_loops(&dec);
@@ -653,16 +678,17 @@
   wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
   status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                     global_pixel_slice);
-  if (status) {
-    RETURN_FAIL("set_from_slice: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("set_from_slice: \"%s\"", wuffs_base__status__message(&status));
   }
 
   uint32_t i;
   for (i = 0; i < want_num_frames; i++) {
     wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
     status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
-    if (status) {
-      RETURN_FAIL("decode_frame_config #%" PRIu32 ": got \"%s\"", i, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("decode_frame_config #%" PRIu32 ": got \"%s\"", i,
+                  wuffs_base__status__message(&status));
     }
 
     if (want_frame_config_bounds) {
@@ -680,8 +706,9 @@
 
     status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src,
                                               global_work_slice, NULL);
-    if (status) {
-      RETURN_FAIL("decode_frame #%" PRIu32 ": got \"%s\"", i, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("decode_frame #%" PRIu32 ": got \"%s\"", i,
+                  wuffs_base__status__message(&status));
     }
 
     wuffs_base__rect_ie_u32 frame_rect = wuffs_base__frame_config__bounds(&fc);
@@ -697,8 +724,8 @@
   for (i = 0; i < 3; i++) {
     status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src,
                                               global_work_slice, NULL);
-    if (status != wuffs_base__warning__end_of_data) {
-      RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status,
+    if (status.repr != wuffs_base__warning__end_of_data) {
+      RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status.repr,
                   wuffs_base__warning__end_of_data);
     }
   }
@@ -772,15 +799,16 @@
     wuffs_base__status status = wuffs_gif__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("q=%d: initialize: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: initialize: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
     wuffs_gif__decoder__set_quirk_enabled(
         &dec, WUFFS_GIF__QUIRK_DELAY_NUM_DECODED_FRAMES, q);
 
     while (true) {
       status = wuffs_gif__decoder__decode_frame_config(&dec, NULL, &src);
-      if (status) {
+      if (!wuffs_base__status__is_ok(&status)) {
         break;
       }
     }
@@ -813,23 +841,26 @@
     wuffs_base__status status = wuffs_gif__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("q=%d: initialize: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: initialize: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
     wuffs_gif__decoder__set_quirk_enabled(
         &dec, WUFFS_GIF__QUIRK_REJECT_EMPTY_PALETTE, q);
 
     wuffs_base__image_config ic = ((wuffs_base__image_config){});
     status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-    if (status) {
-      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
 
     wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
     status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                       global_pixel_slice);
-    if (status) {
-      RETURN_FAIL("q=%d: set_from_slice: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: set_from_slice: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
 
     int i;
@@ -837,14 +868,16 @@
       status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src,
                                                 global_work_slice, NULL);
       if ((q == 1) && (i == 1)) {
-        if (status != wuffs_gif__error__bad_palette) {
+        if (status.repr != wuffs_gif__error__bad_palette) {
           RETURN_FAIL("q=%d: i=%d: decode_frame: got \"%s\", want \"%s\"", q, i,
-                      status, wuffs_gif__error__bad_palette);
+                      wuffs_base__status__message(&status),
+                      wuffs_gif__error__bad_palette);
         }
         break;
       }
-      if (status) {
-        RETURN_FAIL("q=%d: i=%d: decode_frame: \"%s\"", q, i, status);
+      if (!wuffs_base__status__is_ok(&status)) {
+        RETURN_FAIL("q=%d: i=%d: decode_frame: \"%s\"", q, i,
+                    wuffs_base__status__message(&status));
       }
 
       wuffs_base__slice_u8 pal = wuffs_base__pixel_buffer__palette(&pb);
@@ -884,16 +917,18 @@
     wuffs_base__status status = wuffs_gif__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("q=%d: initialize: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: initialize: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
     wuffs_gif__decoder__set_quirk_enabled(
         &dec, WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR, q);
 
     wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
     status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
-    if (status) {
-      RETURN_FAIL("q=%d: decode_frame_config: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: decode_frame_config: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
 
     wuffs_base__color_u32_argb_premul got =
@@ -925,16 +960,18 @@
     wuffs_base__status status = wuffs_gif__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("q=%d: initialize: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: initialize: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
     wuffs_gif__decoder__set_quirk_enabled(
         &dec, WUFFS_GIF__QUIRK_HONOR_BACKGROUND_COLOR, q);
 
     wuffs_base__image_config ic = ((wuffs_base__image_config){});
     status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-    if (status) {
-      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
 
     bool got = wuffs_base__image_config__first_frame_is_opaque(&ic);
@@ -967,16 +1004,18 @@
     wuffs_base__status status = wuffs_gif__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("q=%d: initialize: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: initialize: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
     wuffs_gif__decoder__set_quirk_enabled(
         &dec, WUFFS_GIF__QUIRK_IMAGE_BOUNDS_ARE_STRICT, q);
 
     wuffs_base__image_config ic = ((wuffs_base__image_config){});
     status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-    if (status) {
-      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
 
     // The nominal width and height for the overall image is 2×2, but its first
@@ -1003,8 +1042,9 @@
     wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
     status = wuffs_base__pixel_buffer__set_from_slice(&pb, &five_by_five,
                                                       global_pixel_slice);
-    if (status) {
-      RETURN_FAIL("q=%d: set_from_slice: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: set_from_slice: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
 
     // See test/data/artificial/gif-frame-out-of-bounds.gif.make-artificial.txt
@@ -1030,15 +1070,15 @@
       {
         status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
         if (i == WUFFS_TESTLIB_ARRAY_SIZE(want_frame_config_bounds)) {
-          if (status != wuffs_base__warning__end_of_data) {
+          if (status.repr != wuffs_base__warning__end_of_data) {
             RETURN_FAIL("q=%d: decode_frame_config #%" PRIu32 ": got \"%s\"", q,
-                        i, status);
+                        i, wuffs_base__status__message(&status));
           }
           break;
         }
-        if (status) {
+        if (!wuffs_base__status__is_ok(&status)) {
           RETURN_FAIL("q=%d: decode_frame_config #%" PRIu32 ": got \"%s\"", q,
-                      i, status);
+                      i, wuffs_base__status__message(&status));
         }
 
         wuffs_base__rect_ie_u32 got = wuffs_base__frame_config__bounds(&fc);
@@ -1070,9 +1110,9 @@
 
         status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src,
                                                   global_work_slice, NULL);
-        if (status) {
+        if (!wuffs_base__status__is_ok(&status)) {
           RETURN_FAIL("q=%d: decode_frame #%" PRIu32 ": got \"%s\"", q, i,
-                      status);
+                      wuffs_base__status__message(&status));
         }
 
         for (y = 0; y < 5; y++) {
@@ -1138,8 +1178,9 @@
     wuffs_base__status status = wuffs_gif__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("q=%d: initialize: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: initialize: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
 
     const char* want = NULL;
@@ -1161,21 +1202,24 @@
 
     wuffs_base__image_config ic = ((wuffs_base__image_config){});
     status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-    if (status) {
-      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: decode_image_config: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
 
     wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
     status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                       global_pixel_slice);
-    if (status) {
-      RETURN_FAIL("q=%d: set_from_slice: \"%s\"", q, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("q=%d: set_from_slice: \"%s\"", q,
+                  wuffs_base__status__message(&status));
     }
 
-    const char* got = wuffs_gif__decoder__decode_frame(&dec, &pb, &src,
-                                                       global_work_slice, NULL);
-    if (got != want) {
-      RETURN_FAIL("q=%d: decode_frame: got \"%s\", want \"%s\"", q, got, want);
+    wuffs_base__status got = wuffs_gif__decoder__decode_frame(
+        &dec, &pb, &src, global_work_slice, NULL);
+    if (got.repr != want) {
+      RETURN_FAIL("q=%d: decode_frame: got \"%s\", want \"%s\"", q, got.repr,
+                  want);
     }
   }
   return NULL;
@@ -1265,14 +1309,14 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   wuffs_base__image_config ic = ((wuffs_base__image_config){});
 
   status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-  if (status != wuffs_gif__error__bad_header) {
-    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status,
+  if (status.repr != wuffs_gif__error__bad_header) {
+    RETURN_FAIL("decode_image_config: got \"%s\", want \"%s\"", status.repr,
                 wuffs_gif__error__bad_header);
   }
   return NULL;
@@ -1295,14 +1339,15 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   wuffs_base__image_config ic = ((wuffs_base__image_config){});
 
   status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-  if (status) {
-    RETURN_FAIL("decode_image_config: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_image_config: \"%s\"",
+                wuffs_base__status__message(&status));
   }
   if (wuffs_base__pixel_config__width(&ic.pixcfg) != 36) {
     RETURN_FAIL("width: got %" PRIu32 ", want 36",
@@ -1323,8 +1368,8 @@
   wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
   status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                     global_pixel_slice);
-  if (status) {
-    RETURN_FAIL("set_from_slice: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("set_from_slice: \"%s\"", wuffs_base__status__message(&status));
   }
   uint8_t* pixel_ptr = wuffs_base__pixel_buffer__plane(&pb, 0).ptr;
   memset(pixel_ptr, 0xEE, num_pixel_indexes);
@@ -1336,8 +1381,8 @@
 
   status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src, global_work_slice,
                                             NULL);
-  if (status != wuffs_base__suspension__short_read) {
-    RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status,
+  if (status.repr != wuffs_base__suspension__short_read) {
+    RETURN_FAIL("decode_frame: got \"%s\", want \"%s\"", status.repr,
                 wuffs_base__suspension__short_read);
   }
 
@@ -1379,8 +1424,8 @@
       wuffs_base__status status = wuffs_gif__decoder__initialize(
           &dec, sizeof dec, WUFFS_VERSION,
           WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-      if (status) {
-        RETURN_FAIL("initialize: \"%s\"", status);
+      if (!wuffs_base__status__is_ok(&status)) {
+        RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
       }
 
       if (iccp) {
@@ -1397,12 +1442,12 @@
 
       while (true) {
         status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-        if (!status) {
+        if (wuffs_base__status__is_ok(&status)) {
           break;
-        } else if (status != wuffs_base__warning__metadata_reported) {
+        } else if (status.repr != wuffs_base__warning__metadata_reported) {
           RETURN_FAIL(
               "decode_image_config (iccp=%d, xmp=%d): got \"%s\", want \"%s\"",
-              iccp, xmp, status, wuffs_base__warning__metadata_reported);
+              iccp, xmp, status.repr, wuffs_base__warning__metadata_reported);
         }
 
         const char* want = "";
@@ -1445,12 +1490,13 @@
           src.meta.ri += n;
 
           status = wuffs_gif__decoder__ack_metadata_chunk(&dec, &src);
-          if (!status) {
+          if (wuffs_base__status__is_ok(&status)) {
             break;
-          } else if (status != wuffs_base__warning__metadata_reported) {
+          } else if (status.repr != wuffs_base__warning__metadata_reported) {
             RETURN_FAIL(
                 "ack_metadata_chunk (iccp=%d, xmp=%d): got \"%s\", want \"%s\"",
-                iccp, xmp, status, wuffs_base__warning__metadata_reported);
+                iccp, xmp, wuffs_base__status__message(&status),
+                wuffs_base__warning__metadata_reported);
           }
         }
 
@@ -1494,9 +1540,9 @@
       {
         wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
         status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
-        if (status) {
+        if (!wuffs_base__status__is_ok(&status)) {
           RETURN_FAIL("decode_frame_config (iccp=%d, xmp=%d): %s", iccp, xmp,
-                      status);
+                      wuffs_base__status__message(&status));
         }
         uint32_t got = wuffs_base__frame_config__width(&fc);
         uint32_t want = 1;
@@ -1560,13 +1606,14 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
   status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
-  if (status) {
-    RETURN_FAIL("decode_frame_config: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_frame_config: \"%s\"",
+                wuffs_base__status__message(&status));
   }
 
   int got = wuffs_base__frame_config__duration(&fc) /
@@ -1593,13 +1640,14 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   wuffs_base__image_config ic = ((wuffs_base__image_config){});
   status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-  if (status) {
-    RETURN_FAIL("decode_image_config: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_image_config: \"%s\"",
+                wuffs_base__status__message(&status));
   }
 
   // See test/data/artificial/gif-multiple-loop-counts.gif.make-artificial.txt
@@ -1614,14 +1662,15 @@
     {
       status = wuffs_gif__decoder__decode_frame_config(&dec, NULL, &src);
       if (i == WUFFS_TESTLIB_ARRAY_SIZE(want_num_animation_loops)) {
-        if (status != wuffs_base__warning__end_of_data) {
+        if (status.repr != wuffs_base__warning__end_of_data) {
           RETURN_FAIL("decode_frame_config #%" PRIu32 ": got \"%s\"", i,
-                      status);
+                      wuffs_base__status__message(&status));
         }
         break;
       }
-      if (status) {
-        RETURN_FAIL("decode_frame_config #%" PRIu32 ": got \"%s\"", i, status);
+      if (!wuffs_base__status__is_ok(&status)) {
+        RETURN_FAIL("decode_frame_config #%" PRIu32 ": got \"%s\"", i,
+                    wuffs_base__status__message(&status));
       }
     }
 
@@ -1729,21 +1778,22 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
 
   wuffs_base__image_config ic = ((wuffs_base__image_config){});
   status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-  if (status) {
-    RETURN_FAIL("decode_image_config: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_image_config: \"%s\"",
+                wuffs_base__status__message(&status));
   }
 
   wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
   status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                     global_pixel_slice);
-  if (status) {
-    RETURN_FAIL("set_from_slice: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("set_from_slice: \"%s\"", wuffs_base__status__message(&status));
   }
 
   // The hippopotamus.interlaced.gif image is 28 pixels high. As we decode rows
@@ -1767,10 +1817,10 @@
       i++;
     }
 
-    if (!status) {
+    if (wuffs_base__status__is_ok(&status)) {
       break;
-    } else if (status != wuffs_base__suspension__short_read) {
-      RETURN_FAIL("decode_frame: \"%s\"", status);
+    } else if (status.repr != wuffs_base__suspension__short_read) {
+      RETURN_FAIL("decode_frame: \"%s\"", wuffs_base__status__message(&status));
     }
   }
 
@@ -1795,22 +1845,24 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
 
   wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
   if (!frame_config) {
     wuffs_base__image_config ic = ((wuffs_base__image_config){});
     status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-    if (status) {
-      RETURN_FAIL("decode_image_config: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("decode_image_config: \"%s\"",
+                  wuffs_base__status__message(&status));
     }
 
     status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                       global_pixel_slice);
-    if (status) {
-      RETURN_FAIL("set_from_slice: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("set_from_slice: \"%s\"",
+                  wuffs_base__status__message(&status));
     }
   }
 
@@ -1830,7 +1882,7 @@
       break;
     }
 
-    const char* status = NULL;
+    wuffs_base__status status = wuffs_base__make_status(NULL);
     if (frame_config) {
       status = wuffs_gif__decoder__decode_frame_config(&dec, NULL, &src);
     } else {
@@ -1838,12 +1890,12 @@
                                                 global_work_slice, NULL);
     }
 
-    if (!status) {
+    if (wuffs_base__status__is_ok(&status)) {
       want++;
-    } else if (status == wuffs_base__warning__end_of_data) {
+    } else if (status.repr == wuffs_base__warning__end_of_data) {
       end_of_data = true;
     } else {
-      RETURN_FAIL("%s: \"%s\"", method, status);
+      RETURN_FAIL("%s: \"%s\"", method, wuffs_base__status__message(&status));
     }
   }
 
@@ -1876,8 +1928,8 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
 
   if (chunked) {
@@ -1890,8 +1942,9 @@
     src.meta.closed = false;
 
     status = wuffs_gif__decoder__decode_image_config(&dec, NULL, &src);
-    if (status != wuffs_base__suspension__short_read) {
-      RETURN_FAIL("decode_image_config (chunked): \"%s\"", status);
+    if (status.repr != wuffs_base__suspension__short_read) {
+      RETURN_FAIL("decode_image_config (chunked): \"%s\"",
+                  wuffs_base__status__message(&status));
     }
 
     src.meta.wi = saved_wi;
@@ -1907,8 +1960,9 @@
   }
 
   status = wuffs_gif__decoder__decode_image_config(&dec, NULL, &src);
-  if (status) {
-    RETURN_FAIL("decode_image_config: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_image_config: \"%s\"",
+                wuffs_base__status__message(&status));
   }
 
   wuffs_base__frame_config fcs[4];
@@ -1918,8 +1972,9 @@
   for (i = 0; i < 4; i++) {
     fcs[i] = ((wuffs_base__frame_config){});
     status = wuffs_gif__decoder__decode_frame_config(&dec, &fcs[i], &src);
-    if (status) {
-      RETURN_FAIL("decode_frame_config #%d: \"%s\"", i, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("decode_frame_config #%d: \"%s\"", i,
+                  wuffs_base__status__message(&status));
     }
 
     uint64_t index_got = wuffs_base__frame_config__index(&fcs[i]);
@@ -1963,8 +2018,9 @@
   }
 
   status = wuffs_gif__decoder__decode_frame_config(&dec, NULL, &src);
-  if (status != wuffs_base__warning__end_of_data) {
-    RETURN_FAIL("decode_frame_config EOD: \"%s\"", status);
+  if (status.repr != wuffs_base__warning__end_of_data) {
+    RETURN_FAIL("decode_frame_config EOD: \"%s\"",
+                wuffs_base__status__message(&status));
   }
 
   // If we're chunked, we've discarded some source bytes due to an earlier
@@ -1979,16 +2035,18 @@
 
     status = wuffs_gif__decoder__restart_frame(
         &dec, i, wuffs_base__frame_config__io_position(&fcs[i]));
-    if (status) {
-      RETURN_FAIL("restart_frame #%d: \"%s\"", i, status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("restart_frame #%d: \"%s\"", i,
+                  wuffs_base__status__message(&status));
     }
 
     int j;
     for (j = i; j < 4; j++) {
       wuffs_base__frame_config fc = ((wuffs_base__frame_config){});
       status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
-      if (status) {
-        RETURN_FAIL("decode_frame_config #%d, #%d: \"%s\"", i, j, status);
+      if (!wuffs_base__status__is_ok(&status)) {
+        RETURN_FAIL("decode_frame_config #%d, #%d: \"%s\"", i, j,
+                    wuffs_base__status__message(&status));
       }
 
       uint64_t index_got = wuffs_base__frame_config__index(&fc);
@@ -2007,8 +2065,9 @@
     }
 
     status = wuffs_gif__decoder__decode_frame_config(&dec, NULL, &src);
-    if (status != wuffs_base__warning__end_of_data) {
-      RETURN_FAIL("decode_frame_config EOD #%d: \"%s\"", i, status);
+    if (status.repr != wuffs_base__warning__end_of_data) {
+      RETURN_FAIL("decode_frame_config EOD #%d: \"%s\"", i,
+                  wuffs_base__status__message(&status));
     }
   }
 
@@ -2042,14 +2101,15 @@
   wuffs_base__status status = wuffs_gif__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
 
   wuffs_base__image_config ic = ((wuffs_base__image_config){});
   status = wuffs_gif__decoder__decode_image_config(&dec, &ic, &src);
-  if (status) {
-    RETURN_FAIL("decode_image_config: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_image_config: \"%s\"",
+                wuffs_base__status__message(&status));
   }
   if (wuffs_base__pixel_config__width(&ic.pixcfg) != 5) {
     RETURN_FAIL("width: got %" PRIu32 ", want 5",
@@ -2063,14 +2123,15 @@
   wuffs_base__pixel_buffer pb = ((wuffs_base__pixel_buffer){});
   status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg,
                                                     global_pixel_slice);
-  if (status) {
-    RETURN_FAIL("set_from_slice: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("set_from_slice: \"%s\"", wuffs_base__status__message(&status));
   }
 
   wuffs_base__frame_config fc;
   status = wuffs_gif__decoder__decode_frame_config(&dec, &fc, &src);
-  if (status) {
-    RETURN_FAIL("decode_frame_config: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_frame_config: \"%s\"",
+                wuffs_base__status__message(&status));
   }
 
   wuffs_base__rect_ie_u32 fr = wuffs_base__frame_config__bounds(&fc);
@@ -2081,8 +2142,8 @@
 
   status = wuffs_gif__decoder__decode_frame(&dec, &pb, &src, global_work_slice,
                                             NULL);
-  if (status) {
-    RETURN_FAIL("decode_frame: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_frame: \"%s\"", wuffs_base__status__message(&status));
   }
 
   wuffs_base__rect_ie_u32 dr = wuffs_gif__decoder__frame_dirty_rect(&dec);
diff --git a/test/c/std/gzip.c b/test/c/std/gzip.c
index dbb2abd..f4bb6ba 100644
--- a/test/c/std/gzip.c
+++ b/test/c/std/gzip.c
@@ -89,10 +89,10 @@
                               uint64_t wlimit,
                               uint64_t rlimit) {
   wuffs_gzip__decoder dec;
-  const char* status = wuffs_gzip__decoder__initialize(
+  wuffs_base__status status = wuffs_gzip__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION, wuffs_initialize_flags);
-  if (status) {
-    return status;
+  if (!wuffs_base__status__is_ok(&status)) {
+    return wuffs_base__status__message(&status);
   }
 
   while (true) {
@@ -106,12 +106,12 @@
     src->meta.ri += limited_src.meta.ri;
 
     if (((wlimit < UINT64_MAX) &&
-         (status == wuffs_base__suspension__short_write)) ||
+         (status.repr == wuffs_base__suspension__short_write)) ||
         ((rlimit < UINT64_MAX) &&
-         (status == wuffs_base__suspension__short_read))) {
+         (status.repr == wuffs_base__suspension__short_read))) {
       continue;
     }
-    return status;
+    return wuffs_base__status__message(&status);
   }
 }
 
@@ -143,8 +143,8 @@
     wuffs_base__status status = wuffs_gzip__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("initialize: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
     }
     wuffs_gzip__decoder__set_ignore_checksum(&dec, ignore_checksum);
     got.meta.wi = 0;
@@ -172,12 +172,12 @@
       }
 
       wuffs_base__io_buffer limited_src = make_limited_reader(src, rlimit);
-      const char* got_z = wuffs_gzip__decoder__decode_io_writer(
+      wuffs_base__status got_z = wuffs_gzip__decoder__decode_io_writer(
           &dec, &got, &limited_src, global_work_slice);
       src.meta.ri += limited_src.meta.ri;
-      if (got_z != want_z) {
-        RETURN_FAIL("end_limit=%d: got \"%s\", want \"%s\"", end_limit, got_z,
-                    want_z);
+      if (got_z.repr != want_z) {
+        RETURN_FAIL("end_limit=%d: got \"%s\", want \"%s\"", end_limit,
+                    got_z.repr, want_z);
       }
     }
   }
diff --git a/test/c/std/lzw.c b/test/c/std/lzw.c
index aa459aa..6172400 100644
--- a/test/c/std/lzw.c
+++ b/test/c/std/lzw.c
@@ -111,8 +111,8 @@
   wuffs_base__status status = wuffs_lzw__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   wuffs_lzw__decoder__set_literal_width(&dec, literal_width);
   int num_iters = 0;
@@ -127,15 +127,15 @@
         &dec, &limited_got, &limited_src, global_work_slice);
     got.meta.wi += limited_got.meta.wi;
     src.meta.ri += limited_src.meta.ri;
-    if (!status) {
+    if (wuffs_base__status__is_ok(&status)) {
       if (src.meta.ri != src.meta.wi) {
         RETURN_FAIL("decode returned \"ok\" but src was not exhausted");
       }
       break;
     }
-    if ((status != wuffs_base__suspension__short_read) &&
-        (status != wuffs_base__suspension__short_write)) {
-      RETURN_FAIL("decode: got \"%s\", want \"%s\" or \"%s\"", status,
+    if ((status.repr != wuffs_base__suspension__short_read) &&
+        (status.repr != wuffs_base__suspension__short_write)) {
+      RETURN_FAIL("decode: got \"%s\", want \"%s\" or \"%s\"", status.repr,
                   wuffs_base__suspension__short_read,
                   wuffs_base__suspension__short_write);
     }
@@ -223,18 +223,18 @@
   src.data.ptr[3] = 0xFF;
 
   wuffs_lzw__decoder dec;
-  const char* status = wuffs_lzw__decoder__initialize(
+  wuffs_base__status status = wuffs_lzw__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   wuffs_lzw__decoder__set_literal_width(&dec, 7);
 
   status =
       wuffs_lzw__decoder__decode_io_writer(&dec, &got, &src, global_work_slice);
-  if (status != wuffs_lzw__error__bad_code) {
-    RETURN_FAIL("decode: \"%s\"", status);
+  if (status.repr != wuffs_lzw__error__bad_code) {
+    RETURN_FAIL("decode: \"%s\"", wuffs_base__status__message(&status));
   }
 
   if (got.meta.wi != 3) {
@@ -267,18 +267,18 @@
   src.data.ptr[1] = 0x01;
 
   wuffs_lzw__decoder dec;
-  const char* status = wuffs_lzw__decoder__initialize(
+  wuffs_base__status status = wuffs_lzw__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   wuffs_lzw__decoder__set_literal_width(&dec, 8);
 
   status =
       wuffs_lzw__decoder__decode_io_writer(&dec, &got, &src, global_work_slice);
-  if (status) {
-    RETURN_FAIL("decode: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode: \"%s\"", wuffs_base__status__message(&status));
   }
 
   if (got.meta.wi != 0) {
@@ -294,11 +294,11 @@
                                            wuffs_base__io_buffer src,
                                            wuffs_base__io_buffer want) {
   wuffs_lzw__decoder dec;
-  const char* status = wuffs_lzw__decoder__initialize(
+  wuffs_base__status status = wuffs_lzw__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION,
       WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-  if (status) {
-    RETURN_FAIL("initialize: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
   }
   wuffs_lzw__decoder__set_literal_width(&dec, width);
 
@@ -307,8 +307,8 @@
   });
   status =
       wuffs_lzw__decoder__decode_io_writer(&dec, &got, &src, global_work_slice);
-  if (status) {
-    RETURN_FAIL("decode: \"%s\"", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode: \"%s\"", wuffs_base__status__message(&status));
   }
 
   return check_io_buffers_equal("", &got, &want);
@@ -412,13 +412,13 @@
     wuffs_base__status status = wuffs_lzw__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("initialize: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
     }
     status = wuffs_lzw__decoder__decode_io_writer(&dec, &got, &src,
                                                   global_work_slice);
-    if (status) {
-      RETURN_FAIL("decode: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("decode: \"%s\"", wuffs_base__status__message(&status));
     }
     n_bytes += got.meta.wi;
   }
diff --git a/test/c/std/zlib.c b/test/c/std/zlib.c
index ec692b6..ed4f3fd 100644
--- a/test/c/std/zlib.c
+++ b/test/c/std/zlib.c
@@ -100,10 +100,10 @@
                               uint64_t wlimit,
                               uint64_t rlimit) {
   wuffs_zlib__decoder dec;
-  const char* status = wuffs_zlib__decoder__initialize(
+  wuffs_base__status status = wuffs_zlib__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION, wuffs_initialize_flags);
-  if (status) {
-    return status;
+  if (!wuffs_base__status__is_ok(&status)) {
+    return wuffs_base__status__message(&status);
   }
 
   while (true) {
@@ -117,12 +117,12 @@
     src->meta.ri += limited_src.meta.ri;
 
     if (((wlimit < UINT64_MAX) &&
-         (status == wuffs_base__suspension__short_write)) ||
+         (status.repr == wuffs_base__suspension__short_write)) ||
         ((rlimit < UINT64_MAX) &&
-         (status == wuffs_base__suspension__short_read))) {
+         (status.repr == wuffs_base__suspension__short_read))) {
       continue;
     }
-    return status;
+    return wuffs_base__status__message(&status);
   }
 }
 
@@ -153,8 +153,8 @@
     wuffs_base__status status = wuffs_zlib__decoder__initialize(
         &dec, sizeof dec, WUFFS_VERSION,
         WUFFS_INITIALIZE__LEAVE_INTERNAL_BUFFERS_UNINITIALIZED);
-    if (status) {
-      RETURN_FAIL("initialize: \"%s\"", status);
+    if (!wuffs_base__status__is_ok(&status)) {
+      RETURN_FAIL("initialize: \"%s\"", wuffs_base__status__message(&status));
     }
     wuffs_zlib__decoder__set_ignore_checksum(&dec, ignore_checksum);
     got.meta.wi = 0;
@@ -183,12 +183,12 @@
 
       wuffs_base__io_buffer limited_src = make_limited_reader(src, rlimit);
 
-      const char* got_z = wuffs_zlib__decoder__decode_io_writer(
+      wuffs_base__status got_z = wuffs_zlib__decoder__decode_io_writer(
           &dec, &got, &limited_src, global_work_slice);
       src.meta.ri += limited_src.meta.ri;
-      if (got_z != want_z) {
-        RETURN_FAIL("end_limit=%d: got \"%s\", want \"%s\"", end_limit, got_z,
-                    want_z);
+      if (got_z.repr != want_z) {
+        RETURN_FAIL("end_limit=%d: got \"%s\", want \"%s\"", end_limit,
+                    got_z.repr, want_z);
       }
     }
   }
@@ -236,10 +236,10 @@
       make_io_buffer_from_string(zlib_sheep_src_ptr, zlib_sheep_src_len);
 
   wuffs_zlib__decoder dec;
-  const char* status = wuffs_zlib__decoder__initialize(
+  wuffs_base__status status = wuffs_zlib__decoder__initialize(
       &dec, sizeof dec, WUFFS_VERSION, WUFFS_INITIALIZE__DEFAULT_OPTIONS);
-  if (status) {
-    RETURN_FAIL("initialize: %s", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("initialize: %s", wuffs_base__status__message(&status));
   }
 
   int i;
@@ -247,9 +247,9 @@
     status = wuffs_zlib__decoder__decode_io_writer(&dec, &got, &src,
                                                    global_work_slice);
 
-    if (status != wuffs_zlib__warning__dictionary_required) {
+    if (status.repr != wuffs_zlib__warning__dictionary_required) {
       RETURN_FAIL("decode_io_writer (before dict): got \"%s\", want \"%s\"",
-                  status, wuffs_zlib__warning__dictionary_required);
+                  status.repr, wuffs_zlib__warning__dictionary_required);
     }
 
     uint32_t dict_id_got = wuffs_zlib__decoder__dictionary_id(&dec);
@@ -268,8 +268,9 @@
 
   status = wuffs_zlib__decoder__decode_io_writer(&dec, &got, &src,
                                                  global_work_slice);
-  if (status) {
-    RETURN_FAIL("decode_io_writer (after dict): %s", status);
+  if (!wuffs_base__status__is_ok(&status)) {
+    RETURN_FAIL("decode_io_writer (after dict): %s",
+                wuffs_base__status__message(&status));
   }
 
   wuffs_base__io_buffer want =