diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-02-15 12:25:13 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-02-15 12:25:13 -0800 |
commit | c36eb25ca3ac555ba7c27796e0ba84a7de696be4 (patch) | |
tree | 555bb044433910fd3e61dac697e791a9dd9ce6bf /032array.cc | |
parent | 5ba1c3b9e101b31fc38dae1701b62c373d5ef6f7 (diff) | |
download | mu-c36eb25ca3ac555ba7c27796e0ba84a7de696be4.tar.gz |
2658 - warn when containers contain arrays
The rule is: a container type's size must be fixed. Arrays can violate this rule if the array length isn't included in the type. But we haven't been warning about this, and 'new' has been silently turning array elements to be empty.
Diffstat (limited to '032array.cc')
-rw-r--r-- | 032array.cc | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/032array.cc b/032array.cc index f2eacb03..188e3477 100644 --- a/032array.cc +++ b/032array.cc @@ -116,6 +116,38 @@ if (r.type && r.type->value == get(Type_ordinal, "array")) { return 1 + get_or_insert(Memory, r.value)*size_of(array_element(r.type)); } +//: arrays are disallowed inside containers unless their length is fixed in +//: advance + +:(scenario container_contains_array) +% Hide_errors = true; +container foo [ + x:array:number:3 +] +$error: 0 + +:(scenario container_warns_on_dynamic_array_element) +% Hide_errors = true; +container foo [ + x:array:number +] ++error: container 'foo' cannot determine size of element x + +:(before "End Load Container Element Definition") +{ + const string_tree* type_name = info.element_type_names.back(); + if (type_name->value == "array") { + if (!type_name->right) { + raise_error << "container '" << name << "' doesn't specify type of array elements for " << info.element_names.back() << '\n' << end(); + break; + } + if (!type_name->right->right) { // array has no length + raise_error << "container '" << name << "' cannot determine size of element " << info.element_names.back() << '\n' << end(); + break; + } + } +} + //:: To access elements of an array, use 'index' :(scenario index) |