Emit stricter vtable function-pointer type
diff --git a/internal/cgen/cgen.go b/internal/cgen/cgen.go
index cff1417..ca1b17b 100644
--- a/internal/cgen/cgen.go
+++ b/internal/cgen/cgen.go
@@ -403,7 +403,7 @@
 
 		buf.writes("typedef struct {\n\n")
 		for _, f := range builtInInterfaceMethods[qid] {
-			if err := g.writeFuncSignature(buf, f, wfsCFuncPtr); err != nil {
+			if err := g.writeFuncSignature(buf, f, wfsCFuncPtrField); err != nil {
 				return err
 			}
 			buf.writes(";\n")
@@ -1157,7 +1157,11 @@
 			builtInTokenMap.ByName(iQID[1].Str(g.tm)),
 		}
 		for _, f := range builtInInterfaceMethods[altQID] {
-			b.printf("(void*)(&%s%s__%s),\n",
+			b.writeb('(')
+			if err := g.writeFuncSignature(b, f, wfsCFuncPtrType); err != nil {
+				return err
+			}
+			b.printf(")(&%s%s__%s),\n",
 				g.pkgPrefix, nQID[1].Str(g.tm),
 				f.FuncName().Str(&builtInTokenMap),
 			)
diff --git a/internal/cgen/expr.go b/internal/cgen/expr.go
index d87a7e8..bbb2de3 100644
--- a/internal/cgen/expr.go
+++ b/internal/cgen/expr.go
@@ -363,9 +363,11 @@
 		o := n.Inner()
 		if o.Decorator() == 0 && o.QID() == (t.QID{t.IDBase, t.IDU8}) && !o.IsRefined() {
 			b.writes("wuffs_base__slice_u8")
-			b.writeb(' ')
-			b.writes(varNamePrefix)
-			b.writes(varName)
+			if varNamePrefix != "" {
+				b.writeb(' ')
+				b.writes(varNamePrefix)
+				b.writes(varName)
+			}
 			return nil
 		}
 		return fmt.Errorf("cannot convert Wuffs type %q to C", n.Str(g.tm))
@@ -374,9 +376,11 @@
 		o := n.Inner()
 		if o.Decorator() == 0 && o.QID() == (t.QID{t.IDBase, t.IDU8}) && !o.IsRefined() {
 			b.writes("wuffs_base__table_u8")
-			b.writeb(' ')
-			b.writes(varNamePrefix)
-			b.writes(varName)
+			if varNamePrefix != "" {
+				b.writeb(' ')
+				b.writes(varNamePrefix)
+				b.writes(varName)
+			}
 			return nil
 		}
 		return fmt.Errorf("cannot convert Wuffs type %q to C", n.Str(g.tm))
@@ -420,9 +424,11 @@
 		b.writeb('*')
 	}
 
-	b.writeb(' ')
-	b.writes(varNamePrefix)
-	b.writes(varName)
+	if varNamePrefix != "" {
+		b.writeb(' ')
+		b.writes(varNamePrefix)
+		b.writes(varName)
+	}
 
 	x = n
 	for ; x != nil && x.IsArrayType(); x = x.Inner() {
diff --git a/internal/cgen/func.go b/internal/cgen/func.go
index 1a3cf0c..a6dac27 100644
--- a/internal/cgen/func.go
+++ b/internal/cgen/func.go
@@ -74,9 +74,10 @@
 
 // writeFunctionSignature modes.
 const (
-	wfsCDecl    = 0
-	wfsCppDecl  = 1
-	wfsCFuncPtr = 2
+	wfsCDecl         = 0
+	wfsCppDecl       = 1
+	wfsCFuncPtrField = 2
+	wfsCFuncPtrType  = 3
 )
 
 func (g *gen) writeFuncSignature(b *buffer, n *a.Func, wfs uint32) error {
@@ -91,7 +92,7 @@
 	case wfsCppDecl:
 		b.writes("inline ")
 
-	case wfsCFuncPtr:
+	case wfsCFuncPtrField, wfsCFuncPtrType:
 		// No-op.
 	}
 
@@ -107,7 +108,7 @@
 
 	// The empty // comment makes clang-format place the function name at the
 	// start of a line.
-	if wfs != wfsCFuncPtr {
+	if (wfs != wfsCFuncPtrField) && (wfs != wfsCFuncPtrType) {
 		b.writes("//\n")
 	}
 
@@ -128,14 +129,19 @@
 		b.writes(n.FuncName().Str(g.tm))
 		b.writeb('(')
 
-	case wfsCFuncPtr:
+	case wfsCFuncPtrField, wfsCFuncPtrType:
 		b.writes("(*")
-		b.writes(n.FuncName().Str(g.tm))
+		if wfs == wfsCFuncPtrField {
+			b.writes(n.FuncName().Str(g.tm))
+		}
 		b.writes(")(")
 		if n.Effect().Pure() {
 			b.writes("const ")
 		}
-		b.writes("void* self")
+		b.writes("void*")
+		if wfs == wfsCFuncPtrField {
+			b.writes(" self")
+		}
 		comma = true
 	}
 
@@ -145,7 +151,11 @@
 		}
 		comma = true
 		o := o.AsField()
-		if err := g.writeCTypeName(b, o.XType(), aPrefix, o.Name().Str(g.tm)); err != nil {
+		varNamePrefix, varName := "", ""
+		if wfs != wfsCFuncPtrType {
+			varNamePrefix, varName = aPrefix, o.Name().Str(g.tm)
+		}
+		if err := g.writeCTypeName(b, o.XType(), varNamePrefix, varName); err != nil {
 			return err
 		}
 	}
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index 1575010..ddaa006 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -4915,7 +4915,8 @@
 
 const wuffs_base__hasher_u32__func_ptrs
     wuffs_adler32__hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
-        (void*)(&wuffs_adler32__hasher__update_u32),
+        (uint32_t(*)(void*, wuffs_base__slice_u8))(
+            &wuffs_adler32__hasher__update_u32),
 };
 
 // ---------------- Initializer Implementations
@@ -5937,7 +5938,8 @@
 
 const wuffs_base__hasher_u32__func_ptrs
     wuffs_crc32__ieee_hasher__func_ptrs_for__wuffs_base__hasher_u32 = {
-        (void*)(&wuffs_crc32__ieee_hasher__update_u32),
+        (uint32_t(*)(void*, wuffs_base__slice_u8))(
+            &wuffs_crc32__ieee_hasher__update_u32),
 };
 
 // ---------------- Initializer Implementations