//
// Problems outside component:
//
// third_party/pkg/ffi/lib/src/allocation.dart: Info: Support for using non-constant type arguments 'T' in this FFI API is deprecated and will be removed in the next stable version of Dart. Rewrite the code to ensure that type arguments are compile time constants referring to a valid native type.
//
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;

import "dart:ffi";
import "package:ffi/ffi.dart";

@#C3
@#C9
class Coordinate extends ffi::Struct {
  @#C3
  static final field core::int* #sizeOf = (#C12).{core::List::[]}(ffi::_abi())/*isLegacy*/;
  @#C3
  constructor #fromTypedDataBase(dynamic #pointer) → dynamic
    : super ffi::Struct::_fromPointer(#pointer)
    ;
  @#C13
  get x() → core::double
    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()));
  @#C13
  set x(core::double #externalFieldValue) → void
    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C15).{core::List::[]}(ffi::_abi()), #externalFieldValue);
  @#C13
  get y() → core::double
    return ffi::_loadDouble(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()));
  @#C13
  set y(core::double #externalFieldValue) → void
    return ffi::_storeDouble(this.{ffi::Struct::_addressOf}, (#C17).{core::List::[]}(ffi::_abi()), #externalFieldValue);
  get next() → ffi::Pointer<self::Coordinate>
    return ffi::_fromAddress<self::Coordinate>(ffi::_loadIntPtr(this.{ffi::Struct::_addressOf}, (#C19).{core::List::[]}(ffi::_abi())));
  set next(ffi::Pointer<self::Coordinate> #externalFieldValue) → void
    return ffi::_storeIntPtr(this.{ffi::Struct::_addressOf}, (#C19).{core::List::[]}(ffi::_abi()), #externalFieldValue.{ffi::Pointer::address});
  static factory allocate(ffi::Allocator allocator, core::double x, core::double y, ffi::Pointer<self::Coordinate> next) → self::Coordinate {
    return let final self::Coordinate #t1 = new self::Coordinate::#fromTypedDataBase(allocator.{ffi::Allocator::allocate}<self::Coordinate>(self::Coordinate::#sizeOf)!) in block {
      #t1.{self::Coordinate::x} = x;
      #t1.{self::Coordinate::y} = y;
      #t1.{self::Coordinate::next} = next;
    } =>#t1;
  }
}
static method main() → dynamic {}

constants  {
  #C1 = "vm:entry-point"
  #C2 = null
  #C3 = core::pragma {name:#C1, options:#C2}
  #C4 = "vm:ffi:struct-fields"
  #C5 = TypeLiteralConstant(ffi::Double)
  #C6 = TypeLiteralConstant(ffi::Pointer<ffi::NativeType>)
  #C7 = <core::Type>[#C5, #C5, #C6]
  #C8 = ffi::_FfiStructLayout {fieldTypes:#C7}
  #C9 = core::pragma {name:#C4, options:#C8}
  #C10 = 24
  #C11 = 20
  #C12 = <core::int*>[#C10, #C11, #C10]
  #C13 = ffi::Double {}
  #C14 = 0
  #C15 = <core::int*>[#C14, #C14, #C14]
  #C16 = 8
  #C17 = <core::int*>[#C16, #C16, #C16]
  #C18 = 16
  #C19 = <core::int*>[#C18, #C18, #C18]
}


Constructor coverage from constants:
org-dartlang-testcase:///ffi_sample.dart:
- Double. (from org-dartlang-sdk:///sdk/lib/ffi/native_type.dart:122:9)
