//
// Problems in component:
//
// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:15: Error: The type 'T' is not a constant because it depends on a type parameter, only instantiated types are allowed.
//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
//               ^
// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:12: Context: While analyzing:
//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
//            ^
//
library;
import self as self;
import "dart:core" as core;
import "package:expect/expect.dart" as exp;

import "package:expect/expect.dart";

class C<T extends core::Object* = dynamic> extends core::Object {
  field core::String* trace;
  constructor •({dynamic a = #C1, dynamic b = invalid-expression "The type 'T' is not a constant because it depends on a type parameter, only instantiated types are allowed."}) → self::C<self::C::T*>*
    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
    ;
}
class M extends core::Object {
  synthetic constructor •() → self::M*
    : super core::Object::•()
    ;
}
class D extends self::C<core::String*> implements self::M {
  synthetic constructor •({dynamic a = #C1, dynamic b = #C2}) → self::D*
    : super self::C::•(a: a, b: b)
    ;
}
class E extends self::D {
  synthetic constructor •() → self::E*
    : super self::D::•()
    ;
}
abstract class _F&C&M extends self::C<core::int*> implements self::M {
  synthetic constructor •({dynamic a = #C1, dynamic b = #C3}) → self::_F&C&M*
    : super self::C::•(a: a, b: b)
    ;
}
class F extends self::_F&C&M {
  synthetic constructor •() → self::F*
    : super self::_F&C&M::•()
    ;
}
static method main() → dynamic {
  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<core::Object*>().{self::C::trace});
  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().{self::C::trace});
  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().{self::C::trace});
  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().{self::C::trace});
  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().{self::C::trace});
}

constants  {
  #C1 = 0
  #C2 = TypeLiteralConstant(dart.core::String*)
  #C3 = TypeLiteralConstant(dart.core::int*)
}
