The standard says that formatted/unformatted input operations should catch any exceptions, set iostate bits in the istream, and rethrow if the exception mask says to do so. We're failing to do that when the exception happens in the istream::sentry constructor, while it extracts characters to skip whitespace. This means that input operations exit with an exception even when the mask says not to. The fix is simply to add a try/catch to the sentry constructor. I've also clarified some comments related to these semantics. PR libstdc++/53984 * include/bits/basic_ios.h (basic_ios::_M_setstate): Adjust comment. * include/bits/istream.tcc (basic_istream::sentry): Handle exceptions during construction. * include/std/istream: Adjust comments for formatted input functions and unformatted input functions. * testsuite/27_io/basic_fstream/53984.cc: New. * testsuite/27_io/basic_istream/sentry/char/53984.cc: New. Tested powerpc64le-linux, committed to trunk.