diff options
| author | Ginger Bill <bill@gingerbill.org> | 2017-04-26 19:43:17 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2017-04-26 19:43:17 +0100 |
| commit | 5b8be2593821c7b30adf010bc90dfa8ab2930a72 (patch) | |
| tree | 8d251da1cf54b6771f9b849ec9dc7862d8eb333f /src/ir.c | |
| parent | 29efdc5fc15b760e773b767ab81e0e825b3b85f7 (diff) | |
`fmt.String_Buffer`, Fix issue #44, Tweak overloading rules
Diffstat (limited to 'src/ir.c')
| -rw-r--r-- | src/ir.c | 33 |
1 files changed, 23 insertions, 10 deletions
@@ -3284,23 +3284,34 @@ String ir_mangle_name(irGen *s, String path, Entity *e) { char const *ext = gb_path_extension(base); isize base_len = ext-1-base; - isize max_len = base_len + 1 + 10 + 1 + name.len; + isize max_len = base_len + 1 + 1 + 10 + 1 + name.len; bool is_overloaded = check_is_entity_overloaded(e); if (is_overloaded) { max_len += 21; } u8 *new_name = gb_alloc_array(a, u8, max_len); - isize new_name_len = gb_snprintf( - cast(char *)new_name, max_len, - "%.*s-%u.%.*s", - cast(int)base_len, base, - file->id, - LIT(name)); + isize new_name_len = 0; + if ((base_len > 0 && gb_char_is_digit(base[0])) || + base_len == 0) { + new_name_len = gb_snprintf( + cast(char *)new_name, max_len, + "_%.*s-%u.%.*s", + cast(int)base_len, base, + file->id, + LIT(name)); + } else { + new_name_len = gb_snprintf( + cast(char *)new_name, max_len, + "%.*s-%u.%.*s", + cast(int)base_len, base, + file->id, + LIT(name)); + } if (is_overloaded) { char *str = cast(char *)new_name + new_name_len-1; isize len = max_len-new_name_len; - isize extra = gb_snprintf(str, len, "-%tu", cast(usize)cast(uintptr)e); + isize extra = gb_snprintf(str, len, "-%llu", cast(unsigned long long)e->id); new_name_len += extra-1; } @@ -4311,7 +4322,7 @@ irValue *ir_build_expr(irProcedure *proc, AstNode *expr) { irValue *kmag = ir_build_expr(proc, ce->args.e[3]); irValue *dst = ir_add_local_generated(proc, tv->type); - Type *ft = base_complex_elem_type(tv->type); + Type *ft = base_quaternion_elem_type(tv->type); real = ir_emit_conv(proc, real, ft); imag = ir_emit_conv(proc, imag, ft); jmag = ir_emit_conv(proc, jmag, ft); @@ -7217,6 +7228,7 @@ void ir_gen_tree(irGen *s) { if (var->init != NULL && var->init->kind == irValue_Constant) { Type *t = type_deref(ir_type(var->var)); if (is_type_any(t)) { + // NOTE(bill): Edge case for `any` type Type *var_type = default_type(ir_type(var->init)); irValue *g = ir_add_global_generated(proc->module, var_type, var->init); irValue *data = ir_emit_struct_ep(proc, var->var, 0); @@ -7233,7 +7245,8 @@ void ir_gen_tree(irGen *s) { irGlobalVariable *var = &global_variables.e[i]; if (var->init != NULL && var->init->kind != irValue_Constant) { Type *t = type_deref(ir_type(var->var)); - if (is_type_any(t)) { + if (is_type_any(t)) { + // NOTE(bill): Edge case for `any` type Type *var_type = default_type(ir_type(var->init)); irValue *g = ir_add_global_generated(proc->module, var_type, var->init); ir_emit_store(proc, g, var->init); |