diff --git a/releasenotes.md b/releasenotes.md index cd703e60c..f78475b9d 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -38,6 +38,7 @@ - Standard library is now correctly weakly linked, fixing the use of C3 .so together with executable. #1549, #1107. - Wrong error message for interface methods with body #1536. - Empty expression block would crash compiler with debug on #1554. +- Improve infer conversions on constants, e.g. `ZString a = foo ? "a" : "b";` #1561 ### Stdlib changes - Remove unintended print of `char[]` as String diff --git a/src/compiler/sema_expr.c b/src/compiler/sema_expr.c index ace65414c..a379f574b 100644 --- a/src/compiler/sema_expr.c +++ b/src/compiler/sema_expr.c @@ -9507,6 +9507,10 @@ bool sema_analyse_inferred_expr(SemaContext *context, Type *infer_type, Expr *ex SEMA_ERROR(expr, "Recursive resolution of list."); return expr_poison(expr); case RESOLVE_DONE: + if (infer_type && expr->type != infer_type) + { + cast_implicit_silent(context, expr, infer_type, false); + } return expr_ok(expr); default: UNREACHABLE diff --git a/test/test_suite/errors/error_regression_2.c3t b/test/test_suite/errors/error_regression_2.c3t index 831fa52a9..766d4ea9d 100644 --- a/test/test_suite/errors/error_regression_2.c3t +++ b/test/test_suite/errors/error_regression_2.c3t @@ -639,9 +639,8 @@ err_retblock: ; preds = %assign_optional4, % define ptr @test.bool_to_string(i8 zeroext %0) #0 { entry: %1 = trunc i8 %0 to i1 - %ternary = select i1 %1, %"char[]" { ptr @.str.10, i64 4 }, %"char[]" { ptr @.str.11, i64 5 } - %2 = extractvalue %"char[]" %ternary, 0 - ret ptr %2 + %ternary = select i1 %1, ptr @.str.10, ptr @.str.11 + ret ptr %ternary } ; Function Attrs: