Skip to content
Snippets Groups Projects
  • Marek Polacek's avatar
    ae36f839
    preprocessor: -Wbidi-chars and UCNs [PR104030] · ae36f839
    Marek Polacek authored
    Stephan Bergmann reported that our -Wbidi-chars breaks the build
    of LibreOffice because we warn about UCNs even when their usage
    is correct: LibreOffice constructs strings piecewise, as in:
    
      aText = u"\u202D" + aText;
    
    and warning about that is overzealous.  Since no editor (AFAIK)
    interprets UCNs to show them as Unicode characters, there's less
    risk in misinterpreting them, and so perhaps we shouldn't warn
    about them by default.  However, identifiers containing UCNs or
    programs generating other programs could still cause confusion,
    so I'm keeping the UCN checking.  To turn it on, you just need
    to use -Wbidi-chars=unpaired,ucn or -Wbidi-chars=any,ucn.
    
    The implementation is done by using the new EnumSet feature.
    
    	PR preprocessor/104030
    
    gcc/c-family/ChangeLog:
    
    	* c.opt (Wbidi-chars): Mark as EnumSet.  Also accept =ucn.
    
    gcc/ChangeLog:
    
    	* doc/invoke.texi: Update documentation for -Wbidi-chars.
    
    libcpp/ChangeLog:
    
    	* include/cpplib.h (enum cpp_bidirectional_level): Add
    	bidirectional_ucn.  Set values explicitly.
    	* internal.h (cpp_reader): Adjust warn_bidi_p.
    	* lex.cc (maybe_warn_bidi_on_close): Don't warn about UCNs
    	unless UCN checking is on.
    	(maybe_warn_bidi_on_char): Likewise.
    
    gcc/testsuite/ChangeLog:
    
    	* c-c++-common/Wbidi-chars-10.c: Turn on UCN checking.
    	* c-c++-common/Wbidi-chars-11.c: Likewise.
    	* c-c++-common/Wbidi-chars-14.c: Likewise.
    	* c-c++-common/Wbidi-chars-16.c: Likewise.
    	* c-c++-common/Wbidi-chars-17.c: Likewise.
    	* c-c++-common/Wbidi-chars-4.c: Likewise.
    	* c-c++-common/Wbidi-chars-5.c: Likewise.
    	* c-c++-common/Wbidi-chars-6.c: Likewise.
    	* c-c++-common/Wbidi-chars-7.c: Likewise.
    	* c-c++-common/Wbidi-chars-8.c: Likewise.
    	* c-c++-common/Wbidi-chars-9.c: Likewise.
    	* c-c++-common/Wbidi-chars-ranges.c: Likewise.
    	* c-c++-common/Wbidi-chars-18.c: New test.
    	* c-c++-common/Wbidi-chars-19.c: New test.
    	* c-c++-common/Wbidi-chars-20.c: New test.
    	* c-c++-common/Wbidi-chars-21.c: New test.
    	* c-c++-common/Wbidi-chars-22.c: New test.
    	* c-c++-common/Wbidi-chars-23.c: New test.
    ae36f839
    History
    preprocessor: -Wbidi-chars and UCNs [PR104030]
    Marek Polacek authored
    Stephan Bergmann reported that our -Wbidi-chars breaks the build
    of LibreOffice because we warn about UCNs even when their usage
    is correct: LibreOffice constructs strings piecewise, as in:
    
      aText = u"\u202D" + aText;
    
    and warning about that is overzealous.  Since no editor (AFAIK)
    interprets UCNs to show them as Unicode characters, there's less
    risk in misinterpreting them, and so perhaps we shouldn't warn
    about them by default.  However, identifiers containing UCNs or
    programs generating other programs could still cause confusion,
    so I'm keeping the UCN checking.  To turn it on, you just need
    to use -Wbidi-chars=unpaired,ucn or -Wbidi-chars=any,ucn.
    
    The implementation is done by using the new EnumSet feature.
    
    	PR preprocessor/104030
    
    gcc/c-family/ChangeLog:
    
    	* c.opt (Wbidi-chars): Mark as EnumSet.  Also accept =ucn.
    
    gcc/ChangeLog:
    
    	* doc/invoke.texi: Update documentation for -Wbidi-chars.
    
    libcpp/ChangeLog:
    
    	* include/cpplib.h (enum cpp_bidirectional_level): Add
    	bidirectional_ucn.  Set values explicitly.
    	* internal.h (cpp_reader): Adjust warn_bidi_p.
    	* lex.cc (maybe_warn_bidi_on_close): Don't warn about UCNs
    	unless UCN checking is on.
    	(maybe_warn_bidi_on_char): Likewise.
    
    gcc/testsuite/ChangeLog:
    
    	* c-c++-common/Wbidi-chars-10.c: Turn on UCN checking.
    	* c-c++-common/Wbidi-chars-11.c: Likewise.
    	* c-c++-common/Wbidi-chars-14.c: Likewise.
    	* c-c++-common/Wbidi-chars-16.c: Likewise.
    	* c-c++-common/Wbidi-chars-17.c: Likewise.
    	* c-c++-common/Wbidi-chars-4.c: Likewise.
    	* c-c++-common/Wbidi-chars-5.c: Likewise.
    	* c-c++-common/Wbidi-chars-6.c: Likewise.
    	* c-c++-common/Wbidi-chars-7.c: Likewise.
    	* c-c++-common/Wbidi-chars-8.c: Likewise.
    	* c-c++-common/Wbidi-chars-9.c: Likewise.
    	* c-c++-common/Wbidi-chars-ranges.c: Likewise.
    	* c-c++-common/Wbidi-chars-18.c: New test.
    	* c-c++-common/Wbidi-chars-19.c: New test.
    	* c-c++-common/Wbidi-chars-20.c: New test.
    	* c-c++-common/Wbidi-chars-21.c: New test.
    	* c-c++-common/Wbidi-chars-22.c: New test.
    	* c-c++-common/Wbidi-chars-23.c: New test.