| // Copyright (c) 2017, 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. |
| |
| // dart2jsOptions=--strong |
| |
| // Regression test for http://dartbug.com/28749. |
| // |
| // This would crash at compile time because inner typedefs remain after calling |
| // [type.unalias]. Expanding the typedef causes the inputs to be used multiple |
| // types, breaking the invariant of HTypeInfoExpression that the type variable |
| // occurrences correspond to inputs. |
| |
| import 'package:expect/expect.dart'; |
| |
| typedef void F<T>(T value); |
| typedef F<U> Converter<U>(F<U> function); |
| typedef Converter<V> ConvertFactory<V>(int input); |
| |
| class B<W> { |
| final field = new Wrap<ConvertFactory<W>>(); |
| @pragma('dart2js:noInline') |
| B(); |
| } |
| |
| class Wrap<X> { |
| @pragma('dart2js:noInline') |
| Wrap(); |
| } |
| |
| foo<Y>(int x) { |
| if (x == 0) |
| return new Wrap<ConvertFactory<Y>>().runtimeType; |
| else |
| return new B<Y>().field.runtimeType; |
| } |
| |
| void main() { |
| var name = '${Wrap}'; |
| if ('$Object' != 'Object') return; // minified |
| |
| Expect.equals( |
| 'Wrap<(int) => ((int) => void) => (int) => void>', |
| '${new B<int>().field.runtimeType}', |
| ); |
| Expect.equals( |
| 'Wrap<(int) => ((bool) => void) => (bool) => void>', |
| '${new B<bool>().field.runtimeType}', |
| ); |
| |
| Expect.equals( |
| 'Wrap<(int) => ((int) => void) => (int) => void>', |
| '${foo<int>(0)}', |
| ); |
| Expect.equals( |
| 'Wrap<(int) => ((String) => void) => (String) => void>', |
| '${foo<String>(1)}', |
| ); |
| } |