From 6e6d138c2f50f95fe9c6b4acbc16ffa17475a4a5 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 25 Aug 2016 20:52:35 -0700 Subject: add ability to explicitly cast enum with no payload to int --- src/analyze.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'src/analyze.cpp') diff --git a/src/analyze.cpp b/src/analyze.cpp index 597c07f8e2..5ffce5bdb8 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -2641,7 +2641,12 @@ static TypeTableEntry *analyze_container_init_expr(CodeGen *g, ImportTableEntry codegen->type_entry = fixed_size_array_type; codegen->source_node = node; if (!const_val->ok) { - context->fn_entry->struct_val_expr_alloca_list.append(codegen); + if (!context->fn_entry) { + add_node_error(g, node, + buf_sprintf("unable to evaluate constant expression")); + } else { + context->fn_entry->struct_val_expr_alloca_list.append(codegen); + } } return fixed_size_array_type; @@ -4601,6 +4606,14 @@ static TypeTableEntry *analyze_cast_expr(CodeGen *g, ImportTableEntry *import, B return resolve_cast(g, context, node, expr_node, wanted_type, CastOpIntToEnum, false); } + // explicit cast from enum type with no payload to integer + if (wanted_type->id == TypeTableEntryIdInt && + actual_type->id == TypeTableEntryIdEnum && + actual_type->data.enumeration.gen_field_count == 0) + { + return resolve_cast(g, context, node, expr_node, wanted_type, CastOpEnumToInt, false); + } + add_node_error(g, node, buf_sprintf("invalid cast from type '%s' to '%s'", buf_ptr(&actual_type->name), -- cgit v1.2.3