1
0
mirror of https://github.com/dart-lang/sdk synced 2024-07-08 20:16:39 +00:00

Issue 52151. Fixes for reachability in switch patterns when unresolved / error type.

Bug: https://github.com/dart-lang/sdk/issues/52151
Change-Id: Ib56df1711cbfb7a593c7b16fd6a67e45baeabc3c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/302455
Reviewed-by: Paul Berry <paulberry@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Konstantin Shcheglov 2023-05-12 19:16:42 +00:00 committed by Commit Queue
parent 8d2b2a197d
commit c0d33e45d1
25 changed files with 383 additions and 253 deletions

View File

@ -39,6 +39,9 @@ abstract class TypeOperations<Type extends Object> {
/// Returns `true` if [type] is the `Never` type.
bool isNeverType(Type type);
/// Returns `true` if [type] is the `InvalidType` type.
bool isErrorType(Type type);
/// Returns `true` if [type] is the `Object?` type.
bool isNullableObject(Type type);
@ -163,7 +166,9 @@ class ExhaustivenessCache<
/// Returns the [StaticType] for [type].
StaticType getStaticType(Type type) {
if (typeOperations.isNeverType(type)) {
if (typeOperations.isErrorType(type)) {
return StaticType.errorType;
} else if (typeOperations.isNeverType(type)) {
return StaticType.neverType;
} else if (typeOperations.isNullType(type)) {
return StaticType.nullType;

View File

@ -22,6 +22,9 @@ abstract class StaticType {
/// Built-in `Never` type.
static const StaticType neverType = const _NeverType();
/// Built-in `Error` type.
static const StaticType errorType = const _ErrorType();
/// The static types of the fields this type exposes for record destructuring.
///
/// Includes inherited fields.
@ -274,6 +277,35 @@ class _NeverType extends _BaseStaticType with _ObjectFieldMixin {
}
}
class _ErrorType extends _BaseStaticType with _ObjectFieldMixin {
const _ErrorType();
@override
bool get isSealed => false;
@override
bool isSubtypeOf(StaticType other) {
return false;
}
@override
String get name => 'InvalidType';
@override
StaticType get nullable => this;
@override
StaticType get nonNullable => this;
@override
bool get isImplicitlyNullable => false;
@override
void typeToDart(DartTemplateBuffer buffer) {
buffer.writeCoreType(name);
}
}
class _NullType extends NullableStaticType with _ObjectFieldMixin {
const _NullType(super.underlying);

View File

@ -4489,6 +4489,11 @@ class _FlowAnalysisImpl<Node extends Object, Statement extends Node,
required Type knownType,
bool matchFailsIfWrongType = true,
bool matchMayFailEvenIfCorrectType = false}) {
if (operations.isError(knownType)) {
_unmatched = _join(_unmatched!, _current);
return false;
}
if (operations.classifyType(matchedType) ==
TypeClassification.nonNullable) {
// The matched type is non-nullable, so promote to a non-nullable type.

View File

@ -65,10 +65,7 @@ emptyNever(Never never) => /*type=Never*/ switch (never) { };
emptyUnresolved(
Unresolved
unresolved) => /*cfe.type=Never*/ /*analyzer.
checkingOrder={Object?,Object,Null},
error=non-exhaustive:Object(),
subtypes={Object,Null},
type=Object?
error=non-exhaustive:InvalidType(),type=InvalidType
*/
switch (unresolved) {
@ -77,10 +74,8 @@ emptyUnresolved(
nonEmptyUnresolved(
Unresolved
unresolved) => /*cfe.type=Never*/ /*analyzer.
checkingOrder={Object?,Object,Null},
subtypes={Object,Null},
type=Object?
error=non-exhaustive:InvalidType(),type=InvalidType
*/
switch (unresolved) {
_ /*cfe.space=∅*/ /*analyzer.space=()*/ => 0,
_ /*cfe.space=∅*/ /*analyzer.space=InvalidType*/ => 0,
};

View File

@ -39,25 +39,19 @@ exhaustiveTyped(
A<num>
a) => /*cfe.
fields={A<int>.member:void Function(int),A<num>.member:void Function(num)},
type=Never
type=A<num>
*/ /*analyzer.
checkingOrder={Object?,Object,Null},
error=non-exhaustive:Object(),
fields={A<int>.member:void Function(int),A<num>.member:void Function(num)},
subtypes={Object,Null},
type=Object?
type=A<num>
*/
switch (o) {
switch (a) {
A<int>(
:void Function(int) member
) /*cfe.space=Never(A<int>.member: void Function(int) (void Function(int)))*/ /*analyzer.space=A<int>(A<int>.member: void Function(int) (void Function(int)))*/ =>
) /*space=A<int>(A<int>.member: void Function(int) (void Function(int)))*/ =>
0,
A<num>(
:void Function(num) member
) /*cfe.
error=unreachable,
space=Never(A<num>.member: void Function(num) (void Function(num)))
*/ /*analyzer.space=A<num>(A<num>.member: void Function(num) (void Function(num)))*/ =>
) /*space=A<num>(A<num>.member: void Function(num) (void Function(num)))*/ =>
1,
};
@ -65,24 +59,21 @@ unreachable(
A<num>
a) => /*cfe.
fields={A<int>.member:void Function(int),A<num>.member:void Function(num)},
type=Never
type=A<num>
*/ /*analyzer.
checkingOrder={Object?,Object,Null},
error=non-exhaustive:Object(),
fields={A<int>.member:void Function(int),A<num>.member:void Function(num)},
subtypes={Object,Null},
type=Object?
type=A<num>
*/
switch (o) {
switch (a) {
A<num>(
:var member
) /*cfe.space=Never(A<num>.member: void Function(num) (void Function(num)))*/ /*analyzer.space=A<num>(A<num>.member: void Function(num) (void Function(num)))*/ =>
) /*space=A<num>(A<num>.member: void Function(num) (void Function(num)))*/ =>
1,
A<int>(
:var member
) /*cfe.
error=unreachable,
space=Never(A<int>.member: void Function(int) (void Function(int)))
space=A<int>(A<int>.member: void Function(int) (void Function(int)))
*/ /*analyzer.
error=unreachable,
space=A<int>(A<int>.member: void Function(int) (void Function(int)))
@ -95,24 +86,21 @@ nonExhaustiveRestricted(
A<num>
a) => /*cfe.
fields={A<int>.member:void Function(int),A<num>.member:void Function(num)},
type=Never
type=A<num>
*/ /*analyzer.
checkingOrder={Object?,Object,Null},
error=non-exhaustive:Object(),
fields={A<int>.member:void Function(int),A<num>.member:void Function(num)},
subtypes={Object,Null},
type=Object?
type=A<num>
*/
switch (o) {
switch (a) {
A<num>(
:void Function(num) member
) /*cfe.space=Never(A<num>.member: void Function(num) (void Function(num)))*/ /*analyzer.space=A<num>(A<num>.member: void Function(num) (void Function(num)))*/ =>
) /*space=A<num>(A<num>.member: void Function(num) (void Function(num)))*/ =>
1,
A<int>(
:var member
) /*cfe.
error=unreachable,
space=Never(A<int>.member: void Function(int) (void Function(int)))
space=A<int>(A<int>.member: void Function(int) (void Function(int)))
*/ /*analyzer.
error=unreachable,
space=A<int>(A<int>.member: void Function(int) (void Function(int)))

View File

@ -3,8 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:_fe_analyzer_shared/src/exhaustiveness/key.dart';
import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
import 'package:_fe_analyzer_shared/src/exhaustiveness/shared.dart';
import 'package:_fe_analyzer_shared/src/exhaustiveness/static_type.dart';
import 'package:_fe_analyzer_shared/src/exhaustiveness/types.dart';
class TestEnvironment implements ObjectPropertyLookup {
@ -136,11 +136,16 @@ class TestEnvironment implements ObjectPropertyLookup {
class _Type {
static const _InterfaceType Object = _InterfaceType(_Class.Object);
static const _Type NullableObject = _NullableType(_Type.Object);
static const _Type Error = _ErrorType();
static const _InterfaceType Never = _InterfaceType(_Class.Never);
static const _InterfaceType Bool = _InterfaceType(_Class.Bool);
static const _Type Null = _NullableType(_Type.Never);
}
class _ErrorType implements _Type {
const _ErrorType();
}
class _Class {
final String name;
final bool isSealed;
@ -302,6 +307,11 @@ class _TypeOperations implements TypeOperations<_Type> {
return type == _Type.Bool;
}
@override
bool isErrorType(_Type type) {
return type == _Type.Error;
}
@override
bool isNeverType(_Type type) {
return type == _Type.Never;

View File

@ -8660,6 +8660,21 @@ main() {
checkReachable(false),
]);
});
test('error type does not make following cases unreachable', () {
// We don't know the correct type, so recover by expecting that the
// following cases still will be useful once the error is fixed.
h.run([
switchExpr(expr('num'), [
wildcard(type: 'error').thenExpr(block([
checkReachable(true),
]).thenExpr(intLiteral(0))),
wildcard().thenExpr(block([
checkReachable(true),
]).thenExpr(intLiteral(1))),
]).stmt,
]);
});
});
group('Switch statement:', () {
@ -8967,6 +8982,21 @@ main() {
]);
});
test('error type does not make following cases unreachable', () {
// We don't know the correct type, so recover by expecting that the
// following cases still will be useful once the error is fixed.
h.run([
switch_(expr('num'), [
wildcard(type: 'error').then([
checkReachable(true),
]),
wildcard().then([
checkReachable(true),
]),
]),
]);
});
group('Joins promotions of scrutinee:', () {
test('First case more promoted', () {
var x = Var('x');

View File

@ -902,6 +902,7 @@ class MiniAstOperations
'bool <: bool': Type('bool'),
'dynamic <: int': Type('dynamic'),
'error <: int': Type('error'),
'error <: num': Type('error'),
'int <: dynamic': Type('int'),
'int <: num': Type('int'),
'int <: Object?': Type('int'),

View File

@ -131,6 +131,10 @@ class ConstantVerifier extends RecursiveAstVisitor<void> {
super.visitConstantPattern(node);
var expression = node.expression.unParenthesized;
if (expression.typeOrThrow is InvalidType) {
return;
}
DartObjectImpl? value = _validate(
expression,
CompileTimeErrorCode.CONSTANT_PATTERN_WITH_NON_CONSTANT_EXPRESSION,

View File

@ -323,7 +323,12 @@ class AnalyzerTypeOperations implements TypeOperations<DartType> {
@override
bool isDynamic(DartType type) {
return type is DynamicType || type is InvalidType;
return type is DynamicType;
}
@override
bool isErrorType(DartType type) {
return type is InvalidType;
}
@override

View File

@ -958,8 +958,6 @@ void f(Object? x) {
}
''', [
error(CompileTimeErrorCode.MISSING_VARIABLE_PATTERN, 56, 1),
error(CompileTimeErrorCode.CONSTANT_PATTERN_WITH_NON_CONSTANT_EXPRESSION,
56, 1),
error(CompileTimeErrorCode.REFERENCED_BEFORE_DECLARATION, 56, 1),
]);

View File

@ -567,4 +567,25 @@ void f<T>(x) {
28, 1),
]);
}
test_unresolvedIdentifier() async {
await assertErrorsInCode(r'''
void f(Object? x) {
if (x case foo) {}
}
''', [
error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 33, 3),
]);
final node = findNode.singleGuardedPattern;
assertResolvedNodeText(node, r'''
GuardedPattern
pattern: ConstantPattern
expression: SimpleIdentifier
token: foo
staticElement: <null>
staticType: InvalidType
matchedValueType: Object?
''');
}
}

View File

@ -58,8 +58,6 @@ int f(Object? x) {
}
''', [
error(CompileTimeErrorCode.UNDEFINED_CLASS, 45, 10),
error(WarningCode.DEAD_CODE, 68, 7),
error(WarningCode.UNREACHABLE_SWITCH_CASE, 70, 2),
]);
}
}
@ -82,6 +80,40 @@ void f(bool x) {
]);
}
test_const_unresolvedIdentifier_const() async {
await assertErrorsInCode(r'''
void f(Object? x) {
switch (x) {
case 0:
break;
case unresolved:
break;
case 2:
break;
};
}
''', [
error(CompileTimeErrorCode.UNDEFINED_IDENTIFIER, 69, 10),
]);
}
test_const_unresolvedObject_const() async {
await assertErrorsInCode(r'''
void f(Object? x) {
switch (x) {
case 0:
break;
case Unresolved():
break;
case 2:
break;
};
}
''', [
error(CompileTimeErrorCode.UNDEFINED_CLASS, 69, 10),
]);
}
test_typeCheck_exact() async {
await assertErrorsInCode(r'''
void f(int x) {

View File

@ -52,6 +52,11 @@ class CfeTypeOperations implements TypeOperations<DartType> {
ClassHierarchy get _classHierarchy => _typeEnvironment.hierarchy;
@override
bool isErrorType(DartType type) {
return type is InvalidType;
}
@override
DartType getNonNullable(DartType type) {
return type.toNonNull();

View File

@ -260,10 +260,10 @@ static method testUnresolved(dynamic o) → dynamic {
}
#L1:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t4 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t4 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L1;
}
@ -272,12 +272,12 @@ static method testUnresolved(dynamic o) → dynamic {
}
o = block {
core::String #t5;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L2:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t6 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t6 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t5 = "matched";
break #L2;
}
@ -315,10 +315,10 @@ static method testNonType(dynamic o) → dynamic {
}
#L3:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t10 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t10 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L3;
}
@ -327,12 +327,12 @@ static method testNonType(dynamic o) → dynamic {
}
o = block {
core::String #t11;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L4:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t12 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t12 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t11 = "matched";
break #L4;
}
@ -370,10 +370,10 @@ static method testExtension(dynamic o) → dynamic {
}
#L5:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t16 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t16 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L5;
}
@ -382,12 +382,12 @@ static method testExtension(dynamic o) → dynamic {
}
o = block {
core::String #t17;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L6:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t18 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t18 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t17 = "matched";
break #L6;
}
@ -425,10 +425,10 @@ static method testPrefixedUnresolved(dynamic o) → dynamic {
}
#L7:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t22 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t22 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L7;
}
@ -437,12 +437,12 @@ static method testPrefixedUnresolved(dynamic o) → dynamic {
}
o = block {
core::String #t23;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L8:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t24 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t24 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t23 = "matched";
break #L8;
}
@ -480,10 +480,10 @@ static method testPrefixedNonType(dynamic o) → dynamic {
}
#L9:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t28 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t28 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L9;
}
@ -492,12 +492,12 @@ static method testPrefixedNonType(dynamic o) → dynamic {
}
o = block {
core::String #t29;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L10:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t30 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t30 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t29 = "matched";
break #L10;
}
@ -535,10 +535,10 @@ static method testPrefixedExtension(dynamic o) → dynamic {
}
#L11:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t34 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t34 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L11;
}
@ -547,12 +547,12 @@ static method testPrefixedExtension(dynamic o) → dynamic {
}
o = block {
core::String #t35;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L12:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t36 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t36 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t35 = "matched";
break #L12;
}
@ -590,10 +590,10 @@ static method testUnresolvedPrefix(dynamic o) → dynamic {
}
#L13:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t40 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t40 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L13;
}
@ -602,12 +602,12 @@ static method testUnresolvedPrefix(dynamic o) → dynamic {
}
o = block {
core::String #t41;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L14:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t42 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t42 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t41 = "matched";
break #L14;
}
@ -645,10 +645,10 @@ static method testMemberAccess(dynamic o) → dynamic {
}
#L15:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t46 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t46 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L15;
}
@ -657,12 +657,12 @@ static method testMemberAccess(dynamic o) → dynamic {
}
o = block {
core::String #t47;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L16:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t48 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t48 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t47 = "matched";
break #L16;
}

View File

@ -262,10 +262,10 @@ static method testUnresolved(dynamic o) → dynamic {
}
#L1:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t4 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t4 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L1;
}
@ -274,12 +274,12 @@ static method testUnresolved(dynamic o) → dynamic {
}
o = block {
core::String #t5;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L2:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t6 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t6 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t5 = "matched";
break #L2;
}
@ -319,10 +319,10 @@ static method testNonType(dynamic o) → dynamic {
}
#L3:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t10 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t10 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L3;
}
@ -331,12 +331,12 @@ static method testNonType(dynamic o) → dynamic {
}
o = block {
core::String #t11;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L4:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t12 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t12 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t11 = "matched";
break #L4;
}
@ -376,10 +376,10 @@ static method testExtension(dynamic o) → dynamic {
}
#L5:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t16 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t16 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L5;
}
@ -388,12 +388,12 @@ static method testExtension(dynamic o) → dynamic {
}
o = block {
core::String #t17;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L6:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t18 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t18 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t17 = "matched";
break #L6;
}
@ -433,10 +433,10 @@ static method testPrefixedUnresolved(dynamic o) → dynamic {
}
#L7:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t22 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t22 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L7;
}
@ -445,12 +445,12 @@ static method testPrefixedUnresolved(dynamic o) → dynamic {
}
o = block {
core::String #t23;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L8:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t24 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t24 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t23 = "matched";
break #L8;
}
@ -490,10 +490,10 @@ static method testPrefixedNonType(dynamic o) → dynamic {
}
#L9:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t28 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t28 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L9;
}
@ -502,12 +502,12 @@ static method testPrefixedNonType(dynamic o) → dynamic {
}
o = block {
core::String #t29;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L10:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t30 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t30 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t29 = "matched";
break #L10;
}
@ -547,10 +547,10 @@ static method testPrefixedExtension(dynamic o) → dynamic {
}
#L11:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t34 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t34 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L11;
}
@ -559,12 +559,12 @@ static method testPrefixedExtension(dynamic o) → dynamic {
}
o = block {
core::String #t35;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L12:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t36 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t36 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t35 = "matched";
break #L12;
}
@ -604,10 +604,10 @@ static method testUnresolvedPrefix(dynamic o) → dynamic {
}
#L13:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t40 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t40 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L13;
}
@ -616,12 +616,12 @@ static method testUnresolvedPrefix(dynamic o) → dynamic {
}
o = block {
core::String #t41;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L14:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t42 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t42 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t41 = "matched";
break #L14;
}
@ -661,10 +661,10 @@ static method testMemberAccess(dynamic o) → dynamic {
}
#L15:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t46 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t46 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L15;
}
@ -673,12 +673,12 @@ static method testMemberAccess(dynamic o) → dynamic {
}
o = block {
core::String #t47;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L16:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t48 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t48 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t47 = "matched";
break #L16;
}

View File

@ -261,10 +261,10 @@ static method testUnresolved(dynamic o) → dynamic {
}
#L1:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t4 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t4 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L1;
}
@ -273,12 +273,12 @@ static method testUnresolved(dynamic o) → dynamic {
}
o = block {
core::String #t5;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L2:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t6 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t6 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t5 = "matched";
break #L2;
}
@ -317,10 +317,10 @@ static method testNonType(dynamic o) → dynamic {
}
#L3:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t10 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t10 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L3;
}
@ -329,12 +329,12 @@ static method testNonType(dynamic o) → dynamic {
}
o = block {
core::String #t11;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L4:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t12 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t12 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t11 = "matched";
break #L4;
}
@ -373,10 +373,10 @@ static method testExtension(dynamic o) → dynamic {
}
#L5:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t16 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t16 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L5;
}
@ -385,12 +385,12 @@ static method testExtension(dynamic o) → dynamic {
}
o = block {
core::String #t17;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L6:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t18 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t18 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t17 = "matched";
break #L6;
}
@ -429,10 +429,10 @@ static method testPrefixedUnresolved(dynamic o) → dynamic {
}
#L7:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t22 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t22 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L7;
}
@ -441,12 +441,12 @@ static method testPrefixedUnresolved(dynamic o) → dynamic {
}
o = block {
core::String #t23;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L8:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t24 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t24 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t23 = "matched";
break #L8;
}
@ -485,10 +485,10 @@ static method testPrefixedNonType(dynamic o) → dynamic {
}
#L9:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t28 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t28 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L9;
}
@ -497,12 +497,12 @@ static method testPrefixedNonType(dynamic o) → dynamic {
}
o = block {
core::String #t29;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L10:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t30 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t30 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t29 = "matched";
break #L10;
}
@ -541,10 +541,10 @@ static method testPrefixedExtension(dynamic o) → dynamic {
}
#L11:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t34 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t34 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L11;
}
@ -553,12 +553,12 @@ static method testPrefixedExtension(dynamic o) → dynamic {
}
o = block {
core::String #t35;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L12:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t36 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t36 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t35 = "matched";
break #L12;
}
@ -597,10 +597,10 @@ static method testUnresolvedPrefix(dynamic o) → dynamic {
}
#L13:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t40 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t40 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L13;
}
@ -609,12 +609,12 @@ static method testUnresolvedPrefix(dynamic o) → dynamic {
}
o = block {
core::String #t41;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L14:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t42 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t42 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t41 = "matched";
break #L14;
}
@ -653,10 +653,10 @@ static method testMemberAccess(dynamic o) → dynamic {
}
#L15:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t46 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t46 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L15;
}
@ -665,12 +665,12 @@ static method testMemberAccess(dynamic o) → dynamic {
}
o = block {
core::String #t47;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L16:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t48 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t48 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t47 = "matched";
break #L16;
}

View File

@ -261,10 +261,10 @@ static method testUnresolved(dynamic o) → dynamic {
}
#L1:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t4 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t4 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L1;
}
@ -273,12 +273,12 @@ static method testUnresolved(dynamic o) → dynamic {
}
o = block {
core::String #t5;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L2:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t6 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t6 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t5 = "matched";
break #L2;
}
@ -317,10 +317,10 @@ static method testNonType(dynamic o) → dynamic {
}
#L3:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t10 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t10 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L3;
}
@ -329,12 +329,12 @@ static method testNonType(dynamic o) → dynamic {
}
o = block {
core::String #t11;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L4:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t12 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t12 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t11 = "matched";
break #L4;
}
@ -373,10 +373,10 @@ static method testExtension(dynamic o) → dynamic {
}
#L5:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t16 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t16 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L5;
}
@ -385,12 +385,12 @@ static method testExtension(dynamic o) → dynamic {
}
o = block {
core::String #t17;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L6:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t18 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t18 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t17 = "matched";
break #L6;
}
@ -429,10 +429,10 @@ static method testPrefixedUnresolved(dynamic o) → dynamic {
}
#L7:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t22 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t22 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L7;
}
@ -441,12 +441,12 @@ static method testPrefixedUnresolved(dynamic o) → dynamic {
}
o = block {
core::String #t23;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L8:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t24 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t24 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t23 = "matched";
break #L8;
}
@ -485,10 +485,10 @@ static method testPrefixedNonType(dynamic o) → dynamic {
}
#L9:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t28 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t28 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L9;
}
@ -497,12 +497,12 @@ static method testPrefixedNonType(dynamic o) → dynamic {
}
o = block {
core::String #t29;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L10:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t30 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t30 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t29 = "matched";
break #L10;
}
@ -541,10 +541,10 @@ static method testPrefixedExtension(dynamic o) → dynamic {
}
#L11:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t34 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t34 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L11;
}
@ -553,12 +553,12 @@ static method testPrefixedExtension(dynamic o) → dynamic {
}
o = block {
core::String #t35;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L12:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t36 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t36 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t35 = "matched";
break #L12;
}
@ -597,10 +597,10 @@ static method testUnresolvedPrefix(dynamic o) → dynamic {
}
#L13:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t40 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t40 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L13;
}
@ -609,12 +609,12 @@ static method testUnresolvedPrefix(dynamic o) → dynamic {
}
o = block {
core::String #t41;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L14:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t42 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t42 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t41 = "matched";
break #L14;
}
@ -653,10 +653,10 @@ static method testMemberAccess(dynamic o) → dynamic {
}
#L15:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t46 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t46 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L15;
}
@ -665,12 +665,12 @@ static method testMemberAccess(dynamic o) → dynamic {
}
o = block {
core::String #t47;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L16:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t48 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final dynamic #t48 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t47 = "matched";
break #L16;
}

View File

@ -263,10 +263,10 @@ static method testUnresolved(dynamic o) → dynamic {
}
#L1:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t4 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t4 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L1;
}
@ -275,12 +275,12 @@ static method testUnresolved(dynamic o) → dynamic {
}
o = block {
core::String #t5;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L2:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t6 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t6 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t5 = "matched";
break #L2;
}
@ -321,10 +321,10 @@ static method testNonType(dynamic o) → dynamic {
}
#L3:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t10 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t10 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L3;
}
@ -333,12 +333,12 @@ static method testNonType(dynamic o) → dynamic {
}
o = block {
core::String #t11;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L4:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t12 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t12 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t11 = "matched";
break #L4;
}
@ -379,10 +379,10 @@ static method testExtension(dynamic o) → dynamic {
}
#L5:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t16 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t16 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L5;
}
@ -391,12 +391,12 @@ static method testExtension(dynamic o) → dynamic {
}
o = block {
core::String #t17;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L6:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t18 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t18 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t17 = "matched";
break #L6;
}
@ -437,10 +437,10 @@ static method testPrefixedUnresolved(dynamic o) → dynamic {
}
#L7:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t22 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t22 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L7;
}
@ -449,12 +449,12 @@ static method testPrefixedUnresolved(dynamic o) → dynamic {
}
o = block {
core::String #t23;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L8:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t24 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t24 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t23 = "matched";
break #L8;
}
@ -495,10 +495,10 @@ static method testPrefixedNonType(dynamic o) → dynamic {
}
#L9:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t28 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t28 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L9;
}
@ -507,12 +507,12 @@ static method testPrefixedNonType(dynamic o) → dynamic {
}
o = block {
core::String #t29;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L10:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t30 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t30 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t29 = "matched";
break #L10;
}
@ -553,10 +553,10 @@ static method testPrefixedExtension(dynamic o) → dynamic {
}
#L11:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t34 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t34 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L11;
}
@ -565,12 +565,12 @@ static method testPrefixedExtension(dynamic o) → dynamic {
}
o = block {
core::String #t35;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L12:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t36 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t36 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t35 = "matched";
break #L12;
}
@ -611,10 +611,10 @@ static method testUnresolvedPrefix(dynamic o) → dynamic {
}
#L13:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t40 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t40 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L13;
}
@ -623,12 +623,12 @@ static method testUnresolvedPrefix(dynamic o) → dynamic {
}
o = block {
core::String #t41;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L14:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t42 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t42 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t41 = "matched";
break #L14;
}
@ -669,10 +669,10 @@ static method testMemberAccess(dynamic o) → dynamic {
}
#L15:
{
final synthesized invalid-type #3#0 = o{invalid-type};
final synthesized dynamic #3#0 = o;
{
hoisted invalid-type field;
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t46 = field = #3#0{<invalid>}.field in true)) {
if(#3#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t46 = field = #3#0{invalid-type}{<invalid>}.field in true)) {
{
break #L15;
}
@ -681,12 +681,12 @@ static method testMemberAccess(dynamic o) → dynamic {
}
o = block {
core::String #t47;
final synthesized invalid-type #4#0 = o{invalid-type};
final synthesized dynamic #4#0 = o;
#L16:
{
{
hoisted invalid-type field;
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t48 = field = #4#0{<invalid>}.field in true)) {
if(#4#0 is{ForNonNullableByDefault} invalid-type && (let final invalid-type #t48 = field = #4#0{invalid-type}{<invalid>}.field in true)) {
#t47 = "matched";
break #L16;
}

View File

@ -41,33 +41,33 @@ static method test(dynamic x) → dynamic {
}
}
{
final synthesized invalid-type #1#0 = x{invalid-type};
final synthesized dynamic #1#0 = x;
if(#1#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #2#0 = x{self::A};
if(true) {
final synthesized dynamic #2#0 = x;
if(#2#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #3#0 = x{self::A};
if(true) {
final synthesized dynamic #3#0 = x;
if(#3#0 is{ForNonNullableByDefault} invalid-type) {
}
}
{
final synthesized invalid-type #4#0 = x{invalid-type};
final synthesized dynamic #4#0 = x;
if(#4#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #5#0 = x{self::A};
if(true) {
final synthesized dynamic #5#0 = x;
if(#5#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #6#0 = x{self::A};
if(true) {
final synthesized dynamic #6#0 = x;
if(#6#0 is{ForNonNullableByDefault} self::A) {
}
}
}

View File

@ -41,33 +41,33 @@ static method test(dynamic x) → dynamic {
}
}
{
final synthesized invalid-type #1#0 = x{invalid-type};
final synthesized dynamic #1#0 = x;
if(#1#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #2#0 = x{self::A};
if(true) {
final synthesized dynamic #2#0 = x;
if(#2#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #3#0 = x{self::A};
if(true) {
final synthesized dynamic #3#0 = x;
if(#3#0 is{ForNonNullableByDefault} invalid-type) {
}
}
{
final synthesized invalid-type #4#0 = x{invalid-type};
final synthesized dynamic #4#0 = x;
if(#4#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #5#0 = x{self::A};
if(true) {
final synthesized dynamic #5#0 = x;
if(#5#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #6#0 = x{self::A};
if(true) {
final synthesized dynamic #6#0 = x;
if(#6#0 is{ForNonNullableByDefault} self::A) {
}
}
}

View File

@ -41,33 +41,33 @@ static method test(dynamic x) → dynamic {
}
}
{
final synthesized invalid-type #1#0 = x{invalid-type};
final synthesized dynamic #1#0 = x;
if(#1#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #2#0 = x{self::A};
if(true) {
final synthesized dynamic #2#0 = x;
if(#2#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #3#0 = x{self::A};
if(true) {
final synthesized dynamic #3#0 = x;
if(#3#0 is{ForNonNullableByDefault} invalid-type) {
}
}
{
final synthesized invalid-type #4#0 = x{invalid-type};
final synthesized dynamic #4#0 = x;
if(#4#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #5#0 = x{self::A};
if(true) {
final synthesized dynamic #5#0 = x;
if(#5#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #6#0 = x{self::A};
if(true) {
final synthesized dynamic #6#0 = x;
if(#6#0 is{ForNonNullableByDefault} self::A) {
}
}
}

View File

@ -41,33 +41,33 @@ static method test(dynamic x) → dynamic {
}
}
{
final synthesized invalid-type #1#0 = x{invalid-type};
final synthesized dynamic #1#0 = x;
if(#1#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #2#0 = x{self::A};
if(true) {
final synthesized dynamic #2#0 = x;
if(#2#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #3#0 = x{self::A};
if(true) {
final synthesized dynamic #3#0 = x;
if(#3#0 is{ForNonNullableByDefault} invalid-type) {
}
}
{
final synthesized invalid-type #4#0 = x{invalid-type};
final synthesized dynamic #4#0 = x;
if(#4#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #5#0 = x{self::A};
if(true) {
final synthesized dynamic #5#0 = x;
if(#5#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #6#0 = x{self::A};
if(true) {
final synthesized dynamic #6#0 = x;
if(#6#0 is{ForNonNullableByDefault} self::A) {
}
}
}

View File

@ -41,33 +41,33 @@ static method test(dynamic x) → dynamic {
}
}
{
final synthesized invalid-type #1#0 = x{invalid-type};
final synthesized dynamic #1#0 = x;
if(#1#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #2#0 = x{self::A};
if(true) {
final synthesized dynamic #2#0 = x;
if(#2#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #3#0 = x{self::A};
if(true) {
final synthesized dynamic #3#0 = x;
if(#3#0 is{ForNonNullableByDefault} invalid-type) {
}
}
{
final synthesized invalid-type #4#0 = x{invalid-type};
final synthesized dynamic #4#0 = x;
if(#4#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #5#0 = x{self::A};
if(true) {
final synthesized dynamic #5#0 = x;
if(#5#0 is{ForNonNullableByDefault} self::A) {
}
}
{
final synthesized self::A #6#0 = x{self::A};
if(true) {
final synthesized dynamic #6#0 = x;
if(#6#0 is{ForNonNullableByDefault} self::A) {
}
}
}

View File

@ -47,7 +47,6 @@ class Class {
// ^^^^^
// [analyzer] COMPILE_TIME_ERROR.INVOCATION_OF_NON_FUNCTION_EXPRESSION
// ^^^^^^^
// [analyzer] COMPILE_TIME_ERROR.CONSTANT_PATTERN_WITH_NON_CONSTANT_EXPRESSION
// [cfe] Method invocation is not a constant expression.
}