diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-07-14 18:08:44 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-07-14 18:08:44 +0200 |
| commit | a32a61813ebaecf0c1e69fd1481bf09d8c8b1420 (patch) | |
| tree | ecfb6140075e3c46b599755e220dbf560de2e31d /gcc | |
| parent | 51e2f98e33ae10fc3052335cc6847bc93d0784fa (diff) | |
| download | elna-a32a61813ebaecf0c1e69fd1481bf09d8c8b1420.tar.gz | |
Support more floating point literals
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/gcc/elna-diagnostic.cc | 36 | ||||
| -rw-r--r-- | gcc/gcc/elna-generic.cc | 10 |
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) { |
