qapi: Fix generated code when flat union has member 'kind'
A flat union's tag member gets renamed to 'kind' in the generated
code.  Breaks when another member named 'kind' exists.
Example, adapted from qapi-schema-test.json:
    { 'struct': 'UserDefUnionBase',
      'data': { 'kind': 'str', 'enum1': 'EnumOne' } }
We generate:
    struct UserDefFlatUnion
    {
        EnumOne kind;
        union {
            void *data;
            UserDefA *value1;
            UserDefB *value2;
            UserDefB *value3;
        };
        char *kind;
    };
Kill the silly rename.
Reported-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
			
			
This commit is contained in:
		
							parent
							
								
									5aa05d3f72
								
							
						
					
					
						commit
						0f61af3eb3
					
				| @ -200,11 +200,12 @@ def generate_union(expr, meta): | ||||
|     ret = mcgen(''' | ||||
| struct %(name)s | ||||
| { | ||||
|     %(discriminator_type_name)s kind; | ||||
|     %(discriminator_type_name)s %(discriminator)s; | ||||
|     union { | ||||
|         void *data; | ||||
| ''', | ||||
|                 name=name, | ||||
|                 discriminator=c_name(discriminator or 'kind'), | ||||
|                 discriminator_type_name=c_name(discriminator_type_name)) | ||||
| 
 | ||||
|     for key in typeinfo: | ||||
|  | ||||
| @ -288,20 +288,23 @@ void visit_type_%(name)s(Visitor *m, %(name)s **obj, const char *name, Error **e | ||||
|                      name=c_name(name)) | ||||
| 
 | ||||
|     if not discriminator: | ||||
|         tag = 'kind' | ||||
|         disc_key = "type" | ||||
|     else: | ||||
|         tag = discriminator | ||||
|         disc_key = discriminator | ||||
|     ret += mcgen(''' | ||||
|         visit_type_%(disc_type)s(m, &(*obj)->kind, "%(disc_key)s", &err); | ||||
|         visit_type_%(disc_type)s(m, &(*obj)->%(c_tag)s, "%(disc_key)s", &err); | ||||
|         if (err) { | ||||
|             goto out_obj; | ||||
|         } | ||||
|         if (!visit_start_union(m, !!(*obj)->data, &err) || err) { | ||||
|             goto out_obj; | ||||
|         } | ||||
|         switch ((*obj)->kind) { | ||||
|         switch ((*obj)->%(c_tag)s) { | ||||
| ''', | ||||
|                  disc_type = disc_type, | ||||
|                  c_tag=c_name(tag), | ||||
|                  disc_key = disc_key) | ||||
| 
 | ||||
|     for key in members: | ||||
|  | ||||
| @ -313,7 +313,7 @@ static void test_visitor_in_union_flat(TestInputVisitorData *data, | ||||
| 
 | ||||
|     visit_type_UserDefFlatUnion(v, &tmp, NULL, &err); | ||||
|     g_assert(err == NULL); | ||||
|     g_assert_cmpint(tmp->kind, ==, ENUM_ONE_VALUE1); | ||||
|     g_assert_cmpint(tmp->enum1, ==, ENUM_ONE_VALUE1); | ||||
|     g_assert_cmpstr(tmp->string, ==, "str"); | ||||
|     /* TODO g_assert_cmpint(tmp->integer, ==, 41); */ | ||||
|     g_assert_cmpint(tmp->value1->boolean, ==, true); | ||||
|  | ||||
| @ -437,7 +437,7 @@ static void test_visitor_out_union_flat(TestOutputVisitorData *data, | ||||
|     Error *err = NULL; | ||||
| 
 | ||||
|     UserDefFlatUnion *tmp = g_malloc0(sizeof(UserDefFlatUnion)); | ||||
|     tmp->kind = ENUM_ONE_VALUE1; | ||||
|     tmp->enum1 = ENUM_ONE_VALUE1; | ||||
|     tmp->string = g_strdup("str"); | ||||
|     tmp->value1 = g_malloc0(sizeof(UserDefA)); | ||||
|     /* TODO when generator bug is fixed: tmp->integer = 41; */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Markus Armbruster
						Markus Armbruster