On DJGPP, rather than _M_table pointing to the mask for '\0', it points to the mask for EOF. It is then offset by one in ctype<char>::is(mask, char), but not in ctype<char>::is(const char*, const char*, mask*), ctype<char>::table() or in the constructor mask* parameter. (ctype<char>::classic_table() returns 0.)
The constructor also sets _M_toupper and _M_tolower to point to the respective table entries for EOF, but then doesn't use them at all, instead passing the char parameter to ::toupper(int) or ::tolower(int), without casting it to unsigned char. ctype_inline.h and ctype_noninline.h in config/os/djgpp/ should probably be updated to match the Solaris files, for example, with __ctype_mask changed to (__dj_ctype_flags+1), __trans_upper changed to (__dj_ctype_toupper+1), and __trans_lower changed to (__dj_ctype_tolower+1). (This bug is similar to the old bug 7461 against Cygwin.) -- Summary: ctype<char> tables are offset by one on DJGPP Product: gcc Version: 3.4.4 Status: UNCONFIRMED Severity: normal Priority: P3 Component: libstdc++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: carey dot evans at gmail dot com CC: gcc-bugs at gcc dot gnu dot org GCC host triplet: i386-pc-msdosdjgpp http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22087