// 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. // Regression test case for DDC bug where if a getter/setter is mixed in // without a corresponding getter/setter, DDC fails to install a the // corresponding getter/setter that calls super. import "package:expect/expect.dart"; abstract class C { E get first; set first(E value); E operator [](int index); operator []=(int index, E value); } abstract class CMixin implements C { E get first => this[0]; set first(E x) { this[0] = x; } } abstract class CBase extends Object with CMixin {} abstract class DMixin implements C { set first(E _) => throw new UnsupportedError(''); operator []=(int index, E value) => throw new UnsupportedError(''); } abstract class DBase = CBase with DMixin; class DView extends DBase { final Iterable _source; DView(this._source); E operator [](int index) => _source.elementAt(index); } abstract class FMixin implements C { E get first => throw new UnsupportedError(''); E operator [](int index) => throw new UnsupportedError(''); } class FView extends CBase with FMixin { List _values; FView(this._values); operator []=(int index, E value) { _values[index] = value; } } void main() { var d = new DView([3]); Expect.equals(3, d.first); Expect.throws(() => d.first = 42, (e) => e is UnsupportedError); var list = [3]; var f = new FView(list); f.first = 42; Expect.equals(42, list[0]); Expect.throws(() => f.first, (e) => e is UnsupportedError); }