orangeduck/BuildYourOwnLisp

[chap 9] invalid struct definition using clang

Closed this issue · 2 comments

loving the book

when i was reformatting in chapter nine and added the line struct lval** cell to the struct definition, my version of clang [Apple LLVM version 9.1.0 (clang-902.0.39.1)] threw a bunch of warnings and the following error:

lval.c:123:19: error: incomplete definition of type 'struct lval'
    if (v->cell[i]->type == LVAL_ERR) { return lval_take(v, i); }
        ~~~~~~~~~~^

and this note:

./lval.h:14:10: note: forward declaration of 'struct lval'
  struct lval** cell;

which led me to believe that line of the struct definition was being parsed as its own struct definition.

i fixed this by changing the definition and forward declaring the struct like so:

typedef struct lval lval;

struct lval {
  int type;
  long num;
  /* error and symbol types with string data */
  char *err;
  char *sym;
  /* count and pointer to a list of lval* */
  int count;
  lval** cell;
};

Hey,

Thanks, glad you are enjoying the book. Did you make the new struct definition exactly as it appears in the book and still get the error?

typedef struct lval {
  int type;
  long num;
  /* Error and Symbol types have some string data */
  char* err;
  char* sym;
  /* Count and Pointer to a list of "lval*" */
  int count;
  struct lval** cell;
} lval;

I'm wondering if this is some new kind of default behavior in clang...

I tried to reproduce the error and I think I had neglected to name the struct before naming the type (like so:

typedef struct {
  int type;
  long num;
  /* Error and Symbol types have some string data */
  char* err;
  char* sym;
  /* Count and Pointer to a list of "lval*" */
  int count;
  struct lval** cell;
} lval;

)

my mistake there!
thanks for the response though