libstdc++: Hide 128-bit int and float types behind handle for basic_format_arg visitation [PR108053]

Implement visit_format_arg and basic_format_arg::visit function,
in terms of  _M_visit_user member functions, that wraps any type
stored inside basic_format_arg, that is not specified in the standard,
into the handle. This affects __int128, unsigned __int128,
PowerPC specific __ieee128 and __ibm128, and _Float128 for architectures
where long double is not 128bits.

The bfloat16, _Float16, _Float32, _Float32, and _Float128 for
128bits long double are not are not addressed, as they
are transformed into a standard floating point types.

For internal purposes __format::__visit_format_arg function is
used, that provides an unmodified access to stored object.

	PR libstdc++/108053

libstdc++-v3/ChangeLog:

	* include/std/format (basic_format_arg::_M_visit_user):
	Helper function for wrapping extension types into handle.
	(visit_format_arg): Call `_M_visit_user` instead of `_M_visit`.
	(basic_format_arg::visit): As above.
	(__format::__visit_format_arg): Provides direct access to
	values stored in basic_format_arg.
	(__format::__int_from_arg): Use __format::__visit_format_arg
	instead of std::visit_format_arg.
	(_Formatting_scanner::_M_format_arg): As above.
	(_Checking_scanner::__do_vformat_to): As above.
	* testsuite/std/format/arguments/args.cc: New tests.
	* testsuite/std/format/string.cc: Test for using __int128
	as width/precision.

Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>
3 files changed