Implement adding an integer to a pointer

This commit is contained in:
Eugen Wissner 2025-01-20 21:46:03 +01:00
parent 7b36a3803f
commit 057908fc85
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
5 changed files with 43 additions and 1 deletions

View File

@ -135,8 +135,29 @@ begin
writei(x) writei(x)
end; end;
proc test_return_int(): Int;
begin
writei("");
writei("Test return int:");
return 5
end;
proc exit(code: Int); extern; proc exit(code: Int); extern;
proc test_add_pointer();
var x: Int, p1: pointer to Int;
begin
writei("");
writei("Test add pointer:");
x := 5;
p1 := @x;
writei(p1);
p1 := p1 + 2;
writei(p1)
end;
begin begin
test_primitive(); test_primitive();
test_string(); test_string();
@ -149,6 +170,8 @@ begin
test_param(8, 7); test_param(8, 7);
test_const_char(); test_const_char();
test_union(); test_union();
writei(test_return_int());
test_add_pointer();
exit(0) exit(0)
end. end.

View File

@ -10,5 +10,5 @@
tree convert(tree /* type */, tree expr) tree convert(tree /* type */, tree expr)
{ {
return expr; return expr;
} }

View File

@ -20,6 +20,10 @@ namespace gcc
{ {
return "Int"; return "Int";
} }
else if (type == unsigned_type_node)
{
return "Word";
}
else if (type == boolean_type_node) else if (type == boolean_type_node)
{ {
return "Bool"; return "Bool";

View File

@ -42,6 +42,10 @@ namespace gcc
{ {
format_number = "%d\n"; format_number = "%d\n";
} }
else if (argument_type == unsigned_type_node)
{
format_number = "%u\n";
}
else if (argument_type == double_type_node) else if (argument_type == double_type_node)
{ {
format_number = "%f\n"; format_number = "%f\n";
@ -316,6 +320,16 @@ namespace gcc
tree_code operator_code = ERROR_MARK; tree_code operator_code = ERROR_MARK;
tree target_type = error_mark_node; tree target_type = error_mark_node;
if (is_pointer_type(left_type)
&& (right_type == integer_type_node || right_type == unsigned_type_node)
&& expression->operation() == source::binary_operator::sum)
{
tree convert_expression = build1_loc(expression_location, CONVERT_EXPR,
sizetype, right);
this->current_expression = build2_loc(expression_location,
POINTER_PLUS_EXPR, left_type, left, convert_expression);
return;
}
if (left_type != right_type) if (left_type != right_type)
{ {
error_at(expression_location, error_at(expression_location,

View File

@ -74,6 +74,7 @@ namespace gcc
std::make_shared<elna::source::symbol_table<tree>>(); std::make_shared<elna::source::symbol_table<tree>>();
initial_table->enter("Int", source::make_info(integer_type_node)); initial_table->enter("Int", source::make_info(integer_type_node));
initial_table->enter("Word", source::make_info(unsigned_type_node));
initial_table->enter("Bool", source::make_info(boolean_type_node)); initial_table->enter("Bool", source::make_info(boolean_type_node));
initial_table->enter("Float", source::make_info(double_type_node)); initial_table->enter("Float", source::make_info(double_type_node));
initial_table->enter("Char", source::make_info(elna_char_type_node)); initial_table->enter("Char", source::make_info(elna_char_type_node));