Skip to content

Commit bc5952d

Browse files
dcharkescommit-bot@chromium.org
authored andcommitted
[analyzer/ffi] Stop non-const warnings on ..ref
Closes: #44782 TEST=pkg/analyzer/test/src/diagnostics/non_constant_type_argument_test.dart Change-Id: I434b9e68fb07e37cad03b1418897ea2295f81fc7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/181204 Commit-Queue: Daco Harkes <[email protected]> Auto-Submit: Daco Harkes <[email protected]> Reviewed-by: Samuel Rawlins <[email protected]> Reviewed-by: Siva Annamalai <[email protected]>
1 parent 83a72e1 commit bc5952d

File tree

6 files changed

+83
-3
lines changed

6 files changed

+83
-3
lines changed

pkg/analyzer/lib/src/generated/ffi_verifier.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -775,7 +775,7 @@ class FfiVerifier extends RecursiveAstVisitor<void> {
775775
}
776776

777777
void _validateRefIndexed(IndexExpression node) {
778-
DartType targetType = node.target?.staticType;
778+
DartType targetType = node.realTarget?.staticType;
779779
if (!_isValidFfiNativeType(targetType, false, true)) {
780780
final AstNode errorNode = node;
781781
_errorReporter.reportErrorForNode(
@@ -795,7 +795,7 @@ class FfiVerifier extends RecursiveAstVisitor<void> {
795795
}
796796

797797
void _validateRefPropertyAccess(PropertyAccess node) {
798-
DartType targetType = node.target?.staticType;
798+
DartType targetType = node.realTarget?.staticType;
799799
if (!_isValidFfiNativeType(targetType, false, true)) {
800800
final AstNode errorNode = node;
801801
_errorReporter.reportErrorForNode(

pkg/analyzer/lib/src/test_utilities/mock_sdk.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,8 @@ class Double extends NativeType {
661661
}
662662
663663
class Pointer<T extends NativeType> extends NativeType {
664+
external factory Pointer.fromAddress(int ptr);
665+
664666
static Pointer<NativeFunction<T>> fromFunction<T extends Function>(
665667
@DartRepresentationOf("T") Function f,
666668
[Object exceptionalReturn]) {}
@@ -685,6 +687,12 @@ abstract class NativeFunction<T extends Function> extends NativeType {}
685687
class DartRepresentationOf {
686688
const DartRepresentationOf(String nativeType);
687689
}
690+
691+
extension StructPointer<T extends Struct> on Pointer<T> {
692+
external T get ref;
693+
694+
external T operator [](int index);
695+
}
688696
''',
689697
)
690698
]);

pkg/analyzer/test/src/diagnostics/non_constant_type_argument_test.dart

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,52 @@ import '../dart/resolution/context_collection_resolution.dart';
99

1010
main() {
1111
defineReflectiveSuite(() {
12+
defineReflectiveTests(NonConstantTypeArgumentNoWarningTest);
13+
defineReflectiveTests(NonConstantTypeArgumentNoWarningTest2);
1214
defineReflectiveTests(NonConstantTypeArgumentTest);
15+
defineReflectiveTests(NonConstantTypeArgumentWarningTest);
1316
});
1417
}
1518

19+
@reflectiveTest
20+
class NonConstantTypeArgumentNoWarningTest extends PubPackageResolutionTest {
21+
test_asFunction_R() async {
22+
await assertNoErrorsInCode(r'''
23+
import 'dart:ffi';
24+
25+
class MyStruct extends Struct {
26+
@Uint8()
27+
int myField;
28+
}
29+
30+
void main(){
31+
final pointer = Pointer<MyStruct>.fromAddress(0);
32+
pointer.ref.myField = 1;
33+
}
34+
''');
35+
}
36+
}
37+
38+
@reflectiveTest
39+
class NonConstantTypeArgumentNoWarningTest2 extends PubPackageResolutionTest {
40+
test_asFunction_R() async {
41+
await assertNoErrorsInCode(r'''
42+
import 'dart:ffi';
43+
44+
class MyStruct extends Struct {
45+
@Uint8()
46+
int myField;
47+
}
48+
49+
void main(){
50+
final pointer = Pointer<MyStruct>.fromAddress(0)
51+
..ref.myField = 1;
52+
print(pointer);
53+
}
54+
''');
55+
}
56+
}
57+
1658
@reflectiveTest
1759
class NonConstantTypeArgumentTest extends PubPackageResolutionTest {
1860
test_asFunction_R() async {
@@ -29,3 +71,15 @@ class C<R extends int Function(int)> {
2971
]);
3072
}
3173
}
74+
75+
@reflectiveTest
76+
class NonConstantTypeArgumentWarningTest extends PubPackageResolutionTest {
77+
test_asFunction_R() async {
78+
await assertErrorsInCode(r'''
79+
import 'dart:ffi';
80+
81+
T genericRef<T extends Struct>(Pointer<T> p) =>
82+
p.ref;
83+
''', [error(FfiCode.NON_CONSTANT_TYPE_ARGUMENT_WARNING, 72, 5)]);
84+
}
85+
}

pkg/analyzer/test/src/diagnostics/subtype_of_ffi_class_test.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ class C extends Int8 {}
7575
test_Pointer() async {
7676
await assertErrorsInCode(r'''
7777
import 'dart:ffi';
78-
class C extends Pointer {}
78+
class C extends Pointer {
79+
external factory C();
80+
}
7981
''', [
8082
error(FfiCode.SUBTYPE_OF_FFI_CLASS_IN_EXTENDS, 35, 7),
8183
]);

tests/ffi/structs_test.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ void main() {
2424
testBareStruct();
2525
testTypeTest();
2626
testUtf8();
27+
testDotDotRef();
2728
}
2829
}
2930

@@ -135,3 +136,10 @@ void testUtf8() {
135136
Expect.equals(test, Utf8.fromUtf8(medium));
136137
calloc.free(medium);
137138
}
139+
140+
void testDotDotRef() {
141+
final pointer = calloc<Coordinate>()
142+
..ref.x = 1
143+
..ref.y = 1;
144+
calloc.free(pointer);
145+
}

tests/ffi_2/structs_test.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ void main() {
2424
testBareStruct();
2525
testTypeTest();
2626
testUtf8();
27+
testDotDotRef();
2728
}
2829
}
2930

@@ -135,3 +136,10 @@ void testUtf8() {
135136
Expect.equals(test, Utf8.fromUtf8(medium));
136137
calloc.free(medium);
137138
}
139+
140+
void testDotDotRef() {
141+
final pointer = calloc<Coordinate>()
142+
..ref.x = 1
143+
..ref.y = 1;
144+
calloc.free(pointer);
145+
}

0 commit comments

Comments
 (0)