blob: b019ad8505002c1898977e026b23eeaef79aea73 [file] [log] [blame]
// Copyright (c) 2021, 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.
/// @assertion Let e1 and e2 be two constant expressions that both evaluate to a
/// function object which is obtained by function closurization of the same
/// function declaration. In this case identical(e1, e2) shall evaluate to true.
/// That is, constant expressions whose evaluation is a function closurization
/// are canonicalized.
///
/// @description Checks that if e1 and e2 are two constant expressions that both
/// evaluate to a function object which is obtained by function closurization of
/// the same function declaration, then identical(e1, e2) evaluates to true.
///
/// @author sgrekhov@unipro.ru
// SharedOptions=--enable-experiment=constructor-tearoffs
import "../../Utils/expect.dart";
class C {
const C();
static X stat1<X>(X x) => x;
static Y stat2<Y>(Y y) => y;
}
mixin M on C {
static X mstat1<X>(X x) => x;
static Y mstat2<Y>(Y y) => y;
}
extension Ext on C {
static X estat1<X>(X x) => x;
static Y estat2<Y>(Y y) => y;
}
class D extends C {
const D();
static X stat1<X>(X x) => x;
}
X foo<X>(X x) => x;
Y bar<Y>(Y y) => y;
main() {
const e1 = foo<int>;
const e2 = foo<int>;
const CheckIdentical(e1, e2);
const e3 = bar<int>;
Expect.notEquals(e3, e1);
const e4 = C.stat1<int>;
const e5 = C.stat1<int>;
const CheckIdentical(e4, e5);
Expect.notEquals(e1, e4);
const e6 = C.stat2<int>;
Expect.notEquals(e4, e6);
const e7 = Ext.estat1<int>;
const e8 = Ext.estat1<int>;
const CheckIdentical(e7, e8);
Expect.notEquals(e7, e1);
Expect.notEquals(e7, e4);
const e9 = Ext.estat2<int>;
Expect.notEquals(e9, e7);
Expect.notEquals(e9, e4);
Expect.notEquals(e9, e1);
const e10 = D.stat1<int>;
Expect.notEquals(e10, e4);
const e11 = M.mstat1<int>;
const e12 = M.mstat1<int>;
const CheckIdentical(e11, e12);
Expect.notEquals(e7, e11);
Expect.notEquals(e4, e11);
Expect.notEquals(e1, e11);
}