Throwing std::ios_base::failure on formatted input with gcc 6.2

Edward Diener eldlistmailingz@tropicsoft.com
Thu Oct 27 13:55:00 GMT 2016


On 10/27/2016 6:29 AM, Jonathan Wakely wrote:
> On 26 October 2016 at 17:46, Edward Diener wrote:
>> On 10/26/2016 10:57 AM, Jonathan Wakely wrote:
>>>
>>> On 26 October 2016 at 14:42, Edward Diener wrote:
>>>>
>>>> I am missing the syntactical difference between the two. There is
>>>> 'std::ios_base::failure' and how do you specify the other one ? Your
>>>> notation of 'std::ios_base::[abi:__cxx11]failure' I do not understand.
>>>>
>>>
>>> It comes from the abi_tag attribute documented at
>>> https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
>>>
>>> namespace std {
>>>   struct ios_base {
>>>     struct __attribute__((abi__tag__("cxx11"))) failure { };
>>>   };
>>> }
>>>
>>> I got the demangled name slightly wrong, the attribute goes at the end:
>>>
>>> #include <iostream>
>>> int main()
>>> {
>>>   throw std::ios_base::failure("");
>>> }
>>> terminate called after throwing an instance of
>>> 'std::ios_base::failure[abi:cxx11]'
>>>   what():  : iostream error
>>> Aborted (core dumped)
>>
>>
>> I am syntactically catching 'std::ios::failure'. Are you saying that theheader
>> exception being thrown in my OP is actually
>> 'std::ios_base::failure[abi:cxx11]' ? I am still a bit confused when you
>> said in a previous reply:
>>
>>
>> "You're trying to catch the new one, but the library throws the old
>> one."
>
> I meant exactly that. You're trying to catch the new type, which has a
> std::system_error base class and is decorated with
> __attribute__((__abi_tag__("cxx11"))), but the library throws the old
> type, which is not decorated with the attribute.

It sounds like you are also saying that there is no way to catch the old 
type, even if I wanted to, since the header file declaration has the 
decorated attribute.





More information about the Gcc-help mailing list