aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compile/promotions.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/compile/promotions.c b/src/compile/promotions.c
index 93ad5338..5b0ccb95 100644
--- a/src/compile/promotions.c
+++ b/src/compile/promotions.c
@@ -26,18 +26,21 @@ bool promote(env_t *env, ast_t *ast, Text_t *code, type_t *actual, type_t *neede
if (more_complete) return true;
// Serialization/deserialization:
- if (type_eq(needed, Type(ListType, Type(ByteType)))) {
- *code = Texts("generic_serialize((", compile_declaration(actual, Text("[1]")), "){", *code, "}, ",
- compile_type_info(actual), ")");
- return true;
- } else if (type_eq(actual, Type(ListType, Type(ByteType)))) {
- *code = Texts("({ ", compile_declaration(needed, Text("deserialized")),
- ";\n"
- "generic_deserialize(",
- *code, ", &deserialized, ", compile_type_info(needed),
- ");\n"
- "deserialized; })");
- return true;
+ if (!type_eq(non_optional(value_type(needed)), Type(ListType, Type(ByteType)))
+ || !type_eq(non_optional(value_type(actual)), Type(ListType, Type(ByteType)))) {
+ if (type_eq(needed, Type(ListType, Type(ByteType)))) {
+ *code = Texts("generic_serialize((", compile_declaration(actual, Text("[1]")), "){", *code, "}, ",
+ compile_type_info(actual), ")");
+ return true;
+ } else if (type_eq(actual, Type(ListType, Type(ByteType)))) {
+ *code = Texts("({ ", compile_declaration(needed, Text("deserialized")),
+ ";\n"
+ "generic_deserialize(",
+ *code, ", &deserialized, ", compile_type_info(needed),
+ ");\n"
+ "deserialized; })");
+ return true;
+ }
}
// Optional promotion: