aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2026-07-14 18:08:44 +0200
committerEugen Wissner <belka@caraus.de>2026-07-14 18:08:44 +0200
commita32a61813ebaecf0c1e69fd1481bf09d8c8b1420 (patch)
treeecfb6140075e3c46b599755e220dbf560de2e31d /gcc
parent51e2f98e33ae10fc3052335cc6847bc93d0784fa (diff)
downloadelna-a32a61813ebaecf0c1e69fd1481bf09d8c8b1420.tar.gz
Support more floating point literals
Diffstat (limited to 'gcc')
-rw-r--r--gcc/gcc/elna-diagnostic.cc36
-rw-r--r--gcc/gcc/elna-generic.cc10
2 files changed, 34 insertions, 12 deletions
diff --git a/gcc/gcc/elna-diagnostic.cc b/gcc/gcc/elna-diagnostic.cc
index 42db5c9..f7b660d 100644
--- a/gcc/gcc/elna-diagnostic.cc
+++ b/gcc/gcc/elna-diagnostic.cc
@@ -40,9 +40,25 @@ namespace elna::gcc
location_t get_location(const boot::position *position)
{
- linemap_line_start(line_table, position->line, 0);
+ linemap_line_start(line_table, position->start.line, 0);
- return linemap_position_for_column(line_table, position->column);
+ return linemap_position_for_column(line_table, position->start.column);
+ }
+
+ void fill_range(const boot::position& position, location_t& start, location_t& end)
+ {
+ linemap_line_start(line_table, position.start.line, 0);
+ start = linemap_position_for_column(line_table, position.start.column);
+
+ if (position.start.line != position.end.line || position.start.column != position.end.column)
+ {
+ linemap_line_start(line_table, position.end.line, 0);
+ end = linemap_position_for_column(line_table, position.end.column);
+ }
+ else
+ {
+ end = start;
+ }
}
std::string print_aggregate_name(tree type, const std::string& kind_name)
@@ -158,13 +174,19 @@ namespace elna::gcc
{
for (const auto& error : errors)
{
- location_t gcc_location{ UNKNOWN_LOCATION };
-
- if (error->position.line != 0 || error->position.column != 0)
+ if (error->position.start.available())
+ {
+ location_t start, end;
+ fill_range(error->position, start, end);
+ rich_location rich_loc(line_table, start);
+ rich_loc.add_range(end);
+ error_at(&rich_loc, error->what().c_str());
+ }
+ else
{
- gcc_location = get_location(&error->position);
+ location_t gcc_location{ UNKNOWN_LOCATION };
+ error_at(gcc_location, error->what().c_str());
}
- error_at(gcc_location, error->what().c_str());
}
}
}
diff --git a/gcc/gcc/elna-generic.cc b/gcc/gcc/elna-generic.cc
index 928ca8d..f29828f 100644
--- a/gcc/gcc/elna-generic.cc
+++ b/gcc/gcc/elna-generic.cc
@@ -841,10 +841,10 @@ namespace elna::gcc
bool generic_visitor::expect_trait_type_only(boot::traits_expression *trait)
{
- if (trait->parameters.size() != 1)
+ if (trait->arguments.size() != 1)
{
error_at(get_location(&trait->position()), "Trait '%s' expects 1 argument, got %lu",
- trait->name.c_str(), trait->parameters.size());
+ trait->name.c_str(), trait->arguments.size());
this->current_expression = error_mark_node;
return false;
}
@@ -905,15 +905,15 @@ namespace elna::gcc
}
else if (trait->name == "offset")
{
- if (trait->parameters.size() != 2)
+ if (trait->arguments.size() != 2)
{
error_at(trait_location, "Trait '%s' expects 2 arguments, got %lu",
- trait->name.c_str(), trait->parameters.size());
+ trait->name.c_str(), trait->arguments.size());
this->current_expression = error_mark_node;
return;
}
this->current_expression = get_inner_alias(trait->types.front(), this->symbols);
- auto field_type = trait->parameters.at(1)->is_named();
+ auto field_type = trait->arguments.at(1)->is_named();
if (field_type == nullptr)
{