From 9c4363d07844901fdb7dc595677acbcd53a892a7 Mon Sep 17 00:00:00 2001 From: Daniel Sainati Date: Thu, 16 Nov 2023 13:33:12 -0500 Subject: [PATCH 1/2] include interface conformances in interface supported entitlements --- runtime/sema/type.go | 5 +++- runtime/tests/checker/entitlements_test.go | 27 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/runtime/sema/type.go b/runtime/sema/type.go index cf7be4bf8e..799e6df2f8 100644 --- a/runtime/sema/type.go +++ b/runtime/sema/type.go @@ -5277,7 +5277,10 @@ func (t *InterfaceType) SupportedEntitlements() (set *EntitlementOrderedSet) { }) } }) - // TODO: include inherited entitlements + + t.EffectiveInterfaceConformanceSet().ForEach(func(it *InterfaceType) { + set.SetAll(it.SupportedEntitlements()) + }) t.supportedEntitlements = set return set diff --git a/runtime/tests/checker/entitlements_test.go b/runtime/tests/checker/entitlements_test.go index 2b6ea3360a..325382db40 100644 --- a/runtime/tests/checker/entitlements_test.go +++ b/runtime/tests/checker/entitlements_test.go @@ -5561,6 +5561,33 @@ func TestCheckEntitlementConditions(t *testing.T) { assert.NoError(t, err) }) + + t.Run("result value inherited interface entitlement resource", func(t *testing.T) { + t.Parallel() + _, err := ParseAndCheck(t, ` + entitlement X + entitlement Y + resource interface I { + access(X) view fun foo(): Bool { + return true + } + } + resource interface J: I { + access(Y) view fun bar(): Bool { + return true + } + } + fun bar(r: @{J}): @{J} { + post { + result.foo(): "" + result.bar(): "" + } + return <-r + } + `) + + assert.NoError(t, err) + }) } func TestCheckEntitledWriteAndMutateNotAllowed(t *testing.T) { From 17ae40009bd7f25ea030072376e2639523dbcdf6 Mon Sep 17 00:00:00 2001 From: Daniel Sainati Date: Thu, 16 Nov 2023 15:13:08 -0500 Subject: [PATCH 2/2] add test --- runtime/tests/checker/entitlements_test.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/runtime/tests/checker/entitlements_test.go b/runtime/tests/checker/entitlements_test.go index 325382db40..f95dab90fa 100644 --- a/runtime/tests/checker/entitlements_test.go +++ b/runtime/tests/checker/entitlements_test.go @@ -5588,6 +5588,28 @@ func TestCheckEntitlementConditions(t *testing.T) { assert.NoError(t, err) }) + + t.Run("result inherited interface method", func(t *testing.T) { + t.Parallel() + _, err := ParseAndCheck(t, ` + entitlement X + entitlement Y + resource interface I { + access(X, Y) view fun foo(): Bool + } + resource interface J: I { + access(Y) view fun foo(): Bool + } + fun bar(r: @{J}): @{J} { + post { + result.foo(): "" + } + return <-r + } + `) + + assert.NoError(t, err) + }) } func TestCheckEntitledWriteAndMutateNotAllowed(t *testing.T) {