| Index: pkg/analyzer/test/generated/strong_mode_test.dart
 | 
| diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
 | 
| index d0042cdf8fd220cef5fcabe2e09148ae09022427..4d6a08f926cbf1c86552e1ff65ae62bc018a725b 100644
 | 
| --- a/pkg/analyzer/test/generated/strong_mode_test.dart
 | 
| +++ b/pkg/analyzer/test/generated/strong_mode_test.dart
 | 
| @@ -2769,7 +2769,7 @@ class A<T> {}
 | 
|  
 | 
|  class B<T extends num> {}
 | 
|  
 | 
| -class C<S extends int, T extends B<S>, U extends B> {}
 | 
| +class C<S extends int, T extends B<S>, U extends A> {}
 | 
|  
 | 
|  void test() {
 | 
|  //
 | 
| @@ -2781,13 +2781,13 @@ void test() {
 | 
|    var cc = new C();
 | 
|  }
 | 
|  ''';
 | 
| -    await resolveTestUnit(code, noErrors: false);
 | 
| +    await resolveTestUnit(code);
 | 
|      expectIdentifierType('ai', "A<dynamic>");
 | 
|      expectIdentifierType('bi', "B<num>");
 | 
| -    expectIdentifierType('ci', "C<int, B<int>, B<dynamic>>");
 | 
| +    expectIdentifierType('ci', "C<int, B<int>, A<dynamic>>");
 | 
|      expectIdentifierType('aa', "A<dynamic>");
 | 
|      expectIdentifierType('bb', "B<num>");
 | 
| -    expectIdentifierType('cc', "C<int, B<int>, B<dynamic>>");
 | 
| +    expectIdentifierType('cc', "C<int, B<int>, A<dynamic>>");
 | 
|    }
 | 
|  
 | 
|    test_instantiateToBounds_class_error_recursion() async {
 | 
| @@ -2821,6 +2821,28 @@ C c;
 | 
|      expectIdentifierType('c;', 'C<dynamic>');
 | 
|    }
 | 
|  
 | 
| +  test_instantiateToBounds_class_error_typedef() async {
 | 
| +    String code = r'''
 | 
| +typedef T F<T>(T x);
 | 
| +class C<T extends F<T>> {}
 | 
| +C c;
 | 
| +''';
 | 
| +    await resolveTestUnit(code, noErrors: false);
 | 
| +    assertErrors(testSource, [StrongModeCode.NO_DEFAULT_BOUNDS]);
 | 
| +    expectIdentifierType('c;', 'C<dynamic>');
 | 
| +  }
 | 
| +
 | 
| +  test_instantiateToBounds_class_ok_implicitDynamic_multi() async {
 | 
| +    String code = r'''
 | 
| +class C<T0 extends Map<T1, T2>, T1 extends List, T2 extends int> {}
 | 
| +C c;
 | 
| +''';
 | 
| +    await resolveTestUnit(code);
 | 
| +    assertNoErrors(testSource);
 | 
| +    expectIdentifierType(
 | 
| +        'c;', 'C<Map<List<dynamic>, int>, List<dynamic>, int>');
 | 
| +  }
 | 
| +
 | 
|    test_instantiateToBounds_class_ok_referenceOther_after() async {
 | 
|      String code = r'''
 | 
|  class C<T0 extends T1, T1 extends int> {}
 | 
| @@ -2866,11 +2888,12 @@ C c;
 | 
|  class A<T> {}
 | 
|  class B<T extends num> {}
 | 
|  class C<T extends List<int>> {}
 | 
| -
 | 
| +class D<T extends A> {}
 | 
|  void main() {
 | 
|    A a;
 | 
|    B b;
 | 
|    C c;
 | 
| +  D d;
 | 
|  }
 | 
|  ''';
 | 
|      await resolveTestUnit(code);
 | 
| @@ -2878,6 +2901,7 @@ void main() {
 | 
|      expectIdentifierType('a;', 'A<dynamic>');
 | 
|      expectIdentifierType('b;', 'B<num>');
 | 
|      expectIdentifierType('c;', 'C<List<int>>');
 | 
| +    expectIdentifierType('d;', 'D<A<dynamic>>');
 | 
|    }
 | 
|  
 | 
|    test_instantiateToBounds_method_ok_referenceOther_before() async {
 | 
| @@ -2910,29 +2934,51 @@ class C<T> {
 | 
|      expectStaticInvokeType('m(null)', '(T) → void');
 | 
|    }
 | 
|  
 | 
| -  test_notInstantiatedBound_direct() async {
 | 
| +  test_notInstantiatedBound_direct_class_class() async {
 | 
|      String code = r'''
 | 
| -class A<T> {}
 | 
| +class A<T extends int> {}
 | 
|  class C<T extends A> {}
 | 
|  ''';
 | 
|      await resolveTestUnit(code, noErrors: false);
 | 
|      assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
 | 
|    }
 | 
|  
 | 
| -  test_notInstantiatedBound_indirect() async {
 | 
| +  test_notInstantiatedBound_direct_class_typedef() async {
 | 
| +    // Check that if the bound of a class is an uninstantiated typedef
 | 
| +    // we emit an error
 | 
| +    String code = r'''
 | 
| +typedef void F<T extends int>();
 | 
| +class C<T extends F> {}
 | 
| +''';
 | 
| +    await resolveTestUnit(code, noErrors: false);
 | 
| +    assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
 | 
| +  }
 | 
| +
 | 
| +  test_notInstantiatedBound_direct_typedef_class() async {
 | 
| +    // Check that if the bound of a typeded is an uninstantiated class
 | 
| +    // we emit an error
 | 
| +    String code = r'''
 | 
| +class C<T extends int> {}
 | 
| +typedef void F<T extends C>();
 | 
| +''';
 | 
| +    await resolveTestUnit(code, noErrors: false);
 | 
| +    assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
 | 
| +  }
 | 
| +
 | 
| +  test_notInstantiatedBound_indirect_class_class() async {
 | 
|      String code = r'''
 | 
|  class A<T> {}
 | 
| -class B<T> {}
 | 
| +class B<T extends int> {}
 | 
|  class C<T extends A<B>> {}
 | 
|  ''';
 | 
|      await resolveTestUnit(code, noErrors: false);
 | 
|      assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]);
 | 
|    }
 | 
|  
 | 
| -  test_notInstantiatedBound_indirect2() async {
 | 
| +  test_notInstantiatedBound_indirect_class_class2() async {
 | 
|      String code = r'''
 | 
|  class A<K, V> {}
 | 
| -class B<T> {}
 | 
| +class B<T extends int> {}
 | 
|  class C<T extends A<B, B>> {}
 | 
|  ''';
 | 
|      await resolveTestUnit(code, noErrors: false);
 | 
| 
 |