blob: f6d9aab83ffcc127c7bf7a8344d583c11ff9c96f [file] [log] [blame]
// Copyright (c) 2017, 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.
// @dart=2.9
/*@testedFeatures=inference*/
library test;
int getInt() => 0;
num getNum() => 0;
double getDouble() => 0.0;
abstract class Test1 {
int operator [](String s);
void operator []=(String s, int v);
void test() {
var /*@ type=int* */ v1 = this /*@target=Test1.[]=*/ ['x'] = getInt();
var /*@ type=num* */ v2 = this /*@target=Test1.[]=*/ ['x'] = getNum();
var /*@ type=int* */ v4 = this
/*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x']
??= getInt();
var /*@ type=num* */ v5 = this
/*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x']
??= getNum();
var /*@ type=int* */ v7 = this
/*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x']
/*@target=num.+*/ += getInt();
var /*@ type=num* */ v8 = this
/*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x']
/*@target=num.+*/ += getNum();
var /*@ type=int* */ v10 = /*@target=num.+*/ ++this
/*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x'];
var /*@ type=int* */ v11 = this
/*@target=Test1.[]*/ /*@target=Test1.[]=*/ ['x']
/*@target=num.+*/ ++;
}
}
abstract class Test2 {
int operator [](String s);
void operator []=(String s, num v);
void test() {
var /*@ type=int* */ v1 = this /*@target=Test2.[]=*/ ['x'] = getInt();
var /*@ type=num* */ v2 = this /*@target=Test2.[]=*/ ['x'] = getNum();
var /*@ type=double* */ v3 = this /*@target=Test2.[]=*/ ['x'] = getDouble();
var /*@ type=int* */ v4 = this
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
??= getInt();
var /*@ type=num* */ v5 = this
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
??= getNum();
var /*@ type=num* */ v6 = this
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
??= getDouble();
var /*@ type=int* */ v7 = this
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
/*@target=num.+*/ += getInt();
var /*@ type=num* */ v8 = this
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
/*@target=num.+*/ += getNum();
var /*@ type=double* */ v9 = this
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
/*@target=num.+*/ += getDouble();
var /*@ type=int* */ v10 = /*@target=num.+*/ ++this
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x'];
var /*@ type=int* */ v11 = this
/*@target=Test2.[]*/ /*@target=Test2.[]=*/ ['x']
/*@target=num.+*/ ++;
}
}
abstract class Test3 {
int operator [](String s);
void operator []=(String s, double v);
void test() {
var /*@ type=num* */ v2 = this /*@target=Test3.[]=*/ ['x'] = getNum();
var /*@ type=double* */ v3 = this /*@target=Test3.[]=*/ ['x'] = getDouble();
var /*@ type=num* */ v5 = this
/*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
??= getNum();
var /*@ type=num* */ v6 = this
/*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
??= getDouble();
var /*@ type=int* */ v7 = this
/*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
/*@target=num.+*/ += getInt();
var /*@ type=num* */ v8 = this
/*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
/*@target=num.+*/ += getNum();
var /*@ type=double* */ v9 = this
/*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
/*@target=num.+*/ += getDouble();
var /*@ type=int* */ v10 = /*@target=num.+*/ ++this
/*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x'];
var /*@ type=int* */ v11 = this
/*@target=Test3.[]*/ /*@target=Test3.[]=*/ ['x']
/*@target=num.+*/ ++;
}
}
abstract class Test4 {
num operator [](String s);
void operator []=(String s, int v);
void test() {
var /*@ type=int* */ v1 = this /*@target=Test4.[]=*/ ['x'] = getInt();
var /*@ type=num* */ v2 = this /*@target=Test4.[]=*/ ['x'] = getNum();
var /*@ type=num* */ v4 = this
/*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x']
??= getInt();
var /*@ type=num* */ v5 = this
/*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x']
??= getNum();
var /*@ type=num* */ v7 = this
/*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x']
/*@target=num.+*/ += getInt();
var /*@ type=num* */ v8 = this
/*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x']
/*@target=num.+*/ += getNum();
var /*@ type=num* */ v10 = /*@target=num.+*/ ++this
/*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x'];
var /*@ type=num* */ v11 = this
/*@target=Test4.[]*/ /*@target=Test4.[]=*/ ['x']
/*@target=num.+*/ ++;
}
}
abstract class Test5 {
num operator [](String s);
void operator []=(String s, num v);
void test() {
var /*@ type=int* */ v1 = this /*@target=Test5.[]=*/ ['x'] = getInt();
var /*@ type=num* */ v2 = this /*@target=Test5.[]=*/ ['x'] = getNum();
var /*@ type=double* */ v3 = this /*@target=Test5.[]=*/ ['x'] = getDouble();
var /*@ type=num* */ v4 = this
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
??= getInt();
var /*@ type=num* */ v5 = this
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
??= getNum();
var /*@ type=num* */ v6 = this
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
??= getDouble();
var /*@ type=num* */ v7 = this
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
/*@target=num.+*/ += getInt();
var /*@ type=num* */ v8 = this
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
/*@target=num.+*/ += getNum();
var /*@ type=num* */ v9 = this
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
/*@target=num.+*/ += getDouble();
var /*@ type=num* */ v10 = /*@target=num.+*/ ++this
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x'];
var /*@ type=num* */ v11 = this
/*@target=Test5.[]*/ /*@target=Test5.[]=*/ ['x']
/*@target=num.+*/ ++;
}
}
abstract class Test6 {
num operator [](String s);
void operator []=(String s, double v);
void test() {
var /*@ type=num* */ v2 = this /*@target=Test6.[]=*/ ['x'] = getNum();
var /*@ type=double* */ v3 = this /*@target=Test6.[]=*/ ['x'] = getDouble();
var /*@ type=num* */ v5 = this
/*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
??= getNum();
var /*@ type=num* */ v6 = this
/*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
??= getDouble();
var /*@ type=num* */ v7 = this
/*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
/*@target=num.+*/ += getInt();
var /*@ type=num* */ v8 = this
/*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
/*@target=num.+*/ += getNum();
var /*@ type=num* */ v9 = this
/*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
/*@target=num.+*/ += getDouble();
var /*@ type=num* */ v10 = /*@target=num.+*/ ++this
/*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x'];
var /*@ type=num* */ v11 = this
/*@target=Test6.[]*/ /*@target=Test6.[]=*/ ['x']
/*@target=num.+*/ ++;
}
}
abstract class Test7 {
double operator [](String s);
void operator []=(String s, int v);
void test() {
var /*@ type=int* */ v1 = this /*@target=Test7.[]=*/ ['x'] = getInt();
var /*@ type=num* */ v2 = this
/*@target=Test7.[]=*/ ['x'] = getNum();
var /*@ type=num* */ v4 = this
/*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x']
??= getInt();
var /*@ type=num* */ v5 = this
/*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x']
??= getNum();
var /*@ type=double* */ v7 = this
/*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x']
/*@target=double.+*/ += getInt();
var /*@ type=double* */ v8 = this
/*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x']
/*@target=double.+*/ += getNum();
var /*@ type=double* */ v10 = /*@target=double.+*/ ++this
/*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x'];
var /*@ type=double* */ v11 = this
/*@target=Test7.[]*/ /*@target=Test7.[]=*/ ['x']
/*@target=double.+*/ ++;
}
}
abstract class Test8 {
double operator [](String s);
void operator []=(String s, num v);
void test() {
var /*@ type=int* */ v1 = this /*@target=Test8.[]=*/ ['x'] = getInt();
var /*@ type=num* */ v2 = this
/*@target=Test8.[]=*/ ['x'] = getNum();
var /*@ type=double* */ v3 = this
/*@target=Test8.[]=*/ ['x'] = getDouble();
var /*@ type=num* */ v4 = this
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
??= getInt();
var /*@ type=num* */ v5 = this
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
??= getNum();
var /*@ type=double* */ v6 = this
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
??= getDouble();
var /*@ type=double* */ v7 = this
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
/*@target=double.+*/ += getInt();
var /*@ type=double* */ v8 = this
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
/*@target=double.+*/ += getNum();
var /*@ type=double* */ v9 = this
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x']
/*@target=double.+*/ += getDouble();
var /*@ type=double* */ v10 = /*@target=double.+*/ ++this
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ ['x'];
var /*@ type=double* */ v11 = this
/*@target=Test8.[]*/ /*@target=Test8.[]=*/ [
'x'] /*@target=double.+*/ ++;
}
}
abstract class Test9 {
double operator [](String s);
void operator []=(String s, double v);
void test() {
var /*@ type=num* */ v2 = this /*@target=Test9.[]=*/ ['x'] = getNum();
var /*@ type=double* */ v3 = this
/*@target=Test9.[]=*/ ['x'] = getDouble();
var /*@ type=num* */ v5 = this
/*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
??= getNum();
var /*@ type=double* */ v6 = this
/*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
??= getDouble();
var /*@ type=double* */ v7 = this
/*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
/*@target=double.+*/ += getInt();
var /*@ type=double* */ v8 = this
/*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
/*@target=double.+*/ += getNum();
var /*@ type=double* */ v9 = this
/*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
/*@target=double.+*/ += getDouble();
var /*@ type=double* */ v10 = /*@target=double.+*/ ++this
/*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x'];
var /*@ type=double* */ v11 = this
/*@target=Test9.[]*/ /*@target=Test9.[]=*/ ['x']
/*@target=double.+*/ ++;
}
}
main() {}