diff options
-rw-r--r-- | evaluate.c | 20 | ||||
-rw-r--r-- | validation/generic-bad0.c | 4 |
2 files changed, 24 insertions, 0 deletions
@@ -3299,9 +3299,29 @@ static struct symbol *evaluate_generic_selection(struct expression *expr) source.ctype.modifiers &= ~(MOD_QUALIFIER|MOD_ATOMIC); for (map = expr->map; map; map = map->next) { struct symbol *stype = map->type; + struct symbol *base; if (!evaluate_symbol(stype)) continue; + + if (stype->type == SYM_NODE) + base = stype->ctype.base_type; + + if (base->type == SYM_ARRAY && base->array_size) { + get_expression_value_silent(base->array_size); + if (base->array_size->type == EXPR_VALUE) + continue; + sparse_error(stype->pos, "variable length array type in generic selection"); + continue; + } + if (is_func_type(stype)) { + sparse_error(stype->pos, "function type in generic selection"); + continue; + } + if (stype->bit_size <= 0 || is_void_type(stype)) { + sparse_error(stype->pos, "incomplete type in generic selection"); + continue; + } if (!type_selection(&source, stype)) continue; diff --git a/validation/generic-bad0.c b/validation/generic-bad0.c index acc3d5e7..d11030db 100644 --- a/validation/generic-bad0.c +++ b/validation/generic-bad0.c @@ -18,6 +18,10 @@ void foo(int n) generic-bad0.c:5:33: warning: multiple default in generic expression generic-bad0.c:5:30: note: previous was here generic-bad0.c:6:25: warning: Variable length array is used. +generic-bad0.c:6:21: error: variable length array type in generic selection +generic-bad0.c:7:21: error: incomplete type in generic selection +generic-bad0.c:8:21: error: incomplete type in generic selection +generic-bad0.c:9:21: error: function type in generic selection generic-bad0.c:11:17: error: no generic selection for 'int [addressable] n' * check-error-end */ |