gcc - error: dereferencing pointer to incomplete type

18,961

You are mixing typedef identifiers and struct scope identifiers. This can't work. Do something like

typedef struct  BooleanExpr BooleanExpr;

before all your struct declarations and have these only as

struct BooleanExpr { ...

without the typedef.

In your code you never defined struct BooleanExp but only an anonymous struct that you alias to the identifier BooleanExp.

Share:
18,961
AlexJ136
Author by

AlexJ136

Postgraduate computer science student

Updated on June 04, 2022

Comments

  • AlexJ136
    AlexJ136 almost 2 years

    I have a rather convoluted set of nested structs/unions as shown:

    typedef enum {
        expr_BooleanExpr,
        expr_ArithmeticExpr
    } expr_type;
    
    typedef union {
        struct BooleanExpr *_bool;
        struct ArithmeticExpr *_arith;
    } u_expr;
    
    typedef struct {
        expr_type type;
        u_expr *expr;
    } Expression;
    
    typedef struct {
        Expression *lhs;
        char *op;
        Expression *rhs;
    } BooleanExpr;
    
    typedef struct {
        Expression *lhs;
        char *op;
        Expression *rhs;
    } ArithmeticExpr;
    

    gcc is happy for me to create an Expression struct containing a BoolExpression value in its union field as shown:

    Expression *BooleanExpr_init(Expression *lhs, char *op, Expression *rhs) {
    
        BooleanExpr *_bool = safe_alloc(sizeof(BooleanExpr));
        _bool->lhs = lhs;
        _bool->op = op;
        _bool->rhs = rhs;
    
        Expression *the_exp = safe_alloc(sizeof(Expression));
        the_exp->type = expr_BooleanExpr;
        the_exp->expr->_bool = _bool;
    
        return the_exp;
    }
    

    although it gives a warning: assignment from incompatible pointer type [enabled by default] for the line: the_exp->expr->_bool = _bool;

    However, when accessing the inner expressions such as lhs and rhs, with an expression like

    an_expr->expr->_bool->rhs
    

    where an_expr is a previously created Expression struct, I get the error specified in the title of this post.

    Much of what I've read says that this results from the use of the -> operator where the . operator is required. However this is not appropriate since everything is a pointer, so the implicit dereference of the -> operator is required.

    Any ideas?