aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/elna/boot/ast.h12
-rw-r--r--include/elna/boot/name_analysis.h1
-rw-r--r--include/elna/boot/symbol.h13
-rw-r--r--include/elna/boot/type_check.h9
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,