Skip to content

type/function redefinition when same tuple/list type appear in both typedef and funcdef #544

@7sDream

Description

@7sDream
// ./wit/issue.wit
default world issue {
    union union-list-u8 {
        list<u8>,
    }

    record record-tuple-u8 {
        field: tuple<u8>,
    }
    
    variant variant-list-tuple-bool {
        field(list<tuple<bool>>),
    }

    import func-using-list-u8-in-args: func(body: list<u8>) -> ()
    export func-using-tuple-u8-in-return: func() -> tuple<u8>
    export func-using-list-tuple-bool-in-return: func() -> list<tuple<bool>>
}

just a simple WIT file, and using wit-bindgen c --out-dir=gen ./wit, it generates:

Generated .h file
// Generated by `wit-bindgen` 0.4.0. DO NOT EDIT!
#ifndef __BINDINGS_ISSUE_H
#define __BINDINGS_ISSUE_H
#ifdef __cplusplus
extern "C" {
#endif

#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>

typedef struct {
  bool f0;
} issue_tuple1_bool_t;

typedef struct {
  issue_tuple1_bool_t *ptr;
  size_t len;
} issue_list_tuple1_bool_t;

typedef struct {
  uint8_t tag;
  union {
    issue_list_tuple1_bool_t field;
  } val;
} issue_variant_list_tuple_bool_t;

#define ISSUE_VARIANT_LIST_TUPLE_BOOL_FIELD 0

typedef struct {
  uint8_t *ptr;
  size_t len;
} issue_list_u8_t;

typedef struct {
  uint8_t tag;
  union {
    issue_list_u8_t f0;
  } val;
} issue_union_list_u8_t;

typedef struct {
  uint8_t f0;
} issue_tuple1_u8_t;

typedef struct {
  issue_tuple1_u8_t field;
} issue_record_tuple_u8_t;

typedef struct {
  uint8_t *ptr;
  size_t len;
} issue_list_u8_t;

typedef struct {
  bool f0;
} issue_tuple1_bool_t;

typedef struct {
  issue_tuple1_bool_t *ptr;
  size_t len;
} issue_list_tuple1_bool_t;

typedef struct {
  uint8_t f0;
} issue_tuple1_u8_t;

// Imported Functions from `issue`
void issue_func_using_list_u8_in_args(issue_list_u8_t *body);

// Exported Functions from `issue`
void issue_func_using_tuple_u8_in_return(issue_tuple1_u8_t *ret);
void issue_func_using_list_tuple_bool_in_return(issue_list_tuple1_bool_t *ret);

// Helper Functions

void issue_list_tuple1_bool_free(issue_list_tuple1_bool_t *ptr);
void issue_variant_list_tuple_bool_free(issue_variant_list_tuple_bool_t *ptr);
void issue_list_u8_free(issue_list_u8_t *ptr);
void issue_union_list_u8_free(issue_union_list_u8_t *ptr);
void issue_list_u8_free(issue_list_u8_t *ptr);
void issue_list_tuple1_bool_free(issue_list_tuple1_bool_t *ptr);

#ifdef __cplusplus
}
#endif
#endif

You can see it defines thoose type/function twice:

  • type issue_list_u8_t and function issue_list_u8_free
  • type issue_tuple1_bool_t
  • type issue_list_tuple1_bool_t and function issue_list_tuple1_bool_free
  • type issue_tuple1_u8_t

Then it makes compiling fail.

I meet this issue when trying the tinygo generator, and the golang wrap type is defined twice too, so it seems to be a common behavior, is this by design?

And I tried type alias, this can fix redefinition issue, so I should alias each complex type instead of using them directly?

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