// 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=20
// VMOptions=--use-slow-path
// VMOptions=--use-slow-path --stacktrace-every=100

import 'dart:ffi';

import "package:expect/expect.dart";

import 'callback_tests_utils.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() {
  testCases.forEach((t) {
    print("==== Running " + t.name);
    t.run();
  });
}

final testCases = [
  CallbackTest.withCheck(
      "VariadicAt1Int64x2",
      Pointer.fromFunction<VariadicAt1Int64x2Type>(variadicAt1Int64x2, 0),
      variadicAt1Int64x2AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Doublex2",
      Pointer.fromFunction<VariadicAt1Doublex2Type>(variadicAt1Doublex2, 0.0),
      variadicAt1Doublex2AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int64x5",
      Pointer.fromFunction<VariadicAt1Int64x5Type>(variadicAt1Int64x5, 0),
      variadicAt1Int64x5AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Doublex5",
      Pointer.fromFunction<VariadicAt1Doublex5Type>(variadicAt1Doublex5, 0.0),
      variadicAt1Doublex5AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int64x20",
      Pointer.fromFunction<VariadicAt1Int64x20Type>(variadicAt1Int64x20, 0),
      variadicAt1Int64x20AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Doublex20",
      Pointer.fromFunction<VariadicAt1Doublex20Type>(variadicAt1Doublex20, 0.0),
      variadicAt1Doublex20AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int64x2Struct8BytesIntInt64",
      Pointer.fromFunction<VariadicAt1Int64x2Struct8BytesIntInt64Type>(
          variadicAt1Int64x2Struct8BytesIntInt64, 0),
      variadicAt1Int64x2Struct8BytesIntInt64AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD",
      Pointer.fromFunction<
              VariadicAt1Doublex2Struct32BytesHomogeneousDoubleDType>(
          variadicAt1Doublex2Struct32BytesHomogeneousDoubleD, 0.0),
      variadicAt1Doublex2Struct32BytesHomogeneousDoubleDAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub",
      Pointer.fromFunction<
              VariadicAt1DoubleStruct12BytesHomogeneousFloatDoubType>(
          variadicAt1DoubleStruct12BytesHomogeneousFloatDoub, 0.0),
      variadicAt1DoubleStruct12BytesHomogeneousFloatDoubAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int32Struct20BytesHomogeneousInt32Int32",
      Pointer.fromFunction<
              VariadicAt1Int32Struct20BytesHomogeneousInt32Int32Type>(
          variadicAt1Int32Struct20BytesHomogeneousInt32Int32, 0),
      variadicAt1Int32Struct20BytesHomogeneousInt32Int32AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub",
      Pointer.fromFunction<
              VariadicAt1DoubleStruct20BytesHomogeneousFloatDoubType>(
          variadicAt1DoubleStruct20BytesHomogeneousFloatDoub, 0.0),
      variadicAt1DoubleStruct20BytesHomogeneousFloatDoubAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt2Int32Int64IntPtr",
      Pointer.fromFunction<VariadicAt2Int32Int64IntPtrType>(
          variadicAt2Int32Int64IntPtr, 0),
      variadicAt2Int32Int64IntPtrAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1DoubleInt64Int32DoubleInt64Int32",
      Pointer.fromFunction<VariadicAt1DoubleInt64Int32DoubleInt64Int32Type>(
          variadicAt1DoubleInt64Int32DoubleInt64Int32, 0.0),
      variadicAt1DoubleInt64Int32DoubleInt64Int32AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int64Int32Struct12BytesHomogeneousFloat",
      Pointer.fromFunction<
              VariadicAt1Int64Int32Struct12BytesHomogeneousFloatType>(
          variadicAt1Int64Int32Struct12BytesHomogeneousFloat, 0.0),
      variadicAt1Int64Int32Struct12BytesHomogeneousFloatAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt11Doublex8FloatStruct12BytesHomogeneousF",
      Pointer.fromFunction<
              VariadicAt11Doublex8FloatStruct12BytesHomogeneousFType>(
          variadicAt11Doublex8FloatStruct12BytesHomogeneousF, 0.0),
      variadicAt11Doublex8FloatStruct12BytesHomogeneousFAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1DoubleInt64Int32Struct20BytesHomogeneou",
      Pointer.fromFunction<
              VariadicAt1DoubleInt64Int32Struct20BytesHomogeneouType>(
          variadicAt1DoubleInt64Int32Struct20BytesHomogeneou, 0.0),
      variadicAt1DoubleInt64Int32Struct20BytesHomogeneouAfterCallback),
  CallbackTest.withCheck(
      "VariadicAt5Doublex5",
      Pointer.fromFunction<VariadicAt5Doublex5Type>(variadicAt5Doublex5, 0.0),
      variadicAt5Doublex5AfterCallback),
  CallbackTest.withCheck(
      "VariadicAt1Int64x7Struct12BytesHomogeneousInt32",
      Pointer.fromFunction<VariadicAt1Int64x7Struct12BytesHomogeneousInt32Type>(
          variadicAt1Int64x7Struct12BytesHomogeneousInt32, 0),
      variadicAt1Int64x7Struct12BytesHomogeneousInt32AfterCallback),
];
typedef VariadicAt1Int64x2Type = Int64 Function(Int64, VarArgs<(Int64,)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64x2_a0 = 0;
int variadicAt1Int64x2_a1 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int64x2Result = 0;

int variadicAt1Int64x2CalculateResult() {
  int result = 0;

  result += variadicAt1Int64x2_a0;
  result += variadicAt1Int64x2_a1;

  variadicAt1Int64x2Result = result;

  return result;
}

/// Single variadic argument.
int variadicAt1Int64x2(int a0, int a1) {
  print("variadicAt1Int64x2(${a0}, ${a1})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Int64x2 throwing on purpose!");
  }

  variadicAt1Int64x2_a0 = a0;
  variadicAt1Int64x2_a1 = a1;

  final result = variadicAt1Int64x2CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64x2AfterCallback() {
  final result = variadicAt1Int64x2CalculateResult();

  print("after callback result = $result");

  Expect.equals(1, result);
}

typedef VariadicAt1Doublex2Type = Double Function(Double, VarArgs<(Double,)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1Doublex2_a0 = 0.0;
double variadicAt1Doublex2_a1 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1Doublex2Result = 0.0;

double variadicAt1Doublex2CalculateResult() {
  double result = 0;

  result += variadicAt1Doublex2_a0;
  result += variadicAt1Doublex2_a1;

  variadicAt1Doublex2Result = result;

  return result;
}

/// Single variadic argument.
double variadicAt1Doublex2(double a0, double a1) {
  print("variadicAt1Doublex2(${a0}, ${a1})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Doublex2 throwing on purpose!");
  }

  variadicAt1Doublex2_a0 = a0;
  variadicAt1Doublex2_a1 = a1;

  final result = variadicAt1Doublex2CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Doublex2AfterCallback() {
  final result = variadicAt1Doublex2CalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(1.0, result);
}

typedef VariadicAt1Int64x5Type = Int64 Function(
    Int64, VarArgs<(Int64, Int64, Int64, Int64)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64x5_a0 = 0;
int variadicAt1Int64x5_a1 = 0;
int variadicAt1Int64x5_a2 = 0;
int variadicAt1Int64x5_a3 = 0;
int variadicAt1Int64x5_a4 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int64x5Result = 0;

int variadicAt1Int64x5CalculateResult() {
  int result = 0;

  result += variadicAt1Int64x5_a0;
  result += variadicAt1Int64x5_a1;
  result += variadicAt1Int64x5_a2;
  result += variadicAt1Int64x5_a3;
  result += variadicAt1Int64x5_a4;

  variadicAt1Int64x5Result = result;

  return result;
}

/// Variadic arguments.
int variadicAt1Int64x5(int a0, int a1, int a2, int a3, int a4) {
  print("variadicAt1Int64x5(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Int64x5 throwing on purpose!");
  }

  variadicAt1Int64x5_a0 = a0;
  variadicAt1Int64x5_a1 = a1;
  variadicAt1Int64x5_a2 = a2;
  variadicAt1Int64x5_a3 = a3;
  variadicAt1Int64x5_a4 = a4;

  final result = variadicAt1Int64x5CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64x5AfterCallback() {
  final result = variadicAt1Int64x5CalculateResult();

  print("after callback result = $result");

  Expect.equals(-3, result);
}

typedef VariadicAt1Doublex5Type = Double Function(
    Double, VarArgs<(Double, Double, Double, Double)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1Doublex5_a0 = 0.0;
double variadicAt1Doublex5_a1 = 0.0;
double variadicAt1Doublex5_a2 = 0.0;
double variadicAt1Doublex5_a3 = 0.0;
double variadicAt1Doublex5_a4 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1Doublex5Result = 0.0;

double variadicAt1Doublex5CalculateResult() {
  double result = 0;

  result += variadicAt1Doublex5_a0;
  result += variadicAt1Doublex5_a1;
  result += variadicAt1Doublex5_a2;
  result += variadicAt1Doublex5_a3;
  result += variadicAt1Doublex5_a4;

  variadicAt1Doublex5Result = result;

  return result;
}

/// Variadic arguments.
double variadicAt1Doublex5(
    double a0, double a1, double a2, double a3, double a4) {
  print("variadicAt1Doublex5(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Doublex5 throwing on purpose!");
  }

  variadicAt1Doublex5_a0 = a0;
  variadicAt1Doublex5_a1 = a1;
  variadicAt1Doublex5_a2 = a2;
  variadicAt1Doublex5_a3 = a3;
  variadicAt1Doublex5_a4 = a4;

  final result = variadicAt1Doublex5CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Doublex5AfterCallback() {
  final result = variadicAt1Doublex5CalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-3.0, result);
}

typedef VariadicAt1Int64x20Type = Int64 Function(
    Int64,
    VarArgs<
        (
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64
        )>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64x20_a0 = 0;
int variadicAt1Int64x20_a1 = 0;
int variadicAt1Int64x20_a2 = 0;
int variadicAt1Int64x20_a3 = 0;
int variadicAt1Int64x20_a4 = 0;
int variadicAt1Int64x20_a5 = 0;
int variadicAt1Int64x20_a6 = 0;
int variadicAt1Int64x20_a7 = 0;
int variadicAt1Int64x20_a8 = 0;
int variadicAt1Int64x20_a9 = 0;
int variadicAt1Int64x20_a10 = 0;
int variadicAt1Int64x20_a11 = 0;
int variadicAt1Int64x20_a12 = 0;
int variadicAt1Int64x20_a13 = 0;
int variadicAt1Int64x20_a14 = 0;
int variadicAt1Int64x20_a15 = 0;
int variadicAt1Int64x20_a16 = 0;
int variadicAt1Int64x20_a17 = 0;
int variadicAt1Int64x20_a18 = 0;
int variadicAt1Int64x20_a19 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int64x20Result = 0;

int variadicAt1Int64x20CalculateResult() {
  int result = 0;

  result += variadicAt1Int64x20_a0;
  result += variadicAt1Int64x20_a1;
  result += variadicAt1Int64x20_a2;
  result += variadicAt1Int64x20_a3;
  result += variadicAt1Int64x20_a4;
  result += variadicAt1Int64x20_a5;
  result += variadicAt1Int64x20_a6;
  result += variadicAt1Int64x20_a7;
  result += variadicAt1Int64x20_a8;
  result += variadicAt1Int64x20_a9;
  result += variadicAt1Int64x20_a10;
  result += variadicAt1Int64x20_a11;
  result += variadicAt1Int64x20_a12;
  result += variadicAt1Int64x20_a13;
  result += variadicAt1Int64x20_a14;
  result += variadicAt1Int64x20_a15;
  result += variadicAt1Int64x20_a16;
  result += variadicAt1Int64x20_a17;
  result += variadicAt1Int64x20_a18;
  result += variadicAt1Int64x20_a19;

  variadicAt1Int64x20Result = result;

  return result;
}

/// Variadic arguments exhaust registers.
int variadicAt1Int64x20(
    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) {
  print(
      "variadicAt1Int64x20(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18}, ${a19})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Int64x20 throwing on purpose!");
  }

  variadicAt1Int64x20_a0 = a0;
  variadicAt1Int64x20_a1 = a1;
  variadicAt1Int64x20_a2 = a2;
  variadicAt1Int64x20_a3 = a3;
  variadicAt1Int64x20_a4 = a4;
  variadicAt1Int64x20_a5 = a5;
  variadicAt1Int64x20_a6 = a6;
  variadicAt1Int64x20_a7 = a7;
  variadicAt1Int64x20_a8 = a8;
  variadicAt1Int64x20_a9 = a9;
  variadicAt1Int64x20_a10 = a10;
  variadicAt1Int64x20_a11 = a11;
  variadicAt1Int64x20_a12 = a12;
  variadicAt1Int64x20_a13 = a13;
  variadicAt1Int64x20_a14 = a14;
  variadicAt1Int64x20_a15 = a15;
  variadicAt1Int64x20_a16 = a16;
  variadicAt1Int64x20_a17 = a17;
  variadicAt1Int64x20_a18 = a18;
  variadicAt1Int64x20_a19 = a19;

  final result = variadicAt1Int64x20CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64x20AfterCallback() {
  final result = variadicAt1Int64x20CalculateResult();

  print("after callback result = $result");

  Expect.equals(10, result);
}

typedef VariadicAt1Doublex20Type = Double Function(
    Double,
    VarArgs<
        (
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double,
          Double
        )>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1Doublex20_a0 = 0.0;
double variadicAt1Doublex20_a1 = 0.0;
double variadicAt1Doublex20_a2 = 0.0;
double variadicAt1Doublex20_a3 = 0.0;
double variadicAt1Doublex20_a4 = 0.0;
double variadicAt1Doublex20_a5 = 0.0;
double variadicAt1Doublex20_a6 = 0.0;
double variadicAt1Doublex20_a7 = 0.0;
double variadicAt1Doublex20_a8 = 0.0;
double variadicAt1Doublex20_a9 = 0.0;
double variadicAt1Doublex20_a10 = 0.0;
double variadicAt1Doublex20_a11 = 0.0;
double variadicAt1Doublex20_a12 = 0.0;
double variadicAt1Doublex20_a13 = 0.0;
double variadicAt1Doublex20_a14 = 0.0;
double variadicAt1Doublex20_a15 = 0.0;
double variadicAt1Doublex20_a16 = 0.0;
double variadicAt1Doublex20_a17 = 0.0;
double variadicAt1Doublex20_a18 = 0.0;
double variadicAt1Doublex20_a19 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1Doublex20Result = 0.0;

double variadicAt1Doublex20CalculateResult() {
  double result = 0;

  result += variadicAt1Doublex20_a0;
  result += variadicAt1Doublex20_a1;
  result += variadicAt1Doublex20_a2;
  result += variadicAt1Doublex20_a3;
  result += variadicAt1Doublex20_a4;
  result += variadicAt1Doublex20_a5;
  result += variadicAt1Doublex20_a6;
  result += variadicAt1Doublex20_a7;
  result += variadicAt1Doublex20_a8;
  result += variadicAt1Doublex20_a9;
  result += variadicAt1Doublex20_a10;
  result += variadicAt1Doublex20_a11;
  result += variadicAt1Doublex20_a12;
  result += variadicAt1Doublex20_a13;
  result += variadicAt1Doublex20_a14;
  result += variadicAt1Doublex20_a15;
  result += variadicAt1Doublex20_a16;
  result += variadicAt1Doublex20_a17;
  result += variadicAt1Doublex20_a18;
  result += variadicAt1Doublex20_a19;

  variadicAt1Doublex20Result = result;

  return result;
}

/// Variadic arguments exhaust registers.
double variadicAt1Doublex20(
    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) {
  print(
      "variadicAt1Doublex20(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12}, ${a13}, ${a14}, ${a15}, ${a16}, ${a17}, ${a18}, ${a19})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt1Doublex20 throwing on purpose!");
  }

  variadicAt1Doublex20_a0 = a0;
  variadicAt1Doublex20_a1 = a1;
  variadicAt1Doublex20_a2 = a2;
  variadicAt1Doublex20_a3 = a3;
  variadicAt1Doublex20_a4 = a4;
  variadicAt1Doublex20_a5 = a5;
  variadicAt1Doublex20_a6 = a6;
  variadicAt1Doublex20_a7 = a7;
  variadicAt1Doublex20_a8 = a8;
  variadicAt1Doublex20_a9 = a9;
  variadicAt1Doublex20_a10 = a10;
  variadicAt1Doublex20_a11 = a11;
  variadicAt1Doublex20_a12 = a12;
  variadicAt1Doublex20_a13 = a13;
  variadicAt1Doublex20_a14 = a14;
  variadicAt1Doublex20_a15 = a15;
  variadicAt1Doublex20_a16 = a16;
  variadicAt1Doublex20_a17 = a17;
  variadicAt1Doublex20_a18 = a18;
  variadicAt1Doublex20_a19 = a19;

  final result = variadicAt1Doublex20CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Doublex20AfterCallback() {
  final result = variadicAt1Doublex20CalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(10.0, result);
}

typedef VariadicAt1Int64x2Struct8BytesIntInt64Type = Int64 Function(
    Int64, VarArgs<(Int64, Struct8BytesInt, Int64)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64x2Struct8BytesIntInt64_a0 = 0;
int variadicAt1Int64x2Struct8BytesIntInt64_a1 = 0;
Struct8BytesInt variadicAt1Int64x2Struct8BytesIntInt64_a2 =
    Pointer<Struct8BytesInt>.fromAddress(0).ref;
int variadicAt1Int64x2Struct8BytesIntInt64_a3 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int64x2Struct8BytesIntInt64Result = 0;

int variadicAt1Int64x2Struct8BytesIntInt64CalculateResult() {
  int result = 0;

  result += variadicAt1Int64x2Struct8BytesIntInt64_a0;
  result += variadicAt1Int64x2Struct8BytesIntInt64_a1;
  result += variadicAt1Int64x2Struct8BytesIntInt64_a2.a0;
  result += variadicAt1Int64x2Struct8BytesIntInt64_a2.a1;
  result += variadicAt1Int64x2Struct8BytesIntInt64_a2.a2;
  result += variadicAt1Int64x2Struct8BytesIntInt64_a3;

  variadicAt1Int64x2Struct8BytesIntInt64Result = result;

  return result;
}

/// Variadic arguments including struct.
int variadicAt1Int64x2Struct8BytesIntInt64(
    int a0, int a1, Struct8BytesInt a2, int a3) {
  print("variadicAt1Int64x2Struct8BytesIntInt64(${a0}, ${a1}, ${a2}, ${a3})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
        "VariadicAt1Int64x2Struct8BytesIntInt64 throwing on purpose!");
  }

  variadicAt1Int64x2Struct8BytesIntInt64_a0 = a0;
  variadicAt1Int64x2Struct8BytesIntInt64_a1 = a1;
  variadicAt1Int64x2Struct8BytesIntInt64_a2 = a2;
  variadicAt1Int64x2Struct8BytesIntInt64_a3 = a3;

  final result = variadicAt1Int64x2Struct8BytesIntInt64CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64x2Struct8BytesIntInt64AfterCallback() {
  final result = variadicAt1Int64x2Struct8BytesIntInt64CalculateResult();

  print("after callback result = $result");

  Expect.equals(3, result);
}

typedef VariadicAt1Doublex2Struct32BytesHomogeneousDoubleDType = Double
    Function(Double, VarArgs<(Double, Struct32BytesHomogeneousDouble, Double)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a0 = 0.0;
double variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a1 = 0.0;
Struct32BytesHomogeneousDouble
    variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2 =
    Pointer<Struct32BytesHomogeneousDouble>.fromAddress(0).ref;
double variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a3 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1Doublex2Struct32BytesHomogeneousDoubleDResult = 0.0;

double variadicAt1Doublex2Struct32BytesHomogeneousDoubleDCalculateResult() {
  double result = 0;

  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a0;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a1;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2.a0;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2.a1;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2.a2;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2.a3;
  result += variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a3;

  variadicAt1Doublex2Struct32BytesHomogeneousDoubleDResult = result;

  return result;
}

/// Variadic arguments including struct.
double variadicAt1Doublex2Struct32BytesHomogeneousDoubleD(
    double a0, double a1, Struct32BytesHomogeneousDouble a2, double a3) {
  print(
      "variadicAt1Doublex2Struct32BytesHomogeneousDoubleD(${a0}, ${a1}, ${a2}, ${a3})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
        "VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD throwing on purpose!");
  }

  variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a0 = a0;
  variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a1 = a1;
  variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a2 = a2;
  variadicAt1Doublex2Struct32BytesHomogeneousDoubleD_a3 = a3;

  final result =
      variadicAt1Doublex2Struct32BytesHomogeneousDoubleDCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Doublex2Struct32BytesHomogeneousDoubleDAfterCallback() {
  final result =
      variadicAt1Doublex2Struct32BytesHomogeneousDoubleDCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-4.0, result);
}

typedef VariadicAt1DoubleStruct12BytesHomogeneousFloatDoubType = Double
    Function(Double, VarArgs<(Struct12BytesHomogeneousFloat, Double)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a0 = 0.0;
Struct12BytesHomogeneousFloat
    variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a1 =
    Pointer<Struct12BytesHomogeneousFloat>.fromAddress(0).ref;
double variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a2 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1DoubleStruct12BytesHomogeneousFloatDoubResult = 0.0;

double variadicAt1DoubleStruct12BytesHomogeneousFloatDoubCalculateResult() {
  double result = 0;

  result += variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a0;
  result += variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a1.a0;
  result += variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a1.a1;
  result += variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a1.a2;
  result += variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a2;

  variadicAt1DoubleStruct12BytesHomogeneousFloatDoubResult = result;

  return result;
}

/// Variadic arguments including struct.
double variadicAt1DoubleStruct12BytesHomogeneousFloatDoub(
    double a0, Struct12BytesHomogeneousFloat a1, double a2) {
  print(
      "variadicAt1DoubleStruct12BytesHomogeneousFloatDoub(${a0}, ${a1}, ${a2})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
        "VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub throwing on purpose!");
  }

  variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a0 = a0;
  variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a1 = a1;
  variadicAt1DoubleStruct12BytesHomogeneousFloatDoub_a2 = a2;

  final result =
      variadicAt1DoubleStruct12BytesHomogeneousFloatDoubCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1DoubleStruct12BytesHomogeneousFloatDoubAfterCallback() {
  final result =
      variadicAt1DoubleStruct12BytesHomogeneousFloatDoubCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-3.0, result);
}

typedef VariadicAt1Int32Struct20BytesHomogeneousInt32Int32Type = Int32 Function(
    Int32, VarArgs<(Struct20BytesHomogeneousInt32, Int32)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a0 = 0;
Struct20BytesHomogeneousInt32
    variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1 =
    Pointer<Struct20BytesHomogeneousInt32>.fromAddress(0).ref;
int variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a2 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int32Struct20BytesHomogeneousInt32Int32Result = 0;

int variadicAt1Int32Struct20BytesHomogeneousInt32Int32CalculateResult() {
  int result = 0;

  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a0;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1.a0;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1.a1;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1.a2;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1.a3;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1.a4;
  result += variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a2;

  variadicAt1Int32Struct20BytesHomogeneousInt32Int32Result = result;

  return result;
}

/// Variadic arguments including struct.
int variadicAt1Int32Struct20BytesHomogeneousInt32Int32(
    int a0, Struct20BytesHomogeneousInt32 a1, int a2) {
  print(
      "variadicAt1Int32Struct20BytesHomogeneousInt32Int32(${a0}, ${a1}, ${a2})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
        "VariadicAt1Int32Struct20BytesHomogeneousInt32Int32 throwing on purpose!");
  }

  variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a0 = a0;
  variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a1 = a1;
  variadicAt1Int32Struct20BytesHomogeneousInt32Int32_a2 = a2;

  final result =
      variadicAt1Int32Struct20BytesHomogeneousInt32Int32CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int32Struct20BytesHomogeneousInt32Int32AfterCallback() {
  final result =
      variadicAt1Int32Struct20BytesHomogeneousInt32Int32CalculateResult();

  print("after callback result = $result");

  Expect.equals(-4, result);
}

typedef VariadicAt1DoubleStruct20BytesHomogeneousFloatDoubType = Double
    Function(Double, VarArgs<(Struct20BytesHomogeneousFloat, Double)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a0 = 0.0;
Struct20BytesHomogeneousFloat
    variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1 =
    Pointer<Struct20BytesHomogeneousFloat>.fromAddress(0).ref;
double variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a2 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1DoubleStruct20BytesHomogeneousFloatDoubResult = 0.0;

double variadicAt1DoubleStruct20BytesHomogeneousFloatDoubCalculateResult() {
  double result = 0;

  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a0;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1.a0;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1.a1;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1.a2;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1.a3;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1.a4;
  result += variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a2;

  variadicAt1DoubleStruct20BytesHomogeneousFloatDoubResult = result;

  return result;
}

/// Variadic arguments including struct.
double variadicAt1DoubleStruct20BytesHomogeneousFloatDoub(
    double a0, Struct20BytesHomogeneousFloat a1, double a2) {
  print(
      "variadicAt1DoubleStruct20BytesHomogeneousFloatDoub(${a0}, ${a1}, ${a2})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
        "VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub throwing on purpose!");
  }

  variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a0 = a0;
  variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a1 = a1;
  variadicAt1DoubleStruct20BytesHomogeneousFloatDoub_a2 = a2;

  final result =
      variadicAt1DoubleStruct20BytesHomogeneousFloatDoubCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1DoubleStruct20BytesHomogeneousFloatDoubAfterCallback() {
  final result =
      variadicAt1DoubleStruct20BytesHomogeneousFloatDoubCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-4.0, result);
}

typedef VariadicAt2Int32Int64IntPtrType = Int32 Function(
    Int32, Int64, VarArgs<(IntPtr,)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt2Int32Int64IntPtr_a0 = 0;
int variadicAt2Int32Int64IntPtr_a1 = 0;
int variadicAt2Int32Int64IntPtr_a2 = 0;

// Result variable also global, so we can delete it after the callback.
int variadicAt2Int32Int64IntPtrResult = 0;

int variadicAt2Int32Int64IntPtrCalculateResult() {
  int result = 0;

  result += variadicAt2Int32Int64IntPtr_a0;
  result += variadicAt2Int32Int64IntPtr_a1;
  result += variadicAt2Int32Int64IntPtr_a2;

  variadicAt2Int32Int64IntPtrResult = result;

  return result;
}

/// Regression test for variadic arguments.
/// https://github.com/dart-lang/sdk/issues/49460
int variadicAt2Int32Int64IntPtr(int a0, int a1, int a2) {
  print("variadicAt2Int32Int64IntPtr(${a0}, ${a1}, ${a2})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt2Int32Int64IntPtr throwing on purpose!");
  }

  variadicAt2Int32Int64IntPtr_a0 = a0;
  variadicAt2Int32Int64IntPtr_a1 = a1;
  variadicAt2Int32Int64IntPtr_a2 = a2;

  final result = variadicAt2Int32Int64IntPtrCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt2Int32Int64IntPtrAfterCallback() {
  final result = variadicAt2Int32Int64IntPtrCalculateResult();

  print("after callback result = $result");

  Expect.equals(-2, result);
}

typedef VariadicAt1DoubleInt64Int32DoubleInt64Int32Type = Double Function(
    Double, VarArgs<(Int64, Int32, Double, Int64, Int32)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1DoubleInt64Int32DoubleInt64Int32_a0 = 0.0;
int variadicAt1DoubleInt64Int32DoubleInt64Int32_a1 = 0;
int variadicAt1DoubleInt64Int32DoubleInt64Int32_a2 = 0;
double variadicAt1DoubleInt64Int32DoubleInt64Int32_a3 = 0.0;
int variadicAt1DoubleInt64Int32DoubleInt64Int32_a4 = 0;
int variadicAt1DoubleInt64Int32DoubleInt64Int32_a5 = 0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1DoubleInt64Int32DoubleInt64Int32Result = 0.0;

double variadicAt1DoubleInt64Int32DoubleInt64Int32CalculateResult() {
  double result = 0;

  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a0;
  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a1;
  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a2;
  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a3;
  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a4;
  result += variadicAt1DoubleInt64Int32DoubleInt64Int32_a5;

  variadicAt1DoubleInt64Int32DoubleInt64Int32Result = result;

  return result;
}

/// Variadic arguments mixed.
double variadicAt1DoubleInt64Int32DoubleInt64Int32(
    double a0, int a1, int a2, double a3, int a4, int a5) {
  print(
      "variadicAt1DoubleInt64Int32DoubleInt64Int32(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
        "VariadicAt1DoubleInt64Int32DoubleInt64Int32 throwing on purpose!");
  }

  variadicAt1DoubleInt64Int32DoubleInt64Int32_a0 = a0;
  variadicAt1DoubleInt64Int32DoubleInt64Int32_a1 = a1;
  variadicAt1DoubleInt64Int32DoubleInt64Int32_a2 = a2;
  variadicAt1DoubleInt64Int32DoubleInt64Int32_a3 = a3;
  variadicAt1DoubleInt64Int32DoubleInt64Int32_a4 = a4;
  variadicAt1DoubleInt64Int32DoubleInt64Int32_a5 = a5;

  final result = variadicAt1DoubleInt64Int32DoubleInt64Int32CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1DoubleInt64Int32DoubleInt64Int32AfterCallback() {
  final result = variadicAt1DoubleInt64Int32DoubleInt64Int32CalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(3.0, result);
}

typedef VariadicAt1Int64Int32Struct12BytesHomogeneousFloatType = Double
    Function(Int64, VarArgs<(Int32, Struct12BytesHomogeneousFloat)>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a0 = 0;
int variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a1 = 0;
Struct12BytesHomogeneousFloat
    variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a2 =
    Pointer<Struct12BytesHomogeneousFloat>.fromAddress(0).ref;

// Result variable also global, so we can delete it after the callback.
double variadicAt1Int64Int32Struct12BytesHomogeneousFloatResult = 0.0;

double variadicAt1Int64Int32Struct12BytesHomogeneousFloatCalculateResult() {
  double result = 0;

  result += variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a0;
  result += variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a1;
  result += variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a2.a0;
  result += variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a2.a1;
  result += variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a2.a2;

  variadicAt1Int64Int32Struct12BytesHomogeneousFloatResult = result;

  return result;
}

/// Variadic arguments homogenous struct stack alignment on macos_arm64.
double variadicAt1Int64Int32Struct12BytesHomogeneousFloat(
    int a0, int a1, Struct12BytesHomogeneousFloat a2) {
  print(
      "variadicAt1Int64Int32Struct12BytesHomogeneousFloat(${a0}, ${a1}, ${a2})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
        "VariadicAt1Int64Int32Struct12BytesHomogeneousFloat throwing on purpose!");
  }

  variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a0 = a0;
  variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a1 = a1;
  variadicAt1Int64Int32Struct12BytesHomogeneousFloat_a2 = a2;

  final result =
      variadicAt1Int64Int32Struct12BytesHomogeneousFloatCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64Int32Struct12BytesHomogeneousFloatAfterCallback() {
  final result =
      variadicAt1Int64Int32Struct12BytesHomogeneousFloatCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-3.0, result);
}

typedef VariadicAt11Doublex8FloatStruct12BytesHomogeneousFType
    = Double Function(
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Double,
        Float,
        Struct12BytesHomogeneousFloat,
        Int64,
        VarArgs<(Int32, Struct12BytesHomogeneousFloat)>);

// Global variables to be able to test inputs after callback returned.
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a0 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a1 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a2 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a3 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a4 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a5 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a6 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a7 = 0.0;
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a8 = 0.0;
Struct12BytesHomogeneousFloat
    variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a9 =
    Pointer<Struct12BytesHomogeneousFloat>.fromAddress(0).ref;
int variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a10 = 0;
int variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a11 = 0;
Struct12BytesHomogeneousFloat
    variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a12 =
    Pointer<Struct12BytesHomogeneousFloat>.fromAddress(0).ref;

// Result variable also global, so we can delete it after the callback.
double variadicAt11Doublex8FloatStruct12BytesHomogeneousFResult = 0.0;

double variadicAt11Doublex8FloatStruct12BytesHomogeneousFCalculateResult() {
  double result = 0;

  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a0;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a1;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a2;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a3;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a4;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a5;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a6;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a7;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a8;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a9.a0;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a9.a1;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a9.a2;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a10;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a11;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a12.a0;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a12.a1;
  result += variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a12.a2;

  variadicAt11Doublex8FloatStruct12BytesHomogeneousFResult = result;

  return result;
}

/// Variadic arguments homogenous struct stack alignment on macos_arm64.
double variadicAt11Doublex8FloatStruct12BytesHomogeneousF(
    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) {
  print(
      "variadicAt11Doublex8FloatStruct12BytesHomogeneousF(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8}, ${a9}, ${a10}, ${a11}, ${a12})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
        "VariadicAt11Doublex8FloatStruct12BytesHomogeneousF throwing on purpose!");
  }

  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a0 = a0;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a1 = a1;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a2 = a2;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a3 = a3;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a4 = a4;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a5 = a5;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a6 = a6;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a7 = a7;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a8 = a8;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a9 = a9;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a10 = a10;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a11 = a11;
  variadicAt11Doublex8FloatStruct12BytesHomogeneousF_a12 = a12;

  final result =
      variadicAt11Doublex8FloatStruct12BytesHomogeneousFCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt11Doublex8FloatStruct12BytesHomogeneousFAfterCallback() {
  final result =
      variadicAt11Doublex8FloatStruct12BytesHomogeneousFCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-9.0, result);
}

typedef VariadicAt1DoubleInt64Int32Struct20BytesHomogeneouType
    = Double Function(
        Double,
        VarArgs<
            (
              Int64,
              Int32,
              Struct20BytesHomogeneousInt32,
              Double,
              Int64,
              Int32,
              Struct12BytesHomogeneousFloat,
              Int64
            )>);

// Global variables to be able to test inputs after callback returned.
double variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a0 = 0.0;
int variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a1 = 0;
int variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a2 = 0;
Struct20BytesHomogeneousInt32
    variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3 =
    Pointer<Struct20BytesHomogeneousInt32>.fromAddress(0).ref;
double variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a4 = 0.0;
int variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a5 = 0;
int variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a6 = 0;
Struct12BytesHomogeneousFloat
    variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a7 =
    Pointer<Struct12BytesHomogeneousFloat>.fromAddress(0).ref;
int variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a8 = 0;

// Result variable also global, so we can delete it after the callback.
double variadicAt1DoubleInt64Int32Struct20BytesHomogeneouResult = 0.0;

double variadicAt1DoubleInt64Int32Struct20BytesHomogeneouCalculateResult() {
  double result = 0;

  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a0;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a1;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a2;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3.a0;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3.a1;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3.a2;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3.a3;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3.a4;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a4;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a5;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a6;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a7.a0;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a7.a1;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a7.a2;
  result += variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a8;

  variadicAt1DoubleInt64Int32Struct20BytesHomogeneouResult = result;

  return result;
}

/// Variadic arguments mixed.
double variadicAt1DoubleInt64Int32Struct20BytesHomogeneou(
    double a0,
    int a1,
    int a2,
    Struct20BytesHomogeneousInt32 a3,
    double a4,
    int a5,
    int a6,
    Struct12BytesHomogeneousFloat a7,
    int a8) {
  print(
      "variadicAt1DoubleInt64Int32Struct20BytesHomogeneou(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7}, ${a8})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
        "VariadicAt1DoubleInt64Int32Struct20BytesHomogeneou throwing on purpose!");
  }

  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a0 = a0;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a1 = a1;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a2 = a2;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a3 = a3;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a4 = a4;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a5 = a5;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a6 = a6;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a7 = a7;
  variadicAt1DoubleInt64Int32Struct20BytesHomogeneou_a8 = a8;

  final result =
      variadicAt1DoubleInt64Int32Struct20BytesHomogeneouCalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1DoubleInt64Int32Struct20BytesHomogeneouAfterCallback() {
  final result =
      variadicAt1DoubleInt64Int32Struct20BytesHomogeneouCalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-8.0, result);
}

typedef VariadicAt5Doublex5Type = Double Function(
    Double, Double, Double, Double, Double, VarArgs<()>);

// Global variables to be able to test inputs after callback returned.
double variadicAt5Doublex5_a0 = 0.0;
double variadicAt5Doublex5_a1 = 0.0;
double variadicAt5Doublex5_a2 = 0.0;
double variadicAt5Doublex5_a3 = 0.0;
double variadicAt5Doublex5_a4 = 0.0;

// Result variable also global, so we can delete it after the callback.
double variadicAt5Doublex5Result = 0.0;

double variadicAt5Doublex5CalculateResult() {
  double result = 0;

  result += variadicAt5Doublex5_a0;
  result += variadicAt5Doublex5_a1;
  result += variadicAt5Doublex5_a2;
  result += variadicAt5Doublex5_a3;
  result += variadicAt5Doublex5_a4;

  variadicAt5Doublex5Result = result;

  return result;
}

/// Variadic arguments function definition, but not passing any.
double variadicAt5Doublex5(
    double a0, double a1, double a2, double a3, double a4) {
  print("variadicAt5Doublex5(${a0}, ${a1}, ${a2}, ${a3}, ${a4})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception("VariadicAt5Doublex5 throwing on purpose!");
  }

  variadicAt5Doublex5_a0 = a0;
  variadicAt5Doublex5_a1 = a1;
  variadicAt5Doublex5_a2 = a2;
  variadicAt5Doublex5_a3 = a3;
  variadicAt5Doublex5_a4 = a4;

  final result = variadicAt5Doublex5CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt5Doublex5AfterCallback() {
  final result = variadicAt5Doublex5CalculateResult();

  print("after callback result = $result");

  Expect.approxEquals(-3.0, result);
}

typedef VariadicAt1Int64x7Struct12BytesHomogeneousInt32Type = Int64 Function(
    Int64,
    VarArgs<
        (
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Int64,
          Struct12BytesHomogeneousInt32
        )>);

// Global variables to be able to test inputs after callback returned.
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a0 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a1 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a2 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a3 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a4 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a5 = 0;
int variadicAt1Int64x7Struct12BytesHomogeneousInt32_a6 = 0;
Struct12BytesHomogeneousInt32
    variadicAt1Int64x7Struct12BytesHomogeneousInt32_a7 =
    Pointer<Struct12BytesHomogeneousInt32>.fromAddress(0).ref;

// Result variable also global, so we can delete it after the callback.
int variadicAt1Int64x7Struct12BytesHomogeneousInt32Result = 0;

int variadicAt1Int64x7Struct12BytesHomogeneousInt32CalculateResult() {
  int result = 0;

  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a0;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a1;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a2;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a3;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a4;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a5;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a6;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a7.a0;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a7.a1;
  result += variadicAt1Int64x7Struct12BytesHomogeneousInt32_a7.a2;

  variadicAt1Int64x7Struct12BytesHomogeneousInt32Result = result;

  return result;
}

/// Struct stradles last argument register, variadic
int variadicAt1Int64x7Struct12BytesHomogeneousInt32(int a0, int a1, int a2,
    int a3, int a4, int a5, int a6, Struct12BytesHomogeneousInt32 a7) {
  print(
      "variadicAt1Int64x7Struct12BytesHomogeneousInt32(${a0}, ${a1}, ${a2}, ${a3}, ${a4}, ${a5}, ${a6}, ${a7})");

  // Possibly throw.
  if (a0 == 42 || a0 == 84) {
    print("throwing!");
    throw Exception(
        "VariadicAt1Int64x7Struct12BytesHomogeneousInt32 throwing on purpose!");
  }

  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a0 = a0;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a1 = a1;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a2 = a2;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a3 = a3;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a4 = a4;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a5 = a5;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a6 = a6;
  variadicAt1Int64x7Struct12BytesHomogeneousInt32_a7 = a7;

  final result =
      variadicAt1Int64x7Struct12BytesHomogeneousInt32CalculateResult();

  print("result = $result");

  return result;
}

void variadicAt1Int64x7Struct12BytesHomogeneousInt32AfterCallback() {
  final result =
      variadicAt1Int64x7Struct12BytesHomogeneousInt32CalculateResult();

  print("after callback result = $result");

  Expect.equals(5, result);
}
