Skip to content

Commit

Permalink
#2979. Update existing and add new tests checking nnbd static errors (#…
Browse files Browse the repository at this point in the history
…2984)

Update existing and add new tests checking nnbd static errors
  • Loading branch information
sgrekhov authored Nov 20, 2024
1 parent 05ff0c3 commit ab5502e
Show file tree
Hide file tree
Showing 11 changed files with 230 additions and 30 deletions.
24 changes: 24 additions & 0 deletions LanguageFeatures/nnbd/static_errors_A07_t01.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// 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.

/// @assertion It is an error to derive a mixin from a class declaration which
/// contains an instance variable with a potentially non-nullable type and no
/// initializer expression unless the variable is marked with the `late`
/// modifier.
///
/// @description Check that it is an error for a mixin class to contain an
/// instance variable with a potentially non-nullable type and no initializer
/// expression.
/// @author [email protected]
mixin class C {
Object instance;
// ^^^^^^^^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
print(C);
}
21 changes: 21 additions & 0 deletions LanguageFeatures/nnbd/static_errors_A07_t02.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// 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.

/// @assertion It is an error to derive a mixin from a class declaration which
/// contains an instance variable with a potentially non-nullable type and no
/// initializer expression unless the variable is marked with the `late`
/// modifier.
///
/// @description Check that it is not an error for a mixin class to contain an
/// instance variable with a potentially non-nullable type and no initializer
/// expression but this variable is marked `late`.
/// @author [email protected]
mixin class C {
late Object instance;
}

main() {
print(C);
}
17 changes: 16 additions & 1 deletion LanguageFeatures/nnbd/static_errors_A19_t01.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
/// expression throw e is not assignable to Object
/// @author [email protected]

class A {
}

Expand Down Expand Up @@ -55,5 +54,21 @@ void test6<T extends Function?>(T x) {
// [cfe] unspecified
}

extension type ET(Object? _) {}

void test7(ET x) {
throw x;
// ^
// [analyzer] unspecified
// [cfe] unspecified
}

main() {
print(test1);
print(test2);
print(test3);
print(test4);
print(test5);
print(test6);
print(test7);
}
6 changes: 6 additions & 0 deletions LanguageFeatures/nnbd/static_errors_A19_t02.dart
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,10 @@ void test6<T extends FunctionAlias>(T x) {
}

main() {
print(test1);
print(test2);
print(test3);
print(test4);
print(test5);
print(test6);
}
31 changes: 31 additions & 0 deletions LanguageFeatures/nnbd/static_errors_A20_t04.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// 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.

/// @assertion It is not an error for the body of a `late` field to reference
/// `this`.
///
/// @description Check that it is not an error for the body of a `late` field to
/// reference `this`.
/// @author [email protected]
// Requirements=nnbd-strong

import "../../Utils/expect.dart";

class A {
int one = 1;
}

class C extends A {
int two = 2;
late Function p1 = () => this.one;
late final p2 = () {
return this.two;
};
}

main() {
Expect.equals(1, new C().p1());
Expect.equals(2, new C().p2());
}
3 changes: 0 additions & 3 deletions LanguageFeatures/nnbd/static_errors_A22_t01.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,6 @@
/// @author [email protected]
/// @issue 39661

import "dart:async";

class C {
static void sTest() async {
late int i = await 42;
Expand Down
43 changes: 21 additions & 22 deletions LanguageFeatures/nnbd/static_errors_A24_t01.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,34 @@
// 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.

/// @assertion It is not a compile time error to write to a final variable if
/// that variable is declared late and does not have an initializer.
/// @assertion It is not a compile time error to write to a `final` non-local or
/// instance variable if that variable is declared `late` and does not have an
/// initializer.
///
/// @description Check that it is not a compile time error to write to a final
/// variable if that variable is declared late and does not have an initializer.
/// @description Check that it is not a compile time error to write to a
/// non-local `final` variable if that variable is declared `late` and does not
/// have an initializer.
/// @author [email protected]
/// @issue 39684
// Requirements=nnbd-strong
import "../../Utils/expect.dart";

late final g;
import "../../Utils/expect.dart";

class C {
static late final s;
late final v;
}
late final g;

main() {
late final l;
class C {
static late final s;
late final v;
}

g = "Lily";
C.s = "was";
C c = new C();
c.v = "here";
l = "Run, Forrest, run";
main() {
g = "Lily";
C.s = "was";
C c = new C();
c.v = "here";

Expect.equals("Lily", g);
Expect.equals("was", C.s);
Expect.equals("here", c.v);
Expect.equals("Run, Forrest, run", l);
}
Expect.equals("Lily", g);
Expect.equals("was", C.s);
Expect.equals("here", c.v);
}
11 changes: 7 additions & 4 deletions LanguageFeatures/nnbd/static_errors_A24_t02.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@
// 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.

/// @assertion It is not a compile time error to write to a final variable if
/// that variable is declared late and does not have an initializer.
/// @assertion It is not a compile time error to write to a `final` non-local or
/// instance variable if that variable is declared `late` and does not have an
/// initializer.
///
/// @description Check that it is a runtime error to write to a final variable
/// when that variable is declared late but has been written to already
/// @description Check that it is a runtime error to write to a non-local
/// `final` variable when that variable is declared `late` but has been written
/// to already
/// @author [email protected]
/// @issue 39684
// Requirements=nnbd-strong

import "../../Utils/expect.dart";

late final g;
Expand Down
24 changes: 24 additions & 0 deletions LanguageFeatures/nnbd/static_errors_A34_t01.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// 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.

/// @assertion If the static type of `e` is `void`, the expression `await e` is
/// a compile-time error.
///
/// @description Check that it is a compile-time error if in a `await e`
/// expression the static type of `e` is `void`.
/// @author [email protected]
void foo() {}

main() async {
void e = 0;
await e;
// ^
// [analyzer] unspecified
// [cfe] unspecified
await foo();
// ^^^
// [analyzer] unspecified
// [cfe] unspecified
}
51 changes: 51 additions & 0 deletions LanguageFeatures/nnbd/static_errors_A35_t01.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// 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.

/// @assertion Let `C` be a type literal denoting a class, mixin, or extension.
/// It is a warning to use a null aware member access with receiver `C`.
///
/// @description Check that it is a warning to use a null aware member access
/// with a type literal.
/// @author [email protected]
class C {
static void test() {}
}

mixin M {
static void test() {}
}

enum E {
e0;
static void test() {}
}

class A {}

extension Ext on A {
static void test() {}
}

extension type ET(int _) {
static void test() {}
}

main() {
C?.test();
// ^^
// [analyzer] unspecified
M?.test();
// ^^
// [analyzer] unspecified
E?.test();
// ^^
// [analyzer] unspecified
Ext?.test();
// ^^
// [analyzer] unspecified
ET?.test();
// ^^
// [analyzer] unspecified
}
29 changes: 29 additions & 0 deletions LanguageFeatures/nnbd/static_errors_A36_t01.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// 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.

/// @assertion It is no longer a warning to override a method which has a
/// default value for a parameter with a method with a different default value
/// for the corresponding parameter.
///
/// @description Check that it is not a warning to override a method which has a
/// default value for a parameter with a method with a different default value
/// for the corresponding parameter.
/// @author [email protected]
import '../../Utils/expect.dart';

class A {
int foo([int x = 1]) => x;
int bar({int x = 1}) => x;
}

class C extends A {
int foo([int x = 2]) => x;
int bar({int x = 2}) => x;
}

main() {
Expect.equals(2, C().foo());
Expect.equals(2, C().bar());
}

0 comments on commit ab5502e

Please sign in to comment.