Files
lix/tests/functional2/lang/eq/in-pointer-equality.nix
T
eldritch horrors 2fa40c9de4 libstore: bring back some pointer equality nonsense
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
2025-11-14 02:56:53 +00:00

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