[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) {}
+}