Implement adding an integer to a pointer
This commit is contained in:
parent
7b36a3803f
commit
057908fc85
23
example.elna
23
example.elna
@ -135,8 +135,29 @@ begin
|
||||
writei(x)
|
||||
end;
|
||||
|
||||
proc test_return_int(): Int;
|
||||
begin
|
||||
writei("");
|
||||
writei("Test return int:");
|
||||
return 5
|
||||
end;
|
||||
|
||||
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
|
||||
test_primitive();
|
||||
test_string();
|
||||
@ -149,6 +170,8 @@ begin
|
||||
test_param(8, 7);
|
||||
test_const_char();
|
||||
test_union();
|
||||
writei(test_return_int());
|
||||
test_add_pointer();
|
||||
|
||||
exit(0)
|
||||
end.
|
||||
|
@ -20,6 +20,10 @@ namespace gcc
|
||||
{
|
||||
return "Int";
|
||||
}
|
||||
else if (type == unsigned_type_node)
|
||||
{
|
||||
return "Word";
|
||||
}
|
||||
else if (type == boolean_type_node)
|
||||
{
|
||||
return "Bool";
|
||||
|
@ -42,6 +42,10 @@ namespace gcc
|
||||
{
|
||||
format_number = "%d\n";
|
||||
}
|
||||
else if (argument_type == unsigned_type_node)
|
||||
{
|
||||
format_number = "%u\n";
|
||||
}
|
||||
else if (argument_type == double_type_node)
|
||||
{
|
||||
format_number = "%f\n";
|
||||
@ -316,6 +320,16 @@ namespace gcc
|
||||
tree_code operator_code = ERROR_MARK;
|
||||
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)
|
||||
{
|
||||
error_at(expression_location,
|
||||
|
@ -74,6 +74,7 @@ namespace gcc
|
||||
std::make_shared<elna::source::symbol_table<tree>>();
|
||||
|
||||
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("Float", source::make_info(double_type_node));
|
||||
initial_table->enter("Char", source::make_info(elna_char_type_node));
|
||||
|
Loading…
x
Reference in New Issue
Block a user