// Copyright (c) 2018, 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.
// SharedOptions=--supermixin

// This test case is a reduction of some Flutter code.  We wish to verify that
// the class _DismissibleState doesn't have any type inference errors.

class _DismissibleState extends State<Dismissible>
    with TickerProviderStateMixin, AutomaticKeepAliveClientMixin {}

abstract class State<T extends StatefulWidget> extends Diagnosticable {}

abstract class StatefulWidget extends Widget {}

abstract class Widget extends DiagnosticableTree {}

abstract class DiagnosticableTree extends Diagnosticable {}

abstract class Diagnosticable {}

class Dismissible extends StatefulWidget {}

abstract class TickerProviderStateMixin<T extends StatefulWidget>
    extends State<T> implements TickerProvider {}

abstract class TickerProvider {}

abstract class AutomaticKeepAliveClientMixin<T extends StatefulWidget>
    extends State<T> {}

main() {
  new _DismissibleState();
}
