[vm/ffi] Allow getters/setters in structs with variable-length inline arrays
Closes: https://github.com/dart-lang/sdk/issues/56399
Change-Id: Ia5da1d950c3b08e0a4b099930ef3ad84f3116601
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/379622
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Auto-Submit: Halil Durmus <durmushalil@proton.me>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index a736149..3c3d021 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -1481,8 +1481,16 @@
var lastElement = (fieldElement?.enclosingElement as ClassElement?)
?.fields
.reversed
- .where((field) => !field.isStatic)
- .firstOrNull;
+ .where((field) {
+ if (field.isStatic) return false;
+ if (!field.isExternal) {
+ if (!(field.getter?.isExternal ?? false) &&
+ !(field.setter?.isExternal ?? false)) {
+ return false;
+ }
+ }
+ return true;
+ }).firstOrNull;
var isLastField = fieldElement == lastElement;
_validateSizeOfAnnotation(
fieldType,
diff --git a/tests/ffi/static_checks/vmspecific_static_checks_array_test.dart b/tests/ffi/static_checks/vmspecific_static_checks_array_test.dart
index 3c9a39b..c17ecc5 100644
--- a/tests/ffi/static_checks/vmspecific_static_checks_array_test.dart
+++ b/tests/ffi/static_checks/vmspecific_static_checks_array_test.dart
@@ -72,3 +72,50 @@
// ^
// [cfe] Field 'a0' must have an 'Array' annotation that matches the dimensions.
}
+
+final class TestStruct8 extends Struct {
+ /**/ @Array.variable()
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.VARIABLE_LENGTH_ARRAY_NOT_LAST
+ external Array<Uint8> a0;
+ // ^
+ // [cfe] Variable length 'Array's must only occur as the last field of Structs.
+
+ @Uint8()
+ external int get a1;
+}
+
+final class TestStruct9 extends Struct {
+ /**/ @Array.variable()
+ // ^^^^^^^^^^^^^^^^^
+ // [analyzer] COMPILE_TIME_ERROR.VARIABLE_LENGTH_ARRAY_NOT_LAST
+ external Array<Uint8> a0;
+ // ^
+ // [cfe] Variable length 'Array's must only occur as the last field of Structs.
+
+ @Uint8()
+ external int get a1;
+ external set a1(int value);
+}
+
+final class TestStruct10 extends Struct {
+ @Array.variable()
+ external Array<Uint8> a0;
+
+ bool get a1 => true;
+}
+
+final class TestStruct11 extends Struct {
+ @Array.variable()
+ external Array<Uint8> a0;
+
+ set a1(bool value) {}
+}
+
+final class TestStruct12 extends Struct {
+ @Array.variable()
+ external Array<Uint8> a0;
+
+ bool get a1 => true;
+ set a1(bool value) {}
+}