From 6f872e04c85213406dcda52d3d8051f0a3022f6d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 28 Sep 2021 12:24:51 +0100 Subject: [PATCH] Move redundant `auto_cast` error from `-vet` to `-vet-extra` --- src/check_expr.cpp | 5 ++--- src/entity.cpp | 1 + src/llvm_backend_expr.cpp | 11 +++++++++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/check_expr.cpp b/src/check_expr.cpp index 13643b283..b8c600326 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -429,6 +429,7 @@ bool find_or_generate_polymorphic_procedure(CheckerContext *old_c, Entity *base_ if (poly_proc_data) { poly_proc_data->gen_entity = entity; poly_proc_data->proc_info = proc_info; + entity->Procedure.generated_from_polymorphic = proc_info->generated_from_polymorphic; } // NOTE(bill): Check the newly generated procedure body @@ -7965,10 +7966,8 @@ ExprKind check_expr_base_internal(CheckerContext *c, Operand *o, Ast *node, Type Type *type = type_of_expr(ac->expr); check_cast(c, o, type_hint); if (is_type_typed(type) && are_types_identical(type, type_hint)) { - if (build_context.vet) { + if (build_context.vet_extra) { error(node, "Redundant 'auto_cast' applied to expression"); - } else { - // warning(node, "Redundant 'auto_cast' applied to expression"); } } diff --git a/src/entity.cpp b/src/entity.cpp index 11954113d..b79a38a1a 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -183,6 +183,7 @@ struct Entity { DeferredProcedure deferred_procedure; bool is_foreign; bool is_export; + bool generated_from_polymorphic; ProcedureOptimizationMode optimization_mode; } Procedure; struct { diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 64ab2158a..de9acf0ed 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -1204,6 +1204,17 @@ lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) { } return lb_emit_conv(p, res, t); } + + if (is_type_integer_128bit(dst)) { + auto args = array_make(temporary_allocator(), 1); + args[0] = value; + char const *call = "fixunsdfdi"; + if (is_type_unsigned(dst)) { + call = "fixunsdfti"; + } + lbValue res_i128 = lb_emit_runtime_call(p, call, args); + return lb_emit_conv(p, res_i128, t); + } lbValue res = {}; res.type = t;