diff options
| author | Eugen Wissner <belka@caraus.de> | 2026-08-23 14:05:26 +0200 |
|---|---|---|
| committer | Eugen Wissner <belka@caraus.de> | 2026-08-23 14:05:26 +0200 |
| commit | bf41d022ce9736a92097f416ab96fca7ab4594ca (patch) | |
| tree | 74813da62ec329f826828d2cac8701a94277dc41 /include | |
| parent | e4fece8e791cddec1c765c9834e1c13d0f258e16 (diff) | |
| download | elna-bf41d022ce9736a92097f416ab96fca7ab4594ca.tar.gz | |
Reject 0-sized variables
Diffstat (limited to 'include')
| -rw-r--r-- | include/elna/boot/ast.h | 12 | ||||
| -rw-r--r-- | include/elna/boot/name_analysis.h | 1 | ||||
| -rw-r--r-- | include/elna/boot/symbol.h | 13 | ||||
| -rw-r--r-- | include/elna/boot/type_check.h | 9 |
4 files changed, 33 insertions, 2 deletions
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::vector<identifier>, std::shared_ptr<type_expression>>; 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<array_type>, std::shared_ptr<slice_type>, std::shared_ptr<procedure_type>, - std::shared_ptr<enumeration_type> + std::shared_ptr<enumeration_type>, + std::shared_ptr<extern_type> >; Payload payload; @@ -188,6 +190,15 @@ namespace elna::boot explicit enumeration_type(const std::vector<std::string>& 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, |
