the change to shareable thunks also removed a few cases of pointer equality checks that allowed structures containing functions to be considered equal to other sets containing the same functions, even if the sets themselves were pointer-equal themselves. *so* busted. Change-Id: If87fdab658f9037ce2a654f69a9e3da6ae2f53e5
97 lines
1.9 KiB
Nix
97 lines
1.9 KiB
Nix
let
|
|
f1 = x: x;
|
|
f2 = x: x;
|
|
|
|
inf = let f = n: if n == 0 then 1.0 else 10 * f (n - 1); in f 1000;
|
|
nan = inf * 0;
|
|
|
|
# all of these sets and lists are assumed to have different *addresses* as long as CSE does not occur
|
|
sets = rec {
|
|
set1 = {
|
|
f = f1;
|
|
};
|
|
set1' = {
|
|
f = f2;
|
|
};
|
|
set2 = {
|
|
f = f1;
|
|
};
|
|
set2' = {
|
|
f = f2;
|
|
};
|
|
bigSet1 = {
|
|
f = f1;
|
|
meow = true;
|
|
};
|
|
bigSet1' = {
|
|
f = f2;
|
|
meow = true;
|
|
};
|
|
bigSet2 = bigSet1 // {
|
|
meow = true;
|
|
};
|
|
bigSet2' = bigSet1' // {
|
|
meow = true;
|
|
};
|
|
bigSet3 = {
|
|
f = f1;
|
|
meow = true;
|
|
};
|
|
bigSet3' = {
|
|
f = f2;
|
|
meow = true;
|
|
};
|
|
};
|
|
|
|
lists = rec {
|
|
list1 = [ f1 ];
|
|
list1' = [ f2 ];
|
|
list2 = [ f1 ];
|
|
list2' = [ f2 ];
|
|
bigList1 = [ f1 true ];
|
|
bigList1' = [ f2 true ];
|
|
bigList2 = map (e: if builtins.isBool e then true else e) bigList1;
|
|
bigList2'= map (e: if builtins.isBool e then true else e) bigList1';
|
|
bigList3 = [ f1 true ];
|
|
bigList3' = [ f2 true ];
|
|
};
|
|
|
|
nans = rec {
|
|
plain = nan;
|
|
list = [ nan ];
|
|
set = { inherit nan; };
|
|
};
|
|
|
|
compareAllPairs = cases:
|
|
let
|
|
names = builtins.attrNames cases;
|
|
in
|
|
builtins.listToAttrs (map
|
|
(n1: {
|
|
name = n1;
|
|
value = builtins.listToAttrs (map
|
|
(n2: { name = n2; value = cases.${n1} == cases.${n2}; })
|
|
names);
|
|
})
|
|
names);
|
|
|
|
results = {
|
|
functionsDirect = [
|
|
(f1 == f1)
|
|
(f1 == f2)
|
|
(f2 == f1)
|
|
(f2 == f2)
|
|
];
|
|
functionsSelected = [
|
|
(sets.set1.f == sets.set1.f)
|
|
(sets.set1.f == sets.set1'.f)
|
|
(sets.set1'.f == sets.set1.f)
|
|
(sets.set1'.f == sets.set1'.f)
|
|
];
|
|
sets = compareAllPairs sets;
|
|
lists = compareAllPairs lists;
|
|
nans = compareAllPairs nans;
|
|
};
|
|
in
|
|
builtins.deepSeq results results
|