From d09cd98bd3df9920f0ecab97615048c0594e8f7f Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sun, 19 Jul 2026 23:23:22 +0200 Subject: Add clang-tidy support --- include/elna/boot/ast.h | 180 +++++++++++++++++++------------------- include/elna/boot/dependency.h | 8 +- include/elna/boot/driver.h | 2 +- include/elna/boot/evaluator.h | 2 +- include/elna/boot/name_analysis.h | 4 +- include/elna/boot/result.h | 29 +++--- include/elna/boot/symbol.h | 43 ++++----- include/elna/boot/type_check.h | 21 +++-- 8 files changed, 143 insertions(+), 146 deletions(-) (limited to 'include') diff --git a/include/elna/boot/ast.h b/include/elna/boot/ast.h index 30bc7c3..4e35f02 100644 --- a/include/elna/boot/ast.h +++ b/include/elna/boot/ast.h @@ -137,42 +137,42 @@ namespace elna::boot class empty_visitor : public parser_visitor { public: - [[noreturn]] virtual void visit(array_type_expression *) override; - [[noreturn]] virtual void visit(pointer_type_expression *) override; - [[noreturn]] virtual void visit(constant_type_expression *) override; - [[noreturn]] virtual void visit(type_declaration *) override; - [[noreturn]] virtual void visit(record_type_expression *) override; - [[noreturn]] virtual void visit(procedure_type_expression *) override; - [[noreturn]] virtual void visit(enumeration_type_expression *) override; - - [[noreturn]] virtual void visit(variable_declaration *) override; - [[noreturn]] virtual void visit(procedure_declaration *) override; - [[noreturn]] virtual void visit(assign_statement *) override; - [[noreturn]] virtual void visit(if_statement *) override; - [[noreturn]] virtual void visit(import_declaration *) override; - [[noreturn]] virtual void visit(while_statement *) override; - [[noreturn]] virtual void visit(defer_statement *) override; - [[noreturn]] virtual void visit(empty_statement *) override; - [[noreturn]] virtual void visit(case_statement *) override; - [[noreturn]] virtual void visit(procedure_call *) override; - [[noreturn]] virtual void visit(unit *) override; - [[noreturn]] virtual void visit(cast_expression *) override; - [[noreturn]] virtual void visit(record_constructor_expression *) override; - [[noreturn]] virtual void visit(array_constructor_expression *) override; - [[noreturn]] virtual void visit(traits_expression *) override; - [[noreturn]] virtual void visit(binary_expression *) override; - [[noreturn]] virtual void visit(unary_expression *) override; - [[noreturn]] virtual void visit(named_expression *) override; - [[noreturn]] virtual void visit(array_access_expression *) override; - [[noreturn]] virtual void visit(field_access_expression *) override; - [[noreturn]] virtual void visit(dereference_expression *) override; - [[noreturn]] virtual void visit(literal *) override; - [[noreturn]] virtual void visit(literal *) override; - [[noreturn]] virtual void visit(literal *) override; - [[noreturn]] virtual void visit(literal *) override; - [[noreturn]] virtual void visit(literal *) override; - [[noreturn]] virtual void visit(literal *) override; - [[noreturn]] virtual void visit(literal *) override; + [[noreturn]] void visit(array_type_expression *) override; + [[noreturn]] void visit(pointer_type_expression *) override; + [[noreturn]] void visit(constant_type_expression *) override; + [[noreturn]] void visit(type_declaration *) override; + [[noreturn]] void visit(record_type_expression *) override; + [[noreturn]] void visit(procedure_type_expression *) override; + [[noreturn]] void visit(enumeration_type_expression *) override; + + [[noreturn]] void visit(variable_declaration *) override; + [[noreturn]] void visit(procedure_declaration *) override; + [[noreturn]] void visit(assign_statement *) override; + [[noreturn]] void visit(if_statement *) override; + [[noreturn]] void visit(import_declaration *) override; + [[noreturn]] void visit(while_statement *) override; + [[noreturn]] void visit(defer_statement *) override; + [[noreturn]] void visit(empty_statement *) override; + [[noreturn]] void visit(case_statement *) override; + [[noreturn]] void visit(procedure_call *) override; + [[noreturn]] void visit(unit *) override; + [[noreturn]] void visit(cast_expression *) override; + [[noreturn]] void visit(record_constructor_expression *) override; + [[noreturn]] void visit(array_constructor_expression *) override; + [[noreturn]] void visit(traits_expression *) override; + [[noreturn]] void visit(binary_expression *) override; + [[noreturn]] void visit(unary_expression *) override; + [[noreturn]] void visit(named_expression *) override; + [[noreturn]] void visit(array_access_expression *) override; + [[noreturn]] void visit(field_access_expression *) override; + [[noreturn]] void visit(dereference_expression *) override; + [[noreturn]] void visit(literal *) override; + [[noreturn]] void visit(literal *) override; + [[noreturn]] void visit(literal *) override; + [[noreturn]] void visit(literal *) override; + [[noreturn]] void visit(literal *) override; + [[noreturn]] void visit(literal *) override; + [[noreturn]] void visit(literal *) override; }; /** @@ -181,42 +181,42 @@ namespace elna::boot class walking_visitor : public parser_visitor { public: - virtual void visit(array_type_expression *) override; - virtual void visit(pointer_type_expression *) override; - virtual void visit(constant_type_expression *) override; - virtual void visit(type_declaration *) override; - virtual void visit(record_type_expression *) override; - virtual void visit(procedure_type_expression *) override; - virtual void visit(enumeration_type_expression *) override; - - virtual void visit(variable_declaration *) override; - virtual void visit(procedure_declaration *) override; - virtual void visit(assign_statement *) override; - virtual void visit(if_statement *) override; - virtual void visit(import_declaration *) override; - virtual void visit(while_statement *statement) override; - virtual void visit(defer_statement *statement) override; - virtual void visit(empty_statement *) override; - virtual void visit(case_statement *statement) override; - virtual void visit(procedure_call *call) override; - virtual void visit(unit *unit) override; - virtual void visit(cast_expression *expression) override; - virtual void visit(record_constructor_expression *expression) override; - virtual void visit(array_constructor_expression *expression) override; - virtual void visit(traits_expression *trait) override; - virtual void visit(binary_expression *expression) override; - virtual void visit(unary_expression *expression) override; - virtual void visit(named_expression *) override; - virtual void visit(array_access_expression *expression) override; - virtual void visit(field_access_expression *expression) override; - virtual void visit(dereference_expression *expression) override; - virtual void visit(literal *) override; - virtual void visit(literal *) override; - virtual void visit(literal *) override; - virtual void visit(literal *) override; - virtual void visit(literal *) override; - virtual void visit(literal *) override; - virtual void visit(literal *) override; + void visit(array_type_expression *) override; + void visit(pointer_type_expression *) override; + void visit(constant_type_expression *) override; + void visit(type_declaration *) override; + void visit(record_type_expression *) override; + void visit(procedure_type_expression *) override; + void visit(enumeration_type_expression *) override; + + void visit(variable_declaration *) override; + void visit(procedure_declaration *) override; + void visit(assign_statement *) override; + void visit(if_statement *) override; + void visit(import_declaration *) override; + void visit(while_statement *statement) override; + void visit(defer_statement *statement) override; + void visit(empty_statement *) override; + void visit(case_statement *statement) override; + void visit(procedure_call *call) override; + void visit(unit *unit) override; + void visit(cast_expression *expression) override; + void visit(record_constructor_expression *expression) override; + void visit(array_constructor_expression *expression) override; + void visit(traits_expression *trait) override; + void visit(binary_expression *expression) override; + void visit(unary_expression *expression) override; + void visit(named_expression *) override; + void visit(array_access_expression *expression) override; + void visit(field_access_expression *expression) override; + void visit(dereference_expression *expression) override; + void visit(literal *) override; + void visit(literal *) override; + void visit(literal *) override; + void visit(literal *) override; + void visit(literal *) override; + void visit(literal *) override; + void visit(literal *) override; }; /** @@ -397,7 +397,7 @@ namespace elna::boot void accept(parser_visitor *visitor) override; array_constructor_expression *is_array_constructor() override; - virtual ~array_constructor_expression() override; + ~array_constructor_expression() override; }; /** @@ -462,7 +462,7 @@ namespace elna::boot procedure_type_expression(const source_position position, std::vector&& parameters, return_t return_type = return_t()); - ~procedure_type_expression(); + ~procedure_type_expression() override; void accept(parser_visitor *visitor) override; procedure_type_expression *is_procedure() override; @@ -503,7 +503,7 @@ namespace elna::boot procedure_type_expression& heading(); - virtual ~procedure_declaration() override; + ~procedure_declaration() override; }; /** @@ -515,7 +515,7 @@ namespace elna::boot public: type_declaration(const source_position position, identifier_definition identifier, - type_expression *expression); + type_expression *underlying_type); ~type_declaration() override; void accept(parser_visitor *visitor) override; @@ -539,7 +539,7 @@ namespace elna::boot type_expression& target(); expression& value(); - virtual ~cast_expression() override; + ~cast_expression() override; }; class traits_expression : public expression @@ -551,7 +551,7 @@ namespace elna::boot traits_expression(const source_position position, identifier&& name, std::vector&& arguments); - ~traits_expression(); + ~traits_expression() override; void accept(parser_visitor *visitor) override; traits_expression *is_traits() override; @@ -603,8 +603,8 @@ namespace elna::boot virtual dereference_expression *is_dereference(); designator_expression *is_designator() override; - void accept(parser_visitor *visitor); - ~designator_expression() = 0; + void accept(parser_visitor *visitor) override; + ~designator_expression() override = 0; }; /** @@ -684,11 +684,11 @@ namespace elna::boot procedure_call(const source_position position, designator_expression *callable, std::vector&& arguments); void accept(parser_visitor *visitor) override; - virtual procedure_call *is_call_expression() override; + procedure_call *is_call_expression() override; designator_expression& callable(); - virtual ~procedure_call() override; + ~procedure_call() override; }; class assign_statement : public statement @@ -709,7 +709,7 @@ namespace elna::boot designator_expression& lvalue(); expression& rvalue(); - virtual ~assign_statement() override; + ~assign_statement() override; }; /** @@ -730,7 +730,7 @@ namespace elna::boot conditional_statements& branch(); - virtual ~if_statement() override; + ~if_statement() override; }; /** @@ -761,7 +761,7 @@ namespace elna::boot conditional_statements& branch(); - virtual ~while_statement() override; + ~while_statement() override; }; class unit : public node, public procedure_body @@ -779,9 +779,9 @@ namespace elna::boot std::vector&& procedures, std::vector&& entry_point); bool has_body() const; - virtual void accept(parser_visitor *visitor) override; + void accept(parser_visitor *visitor) override; - virtual ~unit() override; + ~unit() override; }; template @@ -809,7 +809,7 @@ namespace elna::boot defer_statement(const source_position position, std::vector&& statements); void accept(parser_visitor *visitor) override; - virtual ~defer_statement() override; + ~defer_statement() override; }; class empty_statement : public statement @@ -836,7 +836,7 @@ namespace elna::boot expression& rhs(); binary_operator operation() const; - virtual ~binary_expression() override; + ~binary_expression() override; }; class unary_expression : public expression @@ -854,7 +854,7 @@ namespace elna::boot expression& operand(); unary_operator operation() const; - virtual ~unary_expression() override; + ~unary_expression() override; }; const char *print_binary_operator(const binary_operator operation); diff --git a/include/elna/boot/dependency.h b/include/elna/boot/dependency.h index 829b669..24ded26 100644 --- a/include/elna/boot/dependency.h +++ b/include/elna/boot/dependency.h @@ -39,7 +39,7 @@ namespace elna::boot dependency read_source(std::istream& entry_point); std::filesystem::path build_path(const std::vector& segments); - error_list analyze_semantics(std::unique_ptr& tree, symbol_bag bag, + error_list analyze_semantics(std::unique_ptr& tree, const symbol_bag& bag, const target_info& target); template @@ -51,8 +51,8 @@ namespace elna::boot const std::shared_ptr globals; T custom; - using iterator = typename std::unordered_map::iterator; - using const_iterator = typename std::unordered_map::const_iterator; + using iterator = std::unordered_map::iterator; + using const_iterator = std::unordered_map::const_iterator; explicit dependency_state(T custom) : globals(builtin_symbol_table()), custom(custom) @@ -64,7 +64,7 @@ namespace elna::boot return cache.find(key); } - void insert(const std::filesystem::path& key, symbol_bag value) + void insert(const std::filesystem::path& key, const symbol_bag& value) { cache.insert({ key, value }); } diff --git a/include/elna/boot/driver.h b/include/elna/boot/driver.h index 8f93dbd..ef5be81 100644 --- a/include/elna/boot/driver.h +++ b/include/elna/boot/driver.h @@ -32,7 +32,7 @@ namespace elna::boot public: syntax_error(const std::string& message, const yy::location& location); - virtual std::string what() const override; + std::string what() const override; }; class driver : public error_container diff --git a/include/elna/boot/evaluator.h b/include/elna/boot/evaluator.h index 6e82777..f1a5437 100644 --- a/include/elna/boot/evaluator.h +++ b/include/elna/boot/evaluator.h @@ -75,7 +75,7 @@ namespace elna::boot const target_info& target; const std::map& evaluated_initializers; - std::optional evaluate_literal(literal_expression& subject); + static std::optional evaluate_literal(literal_expression& subject); std::optional evaluate_named(named_expression& subject); std::optional evaluate_unary(unary_expression& subject); std::optional evaluate_binary(binary_expression& subject); diff --git a/include/elna/boot/name_analysis.h b/include/elna/boot/name_analysis.h index 40bdf16..6f40bec 100644 --- a/include/elna/boot/name_analysis.h +++ b/include/elna/boot/name_analysis.h @@ -113,8 +113,8 @@ namespace elna::boot std::pair> build_procedure( procedure_type_expression& expression); std::vector build_composite_type(const std::vector& fields, - std::map& known_names, - type aggregate); + std::map& field_names, + const type& aggregate); std::shared_ptr register_variable(const std::string& name, const bool is_extern, const source_position position); diff --git a/include/elna/boot/result.h b/include/elna/boot/result.h index 953f701..328e44e 100644 --- a/include/elna/boot/result.h +++ b/include/elna/boot/result.h @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see #include #include #include +#include #include namespace elna::boot @@ -42,8 +43,7 @@ namespace elna::boot bool available() const; - bool operator==(const location& that) const; - bool operator!=(const location& that) const; + auto operator<=>(const location&) const = default; private: std::size_t m_line{ 0 }; @@ -80,6 +80,7 @@ namespace elna::boot error(const source_position position); public: + virtual ~error() = default; /// Error position. const source_position position; @@ -98,7 +99,7 @@ namespace elna::boot } }; - using error_list = typename std::deque>; + using error_list = std::deque>; class error_container { @@ -111,7 +112,7 @@ namespace elna::boot error_list& errors(); template - void add_error(Args... arguments) + void add_error(Args&&... arguments) { auto new_error = std::make_unique(arguments...); m_errors.emplace_back(std::move(new_error)); @@ -129,7 +130,7 @@ namespace elna::boot return_declaration() = default; explicit return_declaration(T type) - : proper_type(type) + : proper_type(std::move(type)) { } @@ -138,15 +139,7 @@ namespace elna::boot { } - bool operator==(const return_declaration& that) const - { - return this->proper_type == that.proper_type && this->no_return == that.no_return; - } - - bool operator!=(const return_declaration& that) const - { - return !(*this == that); - } + auto operator<=>(const return_declaration&) const = default; T proper_type{}; bool no_return{ false }; @@ -159,11 +152,9 @@ namespace elna::boot const std::string& name() const; const source_position& position() const; - bool operator==(const identifier& that) const; - bool operator!=(const identifier& that) const; - - bool operator==(const std::string& that) const; - bool operator!=(const std::string& that) const; + std::strong_ordering operator<=>(const identifier& that) const; + bool operator==(std::string_view that) const; + bool operator!=(std::string_view that) const; private: std::string m_name; diff --git a/include/elna/boot/symbol.h b/include/elna/boot/symbol.h index 194c1cd..9505e5a 100644 --- a/include/elna/boot/symbol.h +++ b/include/elna/boot/symbol.h @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see #include #include #include +#include #include #include @@ -29,14 +30,14 @@ along with GCC; see the file COPYING3. If not see namespace elna::boot { - class alias_type; - class primitive_type; - class record_type; - class pointer_type; - class constant_type; - class array_type; - class procedure_type; - class enumeration_type; + struct alias_type; + struct primitive_type; + struct record_type; + struct pointer_type; + struct constant_type; + struct array_type; + struct procedure_type; + struct enumeration_type; class type { @@ -167,12 +168,12 @@ namespace elna::boot class symbol_map { public: - using symbol_ptr = typename std::enable_if< - std::is_convertible::value || std::is_assignable::value, + using symbol_ptr = std::enable_if_t< + std::is_convertible_v || std::is_assignable_v, T - >::type; - using iterator = typename std::unordered_map::iterator; - using const_iterator = typename std::unordered_map::const_iterator; + >; + using iterator = std::unordered_map::iterator; + using const_iterator = std::unordered_map::const_iterator; private: std::unordered_map entries; @@ -185,7 +186,7 @@ namespace elna::boot * \param scope Outer scope. */ explicit symbol_map(std::shared_ptr scope = nullptr) - : outer_scope(scope) + : outer_scope(std::move(scope)) { } @@ -258,7 +259,7 @@ namespace elna::boot * * \return Whether the insertion took place. */ - bool enter(const std::string& name, symbol_ptr entry) + bool enter(const std::string& name, const symbol_ptr& entry) { return lookup(name) == nothing && entries.insert({ name, entry }).second; } @@ -282,7 +283,7 @@ namespace elna::boot public: const type symbol; - explicit type_info(const type symbol); + explicit type_info(const type& symbol); std::shared_ptr is_type() override; }; @@ -308,7 +309,7 @@ namespace elna::boot * \param names Parameter names. * \param scope Local definition (is `nullptr` for extern symbols). */ - procedure_info(const procedure_type symbol, const std::vector names, + procedure_info(const procedure_type& symbol, const std::vector& names, std::shared_ptr scope = nullptr); std::shared_ptr is_procedure() override; @@ -337,7 +338,7 @@ namespace elna::boot * \param symbol Variable type. * \param is_extern Whether this is an extern symbol. */ - variable_info(const type symbol, bool is_extern); + variable_info(const type& symbol, bool is_extern); std::shared_ptr is_variable() override; }; @@ -363,7 +364,7 @@ namespace elna::boot * \param unresolved Forward declarations collected in the previous step. * \param global_table Global symbols. */ - symbol_bag(forward_table&& unresolved, std::shared_ptr global_table); + symbol_bag(forward_table&& unresolved, const std::shared_ptr& global_table); /** * Looks up a symbol in the current and imported modules. @@ -382,7 +383,7 @@ namespace elna::boot * * \return Whether the insertion took place. */ - bool enter(const std::string& name, std::shared_ptr entry); + bool enter(const std::string& name, const std::shared_ptr& entry); /** * Enters a new scope. @@ -454,7 +455,7 @@ namespace elna::boot /** * \overload */ - type resolve_underlying_type(std::shared_ptr alias); + type resolve_underlying_type(const std::shared_ptr& alias); /** * Resolves an alias chain until the underlying type or a qualified type is diff --git a/include/elna/boot/type_check.h b/include/elna/boot/type_check.h index 8c7dd80..51aa04d 100644 --- a/include/elna/boot/type_check.h +++ b/include/elna/boot/type_check.h @@ -182,11 +182,11 @@ namespace elna::boot type actual; unary_operator op; - static char unary_operator_symbol(unary_operator op); + static char unary_operator_symbol(unary_operator operation); public: unary_operation_error(const source_position position, type actual, - unary_operator op); + unary_operator operation); std::string what() const override; }; @@ -200,7 +200,12 @@ namespace elna::boot */ struct assign_check { - enum class verdict { pass, accept, reject }; + enum class verdict + { + pass, + accept, + reject + }; struct context { @@ -211,10 +216,10 @@ namespace elna::boot }; context ctx; - verdict guard_const_laundering(); - verdict check_exact_match(); - verdict check_pointer_hatch(); - verdict check_pointer_conversion(); + verdict guard_const_laundering() const; + verdict check_exact_match() const; + verdict check_pointer_hatch() const; + verdict check_pointer_conversion() const; bool run(); }; @@ -238,7 +243,7 @@ namespace elna::boot * of type assignee. */ static bool is_assignable_from(const type& assignee, const type& assignment); - static bool check_unresolved_symbol(std::shared_ptr alias, + static bool check_unresolved_symbol(const std::shared_ptr& alias, std::vector& path); public: -- cgit v1.2.3