summaryrefslogtreecommitdiffstats
path: root/src/evaluate.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/evaluate.c')
-rw-r--r--src/evaluate.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/evaluate.c b/src/evaluate.c
index 9cb2376a..8f0acf72 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -604,11 +604,11 @@ static int list_member_evaluate(struct eval_ctx *ctx, struct expr **expr)
static int expr_evaluate_concat(struct eval_ctx *ctx, struct expr **expr)
{
const struct datatype *dtype = ctx->ectx.dtype, *tmp;
- unsigned int type = dtype ? dtype->type : 0;
+ uint32_t type = dtype ? dtype->type : 0, ntype = 0;
int off = dtype ? dtype->subtypes : 0;
unsigned int flags = EXPR_F_CONSTANT | EXPR_F_SINGLETON;
struct expr *i, *next;
- unsigned int n, len = 0;
+ unsigned int n;
n = 1;
list_for_each_entry_safe(i, next, &(*expr)->expressions, list) {
@@ -624,13 +624,14 @@ static int expr_evaluate_concat(struct eval_ctx *ctx, struct expr **expr)
return -1;
flags &= i->flags;
- len += i->len;
+ ntype <<= TYPE_BITS;
+ ntype |= i->dtype->type;
n++;
}
(*expr)->flags |= flags;
- (*expr)->dtype = concat_type_alloc(*expr);
- (*expr)->len = len;
+ (*expr)->dtype = concat_type_alloc(ntype);
+ (*expr)->len = (*expr)->dtype->size;
if (off > 0)
return expr_error(ctx->msgs, *expr,