Update TypeInfo to correctly parse "T<void>"

Change-Id: I2fe4d1c36c52a599d9d80809d88562657100dcdf
Reviewed-on: https://dart-review.googlesource.com/46480
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Dan Rubel <danrubel@google.com>
diff --git a/pkg/front_end/lib/src/fasta/parser/type_info.dart b/pkg/front_end/lib/src/fasta/parser/type_info.dart
index 9c56333..8a012ce 100644
--- a/pkg/front_end/lib/src/fasta/parser/type_info.dart
+++ b/pkg/front_end/lib/src/fasta/parser/type_info.dart
@@ -113,7 +113,8 @@
   if (optional('<', next)) {
     if (next.endGroup != null) {
       next = next.next;
-      if (isValidTypeReference(next)) {
+      // identifier `<` `void` `>` is handled by ComplexTypeInfo.
+      if (isValidTypeReference(next) && !identical('void', next.stringValue)) {
         next = next.next;
         if (optional('>', next)) {
           // We've seen identifier `<` identifier `>`
diff --git a/pkg/front_end/test/fasta/parser/type_info_test.dart b/pkg/front_end/test/fasta/parser/type_info_test.dart
index 33153ca..4efa647 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -230,11 +230,19 @@
     expectInfo(noTypeInfo, 'C<T>;', required: false);
     expectInfo(noTypeInfo, 'C<T>(', required: false);
     expectInfo(noTypeInfo, 'C<T> do', required: false);
+    expectInfo(noTypeInfo, 'C<void>', required: false);
 
     expectInfo(simpleTypeArgumentsInfo, 'C<T>', required: true);
     expectInfo(simpleTypeArgumentsInfo, 'C<T>;', required: true);
     expectInfo(simpleTypeArgumentsInfo, 'C<T>(', required: true);
     expectInfo(simpleTypeArgumentsInfo, 'C<T> do', required: true);
+    expectComplexInfo('C<void>', required: true, expectedCalls: [
+      'handleIdentifier C typeReference',
+      'beginTypeArguments <',
+      'handleVoidKeyword void',
+      'endTypeArguments 1 < >',
+      'handleType C ',
+    ]);
 
     expectInfo(simpleTypeArgumentsInfo, 'C<T> foo');
     expectInfo(simpleTypeArgumentsInfo, 'C<T> get');