library;
import self as self;
import "dart:core" as core;

@#C3
@#C5
@#C7
static method opaqueVal() → core::int
  return core::int::parse("42");
@#C3
@#C5
@#C7
static method callClosure(positional-parameter func) → void/* scope=[
  #ctx1: not-captured VariableContext([
    positional-parameter func;
  ]),
] */ {
  if(self::opaqueVal() =={core::num::==}{(core::Object) → core::bool} 1)
    func(){() → void};
}
static method foo42() → void /* scope=[
  #ctx2: direct-captured VariableContext([
    local-variable a;
    local-variable b;
    local-variable c;
    local-variable d;
  ]),
] */ {
  a := self::opaqueVal();
  b := self::opaqueVal();
  c := self::opaqueVal();
  d := self::opaqueVal();
  self::callClosure(() /* #ctx2 */ → void {
    core::print(a);
    core::print(b);
    core::print(d);
  });
  self::callClosure(() /* #ctx2 */ → void {
    core::print(b);
    core::print(c);
  });
  #L1:
  while (true)/* scope=[
    #ctx3: direct-captured VariableContext([
      local-variable e;
      local-variable f;
      local-variable g;
    ]),
  ] */ {
    e := 50;
    f := 60;
    g := 70;
    self::callClosure(() /* #ctx2 */ → void {
      d = d.{core::num::+}(41){(core::num) → core::int};
    });
    self::callClosure(() /* #ctx3 */ → void {
      e = e.{core::num::+}(51){(core::num) → core::int};
      f = f.{core::num::+}(61){(core::num) → core::int};
    });
    self::callClosure(() /* #ctx3 */ → void {
      f = f.{core::num::+}(62){(core::num) → core::int};
      g = g.{core::num::+}(72){(core::num) → core::int};
    });
    core::print(d);
    core::print(e);
    core::print(f);
    core::print(g);
    if(self::opaqueVal() =={core::num::==}{(core::Object) → core::bool} 1)
      break #L1;
  }
  for /* scope=[
    #ctx4: direct-captured VariableContext([
      local-variable i;
      local-variable h;
    ]),
  ] */ (i := 0; i.{core::num::<}(10){(core::num) → core::bool}; i = i.{core::num::+}(1){(core::num) → core::int}) {
    h := self::opaqueVal();
    self::callClosure(() /* #ctx4 */ → void {
      core::print(h);
      core::print(i);
    });
    for /* scope=[
      #ctx5: direct-captured VariableContext([
        local-variable j;
        local-variable k;
      ]),
    ] */ (j := 0; j.{core::num::<}(10){(core::num) → core::bool}; j = j.{core::num::+}(1){(core::num) → core::int}) {
      k := 90;
      self::callClosure(() /* #ctx5 */ → void {
        j = j.{core::num::+}(2){(core::num) → core::int};
        k = k.{core::num::+}(91){(core::num) → core::int};
      });
      core::print(k);
    }
  }
}

constants  {
  #C1 = "vm:never-inline"
  #C2 = null
  #C3 = core::pragma {name:#C1, options:#C2}
  #C4 = "wasm:never-inline"
  #C5 = core::pragma {name:#C4, options:#C2}
  #C6 = "dart2js:noInline"
  #C7 = core::pragma {name:#C6, options:#C2}
}


Constructor coverage from constants:
org-dartlang-testcase:///foo42.dart:
- pragma._ (from org-dartlang-sdk:///sdk/lib/core/annotations.dart)
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart)
