summaryrefslogtreecommitdiff
path: root/test/gtest
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2023-09-08 20:08:33 -0500
committerGitHub <noreply@github.com>2023-09-09 01:08:33 +0000
commit4e58466b40b65cda399b4749105f0ce10f48f62b (patch)
tree9e34ae5ed464d87d75683603171e7b2645015568 /test/gtest
parent90571051b3d6f89eab184df3d4dd716472a6cd7c (diff)
downloadbinaryen-4e58466b40b65cda399b4749105f0ce10f48f62b.tar.gz
binaryen-4e58466b40b65cda399b4749105f0ce10f48f62b.tar.bz2
binaryen-4e58466b40b65cda399b4749105f0ce10f48f62b.zip
Make final types the default (#5918)
Match the spec and parse the shorthand binary and text formats as final and emit final types without supertypes using the shorthands as well. This is a potentially-breaking change, since the text and binary shorthands can no longer be used to define types that have subtypes. Also make TypeBuilder entries final by default to better match the spec and update the internal APIs to use the "open" terminology rather than "final" terminology. Future changes will update the text format to use the standard "sub open" rather than the current "sub final" keywords. The exception is the new wat parser, which supporst "sub open" as of this change, since it didn't support final types at all previously.
Diffstat (limited to 'test/gtest')
-rw-r--r--test/gtest/possible-contents.cpp13
-rw-r--r--test/gtest/type-builder.cpp108
2 files changed, 53 insertions, 68 deletions
diff --git a/test/gtest/possible-contents.cpp b/test/gtest/possible-contents.cpp
index 1092a825b..1838ad3ab 100644
--- a/test/gtest/possible-contents.cpp
+++ b/test/gtest/possible-contents.cpp
@@ -539,14 +539,11 @@ TEST_F(PossibleContentsTest, TestStructCones) {
*/
TypeBuilder builder(5);
builder.createRecGroup(0, 5);
- builder.setHeapType(0, Struct(FieldList{}));
- builder.setHeapType(1, Struct(FieldList{}));
- builder.setHeapType(2, Struct(FieldList{}));
- builder.setHeapType(3, Struct(FieldList{}));
- builder.setHeapType(4, Struct(FieldList{}));
- builder.setSubType(1, builder.getTempHeapType(0));
- builder.setSubType(2, builder.getTempHeapType(0));
- builder.setSubType(3, builder.getTempHeapType(2));
+ builder[0].setOpen() = Struct(FieldList{});
+ builder[1].setOpen().subTypeOf(builder[0]) = Struct(FieldList{});
+ builder[2].setOpen().subTypeOf(builder[0]) = Struct(FieldList{});
+ builder[3].setOpen().subTypeOf(builder[2]) = Struct(FieldList{});
+ builder[4].setOpen() = Struct(FieldList{});
auto result = builder.build();
ASSERT_TRUE(result);
auto types = *result;
diff --git a/test/gtest/type-builder.cpp b/test/gtest/type-builder.cpp
index d64d94699..0184eb074 100644
--- a/test/gtest/type-builder.cpp
+++ b/test/gtest/type-builder.cpp
@@ -261,7 +261,7 @@ TEST_F(TypeTest, InvalidFinalSupertype) {
TypeBuilder builder(2);
builder[0] = Struct{};
builder[1] = Struct{};
- builder[0].setFinal();
+ builder[0].setOpen(false);
builder[1].subTypeOf(builder[0]);
auto result = builder.build();
@@ -426,19 +426,16 @@ TEST_F(TypeTest, CanonicalizeSelfReferences) {
TEST_F(TypeTest, CanonicalizeSupertypes) {
TypeBuilder builder(6);
- builder[0] = Struct{};
- builder[1] = Struct{};
+ builder[0].setOpen() = Struct{};
+ builder[1].setOpen() = Struct{};
// Type with a supertype
- builder[2] = Struct{};
- builder[2].subTypeOf(builder[0]);
+ builder[2].setOpen().subTypeOf(builder[0]) = Struct{};
// Type with the same supertype after canonicalization.
- builder[3] = Struct{};
- builder[3].subTypeOf(builder[1]);
+ builder[3].setOpen().subTypeOf(builder[1]) = Struct{};
// Type with a different supertype
- builder[4] = Struct{};
- builder[4].subTypeOf(builder[2]);
+ builder[4].setOpen().subTypeOf(builder[2]) = Struct{};
// Type with no supertype
- builder[5] = Struct{};
+ builder[5].setOpen() = Struct{};
auto result = builder.build();
ASSERT_TRUE(result);
@@ -455,16 +452,15 @@ TEST_F(TypeTest, CanonicalizeFinal) {
// Types are different if their finality flag is different.
TypeBuilder builder(2);
builder[0] = Struct{};
- builder[1] = Struct{};
- builder[0].setFinal();
+ builder[1].setOpen() = Struct{};
auto result = builder.build();
ASSERT_TRUE(result);
auto built = *result;
EXPECT_NE(built[0], built[1]);
- EXPECT_TRUE(built[0].isFinal());
- EXPECT_FALSE(built[1].isFinal());
+ EXPECT_TRUE(!built[0].isOpen());
+ EXPECT_FALSE(!built[1].isOpen());
}
TEST_F(TypeTest, HeapTypeConstructors) {
@@ -500,21 +496,21 @@ TEST_F(TypeTest, CanonicalizeTypesBeforeSubtyping) {
TypeBuilder builder(6);
// A rec group
builder.createRecGroup(0, 2);
- builder[0] = Struct{};
- builder[1] = Struct{};
+ builder[0].setOpen() = Struct{};
+ builder[1].setOpen() = Struct{};
builder[1].subTypeOf(builder[0]);
// The same rec group again
builder.createRecGroup(2, 2);
- builder[2] = Struct{};
- builder[3] = Struct{};
+ builder[2].setOpen() = Struct{};
+ builder[3].setOpen() = Struct{};
builder[3].subTypeOf(builder[2]);
// This subtyping only validates if the previous two groups are deduplicated
// before checking subtype validity.
- builder[4] =
+ builder[4].setOpen() =
Struct({Field(builder.getTempRefType(builder[0], Nullable), Immutable)});
- builder[5] =
+ builder[5].setOpen() =
Struct({Field(builder.getTempRefType(builder[3], Nullable), Immutable)});
builder[5].subTypeOf(builder[4]);
@@ -754,9 +750,8 @@ TEST_F(TypeTest, TestHeapTypeRelations) {
{
// Immutable array fields are covariant.
TypeBuilder builder(2);
- builder[0] = Array(Field(anyref, Immutable));
- builder[1] = Array(Field(eqref, Immutable));
- builder[1].subTypeOf(builder[0]);
+ builder[0].setOpen() = Array(Field(anyref, Immutable));
+ builder[1].setOpen().subTypeOf(builder[0]) = Array(Field(eqref, Immutable));
auto results = builder.build();
ASSERT_TRUE(results);
auto built = *results;
@@ -766,9 +761,9 @@ TEST_F(TypeTest, TestHeapTypeRelations) {
{
// Depth subtyping
TypeBuilder builder(2);
- builder[0] = Struct({Field(anyref, Immutable)});
- builder[1] = Struct({Field(eqref, Immutable)});
- builder[1].subTypeOf(builder[0]);
+ builder[0].setOpen() = Struct({Field(anyref, Immutable)});
+ builder[1].setOpen().subTypeOf(builder[0]) =
+ Struct({Field(eqref, Immutable)});
auto results = builder.build();
ASSERT_TRUE(results);
auto built = *results;
@@ -778,9 +773,9 @@ TEST_F(TypeTest, TestHeapTypeRelations) {
{
// Width subtyping
TypeBuilder builder(2);
- builder[0] = Struct({Field(anyref, Immutable)});
- builder[1] = Struct({Field(anyref, Immutable), Field(anyref, Immutable)});
- builder[1].subTypeOf(builder[0]);
+ builder[0].setOpen() = Struct({Field(anyref, Immutable)});
+ builder[1].setOpen().subTypeOf(builder[0]) =
+ Struct({Field(anyref, Immutable), Field(anyref, Immutable)});
auto results = builder.build();
ASSERT_TRUE(results);
auto built = *results;
@@ -792,12 +787,12 @@ TEST_F(TypeTest, TestHeapTypeRelations) {
TypeBuilder builder(4);
auto ref0 = builder.getTempRefType(builder[0], Nullable);
auto ref1 = builder.getTempRefType(builder[1], Nullable);
- builder[0] = Struct({Field(anyref, Immutable)});
- builder[1] = Struct({Field(eqref, Immutable)});
- builder[2] = Struct({Field(ref0, Immutable)});
- builder[3] = Struct({Field(ref1, Immutable)});
- builder[1].subTypeOf(builder[0]);
- builder[3].subTypeOf(builder[2]);
+ builder[0].setOpen() = Struct({Field(anyref, Immutable)});
+ builder[1].setOpen().subTypeOf(builder[0]) =
+ Struct({Field(eqref, Immutable)});
+ builder[2].setOpen() = Struct({Field(ref0, Immutable)});
+ builder[3].setOpen().subTypeOf(builder[2]) =
+ Struct({Field(ref1, Immutable)});
auto results = builder.build();
ASSERT_TRUE(results);
auto built = *results;
@@ -809,9 +804,9 @@ TEST_F(TypeTest, TestHeapTypeRelations) {
TypeBuilder builder(2);
auto ref0 = builder.getTempRefType(builder[0], Nullable);
auto ref1 = builder.getTempRefType(builder[1], Nullable);
- builder[0] = Struct({Field(ref0, Immutable)});
- builder[1] = Struct({Field(ref1, Immutable)});
- builder[1].subTypeOf(builder[0]);
+ builder[0].setOpen() = Struct({Field(ref0, Immutable)});
+ builder[1].setOpen().subTypeOf(builder[0]) =
+ Struct({Field(ref1, Immutable)});
auto results = builder.build();
ASSERT_TRUE(results);
auto built = *results;
@@ -868,8 +863,8 @@ TEST_F(TypeTest, TestSubTypes) {
// Build type types, the second of which is a subtype.
TypeBuilder builder(2);
- builder[0] = Struct({Field(anyref, Immutable)});
- builder[1] = Struct({Field(eqref, Immutable)});
+ builder[0].setOpen() = Struct({Field(anyref, Immutable)});
+ builder[1].setOpen() = Struct({Field(eqref, Immutable)});
builder[1].subTypeOf(builder[0]);
auto result = builder.build();
@@ -902,7 +897,7 @@ TEST_F(TypeTest, TestExistingSuperType) {
Type A1;
{
TypeBuilder builder(1);
- builder[0] = Struct();
+ builder[0].setOpen() = Struct();
auto result = builder.build();
ASSERT_TRUE(result);
auto built = *result;
@@ -913,7 +908,7 @@ TEST_F(TypeTest, TestExistingSuperType) {
Type A2;
{
TypeBuilder builder(1);
- builder[0] = Struct();
+ builder[0].setOpen() = Struct();
auto result = builder.build();
ASSERT_TRUE(result);
auto built = *result;
@@ -924,8 +919,7 @@ TEST_F(TypeTest, TestExistingSuperType) {
Type B1;
{
TypeBuilder builder(1);
- builder[0] = Struct();
- builder.setSubType(0, A1.getHeapType());
+ builder[0].setOpen().subTypeOf(A1.getHeapType()) = Struct();
auto result = builder.build();
ASSERT_TRUE(result);
auto built = *result;
@@ -936,8 +930,7 @@ TEST_F(TypeTest, TestExistingSuperType) {
Type B2;
{
TypeBuilder builder(1);
- builder[0] = Struct();
- builder.setSubType(0, A2.getHeapType());
+ builder[0].setOpen().subTypeOf(A2.getHeapType()) = Struct();
auto result = builder.build();
ASSERT_TRUE(result);
auto built = *result;
@@ -959,9 +952,8 @@ TEST_F(TypeTest, TestMaxStructDepths) {
HeapType A, B;
{
TypeBuilder builder(2);
- builder[0] = Struct();
- builder[1] = Struct();
- builder.setSubType(1, builder.getTempHeapType(0));
+ builder[0].setOpen() = Struct();
+ builder[1].setOpen().subTypeOf(builder[0]) = Struct();
auto result = builder.build();
ASSERT_TRUE(result);
auto built = *result;
@@ -1004,10 +996,9 @@ TEST_F(TypeTest, TestDepth) {
HeapType A, B, C;
{
TypeBuilder builder(3);
- builder[0] = Struct();
- builder[1] = Struct();
- builder[2] = Array(Field(Type::i32, Immutable));
- builder.setSubType(1, builder.getTempHeapType(0));
+ builder[0].setOpen() = Struct();
+ builder[1].setOpen().subTypeOf(builder[0]) = Struct();
+ builder[2].setOpen() = Array(Field(Type::i32, Immutable));
auto result = builder.build();
ASSERT_TRUE(result);
auto built = *result;
@@ -1054,13 +1045,10 @@ TEST_F(TypeTest, TestIterSubTypes) {
HeapType A, B, C, D;
{
TypeBuilder builder(4);
- builder[0] = Struct();
- builder[1] = Struct();
- builder[2] = Struct();
- builder[3] = Struct();
- builder.setSubType(1, builder.getTempHeapType(0));
- builder.setSubType(2, builder.getTempHeapType(0));
- builder.setSubType(3, builder.getTempHeapType(2));
+ builder[0].setOpen() = Struct();
+ builder[1].setOpen().subTypeOf(builder[0]) = Struct();
+ builder[2].setOpen().subTypeOf(builder[0]) = Struct();
+ builder[3].setOpen().subTypeOf(builder[2]) = Struct();
auto result = builder.build();
ASSERT_TRUE(result);
auto built = *result;