static unsigned get_expression_precedence(expression_kind_t kind)
{
static const unsigned prec[] = {
- [EXPR_UNKNOWN] = PREC_PRIMARY,
[EXPR_INVALID] = PREC_PRIMARY,
[EXPR_REFERENCE] = PREC_PRIMARY,
[EXPR_REFERENCE_ENUM_VALUE] = PREC_PRIMARY,
if (parenthesized)
print_string("(");
switch (expression->kind) {
- case EXPR_UNKNOWN:
case EXPR_INVALID:
print_string("$invalid expression$");
break;
case EXPR_INVALID:
return EXPR_CLASS_ERROR;
-
- case EXPR_UNKNOWN:
- break;
}
panic("invalid expression found (is constant expression)");
}
case EXPR_LABEL_ADDRESS:
return label_address_to_firm(&expression->label_address);
- case EXPR_UNKNOWN:
case EXPR_INVALID:
break;
}
* Expression kinds.
*/
typedef enum expression_kind_t {
- EXPR_UNKNOWN = 0,
- EXPR_INVALID,
+ EXPR_INVALID = 0,
EXPR_REFERENCE,
EXPR_REFERENCE_ENUM_VALUE,
EXPR_LITERAL_BOOLEAN,
return;
EXPR_LITERAL_CASES
- case EXPR_UNKNOWN:
case EXPR_INVALID:
case EXPR_STRING_LITERAL:
case EXPR_WIDE_STRING_LITERAL:
return
expression_returns(expr->binary.left) &&
expression_returns(expr->binary.right);
-
- case EXPR_UNKNOWN:
- break;
}
panic("unhandled expression");
static bool expression_has_effect(const expression_t *const expr)
{
switch (expr->kind) {
- case EXPR_UNKNOWN: break;
case EXPR_INVALID: return true; /* do NOT warn */
case EXPR_REFERENCE: return false;
case EXPR_REFERENCE_ENUM_VALUE: return false;
left = parser->infix_parser(left);
assert(left != NULL);
- assert(left->kind != EXPR_UNKNOWN);
}
return left;
}
return;
- case EXPR_UNKNOWN:
- panic("unexpected expr kind");
-
case EXPR_COMPOUND_LITERAL:
/* TODO... */
break;