From bf41d022ce9736a92097f416ab96fca7ab4594ca Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sun, 23 Aug 2026 14:05:26 +0200 Subject: Reject 0-sized variables --- include/elna/boot/ast.h | 12 ++++++++++++ include/elna/boot/name_analysis.h | 1 + include/elna/boot/symbol.h | 13 ++++++++++++- include/elna/boot/type_check.h | 9 ++++++++- 4 files changed, 33 insertions(+), 2 deletions(-) (limited to 'include') diff --git a/include/elna/boot/ast.h b/include/elna/boot/ast.h index 8425b54..94488ff 100644 --- a/include/elna/boot/ast.h +++ b/include/elna/boot/ast.h @@ -138,6 +138,7 @@ namespace elna::boot class record_type_expression; class procedure_type_expression; class enumeration_type_expression; + class extern_type_expression; class named_expression; class array_access_expression; class field_access_expression; @@ -182,6 +183,7 @@ namespace elna::boot virtual void visit(record_type_expression *) = 0; virtual void visit(procedure_type_expression *) = 0; virtual void visit(enumeration_type_expression *) = 0; + virtual void visit(extern_type_expression *) = 0; virtual void visit(named_expression *) = 0; virtual void visit(array_access_expression *) = 0; virtual void visit(field_access_expression *) = 0; @@ -210,6 +212,7 @@ namespace elna::boot [[noreturn]] void visit(record_type_expression *) override; [[noreturn]] void visit(procedure_type_expression *) override; [[noreturn]] void visit(enumeration_type_expression *) override; + [[noreturn]] void visit(extern_type_expression *) override; [[noreturn]] void visit(variable_declaration *) override; [[noreturn]] void visit(procedure_declaration *) override; @@ -257,6 +260,7 @@ namespace elna::boot void visit(record_type_expression *) override; void visit(procedure_type_expression *) override; void visit(enumeration_type_expression *) override; + void visit(extern_type_expression *) override; void visit(variable_declaration *) override; void visit(procedure_declaration *) override; @@ -422,6 +426,14 @@ namespace elna::boot type_expression& base(); }; + class extern_type_expression : public type_expression + { + public: + explicit extern_type_expression(const source_position position); + + void accept(parser_visitor *visitor) override; + }; + using field_declaration = std::pair, std::shared_ptr>; class record_type_expression : public type_expression diff --git a/include/elna/boot/name_analysis.h b/include/elna/boot/name_analysis.h index 50d9fe6..f2e2eb9 100644 --- a/include/elna/boot/name_analysis.h +++ b/include/elna/boot/name_analysis.h @@ -155,6 +155,7 @@ namespace elna::boot void visit(slicing_expression *expression) override; void visit(procedure_type_expression *expression) override; void visit(enumeration_type_expression *expression) override; + void visit(extern_type_expression *) override; void visit(variable_declaration *declaration) override; void visit(procedure_declaration *declaration) override; diff --git a/include/elna/boot/symbol.h b/include/elna/boot/symbol.h index 1caba83..0c1026d 100644 --- a/include/elna/boot/symbol.h +++ b/include/elna/boot/symbol.h @@ -40,6 +40,7 @@ namespace elna::boot struct slice_type; struct procedure_type; struct enumeration_type; + struct extern_type; /** * Represents a type stored in the symbol table. @@ -59,7 +60,8 @@ namespace elna::boot std::shared_ptr, std::shared_ptr, std::shared_ptr, - std::shared_ptr + std::shared_ptr, + std::shared_ptr >; Payload payload; @@ -188,6 +190,15 @@ namespace elna::boot explicit enumeration_type(const std::vector& members); }; + /** + * An opaque type declared with \c type T = extern. The representation is + * unknown, so the type has no properties and can only be used behind a + * pointer. + */ + struct extern_type + { + }; + class type_info; class procedure_info; class variable_info; diff --git a/include/elna/boot/type_check.h b/include/elna/boot/type_check.h index 7a8eece..0b62a4a 100644 --- a/include/elna/boot/type_check.h +++ b/include/elna/boot/type_check.h @@ -86,7 +86,14 @@ namespace elna::boot condition, array_index, non_indexable, - dereference_of_non_pointer + dereference_of_non_pointer, + opaque_variable, + opaque_parameter, + opaque_return, + opaque_field, + opaque_element, + opaque_cast, + zero_sized }; type_requirement_error(const source_position position, -- cgit v1.2.3