library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/extensions/if_null2.dart:30:6: Error: This expression has type 'void' and can't be used.
//   c?.property = value ?? 0;
//      ^
//
import self as self;
import "dart:core" as core;

class Class extends core::Object {
  field core::int field;
  constructor •(core::int field) → self::Class
    : self::Class::field = field, super core::Object::•()
    ;
}
extension Extension on self::Class {
  get property = self::Extension|get#property;
  get nullableProperty = self::Extension|get#nullableProperty;
  method method = self::Extension|method;
  tearoff method = self::Extension|get#method;
  set property = self::Extension|set#property;
}
static method Extension|get#property(lowered final self::Class #this) → core::int
  return #this.{self::Class::field}{core::int};
static method Extension|get#nullableProperty(lowered final self::Class #this) → core::int?
  return #this.{self::Class::field}{core::int};
static method Extension|set#property(lowered final self::Class #this, core::int? value) → void {
  #this.{self::Class::field} = let final core::int? #t1 = value in #t1 == null ?{core::int} 0 : #t1{core::int};
}
static method Extension|method(lowered final self::Class #this) → core::int
  return #this.{self::Class::field}{core::int};
static method Extension|get#method(lowered final self::Class #this) → () → core::int
  return () → core::int => self::Extension|method(#this);
static method main() → dynamic {
  self::test(null);
}
static get value() → core::int?
  return 42;
static method test(self::Class? c) → dynamic {
  let final core::int? #t2 = let final self::Class? #t3 = c in #t3 == null ?{core::int?} null : self::Extension|get#property(#t3{self::Class}) in #t2 == null ?{core::int} 0 : #t2{core::int};
  let final core::int? #t4 = let final self::Class? #t5 = c in #t5 == null ?{core::int?} null : self::Extension|get#property(#t5{self::Class}) in #t4 == null ?{core::int} 0 : #t4{core::int};
  let final self::Class? #t6 = c in #t6 == null ?{void} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
  let final self::Class? #t8 = c in #t8 == null ?{core::int?} null : self::Extension|set#property(#t8{self::Class}, let final core::int? #t9 = self::value in #t9 == null ?{core::int} 0 : #t9{core::int});
  let final core::int? #t10 = let final self::Class? #t11 = c in #t11 == null ?{core::int?} null : let final core::int #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11{self::Class}, #t12) in #t12 in #t10 == null ?{core::int} 0 : #t10{core::int};
  let final core::int? #t14 = let final self::Class? #t15 = c in #t15 == null ?{core::int?} null : let final core::int? #t16 = self::value in let final void #t17 = self::Extension|set#property(#t15{self::Class}, #t16) in #t16 in #t14 == null ?{core::int} 0 : #t14{core::int};
  let final core::int? #t18 = let final self::Class? #t19 = c in #t19 == null ?{core::int?} null : self::Extension|method(#t19{self::Class}) in #t18 == null ?{core::int} 0 : #t18{core::int};
  let final core::int? #t20 = let final self::Class? #t21 = c in #t21 == null ?{core::int?} null : self::Extension|method(#t21{self::Class}) in #t20 == null ?{core::int} 0 : #t20{core::int};
  c = new self::Class::•(0);
  let final core::int? #t22 = self::Extension|get#nullableProperty(c{self::Class}) in #t22 == null ?{core::int} 0 : #t22{core::int};
  let final core::int? #t23 = self::Extension|get#nullableProperty(c{self::Class}) in #t23 == null ?{core::int} 0 : #t23{core::int};
}
