Skip to content

Commit b54fa4c

Browse files
committed
Merge remote-tracking branch 'origin/develop'
2 parents 245bf95 + 336e4e4 commit b54fa4c

File tree

4 files changed

+144
-2
lines changed

4 files changed

+144
-2
lines changed

include/kllvm/ast/AST.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -963,7 +963,17 @@ class kore_definition {
963963
*
964964
* S |-> {T . S is a subsort of T}
965965
*/
966-
[[nodiscard]] SubsortMap get_subsorts() const;
966+
SubsortMap get_subsorts();
967+
968+
/*
969+
* Build this definition's supersort relation from axioms that have the
970+
* `subsort` attribute.
971+
*
972+
* The returned map is as follows:
973+
*
974+
* S |-> {T . S is a direct supersort of T}
975+
*/
976+
SubsortMap get_supersorts();
967977

968978
/*
969979
* Build this definition's overload relation from axioms that have the

lib/ast/definition.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ void kore_definition::insert_reserved_symbols() {
104104
add_module(std::move(mod));
105105
}
106106

107-
SubsortMap kore_definition::get_subsorts() const {
107+
SubsortMap kore_definition::get_subsorts() {
108108
auto subsorts = SubsortMap{};
109109

110110
for (auto *axiom : axioms_) {
@@ -121,6 +121,23 @@ SubsortMap kore_definition::get_subsorts() const {
121121
return transitive_closure(subsorts);
122122
}
123123

124+
SubsortMap kore_definition::get_supersorts() {
125+
auto supersorts = SubsortMap{};
126+
127+
for (auto *axiom : axioms_) {
128+
if (axiom->attributes().contains(attribute_set::key::Subsort)) {
129+
auto const &att = axiom->attributes().get(attribute_set::key::Subsort);
130+
auto const &inner_sort
131+
= att->get_constructor()->get_formal_arguments()[0];
132+
auto const &outer_sort
133+
= att->get_constructor()->get_formal_arguments()[1];
134+
supersorts[outer_sort.get()].insert(inner_sort.get());
135+
}
136+
}
137+
138+
return transitive_closure(supersorts);
139+
}
140+
124141
SymbolMap kore_definition::get_overloads() const {
125142
auto overloads = SymbolMap{};
126143

unittests/compiler/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
add_kllvm_unittest(compiler-tests
22
asttest.cpp
33
pattern_matching.cpp
4+
subsortmap.cpp
45
main.cpp
56
)
67

unittests/compiler/subsortmap.cpp

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#include <boost/test/unit_test.hpp>
2+
#include <kllvm/ast/AST.h>
3+
4+
using namespace kllvm;
5+
6+
BOOST_AUTO_TEST_SUITE(SubsortMapTest)
7+
8+
BOOST_AUTO_TEST_CASE(insert_contains) {
9+
SortSet sortSet;
10+
SymbolSet symbolSet;
11+
auto subsortMap = SubsortMap{};
12+
13+
auto sort = kore_composite_sort::create("Sort");
14+
auto subsort1 = kore_composite_sort::create("Subsort");
15+
auto subsort2 = kore_composite_sort::create("Subsort");
16+
17+
subsortMap[sort.get()].insert(subsort1.get());
18+
subsortMap[sort.get()].insert(subsort2.get());
19+
20+
BOOST_CHECK(subsortMap[sort.get()].contains(subsort1.get()));
21+
BOOST_CHECK(subsortMap[sort.get()].contains(subsort2.get()));
22+
BOOST_CHECK(subsortMap[sort.get()].size() == 1); // subsort1 == subsort2
23+
BOOST_CHECK(subsortMap.size() == 1);
24+
BOOST_CHECK(!subsortMap[sort.get()].contains(sort.get()));
25+
BOOST_CHECK(!subsortMap[sort.get()].empty());
26+
}
27+
28+
BOOST_AUTO_TEST_CASE(subsorts_supersorts) {
29+
auto subsort1 = kore_composite_sort::create("bar");
30+
auto subsort2 = kore_composite_sort::create("baz");
31+
32+
auto pat
33+
= sptr<kore_composite_pattern>(kore_composite_pattern::create("subsort"));
34+
pat->get_constructor()->add_formal_argument(subsort1);
35+
pat->get_constructor()->add_formal_argument(subsort2);
36+
37+
sptr<kore_axiom_declaration> decl = kore_axiom_declaration::create();
38+
decl->attributes().add(pat);
39+
40+
auto mod = sptr<kore_module>(kore_module::create("FooModule"));
41+
mod->add_declaration(decl);
42+
43+
auto def = kore_definition::create();
44+
def->add_module(mod);
45+
46+
auto subsorts_ = def->get_subsorts();
47+
auto supersorts_ = def->get_supersorts();
48+
49+
// Check bar <: baz
50+
// Check bar !<: bar
51+
// Check baz !<: baz
52+
// Check baz !<: bar
53+
BOOST_CHECK(subsorts_[subsort1.get()].contains(subsort2.get()));
54+
BOOST_CHECK(!subsorts_[subsort1.get()].contains(subsort1.get()));
55+
BOOST_CHECK(!subsorts_[subsort2.get()].contains(subsort2.get()));
56+
BOOST_CHECK(!subsorts_[subsort2.get()].contains(subsort1.get()));
57+
58+
// Check baz :> bar
59+
// Check bar !:> baz
60+
// Check bar !:> bar
61+
// Check baz !:> baz
62+
BOOST_CHECK(supersorts_[subsort2.get()].contains(subsort1.get()));
63+
BOOST_CHECK(!supersorts_[subsort1.get()].contains(subsort2.get()));
64+
BOOST_CHECK(!supersorts_[subsort1.get()].contains(subsort1.get()));
65+
BOOST_CHECK(!supersorts_[subsort2.get()].contains(subsort2.get()));
66+
}
67+
68+
BOOST_AUTO_TEST_CASE(transitive_subsorts_supersorts) {
69+
auto subsort1 = kore_composite_sort::create("foo");
70+
auto subsort2 = kore_composite_sort::create("bar");
71+
auto subsort3 = kore_composite_sort::create("baz");
72+
73+
auto pat1
74+
= sptr<kore_composite_pattern>(kore_composite_pattern::create("subsort"));
75+
pat1->get_constructor()->add_formal_argument(subsort1);
76+
pat1->get_constructor()->add_formal_argument(subsort2);
77+
78+
auto pat2
79+
= sptr<kore_composite_pattern>(kore_composite_pattern::create("subsort"));
80+
pat2->get_constructor()->add_formal_argument(subsort2);
81+
pat2->get_constructor()->add_formal_argument(subsort3);
82+
83+
sptr<kore_axiom_declaration> decl1 = kore_axiom_declaration::create();
84+
decl1->attributes().add(pat1);
85+
86+
sptr<kore_axiom_declaration> decl2 = kore_axiom_declaration::create();
87+
decl2->attributes().add(pat2);
88+
89+
auto mod = sptr<kore_module>(kore_module::create("FooModule"));
90+
mod->add_declaration(decl1);
91+
mod->add_declaration(decl2);
92+
93+
auto def = kore_definition::create();
94+
def->add_module(mod);
95+
96+
auto subsorts_ = def->get_subsorts();
97+
auto supersorts_ = def->get_supersorts();
98+
99+
// Check foo <: bar
100+
// Check bar <: baz
101+
// Check foo <: baz
102+
BOOST_CHECK(subsorts_[subsort1.get()].contains(subsort2.get()));
103+
BOOST_CHECK(subsorts_[subsort2.get()].contains(subsort3.get()));
104+
BOOST_CHECK(subsorts_[subsort1.get()].contains(subsort3.get()));
105+
106+
// Check baz :> bar
107+
// Check bar :> foo
108+
// Check baz :> foo
109+
BOOST_CHECK(supersorts_[subsort2.get()].contains(subsort1.get()));
110+
BOOST_CHECK(supersorts_[subsort3.get()].contains(subsort2.get()));
111+
BOOST_CHECK(supersorts_[subsort3.get()].contains(subsort1.get()));
112+
}
113+
114+
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)