[PATCH] [libc++] Linux: Correctly identify valid error codes

Justin Bogner mail at justinbogner.com
Wed May 28 09:57:36 PDT 2014


On Friday, May 23, 2014, David Majnemer <david.majnemer at gmail.com> wrote:

>
>
>
> On Fri, May 23, 2014 at 11:30 AM, Justin Bogner <mail at justinbogner.com<javascript:_e(%7B%7D,'cvml','mail at justinbogner.com');>
> > wrote:
>
>> David Majnemer <david.majnemer at gmail.com<javascript:_e(%7B%7D,'cvml','david.majnemer at gmail.com');>>
>> writes:
>> > [syserr.errcat.objects]p4 specifies that system_category
>> > ().default_error_condition(ev) map to error_condition(posv,
>> generic_category
>> > ()) if ev could map to a POSIX errno.
>> >
>> > Linux reserves up to and including 4095 for errno values, use this as a
>> bound.
>> >
>> > This fixes syserr.errcat.objects/system_category.pass.cpp on Linux.
>>
>> Would it be simpler to do something like
>>
>>   #if !defined(ELAST) && defined(__linux__)
>>   #define ELAST 4095
>>   #endif
>>
>> at the top of the file and avoid having to change every #ifdef?
>>
>
> I could do that if you wish but invading the POSIX namespace feels
> distasteful to me.
>

Fair enough. It's fine as you have it.


>
>> >
>> > diff --git a/src/ios.cpp b/src/ios.cpp
>> > index 03af978..e241394 100644
>> > --- a/src/ios.cpp
>> > +++ b/src/ios.cpp
>> > @@ -56,7 +56,9 @@ __iostream_category::message(int ev) const
>> >      if (ev != static_cast<int>(io_errc::stream)
>> >  #ifdef ELAST
>> >          && ev <= ELAST
>> > -#endif
>> > +#elif defined(__linux__)
>> > +        && ev <= 4095
>> > +#endif  // ELAST
>> >          )
>> >          return __do_message::message(ev);
>> >      return string("unspecified iostream_category error");
>> > diff --git a/src/system_error.cpp b/src/system_error.cpp
>> > index 00920ff..d5cb2d4 100644
>> > --- a/src/system_error.cpp
>> > +++ b/src/system_error.cpp
>> > @@ -68,6 +68,9 @@ __generic_error_category::message(int ev) const
>> >  #ifdef ELAST
>> >      if (ev > ELAST)
>> >        return string("unspecified generic_category error");
>> > +#elif defined(__linux__)
>> > +    if (ev > 4095)
>> > +      return string("unspecified generic_category error");
>> >  #endif  // ELAST
>> >      return __do_message::message(ev);
>> >  }
>> > @@ -100,6 +103,9 @@ __system_error_category::message(int ev) const
>> >  #ifdef ELAST
>> >      if (ev > ELAST)
>> >        return string("unspecified system_category error");
>> > +#elif defined(__linux__)
>> > +    if (ev > 4095)
>> > +      return string("unspecified system_category error");
>> >  #endif  // ELAST
>> >      return __do_message::message(ev);
>> >  }
>> > @@ -110,6 +116,9 @@
>> __system_error_category::default_error_condition(int ev) const _NOEXCEPT
>> >  #ifdef ELAST
>> >      if (ev > ELAST)
>> >        return error_condition(ev, system_category());
>> > +#elif defined(__linux__)
>> > +    if (ev > 4095)
>> > +      return error_condition(ev, system_category());
>> >  #endif  // ELAST
>> >      return error_condition(ev, generic_category());
>> >  }
>> > diff --git
>> a/test/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp
>> b/test/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp
>> > index ddcb725..b5cb18a 100644
>> > ---
>> a/test/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp
>> > +++
>> b/test/diagnostics/syserr/syserr.errcat/syserr.errcat.objects/system_category.pass.cpp
>> > @@ -23,7 +23,7 @@ int main()
>> >      std::error_condition e_cond = e_cat1.default_error_condition(5);
>> >      assert(e_cond.value() == 5);
>> >      assert(e_cond.category() == std::generic_category());
>> > -    e_cond = e_cat1.default_error_condition(500);
>> > -    assert(e_cond.value() == 500);
>> > +    e_cond = e_cat1.default_error_condition(5000);
>> > +    assert(e_cond.value() == 5000);
>> >      assert(e_cond.category() == std::system_category());
>> >  }
>> > _______________________________________________
>> > cfe-commits mailing list
>> > cfe-commits at cs.uiuc.edu<javascript:_e(%7B%7D,'cvml','cfe-commits at cs.uiuc.edu');>
>> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140528/de6299ba/attachment.html>


More information about the cfe-commits mailing list