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);
 }