library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:_internal" as _in;

class C extends core::Object {
  field core::num pi = 3.14;
  field core::num? _#C#p1 = null;
  field core::bool _#C#p1#isSet = false;
  field core::num? _#C#p2 = null;
  field core::bool _#C#p2#isSet = false;
  synthetic constructor •() → self::C
    : super core::Object::•()
    ;
  get p1() → core::num {
    if(!this.{self::C::_#C#p1#isSet}{core::bool}) {
      this.{self::C::_#C#p1} = this.{self::C::pi}{core::num};
      this.{self::C::_#C#p1#isSet} = true;
    }
    return let final core::num? #t1 = this.{self::C::_#C#p1}{core::num?} in #t1{core::num};
  }
  set p1(core::num p1#param) → void {
    this.{self::C::_#C#p1#isSet} = true;
    this.{self::C::_#C#p1} = p1#param;
  }
  get p2() → core::num {
    if(!this.{self::C::_#C#p2#isSet}{core::bool}) {
      final core::num #t2 = this.{self::C::pi}{core::num};
      if(this.{self::C::_#C#p2#isSet}{core::bool})
        throw new _in::LateError::fieldADI("p2");
      this.{self::C::_#C#p2} = #t2;
      this.{self::C::_#C#p2#isSet} = true;
    }
    return let final core::num? #t3 = this.{self::C::_#C#p2}{core::num?} in #t3{core::num};
  }
}
static method main() → dynamic {
  self::expect(3.14, new self::C::•().{self::C::p1}{core::num});
  self::expect(3.14, new self::C::•().{self::C::p2}{core::num});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
