Insert implicit downcasts for simple assignments.

Notes on test changes:

- This revealed runtime failures in some tests in
  pkg/front_end/testcases/inference.  Since these tests were never
  meant to exercise runtime behavior in the first place, I just
  changed them so that main() does nothing.

- This revealed runtime failures in some tests in tests/language_2.
  These tests began failing because they used "var" for a fields and
  then later assigned a value to the field that was incompatible with
  the inferred type.  It looks like the intent was for these fields to
  have type "dynamic", so I changed the tests accordingly.

Change-Id: I0ddb2063427b52b5e4be1884fa333e25be4bf4f3
Reviewed-on: https://dart-review.googlesource.com/16881
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Paul Berry 2017-10-27 18:27:09 +00:00 committed by commit-bot@chromium.org
parent 5f42a89f3f
commit 6f9d6965fe
48 changed files with 149 additions and 127 deletions

View file

@ -457,15 +457,19 @@ abstract class ShadowComplexAssignment extends ShadowSyntheticExpression {
_storeLetType(inferrer, replacedCombiner, combinedType);
} else {
combinedType = inferrer.inferExpression(rhs, writeContext, true);
_storeLetType(inferrer, rhs, combinedType);
}
if (write != null) {
if (this is ShadowIndexAssign) {
_storeLetType(inferrer, write, const VoidType());
var replacedRhs =
inferrer.checkAssignability(writeContext, combinedType, rhs);
if (replacedRhs == null) {
_storeLetType(inferrer, rhs, combinedType);
} else {
_storeLetType(inferrer, write, combinedType);
_storeLetType(inferrer, replacedRhs, writeContext);
}
}
if (this is ShadowIndexAssign) {
_storeLetType(inferrer, write, const VoidType());
} else {
_storeLetType(inferrer, write, combinedType);
}
return isPostIncDec ? readType : combinedType;
}
}

View file

@ -330,6 +330,32 @@ abstract class TypeInferrerImpl extends TypeInferrer {
/// inference.
TypePromoter get typePromoter;
/// Checks whether [actualType] can be assigned to [expectedType], and inserts
/// an implicit downcast if appropriate.
Expression checkAssignability(
DartType expectedType, DartType actualType, Expression expression) {
if (expectedType == null ||
typeSchemaEnvironment.isSubtypeOf(actualType, expectedType)) {
// Types are compatible.
return null;
} else {
if (!typeSchemaEnvironment.isSubtypeOf(expectedType, actualType)) {
// Error: not assignable.
// TODO(paulberry): report the error.
}
// Insert an implicit downcast.
if (strongMode) {
var parent = expression.parent;
var typeCheck = new ShadowAsExpression(expression, expectedType)
..isTypeError = true;
parent.replaceChild(expression, typeCheck);
return typeCheck;
} else {
return null;
}
}
}
/// Finds a member of [receiverType] called [name], and if it is found,
/// reports it through instrumentation using [fileOffset].
///

View file

@ -9,7 +9,7 @@ static method main() → dynamic {
return null;
};
core::String y = f.call(42);
f = (core::Object x) → core::String => "hello";
f = (core::Object x) → core::String => "hello" as{TypeError} (core::Object) → core::Null;
self::foo((core::Object x) → core::Null {
return null;
});

View file

@ -10,7 +10,7 @@ class C<T> {
C(this.t);
}
main() {
test() {
var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C(42);
num y;
@ -25,3 +25,5 @@ main() {
var /*@type=C<dynamic>*/ c_dynamic = new C<dynamic>(42);
x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
}
main() {}

View file

@ -8,7 +8,7 @@ class C<T extends core::Object> extends core::Object {
: self::C::t = t, super core::Object::•()
;
}
static method main() → dynamic {
static method test() → dynamic {
dynamic x = new self::C::•<dynamic>(42);
core::num y;
self::C<core::int> c_int = new self::C::•<dynamic>(y);
@ -17,3 +17,4 @@ static method main() → dynamic {
dynamic c_dynamic = new self::C::•<dynamic>(42);
x.t = "hello";
}
static method main() → dynamic {}

View file

@ -8,12 +8,13 @@ class C<T extends core::Object> extends core::Object {
: self::C::t = t, super core::Object::•()
;
}
static method main() → dynamic {
static method test() → dynamic {
self::C<core::int> x = new self::C::•<core::int>(42);
core::num y;
self::C<core::int> c_int = new self::C::•<core::int>(y);
self::C<core::num> c_num = new self::C::•<core::num>(123);
self::C<core::num> c_num2 = let final self::C<core::num> #t1 = new self::C::•<core::num>(456) in let final dynamic #t2 = #t1.{self::C::t} = 1.0 in #t1;
self::C<dynamic> c_dynamic = new self::C::•<dynamic>(42);
x.{self::C::t} = "hello";
x.{self::C::t} = "hello" as{TypeError} core::int;
}
static method main() → dynamic {}

View file

@ -17,7 +17,9 @@ class C<T> {
}
}
main() {
test() {
var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C(42);
x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
}
main() {}

View file

@ -13,7 +13,8 @@ class C<T extends core::Object> extends core::Object {
return x;
}
}
static method main() → dynamic {
static method test() → dynamic {
dynamic x = self::C::•<dynamic>(42);
x.t = "hello";
}
static method main() → dynamic {}

View file

@ -13,7 +13,8 @@ class C<T extends core::Object> extends core::Object {
return x;
}
}
static method main() → dynamic {
static method test() → dynamic {
self::C<core::int> x = self::C::•<core::int>(42);
x.{self::C::t} = "hello";
x.{self::C::t} = "hello" as{TypeError} core::int;
}
static method main() → dynamic {}

View file

@ -5,7 +5,7 @@
/*@testedFeatures=inference*/
library test;
void main() {
void test() {
{
String f<S>(int x) => null;
var /*@type=<S extends Object>(int) -> String*/ v = f;
@ -69,3 +69,5 @@ void main() {
x. /*@target=String::substring*/ substring(3);
}
}
main() {}

View file

@ -2,7 +2,7 @@ library test;
import self as self;
import "dart:core" as core;
static method main() → void {
static method test() → void {
{
function f<S extends core::Object>(core::int x) → core::String
return null;
@ -58,3 +58,4 @@ static method main() → void {
z = <T extends core::Object>(dynamic x) → dynamic => x.substring(3);
}
}
static method main() → dynamic {}

View file

@ -2,15 +2,15 @@ library test;
import self as self;
import "dart:core" as core;
static method main() → void {
static method test() → void {
{
function f<S extends core::Object>(core::int x) → core::String
return null;
<S extends core::Object>(core::int) → core::String v = f;
v = <T extends core::Object>(core::int x) → core::String => null;
v = <T extends core::Object>(core::int x) → core::String => "hello";
v = <T extends core::Object>(core::String x) → core::String => "hello";
v = <T extends core::Object>(core::int x) → core::int => 3;
v = <T extends core::Object>(core::String x) → core::String => "hello" as{TypeError} <S extends core::Object>(core::int) → core::String;
v = <T extends core::Object>(core::int x) → core::int => 3 as{TypeError} <S extends core::Object>(core::int) → core::String;
v = <T extends core::Object>(core::int x) → core::String {
return 3;
};
@ -21,7 +21,7 @@ static method main() → void {
<S extends core::Object>(core::int) → core::String v = f;
v = <T extends core::Object>(core::int x) → core::String => null;
v = <T extends core::Object>(core::int x) → core::String => "hello";
v = <T extends core::Object>(core::int x) → core::int => 3;
v = <T extends core::Object>(core::int x) → core::int => 3 as{TypeError} <S extends core::Object>(core::int) → core::String;
v = <T extends core::Object>(core::int x) → core::String {
return 3;
};
@ -35,7 +35,7 @@ static method main() → void {
<S extends core::Object>(core::int) → core::List<core::String> v = f;
v = <T extends core::Object>(core::int x) → core::List<core::String> => null;
v = <T extends core::Object>(core::int x) → core::List<core::String> => <core::String>["hello"];
v = <T extends core::Object>(core::String x) → core::List<core::String> => <core::String>["hello"];
v = <T extends core::Object>(core::String x) → core::List<core::String> => <core::String>["hello"] as{TypeError} <S extends core::Object>(core::int) → core::List<core::String>;
v = <T extends core::Object>(core::int x) → core::List<core::String> => <core::String>[3];
v = <T extends core::Object>(core::int x) → core::List<core::String> {
return <core::String>[3];
@ -52,9 +52,10 @@ static method main() → void {
x = <T extends core::Object>(core::int x) → core::int => x;
x = <T extends core::Object>(core::int x) → core::int => x.{core::num::+}(1);
<T extends core::Object>(core::int) → core::String y = int2String;
y = <T extends core::Object>(core::int x) → core::int => x;
y = <T extends core::Object>(core::int x) → core::int => x as{TypeError} <T extends core::Object>(core::int) → core::String;
y = <T extends core::Object>(core::int x) → core::String => x.substring(3);
<T extends core::Object>(core::String) → core::String z = string2String;
z = <T extends core::Object>(core::String x) → core::String => x.{core::String::substring}(3);
}
}
static method main() → dynamic {}

View file

@ -6,12 +6,12 @@ static method test() → void {
core::List<core::int> o;
core::int y = o.{core::Iterable::fold}<core::int>(0, (core::int x, core::int y) → core::int => x.{core::num::+}(y));
dynamic z = o.{core::Iterable::fold}<dynamic>(0, (dynamic x, core::int y) → dynamic => x.+(y));
y = z;
y = z as{TypeError} core::int;
}
static method functionExpressionInvocation() → void {
core::List<core::int> o;
core::int y = o.{core::Iterable::fold}.call<core::int>(0, (core::int x, core::int y) → core::int => x.{core::num::+}(y));
dynamic z = o.{core::Iterable::fold}.call<dynamic>(0, (dynamic x, core::int y) → dynamic => x.+(y));
y = z;
y = z as{TypeError} core::int;
}
static method main() → dynamic {}

View file

@ -9,7 +9,7 @@ class Test1 extends core::Object {
;
method test() → void {
core::int v1 = this.{self::Test1::t} = self::getInt();
core::num v2 = this.{self::Test1::t} = self::getNum();
core::num v2 = this.{self::Test1::t} = self::getNum() as{TypeError} core::int;
core::int v4 = let final core::int #t1 = this.{self::Test1::t} in #t1.{core::num::==}(null) ?{core::int} this.{self::Test1::t} = self::getInt() : #t1;
core::num v5 = let final core::int #t2 = this.{self::Test1::t} in #t2.{core::num::==}(null) ?{core::num} this.{self::Test1::t} = self::getNum() : #t2;
core::int v7 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(self::getInt());
@ -43,7 +43,7 @@ class Test3 extends core::Object {
: super core::Object::•()
;
method test3() → void {
core::num v2 = this.{self::Test3::t} = self::getNum();
core::num v2 = this.{self::Test3::t} = self::getNum() as{TypeError} core::double;
core::double v3 = this.{self::Test3::t} = self::getDouble();
core::num v5 = let final core::double #t10 = this.{self::Test3::t} in #t10.{core::num::==}(null) ?{core::num} this.{self::Test3::t} = self::getNum() : #t10;
core::double v6 = let final core::double #t11 = this.{self::Test3::t} in #t11.{core::num::==}(null) ?{core::double} this.{self::Test3::t} = self::getDouble() : #t11;

View file

@ -10,7 +10,7 @@ static method getDouble() → core::double
return 0.0;
static method test1(core::int t) → void {
core::int v1 = t = self::getInt();
core::num v2 = t = self::getNum();
core::num v2 = t = self::getNum() as{TypeError} core::int;
core::int v4 = let final core::int #t1 = t in #t1.{core::num::==}(null) ?{core::int} t = self::getInt() : #t1;
core::num v5 = let final core::int #t2 = t in #t2.{core::num::==}(null) ?{core::num} t = self::getNum() : #t2;
core::int v7 = t = t.{core::num::+}(self::getInt());
@ -32,7 +32,7 @@ static method test2(core::num t) → void {
core::num v11 = let final core::num #t8 = t in let final core::num #t9 = t = #t8.{core::num::+}(1) in #t8;
}
static method test3(core::double t) → void {
core::num v2 = t = self::getNum();
core::num v2 = t = self::getNum() as{TypeError} core::double;
core::double v3 = t = self::getDouble();
core::num v5 = let final core::double #t10 = t in #t10.{core::num::==}(null) ?{core::num} t = self::getNum() : #t10;
core::double v6 = let final core::double #t11 = t in #t11.{core::num::==}(null) ?{core::double} t = self::getDouble() : #t11;

View file

@ -9,7 +9,7 @@ class Test1 extends core::Object {
;
static method test(self::Test1 t) → void {
core::int v1 = let final self::Test1 #t1 = t in #t1.==(null) ?{core::int} null : #t1.{self::Test1::prop} = self::getInt();
core::num v2 = let final self::Test1 #t2 = t in #t2.==(null) ?{core::num} null : #t2.{self::Test1::prop} = self::getNum();
core::num v2 = let final self::Test1 #t2 = t in #t2.==(null) ?{core::num} null : #t2.{self::Test1::prop} = self::getNum() as{TypeError} core::int;
core::int v4 = let final self::Test1 #t3 = t in #t3.==(null) ?{core::int} null : let final core::int #t4 = #t3.{self::Test1::prop} in #t4.{core::num::==}(null) ?{core::int} #t3.{self::Test1::prop} = self::getInt() : #t4;
core::num v5 = let final self::Test1 #t5 = t in #t5.==(null) ?{core::num} null : let final core::int #t6 = #t5.{self::Test1::prop} in #t6.{core::num::==}(null) ?{core::num} #t5.{self::Test1::prop} = self::getNum() : #t6;
core::int v7 = let final self::Test1 #t7 = t in #t7.==(null) ?{core::int} null : #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(self::getInt());
@ -43,7 +43,7 @@ class Test3 extends core::Object {
: super core::Object::•()
;
static method test3(self::Test3 t) → void {
core::num v2 = let final self::Test3 #t29 = t in #t29.==(null) ?{core::num} null : #t29.{self::Test3::prop} = self::getNum();
core::num v2 = let final self::Test3 #t29 = t in #t29.==(null) ?{core::num} null : #t29.{self::Test3::prop} = self::getNum() as{TypeError} core::double;
core::double v3 = let final self::Test3 #t30 = t in #t30.==(null) ?{core::double} null : #t30.{self::Test3::prop} = self::getDouble();
core::num v5 = let final self::Test3 #t31 = t in #t31.==(null) ?{core::num} null : let final core::double #t32 = #t31.{self::Test3::prop} in #t32.{core::num::==}(null) ?{core::num} #t31.{self::Test3::prop} = self::getNum() : #t32;
core::double v6 = let final self::Test3 #t33 = t in #t33.==(null) ?{core::double} null : let final core::double #t34 = #t33.{self::Test3::prop} in #t34.{core::num::==}(null) ?{core::double} #t33.{self::Test3::prop} = self::getDouble() : #t34;

View file

@ -16,7 +16,7 @@ class Test1 extends self::Base {
;
method test() → void {
core::int v1 = super.{self::Base::intProp} = self::getInt();
core::num v2 = super.{self::Base::intProp} = self::getNum();
core::num v2 = super.{self::Base::intProp} = self::getNum() as{TypeError} core::int;
core::int v4 = let final core::int #t1 = super.{self::Base::intProp} in #t1.{core::num::==}(null) ?{core::int} super.{self::Base::intProp} = self::getInt() : #t1;
core::num v5 = let final core::int #t2 = super.{self::Base::intProp} in #t2.{core::num::==}(null) ?{core::num} super.{self::Base::intProp} = self::getNum() : #t2;
core::int v7 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(self::getInt());
@ -48,7 +48,7 @@ class Test3 extends self::Base {
: super self::Base::•()
;
method test3() → void {
core::num v2 = super.{self::Base::doubleProp} = self::getNum();
core::num v2 = super.{self::Base::doubleProp} = self::getNum() as{TypeError} core::double;
core::double v3 = super.{self::Base::doubleProp} = self::getDouble();
core::num v5 = let final core::double #t10 = super.{self::Base::doubleProp} in #t10.{core::num::==}(null) ?{core::num} super.{self::Base::doubleProp} = self::getNum() : #t10;
core::double v6 = let final core::double #t11 = super.{self::Base::doubleProp} in #t11.{core::num::==}(null) ?{core::double} super.{self::Base::doubleProp} = self::getDouble() : #t11;

View file

@ -9,7 +9,7 @@ class Test1 extends core::Object {
;
static method test(self::Test1 t) → void {
core::int v1 = t.{self::Test1::prop} = self::getInt();
core::num v2 = t.{self::Test1::prop} = self::getNum();
core::num v2 = t.{self::Test1::prop} = self::getNum() as{TypeError} core::int;
core::int v4 = let final self::Test1 #t1 = t in let final core::int #t2 = #t1.{self::Test1::prop} in #t2.{core::num::==}(null) ?{core::int} #t1.{self::Test1::prop} = self::getInt() : #t2;
core::num v5 = let final self::Test1 #t3 = t in let final core::int #t4 = #t3.{self::Test1::prop} in #t4.{core::num::==}(null) ?{core::num} #t3.{self::Test1::prop} = self::getNum() : #t4;
core::int v7 = let final self::Test1 #t5 = t in #t5.{self::Test1::prop} = #t5.{self::Test1::prop}.{core::num::+}(self::getInt());
@ -43,7 +43,7 @@ class Test3 extends core::Object {
: super core::Object::•()
;
static method test3(self::Test3 t) → void {
core::num v2 = t.{self::Test3::prop} = self::getNum();
core::num v2 = t.{self::Test3::prop} = self::getNum() as{TypeError} core::double;
core::double v3 = t.{self::Test3::prop} = self::getDouble();
core::num v5 = let final self::Test3 #t24 = t in let final core::double #t25 = #t24.{self::Test3::prop} in #t25.{core::num::==}(null) ?{core::num} #t24.{self::Test3::prop} = self::getNum() : #t25;
core::double v6 = let final self::Test3 #t26 = t in let final core::double #t27 = #t26.{self::Test3::prop} in #t27.{core::num::==}(null) ?{core::double} #t26.{self::Test3::prop} = self::getDouble() : #t27;

View file

@ -13,7 +13,7 @@ static method getDouble() → core::double
return 0.0;
static method test1() → void {
core::int v1 = self::topLevelInt = self::getInt();
core::num v2 = self::topLevelInt = self::getNum();
core::num v2 = self::topLevelInt = self::getNum() as{TypeError} core::int;
core::int v4 = let final core::int #t1 = self::topLevelInt in #t1.{core::num::==}(null) ?{core::int} self::topLevelInt = self::getInt() : #t1;
core::num v5 = let final core::int #t2 = self::topLevelInt in #t2.{core::num::==}(null) ?{core::num} self::topLevelInt = self::getNum() : #t2;
core::int v7 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getInt());
@ -35,7 +35,7 @@ static method test2() → void {
core::num v11 = let final core::num #t8 = self::topLevelNum in let final core::num #t9 = self::topLevelNum = #t8.{core::num::+}(1) in #t8;
}
static method test3() → void {
core::num v2 = self::topLevelDouble = self::getNum();
core::num v2 = self::topLevelDouble = self::getNum() as{TypeError} core::double;
core::double v3 = self::topLevelDouble = self::getDouble();
core::num v5 = let final core::double #t10 = self::topLevelDouble in #t10.{core::num::==}(null) ?{core::num} self::topLevelDouble = self::getNum() : #t10;
core::double v6 = let final core::double #t11 = self::topLevelDouble in #t11.{core::num::==}(null) ?{core::double} self::topLevelDouble = self::getDouble() : #t11;

View file

@ -22,13 +22,13 @@ class B extends core::Object implements self::A {
static method foo() → dynamic {
core::String s;
core::int i;
s = new self::B::•().{self::B::x};
s = new self::B::•().{self::B::y};
s = new self::B::•().{self::B::x} as{TypeError} core::String;
s = new self::B::•().{self::B::y} as{TypeError} core::String;
s = new self::B::•().{self::B::z};
s = new self::B::•().{self::B::w};
i = new self::B::•().{self::B::x};
s = new self::B::•().{self::B::w} as{TypeError} core::String;
i = new self::B::•().{self::B::x} as{TypeError} core::int;
i = new self::B::•().{self::B::y};
i = new self::B::•().{self::B::z};
i = new self::B::•().{self::B::z} as{TypeError} core::int;
i = new self::B::•().{self::B::w};
}
static method main() → dynamic {}

View file

@ -27,27 +27,27 @@ static field self::B h = new self::A::•().{self::A::+}(3);
static field dynamic i = new self::A::•().unary-();
static field self::B j = null as self::B;
static method test1() → dynamic {
self::a = "hi";
self::a = "hi" as{TypeError} self::A;
self::a = new self::B::•(3);
self::b = "hi";
self::b = "hi" as{TypeError} self::B;
self::b = new self::B::•(3);
self::c1 = <dynamic>[];
self::c1 = <dynamic, dynamic>{};
self::c1 = <dynamic, dynamic>{} as{TypeError} core::List<dynamic>;
self::c2 = <dynamic>[];
self::c2 = <dynamic, dynamic>{};
self::c2 = <dynamic, dynamic>{} as{TypeError} core::List<dynamic>;
self::d = <dynamic, dynamic>{};
self::d = 3;
self::d = 3 as{TypeError} core::Map<dynamic, dynamic>;
self::e = new self::A::•();
self::e = <dynamic, dynamic>{};
self::e = <dynamic, dynamic>{} as{TypeError} self::A;
self::f = 3;
self::f = false;
self::f = false as{TypeError} core::int;
self::g = 1;
self::g = false;
self::h = false;
self::g = false as{TypeError} core::int;
self::h = false as{TypeError} self::B;
self::h = new self::B::•("b");
self::i = false;
self::j = new self::B::•("b");
self::j = false;
self::j = <dynamic>[];
self::j = false as{TypeError} self::B;
self::j = <dynamic>[] as{TypeError} self::B;
}
static method main() → dynamic {}

View file

@ -5,7 +5,7 @@ import "dart:core" as core;
static field core::int y = inf::x;
static method test1() → dynamic {
inf::x = "hi";
self::y = "hi";
inf::x = "hi" as{TypeError} core::int;
self::y = "hi" as{TypeError} core::int;
}
static method main() → dynamic {}

View file

@ -10,7 +10,7 @@ class B extends core::Object {
;
}
static method test1() → dynamic {
inf::A::x = "hi";
self::B::y = "hi";
inf::A::x = "hi" as{TypeError} core::int;
self::B::y = "hi" as{TypeError} core::int;
}
static method main() → dynamic {}

View file

@ -10,6 +10,4 @@ test1() {
x = /*error:INVALID_ASSIGNMENT*/ "hi";
}
main() {
test1();
}
main() {}

View file

@ -6,6 +6,4 @@ static method test1() → dynamic {
core::int x = 3;
x = "hi";
}
static method main() → dynamic {
self::test1();
}
static method main() → dynamic {}

View file

@ -4,8 +4,6 @@ import "dart:core" as core;
static method test1() → dynamic {
core::int x = 3;
x = "hi";
}
static method main() → dynamic {
self::test1();
x = "hi" as{TypeError} core::int;
}
static method main() → dynamic {}

View file

@ -10,6 +10,4 @@ test2() {
x = /*error:INVALID_ASSIGNMENT*/ "hi";
}
main() {
test2();
}
main() {}

View file

@ -5,6 +5,4 @@ static method test2() → dynamic {
dynamic x = 3;
x = "hi";
}
static method main() → dynamic {
self::test2();
}
static method main() → dynamic {}

View file

@ -4,8 +4,6 @@ import "dart:core" as core;
static method test2() → dynamic {
core::int x = 3;
x = "hi";
}
static method main() → dynamic {
self::test2();
x = "hi" as{TypeError} core::int;
}
static method main() → dynamic {}

View file

@ -11,13 +11,13 @@ class A extends core::Object {
;
method test1() → dynamic {
core::int a = this.{self::A::x};
a = "hi";
a = "hi" as{TypeError} core::int;
a = 3;
core::int b = this.{self::A::y};
b = "hi";
b = "hi" as{TypeError} core::int;
b = 4;
core::int c = this.{self::A::z};
c = "hi";
c = "hi" as{TypeError} core::int;
c = 4;
}
}

View file

@ -22,6 +22,4 @@ test1() {
int y = 0; // field def after use
final /*@topType=int*/ z = 42; // should infer `int`
main() {
test1();
}
main() {}

View file

@ -16,6 +16,4 @@ static method test1() → dynamic {
c = "hi";
c = 4;
}
static method main() → dynamic {
self::test1();
}
static method main() → dynamic {}

View file

@ -7,15 +7,13 @@ static field core::int y = 0;
static final field core::int z = 42;
static method test1() → dynamic {
core::int a = self::x;
a = "hi";
a = "hi" as{TypeError} core::int;
a = 3;
core::int b = self::y;
b = "hi";
b = "hi" as{TypeError} core::int;
b = 4;
core::int c = self::z;
c = "hi";
c = "hi" as{TypeError} core::int;
c = 4;
}
static method main() → dynamic {
self::test1();
}
static method main() → dynamic {}

View file

@ -7,7 +7,7 @@ static method test1() → dynamic {
x.{core::Map::[]=}(3, "z");
x.{core::Map::[]=}("hi", "w");
x.{core::Map::[]=}(4.0, "u");
x.{core::Map::[]=}(3, 42);
x.{core::Map::[]=}(3, 42 as{TypeError} core::String);
core::Map<core::num, core::String> y = x;
}
static method test2() → dynamic {
@ -15,7 +15,7 @@ static method test2() → dynamic {
x.{core::Map::[]=}(3, "z");
x.{core::Map::[]=}("hi", "w");
x.{core::Map::[]=}(4.0, "u");
x.{core::Map::[]=}(3, 42);
x.{core::Map::[]=}(3, 42 as{TypeError} core::Pattern);
core::Pattern p = null;
x.{core::Map::[]=}(2, p);
core::Map<core::int, core::String> y = x;

View file

@ -4,6 +4,6 @@ import "dart:core" as core;
static method test1() → dynamic {
core::Map<core::Null, core::Null> x = <core::Null, core::Null>{null: null};
x.{core::Map::[]=}(3, "z");
x.{core::Map::[]=}(3, "z" as{TypeError} core::Null);
}
static method main() → dynamic {}

View file

@ -8,14 +8,14 @@ static method test1() → dynamic {
self::x1.{core::Map::[]=}(3, "z");
self::x1.{core::Map::[]=}("hi", "w");
self::x1.{core::Map::[]=}(4.0, "u");
self::x1.{core::Map::[]=}(3, 42);
self::x1.{core::Map::[]=}(3, 42 as{TypeError} core::String);
core::Map<core::num, core::String> y = self::x1;
}
static method test2() → dynamic {
self::x2.{core::Map::[]=}(3, "z");
self::x2.{core::Map::[]=}("hi", "w");
self::x2.{core::Map::[]=}(4.0, "u");
self::x2.{core::Map::[]=}(3, 42);
self::x2.{core::Map::[]=}(3, 42 as{TypeError} core::Pattern);
core::Pattern p = null;
self::x2.{core::Map::[]=}(2, p);
core::Map<core::int, core::String> y = self::x2;

View file

@ -10,8 +10,8 @@ class A extends core::Object {
}
static method test5() → dynamic {
self::A a1 = new self::A::•();
a1.{self::A::x} = "hi";
a1.{self::A::x} = "hi" as{TypeError} core::int;
self::A a2 = new self::A::•();
a2.{self::A::x} = "hi";
a2.{self::A::x} = "hi" as{TypeError} core::int;
}
static method main() → dynamic {}

View file

@ -19,7 +19,7 @@ abstract class Test1 extends self::Base<core::int, core::int> {
;
method test() → void {
core::int v1 = let final core::String #t1 = "x" in let final core::int #t2 = self::getInt() in let final void #t3 = super.{self::Base::[]=}(#t1, #t2) in #t2;
core::num v2 = let final core::String #t4 = "x" in let final core::num #t5 = self::getNum() in let final void #t6 = super.{self::Base::[]=}(#t4, #t5) in #t5;
core::num v2 = let final core::String #t4 = "x" in let final core::int #t5 = self::getNum() as{TypeError} core::int in let final void #t6 = super.{self::Base::[]=}(#t4, #t5) in #t5;
core::int v4 = let final core::String #t7 = "x" in let final core::int #t8 = super.{self::Base::[]}(#t7) in #t8.{core::num::==}(null) ?{core::int} let final core::int #t9 = self::getInt() in let final void #t10 = super.{self::Base::[]=}(#t7, #t9) in #t9 : #t8;
core::num v5 = let final core::String #t11 = "x" in let final core::int #t12 = super.{self::Base::[]}(#t11) in #t12.{core::num::==}(null) ?{core::num} let final core::num #t13 = self::getNum() in let final void #t14 = super.{self::Base::[]=}(#t11, #t13) in #t13 : #t12;
core::int v7 = let final core::String #t15 = "x" in let final core::int #t16 = super.{self::Base::[]}(#t15).{core::num::+}(self::getInt()) in let final void #t17 = super.{self::Base::[]=}(#t15, #t16) in #t16;
@ -55,7 +55,7 @@ abstract class Test3 extends self::Base<core::int, core::double> {
: super self::Base::•()
;
method test() → void {
core::num v2 = let final core::String #t63 = "x" in let final core::num #t64 = self::getNum() in let final void #t65 = super.{self::Base::[]=}(#t63, #t64) in #t64;
core::num v2 = let final core::String #t63 = "x" in let final core::double #t64 = self::getNum() as{TypeError} core::double in let final void #t65 = super.{self::Base::[]=}(#t63, #t64) in #t64;
core::double v3 = let final core::String #t66 = "x" in let final core::double #t67 = self::getDouble() in let final void #t68 = super.{self::Base::[]=}(#t66, #t67) in #t67;
core::num v5 = let final core::String #t69 = "x" in let final core::int #t70 = super.{self::Base::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num} let final core::num #t71 = self::getNum() in let final void #t72 = super.{self::Base::[]=}(#t69, #t71) in #t71 : #t70;
core::num v6 = let final core::String #t73 = "x" in let final core::int #t74 = super.{self::Base::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num} let final core::double #t75 = self::getDouble() in let final void #t76 = super.{self::Base::[]=}(#t73, #t75) in #t75 : #t74;
@ -74,7 +74,7 @@ abstract class Test4 extends self::Base<core::num, core::int> {
;
method test() → void {
core::int v1 = let final core::String #t92 = "x" in let final core::int #t93 = self::getInt() in let final void #t94 = super.{self::Base::[]=}(#t92, #t93) in #t93;
core::num v2 = let final core::String #t95 = "x" in let final core::num #t96 = self::getNum() in let final void #t97 = super.{self::Base::[]=}(#t95, #t96) in #t96;
core::num v2 = let final core::String #t95 = "x" in let final core::int #t96 = self::getNum() as{TypeError} core::int in let final void #t97 = super.{self::Base::[]=}(#t95, #t96) in #t96;
core::num v4 = let final core::String #t98 = "x" in let final core::num #t99 = super.{self::Base::[]}(#t98) in #t99.{core::num::==}(null) ?{core::num} let final core::int #t100 = self::getInt() in let final void #t101 = super.{self::Base::[]=}(#t98, #t100) in #t100 : #t99;
core::num v5 = let final core::String #t102 = "x" in let final core::num #t103 = super.{self::Base::[]}(#t102) in #t103.{core::num::==}(null) ?{core::num} let final core::num #t104 = self::getNum() in let final void #t105 = super.{self::Base::[]=}(#t102, #t104) in #t104 : #t103;
core::num v7 = let final core::String #t106 = "x" in let final core::num #t107 = super.{self::Base::[]}(#t106).{core::num::+}(self::getInt()) in let final void #t108 = super.{self::Base::[]=}(#t106, #t107) in #t107;
@ -110,7 +110,7 @@ abstract class Test6 extends self::Base<core::num, core::double> {
: super self::Base::•()
;
method test() → void {
core::num v2 = let final core::String #t154 = "x" in let final core::num #t155 = self::getNum() in let final void #t156 = super.{self::Base::[]=}(#t154, #t155) in #t155;
core::num v2 = let final core::String #t154 = "x" in let final core::double #t155 = self::getNum() as{TypeError} core::double in let final void #t156 = super.{self::Base::[]=}(#t154, #t155) in #t155;
core::double v3 = let final core::String #t157 = "x" in let final core::double #t158 = self::getDouble() in let final void #t159 = super.{self::Base::[]=}(#t157, #t158) in #t158;
core::num v5 = let final core::String #t160 = "x" in let final core::num #t161 = super.{self::Base::[]}(#t160) in #t161.{core::num::==}(null) ?{core::num} let final core::num #t162 = self::getNum() in let final void #t163 = super.{self::Base::[]=}(#t160, #t162) in #t162 : #t161;
core::num v6 = let final core::String #t164 = "x" in let final core::num #t165 = super.{self::Base::[]}(#t164) in #t165.{core::num::==}(null) ?{core::num} let final core::double #t166 = self::getDouble() in let final void #t167 = super.{self::Base::[]=}(#t164, #t166) in #t166 : #t165;
@ -129,7 +129,7 @@ abstract class Test7 extends self::Base<core::double, core::int> {
;
method test() → void {
core::int v1 = let final core::String #t183 = "x" in let final core::int #t184 = self::getInt() in let final void #t185 = super.{self::Base::[]=}(#t183, #t184) in #t184;
core::num v2 = let final core::String #t186 = "x" in let final core::num #t187 = self::getNum() in let final void #t188 = super.{self::Base::[]=}(#t186, #t187) in #t187;
core::num v2 = let final core::String #t186 = "x" in let final core::int #t187 = self::getNum() as{TypeError} core::int in let final void #t188 = super.{self::Base::[]=}(#t186, #t187) in #t187;
core::num v4 = let final core::String #t189 = "x" in let final core::double #t190 = super.{self::Base::[]}(#t189) in #t190.{core::num::==}(null) ?{core::num} let final core::int #t191 = self::getInt() in let final void #t192 = super.{self::Base::[]=}(#t189, #t191) in #t191 : #t190;
core::num v5 = let final core::String #t193 = "x" in let final core::double #t194 = super.{self::Base::[]}(#t193) in #t194.{core::num::==}(null) ?{core::num} let final core::num #t195 = self::getNum() in let final void #t196 = super.{self::Base::[]=}(#t193, #t195) in #t195 : #t194;
core::double v7 = let final core::String #t197 = "x" in let final core::double #t198 = super.{self::Base::[]}(#t197).{core::double::+}(self::getInt()) in let final void #t199 = super.{self::Base::[]=}(#t197, #t198) in #t198;
@ -165,7 +165,7 @@ abstract class Test9 extends self::Base<core::double, core::double> {
: super self::Base::•()
;
method test() → void {
core::num v2 = let final core::String #t245 = "x" in let final core::num #t246 = self::getNum() in let final void #t247 = super.{self::Base::[]=}(#t245, #t246) in #t246;
core::num v2 = let final core::String #t245 = "x" in let final core::double #t246 = self::getNum() as{TypeError} core::double in let final void #t247 = super.{self::Base::[]=}(#t245, #t246) in #t246;
core::double v3 = let final core::String #t248 = "x" in let final core::double #t249 = self::getDouble() in let final void #t250 = super.{self::Base::[]=}(#t248, #t249) in #t249;
core::num v5 = let final core::String #t251 = "x" in let final core::double #t252 = super.{self::Base::[]}(#t251) in #t252.{core::num::==}(null) ?{core::num} let final core::num #t253 = self::getNum() in let final void #t254 = super.{self::Base::[]=}(#t251, #t253) in #t253 : #t252;
core::double v6 = let final core::String #t255 = "x" in let final core::double #t256 = super.{self::Base::[]}(#t255) in #t256.{core::num::==}(null) ?{core::double} let final core::double #t257 = self::getDouble() in let final void #t258 = super.{self::Base::[]=}(#t255, #t257) in #t257 : #t256;

View file

@ -10,7 +10,7 @@ abstract class Test1 extends core::Object {
abstract operator []=(core::String s, core::int v) → void;
method test() → void {
core::int v1 = let final core::String #t1 = "x" in let final core::int #t2 = self::getInt() in let final void #t3 = this.{self::Test1::[]=}(#t1, #t2) in #t2;
core::num v2 = let final core::String #t4 = "x" in let final core::num #t5 = self::getNum() in let final void #t6 = this.{self::Test1::[]=}(#t4, #t5) in #t5;
core::num v2 = let final core::String #t4 = "x" in let final core::int #t5 = self::getNum() as{TypeError} core::int in let final void #t6 = this.{self::Test1::[]=}(#t4, #t5) in #t5;
core::int v4 = let final core::String #t7 = "x" in let final core::int #t8 = this.{self::Test1::[]}(#t7) in #t8.{core::num::==}(null) ?{core::int} let final core::int #t9 = self::getInt() in let final void #t10 = this.{self::Test1::[]=}(#t7, #t9) in #t9 : #t8;
core::num v5 = let final core::String #t11 = "x" in let final core::int #t12 = this.{self::Test1::[]}(#t11) in #t12.{core::num::==}(null) ?{core::num} let final core::num #t13 = self::getNum() in let final void #t14 = this.{self::Test1::[]=}(#t11, #t13) in #t13 : #t12;
core::int v7 = let final core::String #t15 = "x" in let final core::int #t16 = this.{self::Test1::[]}(#t15).{core::num::+}(self::getInt()) in let final void #t17 = this.{self::Test1::[]=}(#t15, #t16) in #t16;
@ -46,7 +46,7 @@ abstract class Test3 extends core::Object {
abstract operator [](core::String s) → core::int;
abstract operator []=(core::String s, core::double v) → void;
method test() → void {
core::num v2 = let final core::String #t63 = "x" in let final core::num #t64 = self::getNum() in let final void #t65 = this.{self::Test3::[]=}(#t63, #t64) in #t64;
core::num v2 = let final core::String #t63 = "x" in let final core::double #t64 = self::getNum() as{TypeError} core::double in let final void #t65 = this.{self::Test3::[]=}(#t63, #t64) in #t64;
core::double v3 = let final core::String #t66 = "x" in let final core::double #t67 = self::getDouble() in let final void #t68 = this.{self::Test3::[]=}(#t66, #t67) in #t67;
core::num v5 = let final core::String #t69 = "x" in let final core::int #t70 = this.{self::Test3::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num} let final core::num #t71 = self::getNum() in let final void #t72 = this.{self::Test3::[]=}(#t69, #t71) in #t71 : #t70;
core::num v6 = let final core::String #t73 = "x" in let final core::int #t74 = this.{self::Test3::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num} let final core::double #t75 = self::getDouble() in let final void #t76 = this.{self::Test3::[]=}(#t73, #t75) in #t75 : #t74;
@ -65,7 +65,7 @@ abstract class Test4 extends core::Object {
abstract operator []=(core::String s, core::int v) → void;
method test() → void {
core::int v1 = let final core::String #t92 = "x" in let final core::int #t93 = self::getInt() in let final void #t94 = this.{self::Test4::[]=}(#t92, #t93) in #t93;
core::num v2 = let final core::String #t95 = "x" in let final core::num #t96 = self::getNum() in let final void #t97 = this.{self::Test4::[]=}(#t95, #t96) in #t96;
core::num v2 = let final core::String #t95 = "x" in let final core::int #t96 = self::getNum() as{TypeError} core::int in let final void #t97 = this.{self::Test4::[]=}(#t95, #t96) in #t96;
core::num v4 = let final core::String #t98 = "x" in let final core::num #t99 = this.{self::Test4::[]}(#t98) in #t99.{core::num::==}(null) ?{core::num} let final core::int #t100 = self::getInt() in let final void #t101 = this.{self::Test4::[]=}(#t98, #t100) in #t100 : #t99;
core::num v5 = let final core::String #t102 = "x" in let final core::num #t103 = this.{self::Test4::[]}(#t102) in #t103.{core::num::==}(null) ?{core::num} let final core::num #t104 = self::getNum() in let final void #t105 = this.{self::Test4::[]=}(#t102, #t104) in #t104 : #t103;
core::num v7 = let final core::String #t106 = "x" in let final core::num #t107 = this.{self::Test4::[]}(#t106).{core::num::+}(self::getInt()) in let final void #t108 = this.{self::Test4::[]=}(#t106, #t107) in #t107;
@ -101,7 +101,7 @@ abstract class Test6 extends core::Object {
abstract operator [](core::String s) → core::num;
abstract operator []=(core::String s, core::double v) → void;
method test() → void {
core::num v2 = let final core::String #t154 = "x" in let final core::num #t155 = self::getNum() in let final void #t156 = this.{self::Test6::[]=}(#t154, #t155) in #t155;
core::num v2 = let final core::String #t154 = "x" in let final core::double #t155 = self::getNum() as{TypeError} core::double in let final void #t156 = this.{self::Test6::[]=}(#t154, #t155) in #t155;
core::double v3 = let final core::String #t157 = "x" in let final core::double #t158 = self::getDouble() in let final void #t159 = this.{self::Test6::[]=}(#t157, #t158) in #t158;
core::num v5 = let final core::String #t160 = "x" in let final core::num #t161 = this.{self::Test6::[]}(#t160) in #t161.{core::num::==}(null) ?{core::num} let final core::num #t162 = self::getNum() in let final void #t163 = this.{self::Test6::[]=}(#t160, #t162) in #t162 : #t161;
core::num v6 = let final core::String #t164 = "x" in let final core::num #t165 = this.{self::Test6::[]}(#t164) in #t165.{core::num::==}(null) ?{core::num} let final core::double #t166 = self::getDouble() in let final void #t167 = this.{self::Test6::[]=}(#t164, #t166) in #t166 : #t165;
@ -120,7 +120,7 @@ abstract class Test7 extends core::Object {
abstract operator []=(core::String s, core::int v) → void;
method test() → void {
core::int v1 = let final core::String #t183 = "x" in let final core::int #t184 = self::getInt() in let final void #t185 = this.{self::Test7::[]=}(#t183, #t184) in #t184;
core::num v2 = let final core::String #t186 = "x" in let final core::num #t187 = self::getNum() in let final void #t188 = this.{self::Test7::[]=}(#t186, #t187) in #t187;
core::num v2 = let final core::String #t186 = "x" in let final core::int #t187 = self::getNum() as{TypeError} core::int in let final void #t188 = this.{self::Test7::[]=}(#t186, #t187) in #t187;
core::num v4 = let final core::String #t189 = "x" in let final core::double #t190 = this.{self::Test7::[]}(#t189) in #t190.{core::num::==}(null) ?{core::num} let final core::int #t191 = self::getInt() in let final void #t192 = this.{self::Test7::[]=}(#t189, #t191) in #t191 : #t190;
core::num v5 = let final core::String #t193 = "x" in let final core::double #t194 = this.{self::Test7::[]}(#t193) in #t194.{core::num::==}(null) ?{core::num} let final core::num #t195 = self::getNum() in let final void #t196 = this.{self::Test7::[]=}(#t193, #t195) in #t195 : #t194;
core::double v7 = let final core::String #t197 = "x" in let final core::double #t198 = this.{self::Test7::[]}(#t197).{core::double::+}(self::getInt()) in let final void #t199 = this.{self::Test7::[]=}(#t197, #t198) in #t198;
@ -156,7 +156,7 @@ abstract class Test9 extends core::Object {
abstract operator [](core::String s) → core::double;
abstract operator []=(core::String s, core::double v) → void;
method test() → void {
core::num v2 = let final core::String #t245 = "x" in let final core::num #t246 = self::getNum() in let final void #t247 = this.{self::Test9::[]=}(#t245, #t246) in #t246;
core::num v2 = let final core::String #t245 = "x" in let final core::double #t246 = self::getNum() as{TypeError} core::double in let final void #t247 = this.{self::Test9::[]=}(#t245, #t246) in #t246;
core::double v3 = let final core::String #t248 = "x" in let final core::double #t249 = self::getDouble() in let final void #t250 = this.{self::Test9::[]=}(#t248, #t249) in #t249;
core::num v5 = let final core::String #t251 = "x" in let final core::double #t252 = this.{self::Test9::[]}(#t251) in #t252.{core::num::==}(null) ?{core::num} let final core::num #t253 = self::getNum() in let final void #t254 = this.{self::Test9::[]=}(#t251, #t253) in #t253 : #t252;
core::double v6 = let final core::String #t255 = "x" in let final core::double #t256 = this.{self::Test9::[]}(#t255) in #t256.{core::num::==}(null) ?{core::double} let final core::double #t257 = self::getDouble() in let final void #t258 = this.{self::Test9::[]=}(#t255, #t257) in #t257 : #t256;

View file

@ -17,7 +17,7 @@ static method getDouble() → core::double
return 0.0;
static method test1(self::Test<core::int, core::int> t) → void {
core::int v1 = let final self::Test<core::int, core::int> #t1 = t in let final core::String #t2 = "x" in let final core::int #t3 = self::getInt() in let final void #t4 = #t1.{self::Test::[]=}(#t2, #t3) in #t3;
core::num v2 = let final self::Test<core::int, core::int> #t5 = t in let final core::String #t6 = "x" in let final core::num #t7 = self::getNum() in let final void #t8 = #t5.{self::Test::[]=}(#t6, #t7) in #t7;
core::num v2 = let final self::Test<core::int, core::int> #t5 = t in let final core::String #t6 = "x" in let final core::int #t7 = self::getNum() as{TypeError} core::int in let final void #t8 = #t5.{self::Test::[]=}(#t6, #t7) in #t7;
core::int v4 = let final self::Test<core::int, core::int> #t9 = t in let final core::String #t10 = "x" in let final core::int #t11 = #t9.{self::Test::[]}(#t10) in #t11.{core::num::==}(null) ?{core::int} let final core::int #t12 = self::getInt() in let final void #t13 = #t9.{self::Test::[]=}(#t10, #t12) in #t12 : #t11;
core::num v5 = let final self::Test<core::int, core::int> #t14 = t in let final core::String #t15 = "x" in let final core::int #t16 = #t14.{self::Test::[]}(#t15) in #t16.{core::num::==}(null) ?{core::num} let final core::num #t17 = self::getNum() in let final void #t18 = #t14.{self::Test::[]=}(#t15, #t17) in #t17 : #t16;
core::int v7 = let final self::Test<core::int, core::int> #t19 = t in let final core::String #t20 = "x" in let final core::int #t21 = #t19.{self::Test::[]}(#t20).{core::num::+}(self::getInt()) in let final void #t22 = #t19.{self::Test::[]=}(#t20, #t21) in #t21;
@ -39,7 +39,7 @@ static method test2(self::Test<core::int, core::num> t) → void {
core::int v11 = let final self::Test<core::int, core::num> #t78 = t in let final core::String #t79 = "x" in let final core::int #t80 = #t78.{self::Test::[]}(#t79) in let final void #t81 = #t78.{self::Test::[]=}(#t79, #t80.{core::num::+}(1)) in #t80;
}
static method test3(self::Test<core::int, core::double> t) → void {
core::num v2 = let final self::Test<core::int, core::double> #t82 = t in let final core::String #t83 = "x" in let final core::num #t84 = self::getNum() in let final void #t85 = #t82.{self::Test::[]=}(#t83, #t84) in #t84;
core::num v2 = let final self::Test<core::int, core::double> #t82 = t in let final core::String #t83 = "x" in let final core::double #t84 = self::getNum() as{TypeError} core::double in let final void #t85 = #t82.{self::Test::[]=}(#t83, #t84) in #t84;
core::double v3 = let final self::Test<core::int, core::double> #t86 = t in let final core::String #t87 = "x" in let final core::double #t88 = self::getDouble() in let final void #t89 = #t86.{self::Test::[]=}(#t87, #t88) in #t88;
core::num v5 = let final self::Test<core::int, core::double> #t90 = t in let final core::String #t91 = "x" in let final core::int #t92 = #t90.{self::Test::[]}(#t91) in #t92.{core::num::==}(null) ?{core::num} let final core::num #t93 = self::getNum() in let final void #t94 = #t90.{self::Test::[]=}(#t91, #t93) in #t93 : #t92;
core::num v6 = let final self::Test<core::int, core::double> #t95 = t in let final core::String #t96 = "x" in let final core::int #t97 = #t95.{self::Test::[]}(#t96) in #t97.{core::num::==}(null) ?{core::num} let final core::double #t98 = self::getDouble() in let final void #t99 = #t95.{self::Test::[]=}(#t96, #t98) in #t98 : #t97;
@ -51,7 +51,7 @@ static method test3(self::Test<core::int, core::double> t) → void {
}
static method test4(self::Test<core::num, core::int> t) → void {
core::int v1 = let final self::Test<core::num, core::int> #t120 = t in let final core::String #t121 = "x" in let final core::int #t122 = self::getInt() in let final void #t123 = #t120.{self::Test::[]=}(#t121, #t122) in #t122;
core::num v2 = let final self::Test<core::num, core::int> #t124 = t in let final core::String #t125 = "x" in let final core::num #t126 = self::getNum() in let final void #t127 = #t124.{self::Test::[]=}(#t125, #t126) in #t126;
core::num v2 = let final self::Test<core::num, core::int> #t124 = t in let final core::String #t125 = "x" in let final core::int #t126 = self::getNum() as{TypeError} core::int in let final void #t127 = #t124.{self::Test::[]=}(#t125, #t126) in #t126;
core::num v4 = let final self::Test<core::num, core::int> #t128 = t in let final core::String #t129 = "x" in let final core::num #t130 = #t128.{self::Test::[]}(#t129) in #t130.{core::num::==}(null) ?{core::num} let final core::int #t131 = self::getInt() in let final void #t132 = #t128.{self::Test::[]=}(#t129, #t131) in #t131 : #t130;
core::num v5 = let final self::Test<core::num, core::int> #t133 = t in let final core::String #t134 = "x" in let final core::num #t135 = #t133.{self::Test::[]}(#t134) in #t135.{core::num::==}(null) ?{core::num} let final core::num #t136 = self::getNum() in let final void #t137 = #t133.{self::Test::[]=}(#t134, #t136) in #t136 : #t135;
core::num v7 = let final self::Test<core::num, core::int> #t138 = t in let final core::String #t139 = "x" in let final core::num #t140 = #t138.{self::Test::[]}(#t139).{core::num::+}(self::getInt()) in let final void #t141 = #t138.{self::Test::[]=}(#t139, #t140) in #t140;
@ -73,7 +73,7 @@ static method test5(self::Test<core::num, core::num> t) → void {
core::num v11 = let final self::Test<core::num, core::num> #t197 = t in let final core::String #t198 = "x" in let final core::num #t199 = #t197.{self::Test::[]}(#t198) in let final void #t200 = #t197.{self::Test::[]=}(#t198, #t199.{core::num::+}(1)) in #t199;
}
static method test6(self::Test<core::num, core::double> t) → void {
core::num v2 = let final self::Test<core::num, core::double> #t201 = t in let final core::String #t202 = "x" in let final core::num #t203 = self::getNum() in let final void #t204 = #t201.{self::Test::[]=}(#t202, #t203) in #t203;
core::num v2 = let final self::Test<core::num, core::double> #t201 = t in let final core::String #t202 = "x" in let final core::double #t203 = self::getNum() as{TypeError} core::double in let final void #t204 = #t201.{self::Test::[]=}(#t202, #t203) in #t203;
core::double v3 = let final self::Test<core::num, core::double> #t205 = t in let final core::String #t206 = "x" in let final core::double #t207 = self::getDouble() in let final void #t208 = #t205.{self::Test::[]=}(#t206, #t207) in #t207;
core::num v5 = let final self::Test<core::num, core::double> #t209 = t in let final core::String #t210 = "x" in let final core::num #t211 = #t209.{self::Test::[]}(#t210) in #t211.{core::num::==}(null) ?{core::num} let final core::num #t212 = self::getNum() in let final void #t213 = #t209.{self::Test::[]=}(#t210, #t212) in #t212 : #t211;
core::num v6 = let final self::Test<core::num, core::double> #t214 = t in let final core::String #t215 = "x" in let final core::num #t216 = #t214.{self::Test::[]}(#t215) in #t216.{core::num::==}(null) ?{core::num} let final core::double #t217 = self::getDouble() in let final void #t218 = #t214.{self::Test::[]=}(#t215, #t217) in #t217 : #t216;
@ -85,7 +85,7 @@ static method test6(self::Test<core::num, core::double> t) → void {
}
static method test7(self::Test<core::double, core::int> t) → void {
core::int v1 = let final self::Test<core::double, core::int> #t239 = t in let final core::String #t240 = "x" in let final core::int #t241 = self::getInt() in let final void #t242 = #t239.{self::Test::[]=}(#t240, #t241) in #t241;
core::num v2 = let final self::Test<core::double, core::int> #t243 = t in let final core::String #t244 = "x" in let final core::num #t245 = self::getNum() in let final void #t246 = #t243.{self::Test::[]=}(#t244, #t245) in #t245;
core::num v2 = let final self::Test<core::double, core::int> #t243 = t in let final core::String #t244 = "x" in let final core::int #t245 = self::getNum() as{TypeError} core::int in let final void #t246 = #t243.{self::Test::[]=}(#t244, #t245) in #t245;
core::num v4 = let final self::Test<core::double, core::int> #t247 = t in let final core::String #t248 = "x" in let final core::double #t249 = #t247.{self::Test::[]}(#t248) in #t249.{core::num::==}(null) ?{core::num} let final core::int #t250 = self::getInt() in let final void #t251 = #t247.{self::Test::[]=}(#t248, #t250) in #t250 : #t249;
core::num v5 = let final self::Test<core::double, core::int> #t252 = t in let final core::String #t253 = "x" in let final core::double #t254 = #t252.{self::Test::[]}(#t253) in #t254.{core::num::==}(null) ?{core::num} let final core::num #t255 = self::getNum() in let final void #t256 = #t252.{self::Test::[]=}(#t253, #t255) in #t255 : #t254;
core::double v7 = let final self::Test<core::double, core::int> #t257 = t in let final core::String #t258 = "x" in let final core::double #t259 = #t257.{self::Test::[]}(#t258).{core::double::+}(self::getInt()) in let final void #t260 = #t257.{self::Test::[]=}(#t258, #t259) in #t259;
@ -107,7 +107,7 @@ static method test8(self::Test<core::double, core::num> t) → void {
core::double v11 = let final self::Test<core::double, core::num> #t316 = t in let final core::String #t317 = "x" in let final core::double #t318 = #t316.{self::Test::[]}(#t317) in let final void #t319 = #t316.{self::Test::[]=}(#t317, #t318.{core::double::+}(1)) in #t318;
}
static method test9(self::Test<core::double, core::double> t) → void {
core::num v2 = let final self::Test<core::double, core::double> #t320 = t in let final core::String #t321 = "x" in let final core::num #t322 = self::getNum() in let final void #t323 = #t320.{self::Test::[]=}(#t321, #t322) in #t322;
core::num v2 = let final self::Test<core::double, core::double> #t320 = t in let final core::String #t321 = "x" in let final core::double #t322 = self::getNum() as{TypeError} core::double in let final void #t323 = #t320.{self::Test::[]=}(#t321, #t322) in #t322;
core::double v3 = let final self::Test<core::double, core::double> #t324 = t in let final core::String #t325 = "x" in let final core::double #t326 = self::getDouble() in let final void #t327 = #t324.{self::Test::[]=}(#t325, #t326) in #t326;
core::num v5 = let final self::Test<core::double, core::double> #t328 = t in let final core::String #t329 = "x" in let final core::double #t330 = #t328.{self::Test::[]}(#t329) in #t330.{core::num::==}(null) ?{core::num} let final core::num #t331 = self::getNum() in let final void #t332 = #t328.{self::Test::[]=}(#t329, #t331) in #t331 : #t330;
core::double v6 = let final self::Test<core::double, core::double> #t333 = t in let final core::String #t334 = "x" in let final core::double #t335 = #t333.{self::Test::[]}(#t334) in #t335.{core::num::==}(null) ?{core::double} let final core::double #t336 = self::getDouble() in let final void #t337 = #t333.{self::Test::[]=}(#t334, #t336) in #t336 : #t335;

View file

@ -717,7 +717,7 @@ class _HashSet<E> extends _HashSetBase<E> implements HashSet<E> {
int oldLength = _buckets.length;
int newLength = oldLength << 1;
List oldBuckets = _buckets;
List newBuckets = new List(newLength);
List newBuckets = new List<_HashSetEntry<E>>(newLength);
for (int i = 0; i < oldLength; i++) {
_HashSetEntry<E> entry = oldBuckets[i];
while (entry != null) {

View file

@ -7,7 +7,7 @@ import "package:expect/expect.dart";
// Dart test program to test type-based optimization on fields.
class A {
var a = 0;
dynamic a = 0;
var b = 0;
foo() {
var c = b + 27;

View file

@ -1106,7 +1106,7 @@ string_split_test: CompileTimeError
super_bound_closure_test/none: CompileTimeError
switch_case_test/none: CompileTimeError
vm/lazy_deopt_with_exception*: CompileTimeError
vm/lazy_deopt_with_exception_test: CompileTimeError
prefix6_negative_test: CompileTimeError, OK
void_type_function_types_test/none: CompileTimeError # Issue 30177
void_type_usage_test/param_as: CompileTimeError # Issue 30177

View file

@ -268,7 +268,6 @@ execute_finally6_test: RuntimeError # Issue 29920
expect_test: RuntimeError # Issue 29920
f_bounded_quantification3_test: RuntimeError # Issue 29920
field_increment_bailout_test: RuntimeError # Issue 29920
field_optimization3_test: RuntimeError # Issue 29920
flatten_test/05: MissingRuntimeError # Issue 29920
flatten_test/08: MissingRuntimeError # Issue 29920
flatten_test/09: MissingRuntimeError # Issue 29920
@ -331,7 +330,6 @@ left_shift_test: RuntimeError # Ints and doubles are unified.
expect_test: RuntimeError # Issue 29920
f_bounded_quantification3_test: RuntimeError # Issue 29920
truncdiv_test: RuntimeError # Issue 29920
field_optimization3_test: RuntimeError # Issue 29920
first_class_types_test: RuntimeError, OK # Strong mode reifies inferred type argument.
stacktrace_test: RuntimeError # Issue 29920
const_evaluation_test/01: RuntimeError # Issue 29920

View file

@ -781,7 +781,6 @@ type_variable_scope2_test: MissingCompileTimeError
type_variable_scope_test/00: MissingCompileTimeError
type_variable_scope_test/01: MissingCompileTimeError
type_variable_scope_test/02: MissingCompileTimeError
type_variable_scope_test/03: MissingCompileTimeError
type_variable_scope_test/04: MissingCompileTimeError
type_variable_scope_test/05: MissingCompileTimeError
type_variable_static_context_test: MissingCompileTimeError
@ -961,6 +960,7 @@ library_env_test/has_no_io_support: RuntimeError, OK
multiline_strings_test: Fail # Issue 23020
regress_19413_test: MissingCompileTimeError
regress_21793_test/01: MissingCompileTimeError
type_variable_scope_test/03: MissingCompileTimeError
unicode_bom_test: Fail # Issue 16067
vm/debug_break_enabled_vm_test/01: Crash, OK # Expected to hit breakpoint.

View file

@ -10,7 +10,7 @@
import 'package:expect/expect.dart';
class C {
var x = 42;
dynamic x = 42;
}
const NeverInline = "NeverInline";

View file

@ -10,7 +10,7 @@
import 'package:expect/expect.dart';
class C {
var x = 42;
dynamic x = 42;
}
const NeverInline = "NeverInline";

View file

@ -12,7 +12,7 @@ import 'package:expect/expect.dart';
class D {
var a = 0.0;
var b = 1.0;
var c = 2.0;
dynamic c = 2.0;
test() {
a = 0.0;
b = 1.0;
@ -46,7 +46,7 @@ testD() {
class F {
var a = new Float32x4.zero();
var b = new Float32x4(1.0, 2.0, 3.0, 4.0);
var c = new Float32x4.zero();
dynamic c = new Float32x4.zero();
test() {
a = new Float32x4.zero();
b = new Float32x4(1.0, 2.0, 3.0, 4.0);