Forbid redefenition of builtin types
This commit is contained in:
@ -38,11 +38,15 @@ namespace elna
|
||||
{
|
||||
namespace gcc
|
||||
{
|
||||
static tree get_inner_alias(std::shared_ptr<symbol_table> symbol_table, const boot::type& type)
|
||||
tree handle_symbol(const std::string& symbol_name, const boot::type& type,
|
||||
std::shared_ptr<boot::symbol_table> from, std::shared_ptr<symbol_table> to);
|
||||
|
||||
tree get_inner_alias(const boot::type& type,
|
||||
std::shared_ptr<boot::symbol_table> from, std::shared_ptr<symbol_table> to)
|
||||
{
|
||||
if (auto reference = type.get<boot::primitive_type>())
|
||||
{
|
||||
return symbol_table->lookup(reference->identifier);
|
||||
return to->lookup(reference->identifier);
|
||||
}
|
||||
else if (auto reference = type.get<boot::record_type>())
|
||||
{
|
||||
@ -54,15 +58,36 @@ namespace gcc
|
||||
}
|
||||
else if (auto reference = type.get<boot::pointer_type>())
|
||||
{
|
||||
return build_pointer_type_for_mode(get_inner_alias(symbol_table, reference->base), VOIDmode, true);
|
||||
return build_pointer_type_for_mode(get_inner_alias(reference->base, from, to), VOIDmode, true);
|
||||
}
|
||||
else if (auto reference = type.get<boot::array_type>())
|
||||
{
|
||||
tree lower_bound = build_int_cst_type(integer_type_node, 0);
|
||||
tree upper_bound = build_int_cst_type(integer_type_node, reference->size);
|
||||
tree range_type = build_range_type(integer_type_node, lower_bound, upper_bound);
|
||||
|
||||
return build_array_type(get_inner_alias(reference->base, from, to), range_type);
|
||||
}
|
||||
else if (auto reference = type.get<boot::alias_type>())
|
||||
{
|
||||
return get_inner_alias(symbol_table, reference->reference);
|
||||
return handle_symbol(reference->name, reference->reference, from, to);
|
||||
}
|
||||
return error_mark_node;
|
||||
}
|
||||
|
||||
tree handle_symbol(const std::string& symbol_name, const boot::type& type,
|
||||
std::shared_ptr<boot::symbol_table> from, std::shared_ptr<symbol_table> to)
|
||||
{
|
||||
auto looked_up = to->lookup(symbol_name);
|
||||
|
||||
if (looked_up == NULL_TREE)
|
||||
{
|
||||
looked_up = get_inner_alias(type, from, to);
|
||||
to->enter(symbol_name, looked_up);
|
||||
}
|
||||
return looked_up;
|
||||
}
|
||||
|
||||
std::deque<std::unique_ptr<boot::error>> do_semantic_analysis(const char *path,
|
||||
std::unique_ptr<boot::program>& ast, std::shared_ptr<symbol_table> symbols)
|
||||
{
|
||||
@ -73,10 +98,13 @@ namespace gcc
|
||||
|
||||
if (declaration_visitor.errors().empty())
|
||||
{
|
||||
for (auto unresolved : declaration_visitor.unresolved)
|
||||
for (auto& [symbol_name, symbol_info] : *info_table)
|
||||
{
|
||||
auto inner_alias = get_inner_alias(symbols, boot::type(unresolved.second));
|
||||
symbols->enter(unresolved.first, inner_alias);
|
||||
handle_symbol(symbol_name, symbol_info->is_type()->symbol, info_table, symbols);
|
||||
}
|
||||
for (auto& [symbol_name, symbol_info] : *info_table)
|
||||
{
|
||||
// printf("%s\n", symbol_name.c_str());
|
||||
}
|
||||
}
|
||||
return std::move(declaration_visitor.errors());
|
||||
@ -1154,7 +1182,7 @@ namespace gcc
|
||||
void generic_visitor::visit(boot::record_type_expression *type)
|
||||
{
|
||||
std::set<std::string> field_names;
|
||||
tree record_type_node = this->current_expression == NULL_TREE
|
||||
tree composite_type_node = this->current_expression == NULL_TREE
|
||||
? make_node(RECORD_TYPE)
|
||||
: this->current_expression;
|
||||
|
||||
@ -1174,19 +1202,19 @@ namespace gcc
|
||||
return;
|
||||
}
|
||||
tree field_declaration = build_field(get_location(&field.second->position()),
|
||||
record_type_node, field.first, this->current_expression);
|
||||
TYPE_FIELDS(record_type_node) = chainon(TYPE_FIELDS(record_type_node), field_declaration);
|
||||
composite_type_node, field.first, this->current_expression);
|
||||
TYPE_FIELDS(composite_type_node) = chainon(TYPE_FIELDS(composite_type_node), field_declaration);
|
||||
this->current_expression = NULL_TREE;
|
||||
}
|
||||
layout_type(record_type_node);
|
||||
layout_type(composite_type_node);
|
||||
|
||||
this->current_expression = record_type_node;
|
||||
this->current_expression = composite_type_node;
|
||||
}
|
||||
|
||||
void generic_visitor::visit(boot::union_type_expression *type)
|
||||
{
|
||||
std::set<std::string> field_names;
|
||||
tree union_type_node = this->current_expression == NULL_TREE
|
||||
tree composite_type_node = this->current_expression == NULL_TREE
|
||||
? make_node(UNION_TYPE)
|
||||
: this->current_expression;
|
||||
|
||||
@ -1206,13 +1234,13 @@ namespace gcc
|
||||
return;
|
||||
}
|
||||
tree field_declaration = build_field(get_location(&field.second->position()),
|
||||
union_type_node, field.first, this->current_expression);
|
||||
TYPE_FIELDS(union_type_node) = chainon(TYPE_FIELDS(union_type_node), field_declaration);
|
||||
composite_type_node, field.first, this->current_expression);
|
||||
TYPE_FIELDS(composite_type_node) = chainon(TYPE_FIELDS(composite_type_node), field_declaration);
|
||||
this->current_expression = NULL_TREE;
|
||||
}
|
||||
layout_type(union_type_node);
|
||||
layout_type(composite_type_node);
|
||||
|
||||
this->current_expression = union_type_node;
|
||||
this->current_expression = composite_type_node;
|
||||
}
|
||||
|
||||
void generic_visitor::visit(boot::procedure_type_expression *type)
|
||||
|
Reference in New Issue
Block a user