Commit 0973be46 authored by Robert Edmonds's avatar Robert Edmonds Committed by GitHub

Merge pull request #256 from protobuf-c/issue/251

Fix "Bad enums with multiple oneofs" (#251)
parents 424c4987 14426422
...@@ -178,6 +178,19 @@ t/test-full.pb.cc t/test-full.pb.h: @PROTOC@ $(top_srcdir)/t/test-full.proto ...@@ -178,6 +178,19 @@ t/test-full.pb.cc t/test-full.pb.h: @PROTOC@ $(top_srcdir)/t/test-full.proto
t/generated-code2/test-full-cxx-output.inc: t/generated-code2/cxx-generate-packed-data$(EXEEXT) t/generated-code2/test-full-cxx-output.inc: t/generated-code2/cxx-generate-packed-data$(EXEEXT)
$(AM_V_GEN)$(top_builddir)/t/generated-code2/cxx-generate-packed-data$(EXEEXT) > $(top_builddir)/t/generated-code2/test-full-cxx-output.inc $(AM_V_GEN)$(top_builddir)/t/generated-code2/cxx-generate-packed-data$(EXEEXT) > $(top_builddir)/t/generated-code2/test-full-cxx-output.inc
BUILT_SOURCES += \
t/test.pb-c.c t/test.pb-c.h \
t/test-full.pb-c.c t/test-full.pb-c.h \
t/test-optimized.pb-c.c t/test-optimized.pb-c.h \
t/test-full.pb.cc t/test-full.pb.h \
t/generated-code2/test-full-cxx-output.inc
t_version_version_SOURCES = \
t/version/version.c
t_version_version_LDADD = \
protobuf-c/libprotobuf-c.la
# Issue #220
check_PROGRAMS += \ check_PROGRAMS += \
t/issue220/issue220 t/issue220/issue220
TESTS += \ TESTS += \
...@@ -194,17 +207,23 @@ BUILT_SOURCES += \ ...@@ -194,17 +207,23 @@ BUILT_SOURCES += \
EXTRA_DIST += \ EXTRA_DIST += \
t/issue220/issue220.proto t/issue220/issue220.proto
# Issue #251
check_PROGRAMS += \
t/issue251/issue251
TESTS += \
t/issue251/issue251
t_issue251_issue251_SOURCES = \
t/issue251/issue251.c \
t/issue251/issue251.pb-c.c
t_issue251_issue251_LDADD = \
protobuf-c/libprotobuf-c.la
t/issue251/issue251.pb-c.c t/issue251/issue251.pb-c.h: $(top_builddir)/protoc-c/protoc-gen-c$(EXEEXT) $(top_srcdir)/t/issue251/issue251.proto
$(AM_V_GEN)@PROTOC@ --plugin=$(top_builddir)/protoc-c/protoc-gen-c$(EXEEXT) -I$(top_srcdir) --c_out=$(top_builddir) $(top_srcdir)/t/issue251/issue251.proto
BUILT_SOURCES += \ BUILT_SOURCES += \
t/test.pb-c.c t/test.pb-c.h \ t/issue251/issue251.pb-c.c t/issue251/issue251.pb-c.h
t/test-full.pb-c.c t/test-full.pb-c.h \ EXTRA_DIST += \
t/test-optimized.pb-c.c t/test-optimized.pb-c.h \ t/issue251/issue251.proto
t/test-full.pb.cc t/test-full.pb.h \
t/generated-code2/test-full-cxx-output.inc
t_version_version_SOURCES = \
t/version/version.c
t_version_version_LDADD = \
protobuf-c/libprotobuf-c.la
endif # CROSS_COMPILING endif # CROSS_COMPILING
endif # BUILD_COMPILER endif # BUILD_COMPILER
......
...@@ -148,9 +148,10 @@ GenerateStructDefinition(io::Printer* printer) { ...@@ -148,9 +148,10 @@ GenerateStructDefinition(io::Printer* printer) {
} }
// Generate the case enums for unions // Generate the case enums for unions
vars["opt_comma"] = ",";
for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
const OneofDescriptor *oneof = descriptor_->oneof_decl(i); const OneofDescriptor *oneof = descriptor_->oneof_decl(i);
vars["opt_comma"] = ",";
vars["oneofname"] = FullNameToUpper(oneof->name()); vars["oneofname"] = FullNameToUpper(oneof->name());
vars["foneofname"] = FullNameToC(oneof->full_name()); vars["foneofname"] = FullNameToC(oneof->full_name());
...@@ -167,7 +168,7 @@ GenerateStructDefinition(io::Printer* printer) { ...@@ -167,7 +168,7 @@ GenerateStructDefinition(io::Printer* printer) {
} }
printer->Print(vars, "$ucclassname$__$oneofname$_$fieldname$ = $fieldnum$$opt_comma$\n"); printer->Print(vars, "$ucclassname$__$oneofname$_$fieldname$ = $fieldnum$$opt_comma$\n");
} }
printer->Print(vars, " PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE($ucclassname$)\n"); printer->Print(vars, " PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE($ucclassname$__$oneofname$)\n");
printer->Outdent(); printer->Outdent();
printer->Print(vars, "} $foneofname$Case;\n\n"); printer->Print(vars, "} $foneofname$Case;\n\n");
} }
......
...@@ -8,6 +8,6 @@ int main(void) ...@@ -8,6 +8,6 @@ int main(void)
{ {
assert(_MESSAGE_TYPE1__FLAG_IS_INT_SIZE == INT_MAX); assert(_MESSAGE_TYPE1__FLAG_IS_INT_SIZE == INT_MAX);
assert(_MESSAGE_TYPE2__ANOTHER_FLAG_IS_INT_SIZE == INT_MAX); assert(_MESSAGE_TYPE2__ANOTHER_FLAG_IS_INT_SIZE == INT_MAX);
assert(_TOP_LEVEL_IS_INT_SIZE == INT_MAX); assert(_TOP_LEVEL__SUBMESSAGES_IS_INT_SIZE == INT_MAX);
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
#include <stdlib.h>
#include "t/issue251/issue251.pb-c.h"
int main(void)
{
/*
* The problem in #251 caused invalid code to be generated in the
* .pb-c.h file, so there's nothing for us to do here.
*/
return EXIT_SUCCESS;
}
message two_oneofs {
oneof first_oneof {
bool a = 10;
bool b = 11;
}
oneof second_oneof {
bool c = 20;
bool d = 21;
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment