Fix constant folding of type literal equality

Closes #35853

Change-Id: I1c6caa1c8e074e8fd80c47699d6b0837bec166e0
Reviewed-on: https://dart-review.googlesource.com/c/92422
Reviewed-by: Stephen Adams <sra@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index 4f78774..5ad14d9 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -450,10 +450,10 @@
 
   bool operator ==(other) {
     return other is TypeConstantValue &&
-        representedType == other.representedType;
+        representedType.unaliased == other.representedType.unaliased;
   }
 
-  int get hashCode => representedType.hashCode * 13;
+  int get hashCode => representedType.unaliased.hashCode * 13;
 
   List<ConstantValue> getDependencies() => const <ConstantValue>[];
 
diff --git a/tests/compiler/dart2js_extra/35853_test.dart b/tests/compiler/dart2js_extra/35853_test.dart
new file mode 100644
index 0000000..3fe033ac
--- /dev/null
+++ b/tests/compiler/dart2js_extra/35853_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+typedef F1 = int Function(int);
+typedef F2 = int Function(int);
+typedef F3 = int Function(double);
+
+@pragma('dart2js:noInline')
+id(x) => x;
+
+main() {
+  var f1 = F1;
+  var f2 = F2;
+  var f3 = F3;
+  Expect.isTrue(f1 == f2);
+  var result12 = identical(f1, f2);
+  Expect.isFalse(f1 == f3);
+  Expect.isFalse(identical(f1, f3));
+  Expect.isFalse(f2 == f3);
+  Expect.isFalse(identical(f2, f3));
+
+  var g1 = id(F1);
+  var g2 = id(F2);
+  var g3 = id(F3);
+  Expect.isTrue(g1 == g2);
+  Expect.equals(result12, identical(g1, g2));
+  Expect.isFalse(g1 == g3);
+  Expect.isFalse(identical(g1, g3));
+  Expect.isFalse(g2 == g3);
+  Expect.isFalse(identical(g2, g3));
+}