On Thu, 31 Jul 2025, 22:23 James K. Lowden, <jklow...@cobolworx.com> wrote:

> I want to understand what our baseline is wrt %z in diagnostic
> messages.  The proximate cause is this change on July 11 for 32-bit
> Darwin to gcc/cobol/parse.y:
>
>    error_msg(loc, "FUNCTION %qs has "
> -            "inconsistent parameter type %zu (%qs)",
> -            keyword_str($1), p - args.data(), name_of(p->field) );
>

This code is just wrong. %zu expects size_t but the argument is ptrdiff_t



+            "inconsistent parameter type %ld (%qs)",
> +            keyword_str($1), (long)(p - args.data()), name_of(p->field) );
>
> I'm writing because I want to put it back as it was, and I don't want
> to work at cross purposes.
>
> This code had problems before the revision, which I'll describe
> shortly.  My objection is that this revision IMO takes the code
> backwards.
>
> 1.  It uses a C-style cast for C++ code in 2025.  C++ invented new cast
> operators for a reason, and cppcheck looks for them.
>
> 2.  The diagnostic framework recognizes %z in gcc 15 (and some versions
> prior).  A bootstrap build should compile the above without the revision.
>
> I think someone is going to tell me that gcc should build on 32-bit Darwin
> without error using the compiler that came with the system. But,
>
>         https://www.gnu.org/software/gcc/gcc-16/criteria.html
>
> makes no such claim.
>
> I would answer:
>
> 3.  The last 32-bit Apple machine was manufactured in 2006, before Taylor
> Swift was famous, when we still knew where Jim Gray was.
>
> 4.  We do not expect any COBOL users on 32-platforms, at all, ever.
>
> 5.  It is counterproductive to restrict new code in gcc to features of
> ancient compilers on obsolete hardware.
>
> 6.  Until and unless we can show the FE works on a 32-bit target,
> adapting the error messages to be correct is pointless.
>
> When I asked about this previously, I was told we distinguish between
> libraries we control and libraries we don't.  Anything relying on the C
> standard library needs to be backwards compatible such that the
> compiler and produced binary use it correctly.  Anything that is part
> of gcc, and thus under our control, we're free to use.  From that I
> concluded that diagnostic messages can use any formatting characters
> supported by the in-tree version of the diagnostic framework.  If that
> is incorrect, I would like to know which version of the diagnostic
> framework to use as a reference, today and in the future.
>
> IOW, what about %z?
>
> What follows is a critique of my own code, in case it informs anything
> above.
>
> The message leaves something to be desired:
>
>         parameter type %zu (%qs)",
> should say
>         parameter #%zu (type %qs)",
>
> The args variable up until recently was a bare C++ array.  To address
> issues rightly (if pedantically) raised by cppcheck, it was converted
> to std::vector.  The above code represents a minimalist change to
> satisfy cppcheck: it passes args.data() into a function and gets back a
> pointer that it uses to derive the index of the offending element.
>
> An improved version of that function will take std::vector as a
> parameter and return N, the index of the offending element in args.
> IMO the returned N should be size_t because basically all indexes are
> size_t these days.  But it could be unsigned long, and gcc_assert could
> enforce that no bits >32 are harmed in formulating the result.
>
> (I bet 1 beer that std::allocator::size_type is size_t for the C++
> standard library Apple shipped with XCode for its last 32-bit system.)
>
> This particular specific example, then, will be resolved some way or
> other.  I'd be interested in hearing how others would approach it, and
> why.
>
> Thank you for helping me understand the %z policy.  I realize my
> message sounds slightly combative.  I only want to express my position
> and assumptions clearly, that there be no confusion.  If there's some
> stated policy I should have been aware of, I would be grateful for the,
> um, pointer.
>
> --jkl
>

Reply via email to