https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116192

            Bug ID: 116192
           Summary: [15 regression] 32-bit rust build fails
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rust
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ro at gcc dot gnu.org
                CC: dkm at gcc dot gnu.org, gcc-rust at gcc dot gnu.org
  Target Milestone: ---
            Target: i386-pc-solaris2.11, sparc-sun-solaris2.11,
                    i686-pc-linux-gnu

The recent gigantic rust import broke the 32-bit rust build everywhere:

* There are several instances where size_t args are printed using %ld, e.g.

In file included from /vol/gcc/src/hg/master/local/gcc/rust/ast/rust-ast.h:27,
                 from
/vol/gcc/src/hg/master/local/gcc/rust/hir/tree/rust-hir.h:22,
                 from
/vol/gcc/src/hg/master/local/gcc/rust/checks/errors/borrowck/rust-borrow-checker.h:22,
                 from
/vol/gcc/src/hg/master/local/gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc:19:
/vol/gcc/src/hg/master/local/gcc/rust/checks/errors/borrowck/rust-bir-builder.h:
In member function ‘void
Rust::BIR::Builder::handle_lifetime_param_constraints(const
Rust::TyTy::RegionConstraints&)’:
/vol/gcc/src/hg/master/local/gcc/rust/checks/errors/borrowck/rust-bir-builder.h:94:21:
error: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has
type ‘unsigned int’ [-Werror=format=]
   94 |         rust_debug ("\t\t %ld: %ld", last_bound.first,
last_bound.second);
      |                     ^~~~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~
      |                                                 |
      |      

  Given that %z cannot yet be assumed, those should be printed as %lu and
  the args cast to unsigned long.  This should be an unsigned format and type
  to match the signedness of size_t.

* There's an overload issue with PlaceId vs. FreeRegion:

In file included from
/vol/gcc/src/hg/master/local/gcc/rust/checks/errors/borrowck/rust-borrow-checker.cc:23:
/vol/gcc/src/hg/master/local/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h:
At global scope:
/vol/gcc/src/hg/master/local/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h:663:8:
error: ‘void Rust::BIR::FactCollector::push_subset(Rust::BIR::PlaceId,
Rust::BIR::PlaceId)’ cannot be overloaded with ‘void
Rust::BIR::FactCollector::push_subset(Rust::FreeRegion, Rust::FreeRegion)’
  663 |   void push_subset (PlaceId lhs, PlaceId rhs)
      |        ^~~~~~~~~~~
/vol/gcc/src/hg/master/local/gcc/rust/checks/errors/borrowck/rust-bir-fact-collector.h:622:8:
note: previous declaration ‘void
Rust::BIR::FactCollector::push_subset(Rust::FreeRegion, Rust::FreeRegion)’
  622 |   void push_subset (FreeRegion lhs, FreeRegion rhs)
      |        ^~~~~~~~~~~

  PlaceId is uint32_t while FreeRegion is size_t (also uint32_t).

The attached patch fixes the format issues, but I've no idea what to do about
the overload one.

Given that this isn't the first time that rust broke 32-bit targets, it would
be very helpful to try at least one 32-bit build before commit.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

Reply via email to