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 #t2) → void {
    this.{self::C::_#C#p1#isSet} = true;
    this.{self::C::_#C#p1} = #t2;
  }
  get p2() → core::num {
    if(!this.{self::C::_#C#p2#isSet}{core::bool}) {
      final core::num #t3 = 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} = #t3;
      this.{self::C::_#C#p2#isSet} = true;
    }
    return let final core::num? #t4 = this.{self::C::_#C#p2}{core::num?} in #t4{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}";
}
