Skip to content

[protoc-gen-go] Variable name clashes in generated code when using name or value as top-level enum value #1700

@gustavo-bertoldi

Description

@gustavo-bertoldi

What version of protobuf and what language are you using?

  • libprotoc 32.1
  • protoc-gen-go v1.36.9

What did you do?

protoc --go_out=./gen --go_opt=paths=source_relative test.proto

With the following file

syntax = "proto3";

package test;
option go_package = "proto/test";

enum MyEnum {
  unknown = 0;
  name = 1;
  value = 2;
}

What did you expect to see?
No name clashes in the internal variables of the generated file

What did you see instead?
Variable name clashes:

MyEnum_name redeclared in this block
MyEnum_value redeclared in this block

It seems, for top-level enums, the enum value maps generated for go are named <enum_name>_name and <enum_name>_value. The enum consts have identical names, causing the clash.

Generated code extract:

type MyEnum int32

const (
	MyEnum_unknown MyEnum = 0
	MyEnum_name    MyEnum = 1
	MyEnum_value   MyEnum = 2
)

// Enum value maps for MyEnum.
var (
	MyEnum_name = map[int32]string{
		0: "unknown",
		1: "name",
		2: "value",
	}
	MyEnum_value = map[string]int32{
		"unknown": 0,
		"name":    1,
		"value":   2,
	}
)

A workaround is to wrap the enum inside another message.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions