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

typedef F<X extends core::num> = self::A<X>;
typedef G<unrelated Y extends core::Object? = dynamic> = self::A<core::int>;
typedef H<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic> = self::A<X%>;
class A<T extends core::Object? = dynamic> extends core::Object {
  static final field dynamic _redirecting# = <dynamic>[self::A::redirect]/*isLegacy*/;
  constructor •() → self::A<self::A::T%>
    : super core::Object::•()
    ;
  static method _#new#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#new#tearOff::T%>
    return new self::A::•<self::A::_#new#tearOff::T%>();
  static factory fact<T extends core::Object? = dynamic>() → self::A<self::A::fact::T%>
    return new self::A::•<self::A::fact::T%>();
  static method _#fact#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#fact#tearOff::T%>
    return self::A::fact<self::A::_#fact#tearOff::T%>();
  static factory redirect<T extends core::Object? = dynamic>() → self::A<self::A::redirect::T%>
    let Never #redirecting_factory = self::A::• in let self::A::redirect::T% #typeArg0 = null in invalid-expression;
  static method _#redirect#tearOff<T extends core::Object? = dynamic>() → self::A<self::A::_#redirect#tearOff::T%>
    return new self::A::•<self::A::_#redirect#tearOff::T%>();
}
static final field core::bool inSoundMode = !(core::_GrowableList::•<core::int?>(0) is{ForNonNullableByDefault} core::List<core::int>);
static const field () → self::A<core::int> f1a = #C2;
static const field () → self::A<core::int> f1b = #C2;
static const field () → self::A<core::int> f1c = #C3;
static const field () → self::A<core::int> f1d = #C5;
static const field () → self::A<core::int> f1e = #C5;
static const field () → self::A<core::int> f1f = #C6;
static const field () → self::A<core::int> f1g = #C8;
static const field () → self::A<core::int> f1h = #C8;
static const field () → self::A<core::int> f1i = #C9;
static const field () → self::A<core::int> g1a = #C2;
static const field () → self::A<core::int> g1b = #C2;
static const field () → self::A<core::int> g1c = #C3;
static const field () → self::A<core::int> h1a = #C2;
static const field () → self::A<core::int> h1b = #C2;
static const field () → self::A<core::int> h1c = #C3;
static method main() → dynamic {
  self::test<core::int>();
  core::identical(#C2, #C2);
  core::identical(#C2, #C3);
  core::identical(#C5, #C5);
  core::identical(#C5, #C6);
  core::identical(#C8, #C8);
  core::identical(#C8, #C9);
  core::identical(#C2, #C2);
  core::identical(#C2, #C3);
  core::identical(#C2, #C2);
  core::identical(#C2, #C3);
}
static method test<T extends core::num>() → dynamic {
  () → self::A<self::test::T> f2a = #C1<self::test::T>;
  () → self::A<self::test::T> f2b = #C1<self::test::T>;
  () → self::A<self::test::T> f2c = #C1<self::test::T>;
  () → self::A<self::test::T> f2d = #C4<self::test::T>;
  () → self::A<self::test::T> f2e = #C4<self::test::T>;
  () → self::A<self::test::T> f2f = #C4<self::test::T>;
  () → self::A<self::test::T> f2g = #C7<self::test::T>;
  () → self::A<self::test::T> f2h = #C7<self::test::T>;
  () → self::A<self::test::T> f2i = #C7<self::test::T>;
  () → self::A<core::int> g2a = #C2;
  () → self::A<core::int> g2b = #C2;
  () → self::A<core::int> g2c = #C3;
  () → self::A<self::test::T> h2a = #C1<self::test::T>;
  () → self::A<self::test::T> h2b = #C1<self::test::T>;
  () → self::A<self::test::T> h2c = #C1<self::test::T>;
  self::expect(#C2, g2a);
  self::expect(g2a, g2b);
  if(self::inSoundMode) {
    self::expect(g2a, g2c);
  }
}
static method expect(dynamic expected, dynamic actual) → dynamic {
  if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
    throw "Expected ${expected}, actual ${actual}";
}
static method _#F#new#tearOff<X extends core::num>() → self::A<self::_#F#new#tearOff::X>
  return new self::A::•<self::_#F#new#tearOff::X>();
static method _#F#fact#tearOff<X extends core::num>() → self::A<self::_#F#fact#tearOff::X>
  return self::A::fact<self::_#F#fact#tearOff::X>();
static method _#F#redirect#tearOff<X extends core::num>() → self::A<self::_#F#redirect#tearOff::X>
  return self::A::_#redirect#tearOff<self::_#F#redirect#tearOff::X>();
static method _#G#new#tearOff<unrelated Y extends core::Object? = dynamic>() → self::A<core::int>
  return new self::A::•<core::int>();
static method _#G#fact#tearOff<unrelated Y extends core::Object? = dynamic>() → self::A<core::int>
  return self::A::fact<core::int>();
static method _#G#redirect#tearOff<unrelated Y extends core::Object? = dynamic>() → self::A<core::int>
  return self::A::_#redirect#tearOff<core::int>();
static method _#H#new#tearOff<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic>() → self::A<self::_#H#new#tearOff::X%>
  return new self::A::•<self::_#H#new#tearOff::X%>();
static method _#H#fact#tearOff<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic>() → self::A<self::_#H#fact#tearOff::X%>
  return self::A::fact<self::_#H#fact#tearOff::X%>();
static method _#H#redirect#tearOff<X extends core::Object? = dynamic, unrelated Y extends core::Object? = dynamic>() → self::A<self::_#H#redirect#tearOff::X%>
  return self::A::_#redirect#tearOff<self::_#H#redirect#tearOff::X%>();

constants  {
  #C1 = static-tearoff self::A::_#new#tearOff
  #C2 = instantiation self::A::_#new#tearOff <core::int*>
  #C3 = instantiation self::A::_#new#tearOff <core::int>
  #C4 = static-tearoff self::A::_#fact#tearOff
  #C5 = instantiation self::A::_#fact#tearOff <core::int*>
  #C6 = instantiation self::A::_#fact#tearOff <core::int>
  #C7 = static-tearoff self::A::_#redirect#tearOff
  #C8 = instantiation self::A::_#redirect#tearOff <core::int*>
  #C9 = instantiation self::A::_#redirect#tearOff <core::int>
}

Extra constant evaluation status:
Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:38:3 -> BoolConstant(true)
Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:39:3 -> BoolConstant(false)
Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:41:3 -> BoolConstant(true)
Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:42:3 -> BoolConstant(false)
Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:44:3 -> BoolConstant(true)
Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:45:3 -> BoolConstant(false)
Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:47:3 -> BoolConstant(true)
Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:48:3 -> BoolConstant(false)
Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:50:3 -> BoolConstant(true)
Evaluated: StaticInvocation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:51:3 -> BoolConstant(false)
Extra constant evaluation: evaluated: 61, effectively constant: 10
