Version 2.17.0-121.0.dev
Merge commit '7cd6b3ed3e89b8653084883f64da124d7a29208c' into 'dev'
diff --git a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
index 41802d0..cf14dd4 100644
--- a/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/function_reference_resolver.dart
@@ -521,23 +521,20 @@
nameErrorEntity: function,
);
- if (functionType == null) {
+ if (functionType is FunctionType) {
+ function.staticType = functionType;
+ _resolve(
+ node: node,
+ rawType: functionType,
+ name: function.propertyName.name,
+ );
+ } else {
// The target is known, but the method is not; [UNDEFINED_GETTER] is
// reported elsewhere.
node.staticType = DynamicTypeImpl.instance;
- return;
- } else {
- if (functionType is FunctionType) {
- function.staticType = functionType;
- _resolve(
- node: node,
- rawType: functionType,
- name: function.propertyName.name,
- );
- }
-
- return;
}
+
+ return;
}
var propertyElement = _resolver.typePropertyResolver
diff --git a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
index a2dab45..6cb3570 100644
--- a/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/function_reference_test.dart
@@ -945,6 +945,22 @@
reference, findElement.method('foo'), 'void Function(int)');
}
+ test_instanceMethod_explicitReceiver_getter_wrongNumberOfTypeArguments() async {
+ await assertNoErrorsInCode(r'''
+class A {
+ int get foo => 0;
+}
+
+void f(A a) {
+ // Extra `()` to force reading the type.
+ ((a).foo<double>);
+}
+''');
+
+ var reference = findNode.functionReference('foo<double>');
+ assertFunctionReference(reference, null, 'dynamic');
+ }
+
test_instanceMethod_explicitReceiver_otherExpression() async {
await assertNoErrorsInCode('''
class A {
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 12f0069..937f1c0 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -543,10 +543,13 @@
// Loops and switches handle their own labels.
visit(body);
} else {
+ LocalState stateBefore = _state;
JumpTarget jumpTarget = _localsMap.getJumpTargetForLabel(node);
_setupBreaksAndContinues(jumpTarget);
+ _state = LocalState.childPath(stateBefore);
visit(body);
- _state.mergeAfterBreaks(_inferrer, _getBreaks(jumpTarget));
+ _state = stateBefore.mergeAfterBreaks(_inferrer, _getBreaks(jumpTarget),
+ keepOwnLocals: false);
_clearBreaksAndContinues(jumpTarget);
}
return null;
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index c0c8468..1d417b8 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -82,11 +82,11 @@
/// [FeatureOption]s which are shipped and cannot be toggled.
late final List<FeatureOption> shipped = [
newHolders,
+ legacyJavaScript,
];
/// [FeatureOption]s which default to enabled.
late final List<FeatureOption> shipping = [
- legacyJavaScript,
useContentSecurityPolicy,
];
@@ -948,7 +948,7 @@
}
if (enableFeature && feature.isNegativeFlag) {
throw ArgumentError(
- "$disableFeatureFlag has already shipped and cannot be enabled.");
+ "$enableFeatureFlag has been removed and cannot be enabled.");
}
if (disableFeature && !feature.isNegativeFlag) {
throw ArgumentError(
diff --git a/pkg/compiler/test/inference/data/break_continue.dart b/pkg/compiler/test/inference/data/break_continue.dart
index 9fbb86e..d815f1d 100644
--- a/pkg/compiler/test/inference/data/break_continue.dart
+++ b/pkg/compiler/test/inference/data/break_continue.dart
@@ -12,6 +12,8 @@
noContinueInWhile();
breakInIf();
noBreakInIf();
+ breakInBlock();
+ noBreakInBlock();
}
////////////////////////////////////////////////////////////////////////////////
@@ -107,7 +109,7 @@
}
////////////////////////////////////////////////////////////////////////////////
-// A break statement in a labeled statement.
+// A conditional break statement in a labeled statement.
////////////////////////////////////////////////////////////////////////////////
/*member: _breakInIf:Union([exact=JSString], [exact=JSUInt31])*/
@@ -150,3 +152,34 @@
_noBreakInIf(true);
_noBreakInIf(false);
}
+
+////////////////////////////////////////////////////////////////////////////////
+// An unconditional break statement in a labeled statement.
+////////////////////////////////////////////////////////////////////////////////
+
+/*member: breakInBlock:Value([exact=JSString], value: "")*/
+breakInBlock() {
+ dynamic local = 42;
+ label:
+ {
+ local = '';
+ break label;
+ local = false;
+ }
+ return local;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// The "labeled statement" above _without_ the break statement.
+////////////////////////////////////////////////////////////////////////////////
+
+/*member: noBreakInBlock:Value([exact=JSBool], value: false)*/
+noBreakInBlock() {
+ dynamic local = 42;
+ label:
+ {
+ local = '';
+ local = false;
+ }
+ return local;
+}
diff --git a/pkg/compiler/test/inference/data/general.dart b/pkg/compiler/test/inference/data/general.dart
index da299fc..db114da 100644
--- a/pkg/compiler/test/inference/data/general.dart
+++ b/pkg/compiler/test/inference/data/general.dart
@@ -560,13 +560,13 @@
return a;
}
-/*member: testDoWhile3:[exact=JSUInt31]*/
+/*member: testDoWhile3:Value([exact=JSBool], value: false)*/
testDoWhile3() {
dynamic a = 42;
do {
a = 'foo';
if (true) continue;
- return 42;
+ return false;
} while (true);
// ignore: dead_code
return a;
diff --git a/tests/web/regress/48317_test.dart b/tests/web/regress/48317_test.dart
new file mode 100644
index 0000000..ff16cfc
--- /dev/null
+++ b/tests/web/regress/48317_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+helper(num c) => c * -1;
+
+void main() {
+ num a = 3;
+
+ label:
+ {
+ break label;
+ }
+
+ Expect.equals(-3, helper(a));
+}
diff --git a/tests/web_2/regress/48317_test.dart b/tests/web_2/regress/48317_test.dart
new file mode 100644
index 0000000..ff16cfc
--- /dev/null
+++ b/tests/web_2/regress/48317_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:expect/expect.dart';
+
+helper(num c) => c * -1;
+
+void main() {
+ num a = 3;
+
+ label:
+ {
+ break label;
+ }
+
+ Expect.equals(-3, helper(a));
+}
diff --git a/tools/VERSION b/tools/VERSION
index cff630a..99ab702 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 17
PATCH 0
-PRERELEASE 120
+PRERELEASE 121
PRERELEASE_PATCH 0
\ No newline at end of file