fix #30792 -- fix variables shadowing parameters in an async function
Change-Id: I40667f607450af8695aafc613358d401cd395af2
Reviewed-on: https://dart-review.googlesource.com/7042
Reviewed-by: Vijay Menon <vsm@google.com>
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
index a0aa134..7ca6318 100644
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
@@ -2799,18 +2799,6 @@
}
}
- if (body is BlockFunctionBody) {
- var params = element.parameters.map((e) => e.name).toSet();
- bool shadowsParam = body.block.statements.any((s) =>
- s is VariableDeclarationStatement &&
- s.variables.variables.any((v) => params.contains(v.name.name)));
- if (shadowsParam) {
- code = new JS.Block([
- new JS.Block([code], isScope: true)
- ]);
- }
- }
-
return new JS.Fun(formals, code,
typeParams: typeFormals, returnType: emitTypeRef(type.returnType));
}
@@ -2821,8 +2809,23 @@
_currentFunction = body;
var initArgs = _emitArgumentInitializers(element, parameters);
- var block = _visit(body);
+ var block = _visit<JS.Block>(body);
+
if (initArgs != null) block = new JS.Block([initArgs, block]);
+
+ if (body is BlockFunctionBody) {
+ var params = element.parameters.map((e) => e.name).toSet();
+ bool shadowsParam = body.block.statements.any((s) =>
+ s is VariableDeclarationStatement &&
+ s.variables.variables.any((v) => params.contains(v.name.name)));
+
+ if (shadowsParam) {
+ block = new JS.Block([
+ new JS.Block([block], isScope: true)
+ ]);
+ }
+ }
+
_currentFunction = savedFunction;
return block;
diff --git a/tests/language_strong/shadow_parameter_and_local_test.dart b/tests/language_strong/shadow_parameter_and_local_test.dart
index 813575a..1a00dd3 100644
--- a/tests/language_strong/shadow_parameter_and_local_test.dart
+++ b/tests/language_strong/shadow_parameter_and_local_test.dart
@@ -10,6 +10,25 @@
return a;
}
-main() {
+// Regression test for https://github.com/dart-lang/sdk/issues/30792 in DDC.
+bar(a) async {
+ var a = 123;
+ return a;
+}
+
+baz(a) sync* {
+ var a = 123;
+ yield a;
+}
+
+qux(a) async* {
+ var a = 123;
+ yield a;
+}
+
+main() async {
Expect.equals(foo(42), 123);
+ Expect.equals(await bar(42), 123);
+ Expect.equals(baz(42).single, 123);
+ Expect.equals(await qux(42).single, 123);
}