aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--boot/name_analysis.cc5
-rw-r--r--testsuite/fail_compilation/assign_array_length.elna7
-rw-r--r--testsuite/fail_compilation/assign_slice_ptr.elna7
3 files changed, 17 insertions, 2 deletions
diff --git a/boot/name_analysis.cc b/boot/name_analysis.cc
index 0d25039..1e224da 100644
--- a/boot/name_analysis.cc
+++ b/boot/name_analysis.cc
@@ -209,11 +209,12 @@ namespace elna::boot
{
if (field_name == "length")
{
- return lookup_primitive_type("Word");
+ return type(std::make_shared<constant_type>(lookup_primitive_type("Word")));
}
if (field_name == "ptr")
{
- return type(std::make_shared<pointer_type>(element_type));
+ auto pointer = type(std::make_shared<pointer_type>(element_type));
+ return type(std::make_shared<constant_type>(pointer));
}
return std::nullopt;
}
diff --git a/testsuite/fail_compilation/assign_array_length.elna b/testsuite/fail_compilation/assign_array_length.elna
new file mode 100644
index 0000000..ac8f9df
--- /dev/null
+++ b/testsuite/fail_compilation/assign_array_length.elna
@@ -0,0 +1,7 @@
+var
+ slice: []Int
+ array: [2]Int
+
+begin
+ array.length := slice.length (* @Error Cannot assign to a value of type 'const Word', because it is constant or contains constant members *)
+end.
diff --git a/testsuite/fail_compilation/assign_slice_ptr.elna b/testsuite/fail_compilation/assign_slice_ptr.elna
new file mode 100644
index 0000000..aa7a379
--- /dev/null
+++ b/testsuite/fail_compilation/assign_slice_ptr.elna
@@ -0,0 +1,7 @@
+var
+ slice: []Int
+ array: [2]Int
+
+begin
+ slice.ptr := array.ptr (* @Error Cannot assign to a value of type 'const \^Int', because it is constant or contains constant members *)
+end.