Add wbmp.decoder.ack_metadata_chunk
diff --git a/internal/cgen/func.go b/internal/cgen/func.go
index a6dac27..bcfbb43 100644
--- a/internal/cgen/func.go
+++ b/internal/cgen/func.go
@@ -217,15 +217,16 @@
 	}
 	g.findDerivedVars()
 
+	if err := g.writeFuncImplBody(&g.currFunk.bBody); err != nil {
+		return err
+	}
+
 	if err := g.writeFuncImplPrologue(&g.currFunk.bPrologue); err != nil {
 		return err
 	}
 	if err := g.writeFuncImplBodyResume(&g.currFunk.bBodyResume); err != nil {
 		return err
 	}
-	if err := g.writeFuncImplBody(&g.currFunk.bBody); err != nil {
-		return err
-	}
 	if err := g.writeFuncImplBodySuspend(&g.currFunk.bBodySuspend); err != nil {
 		return err
 	}
@@ -362,7 +363,7 @@
 }
 
 func (g *gen) writeFuncImplBodyResume(b *buffer) error {
-	if g.currFunk.astFunc.Effect().Coroutine() {
+	if g.currFunk.coroSuspPoint > 0 {
 		// TODO: don't hard-code [0], and allow recursive coroutines.
 		b.printf("uint32_t coro_susp_point = self->private_impl.%s%s[0];\n",
 			pPrefix, g.currFunk.astFunc.FuncName().Str(g.tm))
@@ -390,7 +391,7 @@
 }
 
 func (g *gen) writeFuncImplBodySuspend(b *buffer) error {
-	if g.currFunk.astFunc.Effect().Coroutine() {
+	if g.currFunk.coroSuspPoint > 0 {
 		// We've reached the end of the function body. Reset the coroutine
 		// suspension point so that the next call to this function starts at
 		// the top.
@@ -412,6 +413,9 @@
 			return err
 		}
 		b.writes("\n")
+
+	} else if g.currFunk.astFunc.Effect().Coroutine() {
+		b.writes("\ngoto ok;ok:") // The goto avoids the "unused label" warning.
 	}
 	return nil
 }
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 2fff95d..fa7c9c4 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -4155,6 +4155,10 @@
                                          wuffs_base__image_config* a_dst,
                                          wuffs_base__io_buffer* a_src);
 
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
+wuffs_wbmp__decoder__ack_metadata_chunk(wuffs_wbmp__decoder* self,
+                                        wuffs_base__io_buffer* a_src);
+
 // ---------------- Struct Definitions
 
 // These structs' fields, and the sizeof them, are private implementation
@@ -4233,6 +4237,11 @@
     return wuffs_wbmp__decoder__decode_image_config(this, a_dst, a_src);
   }
 
+  inline wuffs_base__status  //
+  ack_metadata_chunk(wuffs_base__io_buffer* a_src) {
+    return wuffs_wbmp__decoder__ack_metadata_chunk(this, a_src);
+  }
+
 #endif  // __cplusplus
 
 };  // struct wuffs_wbmp__decoder__struct
@@ -11907,6 +11916,8 @@
                                     wuffs_base__pixel_buffer* a_dst,
                                     wuffs_base__io_buffer* a_src,
                                     wuffs_base__slice_u8 a_workbuf) {
+  wuffs_base__io_buffer empty_io_buffer = wuffs_base__empty_io_buffer();
+
   wuffs_base__status status = wuffs_base__make_status(NULL);
 
   uint64_t v_block_size = 0;
@@ -11935,8 +11946,6 @@
     io2_a_src = io0_a_src + a_src->meta.wi;
   }
 
-  wuffs_base__io_buffer empty_io_buffer = wuffs_base__empty_io_buffer();
-
   uint32_t coro_susp_point = self->private_impl.p_decode_id_part2[0];
   if (coro_susp_point) {
     v_block_size = self->private_data.s_decode_id_part2[0].v_block_size;
@@ -13015,6 +13024,45 @@
   return status;
 }
 
+// -------- func wbmp.decoder.ack_metadata_chunk
+
+WUFFS_BASE__MAYBE_STATIC wuffs_base__status  //
+wuffs_wbmp__decoder__ack_metadata_chunk(wuffs_wbmp__decoder* self,
+                                        wuffs_base__io_buffer* a_src) {
+  if (!self) {
+    return wuffs_base__make_status(wuffs_base__error__bad_receiver);
+  }
+  if (self->private_impl.magic != WUFFS_BASE__MAGIC) {
+    return wuffs_base__make_status(
+        (self->private_impl.magic == WUFFS_BASE__DISABLED)
+            ? wuffs_base__error__disabled_by_previous_error
+            : wuffs_base__error__initialize_not_called);
+  }
+  if (!a_src) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+    return wuffs_base__make_status(wuffs_base__error__bad_argument);
+  }
+  if ((self->private_impl.active_coroutine != 0) &&
+      (self->private_impl.active_coroutine != 2)) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+    return wuffs_base__make_status(
+        wuffs_base__error__interleaved_coroutine_calls);
+  }
+  self->private_impl.active_coroutine = 0;
+  wuffs_base__status status = wuffs_base__make_status(NULL);
+
+  status = wuffs_base__make_status(NULL);
+  goto ok;
+  goto ok;
+ok:
+  goto exit;
+exit:
+  if (wuffs_base__status__is_error(&status)) {
+    self->private_impl.magic = WUFFS_BASE__DISABLED;
+  }
+  return status;
+}
+
 #endif  // !defined(WUFFS_CONFIG__MODULES) ||
         // defined(WUFFS_CONFIG__MODULE__WBMP)
 
diff --git a/std/wbmp/decode_wbmp.wuffs b/std/wbmp/decode_wbmp.wuffs
index 293b5b6..18b3abf 100644
--- a/std/wbmp/decode_wbmp.wuffs
+++ b/std/wbmp/decode_wbmp.wuffs
@@ -75,3 +75,9 @@
 			first_frame_is_opaque: true)
 	}
 }
+
+pub func decoder.ack_metadata_chunk?(src: base.io_reader) {
+	// TODO: this final line shouldn't be necessary, here and in some other
+	// std/*/*.wuffs functions.
+	return ok
+}