Add undefined identifier test for for loops

Change-Id: I590a76525c8f50b28dd3a4a4be448806e4b83027
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/97264
Commit-Queue: Mike Fairhurst <mfairhurst@google.com>
Auto-Submit: Mike Fairhurst <mfairhurst@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 1cabeb9..1383247 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -63,6 +63,7 @@
 import 'unchecked_use_of_nullable_value_test.dart'
     as unchecked_use_of_nullable_value;
 import 'undefined_getter_test.dart' as undefined_getter;
+import 'undefined_identifier_test.dart' as undefined_identifier;
 import 'undefined_hidden_name_test.dart' as undefined_hidden_name;
 import 'undefined_operator_test.dart' as undefined_operator;
 import 'undefined_prefixed_name_test.dart' as undefined_prefixed_name;
@@ -133,6 +134,7 @@
     type_check_is_null.main();
     unchecked_use_of_nullable_value.main();
     undefined_getter.main();
+    undefined_identifier.main();
     undefined_hidden_name.main();
     undefined_operator.main();
     undefined_prefixed_name.main();
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
new file mode 100644
index 0000000..2df536e
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/undefined_identifier_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2019, 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:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UndefinedIdentifierTest);
+    defineReflectiveTests(UndefinedIdentifierWithControlFlowCollectionsTest);
+  });
+}
+
+@reflectiveTest
+class UndefinedIdentifierTest extends DriverResolutionTest {
+  test_forStatement_inBody() async {
+    await assertNoErrorsInCode('''
+f() {
+  for (int x in []) {
+    x;
+  }
+}
+''');
+  }
+
+  test_forStatement_outsideBody() async {
+    await assertErrorsInCode('''
+f() {
+  for (int x in []) {}
+  x;
+}
+''', [StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+}
+
+@reflectiveTest
+class UndefinedIdentifierWithControlFlowCollectionsTest
+    extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [EnableString.control_flow_collections];
+
+  test_forElement_inList_insideElement() async {
+    await assertNoErrorsInCode('''
+f(Object x) {
+  return [for(int x in []) x, null];
+}
+''');
+  }
+
+  test_forElement_inList_outsideElement() async {
+    await assertErrorsInCode('''
+f() {
+  return [for (int x in []) null, x];
+}
+''', [StaticWarningCode.UNDEFINED_IDENTIFIER]);
+  }
+}