Fix handling of forward-declared enums

Don't output the enum body if it just forward-declared, empty enums are
invalid in C.
This commit is contained in:
Vadim Zeitlin 2016-04-17 19:38:33 +02:00
commit c4036fdc58

View file

@ -116,6 +116,9 @@ class C:public Language {
// Contains fully expanded names of the classes for which we have already specialized SWIG_derives_from<>. // Contains fully expanded names of the classes for which we have already specialized SWIG_derives_from<>.
Hash *already_specialized_derives_from; Hash *already_specialized_derives_from;
// Used only while generating wrappers for an enum, initially true and reset to false as soon as we see any enum elements.
bool enum_is_empty;
bool except_flag; bool except_flag;
public: public:
@ -1724,12 +1727,18 @@ ready:
Printv(f_wrappers_types, " ", enumname, NIL); Printv(f_wrappers_types, " ", enumname, NIL);
Delete(enumname); Delete(enumname);
} }
Printv(f_wrappers_types, " {\n", NIL);
// We don't know here if we're going to have any non-ignored enum elements, so let enumvalueDeclaration() itself reset this flag if it does get called, this
// is simpler than trying to determine it here, even if it's a bit ugly because we generate the opening brace there, but the closing one here.
enum_is_empty = true;
// Emit each enum item. // Emit each enum item.
Language::enumDeclaration(n); Language::enumDeclaration(n);
Printv(f_wrappers_types, "\n}", NIL); if (!enum_is_empty) {
Printv(f_wrappers_types, "\n}", NIL);
}
if (tdname) { if (tdname) {
String* const enumname = Swig_name_mangle(tdname); String* const enumname = Swig_name_mangle(tdname);
Printv(f_wrappers_types, " ", enumname, NIL); Printv(f_wrappers_types, " ", enumname, NIL);
@ -1749,7 +1758,11 @@ ready:
return SWIG_NOWRAP; return SWIG_NOWRAP;
Swig_require("enumvalueDeclaration", n, "*value", "?enumvalueex", "?enumvalue", NIL); Swig_require("enumvalueDeclaration", n, "*value", "?enumvalueex", "?enumvalue", NIL);
if (!GetFlag(n, "firstenumitem")) enum_is_empty = false;
if (GetFlag(n, "firstenumitem"))
Printv(f_wrappers_types, " {\n", NIL);
else
Printv(f_wrappers_types, ",\n", NIL); Printv(f_wrappers_types, ",\n", NIL);
String* const enumitemname = Getattr(n, "value"); String* const enumitemname = Getattr(n, "value");