Merge into master from pull request #223:
loci: fix bug in new wire type parsers (https://github.com/floodlight/loxigen/pull/223)
diff --git a/c_gen/c_test_gen.py b/c_gen/c_test_gen.py
index 5b74649..316a2b3 100644
--- a/c_gen/c_test_gen.py
+++ b/c_gen/c_test_gen.py
@@ -543,6 +543,24 @@
     TEST_ASSERT(obj->object_id == %(u_cls)s);
 """ % dict(cls=cls, u_cls=cls.upper(),
            v_name=v_name, length=length, version=version))
+
+    # If this class is a concrete member of an inheritance hierarchy,
+    # run the hierarchy's root wire type parser and assert it returns
+    # the expected object id.
+    ofclass = loxi_globals.unified.class_by_name(cls)
+    if ofclass and not ofclass.virtual:
+        root = ofclass
+        while root.superclass:
+            root = root.superclass
+        if root.virtual:
+            out.write("""
+    {
+        of_object_id_t object_id;
+        %(root_cls)s_wire_object_id_get(obj, &object_id);
+        TEST_ASSERT(object_id == %(u_cls)s);
+    }
+""" % dict(root_cls=root.name, u_cls=cls.upper()))
+
     if not type_maps.class_is_virtual(cls):
         out.write("""
     if (obj->wire_length_get != NULL) {
@@ -1106,6 +1124,7 @@
     uint8_t *msg_buf;
     int value;
     int len;
+    of_object_id_t object_id;
 
     obj = %(cls)s_new(%(v_name)s);
     TEST_ASSERT(obj != NULL);
@@ -1114,6 +1133,9 @@
     TEST_ASSERT(obj->parent == NULL);
     TEST_ASSERT(obj->object_id == %(enum)s);
 
+    of_header_wire_object_id_get(obj, &object_id);
+    TEST_ASSERT(object_id == %(enum)s);
+
     /* Set up incrementing values for scalar members */
     value = %(cls)s_%(v_name)s_populate_scalars(obj, 1);
     TEST_ASSERT(value != 0);
diff --git a/c_gen/codegen.py b/c_gen/codegen.py
index 6f0f6e9..af4dfa4 100644
--- a/c_gen/codegen.py
+++ b/c_gen/codegen.py
@@ -89,11 +89,10 @@
     if not uclass.virtual:
         return None
 
-    discriminator = uclass.discriminator
-
     # Generate a dict of version -> ParseWireTypesVersion
     versioned = {}
     for version, ofclass in sorted(uclass.version_classes.items()):
+        discriminator = ofclass.discriminator
         subclasses = [ParseWireTypesSubclass(class_name=subclass.name,
                                              value=subclass.member_by_name(discriminator.name).value,
                                              virtual=subclass.virtual)