On Thursday, 11 November 2021 at 07:10:39 UTC, Mathias LANG wrote:
[...]

Your type definition is wrong:
```D
struct toml_datum_t {
  int ok;
  union u {
    toml_timestamp_t* ts; /* ts must be freed after use */
    char*   s; /* string value. s must be freed after use */
    int     b; /* bool value */
    int64_t i; /* int value */
    double  d; /* double value */
  }
}
```

If you check the size of this struct, it's going to be 4,
because `u` is a type definition. What you want is either:

```D
struct toml_datum_t {
  int ok;
  union {
    toml_timestamp_t* ts; /* ts must be freed after use */
    char*   s; /* string value. s must be freed after use */
    int     b; /* bool value */
    int64_t i; /* int value */
    double  d; /* double value */
  }
}
```

Which you access via `host.s` or:

```D
struct toml_datum_t {
  int ok;
  /// This is the type definition
  union U {
    toml_timestamp_t* ts; /* ts must be freed after use */
    char*   s; /* string value. s must be freed after use */
    int     b; /* bool value */
    int64_t i; /* int value */
    double  d; /* double value */
  }
  /// This is the field
  U u;
}
```

Note that instead of doing this work yourself, I would highly recommend the excellent [dstep](https://github.com/jacob-carlborg/dstep).

Fixed formatting (so much for "Fix it for me").

Reply via email to