// 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. class Class1 { Class1? get property => null; void set property(Class1? value) {} Class1 get property1 => new Class1(); Class2 get property2 => new Class2(); Class1? get nullable1 => property1; void set nullable1(Class1? value) { property = value; } Class1 nonNullable1Method() => nonNullable1; Class1? operator [](Class1? key) => nullable1; void operator []=(Class1? key, Class1? value) { property = value; } Class1? operator +(int value) => nullable1; Class1? operator -() => nullable1; Class1 get nonNullable1 => property1; Class2 get nonNullable2 => property2; } class Class2 { Class2 get property => this; void set property(Class2 value) {} Class2 nonNullable2Method() => nonNullable2; Class2 operator [](Class2? key) => property; void operator []=(Class2? key, Class2? value) => property; Class2 operator +(int value) => property; Class2 operator -() => property; Class2 get nonNullable2 => property; void set nonNullable2(Class2 value) { property = value; } } class Class3 { Class2? get property => null; Class2? operator [](Class3? key) => property; } main() { propertyAccess(null); indexAccess(null, null, null); operatorAccess(null, null); ifNull(null); } void propertyAccess(Class1? n1) { Class1? nullable1 = n1; n1?.nullable1; n1?.nullable1 = new Class1(); nullable1 = n1?.nullable1 = new Class1(); n1?.nonNullable1Method(); n1?.nonNullable1.nullable1; n1?.nullable1?.nullable1; n1?.nonNullable1.nullable1?.nullable1; n1?.nonNullable1.nullable1 = new Class1(); n1?.nullable1?.nullable1 = new Class1(); n1?.nonNullable1.nullable1?.nullable1 = new Class1(); (n1?.nullable1)?.nullable1; throws(() => (n1?.nullable1 = new Class1()).nullable1); throws(() => (n1?.nonNullable1Method()).nullable1); nullable1 = n1?.nonNullable1.nullable1 = new Class1(); nullable1 = n1?.nullable1?.nullable1 = new Class1(); nullable1 = n1?.nonNullable1.nullable1?.nullable1 = new Class1(); n1?.nullable1?.nonNullable1Method(); n1?.nullable1 = new Class1().nullable1; nullable1 = n1?.nullable1 = new Class1().nullable1; n1?.nullable1 = new Class1().nullable1 = new Class1(); nullable1 = n1?.nullable1 = new Class1().nullable1 = new Class1(); n1?.nullable1 = new Class1().nonNullable1Method(); nullable1 = n1?.nullable1 = new Class1().nonNullable1Method(); n1?.nonNullable1Method().nullable1; n1?.nonNullable1Method().nullable1 = new Class1(); n1?.nonNullable1Method().nonNullable1Method(); n1?.nonNullable1.nonNullable1.nullable1; n1?.nonNullable1.nonNullable1.nullable1 = new Class1(); nullable1 = n1?.nonNullable1.nonNullable1.nullable1 = new Class1(); n1?.nonNullable1.nullable1?.nonNullable1Method(); n1?.nullable1 = new Class1().nonNullable1.nullable1; nullable1 = n1?.nullable1 = new Class1().nonNullable1.nullable1; n1?.nullable1 = new Class1().nonNullable1.nullable1 = new Class1(); nullable1 = n1?.nullable1 = new Class1().nonNullable1.nullable1 = new Class1(); n1?.nullable1 = new Class1().nonNullable1.nonNullable1Method(); nullable1 = n1?.nullable1 = new Class1().nonNullable1.nonNullable1Method(); n1?.nonNullable1Method().nonNullable1.nullable1; n1?.nonNullable1Method().nonNullable1.nullable1 = new Class1(); n1?.nonNullable1Method().nonNullable1.nonNullable1Method(); n1?.nonNullable1.nullable1 = new Class1().nullable1; nullable1 = n1?.nonNullable1.nullable1 = new Class1().nullable1; n1?.nonNullable1.nullable1 = new Class1().nullable1 = new Class1(); nullable1 = n1?.nonNullable1.nullable1 = new Class1().nullable1 = new Class1(); n1?.nonNullable1.nullable1 = new Class1().nonNullable1Method(); nullable1 = n1?.nonNullable1.nullable1 = new Class1().nonNullable1Method(); n1?.nullable1 = new Class1().nullable1 = new Class1().nullable1; nullable1 = n1?.nullable1 = new Class1().nullable1 = new Class1().nullable1; n1?.nullable1 = new Class1().nullable1 = new Class1().nullable1 = new Class1(); nullable1 = n1?.nullable1 = new Class1().nullable1 = new Class1().nullable1 = new Class1(); n1?.nullable1 = new Class1().nullable1 = new Class1().nonNullable1Method(); nullable1 = n1?.nullable1 = new Class1().nullable1 = new Class1().nonNullable1Method(); n1?.nonNullable1Method().nullable1 = new Class1().nullable1; nullable1 = n1?.nonNullable1Method().nullable1 = new Class1().nullable1; n1?.nonNullable1Method().nullable1 = new Class1().nullable1 = new Class1(); nullable1 = n1?.nonNullable1Method().nullable1 = new Class1().nullable1 = new Class1(); n1?.nonNullable1Method().nullable1 = new Class1().nonNullable1Method(); nullable1 = n1?.nonNullable1Method().nullable1 = new Class1().nonNullable1Method(); n1?.nonNullable1.nonNullable1Method().nullable1; n1?.nonNullable1.nonNullable1Method().nullable1 = new Class1(); nullable1 = n1?.nonNullable1.nonNullable1Method().nullable1 = new Class1(); n1?.nonNullable1.nonNullable1Method().nonNullable1Method(); n1?.nullable1 = new Class1().nonNullable1Method().nullable1; nullable1 = n1?.nullable1 = new Class1().nonNullable1Method().nullable1; n1?.nullable1 = new Class1().nonNullable1Method().nullable1 = new Class1(); nullable1 = n1?.nullable1 = new Class1().nonNullable1Method().nullable1 = new Class1(); n1?.nullable1 = new Class1().nonNullable1Method().nonNullable1Method(); nullable1 = n1?.nullable1 = new Class1().nonNullable1Method().nonNullable1Method(); n1?.nonNullable1Method().nonNullable1Method().nullable1; n1?.nonNullable1Method().nonNullable1Method().nullable1 = new Class1(); n1?.nonNullable1Method().nonNullable1Method().nonNullable1Method(); n1?.nonNullable1Method()?.nonNullable1Method(); } void indexAccess(Class1? n1, Class2? n2, Class3? n3) { Class1? nullable1 = n1; Class2? nullable2 = n2; Class3? nullable3 = n3; n1?[nullable1]; n1?[nullable1] = new Class1(); n1?[nullable1]?.nonNullable1Method(); n1?.nonNullable1[nullable1]; n1?.nonNullable1[nullable1] = new Class1(); nullable1 = n1?.nonNullable1[nullable1] = new Class1(); n1?.nonNullable1[nullable1]?.nonNullable1Method(); n1?.nonNullable2[nullable2] += 0; nullable2 = n1?.nonNullable2[nullable2] += 0; n1?[nullable1] ??= nullable1; nullable1 = n1?[nullable1] ??= nullable1; n2?[nullable2] += 0; nullable2 = n2?[nullable2] += 0; n2?[nullable2] += 0; nullable2 = n2?[nullable2] += 0; n2?[nullable2]++; nullable2 = n2?[nullable2]++; ++n2?[nullable2]; nullable2 = ++n2?[nullable2]; n1?.nonNullable2[nullable2]++; nullable2 = n1?.nonNullable2[nullable2]++; ++n1?.nonNullable2[nullable2]; nullable2 = ++n1?.nonNullable2[nullable2]; n1?.nonNullable2[nullable2][nullable2]; n1?.nonNullable2[nullable2][nullable2] = new Class2(); nullable2 = n1?.nonNullable2[nullable2][nullable2] = new Class2(); n1?.nonNullable2[nullable2][nullable2]?.nonNullable2Method(); n1?.nonNullable2[nullable2][nullable2] += 0; nullable2 = n1?.nonNullable2[nullable2][nullable2] += 0; n1?.nonNullable2[nullable2][nullable2]++; nullable2 = n1?.nonNullable2[nullable2][nullable2]++; ++n1?.nonNullable2[nullable2][nullable2]; nullable2 = ++n1?.nonNullable2[nullable2][nullable2]; n1?[nullable1]?[nullable1]; n1?[nullable1]?[nullable1] = new Class1(); nullable1 = n1?[nullable1]?[nullable1] = new Class1(); n1?[nullable1]?[nullable1]?.nonNullable1Method(); nullable1 = n1?[nullable1]?[nullable1]?.nonNullable1Method(); n1?[nullable1]?[nullable1] ??= nullable1; nullable1 = n1?[nullable1]?[nullable1] ??= nullable1; n3?[nullable3]?[nullable2] += 0; nullable2 = n3?[nullable3]?[nullable2] += 0; n3?[nullable3]?[nullable2]++; nullable2 = n3?[nullable3]?[nullable2]++; ++n3?[nullable3]?[nullable2]; nullable2 = ++n3?[nullable3]?[nullable2]; } void operatorAccess(Class1? n1, Class2? n2) { Class2? nullable2 = n2; throws(() => n1?.nonNullable1 + 0); throws(() => -n1?.nonNullable1); n2?.nonNullable2 += 0; nullable2 = n2?.nonNullable2 += 0; n2?.nonNullable2.nonNullable2 += 0; nullable2 = n2?.nonNullable2.nonNullable2 += 0; n2?.nonNullable2++; nullable2 = n2?.nonNullable2++; ++n2?.nonNullable2; nullable2 = ++n2?.nonNullable2; } void ifNull(Class1? n1) { Class1? nullable1 = n1; n1?.nullable1 ??= n1; n1 = n1?.nullable1 ??= n1; n1?.nonNullable1.nullable1 ??= n1; n1 = n1?.nonNullable1.nullable1 ??= n1; n1?.nonNullable1[n1] ??= n1; n1 = n1?.nonNullable1[n1] ??= n1; } void throws(void Function() f) { try { f(); } catch (_) { return; } throw 'Expected exception.'; }