// Copyright (c) 2023, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// This file has been automatically generated. Please do not edit it manually.
// Generated by tests/ffi/generator/structs_by_value_tests_generator.dart.
//
// SharedObjects=ffi_test_functions
// VMOptions=
// VMOptions=--deterministic --optimization-counter-threshold=90
// VMOptions=--use-slow-path
// VMOptions=--use-slow-path --stacktrace-every=100

import 'dart:ffi';

import 'package:expect/expect.dart';
// ignore: unused_import
import 'package:ffi/ffi.dart';

import 'dylib_utils.dart';

// Reuse the compound classes.
import 'function_structs_by_value_generated_compounds.dart';

final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
void main() {
  // Force dlopen so @Native lookups in DynamicLibrary.process() succeed.
  dlopenGlobalPlatformSpecific('ffi_test_functions');

  for (int i = 0; i < 100; ++i) {
    testVariadicAt1Int64x2NativeLeaf();
    testVariadicAt1Doublex2NativeLeaf();
    testVariadicAt1Int64x5NativeLeaf();
    testVariadicAt1Doublex5NativeLeaf();
    testVariadicAt1Int64x20NativeLeaf();
    testVariadicAt1Doublex20NativeLeaf();
    testVariadicAt1Int64x2Struct8BytesIntInt64NativeLeaf();
    testVariadicAt1Doublex2Struct32BytesHomogeneousDoubleDNativeLeaf();
    testVariadicAt1DoubleStruct12BytesHomogeneousFloatDoubNativeLeaf();
    testVariadicAt1Int32Struct20BytesHomogeneousInt32Int32NativeLeaf();
    testVariadicAt1DoubleStruct20BytesHomogeneousFloatDoubNativeLeaf();
    testVariadicAt2Int32Int64IntPtrNativeLeaf();
    testVariadicAt1DoubleInt64Int32DoubleInt64Int32NativeLeaf();
    testVariadicAt1Int64Int32Struct12BytesHomogeneousFloatNativeLeaf();
    testVariadicAt11Doublex8FloatStruct12BytesHomogeneousFNativeLeaf();
    testVariadicAt1DoubleInt64Int32Struct20BytesHomogeneouNativeLeaf();
    testVariadicAt5Doublex5NativeLeaf();
    testVariadicAt1Int64x7Struct12BytesHomogeneousInt32NativeLeaf();
    testVariadicAt1Struct12BytesHomogeneousInt32Int32x4NativeLeaf();
  }
}

@Native<Int64 Function(Int64, VarArgs<(Int64,)>)>(
  symbol: 'VariadicAt1Int64x2',
  isLeaf: true,
)
external int variadicAt1Int64x2NativeLeaf(int a0, int a1);

/// Single variadic argument.
void testVariadicAt1Int64x2NativeLeaf() {
  int a0;
  int a1;

  a0 = -1;
  a1 = 2;

  final result = variadicAt1Int64x2NativeLeaf(a0, a1);

  print("result = $result");

  Expect.equals(1, result);
}

@Native<Double Function(Double, VarArgs<(Double,)>)>(
  symbol: 'VariadicAt1Doublex2',
  isLeaf: true,
)
external double variadicAt1Doublex2NativeLeaf(double a0, double a1);

/// Single variadic argument.
void testVariadicAt1Doublex2NativeLeaf() {
  double a0;
  double a1;

  a0 = -1.0;
  a1 = 2.0;

  final result = variadicAt1Doublex2NativeLeaf(a0, a1);

  print("result = $result");

  Expect.approxEquals(1.0, result);
}

@Native<Int64 Function(Int64, VarArgs<(Int64, Int64, Int64, Int64)>)>(
  symbol: 'VariadicAt1Int64x5',
  isLeaf: true,
)
external int variadicAt1Int64x5NativeLeaf(
  int a0,
  int a1,
  int a2,
  int a3,
  int a4,
);

/// Variadic arguments.
void testVariadicAt1Int64x5NativeLeaf() {
  int a0;
  int a1;
  int a2;
  int a3;
  int a4;

  a0 = -1;
  a1 = 2;
  a2 = -3;
  a3 = 4;
  a4 = -5;

  final result = variadicAt1Int64x5NativeLeaf(a0, a1, a2, a3, a4);

  print("result = $result");

  Expect.equals(-3, result);
}

@Native<Double Function(Double, VarArgs<(Double, Double, Double, Double)>)>(
  symbol: 'VariadicAt1Doublex5',
  isLeaf: true,
)
external double variadicAt1Doublex5NativeLeaf(
  double a0,
  double a1,
  double a2,
  double a3,
  double a4,
);

/// Variadic arguments.
void testVariadicAt1Doublex5NativeLeaf() {
  double a0;
  double a1;
  double a2;
  double a3;
  double a4;

  a0 = -1.0;
  a1 = 2.0;
  a2 = -3.0;
  a3 = 4.0;
  a4 = -5.0;

  final result = variadicAt1Doublex5NativeLeaf(a0, a1, a2, a3, a4);

  print("result = $result");

  Expect.approxEquals(-3.0, result);
}

@Native<
  Int64 Function(
    Int64,
    VarArgs<
      (
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
        Int64,
      )
    >,
  )
>(symbol: 'VariadicAt1Int64x20', isLeaf: true)
external int variadicAt1Int64x20NativeLeaf(
  int a0,
  int a1,
  int a2,
  int a3,
  int a4,
  int a5,
  int a6,
  int a7,
  int a8,
  int a9,
  int a10,
  int a11,
  int a12,
  int a13,
  int a14,
  int a15,
  int a16,
  int a17,
  int a18,
  int a19,
);

/// Variadic arguments exhaust registers.
void testVariadicAt1Int64x20NativeLeaf() {
  int a0;
  int a1;
  int a2;
  int a3;
  int a4;
  int a5;
  int a6;
  int a7;
  int a8;
  int a9;
  int a10;
  int a11;
  int a12;
  int a13;
  int a14;
  int a15;
  int a16;
  int a17;
  int a18;
  int a19;

  a0 = -1;
  a1 = 2;
  a2 = -3;
  a3 = 4;
  a4 = -5;
  a5 = 6;
  a6 = -7;
  a7 = 8;
  a8 = -9;
  a9 = 10;
  a10 = -11;
  a11 = 12;
  a12 = -13;
  a13 = 14;
  a14 = -15;
  a15 = 16;
  a16 = -17;
  a17 = 18;
  a18 = -19;
  a19 = 20;

  final result = variadicAt1Int64x20NativeLeaf(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
    a6,
    a7,
    a8,
    a9,
    a10,
    a11,
    a12,
    a13,
    a14,
    a15,
    a16,
    a17,
    a18,
    a19,
  );

  print("result = $result");

  Expect.equals(10, result);
}

@Native<
  Double Function(
    Double,
    VarArgs<
      (
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
      )
    >,
  )
>(symbol: 'VariadicAt1Doublex20', isLeaf: true)
external double variadicAt1Doublex20NativeLeaf(
  double a0,
  double a1,
  double a2,
  double a3,
  double a4,
  double a5,
  double a6,
  double a7,
  double a8,
  double a9,
  double a10,
  double a11,
  double a12,
  double a13,
  double a14,
  double a15,
  double a16,
  double a17,
  double a18,
  double a19,
);

/// Variadic arguments exhaust registers.
void testVariadicAt1Doublex20NativeLeaf() {
  double a0;
  double a1;
  double a2;
  double a3;
  double a4;
  double a5;
  double a6;
  double a7;
  double a8;
  double a9;
  double a10;
  double a11;
  double a12;
  double a13;
  double a14;
  double a15;
  double a16;
  double a17;
  double a18;
  double a19;

  a0 = -1.0;
  a1 = 2.0;
  a2 = -3.0;
  a3 = 4.0;
  a4 = -5.0;
  a5 = 6.0;
  a6 = -7.0;
  a7 = 8.0;
  a8 = -9.0;
  a9 = 10.0;
  a10 = -11.0;
  a11 = 12.0;
  a12 = -13.0;
  a13 = 14.0;
  a14 = -15.0;
  a15 = 16.0;
  a16 = -17.0;
  a17 = 18.0;
  a18 = -19.0;
  a19 = 20.0;

  final result = variadicAt1Doublex20NativeLeaf(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
    a6,
    a7,
    a8,
    a9,
    a10,
    a11,
    a12,
    a13,
    a14,
    a15,
    a16,
    a17,
    a18,
    a19,
  );

  print("result = $result");

  Expect.approxEquals(10.0, result);
}

@Native<Int64 Function(Int64, VarArgs<(Int64, Struct8BytesInt, Int64)>)>(
  symbol: 'VariadicAt1Int64x2Struct8BytesIntInt64',
  isLeaf: true,
)
external int variadicAt1Int64x2Struct8BytesIntInt64NativeLeaf(
  int a0,
  int a1,
  Struct8BytesInt a2,
  int a3,
);

/// Variadic arguments including struct.
void testVariadicAt1Int64x2Struct8BytesIntInt64NativeLeaf() {
  int a0;
  int a1;
  final a2Pointer = calloc<Struct8BytesInt>();
  final Struct8BytesInt a2 = a2Pointer.ref;
  int a3;

  a0 = -1;
  a1 = 2;
  a2.a0 = -3;
  a2.a1 = 4;
  a2.a2 = -5;
  a3 = 6;

  final result = variadicAt1Int64x2Struct8BytesIntInt64NativeLeaf(
    a0,
    a1,
    a2,
    a3,
  );

  print("result = $result");

  Expect.equals(3, result);

  calloc.free(a2Pointer);
}

@Native<
  Double Function(
    Double,
    VarArgs<(Double, Struct32BytesHomogeneousDouble, Double)>,
  )
>(symbol: 'VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD', isLeaf: true)
external double variadicAt1Doublex2Struct32BytesHomogeneousDoubleDNativeLeaf(
  double a0,
  double a1,
  Struct32BytesHomogeneousDouble a2,
  double a3,
);

/// Variadic arguments including struct.
void testVariadicAt1Doublex2Struct32BytesHomogeneousDoubleDNativeLeaf() {
  double a0;
  double a1;
  final a2Pointer = calloc<Struct32BytesHomogeneousDouble>();
  final Struct32BytesHomogeneousDouble a2 = a2Pointer.ref;
  double a3;

  a0 = -1.0;
  a1 = 2.0;
  a2.a0 = -3.0;
  a2.a1 = 4.0;
  a2.a2 = -5.0;
  a2.a3 = 6.0;
  a3 = -7.0;

  final result = variadicAt1Doublex2Struct32BytesHomogeneousDoubleDNativeLeaf(
    a0,
    a1,
    a2,
    a3,
  );

  print("result = $result");

  Expect.approxEquals(-4.0, result);

  calloc.free(a2Pointer);
}

@Native<
  Double Function(Double, VarArgs<(Struct12BytesHomogeneousFloat, Double)>)
>(symbol: 'VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub', isLeaf: true)
external double variadicAt1DoubleStruct12BytesHomogeneousFloatDoubNativeLeaf(
  double a0,
  Struct12BytesHomogeneousFloat a1,
  double a2,
);

/// Variadic arguments including struct.
void testVariadicAt1DoubleStruct12BytesHomogeneousFloatDoubNativeLeaf() {
  double a0;
  final a1Pointer = calloc<Struct12BytesHomogeneousFloat>();
  final Struct12BytesHomogeneousFloat a1 = a1Pointer.ref;
  double a2;

  a0 = -1.0;
  a1.a0 = 2.0;
  a1.a1 = -3.0;
  a1.a2 = 4.0;
  a2 = -5.0;

  final result = variadicAt1DoubleStruct12BytesHomogeneousFloatDoubNativeLeaf(
    a0,
    a1,
    a2,
  );

  print("result = $result");

  Expect.approxEquals(-3.0, result);

  calloc.free(a1Pointer);
}

@Native<Int32 Function(Int32, VarArgs<(Struct20BytesHomogeneousInt32, Int32)>)>(
  symbol: 'VariadicAt1Int32Struct20BytesHomogeneousInt32Int32',
  isLeaf: true,
)
external int variadicAt1Int32Struct20BytesHomogeneousInt32Int32NativeLeaf(
  int a0,
  Struct20BytesHomogeneousInt32 a1,
  int a2,
);

/// Variadic arguments including struct.
void testVariadicAt1Int32Struct20BytesHomogeneousInt32Int32NativeLeaf() {
  int a0;
  final a1Pointer = calloc<Struct20BytesHomogeneousInt32>();
  final Struct20BytesHomogeneousInt32 a1 = a1Pointer.ref;
  int a2;

  a0 = -1;
  a1.a0 = 2;
  a1.a1 = -3;
  a1.a2 = 4;
  a1.a3 = -5;
  a1.a4 = 6;
  a2 = -7;

  final result = variadicAt1Int32Struct20BytesHomogeneousInt32Int32NativeLeaf(
    a0,
    a1,
    a2,
  );

  print("result = $result");

  Expect.equals(-4, result);

  calloc.free(a1Pointer);
}

@Native<
  Double Function(Double, VarArgs<(Struct20BytesHomogeneousFloat, Double)>)
>(symbol: 'VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub', isLeaf: true)
external double variadicAt1DoubleStruct20BytesHomogeneousFloatDoubNativeLeaf(
  double a0,
  Struct20BytesHomogeneousFloat a1,
  double a2,
);

/// Variadic arguments including struct.
void testVariadicAt1DoubleStruct20BytesHomogeneousFloatDoubNativeLeaf() {
  double a0;
  final a1Pointer = calloc<Struct20BytesHomogeneousFloat>();
  final Struct20BytesHomogeneousFloat a1 = a1Pointer.ref;
  double a2;

  a0 = -1.0;
  a1.a0 = 2.0;
  a1.a1 = -3.0;
  a1.a2 = 4.0;
  a1.a3 = -5.0;
  a1.a4 = 6.0;
  a2 = -7.0;

  final result = variadicAt1DoubleStruct20BytesHomogeneousFloatDoubNativeLeaf(
    a0,
    a1,
    a2,
  );

  print("result = $result");

  Expect.approxEquals(-4.0, result);

  calloc.free(a1Pointer);
}

@Native<Int32 Function(Int32, Int64, VarArgs<(IntPtr,)>)>(
  symbol: 'VariadicAt2Int32Int64IntPtr',
  isLeaf: true,
)
external int variadicAt2Int32Int64IntPtrNativeLeaf(int a0, int a1, int a2);

/// Regression test for variadic arguments.
/// https://github.com/dart-lang/sdk/issues/49460
void testVariadicAt2Int32Int64IntPtrNativeLeaf() {
  int a0;
  int a1;
  int a2;

  a0 = -1;
  a1 = 2;
  a2 = -3;

  final result = variadicAt2Int32Int64IntPtrNativeLeaf(a0, a1, a2);

  print("result = $result");

  Expect.equals(-2, result);
}

@Native<Double Function(Double, VarArgs<(Int64, Int32, Double, Int64, Int32)>)>(
  symbol: 'VariadicAt1DoubleInt64Int32DoubleInt64Int32',
  isLeaf: true,
)
external double variadicAt1DoubleInt64Int32DoubleInt64Int32NativeLeaf(
  double a0,
  int a1,
  int a2,
  double a3,
  int a4,
  int a5,
);

/// Variadic arguments mixed.
void testVariadicAt1DoubleInt64Int32DoubleInt64Int32NativeLeaf() {
  double a0;
  int a1;
  int a2;
  double a3;
  int a4;
  int a5;

  a0 = -1.0;
  a1 = 2;
  a2 = -3;
  a3 = 4.0;
  a4 = -5;
  a5 = 6;

  final result = variadicAt1DoubleInt64Int32DoubleInt64Int32NativeLeaf(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
  );

  print("result = $result");

  Expect.approxEquals(3.0, result);
}

@Native<
  Double Function(Int64, VarArgs<(Int32, Struct12BytesHomogeneousFloat)>)
>(symbol: 'VariadicAt1Int64Int32Struct12BytesHomogeneousFloat', isLeaf: true)
external double variadicAt1Int64Int32Struct12BytesHomogeneousFloatNativeLeaf(
  int a0,
  int a1,
  Struct12BytesHomogeneousFloat a2,
);

/// Variadic arguments homogenous struct stack alignment on macos_arm64.
void testVariadicAt1Int64Int32Struct12BytesHomogeneousFloatNativeLeaf() {
  int a0;
  int a1;
  final a2Pointer = calloc<Struct12BytesHomogeneousFloat>();
  final Struct12BytesHomogeneousFloat a2 = a2Pointer.ref;

  a0 = -1;
  a1 = 2;
  a2.a0 = -3.0;
  a2.a1 = 4.0;
  a2.a2 = -5.0;

  final result = variadicAt1Int64Int32Struct12BytesHomogeneousFloatNativeLeaf(
    a0,
    a1,
    a2,
  );

  print("result = $result");

  Expect.approxEquals(-3.0, result);

  calloc.free(a2Pointer);
}

@Native<
  Double Function(
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Double,
    Float,
    Struct12BytesHomogeneousFloat,
    Int64,
    VarArgs<(Int32, Struct12BytesHomogeneousFloat)>,
  )
>(symbol: 'VariadicAt11Doublex8FloatStruct12BytesHomogeneousF', isLeaf: true)
external double variadicAt11Doublex8FloatStruct12BytesHomogeneousFNativeLeaf(
  double a0,
  double a1,
  double a2,
  double a3,
  double a4,
  double a5,
  double a6,
  double a7,
  double a8,
  Struct12BytesHomogeneousFloat a9,
  int a10,
  int a11,
  Struct12BytesHomogeneousFloat a12,
);

/// Variadic arguments homogenous struct stack alignment on macos_arm64.
void testVariadicAt11Doublex8FloatStruct12BytesHomogeneousFNativeLeaf() {
  double a0;
  double a1;
  double a2;
  double a3;
  double a4;
  double a5;
  double a6;
  double a7;
  double a8;
  final a9Pointer = calloc<Struct12BytesHomogeneousFloat>();
  final Struct12BytesHomogeneousFloat a9 = a9Pointer.ref;
  int a10;
  int a11;
  final a12Pointer = calloc<Struct12BytesHomogeneousFloat>();
  final Struct12BytesHomogeneousFloat a12 = a12Pointer.ref;

  a0 = -1.0;
  a1 = 2.0;
  a2 = -3.0;
  a3 = 4.0;
  a4 = -5.0;
  a5 = 6.0;
  a6 = -7.0;
  a7 = 8.0;
  a8 = -9.0;
  a9.a0 = 10.0;
  a9.a1 = -11.0;
  a9.a2 = 12.0;
  a10 = -13;
  a11 = 14;
  a12.a0 = -15.0;
  a12.a1 = 16.0;
  a12.a2 = -17.0;

  final result = variadicAt11Doublex8FloatStruct12BytesHomogeneousFNativeLeaf(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
    a6,
    a7,
    a8,
    a9,
    a10,
    a11,
    a12,
  );

  print("result = $result");

  Expect.approxEquals(-9.0, result);

  calloc.free(a9Pointer);
  calloc.free(a12Pointer);
}

@Native<
  Double Function(
    Double,
    VarArgs<
      (
        Int64,
        Int32,
        Struct20BytesHomogeneousInt32,
        Double,
        Int64,
        Int32,
        Struct12BytesHomogeneousFloat,
        Int64,
      )
    >,
  )
>(symbol: 'VariadicAt1DoubleInt64Int32Struct20BytesHomogeneou', isLeaf: true)
external double variadicAt1DoubleInt64Int32Struct20BytesHomogeneouNativeLeaf(
  double a0,
  int a1,
  int a2,
  Struct20BytesHomogeneousInt32 a3,
  double a4,
  int a5,
  int a6,
  Struct12BytesHomogeneousFloat a7,
  int a8,
);

/// Variadic arguments mixed.
void testVariadicAt1DoubleInt64Int32Struct20BytesHomogeneouNativeLeaf() {
  double a0;
  int a1;
  int a2;
  final a3Pointer = calloc<Struct20BytesHomogeneousInt32>();
  final Struct20BytesHomogeneousInt32 a3 = a3Pointer.ref;
  double a4;
  int a5;
  int a6;
  final a7Pointer = calloc<Struct12BytesHomogeneousFloat>();
  final Struct12BytesHomogeneousFloat a7 = a7Pointer.ref;
  int a8;

  a0 = -1.0;
  a1 = 2;
  a2 = -3;
  a3.a0 = 4;
  a3.a1 = -5;
  a3.a2 = 6;
  a3.a3 = -7;
  a3.a4 = 8;
  a4 = -9.0;
  a5 = 10;
  a6 = -11;
  a7.a0 = 12.0;
  a7.a1 = -13.0;
  a7.a2 = 14.0;
  a8 = -15;

  final result = variadicAt1DoubleInt64Int32Struct20BytesHomogeneouNativeLeaf(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
    a6,
    a7,
    a8,
  );

  print("result = $result");

  Expect.approxEquals(-8.0, result);

  calloc.free(a3Pointer);
  calloc.free(a7Pointer);
}

@Native<Double Function(Double, Double, Double, Double, Double, VarArgs<()>)>(
  symbol: 'VariadicAt5Doublex5',
  isLeaf: true,
)
external double variadicAt5Doublex5NativeLeaf(
  double a0,
  double a1,
  double a2,
  double a3,
  double a4,
);

/// Variadic arguments function definition, but not passing any.
void testVariadicAt5Doublex5NativeLeaf() {
  double a0;
  double a1;
  double a2;
  double a3;
  double a4;

  a0 = -1.0;
  a1 = 2.0;
  a2 = -3.0;
  a3 = 4.0;
  a4 = -5.0;

  final result = variadicAt5Doublex5NativeLeaf(a0, a1, a2, a3, a4);

  print("result = $result");

  Expect.approxEquals(-3.0, result);
}

@Native<
  Int64 Function(
    Int64,
    VarArgs<
      (Int64, Int64, Int64, Int64, Int64, Int64, Struct12BytesHomogeneousInt32)
    >,
  )
>(symbol: 'VariadicAt1Int64x7Struct12BytesHomogeneousInt32', isLeaf: true)
external int variadicAt1Int64x7Struct12BytesHomogeneousInt32NativeLeaf(
  int a0,
  int a1,
  int a2,
  int a3,
  int a4,
  int a5,
  int a6,
  Struct12BytesHomogeneousInt32 a7,
);

/// Struct stradles last argument register, variadic
void testVariadicAt1Int64x7Struct12BytesHomogeneousInt32NativeLeaf() {
  int a0;
  int a1;
  int a2;
  int a3;
  int a4;
  int a5;
  int a6;
  final a7Pointer = calloc<Struct12BytesHomogeneousInt32>();
  final Struct12BytesHomogeneousInt32 a7 = a7Pointer.ref;

  a0 = -1;
  a1 = 2;
  a2 = -3;
  a3 = 4;
  a4 = -5;
  a5 = 6;
  a6 = -7;
  a7.a0 = 8;
  a7.a1 = -9;
  a7.a2 = 10;

  final result = variadicAt1Int64x7Struct12BytesHomogeneousInt32NativeLeaf(
    a0,
    a1,
    a2,
    a3,
    a4,
    a5,
    a6,
    a7,
  );

  print("result = $result");

  Expect.equals(5, result);

  calloc.free(a7Pointer);
}

@Native<
  Int32 Function(
    Struct12BytesHomogeneousInt32,
    VarArgs<(Int32, Int32, Int32, Int32)>,
  )
>(symbol: 'VariadicAt1Struct12BytesHomogeneousInt32Int32x4', isLeaf: true)
external int variadicAt1Struct12BytesHomogeneousInt32Int32x4NativeLeaf(
  Struct12BytesHomogeneousInt32 a0,
  int a1,
  int a2,
  int a3,
  int a4,
);

/// Variadic arguments test on macos_arm64.
void testVariadicAt1Struct12BytesHomogeneousInt32Int32x4NativeLeaf() {
  final a0Pointer = calloc<Struct12BytesHomogeneousInt32>();
  final Struct12BytesHomogeneousInt32 a0 = a0Pointer.ref;
  int a1;
  int a2;
  int a3;
  int a4;

  a0.a0 = -1;
  a0.a1 = 2;
  a0.a2 = -3;
  a1 = 4;
  a2 = -5;
  a3 = 6;
  a4 = -7;

  final result = variadicAt1Struct12BytesHomogeneousInt32Int32x4NativeLeaf(
    a0,
    a1,
    a2,
    a3,
    a4,
  );

  print("result = $result");

  Expect.equals(-4, result);

  calloc.free(a0Pointer);
}
