Files
sdk/tests/language/vm/static_weak_reference_error_test.dart
T
Alexander Markov 143e4e9dc8 [vm/aot/tfa] Static weak references to method tearoffs
TEST=pkg/vm/testcases/transformations/type_flow/transformer/weak.dart
TEST=language/vm/static_weak_reference_test
TEST=language/vm/static_weak_reference_error_test

Bug: b/269223463
Change-Id: I23c8229c39217aa1c3f9fb576d8eefa5ceb1d8ad
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/283421
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Slava Egorov <vegorov@google.com>
2023-02-22 01:01:29 +00:00

125 lines
3.4 KiB
Dart

// 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.
// Test errors for incorrect usage of 'vm:weak-tearoff-reference' pragma.
@pragma('vm:weak-tearoff-reference')
Function? validWeakRef(Function? x) => x;
@pragma('vm:weak-tearoff-reference')
Function? weakRef1({Function? x}) => x;
// ^
// [cfe] Weak reference should take one required positional argument.
@pragma('vm:weak-tearoff-reference')
Function? weakRef2({required Function? x}) => x;
// ^
// [cfe] Weak reference should take one required positional argument.
@pragma('vm:weak-tearoff-reference')
Function? weakRef3([Function? x]) => x;
// ^
// [cfe] Weak reference should take one required positional argument.
@pragma('vm:weak-tearoff-reference')
Function? weakRef4(Function? x, int y) => x;
// ^
// [cfe] Weak reference should take one required positional argument.
@pragma('vm:weak-tearoff-reference')
Function? weakRef5(Function? x, {int? y}) => x;
// ^
// [cfe] Weak reference should take one required positional argument.
@pragma('vm:weak-tearoff-reference')
Function weakRef6(Function x) => x;
// ^
// [cfe] Return type of a weak reference should be nullable.
@pragma('vm:weak-tearoff-reference')
Function weakRef7(Function x) => x;
// ^
// [cfe] Return type of a weak reference should be nullable.
@pragma('vm:weak-tearoff-reference')
dynamic validWeakRef8(dynamic x) => x;
@pragma('vm:weak-tearoff-reference')
Function? weakRef9(void Function() x) => x;
// ^
// [cfe] Return and argument types of a weak reference should match.
@pragma('vm:weak-tearoff-reference')
Function? weakRef10(Function x) => x;
// ^
// [cfe] Return and argument types of a weak reference should match.
class A {
@pragma('vm:weak-tearoff-reference')
external static T Function()? validWeakReference11<T>(T Function()? x);
@pragma('vm:weak-tearoff-reference')
external T Function()? weakReference12<T>(T Function()? x);
// ^
// [cfe] Weak reference pragma can be used on a static method only.
}
class B {
static int validTarget() => 42;
B();
B.bar();
factory B.baz() => B();
int instanceMethod() => 42;
static int arg1(int x) => 42;
static int arg2([int? x]) => 42;
static int arg3({int? x}) => 42;
static int arg4<T>() => 42;
}
void main() {
validWeakRef(B.validTarget); // OK
validWeakRef(B.new);
//^
// [cfe] The target of weak reference should be a tearoff of a static method.
validWeakRef(B.bar);
//^
// [cfe] The target of weak reference should be a tearoff of a static method.
validWeakRef(B.baz);
//^
// [cfe] The target of weak reference should be a tearoff of a static method.
validWeakRef(B().instanceMethod);
//^
// [cfe] The target of weak reference should be a tearoff of a static method.
final x = B.validTarget;
validWeakRef(x);
//^
// [cfe] The target of weak reference should be a tearoff of a static method.
const y = B.validTarget;
validWeakRef(y); // OK
validWeakRef(B.arg1);
//^
// [cfe] The target of weak reference should not take parameters.
validWeakRef(B.arg2);
//^
// [cfe] The target of weak reference should not take parameters.
validWeakRef(B.arg3);
//^
// [cfe] The target of weak reference should not take parameters.
validWeakRef(B.arg4);
//^
// [cfe] The target of weak reference should not take parameters.
}