These callers in libedit might get confused if wcwidth() returns -1. Note how the result ct_visual_width() is used in refresh.c:
refresh.c: h += ct_visual_width(*cp); Index: chartype.c =================================================================== RCS file: /cvs/src/lib/libedit/chartype.c,v retrieving revision 1.1 diff -u -p -r1.1 chartype.c --- chartype.c 30 Jun 2010 00:05:35 -0000 1.1 +++ chartype.c 3 Apr 2011 21:37:10 -0000 @@ -258,6 +258,9 @@ protected int ct_visual_width(Char c) { int t = ct_chr_class(c); +#ifdef WIDECHAR + int w; +#endif switch (t) { case CHTYPE_ASCIICTL: return 2; /* ^@ ^? etc. */ @@ -267,7 +270,8 @@ ct_visual_width(Char c) return 0; /* Should this be 1 instead? */ #ifdef WIDECHAR case CHTYPE_PRINT: - return wcwidth(c); + w = wcwidth(c); + return (w == -1 ? 0 : w); case CHTYPE_NONPRINT: if (c > 0xffff) /* prefer standard 4-byte display over 5-byte */ return 8; /* \U+12345 */ Index: refresh.c =================================================================== RCS file: /cvs/src/lib/libedit/refresh.c,v retrieving revision 1.11 diff -u -p -r1.11 refresh.c --- refresh.c 30 Jun 2010 00:05:35 -0000 1.11 +++ refresh.c 3 Apr 2011 21:39:42 -0000 @@ -160,6 +160,9 @@ re_putc(EditLine *el, Int c, int shift) int i, w = Width(c); ELRE_DEBUG(1, (__F, "printing %5x '%c'\r\n", c, c)); + if (w == -1) + w = 0; + while (shift && (el->el_refresh.r_cursor.h + w > el->el_term.t_size.h)) re_putc(el, ' ', 1);