aboutsummaryrefslogtreecommitdiff
path: root/boot
diff options
context:
space:
mode:
Diffstat (limited to 'boot')
-rw-r--r--boot/dependency.cc4
-rw-r--r--boot/driver.cc2
-rw-r--r--boot/evaluator.cc2
-rw-r--r--boot/materialization.cc20
-rw-r--r--boot/name_analysis.cc6
-rw-r--r--boot/result.cc6
-rw-r--r--boot/type_check.cc32
-rw-r--r--boot/validation.cc2
8 files changed, 34 insertions, 40 deletions
diff --git a/boot/dependency.cc b/boot/dependency.cc
index bd1251a..4590513 100644
--- a/boot/dependency.cc
+++ b/boot/dependency.cc
@@ -62,7 +62,7 @@ namespace elna::boot
return outcome;
}
- error_list analyze_semantics(std::unique_ptr<unit>& tree, symbol_bag& bag,
+ diagnostic_list analyze_semantics(std::unique_ptr<unit>& tree, symbol_bag& bag,
const target_info& target)
{
name_analysis_visitor name_analyser(bag, target);
@@ -86,7 +86,7 @@ namespace elna::boot
{
return std::move(validator.errors());
}
- return error_list{};
+ return diagnostic_list{};
}
std::filesystem::path build_path(const std::vector<std::string>& segments)
diff --git a/boot/driver.cc b/boot/driver.cc
index 24a11fa..3607995 100644
--- a/boot/driver.cc
+++ b/boot/driver.cc
@@ -30,7 +30,7 @@ namespace elna::boot
}
syntax_error::syntax_error(const std::string& message, const yy::location& location)
- : error(make_position(location)), message(message)
+ : diagnostic(make_position(location)), message(message)
{
}
diff --git a/boot/evaluator.cc b/boot/evaluator.cc
index 07b2953..b37d1fa 100644
--- a/boot/evaluator.cc
+++ b/boot/evaluator.cc
@@ -26,7 +26,7 @@ along with GCC; see the file COPYING3. If not see
namespace elna::boot
{
non_constant_expression_error::non_constant_expression_error(const source_position position, payload_type payload)
- : error(position), payload(std::move(payload))
+ : diagnostic(position), payload(std::move(payload))
{
}
diff --git a/boot/materialization.cc b/boot/materialization.cc
index e055dfd..8c436b3 100644
--- a/boot/materialization.cc
+++ b/boot/materialization.cc
@@ -20,7 +20,7 @@ along with GCC; see the file COPYING3. If not see
namespace elna::boot
{
materialization_error::materialization_error(const source_position position)
- : error(position)
+ : diagnostic(position)
{
}
@@ -43,6 +43,11 @@ namespace elna::boot
if (auto negated_literal = literal->value.negate())
{
literal->value = negated_literal.value();
+ if (!literal->has_explicit_size
+ && !literal->value.fit_into(true, target.int_properties.front().size))
+ {
+ add_error<materialization_error>(literal->position());
+ }
}
else
{
@@ -50,12 +55,23 @@ namespace elna::boot
}
break;
case unmarked:
- if (!literal->value.fit_into(true, literal->value.size()))
+ {
+ const auto target_size = literal->has_explicit_size
+ ? literal->value.size()
+ : target.int_properties.front().size;
+
+ if (!literal->value.fit_into(true, target_size))
{
add_error<materialization_error>(literal->position());
}
break;
+ }
case _unsigned:
+ if (!literal->has_explicit_size
+ && !literal->value.fit_into(false, target.word_properties.front().size))
+ {
+ add_error<materialization_error>(literal->position());
+ }
break;
}
}
diff --git a/boot/name_analysis.cc b/boot/name_analysis.cc
index 4127466..0889ef9 100644
--- a/boot/name_analysis.cc
+++ b/boot/name_analysis.cc
@@ -24,7 +24,7 @@ along with GCC; see the file COPYING3. If not see
namespace elna::boot
{
declaration_error::declaration_error(const source_position position, const std::string& name, payload_type payload)
- : error(position), name(name), payload(payload)
+ : diagnostic(position), name(name), payload(payload)
{
}
@@ -70,7 +70,7 @@ namespace elna::boot
}
const_qualifier_error::const_qualifier_error(const source_position position, payload_type payload)
- : error(position), payload(std::move(payload))
+ : diagnostic(position), payload(std::move(payload))
{
}
@@ -113,7 +113,7 @@ namespace elna::boot
member_error::member_error(const source_position position, const std::string& name,
const type& composite, payload_type payload)
- : error(position), name(name), composite(composite), payload(std::move(payload))
+ : diagnostic(position), name(name), composite(composite), payload(std::move(payload))
{
}
diff --git a/boot/result.cc b/boot/result.cc
index a5f0803..3970b1f 100644
--- a/boot/result.cc
+++ b/boot/result.cc
@@ -63,17 +63,17 @@ namespace elna::boot
return this->m_start != this->m_end;
}
- error::error(const source_position position)
+ diagnostic::diagnostic(const source_position position)
: position(position)
{
}
- std::deque<std::unique_ptr<error>>& error_container::errors()
+ std::deque<std::unique_ptr<diagnostic>>& diagnostic_container::errors()
{
return m_errors;
}
- bool error_container::has_errors() const
+ bool diagnostic_container::has_errors() const
{
return !m_errors.empty();
}
diff --git a/boot/type_check.cc b/boot/type_check.cc
index 07e563f..e58a50e 100644
--- a/boot/type_check.cc
+++ b/boot/type_check.cc
@@ -90,7 +90,7 @@ namespace elna::boot
trait_error::trait_error(const source_position position, const std::string& trait_name,
payload_type payload)
- : error(position), trait_name(trait_name), payload(std::move(payload))
+ : diagnostic(position), trait_name(trait_name), payload(std::move(payload))
{
}
@@ -115,7 +115,7 @@ namespace elna::boot
type_mismatch_error::type_mismatch_error(const source_position position,
type actual, payload_type payload)
- : error(position), actual(std::move(actual)), payload(std::move(payload))
+ : diagnostic(position), actual(std::move(actual)), payload(std::move(payload))
{
}
@@ -158,11 +158,6 @@ namespace elna::boot
return "Type '" + this->actual.to_string()
+ "' cannot be converted to '" + payload.target.to_string() + "'";
}
- else if constexpr (std::is_same_v<T, integer_literal_overflow>)
- {
- return "The number " + payload.overflow.to_string()
- + " does not fit into the type '" + actual.to_string() + "'";
- }
else if constexpr (std::is_same_v<T, constant_assignment>)
{
return "Cannot assign to a value of type '" + this->actual.to_string()
@@ -173,7 +168,7 @@ namespace elna::boot
type_requirement_error::type_requirement_error(const source_position position,
type actual, kind kind)
- : error(position), actual(std::move(actual)), m_kind(kind)
+ : diagnostic(position), actual(std::move(actual)), m_kind(kind)
{
}
@@ -207,7 +202,7 @@ namespace elna::boot
cyclic_declaration_error::cyclic_declaration_error(const source_position position,
const std::vector<std::string>& cycle)
- : error(position), cycle(cycle)
+ : diagnostic(position), cycle(cycle)
{
}
@@ -226,7 +221,7 @@ namespace elna::boot
argument_count_error::argument_count_error(const source_position position, kind kind,
std::string applicand, std::size_t expected, std::size_t actual)
- : error(position), m_kind(kind), applicand(std::move(applicand)), expected(expected), actual(actual)
+ : diagnostic(position), m_kind(kind), applicand(std::move(applicand)), expected(expected), actual(actual)
{
}
@@ -1059,21 +1054,4 @@ namespace elna::boot
}
}
- void type_analysis_visitor::visit(literal<integer_literal> *expression)
- {
- bool narrowed{ false };
- if (expression->value.is_signed())
- {
- narrowed = expression->value.fit_into(target.int_properties.front().size);
- }
- else
- {
- narrowed = expression->value.fit_into(target.word_properties.front().size);
- }
- if (!narrowed)
- {
- add_error<type_mismatch_error>(expression->position(), expression->type_decoration,
- type_mismatch_error::integer_literal_overflow{ expression->value });
- }
- }
}
diff --git a/boot/validation.cc b/boot/validation.cc
index 26d4f64..a81282b 100644
--- a/boot/validation.cc
+++ b/boot/validation.cc
@@ -22,7 +22,7 @@ along with GCC; see the file COPYING3. If not see
namespace elna::boot
{
validation_error::validation_error(const source_position position, source_position first)
- : error(position), first(first)
+ : diagnostic(position), first(first)
{
}