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

import "dart:test";

static method main() → dynamic {
  test::Class<core::num>? c;
}

library /*isNonNullableByDefault*/;
//
// Problems in library:
//
// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
//     k;
//     ^
//
// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
//     return k;
//            ^
//
// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
//     return k;
//            ^
//
// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
//   return k;
//          ^
//
// pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
//   return k;
//          ^
//
// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
//     k;
//     ^
//
// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
//     return k;
//            ^
//
// pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
//   return k;
//          ^
//
import self as test;
import "dart:_internal" as _in;
import "dart:core" as core;

import "dart:_internal";

@#C1
class Class<T extends core::num> extends core::Object /*hasConstConstructor*/  {
  final field core::int a;
  final field test::Class::T b;
  const constructor constConstructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
    : test::Class::a = a, test::Class::b = b, super core::Object::•()
    ;
  constructor constructor(core::int a, test::Class::T b) → test::Class<test::Class::T>
    : test::Class::a = a, test::Class::b = b, super core::Object::•() {
    core::int k;
    invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:17:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
    k;
    ^" in k;
  }
  @#C1
  constructor patchedConstructor(core::int i, test::Class::T j) → test::Class<test::Class::T>
    : test::Class::a = i, test::Class::b = j, super core::Object::•() {
    core::int k;
    invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:15:5: Error: Non-nullable variable 'k' must be assigned before it can be used.
    k;
    ^" in k;
  }
  method method(core::int a) → core::int {
    core::int k;
    core::int j = a;
    return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:25:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
    return k;
           ^" in k;
  }
  @#C1
  method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
    core::int k;
    core::int j = i;
    return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:22:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
    return k;
           ^" in k;
  }
  method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
    core::int k;
    core::int j = i;
    return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:28:12: Error: Non-nullable variable 'k' must be assigned before it can be used.
    return k;
           ^" in k;
  }
}
static method method(core::int a) → core::int {
  core::int k;
  core::int j = a;
  return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/origin_lib.dart:34:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
  return k;
         ^" in k;
}
@#C1
static method /* from org-dartlang-testcase:///patch_lib.dart */ patchedMethod(core::int i) → core::int {
  core::int k;
  core::int j = i;
  return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:36:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
  return k;
         ^" in k;
}
static method /* from org-dartlang-testcase:///patch_lib.dart */ _injectedMethod(core::int i) → core::int {
  core::int k;
  core::int j = i;
  return invalid-expression "pkg/front_end/testcases/nnbd/platform_definite_assignment/patch_lib.dart:42:10: Error: Non-nullable variable 'k' must be assigned before it can be used.
  return k;
         ^" in k;
}

constants  {
  #C1 = _in::_Patch {}
}
