// 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=--enable-experiment=records
// VMOptions=--enable-experiment=records --deterministic --optimization-counter-threshold=20
// VMOptions=--enable-experiment=records --use-slow-path
// VMOptions=--enable-experiment=records --use-slow-path --stacktrace-every=100

import 'dart:ffi';

import "package:expect/expect.dart";
import "package:ffi/ffi.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),
];
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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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})");

  // In legacy mode, possibly return null.

  // In both nnbd and legacy mode, 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);
}
