aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lower.c10
-rw-r--r--src/parser.y4
-rw-r--r--tests/if.ek2
-rw-r--r--tests/struct_call.ek20
-rw-r--r--tests/struct_call_ref.ek29
5 files changed, 41 insertions, 24 deletions
diff --git a/src/lower.c b/src/lower.c
index dba4e5c..1ce91a4 100644
--- a/src/lower.c
+++ b/src/lower.c
@@ -193,14 +193,14 @@ static char *mangle_idx(struct ast *id, size_t idx)
assert(id->scope);
assert(id->s);
- const char *name = id->s;
+ char *name = id->s;
/* oh wait, I need to do a variable lookup on the ID, not use the ID's
* scope number, duh */
- size_t number = get_scope_number(id);
-
- if (ast_flags(id, AST_FLAG_NOMANGLE))
+ struct ast *def = file_scope_find_symbol(id->scope, name);
+ if (ast_flags(def, AST_FLAG_NOMANGLE))
return strdup(name);
+ size_t number = get_scope_number(def);
return build_str("%s_s%zif%zi", name, number, idx);
}
@@ -410,7 +410,7 @@ static void do_store(struct lower_state *s, struct retval *from,
int64_t addr = strtoll(o.s, 0, 0);
/* doesn't really take into account possible padding etc, should
* probably fix at some point */
- printf("%s >> %s %s %zi;\n", from->s, retval_type_str(t), t.s, addr);
+ printf("%s >> %s %s %zi;\n", from->s, retval_type_str(*from), t.s, addr);
}
static int lower_cast(struct lower_state *s, struct ast *e,
diff --git a/src/parser.y b/src/parser.y
index 4837a53..b120e1b 100644
--- a/src/parser.y
+++ b/src/parser.y
@@ -691,11 +691,11 @@ proc
NULL,
src_loc(@$));
- ast_set_flags($$, AST_FLAG_EXTERN);
+ ast_set_flags($$, AST_FLAG_EXTERN | AST_FLAG_NOMANGLE);
}
| "extern" ID "(" opt_decls ")" {
$$ = gen_proc($[ID], $[opt_decls], NULL, NULL, src_loc(@$));
- ast_set_flags($$, AST_FLAG_EXTERN);
+ ast_set_flags($$, AST_FLAG_EXTERN | AST_FLAG_NOMANGLE);
}
member
diff --git a/tests/if.ek b/tests/if.ek
index ba8077b..cd4341d 100644
--- a/tests/if.ek
+++ b/tests/if.ek
@@ -16,7 +16,7 @@ main()
putchar('1');
}
else {
- putchar('1');
+ putchar('2');
}
putchar('\n');
diff --git a/tests/struct_call.ek b/tests/struct_call.ek
index d73dfb1..7d2559b 100644
--- a/tests/struct_call.ek
+++ b/tests/struct_call.ek
@@ -6,32 +6,20 @@ typedef int_pair {
i27 b;
}
-extern putchar(i9 c);
+extern _putchar(i9 c);
add_int_pair(int_pair a, int_pair b => int_pair)
{
return int_pair!{.a = a.a + b.a, .b = a.b + b.b};
}
-add_int_pair_self(*int_pair a, *int_pair b)
-{
- a*.a = a*.a + b*.a;
- a*.b = a*.b + b*.b;
-}
-
main()
{
mut a = int_pair!{.a = 1, .b = 2};
mut b = int_pair!{.a = 3, .b = 4};
mut n = add_int_pair(a, b);
- putchar('0' + n.a as i9);
- putchar('0' + n.b as i9);
-
- add_int_pair_self(a&, b&);
-
- putchar('0' + a.a as i9);
- putchar('0' + a.b as i9);
- putchar('0' + b.a as i9);
- putchar('0' + b.b as i9);
+ _putchar('0' + n.a as i9);
+ _putchar('0' + n.b as i9);
+ _putchar('\n');
}
diff --git a/tests/struct_call_ref.ek b/tests/struct_call_ref.ek
new file mode 100644
index 0000000..a4d38bc
--- /dev/null
+++ b/tests/struct_call_ref.ek
@@ -0,0 +1,29 @@
+typedef i27 {}
+typedef i9 {}
+
+typedef int_pair {
+ i27 a;
+ i27 b;
+}
+
+extern _putchar(i9 c);
+
+add_int_pair_self(*int_pair a, *int_pair b)
+{
+ a*.a = a*.a + b*.a;
+ a*.b = a*.b + b*.b;
+}
+
+main()
+{
+ mut a = int_pair!{.a = 1, .b = 2};
+ mut b = int_pair!{.a = 3, .b = 4};
+
+ add_int_pair_self(a&, b&);
+
+ _putchar('0' + a.a as i9);
+ _putchar('0' + a.b as i9);
+ _putchar('0' + b.a as i9);
+ _putchar('0' + b.b as i9);
+ _putchar('\n');
+}