On 02/13/2018 01:59 PM, Manuel López-Ibáñez wrote:
On 13 Feb 2018 5:58 pm, "Martin Sebor" <mse...@gmail.com <mailto:mse...@gmail.com>> wrote: I wanted to make the _n() functions like warning_n() more robust by letting them accept a tree argument (as well as offset_int and wide_int) in addition to HOST_WIDE_INT but I can't do it if they can't work with these types. There must be a tree-diagnostics.c where you can add those functions and then call the general diagnostic functions. Same for RTL.
I don't see how to do that. Here's a sketch of what I tried to do: struct IntegerConverter { union { tree t; unsigned HOST_WIDE_INT hwi; // buffer for offset_int, wide_int, etc. } value; IntegerConverter (tree t) { value.t = t; } IntegerConverter (unsigned HOST_WIDE_INT x) { value.x = x; } ... }; void error_n (int, const IntegerConverter &, const char*, ...); ... With that, the call error_n (loc, t, "%E thing", "%E things", t); works when t is a tree, and the call to the same function error_n (loc, i, "%wu thing", "%wu things", i); also works when i is a HOST_WIDE_INT. I chose this approach to avoid introducing additional overloads of the error_n() functions.
Note that pretty-printer.c works in the same way.
It works that way for arguments passed through the ellipsis. I was trying to use tree (indirectly) in the signature of the _n() functions and for that I need "tree.h" etc. in diagnostic-core.h and be able to call functions from the header in diagnostic-core.c. I suppose I could make the calls indirectly somehow but I can't avoid including GCC headers in diagnostic-core.h. Martin