main = <No Member>;
//
// Problems in component:
//
// org-dartlang-test:///structs.dart:6:14: Error: Field 'zz' requires exactly one annotation to declare its native type, which cannot be Void. dart:ffi Structs and Unions cannot have regular Dart fields.
//   external Z zz;
//              ^
//
library from "org-dartlang-test:///structs.dart" as str {
//
// Problems in library:
//
// org-dartlang-test:///structs.dart:6:12: Error: 'Z' isn't a type.
//   external Z zz;
//            ^
//
// org-dartlang-test:///structs.dart:6:12: Error: Type 'Z' not found.
//   external Z zz;
//            ^
//

  import "dart:ffi";

  @#C6
  final class A extends dart.ffi::Struct {
    synthetic constructor •() → str::A
      : super dart.ffi::Struct::•()
      ;
    constructor #fromTypedDataBase(synthesized dart.core::Object #typedDataBase, synthesized dart.core::int #offsetInBytes) → str::A
      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase, #offsetInBytes)
      ;
    @#C8
    constructor #fromTypedData(synthesized dart.typed_data::TypedData #typedData, synthesized dart.core::int #offset, synthesized dart.core::int #sizeInBytes) → str::A
      : super dart.ffi::Struct::_fromTypedData(#typedData, #offset, #sizeInBytes)
      ;
    @#C8
    get yy() → str::Y
      return new str::Y::#fromTypedDataBase(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, str::A::yy#offsetOf.{dart.core::num::+}(this.{dart.ffi::_Compound::_offsetInBytes}{dart.core::int}){(dart.core::num) → dart.core::num});
    @#C8
    set yy(synthesized str::Y #externalFieldValue) → void
      return dart.ffi::_memCopy(this.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, str::A::yy#offsetOf.{dart.core::num::+}(this.{dart.ffi::_Compound::_offsetInBytes}{dart.core::int}){(dart.core::num) → dart.core::num}, #externalFieldValue.{dart.ffi::_Compound::_typedDataBase}{dart.core::Object}, #externalFieldValue.{dart.ffi::_Compound::_offsetInBytes}{dart.core::int}, #C10.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int});
    @#C8
    static synthetic get yy#offsetOf() → dart.core::int
      return #C10.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int};
    @#C8
    static get #sizeOf() → dart.core::int
      return #C10.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int};
  }
  final class Y extends dart.ffi::Struct {
    synthetic constructor •() → str::Y
      : super dart.ffi::Struct::•()
      ;
    constructor #fromTypedDataBase(synthesized dart.core::Object #typedDataBase, synthesized dart.core::int #offsetInBytes) → str::Y
      : super dart.ffi::Struct::_fromTypedDataBase(#typedDataBase, #offsetInBytes)
      ;
    @#C8
    constructor #fromTypedData(synthesized dart.typed_data::TypedData #typedData, synthesized dart.core::int #offset, synthesized dart.core::int #sizeInBytes) → str::Y
      : super dart.ffi::Struct::_fromTypedData(#typedData, #offset, #sizeInBytes)
      ;
    external get zz() → invalid-type;
    external set zz(synthesized invalid-type #externalFieldValue) → void;
    @#C8
    static get #sizeOf() → dart.core::int
      return #C10.{dart.core::List::[]}(dart.ffi::_abi()){(dart.core::int) → dart.core::int};
  }
}
constants  {
  #C1 = "vm:ffi:struct-fields"
  #C2 = TypeLiteralConstant(str::Y)
  #C3 = <dart.core::Type>[#C2]
  #C4 = null
  #C5 = dart.ffi::_FfiStructLayout {fieldTypes:#C3, packing:#C4}
  #C6 = dart.core::pragma {name:#C1, options:#C5}
  #C7 = "vm:prefer-inline"
  #C8 = dart.core::pragma {name:#C7, options:#C4}
  #C9 = 0
  #C10 = <dart.core::int>[#C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9, #C9]
}
