Band-aid fix for issue #24191.

This is sufficient to avoid throwing an exception in the resolver,
which in turn will prevent the analysis server from going into an
infinite analysis loop.

I'll work on a more complete fix (which infers the proper type in all
cases) for the next release.

R=brianwilkerson@google.com

Review URL: https://codereview.chromium.org//1307353002 .
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 8110c8c..6792538 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -11227,7 +11227,11 @@
           return null;
         }
         DartType eventType = onDataParameters[0].type;
-        if (eventType.element == streamType.typeParameters[0]) {
+        // TODO(paulberry): checking that typeParameters.isNotEmpty is a
+        // band-aid fix for dartbug.com/24191.  Figure out what the correct
+        // logic should be.
+        if (streamType.typeParameters.isNotEmpty &&
+            eventType.element == streamType.typeParameters[0]) {
           return streamType.typeArguments[0];
         }
       }
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 64da228..9b057a7 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -2898,6 +2898,22 @@
     verify([source]);
   }
 
+  void test_issue_24191() {
+    Source source = addSource('''
+import 'dart:async';
+
+class S extends Stream {}
+f(S s) async {
+  await for (var v in s) {
+    print(v);
+  }
+}
+''');
+    computeLibrarySourceErrors(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_listElementTypeNotAssignable() {
     Source source = addSource(r'''
 var v1 = <int> [42];
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index 4034068..5963b56 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -236,6 +236,9 @@
     // Stream
     ClassElementImpl streamElement =
         ElementFactory.classElement2("Stream", ["T"]);
+    streamElement.constructors = <ConstructorElement>[
+      ElementFactory.constructorElement2(streamElement, null)
+    ];
     DartType returnType = streamSubscriptionElement.type
         .substitute4(streamElement.type.typeArguments);
     List<DartType> parameterTypes = <DartType>[