| // Copyright (c) 2024, 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. | 
 |  | 
 | // This test verifies that a null-aware extension method invocation is properly | 
 | // treated as unreachable when the target has type `Null`. | 
 |  | 
 | import '../static_type_helper.dart'; | 
 |  | 
 | class C { | 
 |   void method(Object? o) {} | 
 |   C operator +(Object? other) => this; | 
 | } | 
 |  | 
 | extension E on Null { | 
 |   C extensionMethod(Object? o) => C(); | 
 |   C get extensionProperty => C(); | 
 |   set extensionProperty(Object? value) {} | 
 |   C? get nullableExtensionProperty => C(); | 
 |   set nullableExtensionProperty(Object? value) {} | 
 |   C operator [](Object? index) => C(); | 
 |   operator []=(Object? index, Object? value) {} | 
 | } | 
 |  | 
 | extension E2 on C { | 
 |   C? operator [](Object? index) => C(); | 
 |   operator []=(Object? index, Object? value) {} | 
 | } | 
 |  | 
 | testLiteralNull() { | 
 |   int? i = 0; // Promotes to non-null. | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(null)?.extensionMethod(i = null); | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(null)?.extensionProperty.method(i = null); | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(null)?.extensionProperty = i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(null)?.extensionProperty += i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(null)?.nullableExtensionProperty ??= i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(null)?[i = null].method(i = null); | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(null)?[i = null] = i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(null)?[i = null] += i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E2(null)?[i = null] ??= i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 | } | 
 |  | 
 | testNullVariable(Null n) { | 
 |   int? i = 0; // Promotes to non-null. | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(n)?.extensionMethod(i = null); | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(n)?.extensionProperty.method(i = null); | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(n)?.extensionProperty = i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(n)?.extensionProperty += i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(n)?.nullableExtensionProperty ??= i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(n)?[i = null].method(i = null); | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(n)?[i = null] = i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E(n)?[i = null] += i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 |   E2(n)?[i = null] ??= i = null; | 
 |   i.expectStaticType<Exactly<int>>(); | 
 | } | 
 |  | 
 | main() { | 
 |   testLiteralNull(); | 
 |   testNullVariable(null); | 
 | } |