From f8b0b04da1d63dfb442fa547a82f98f1be14b446 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Tue, 18 Apr 2017 18:04:50 -0700 Subject: 3833 Loosen type-checking slightly to accomodate type abbreviations. --- 021check_instruction.cc | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to '021check_instruction.cc') diff --git a/021check_instruction.cc b/021check_instruction.cc index 90f24926..35b3eea0 100644 --- a/021check_instruction.cc +++ b/021check_instruction.cc @@ -146,7 +146,12 @@ bool types_strictly_match(const type_tree* to, const type_tree* from) { if (from->value == -1) return from->name == to->name; return from->value == to->value; } - return types_strictly_match(to->left, from->left) && types_strictly_match(to->right, from->right); + if (types_strictly_match(to->left, from->left) && types_strictly_match(to->right, from->right)) + return true; + // fallback: (x) == x + if (to->right == NULL && types_strictly_match(to->left, from)) return true; + if (from->right == NULL && types_strictly_match(to, from->left)) return true; + return false; } void test_unknown_type_does_not_match_unknown_type() { @@ -161,6 +166,16 @@ void test_unknown_type_matches_itself() { CHECK(types_strictly_match(a, b)); } +void test_type_abbreviations_match_raw_types() { + put(Type_abbreviations, "text", new_type_tree("address:array:character")); + // a has type (address buffer (address array character)) + reagent a("a:address:buffer:text"); + expand_type_abbreviations(a.type); + // b has type (address buffer address array character) + reagent b("b:address:buffer:address:array:character"); + CHECK(types_strictly_match(a, b)); +} + //: helpers bool is_unsafe(const reagent& r) { -- cgit 1.4.1-2-gfad0