!lymvtcwDJ7ZA9Npq:lix.systems

Lix Development

402 Members
(Technical) development of Lix, the package manager, a Nix implementation. Please be mindful of ongoing technical conversations in this channel.135 Servers

Load older messages


SenderMessageTime
9 Nov 2025
@raitobezarius:matrix.orgraitobezariusUgh, OK, thanks15:48:21
@raitobezarius:matrix.orgraitobezariusWe will start bisecting on Monday if pennae doesn't beat me to it15:48:31
@xokdvium:matrix.orgSergei Zimmerman (xokdvium) I get the same error as the above for nix eval "github:nixos/nixpkgs?rev=a999c1cc0c9eb2095729d5aa03e0d8f7ed256780#pkgsCross.gnu64.bitwarden" --no-eval-cache. So that's why I suspect that nixpkgs machinery is misled into thinking it's cross while it's not 15:51:28
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)And that's both for cppnix/lix15:52:13
@aloisw:julia0815.dealoisw

2.93:

nix-repl> nixosConfigurations.nixos.config.nixpkgs.hostPlatform == nixosConfigurations.nixos.config.nixpkgs.buildPlatform
true

main:

nix-repl> nixosConfigurations.nixos.config.nixpkgs.hostPlatform == nixosConfigurations.nixos.config.nixpkgs.buildPlatform
false

So it indeed thinks there's cross now where there wasn't before.

16:19:34
@aloisw:julia0815.dealoisw

Slightly reduced reproducer:

let
  inherit (import <nixpkgs> { }) lib;
in
(lib.evalModules {
  modules = [
    (
      { config, ... }:
      {
        options = {
          buildPlatform = lib.mkOption {
            type = lib.types.either lib.types.str lib.types.attrs;
            apply = lib.systems.elaborate;
            default = config.hostPlatform;
          };
          hostPlatform = lib.mkOption {
            type = lib.types.either lib.types.str lib.types.attrs;
            apply = lib.systems.elaborate;
            default = "x86_64-linux";
          };
          isCross = lib.mkOption { type = lib.types.bool; };
        };
        config = {
          isCross = config.buildPlatform == config.hostPlatform;
        };
      }
    )
  ];
}).config.isCross
16:34:50
@aloisw:julia0815.dealoisw

Fully reduced reproducer:

with rec {
  a = {
    f = x: x;
    meow = true;
  };
  b = a // {
    meow = true;
  };
};
a == b
16:39:41
@raitobezarius:matrix.orgraitobezariusoh wow16:46:16
@raitobezarius:matrix.orgraitobezariusthx16:46:17
@raitobezarius:matrix.orgraitobezariusa fix may rain in the next hours16:47:18
@raitobezarius:matrix.orgraitobezariusi want to go and say that zomg the fact that we broke eval based on this behavior :')16:51:32
@lunaphied:lunaphied.meLunaphied Dear gods that's horrifying 16:58:33
@winter:catgirl.cloudWinteri fucking hate it16:58:49
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)

What's even more cursed is this:

nix::EvalState::eqValues (this=0x555555e8b770, v1=..., v2=..., pos=..., errorCtx="while testing two values for equality") at lix/libexpr/eval.cc:2613
2613        forceValue(v2, pos);
(gdb)
2616        if (v1.type() == nInt && v2.type() == nFloat) {
(gdb)
2619        if (v1.type() == nFloat && v2.type() == nInt) {
(gdb)
2624        if (v1.type() != v2.type()) return false;
(gdb)
2629        auto pointerEq = [&] { return v1.pointerEqProxy() == v2.pointerEqProxy(); };
(gdb)
2631        switch (v1.type()) {
(gdb)
2658                if (pointerEq()) return true;
(gdb)
2661                if (isDerivation(v1) && isDerivation(v2)) {
(gdb)
2669                if (v1.attrs()->size() != v2.attrs()->size()) return false;
(gdb) p v1.attrs()->size()
$1 = 2
(gdb) p v2.attrs()->size()
$2 = 3

It's not equal because the attrset size is incorrect? How???

17:21:56
@aloisw:julia0815.dealoiswI'd guess because it forgot to shrink after noticing that the update replaced one entry?17:24:59
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Updates never replace anything - they copy to a new attribute set though. It's puzzling17:25:38
@aloisw:julia0815.dealoisw
In reply to @raitobezarius:matrix.org
i want to go and say that zomg the fact that we broke eval based on this behavior :')
Honestly I didn't even know before tracing this down that true is the expected value in this place.
17:25:58
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Ah I see, that might be my SNAFU hmmm17:26:33
@aloisw:julia0815.dealoisw
In reply to @xokdvium:matrix.org
Updates never replace anything - they copy to a new attribute set though. It's puzzling
"Replace" not in the sense that it's an in-place update, but that the keys overlap. I think it allocates sum of the sizes many entries and then is supposed to shrink if not all were needed due to overlap.
17:28:12
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Capacity never actually gets shrunk and size is only incremented when doing a push_back to the bindings. Something looks broken in the ExprOpUpdate::eval code.17:35:41
@aloisw:julia0815.dealoisw Weirdly nrOpUpdateValuesCopied is still 2 on my machine. 17:41:18
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Ah sorry I was confused omg lol. Don't mind the noise17:43:37
@aloisw:julia0815.dealoisw Also it doesn't give false if replacing f by an integer. So it's related to the pointer/function mess. 17:45:45
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)

Yeah so doing this does help:

diff --git a/lix/libexpr/eval.cc b/lix/libexpr/eval.cc
index f1ba9e01c..5a5acd6aa 100644
--- a/lix/libexpr/eval.cc
+++ b/lix/libexpr/eval.cc
@@ -2682,6 +2682,7 @@ bool EvalState::eqValues(Value & v1, Value & v2, const PosIdx pos, std::string_v
 
         /* Functions are incomparable. */
         case nFunction:
+           if (pointerEq()) return true;
             return false;
 
         case nExternal:

But I'm not sure about all the consequences :)

17:49:35
@xokdvium:matrix.orgSergei Zimmerman (xokdvium) *

Yeah so doing this does help:

diff --git a/lix/libexpr/eval.cc b/lix/libexpr/eval.cc
index f1ba9e01c..5a5acd6aa 100644
--- a/lix/libexpr/eval.cc
+++ b/lix/libexpr/eval.cc
@@ -2682,6 +2682,7 @@ bool EvalState::eqValues(Value & v1, Value & v2, const PosIdx pos, std::string_v
 
         /* Functions are incomparable. */
         case nFunction:
+            if (pointerEq()) return true;
             return false;
 
         case nExternal:

But I'm not sure about all the consequences :)

17:49:49
@xokdvium:matrix.orgSergei Zimmerman (xokdvium) *

~~What's even more cursed is this~~:

  • xokdvium got confused, don't mind the noise *
17:53:14
@aloisw:julia0815.dealoisw let a = { f = x: x; }; in a.f == a.f would now return true. 17:58:31
@aloisw:julia0815.dealoiswI think https://git.lix.systems/lix-project/lix/commit/80654b84b610f4c0622dd10f0af78a8a2ce97048 is the offending change btw. Currently building that and its parent to confirm.18:01:20
@xokdvium:matrix.orgSergei Zimmerman (xokdvium)Worth mentioning on https://gerrit.lix.systems/c/lix/+/4556. But the cat is out of the bag on this and compat with cppnix wasn't a design decision for that patch?18:01:28
@aloisw:julia0815.dealoisw
In reply to @aloisw:julia0815.de
I think https://git.lix.systems/lix-project/lix/commit/80654b84b610f4c0622dd10f0af78a8a2ce97048 is the offending change btw. Currently building that and its parent to confirm.
It's not, weirdly enough I get true there?
18:06:22

Show newer messages


Back to Room ListRoom Version: 10