Yes that is correct. Also things like varaddress - varaddress can be resolved to constant zero  which is why the extra logic is needed.
GCC and clang seem to handle fairly sophisticated constant expressions, but writing the logic for handling these cases doesn't seem particularly elegant to me though I can't really think of a better solution. One thing that that annoys me with this approach, is all the logic for handling things like pointer arithmetic correctly is essentially duplicated by this approach (once in gen.c and once in constexpr.c).

I think it might also need more forms to handle other types of constant expressions.
```
typedef struct {
   union {
    long lval;
    double dval;
    //All type of constant, maybe even signed.
    };
    char *label;
} ConstExpr;
```