http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51364
--- Comment #12 from Ryan S. Arnold <rsa at us dot ibm.com> 2012-01-18 20:00:08
UTC ---
Returning to the bug report at hand...
In my version of float.h I have the following (which aligns with the typedef
definitions in the std::decimal namespace). This works just fine for _Decimal*
and decimal* compatibility:
typedef float _Decimal32 __attribute__((mode(SD)));
typedef float _Decimal64 __attribute__((mode(DD)));
typedef float _Decimal128 __attribute__((mode(TD)));
But the TR indicates that the following compatibility types are to be provided
instead so I attempted to replace what I have with these:
3.4.2 Header <float.h> synopsis
// C-compatibility convenience typedefs:
typedef std::decimal::decimal32 _Decimal32;
typedef std::decimal::decimal64 _Decimal64;
typedef std::decimal::decimal128 _Decimal128;
I've found that when this is provided in float.h (my own overloaded float.h) I
get the following warning:
warning: format '%Df' expects type '_Decimal64', but argument 2 has type
'_Decimal64'
And more importantly, the following error:
../libdfp-decimal/dfp/decimal/decimal:241:32: error: no matching function for
call to 'std::decimal::decimal32::__setval(_Decimal32&)'
/opt/at4.0/lib/gcc/powerpc64-linux/4.5.4/../../../../include/c++/4.5.4/decimal/decimal:304:10:
note: candidate is: void
std::decimal::decimal32::__setval(std::decimal::decimal32::__decfloat32)
Where the error identified code is doing the following:
template <class charT, class traits>
inline std::basic_istream<charT, traits> &
operator>>(std::basic_istream<charT, traits> & is, decimal32 & d)
{
char buf[CHAR_MAX];
memset(buf, '\0', CHAR_MAX);
is.read(buf,CHAR_MAX);
---> d.__setval(strtod32(buf, NULL));
return is;
}
(Note: This error isn't encountered when _Decimal32 is typedefed to float
_Decimal32 __attribute__((mode(SD)));).
This is how I'd expect to be able to set the actual value in the decimal32
number (coming out of a routine that returns a C-style _Decimal32) but this
obviously isn't correct since _Decimal32 is recognized by the C++ compiler as a
std::decimal::decimal32 typedef and is not type compatible with
std::decimal:decimal32::__decfloat32.
Interestingly, adding the following to the system decimal/decimal
std::decimal::decimal32 class definition makes the error go away:
operator __decfloat32() { return __val; }
I presume what is happening is that _Decimal32 is recognized as
std::decimal::decimal32 (due to the typedef) and then the __decfloat32 operator
is applied to it and it then magically matches the __setval() prototype and the
error is silenced. The problem is, it doesn't work, i.e., the assignment never
makes it way into __val correctly.
So I'm not sure what to make of the TR's requirement. It seems that the
typedef float _Decimal32 __attribute__((mode(SD))); method is the correct one.