mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 03:07:49 +00:00
[cfe] Avoid looking up unneeded operator == for EqualsNull node
Closes #47223 Change-Id: I8ad80c38ed1454a0c6e8088e98cd6db5d7d19930 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/213540 Reviewed-by: Chloe Stefantsova <dmitryas@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
parent
70730ad62f
commit
4aa6373724
|
@ -1381,11 +1381,6 @@ class InferenceVisitor
|
|||
reportNonNullableInNullAwareWarningIfNeeded(
|
||||
lhsResult.inferredType, "??", node.left.fileOffset);
|
||||
|
||||
Member equalsMember = inferrer
|
||||
.findInterfaceMember(
|
||||
lhsResult.inferredType, equalsName, node.fileOffset)
|
||||
.member!;
|
||||
|
||||
// This ends any shorting in `node.left`.
|
||||
Expression left = lhsResult.expression;
|
||||
|
||||
|
@ -1420,9 +1415,7 @@ class InferenceVisitor
|
|||
VariableDeclaration variable =
|
||||
createVariable(left, lhsResult.inferredType);
|
||||
Expression equalsNull = inferrer.createEqualsNull(
|
||||
lhsResult.expression.fileOffset,
|
||||
createVariableGet(variable),
|
||||
equalsMember);
|
||||
lhsResult.expression.fileOffset, createVariableGet(variable));
|
||||
VariableGet variableGet = createVariableGet(variable);
|
||||
if (inferrer.library.isNonNullableByDefault &&
|
||||
!identical(nonNullableLhsType, originalLhsType)) {
|
||||
|
@ -3130,10 +3123,6 @@ class InferenceVisitor
|
|||
receiverType, node.propertyName, writeTarget, rhs,
|
||||
forEffect: node.forEffect, valueType: writeType);
|
||||
|
||||
Member equalsMember = inferrer
|
||||
.findInterfaceMember(readType, equalsName, node.fileOffset)
|
||||
.member!;
|
||||
|
||||
DartType nonNullableReadType = readType.toNonNull();
|
||||
DartType inferredType = inferrer.typeSchemaEnvironment
|
||||
.getStandardUpperBound(
|
||||
|
@ -3145,8 +3134,7 @@ class InferenceVisitor
|
|||
//
|
||||
// let v1 = o in v1.a == null ? v1.a = b : null
|
||||
//
|
||||
Expression equalsNull =
|
||||
inferrer.createEqualsNull(node.fileOffset, read, equalsMember);
|
||||
Expression equalsNull = inferrer.createEqualsNull(node.fileOffset, read);
|
||||
ConditionalExpression conditional = new ConditionalExpression(equalsNull,
|
||||
write, new NullLiteral()..fileOffset = node.fileOffset, inferredType)
|
||||
..fileOffset = node.fileOffset;
|
||||
|
@ -3160,7 +3148,7 @@ class InferenceVisitor
|
|||
//
|
||||
VariableDeclaration readVariable = createVariable(read, readType);
|
||||
Expression equalsNull = inferrer.createEqualsNull(
|
||||
node.fileOffset, createVariableGet(readVariable), equalsMember);
|
||||
node.fileOffset, createVariableGet(readVariable));
|
||||
VariableGet variableGet = createVariableGet(readVariable);
|
||||
if (inferrer.library.isNonNullableByDefault &&
|
||||
!identical(nonNullableReadType, readType)) {
|
||||
|
@ -3194,10 +3182,6 @@ class InferenceVisitor
|
|||
.inferExpression(node.write, typeContext, true, isVoidAllowed: true);
|
||||
inferrer.flowAnalysis.ifNullExpression_end();
|
||||
|
||||
Member equalsMember = inferrer
|
||||
.findInterfaceMember(readType, equalsName, node.fileOffset)
|
||||
.member!;
|
||||
|
||||
DartType originalReadType = readType;
|
||||
DartType nonNullableReadType = originalReadType.toNonNull();
|
||||
DartType inferredType = inferrer.typeSchemaEnvironment
|
||||
|
@ -3210,8 +3194,7 @@ class InferenceVisitor
|
|||
//
|
||||
// a == null ? a = b : null
|
||||
//
|
||||
Expression equalsNull =
|
||||
inferrer.createEqualsNull(node.fileOffset, read, equalsMember);
|
||||
Expression equalsNull = inferrer.createEqualsNull(node.fileOffset, read);
|
||||
replacement = new ConditionalExpression(
|
||||
equalsNull,
|
||||
writeResult.expression,
|
||||
|
@ -3225,7 +3208,7 @@ class InferenceVisitor
|
|||
//
|
||||
VariableDeclaration readVariable = createVariable(read, readType);
|
||||
Expression equalsNull = inferrer.createEqualsNull(
|
||||
node.fileOffset, createVariableGet(readVariable), equalsMember);
|
||||
node.fileOffset, createVariableGet(readVariable));
|
||||
VariableGet variableGet = createVariableGet(readVariable);
|
||||
if (inferrer.library.isNonNullableByDefault &&
|
||||
!identical(nonNullableReadType, originalReadType)) {
|
||||
|
@ -3568,10 +3551,6 @@ class InferenceVisitor
|
|||
DartType readType = readResult.inferredType;
|
||||
inferrer.flowAnalysis.ifNullExpression_rightBegin(read, readType);
|
||||
|
||||
Member equalsMember = inferrer
|
||||
.findInterfaceMember(readType, equalsName, node.testOffset)
|
||||
.member!;
|
||||
|
||||
writeIndex = inferrer.ensureAssignable(
|
||||
writeIndexType, indexResult.inferredType, writeIndex,
|
||||
whyNotPromoted: whyNotPromotedIndex);
|
||||
|
@ -3623,8 +3602,7 @@ class InferenceVisitor
|
|||
// let indexVariable = a in
|
||||
// o[indexVariable] == null ? o.[]=(indexVariable, b) : null
|
||||
//
|
||||
Expression equalsNull =
|
||||
inferrer.createEqualsNull(node.testOffset, read, equalsMember);
|
||||
Expression equalsNull = inferrer.createEqualsNull(node.testOffset, read);
|
||||
ConditionalExpression conditional = new ConditionalExpression(equalsNull,
|
||||
write, new NullLiteral()..fileOffset = node.testOffset, inferredType)
|
||||
..fileOffset = node.testOffset;
|
||||
|
@ -3656,7 +3634,7 @@ class InferenceVisitor
|
|||
//
|
||||
VariableDeclaration readVariable = createVariable(read, readType);
|
||||
Expression equalsNull = inferrer.createEqualsNull(
|
||||
node.testOffset, createVariableGet(readVariable), equalsMember);
|
||||
node.testOffset, createVariableGet(readVariable));
|
||||
VariableDeclaration writeVariable =
|
||||
createVariable(write, const VoidType());
|
||||
VariableGet variableGet = createVariableGet(readVariable);
|
||||
|
@ -3701,10 +3679,6 @@ class InferenceVisitor
|
|||
DartType readIndexType =
|
||||
inferrer.getIndexKeyType(readTarget, inferrer.thisType!);
|
||||
|
||||
Member equalsMember = inferrer
|
||||
.findInterfaceMember(readType, equalsName, node.testOffset)
|
||||
.member!;
|
||||
|
||||
ObjectAccessTarget writeTarget = node.setter != null
|
||||
? new ObjectAccessTarget.interfaceMember(node.setter!,
|
||||
isPotentiallyNullable: false)
|
||||
|
@ -3807,8 +3781,7 @@ class InferenceVisitor
|
|||
// super[v1] == null ? super.[]=(v1, b) : null
|
||||
//
|
||||
assert(valueVariable == null);
|
||||
Expression equalsNull =
|
||||
inferrer.createEqualsNull(node.testOffset, read, equalsMember);
|
||||
Expression equalsNull = inferrer.createEqualsNull(node.testOffset, read);
|
||||
replacement = new ConditionalExpression(equalsNull, write,
|
||||
new NullLiteral()..fileOffset = node.testOffset, inferredType)
|
||||
..fileOffset = node.testOffset;
|
||||
|
@ -3826,7 +3799,7 @@ class InferenceVisitor
|
|||
|
||||
VariableDeclaration readVariable = createVariable(read, readType);
|
||||
Expression equalsNull = inferrer.createEqualsNull(
|
||||
node.testOffset, createVariableGet(readVariable), equalsMember);
|
||||
node.testOffset, createVariableGet(readVariable));
|
||||
VariableDeclaration writeVariable =
|
||||
createVariable(write, const VoidType());
|
||||
VariableGet readVariableGet = createVariableGet(readVariable);
|
||||
|
@ -3925,10 +3898,6 @@ class InferenceVisitor
|
|||
DartType readType = readResult.inferredType;
|
||||
inferrer.flowAnalysis.ifNullExpression_rightBegin(read, readType);
|
||||
|
||||
Member equalsMember = inferrer
|
||||
.findInterfaceMember(readType, equalsName, node.testOffset)
|
||||
.member!;
|
||||
|
||||
writeIndex = inferrer.ensureAssignable(
|
||||
writeIndexType, indexResult.inferredType, writeIndex);
|
||||
|
||||
|
@ -3974,8 +3943,7 @@ class InferenceVisitor
|
|||
// ? receiverVariable.[]=(indexVariable, b) : null
|
||||
//
|
||||
assert(valueVariable == null);
|
||||
Expression equalsNull =
|
||||
inferrer.createEqualsNull(node.testOffset, read, equalsMember);
|
||||
Expression equalsNull = inferrer.createEqualsNull(node.testOffset, read);
|
||||
replacement = new ConditionalExpression(equalsNull, write,
|
||||
new NullLiteral()..fileOffset = node.testOffset, inferredType)
|
||||
..fileOffset = node.testOffset;
|
||||
|
@ -3994,7 +3962,7 @@ class InferenceVisitor
|
|||
//
|
||||
VariableDeclaration readVariable = createVariable(read, readType);
|
||||
Expression equalsNull = inferrer.createEqualsNull(
|
||||
node.testOffset, createVariableGet(readVariable), equalsMember);
|
||||
node.testOffset, createVariableGet(readVariable));
|
||||
VariableDeclaration writeVariable =
|
||||
createVariable(write, const VoidType());
|
||||
VariableGet readVariableGet = createVariableGet(readVariable);
|
||||
|
@ -5697,10 +5665,6 @@ class InferenceVisitor
|
|||
DartType readType = readResult.inferredType;
|
||||
inferrer.flowAnalysis.ifNullExpression_rightBegin(read, readType);
|
||||
|
||||
Member readEqualsMember = inferrer
|
||||
.findInterfaceMember(readType, equalsName, node.testOffset)
|
||||
.member!;
|
||||
|
||||
VariableDeclaration? readVariable;
|
||||
if (!node.forEffect) {
|
||||
readVariable = createVariable(read, readType);
|
||||
|
@ -5741,7 +5705,7 @@ class InferenceVisitor
|
|||
//
|
||||
|
||||
Expression readEqualsNull =
|
||||
inferrer.createEqualsNull(node.readOffset, read, readEqualsMember);
|
||||
inferrer.createEqualsNull(node.readOffset, read);
|
||||
replacement = new ConditionalExpression(readEqualsNull, write,
|
||||
new NullLiteral()..fileOffset = node.writeOffset, inferredType)
|
||||
..fileOffset = node.writeOffset;
|
||||
|
@ -5756,8 +5720,8 @@ class InferenceVisitor
|
|||
//
|
||||
assert(readVariable != null);
|
||||
|
||||
Expression readEqualsNull = inferrer.createEqualsNull(
|
||||
receiverVariable.fileOffset, read, readEqualsMember);
|
||||
Expression readEqualsNull =
|
||||
inferrer.createEqualsNull(receiverVariable.fileOffset, read);
|
||||
VariableGet variableGet = createVariableGet(readVariable!);
|
||||
if (inferrer.library.isNonNullableByDefault &&
|
||||
!identical(nonNullableReadType, readType)) {
|
||||
|
|
|
@ -1872,15 +1872,7 @@ class TypeInferrerImpl implements TypeInferrer {
|
|||
}
|
||||
|
||||
NullAwareGuard createNullAwareGuard(VariableDeclaration variable) {
|
||||
Member? equalsMember =
|
||||
findInterfaceMember(variable.type, equalsName, variable.fileOffset)
|
||||
.member;
|
||||
// Ensure operator == member even for `Never`.
|
||||
equalsMember ??= findInterfaceMember(const DynamicType(), equalsName, -1,
|
||||
instrumented: false)
|
||||
.member!;
|
||||
return new NullAwareGuard(
|
||||
variable, variable.fileOffset, equalsMember, this);
|
||||
return new NullAwareGuard(variable, variable.fileOffset, this);
|
||||
}
|
||||
|
||||
ExpressionInferenceResult wrapExpressionInferenceResultInProblem(
|
||||
|
@ -4490,10 +4482,8 @@ class TypeInferrerImpl implements TypeInferrer {
|
|||
}
|
||||
|
||||
/// Creates a `e == null` test for the expression [left] using the
|
||||
/// [fileOffset] as file offset for the created nodes and [equalsMember] as
|
||||
/// the interface target of the created method invocation.
|
||||
Expression createEqualsNull(
|
||||
int fileOffset, Expression left, Member equalsMember) {
|
||||
/// [fileOffset] as file offset for the created nodes.
|
||||
Expression createEqualsNull(int fileOffset, Expression left) {
|
||||
return new EqualsNull(left)..fileOffset = fileOffset;
|
||||
}
|
||||
}
|
||||
|
@ -4827,20 +4817,15 @@ class NullAwareGuard {
|
|||
/// The file offset used for the null-test.
|
||||
int _nullAwareFileOffset;
|
||||
|
||||
/// The [Member] used for the == call.
|
||||
final Member _nullAwareEquals;
|
||||
|
||||
final TypeInferrerImpl _inferrer;
|
||||
|
||||
NullAwareGuard(this._nullAwareVariable, this._nullAwareFileOffset,
|
||||
this._nullAwareEquals, this._inferrer)
|
||||
NullAwareGuard(
|
||||
this._nullAwareVariable, this._nullAwareFileOffset, this._inferrer)
|
||||
// ignore: unnecessary_null_comparison
|
||||
: assert(_nullAwareVariable != null),
|
||||
// ignore: unnecessary_null_comparison
|
||||
assert(_nullAwareFileOffset != null),
|
||||
// ignore: unnecessary_null_comparison
|
||||
assert(_nullAwareEquals != null),
|
||||
// ignore: unnecessary_null_comparison
|
||||
assert(_inferrer != null) {
|
||||
// Ensure the initializer of [_nullAwareVariable] is promoted to
|
||||
// non-nullable.
|
||||
|
@ -4869,8 +4854,8 @@ class NullAwareGuard {
|
|||
_inferrer.flowAnalysis.nullAwareAccess_end();
|
||||
// End non-nullable promotion of the initializer of [_nullAwareVariable].
|
||||
_inferrer.flowAnalysis.nullAwareAccess_end();
|
||||
Expression equalsNull = _inferrer.createEqualsNull(_nullAwareFileOffset,
|
||||
createVariableGet(_nullAwareVariable), _nullAwareEquals);
|
||||
Expression equalsNull = _inferrer.createEqualsNull(
|
||||
_nullAwareFileOffset, createVariableGet(_nullAwareVariable));
|
||||
ConditionalExpression condition = new ConditionalExpression(
|
||||
equalsNull,
|
||||
new NullLiteral()..fileOffset = _nullAwareFileOffset,
|
||||
|
@ -4883,8 +4868,7 @@ class NullAwareGuard {
|
|||
|
||||
@override
|
||||
String toString() =>
|
||||
'NullAwareGuard($_nullAwareVariable,$_nullAwareFileOffset,'
|
||||
'$_nullAwareEquals)';
|
||||
'NullAwareGuard($_nullAwareVariable,$_nullAwareFileOffset)';
|
||||
}
|
||||
|
||||
/// The result of an expression inference that is guarded with a null aware
|
||||
|
|
9
pkg/front_end/testcases/general/issue47223a.dart
Normal file
9
pkg/front_end/testcases/general/issue47223a.dart
Normal file
|
@ -0,0 +1,9 @@
|
|||
// Copyright (c) 2021, 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.
|
||||
|
||||
void test() {
|
||||
(throw "some value") ?? "some other value";
|
||||
}
|
||||
|
||||
main() {}
|
|
@ -0,0 +1,2 @@
|
|||
void test() {}
|
||||
main() {}
|
|
@ -0,0 +1,2 @@
|
|||
main() {}
|
||||
void test() {}
|
15
pkg/front_end/testcases/general/issue47223a.dart.weak.expect
Normal file
15
pkg/front_end/testcases/general/issue47223a.dart.weak.expect
Normal file
|
@ -0,0 +1,15 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/general/issue47223a.dart:6:4: Warning: Operand of null-aware operation '??' has type 'Never' which excludes null.
|
||||
// (throw "some value") ?? "some other value";
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
static method test() → void {
|
||||
let final Never #t1 = throw "some value" in #t1 == null ?{core::String} "some other value" : #t1;
|
||||
}
|
||||
static method main() → dynamic {}
|
|
@ -0,0 +1,7 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
|
||||
static method test() → void
|
||||
;
|
||||
static method main() → dynamic
|
||||
;
|
|
@ -0,0 +1,15 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/general/issue47223a.dart:6:4: Warning: Operand of null-aware operation '??' has type 'Never' which excludes null.
|
||||
// (throw "some value") ?? "some other value";
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
static method test() → void {
|
||||
let final Never #t1 = throw "some value" in #t1 == null ?{core::String} "some other value" : #t1;
|
||||
}
|
||||
static method main() → dynamic {}
|
9
pkg/front_end/testcases/general/issue47223b.dart
Normal file
9
pkg/front_end/testcases/general/issue47223b.dart
Normal file
|
@ -0,0 +1,9 @@
|
|||
// Copyright (c) 2021, 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.
|
||||
|
||||
void test() {
|
||||
(throw "some value").foo ??= "foo";
|
||||
}
|
||||
|
||||
main() {}
|
|
@ -0,0 +1,2 @@
|
|||
void test() {}
|
||||
main() {}
|
|
@ -0,0 +1,2 @@
|
|||
main() {}
|
||||
void test() {}
|
15
pkg/front_end/testcases/general/issue47223b.dart.weak.expect
Normal file
15
pkg/front_end/testcases/general/issue47223b.dart.weak.expect
Normal file
|
@ -0,0 +1,15 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/general/issue47223b.dart:6:24: Warning: Operand of null-aware operation '??=' has type 'Never' which excludes null.
|
||||
// (throw "some value").foo ??= "foo";
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
static method test() → void {
|
||||
let final Never #t1 = throw "some value" in #t1{Never}.foo == null ?{core::String} #t1{Never}.foo = "foo" : null;
|
||||
}
|
||||
static method main() → dynamic {}
|
|
@ -0,0 +1,7 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
import self as self;
|
||||
|
||||
static method test() → void
|
||||
;
|
||||
static method main() → dynamic
|
||||
;
|
|
@ -0,0 +1,15 @@
|
|||
library /*isNonNullableByDefault*/;
|
||||
//
|
||||
// Problems in library:
|
||||
//
|
||||
// pkg/front_end/testcases/general/issue47223b.dart:6:24: Warning: Operand of null-aware operation '??=' has type 'Never' which excludes null.
|
||||
// (throw "some value").foo ??= "foo";
|
||||
// ^
|
||||
//
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
static method test() → void {
|
||||
let final Never #t1 = throw "some value" in #t1{Never}.foo == null ?{core::String} #t1{Never}.foo = "foo" : null;
|
||||
}
|
||||
static method main() → dynamic {}
|
|
@ -9,21 +9,21 @@ void foo<E>(C<E> c, int cmp(E a, E b)) {}
|
|||
|
||||
class C<E> {
|
||||
void barA([int cmp(E a, E b)]) {
|
||||
/*@ typeArgs=C::E* */ foo(this, cmp /*@target=Object.==*/ ?? _default);
|
||||
/*@ typeArgs=C::E* */ foo(this, cmp ?? _default);
|
||||
}
|
||||
|
||||
void barB([int cmp(E a, E b)]) {
|
||||
/*@ typeArgs=C::E* */ foo(
|
||||
this, cmp /*@target=Object.==*/ ?? (_default as int Function(E, E)));
|
||||
this, cmp ?? (_default as int Function(E, E)));
|
||||
}
|
||||
|
||||
void barC([int cmp(E a, E b)]) {
|
||||
int Function(E, E) v = _default;
|
||||
/*@ typeArgs=C::E* */ foo(this, cmp /*@target=Object.==*/ ?? v);
|
||||
/*@ typeArgs=C::E* */ foo(this, cmp ?? v);
|
||||
}
|
||||
|
||||
void barD([int cmp(E a, E b)]) {
|
||||
foo<E>(this, cmp /*@target=Object.==*/ ?? _default);
|
||||
foo<E>(this, cmp ?? _default);
|
||||
}
|
||||
|
||||
void barE([int cmp(E a, E b)]) {
|
||||
|
|
|
@ -12,7 +12,7 @@ void main() {
|
|||
var /*@ type=Iterable<List<String*>*>* */ i1 =
|
||||
l. /*@target=Iterable.map*/ /*@ typeArgs=List<String*>* */ map(
|
||||
/*@ returnType=List<String*>* */ (/*@ type=List<String*>* */ ll) =>
|
||||
ll /*@target=List.==*/ ?? /*@ typeArgs=String* */ []);
|
||||
ll ?? /*@ typeArgs=String* */ []);
|
||||
var /*@ type=Iterable<int*>* */ i2 =
|
||||
i1. /*@target=Iterable.map*/ /*@ typeArgs=int* */ map(
|
||||
/*@ returnType=int* */ (List<String> l) =>
|
||||
|
|
|
@ -18,20 +18,18 @@ void test() {
|
|||
MyFuture<int> f;
|
||||
Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture.then*/ then(
|
||||
/*@ returnType=Future<int*>* */ (/*@ type=int* */ x) async =>
|
||||
x /*@target=num.==*/ ?? await new Future<int>.value(3));
|
||||
x ?? await new Future<int>.value(3));
|
||||
Future<int> t2 = f. /*@ typeArgs=int* */ /*@target=MyFuture.then*/ then(
|
||||
/*@returnType=FutureOr<int*>**/ (/*@ type=int* */ x) async {
|
||||
return /*info:DOWN_CAST_COMPOSITE*/ await x /*@target=num.==*/ ??
|
||||
new Future<int>.value(3);
|
||||
return /*info:DOWN_CAST_COMPOSITE*/ await x ?? new Future<int>.value(3);
|
||||
});
|
||||
Future<int> t5 = f. /*@ typeArgs=int* */ /*@target=MyFuture.then*/ then(
|
||||
/*error:INVALID_CAST_FUNCTION_EXPR*/
|
||||
/*@ returnType=FutureOr<int*>* */ (/*@ type=int* */ x) =>
|
||||
x /*@target=num.==*/ ?? new Future<int>.value(3));
|
||||
x ?? new Future<int>.value(3));
|
||||
Future<int> t6 = f. /*@ typeArgs=int* */ /*@target=MyFuture.then*/ then(
|
||||
/*@ returnType=FutureOr<int*>* */ (/*@ type=int* */ x) {
|
||||
return /*info:DOWN_CAST_COMPOSITE*/ x /*@target=num.==*/ ??
|
||||
new Future<int>.value(3);
|
||||
return /*info:DOWN_CAST_COMPOSITE*/ x ?? new Future<int>.value(3);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -7,8 +7,7 @@ library test;
|
|||
|
||||
abstract class C<E> {
|
||||
void sort([int compare(E a, E b)]) {
|
||||
/*@ typeArgs=C::E* */ sort2(
|
||||
this, compare /*@target=Object.==*/ ?? _compareAny);
|
||||
/*@ typeArgs=C::E* */ sort2(this, compare ?? _compareAny);
|
||||
}
|
||||
|
||||
static int _compareAny(a, b) {
|
||||
|
|
|
@ -25,7 +25,7 @@ class Test {
|
|||
/*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
@ -46,7 +46,7 @@ class Test {
|
|||
/*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 = /*@target=Test.member*/ /*@target=Test.member*/
|
||||
member /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
member ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 = /*@target=Test.member*/ /*@target=Test.member*/
|
||||
member /*@target=B.+*/ +=
|
||||
|
|
|
@ -16,7 +16,7 @@ class Test1 {
|
|||
var /*@ type=int* */ v1 = /*@target=Test1.t*/ t = getInt();
|
||||
|
||||
var /*@ type=int* */ v4 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=int* */ v7 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -41,13 +41,13 @@ class Test2 {
|
|||
var /*@ type=double* */ v3 = /*@target=Test2.t*/ t = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -74,7 +74,7 @@ class Test3 {
|
|||
var /*@ type=double* */ v3 = /*@target=Test3.t*/ t = getDouble();
|
||||
|
||||
var /*@ type=double* */ v6 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
|
||||
/*@target=double.+*/ += getInt();
|
||||
|
|
|
@ -31,7 +31,7 @@ class Test {
|
|||
/*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f();
|
||||
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()]
|
||||
/*@target=A.==*/
|
||||
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()]
|
||||
|
@ -56,7 +56,7 @@ class Test {
|
|||
|
||||
var /*@ type=B* */ v2 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
/*@target=A.==*/
|
||||
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
|
|
|
@ -31,7 +31,7 @@ class Test extends Base {
|
|||
/*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f();
|
||||
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()] /*@target=A.==*/
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
|
||||
|
@ -56,7 +56,7 @@ class Test extends Base {
|
|||
/*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 = super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()] /*@target=A.==*/
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 = super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
|
||||
|
|
|
@ -29,7 +29,7 @@ class Test {
|
|||
/*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f();
|
||||
|
||||
this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()] /*@target=A.==*/
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
|
@ -54,7 +54,7 @@ class Test {
|
|||
/*@ typeArgs=Index* */ f()] = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 = this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()] /*@target=A.==*/
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v4 = this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
|
|
|
@ -22,7 +22,7 @@ void test() {
|
|||
B local;
|
||||
local = /*@ typeArgs=B* */ f();
|
||||
|
||||
local /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
local ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
local /*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
||||
|
@ -37,7 +37,7 @@ void test() {
|
|||
var /*@ type=B* */ v1 = local = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 =
|
||||
local /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
local ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 = local /*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ double getDouble() => 0.0;
|
|||
void test1(int t) {
|
||||
var /*@ type=int* */ v1 = t = getInt();
|
||||
|
||||
var /*@ type=int* */ v4 = t /*@target=num.==*/ ??= getInt();
|
||||
var /*@ type=int* */ v4 = t ??= getInt();
|
||||
|
||||
var /*@ type=int* */ v7 = t /*@target=num.+*/ += getInt();
|
||||
|
||||
|
@ -29,11 +29,11 @@ void test2(num t) {
|
|||
|
||||
var /*@ type=double* */ v3 = t = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 = t /*@target=num.==*/ ??= getInt();
|
||||
var /*@ type=num* */ v4 = t ??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=num.==*/ ??= getNum();
|
||||
var /*@ type=num* */ v5 = t ??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = t /*@target=num.==*/ ??= getDouble();
|
||||
var /*@ type=num* */ v6 = t ??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = t /*@target=num.+*/ += getInt();
|
||||
|
||||
|
@ -50,7 +50,7 @@ void test2(num t) {
|
|||
void test3(double t) {
|
||||
var /*@ type=double* */ v3 = t = getDouble();
|
||||
|
||||
var /*@ type=double* */ v6 = t /*@target=num.==*/ ??= getDouble();
|
||||
var /*@ type=double* */ v6 = t ??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = t /*@target=double.+*/ += getInt();
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ class Test {
|
|||
static void test(Test t) {
|
||||
t. /*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
|
||||
/*@ type=Test* */ /*@target=Test.member*/ t. /*@target=Test.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
/*@ type=Test* */ t. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
/*@ type=Test* */ t. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
|
@ -40,7 +40,7 @@ class Test {
|
|||
var /*@ type=B* */ v2 =
|
||||
/*@ type=Test* */ /*@target=Test.member*/ t
|
||||
. /*@target=Test.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
var /*@ type=A* */ v3 =
|
||||
/*@ type=Test* */ t
|
||||
. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
|
|
|
@ -22,62 +22,62 @@ class Test {
|
|||
B member;
|
||||
|
||||
static void test(Test t) {
|
||||
/*@ type=Test* */ /*@target=Test.==*/ t?. /*@target=Test.member*/
|
||||
/*@ type=Test* */ t?. /*@target=Test.member*/
|
||||
member = /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.**/ *= /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.&*/ &= /*@ typeArgs=A* */ f();
|
||||
|
||||
/*@target=B.-*/ -- /*@target=Test.==*/ t
|
||||
/*@target=B.-*/ -- t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member;
|
||||
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.-*/ --;
|
||||
|
||||
var /*@ type=B* */ v1 =
|
||||
/*@ type=Test* */ /*@target=Test.==*/ t?. /*@target=Test.member*/
|
||||
/*@ type=Test* */ t?. /*@target=Test.member*/
|
||||
member = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 =
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 =
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
||||
var /*@ type=B* */ v4 =
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.**/ *= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=C* */ v5 =
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.&*/ &= /*@ typeArgs=A* */ f();
|
||||
|
||||
var /*@ type=B* */ v6 =
|
||||
/*@target=B.-*/ -- /*@target=Test.==*/ t
|
||||
/*@target=B.-*/ -- t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member;
|
||||
|
||||
var /*@ type=B* */ v7 =
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.-*/ --;
|
||||
}
|
||||
|
|
|
@ -13,24 +13,24 @@ class Test1 {
|
|||
int prop;
|
||||
|
||||
static void test(Test1 t) {
|
||||
var /*@ type=int* */ v1 = /*@ type=Test1* */ /*@target=Test1.==*/ t
|
||||
var /*@ type=int* */ v1 = /*@ type=Test1* */ t
|
||||
?. /*@target=Test1.prop*/ prop = getInt();
|
||||
|
||||
var /*@ type=int* */ v4 =
|
||||
/*@target=Test1.==*/ t
|
||||
t
|
||||
?. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=int* */ v7 =
|
||||
/*@target=Test1.==*/ t
|
||||
t
|
||||
?. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
||||
var /*@ type=int* */ v10 = /*@target=num.+*/ ++ /*@target=Test1.==*/ t
|
||||
var /*@ type=int* */ v10 = /*@target=num.+*/ ++ t
|
||||
?. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop;
|
||||
|
||||
var /*@ type=int* */ v11 =
|
||||
/*@target=Test1.==*/ t
|
||||
t
|
||||
?. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
|
||||
/*@target=num.+*/ ++;
|
||||
}
|
||||
|
@ -40,49 +40,49 @@ class Test2 {
|
|||
num prop;
|
||||
|
||||
static void test(Test2 t) {
|
||||
var /*@ type=int* */ v1 = /*@ type=Test2* */ /*@target=Test2.==*/ t
|
||||
var /*@ type=int* */ v1 = /*@ type=Test2* */ t
|
||||
?. /*@target=Test2.prop*/ prop = getInt();
|
||||
|
||||
var /*@ type=num* */ v2 = /*@ type=Test2* */ /*@target=Test2.==*/ t
|
||||
var /*@ type=num* */ v2 = /*@ type=Test2* */ t
|
||||
?. /*@target=Test2.prop*/ prop = getNum();
|
||||
|
||||
var /*@ type=double* */ v3 = /*@ type=Test2* */ /*@target=Test2.==*/ t
|
||||
var /*@ type=double* */ v3 = /*@ type=Test2* */ t
|
||||
?. /*@target=Test2.prop*/ prop = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 =
|
||||
/*@target=Test2.==*/ t
|
||||
t
|
||||
?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 =
|
||||
/*@target=Test2.==*/ t
|
||||
t
|
||||
?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = /*@target=Test2.==*/ t
|
||||
var /*@ type=num* */ v6 = t
|
||||
?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 =
|
||||
/*@target=Test2.==*/ t
|
||||
t
|
||||
?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
||||
var /*@ type=num* */ v8 =
|
||||
/*@target=Test2.==*/ t
|
||||
t
|
||||
?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.+*/ += getNum();
|
||||
|
||||
var /*@ type=num* */ v9 =
|
||||
/*@target=Test2.==*/ t
|
||||
t
|
||||
?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.+*/ += getDouble();
|
||||
|
||||
var /*@ type=num* */ v10 = /*@target=num.+*/ ++ /*@target=Test2.==*/ t
|
||||
var /*@ type=num* */ v10 = /*@target=num.+*/ ++ t
|
||||
?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop;
|
||||
|
||||
var /*@ type=num* */ v11 =
|
||||
/*@target=Test2.==*/ t
|
||||
t
|
||||
?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.+*/ ++;
|
||||
}
|
||||
|
@ -93,35 +93,35 @@ class Test3 {
|
|||
|
||||
static void test3(Test3 t) {
|
||||
var /*@ type=double* */ v3 =
|
||||
/*@ type=Test3* */ /*@target=Test3.==*/ t
|
||||
/*@ type=Test3* */ t
|
||||
?. /*@target=Test3.prop*/ prop = getDouble();
|
||||
|
||||
var /*@ type=double* */ v6 =
|
||||
/*@target=Test3.==*/ t?.
|
||||
t?.
|
||||
/*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 =
|
||||
/*@target=Test3.==*/ t
|
||||
t
|
||||
?. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=double.+*/ += getInt();
|
||||
|
||||
var /*@ type=double* */ v8 =
|
||||
/*@target=Test3.==*/ t
|
||||
t
|
||||
?. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=double.+*/ += getNum();
|
||||
|
||||
var /*@ type=double* */ v9 =
|
||||
/*@target=Test3.==*/ t?.
|
||||
t?.
|
||||
/*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=double.+*/ += getDouble();
|
||||
|
||||
var /*@ type=double* */ v10 = /*@target=double.+*/ ++
|
||||
/*@target=Test3.==*/ t
|
||||
t
|
||||
?. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop;
|
||||
|
||||
var /*@ type=double* */ v11 =
|
||||
/*@target=Test3.==*/ t
|
||||
t
|
||||
?. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=double.+*/ ++;
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ class Test extends Base {
|
|||
super.member = /*@ typeArgs=B* */ f();
|
||||
|
||||
super. /*@target=Base.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
super. /*@target=Base.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
@ -46,7 +46,7 @@ class Test extends Base {
|
|||
var /*@ type=B* */ v1 = super.member = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 = super. /*@target=Base.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 = super. /*@target=Base.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
|
|
@ -20,7 +20,7 @@ class Test1 extends Base {
|
|||
var /*@ type=int* */ v1 = super.intProp = getInt();
|
||||
|
||||
var /*@ type=int* */ v4 = super. /*@target=Base.intProp*/ intProp
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=int* */ v7 = super. /*@target=Base.intProp*/ intProp
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -43,13 +43,13 @@ class Test2 extends Base {
|
|||
var /*@ type=double* */ v3 = super.numProp = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 = super. /*@target=Base.numProp*/ numProp
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = super. /*@target=Base.numProp*/ numProp
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = super. /*@target=Base.numProp*/ numProp
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = super. /*@target=Base.numProp*/ numProp
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -77,7 +77,7 @@ class Test3 extends Base {
|
|||
var /*@ type=double* */ v3 = super.doubleProp = getDouble();
|
||||
|
||||
var /*@ type=double* */ v6 = super. /*@target=Base.doubleProp*/ doubleProp
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = super. /*@target=Base.doubleProp*/ doubleProp
|
||||
/*@target=double.+*/ += getInt();
|
||||
|
|
|
@ -16,7 +16,7 @@ class Test1 {
|
|||
var /*@ type=int* */ v1 = t. /*@target=Test1.prop*/ prop = getInt();
|
||||
var /*@ type=int* */ v4 = /*@ type=Test1* */ /*@target=Test1.prop*/ t
|
||||
. /*@target=Test1.prop*/ prop
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
var /*@ type=int* */ v7 =
|
||||
/*@ type=Test1* */ t. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -37,13 +37,13 @@ class Test2 {
|
|||
var /*@ type=double* */ v3 = t. /*@target=Test2.prop*/ prop = getDouble();
|
||||
var /*@ type=num* */ v4 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
|
||||
. /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
var /*@ type=num* */ v5 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
|
||||
. /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
var /*@ type=num* */ v6 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
|
||||
. /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
var /*@ type=num* */ v7 =
|
||||
/*@ type=Test2* */ t. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -68,7 +68,7 @@ class Test3 {
|
|||
var /*@ type=double* */ v3 = t. /*@target=Test3.prop*/ prop = getDouble();
|
||||
var /*@ type=double* */ v6 =
|
||||
/*@ type=Test3* */ /*@target=Test3.prop*/ t. /*@target=Test3.prop*/
|
||||
prop /*@target=num.==*/ ??= getDouble();
|
||||
prop ??= getDouble();
|
||||
var /*@ type=double* */ v7 =
|
||||
/*@ type=Test3* */ t. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=double.+*/ += getInt();
|
||||
|
|
|
@ -25,7 +25,7 @@ B topLevelVariable;
|
|||
void test_topLevelVariable() {
|
||||
topLevelVariable = /*@ typeArgs=B* */ f();
|
||||
|
||||
topLevelVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
topLevelVariable ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
topLevelVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
||||
|
@ -40,7 +40,7 @@ void test_topLevelVariable() {
|
|||
var /*@ type=B* */ v1 = topLevelVariable = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 =
|
||||
topLevelVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
topLevelVariable ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 =
|
||||
topLevelVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
@ -60,7 +60,7 @@ void test_topLevelVariable() {
|
|||
void test_staticVariable() {
|
||||
B.staticVariable = /*@ typeArgs=B* */ f();
|
||||
|
||||
B.staticVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
B.staticVariable ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
B.staticVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
||||
|
@ -75,7 +75,7 @@ void test_staticVariable() {
|
|||
var /*@ type=B* */ v1 = B.staticVariable = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 =
|
||||
B.staticVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
B.staticVariable ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 =
|
||||
B.staticVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
|
|
@ -16,7 +16,7 @@ double topLevelDouble;
|
|||
void test1() {
|
||||
var /*@ type=int* */ v1 = topLevelInt = getInt();
|
||||
|
||||
var /*@ type=int* */ v4 = topLevelInt /*@target=num.==*/ ??= getInt();
|
||||
var /*@ type=int* */ v4 = topLevelInt ??= getInt();
|
||||
|
||||
var /*@ type=int* */ v7 = topLevelInt /*@target=num.+*/ += getInt();
|
||||
|
||||
|
@ -33,11 +33,11 @@ void test2() {
|
|||
|
||||
var /*@ type=double* */ v3 = topLevelNum = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 = topLevelNum /*@target=num.==*/ ??= getInt();
|
||||
var /*@ type=num* */ v4 = topLevelNum ??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = topLevelNum /*@target=num.==*/ ??= getNum();
|
||||
var /*@ type=num* */ v5 = topLevelNum ??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = topLevelNum /*@target=num.==*/ ??= getDouble();
|
||||
var /*@ type=num* */ v6 = topLevelNum ??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = topLevelNum /*@target=num.+*/ += getInt();
|
||||
|
||||
|
@ -55,7 +55,7 @@ void test3() {
|
|||
var /*@ type=double* */ v3 = topLevelDouble = getDouble();
|
||||
|
||||
var /*@ type=double* */ v6 =
|
||||
topLevelDouble /*@target=num.==*/ ??= getDouble();
|
||||
topLevelDouble ??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = topLevelDouble /*@target=double.+*/ += getInt();
|
||||
|
||||
|
|
|
@ -10,9 +10,8 @@ class C {
|
|||
}
|
||||
|
||||
g(C c) {
|
||||
var /*@ type=int* */ x = /*@ type=C* */ /*@target=C.==*/ c
|
||||
?. /*@target=C.f*/ f();
|
||||
/*@ type=C* */ /*@target=C.==*/ c?. /*@target=C.f*/ f();
|
||||
var /*@ type=int* */ x = /*@ type=C* */ c?. /*@target=C.f*/ f();
|
||||
/*@ type=C* */ c?. /*@target=C.f*/ f();
|
||||
}
|
||||
|
||||
main() {}
|
||||
|
|
|
@ -10,9 +10,8 @@ class C {
|
|||
}
|
||||
|
||||
void f(C c) {
|
||||
var /*@ type=int* */ x = /*@ type=C* */ /*@target=C.==*/ c
|
||||
?. /*@target=C.x*/ x;
|
||||
/*@ type=C* */ /*@target=C.==*/ c?. /*@target=C.x*/ x;
|
||||
var /*@ type=int* */ x = /*@ type=C* */ c?. /*@target=C.x*/ x;
|
||||
/*@ type=C* */ c?. /*@target=C.x*/ x;
|
||||
}
|
||||
|
||||
main() {}
|
||||
|
|
|
@ -7,7 +7,6 @@ library test;
|
|||
|
||||
main() {
|
||||
List<int> x;
|
||||
var /*@ type=List<int*>* */ y =
|
||||
x /*@target=List.==*/ ?? /*@ typeArgs=int* */ [];
|
||||
var /*@ type=List<int*>* */ y = x ?? /*@ typeArgs=int* */ [];
|
||||
List<int> z = y;
|
||||
}
|
||||
|
|
|
@ -7,5 +7,5 @@ library test;
|
|||
|
||||
main() {
|
||||
List<int> x;
|
||||
List<num> y = x /*@target=List.==*/ ?? /*@ typeArgs=num* */ [];
|
||||
List<num> y = x ?? /*@ typeArgs=num* */ [];
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ class Test {
|
|||
/*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
@ -47,7 +47,7 @@ class Test {
|
|||
|
||||
var /*@ type=B* */ v2 = /*@target=Test.member*/ /*@target=Test.member*/
|
||||
member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 =
|
||||
/*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
|
|
|
@ -18,10 +18,10 @@ class Test1 {
|
|||
var /*@ type=num* */ v2 = /*@target=Test1.t*/ t = getNum();
|
||||
|
||||
var /*@ type=int* */ v4 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=int* */ v7 = /*@target=Test1.t*/ /*@target=Test1.t*/ t
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -49,13 +49,13 @@ class Test2 {
|
|||
var /*@ type=double* */ v3 = /*@target=Test2.t*/ t = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = /*@target=Test2.t*/ /*@target=Test2.t*/ t
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -84,10 +84,10 @@ class Test3 {
|
|||
var /*@ type=double* */ v3 = /*@target=Test3.t*/ t = getDouble();
|
||||
|
||||
var /*@ type=num* */ v5 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = /*@target=Test3.t*/ /*@target=Test3.t*/ t
|
||||
/*@target=double.+*/ += getInt();
|
||||
|
|
|
@ -32,7 +32,7 @@ class Test {
|
|||
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()]
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
@ -57,7 +57,7 @@ class Test {
|
|||
|
||||
var /*@ type=B* */ v2 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
|
|
|
@ -38,7 +38,7 @@ class Test {
|
|||
/*@ typeArgs=Index* */ f()] = /*@ typeArgs=A* */ f();
|
||||
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()]
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=A* */ f();
|
||||
??= /*@ typeArgs=A* */ f();
|
||||
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ [/*@ typeArgs=Index* */ f()]
|
||||
/*@target=B.+*/ += /*@ typeArgs=E* */ f();
|
||||
|
@ -54,7 +54,7 @@ class Test {
|
|||
|
||||
var /*@ type=A* */ v2 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=A* */ f();
|
||||
??= /*@ typeArgs=A* */ f();
|
||||
|
||||
var /*@ type=D* */ v3 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
|
|
|
@ -32,7 +32,7 @@ class Test extends Base {
|
|||
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
|
@ -57,7 +57,7 @@ class Test extends Base {
|
|||
|
||||
var /*@ type=B* */ v2 = super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 = super /*@target=Base.[]*/ /*@target=Base.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
|
|
|
@ -25,11 +25,11 @@ abstract class Test1 extends Base<int, int> {
|
|||
|
||||
var /*@ type=int* */ v4 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=int* */ v7 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
|
@ -57,15 +57,15 @@ abstract class Test2 extends Base<int, num> {
|
|||
|
||||
var /*@ type=int* */ v4 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=int* */ v7 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
|
@ -95,11 +95,11 @@ abstract class Test3 extends Base<int, double> {
|
|||
|
||||
var /*@ type=num* */ v5 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=int* */ v7 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
|
@ -129,11 +129,11 @@ abstract class Test4 extends Base<num, int> {
|
|||
|
||||
var /*@ type=num* */ v4 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v7 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
|
@ -161,15 +161,15 @@ abstract class Test5 extends Base<num, num> {
|
|||
|
||||
var /*@ type=num* */ v4 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
|
@ -199,11 +199,11 @@ abstract class Test6 extends Base<num, double> {
|
|||
|
||||
var /*@ type=num* */ v5 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
|
@ -233,11 +233,11 @@ abstract class Test7 extends Base<double, int> {
|
|||
|
||||
var /*@ type=num* */ v4 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v7 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
|
@ -265,15 +265,15 @@ abstract class Test8 extends Base<double, num> {
|
|||
|
||||
var /*@ type=num* */ v4 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
|
@ -303,11 +303,11 @@ abstract class Test9 extends Base<double, double> {
|
|||
|
||||
var /*@ type=num* */ v5 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 =
|
||||
super /*@target=Base.[]*/ /*@target=Base.[]=*/ ['x']
|
||||
|
|
|
@ -30,7 +30,7 @@ class Test {
|
|||
|
||||
this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
|
@ -55,7 +55,7 @@ class Test {
|
|||
|
||||
var /*@ type=B* */ v2 = this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 = this /*@target=Test.[]*/ /*@target=Test.[]=*/ [
|
||||
/*@ typeArgs=Index* */ f()]
|
||||
|
|
|
@ -20,11 +20,11 @@ abstract class Test1 {
|
|||
|
||||
var /*@ type=int* */ v4 = this
|
||||
/*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = this
|
||||
/*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=int* */ v7 = this
|
||||
/*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x']
|
||||
|
@ -56,15 +56,15 @@ abstract class Test2 {
|
|||
|
||||
var /*@ type=int* */ v4 = this
|
||||
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = this
|
||||
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = this
|
||||
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=int* */ v7 = this
|
||||
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
|
||||
|
@ -98,11 +98,11 @@ abstract class Test3 {
|
|||
|
||||
var /*@ type=num* */ v5 = this
|
||||
/*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = this
|
||||
/*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=int* */ v7 = this
|
||||
/*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
|
||||
|
@ -136,11 +136,11 @@ abstract class Test4 {
|
|||
|
||||
var /*@ type=num* */ v4 = this
|
||||
/*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = this
|
||||
/*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v7 = this
|
||||
/*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x']
|
||||
|
@ -172,15 +172,15 @@ abstract class Test5 {
|
|||
|
||||
var /*@ type=num* */ v4 = this
|
||||
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = this
|
||||
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = this
|
||||
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = this
|
||||
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
|
||||
|
@ -214,11 +214,11 @@ abstract class Test6 {
|
|||
|
||||
var /*@ type=num* */ v5 = this
|
||||
/*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = this
|
||||
/*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = this
|
||||
/*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
|
||||
|
@ -253,11 +253,11 @@ abstract class Test7 {
|
|||
|
||||
var /*@ type=num* */ v4 = this
|
||||
/*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = this
|
||||
/*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v7 = this
|
||||
/*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x']
|
||||
|
@ -291,15 +291,15 @@ abstract class Test8 {
|
|||
|
||||
var /*@ type=num* */ v4 = this
|
||||
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = this
|
||||
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 = this
|
||||
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = this
|
||||
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
|
||||
|
@ -334,11 +334,11 @@ abstract class Test9 {
|
|||
|
||||
var /*@ type=num* */ v5 = this
|
||||
/*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 = this
|
||||
/*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = this
|
||||
/*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
|
||||
|
|
|
@ -20,10 +20,10 @@ void test1(Test<int, int> t) {
|
|||
var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();
|
||||
|
||||
var /*@ type=int* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=int* */ v7 =
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
|
||||
|
@ -48,13 +48,13 @@ void test2(Test<int, num> t) {
|
|||
var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
|
||||
|
||||
var /*@ type=int* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=int* */ v7 =
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
|
||||
|
@ -81,10 +81,10 @@ void test3(Test<int, double> t) {
|
|||
var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=int* */ v7 =
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
|
||||
|
@ -111,10 +111,10 @@ void test4(Test<num, int> t) {
|
|||
var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();
|
||||
|
||||
var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v7 =
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
|
||||
|
@ -139,13 +139,13 @@ void test5(Test<num, num> t) {
|
|||
var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 =
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
|
||||
|
@ -172,10 +172,10 @@ void test6(Test<num, double> t) {
|
|||
var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 =
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=num.+*/ +=
|
||||
|
@ -202,10 +202,10 @@ void test7(Test<double, int> t) {
|
|||
var /*@ type=num* */ v2 = t /*@target=Test.[]=*/ ['x'] = getNum();
|
||||
|
||||
var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v7 =
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
|
||||
|
@ -231,13 +231,13 @@ void test8(Test<double, num> t) {
|
|||
var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 =
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
|
||||
|
@ -265,10 +265,10 @@ void test9(Test<double, double> t) {
|
|||
var /*@ type=double* */ v3 = t /*@target=Test.[]=*/ ['x'] = getDouble();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 = t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x']
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 =
|
||||
t /*@target=Test.[]*/ /*@target=Test.[]=*/ ['x'] /*@target=double.+*/ +=
|
||||
|
|
|
@ -22,7 +22,7 @@ void test() {
|
|||
B local;
|
||||
local = /*@ typeArgs=B* */ f();
|
||||
|
||||
local /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
local ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
local /*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
||||
|
@ -37,7 +37,7 @@ void test() {
|
|||
var /*@ type=B* */ v1 = local = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 =
|
||||
local /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
local ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 = local
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
|
|
@ -14,9 +14,9 @@ void test1(int t) {
|
|||
|
||||
var /*@ type=num* */ v2 = t = getNum();
|
||||
|
||||
var /*@ type=int* */ v4 = t /*@target=num.==*/ ??= getInt();
|
||||
var /*@ type=int* */ v4 = t ??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=num.==*/ ??= getNum();
|
||||
var /*@ type=num* */ v5 = t ??= getNum();
|
||||
|
||||
var /*@ type=int* */ v7 = t /*@target=num.+*/ += getInt();
|
||||
|
||||
|
@ -35,11 +35,11 @@ void test2(num t) {
|
|||
|
||||
var /*@ type=double* */ v3 = t = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 = t /*@target=num.==*/ ??= getInt();
|
||||
var /*@ type=num* */ v4 = t ??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=num.==*/ ??= getNum();
|
||||
var /*@ type=num* */ v5 = t ??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = t /*@target=num.==*/ ??= getDouble();
|
||||
var /*@ type=num* */ v6 = t ??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = t /*@target=num.+*/ += getInt();
|
||||
|
||||
|
@ -58,9 +58,9 @@ void test3(double t) {
|
|||
|
||||
var /*@ type=double* */ v3 = t = getDouble();
|
||||
|
||||
var /*@ type=num* */ v5 = t /*@target=num.==*/ ??= getNum();
|
||||
var /*@ type=num* */ v5 = t ??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 = t /*@target=num.==*/ ??= getDouble();
|
||||
var /*@ type=double* */ v6 = t ??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = t /*@target=double.+*/ += getInt();
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ class Test {
|
|||
static void test(Test t) {
|
||||
t. /*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
|
||||
/*@ type=Test* */ /*@target=Test.member*/ t. /*@target=Test.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
/*@ type=Test* */ t. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
/*@ type=Test* */ t. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
|
@ -40,7 +40,7 @@ class Test {
|
|||
var /*@ type=B* */ v2 =
|
||||
/*@ type=Test* */ /*@target=Test.member*/ t
|
||||
. /*@target=Test.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
var /*@ type=A* */ v3 =
|
||||
/*@ type=Test* */ t
|
||||
. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
|
|
|
@ -22,60 +22,60 @@ class Test {
|
|||
B member;
|
||||
|
||||
static void test(Test t) {
|
||||
/*@ type=Test* */ /*@target=Test.==*/ t
|
||||
/*@ type=Test* */ t
|
||||
?. /*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Test.==*/ t?.
|
||||
t?.
|
||||
/*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Test.==*/ t?.
|
||||
t?.
|
||||
/*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
||||
/*@target=Test.==*/ t?.
|
||||
t?.
|
||||
/*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.**/ *= /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Test.==*/ t?.
|
||||
t?.
|
||||
/*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.&*/ &= /*@ typeArgs=A* */ f();
|
||||
|
||||
/*@target=B.-*/ -- /*@target=Test.==*/ t?.
|
||||
/*@target=B.-*/ -- t?.
|
||||
/*@target=Test.member*/ /*@target=Test.member*/ member;
|
||||
|
||||
/*@target=Test.==*/ t?.
|
||||
t?.
|
||||
/*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.-*/ --;
|
||||
|
||||
var /*@ type=B* */ v1 =
|
||||
/*@ type=Test* */ /*@target=Test.==*/ t
|
||||
/*@ type=Test* */ t
|
||||
?. /*@target=Test.member*/ member = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 =
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 =
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
||||
var /*@ type=B* */ v4 =
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.**/ *= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=C* */ v5 =
|
||||
/*@target=Test.==*/ t
|
||||
t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.&*/ &= /*@ typeArgs=A* */ f();
|
||||
|
||||
var /*@ type=B* */ v6 = /*@target=B.-*/ -- /*@target=Test.==*/ t
|
||||
var /*@ type=B* */ v6 = /*@target=B.-*/ -- t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member;
|
||||
|
||||
var /*@ type=B* */ v7 = /*@target=Test.==*/ t
|
||||
var /*@ type=B* */ v7 = t
|
||||
?. /*@target=Test.member*/ /*@target=Test.member*/ member
|
||||
/*@target=B.-*/ --;
|
||||
}
|
||||
|
|
|
@ -13,33 +13,33 @@ class Test1 {
|
|||
int prop;
|
||||
|
||||
static void test(Test1 t) {
|
||||
var /*@ type=int* */ v1 = /*@ type=Test1* */ /*@target=Test1.==*/ t
|
||||
var /*@ type=int* */ v1 = /*@ type=Test1* */ t
|
||||
?. /*@target=Test1.prop*/ prop = getInt();
|
||||
|
||||
var /*@ type=num* */ v2 = /*@ type=Test1* */ /*@target=Test1.==*/ t
|
||||
var /*@ type=num* */ v2 = /*@ type=Test1* */ t
|
||||
?. /*@target=Test1.prop*/ prop = getNum();
|
||||
|
||||
var /*@ type=int* */ v4 = /*@target=Test1.==*/ t?.
|
||||
var /*@ type=int* */ v4 = t?.
|
||||
/*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = /*@target=Test1.==*/ t?.
|
||||
var /*@ type=num* */ v5 = t?.
|
||||
/*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=int* */ v7 = /*@target=Test1.==*/ t?.
|
||||
var /*@ type=int* */ v7 = t?.
|
||||
/*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
||||
var /*@ type=num* */ v8 = /*@target=Test1.==*/ t?.
|
||||
var /*@ type=num* */ v8 = t?.
|
||||
/*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
|
||||
/*@target=num.+*/ += getNum();
|
||||
|
||||
var /*@ type=int* */ v10 = /*@target=num.+*/ ++
|
||||
/*@target=Test1.==*/ t?.
|
||||
t?.
|
||||
/*@target=Test1.prop*/ /*@target=Test1.prop*/ prop;
|
||||
|
||||
var /*@ type=int* */ v11 = /*@target=Test1.==*/ t?.
|
||||
var /*@ type=int* */ v11 = t?.
|
||||
/*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
|
||||
/*@target=num.+*/ ++;
|
||||
}
|
||||
|
@ -49,43 +49,43 @@ class Test2 {
|
|||
num prop;
|
||||
|
||||
static void test(Test2 t) {
|
||||
var /*@ type=int* */ v1 = /*@ type=Test2* */ /*@target=Test2.==*/ t
|
||||
var /*@ type=int* */ v1 = /*@ type=Test2* */ t
|
||||
?. /*@target=Test2.prop*/ prop = getInt();
|
||||
|
||||
var /*@ type=num* */ v2 = /*@ type=Test2* */ /*@target=Test2.==*/ t
|
||||
var /*@ type=num* */ v2 = /*@ type=Test2* */ t
|
||||
?. /*@target=Test2.prop*/ prop = getNum();
|
||||
|
||||
var /*@ type=double* */ v3 = /*@ type=Test2* */ /*@target=Test2.==*/ t
|
||||
var /*@ type=double* */ v3 = /*@ type=Test2* */ t
|
||||
?. /*@target=Test2.prop*/ prop = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 = /*@target=Test2.==*/ t?.
|
||||
var /*@ type=num* */ v4 = t?.
|
||||
/*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = /*@target=Test2.==*/ t?.
|
||||
var /*@ type=num* */ v5 = t?.
|
||||
/*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = /*@target=Test2.==*/ t?.
|
||||
var /*@ type=num* */ v6 = t?.
|
||||
/*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = /*@target=Test2.==*/ t?.
|
||||
var /*@ type=num* */ v7 = t?.
|
||||
/*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
||||
var /*@ type=num* */ v8 = /*@target=Test2.==*/ t?.
|
||||
var /*@ type=num* */ v8 = t?.
|
||||
/*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.+*/ += getNum();
|
||||
|
||||
var /*@ type=num* */ v9 = /*@target=Test2.==*/ t?.
|
||||
var /*@ type=num* */ v9 = t?.
|
||||
/*@target=Test2.prop*/ /*@target=Test2.prop*/
|
||||
prop /*@target=num.+*/ += getDouble();
|
||||
|
||||
var /*@ type=num* */ v10 = /*@target=num.+*/ ++ /*@target=Test2.==*/
|
||||
var /*@ type=num* */ v10 = /*@target=num.+*/ ++
|
||||
t?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop;
|
||||
|
||||
var /*@ type=num* */ v11 = /*@target=Test2.==*/
|
||||
var /*@ type=num* */ v11 =
|
||||
t?. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.+*/ ++;
|
||||
}
|
||||
|
@ -95,39 +95,39 @@ class Test3 {
|
|||
double prop;
|
||||
|
||||
static void test3(Test3 t) {
|
||||
var /*@ type=num* */ v2 = /*@ type=Test3* */ /*@target=Test3.==*/ t
|
||||
var /*@ type=num* */ v2 = /*@ type=Test3* */ t
|
||||
?. /*@target=Test3.prop*/ prop = getNum();
|
||||
|
||||
var /*@ type=double* */ v3 = /*@ type=Test3* */ /*@target=Test3.==*/ t
|
||||
var /*@ type=double* */ v3 = /*@ type=Test3* */ t
|
||||
?. /*@target=Test3.prop*/ prop = getDouble();
|
||||
|
||||
var /*@ type=num* */ v5 = /*@target=Test3.==*/ t?.
|
||||
var /*@ type=num* */ v5 = t?.
|
||||
/*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 =
|
||||
/*@target=Test3.==*/ t?.
|
||||
t?.
|
||||
/*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = /*@target=Test3.==*/ t?.
|
||||
var /*@ type=double* */ v7 = t?.
|
||||
/*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=double.+*/ += getInt();
|
||||
|
||||
var /*@ type=double* */ v8 = /*@target=Test3.==*/ t?.
|
||||
var /*@ type=double* */ v8 = t?.
|
||||
/*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=double.+*/ += getNum();
|
||||
|
||||
var /*@ type=double* */ v9 =
|
||||
/*@target=Test3.==*/ t?.
|
||||
t?.
|
||||
/*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=double.+*/ += getDouble();
|
||||
|
||||
var /*@ type=double* */ v10 = /*@target=double.+*/ ++
|
||||
/*@target=Test3.==*/ t?.
|
||||
t?.
|
||||
/*@target=Test3.prop*/ /*@target=Test3.prop*/ prop;
|
||||
|
||||
var /*@ type=double* */ v11 = /*@target=Test3.==*/
|
||||
var /*@ type=double* */ v11 =
|
||||
t?. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=double.+*/ ++;
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ class Test extends Base {
|
|||
super.member = /*@ typeArgs=B* */ f();
|
||||
|
||||
super. /*@target=Base.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
super. /*@target=Base.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
@ -46,7 +46,7 @@ class Test extends Base {
|
|||
var /*@ type=B* */ v1 = super.member = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 = super. /*@target=Base.member*/ member
|
||||
/*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 = super. /*@target=Base.member*/ member
|
||||
/*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
|
|
@ -22,10 +22,10 @@ class Test1 extends Base {
|
|||
var /*@ type=num* */ v2 = super.intProp = getNum();
|
||||
|
||||
var /*@ type=int* */ v4 = super. /*@target=Base.intProp*/ intProp
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = super. /*@target=Base.intProp*/ intProp
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=int* */ v7 = super. /*@target=Base.intProp*/ intProp
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -51,13 +51,13 @@ class Test2 extends Base {
|
|||
var /*@ type=double* */ v3 = super.numProp = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 = super. /*@target=Base.numProp*/ numProp
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = super. /*@target=Base.numProp*/ numProp
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = super. /*@target=Base.numProp*/ numProp
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = super. /*@target=Base.numProp*/ numProp
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -84,10 +84,10 @@ class Test3 extends Base {
|
|||
var /*@ type=double* */ v3 = super.doubleProp = getDouble();
|
||||
|
||||
var /*@ type=num* */ v5 = super. /*@target=Base.doubleProp*/ doubleProp
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 = super. /*@target=Base.doubleProp*/ doubleProp
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = super
|
||||
. /*@target=Base.doubleProp*/
|
||||
|
|
|
@ -17,10 +17,10 @@ class Test1 {
|
|||
var /*@ type=num* */ v2 = t. /*@target=Test1.prop*/ prop = getNum();
|
||||
var /*@ type=int* */ v4 = /*@ type=Test1* */ /*@target=Test1.prop*/ t
|
||||
. /*@target=Test1.prop*/ prop
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
var /*@ type=num* */ v5 = /*@ type=Test1* */ /*@target=Test1.prop*/ t
|
||||
. /*@target=Test1.prop*/ prop
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
var /*@ type=int* */ v7 = /*@ type=Test1* */ t
|
||||
. /*@target=Test1.prop*/ /*@target=Test1.prop*/ prop
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -45,13 +45,13 @@ class Test2 {
|
|||
var /*@ type=double* */ v3 = t. /*@target=Test2.prop*/ prop = getDouble();
|
||||
var /*@ type=num* */ v4 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
|
||||
. /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getInt();
|
||||
??= getInt();
|
||||
var /*@ type=num* */ v5 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
|
||||
. /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
var /*@ type=num* */ v6 = /*@ type=Test2* */ /*@target=Test2.prop*/ t
|
||||
. /*@target=Test2.prop*/ prop
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
var /*@ type=num* */ v7 = /*@ type=Test2* */ t
|
||||
. /*@target=Test2.prop*/ /*@target=Test2.prop*/ prop
|
||||
/*@target=num.+*/ += getInt();
|
||||
|
@ -78,10 +78,10 @@ class Test3 {
|
|||
var /*@ type=double* */ v3 = t. /*@target=Test3.prop*/ prop = getDouble();
|
||||
var /*@ type=num* */ v5 = /*@ type=Test3* */ /*@target=Test3.prop*/ t
|
||||
. /*@target=Test3.prop*/ prop
|
||||
/*@target=num.==*/ ??= getNum();
|
||||
??= getNum();
|
||||
var /*@ type=double* */ v6 = /*@ type=Test3* */ /*@target=Test3.prop*/ t
|
||||
. /*@target=Test3.prop*/ prop
|
||||
/*@target=num.==*/ ??= getDouble();
|
||||
??= getDouble();
|
||||
var /*@ type=double* */ v7 = /*@ type=Test3* */ t
|
||||
. /*@target=Test3.prop*/ /*@target=Test3.prop*/ prop
|
||||
/*@target=double.+*/ += getInt();
|
||||
|
|
|
@ -25,7 +25,7 @@ B topLevelVariable;
|
|||
void test_topLevelVariable() {
|
||||
topLevelVariable = /*@ typeArgs=B* */ f();
|
||||
|
||||
topLevelVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
topLevelVariable ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
topLevelVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
||||
|
@ -40,7 +40,7 @@ void test_topLevelVariable() {
|
|||
var /*@ type=B* */ v1 = topLevelVariable = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 =
|
||||
topLevelVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
topLevelVariable ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 =
|
||||
topLevelVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
@ -60,7 +60,7 @@ void test_topLevelVariable() {
|
|||
void test_staticVariable() {
|
||||
B.staticVariable = /*@ typeArgs=B* */ f();
|
||||
|
||||
B.staticVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
B.staticVariable ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
B.staticVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
||||
|
@ -75,7 +75,7 @@ void test_staticVariable() {
|
|||
var /*@ type=B* */ v1 = B.staticVariable = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 =
|
||||
B.staticVariable /*@target=A.==*/ ??= /*@ typeArgs=B* */ f();
|
||||
B.staticVariable ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 =
|
||||
B.staticVariable /*@target=B.+*/ += /*@ typeArgs=C* */ f();
|
||||
|
|
|
@ -18,9 +18,9 @@ void test1() {
|
|||
|
||||
var /*@ type=num* */ v2 = topLevelInt = getNum();
|
||||
|
||||
var /*@ type=int* */ v4 = topLevelInt /*@target=num.==*/ ??= getInt();
|
||||
var /*@ type=int* */ v4 = topLevelInt ??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = topLevelInt /*@target=num.==*/ ??= getNum();
|
||||
var /*@ type=num* */ v5 = topLevelInt ??= getNum();
|
||||
|
||||
var /*@ type=int* */ v7 = topLevelInt /*@target=num.+*/ += getInt();
|
||||
|
||||
|
@ -39,11 +39,11 @@ void test2() {
|
|||
|
||||
var /*@ type=double* */ v3 = topLevelNum = getDouble();
|
||||
|
||||
var /*@ type=num* */ v4 = topLevelNum /*@target=num.==*/ ??= getInt();
|
||||
var /*@ type=num* */ v4 = topLevelNum ??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = topLevelNum /*@target=num.==*/ ??= getNum();
|
||||
var /*@ type=num* */ v5 = topLevelNum ??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = topLevelNum /*@target=num.==*/ ??= getDouble();
|
||||
var /*@ type=num* */ v6 = topLevelNum ??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = topLevelNum /*@target=num.+*/ += getInt();
|
||||
|
||||
|
@ -62,10 +62,10 @@ void test3() {
|
|||
|
||||
var /*@ type=double* */ v3 = topLevelDouble = getDouble();
|
||||
|
||||
var /*@ type=num* */ v5 = topLevelDouble /*@target=num.==*/ ??= getNum();
|
||||
var /*@ type=num* */ v5 = topLevelDouble ??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 =
|
||||
topLevelDouble /*@target=num.==*/ ??= getDouble();
|
||||
topLevelDouble ??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = topLevelDouble /*@target=double.+*/ += getInt();
|
||||
|
||||
|
|
|
@ -21,6 +21,6 @@ class D extends C {}
|
|||
var a = new A();
|
||||
var x = a. /*@target=A.b*/ b. /*@target=B.c*/ c;
|
||||
var y = a. /*@ type=B* */ /*@target=A.b*/ /*@target=B.c*/ b. /*@target=B.c*/ c
|
||||
/*@target=C.==*/ ??= new D();
|
||||
??= new D();
|
||||
|
||||
main() {}
|
||||
|
|
|
@ -40,12 +40,12 @@ class C extends core::Object {
|
|||
synthetic constructor •() → self::C*
|
||||
: super core::Object::•()
|
||||
;
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
|
||||
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
|
||||
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
|
||||
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
|
||||
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
|
||||
abstract member-signature method toString() → core::String*; -> core::Object::toString
|
||||
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
|
||||
|
|
|
@ -38,12 +38,12 @@ class B extends core::Object {
|
|||
class C extends core::Object {
|
||||
synthetic constructor •() → self::C*
|
||||
;
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
|
||||
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
|
||||
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
|
||||
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
|
||||
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
|
||||
abstract member-signature method toString() → core::String*; -> core::Object::toString
|
||||
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
|
||||
|
|
|
@ -40,12 +40,12 @@ class C extends core::Object {
|
|||
synthetic constructor •() → self::C*
|
||||
: super core::Object::•()
|
||||
;
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
|
||||
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
|
||||
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
|
||||
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
|
||||
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
|
||||
abstract member-signature method toString() → core::String*; -> core::Object::toString
|
||||
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
|
||||
|
|
|
@ -20,6 +20,6 @@ class D extends C {}
|
|||
var a = new A();
|
||||
var x = a. /*@target=A.b*/ b. /*@target=B.c*/ c;
|
||||
var y = a. /*@ type=B* */ /*@target=A.b*/ /*@target=B.c*/ b
|
||||
. /*@target=B.c*/ c /*@target=C.==*/ ??= new D();
|
||||
. /*@target=B.c*/ c ??= new D();
|
||||
|
||||
main() {}
|
||||
|
|
|
@ -38,12 +38,12 @@ class C extends core::Object {
|
|||
synthetic constructor •() → self::C*
|
||||
: super core::Object::•()
|
||||
;
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
|
||||
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
|
||||
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
|
||||
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
|
||||
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
|
||||
abstract member-signature method toString() → core::String*; -> core::Object::toString
|
||||
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
|
||||
|
|
|
@ -35,12 +35,12 @@ class B extends core::Object {
|
|||
class C extends core::Object {
|
||||
synthetic constructor •() → self::C*
|
||||
;
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
|
||||
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
|
||||
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
|
||||
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
|
||||
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
|
||||
abstract member-signature method toString() → core::String*; -> core::Object::toString
|
||||
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
|
||||
|
|
|
@ -38,12 +38,12 @@ class C extends core::Object {
|
|||
synthetic constructor •() → self::C*
|
||||
: super core::Object::•()
|
||||
;
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get _identityHashCode() → core::int*; -> core::Object::_identityHashCode
|
||||
abstract member-signature method _instanceOf(dynamic instantiatorTypeArguments, dynamic functionTypeArguments, dynamic type) → core::bool*; -> core::Object::_instanceOf
|
||||
abstract member-signature method _simpleInstanceOf(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOf
|
||||
abstract member-signature method _simpleInstanceOfTrue(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfTrue
|
||||
abstract member-signature method _simpleInstanceOfFalse(dynamic type) → core::bool*; -> core::Object::_simpleInstanceOfFalse
|
||||
abstract member-signature operator ==(dynamic other) → core::bool*; -> core::Object::==
|
||||
abstract member-signature get hashCode() → core::int*; -> core::Object::hashCode
|
||||
abstract member-signature method toString() → core::String*; -> core::Object::toString
|
||||
abstract member-signature method noSuchMethod(core::Invocation* invocation) → dynamic; -> core::Object::noSuchMethod
|
||||
|
|
|
@ -11,6 +11,5 @@ class Class {
|
|||
|
||||
main() {
|
||||
Class c;
|
||||
num Function() f = /*@target=Class.==*/ /*@type=Class**/ c
|
||||
?. /*@target=Class.method*/ method;
|
||||
num Function() f = /*@type=Class**/ c?. /*@target=Class.method*/ method;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue