vitessio/vitess · error

expected a pointer type for %s, got %v

Error message

expected a pointer type for %s, got %v

What it means

extractLocalPointerType expects an *types.Var to be a pointer to a named type (the codegen templates take proto pointers like *vtctldatapb.X). This error means the variable's type is not a pointer at all, so the generator cannot emit the pointer-based wrapper code.

Source

Thrown at go/vt/vtctl/vtctldclient/codegen/main.go:418

		}

		argNamed, ok := arg.(*types.Named)
		if !ok {
			return "", nil, fmt.Errorf("expected a named type for type argument %d of %s, got %v", i, named.Obj().Name(), arg)
		}

		localImport := rewriteProtoImports(argNamed.Obj().Pkg())
		args = append(args, prefix+localImport+"."+argNamed.Obj().Name())
		argImports = append(argImports, typeArgImport{localImport: localImport, pkgPath: argNamed.Obj().Pkg().Path()})
	}

	return "[" + strings.Join(args, ", ") + "]", argImports, nil
}

func extractLocalPointerType(v *types.Var) (name string, localImport string, pkgPath string, err error) {
	ptr, ok := v.Type().(*types.Pointer)
	if !ok {
		return "", "", "", fmt.Errorf("expected a pointer type for %s, got %v", v.Name(), v.Type())
	}

	typ, ok := ptr.Elem().(*types.Named)
	if !ok {
		return "", "", "", fmt.Errorf("expected an underlying named type for %s, got %v", v.Name(), ptr.Elem())
	}

	name = typ.Obj().Name()
	localImport = rewriteProtoImports(typ.Obj().Pkg())
	pkgPath = typ.Obj().Pkg().Path()

	return name, localImport, pkgPath, nil
}

func extractRecvType(v *types.Var) (name string, localImport string, pkgPath string, err error) {
	named, ok := v.Type().(*types.Named)
	if !ok {
		return "", "", "", fmt.Errorf("expected a named type for %s, got %v", v.Name(), v.Type())

View on GitHub (pinned to 01a25a7d17)

Solutions

  1. Change the parameter to a pointer type (*pkg.Type)
  2. Follow Vitess conventions: proto messages are passed as pointers
  3. If value types are intentional, adapt the codegen tool

Example fix

// before
func (s *Server) Get(req vtctldatapb.GetRequest) error
// after
func (s *Server) Get(req *vtctldatapb.GetRequest) error
Defensive patterns

Strategy: type-guard

Validate before calling

// Verify params are pointers before codegen
for i := 0; i < sig.Params().Len(); i++ {
    if _, ok := sig.Params().At(i).Type().(*types.Pointer); !ok {
        return fmt.Errorf("param %d is not a pointer", i)
    }
}

Type guard

func isPointerToNamed(v *types.Var) bool {
    p, ok := v.Type().(*types.Pointer)
    if !ok { return false }
    _, ok = p.Elem().(*types.Named)
    return ok
}

Prevention

When it happens

Trigger: A method parameter or receiver variable on the processed interface has a value (non-pointer) type — e.g. takes vtctldatapb.Request by value or a plain struct.

Common situations: Changing a proto-style API from pointer receivers/params to value semantics then running codegen; a new method added with value-type params; called from main for arguments or from extractRecvType for receiver vars.

Related errors


AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01). Data as JSON: /api/errors/4cdc638e2ba6ce83. Report an issue: GitHub.