[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:
Johnni Winther 2021-09-16 10:11:55 +00:00 committed by commit-bot@chromium.org
parent 70730ad62f
commit 4aa6373724
65 changed files with 403 additions and 362 deletions

View file

@ -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)) {

View file

@ -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

View 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() {}

View file

@ -0,0 +1,2 @@
void test() {}
main() {}

View file

@ -0,0 +1,2 @@
main() {}
void test() {}

View 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 {}

View file

@ -0,0 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
static method test() → void
;
static method main() → dynamic
;

View 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 {}

View 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() {}

View file

@ -0,0 +1,2 @@
void test() {}
main() {}

View file

@ -0,0 +1,2 @@
main() {}
void test() {}

View 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 {}

View file

@ -0,0 +1,7 @@
library /*isNonNullableByDefault*/;
import self as self;
static method test() → void
;
static method main() → dynamic
;

View 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 {}

View file

@ -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)]) {

View file

@ -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) =>

View file

@ -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);
});
}

View file

@ -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) {

View file

@ -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.+*/ +=

View file

@ -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();

View file

@ -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.[]=*/ [

View file

@ -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.[]=*/ [

View file

@ -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.[]=*/ [

View file

@ -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();

View file

@ -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();

View file

@ -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

View file

@ -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.-*/ --;
}

View file

@ -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.+*/ ++;
}

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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() {}

View file

@ -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() {}

View file

@ -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;
}

View file

@ -7,5 +7,5 @@ library test;
main() {
List<int> x;
List<num> y = x /*@target=List.==*/ ?? /*@ typeArgs=num* */ [];
List<num> y = x ?? /*@ typeArgs=num* */ [];
}

View file

@ -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

View file

@ -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();

View file

@ -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()]

View file

@ -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()]

View file

@ -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()]

View file

@ -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']

View file

@ -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()]

View file

@ -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']

View file

@ -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.+*/ +=

View file

@ -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();

View file

@ -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();

View file

@ -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

View file

@ -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.-*/ --;
}

View file

@ -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.+*/ ++;
}

View file

@ -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();

View file

@ -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*/

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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() {}

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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() {}

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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;
}