[dart2js] Fix type inference for record accessses on invalid indices.

Bug: 52438
Change-Id: Ic180e181142f6a33e9915f13890d9a3825a5ec0c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/304380
Commit-Queue: Nate Biggs <natebiggs@google.com>
Reviewed-by: Mayank Patke <fishythefish@google.com>
Reviewed-by: Sigmund Cherem <sigmund@google.com>
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index 13327c0..d1c39be 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -917,10 +917,15 @@
 
   @override
   AbstractValue getGetterTypeInRecord(AbstractValue value, String getterName) {
-    final type = value is RecordTypeMask
-        ? value.types[value.shape.indexOfGetterName(getterName)]
-        : null;
-    return type ?? dynamicType;
+    if (value is RecordTypeMask) {
+      final getterIndex = value.shape.indexOfGetterName(getterName);
+      // Generated code can sometimes contain record accesses for invalid
+      // getters.
+      if (getterIndex >= 0) {
+        return value.types[getterIndex];
+      }
+    }
+    return dynamicType;
   }
 
   @override
diff --git a/tests/web/regress/issue/52438_test.dart b/tests/web/regress/issue/52438_test.dart
new file mode 100644
index 0000000..4ea98cc
--- /dev/null
+++ b/tests/web/regress/issue/52438_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2023, 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.
+
+// Switches geenrate record accesses on non-existent fields. These accesses
+// should be guarded by a type check but Dart2JS does not always promote
+// correctly after the type check.
+
+void main() {
+  Object r = (1, 2);
+  switch (r) {
+    case (int _, int _, int c):
+      print('Skip, no match');
+  }
+}