summaryrefslogtreecommitdiffstats
path: root/src/datatype.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/datatype.c')
-rw-r--r--src/datatype.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/src/datatype.c b/src/datatype.c
index 5f976aa3..7c9c3d48 100644
--- a/src/datatype.c
+++ b/src/datatype.c
@@ -125,21 +125,28 @@ struct error_record *symbolic_constant_parse(const struct expr *sym,
break;
}
- dtype = sym->dtype;
- if (s->identifier == NULL) {
- *res = NULL;
- erec = sym->dtype->basetype->parse(sym, res);
- if (erec != NULL)
- return erec;
- if (*res)
- return NULL;
+ if (s->identifier != NULL)
+ goto out;
- return error(&sym->location, "Could not parse %s", dtype->desc);
- }
+ dtype = sym->dtype;
+ *res = NULL;
+ do {
+ if (dtype->basetype->parse) {
+ erec = dtype->basetype->parse(sym, res);
+ if (erec != NULL)
+ return erec;
+ if (*res)
+ return NULL;
+ goto out;
+ }
+ } while ((dtype = dtype->basetype));
- *res = constant_expr_alloc(&sym->location, dtype,
- dtype->byteorder, dtype->size,
- constant_data_ptr(s->value, dtype->size));
+ return error(&sym->location, "Could not parse %s", sym->dtype->desc);
+out:
+ *res = constant_expr_alloc(&sym->location, sym->dtype,
+ sym->dtype->byteorder, sym->dtype->size,
+ constant_data_ptr(s->value,
+ sym->dtype->size));
return NULL;
}