[patch] libstdc++/56158 Extend valid values of iostream bitmask types
Jonathan Wakely
jwakely@redhat.com
Thu Nov 12 17:09:00 GMT 2015
On 12/11/15 08:48 -0700, Martin Sebor wrote:
>On 11/11/2015 02:48 AM, Jonathan Wakely wrote:
>>As described in the PR, we have operator~ overloads defined for
>>enumeration types which produce values outside the range of valid
>>values for the type. In C++11 that can be trivially solved by giving
>>the enumeration types a fixed underlying type, but this code needs to
>>be valid in C++03 too.
>>
>>This patch defines new min/max enumerators as INT_MIN/INT_MAX so that
>>every int value is also a valid value for the bitmask type.
>>
>>Does anyone see any problems with this solution, or better solutions?
>
>Just a minor nit that the C-style cast in the below triggers
>a -Wold-style-cast warning in Clang, in case libstdc++ tries
>to be Clang-warning free. Since the type of __INT_MAX__ is
>int it shouldn't be necessary.
>
>+ _S_ios_fmtflags_min = ~(int)__INT_MAX__
That's worth fixing, thanks.
>>
>>Any suggestions for how to test this, given that GCC's ubsan doesn't
>>check for this, and we can't run the testsuite with ubsan anyway?
>
>Use a case/switch statement with -Werror=switch-enum to make sure
>all the cases are handled and none is duplicated or outside of the
>valid values of the enumeration:
>
> void foo (ios::iostate s) {
> switch (s) {
> case badbit:
> case eofbit:
> case failbit:
> case goodbit:
> case __INT_MAX__:
> case ~__INT_MAX__: ;
> }
> }
I thought this was a great idea at first ... but -Wswitch-enum will
complain that the end, min and max enumerators are not handled (even
though __INT_MAX__ and ~__INT_MAX__ have the same values as the max
and min ones, respectively).
We could use something like this:
switch(f()) {
case ~ios::iostate():
default:
break;
}
Which with no warning options at all (or with -Wno-switch to suppress
other warnings) gives this for the buggy code currently on trunk:
e.cc:13:2: warning: case label value is less than minimum value for type
case ~ios::iostate():
^
But that could break if someone fixes that warning to depend on
-Wswitch (which it probably should do). And with -Wswitch that gives a
different warning:
e.cc:10:3: warning: case value â-1â not in enumerated type âEâ [-Wswitch]
So I think I'll just leave the tests as they are, and rely on our
diligent Clang users to report if there's still a problem :-)
I've committed the attached patch to trunk.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 3575 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20151112/84a46456/attachment.bin>
More information about the Gcc-patches
mailing list