library;
//
// Problems in library:
//
// pkg/front_end/testcases/general/ffi_sample.dart:12:7: Error: The type 'Coordinate' must be 'base', 'final' or 'sealed' because the supertype 'Struct' is 'base'.
// Try adding 'base', 'final', or 'sealed' to the type.
// class Coordinate extends Struct {
//       ^
//
// pkg/front_end/testcases/general/ffi_sample.dart:19:23: Error: Field 'next' should be initialized because its type 'Pointer<Coordinate>' doesn't allow null.
//  - 'Pointer' is from 'dart:ffi'.
//  - 'Coordinate' is from 'pkg/front_end/testcases/general/ffi_sample.dart'.
//   Pointer<Coordinate> next;
//                       ^^^^
//
import self as self;
import "dart:core" as core;
import "dart:ffi" as ffi;
import "dart:typed_data" as typ;

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

@#C7
class Coordinate extends ffi::Struct {
  constructor #fromTypedDataBase(synthesized core::Object #typedDataBase, synthesized core::int #offsetInBytes) → self::Coordinate
    : super ffi::Struct::_fromTypedDataBase(#typedDataBase, #offsetInBytes)
    ;
  @#C9
  constructor #fromTypedData(synthesized typ::TypedData #typedData, synthesized core::int #offset, synthesized core::int #sizeInBytes) → self::Coordinate
    : super ffi::Struct::_fromTypedData(#typedData, #offset, #sizeInBytes)
    ;
  @#C10
  @#C9
  get x() → core::double
    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::x#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num});
  @#C10
  @#C9
  set x(synthesized core::double #externalFieldValue) → void
    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::x#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}, #externalFieldValue);
  @#C10
  @#C9
  get y() → core::double
    return ffi::_loadDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::y#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num});
  @#C10
  @#C9
  set y(synthesized core::double #externalFieldValue) → void
    return ffi::_storeDouble(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::y#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}, #externalFieldValue);
  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){(core::int, {alignment: core::int?}) → ffi::Pointer<self::Coordinate>}!, #C11) in block {
      #t1.{self::Coordinate::x} = x;
      #t1.{self::Coordinate::y} = y;
      #t1.{self::Coordinate::next} = next;
    } =>#t1;
  }
  @#C9
  static get x#offsetOf() → core::int
    return #C12.{core::List::[]}(ffi::_abi()){(core::int) → core::int};
  @#C9
  static get y#offsetOf() → core::int
    return #C14.{core::List::[]}(ffi::_abi()){(core::int) → core::int};
  @#C9
  static get next#offsetOf() → core::int
    return #C16.{core::List::[]}(ffi::_abi()){(core::int) → core::int};
  @#C9
  get next() → ffi::Pointer<self::Coordinate>
    return ffi::_loadPointer<self::Coordinate>(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::next#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num});
  @#C9
  set next(synthesized ffi::Pointer<self::Coordinate> #v) → void
    return ffi::_storePointer<self::Coordinate>(this.{ffi::_Compound::_typedDataBase}{core::Object}, self::Coordinate::next#offsetOf.{core::num::+}(this.{ffi::_Compound::_offsetInBytes}{core::int}){(core::num) → core::num}, #v);
  @#C9
  static get #sizeOf() → core::int
    return #C19.{core::List::[]}(ffi::_abi()){(core::int) → core::int};
}
static method main() → dynamic {}

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


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