Hi Iain,

On 1/18/24 12:02, Iain Sandoe wrote:
Hi Arthur,

On 18 Jan 2024, at 10:30, Arthur Cohen <arthur.co...@embecosm.com> wrote:

On 1/18/24 10:13, Rainer Orth wrote:
Arthur Cohen <arthur.co...@embecosm.com> writes:
Using %lu to format size_t values breaks 32 bit targets, and %zu is not
supported by one of the hosts GCC aims to support - HPUX
But we do have uses of %zu in gcc/rust already!
diff --git a/gcc/rust/expand/rust-proc-macro.cc 
b/gcc/rust/expand/rust-proc-macro.cc
index e8618485b71..09680733e98 100644
--- a/gcc/rust/expand/rust-proc-macro.cc
+++ b/gcc/rust/expand/rust-proc-macro.cc
@@ -171,7 +171,7 @@ load_macros (std::string path)
    if (array == nullptr)
      return {};
  -  rust_debug ("Found %lu procedural macros", array->length);
+  rust_debug ("Found %lu procedural macros", (unsigned long) array->length);
Not the best way either: array->length is std::uint64_t, so the format
should use
... %" PRIu64 " procedural...
instead.
I've attached my patch to PR rust/113461.

Yes, I was talking about this on IRC the other day - if we do run in a 
situation where we have more than UINT32_MAX procedural macros in memory we 
have big issues. These debug prints will probably end up getting removed soon 
as they clutter the output a lot for little information.

I don't mind doing it the right way for our regular prints, but we have not 
been using PRIu64 in our codebase so far, so I'd rather change all those 
incriminating format specifiers at once later down the line - this patch was 
pushed so that 32bit targets could bootstrap the Rust frontend for now.

For the sake of completeness, the issue does not just affect 32b hosts;  If a 
64b host chooses (as Darwin does, so that 32b and 64b targets have the same 
representation) to make uint64_t “unsigned long long int”, then %lu breaks 
there too.
thanks
Iain


Thanks for the precision! I'll definitely be more careful moving forward.

Kindly,

Arthur

Reply via email to