about summary refs log tree commit diff stats
path: root/030container.cc
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-10-05 16:43:21 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-10-05 16:44:11 -0700
commitfb5470bc5a25960a0ee1b0757bffe59131978e56 (patch)
treefd260952bf772b9ab145d14323baee609894586c /030container.cc
parent22a2524048157bfbd65ccf1bf66a89808ba83e0e (diff)
downloadmu-fb5470bc5a25960a0ee1b0757bffe59131978e56.tar.gz
2241 - back to type-checking get-address
Now duplex-list is fully non-generic and only works with characters. But
we'll fix that in a bit..
Diffstat (limited to '030container.cc')
-rw-r--r--030container.cc24
1 files changed, 23 insertions, 1 deletions
diff --git a/030container.cc b/030container.cc
index 1f62fe58..529ec7c3 100644
--- a/030container.cc
+++ b/030container.cc
@@ -267,13 +267,25 @@ case GET_ADDRESS: {
     raise << maybe(Recipe[r].name) << "second ingredient of 'get' should have type 'offset', but got " << inst.ingredients.at(1).original_string << '\n' << end();
     break;
   }
+  long long int offset_value = 0;
   if (is_integer(offset.name)) {  // later layers permit non-integer offsets
-    long long int offset_value = to_integer(offset.name);
+    offset_value = to_integer(offset.name);
     if (offset_value < 0 || offset_value >= SIZE(Type[base_type].elements)) {
       raise << maybe(Recipe[r].name) << "invalid offset " << offset_value << " for " << Type[base_type].name << '\n' << end();
       break;
     }
   }
+  else {
+    offset_value = offset.value;
+  }
+  reagent product = inst.products.at(0);
+  canonize_type(product);
+  reagent element;
+  element.types = Type[base_type].elements.at(offset_value);
+  element.types.insert(element.types.begin(), Type_ordinal["address"]);
+  if (!types_match(product, element)) {
+    raise << maybe(Recipe[r].name) << "'get-address' " << offset.original_string << " (" << offset_value << ") on " << Type[base_type].name << " can't be saved in " << product.original_string << "; type should be " << dump_types(element) << '\n' << end();
+  }
   break;
 }
 :(before "End Primitive Recipe Implementations")
@@ -318,6 +330,16 @@ recipe main [
 ]
 +warn: main: invalid offset -1 for point-number
 
+:(scenario get_address_product_type_mismatch)
+% Hide_warnings = true;
+recipe main [
+  12:number <- copy 34
+  13:number <- copy 35
+  14:number <- copy 36
+  15:number <- get-address 12:point-number/raw, 1:offset
+]
++warn: main: 'get-address' 1:offset (1) on point-number can't be saved in 15:number; type should be address:number
+
 //:: Allow containers to be defined in mu code.
 
 :(scenarios load)