diff options
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/include/cpplib.h | 11 | ||||
-rw-r--r-- | libcpp/internal.h | 3 | ||||
-rw-r--r-- | libcpp/lex.cc | 16 |
3 files changed, 18 insertions, 12 deletions
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index 940c79f..3eba6f7 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -319,15 +319,16 @@ enum cpp_main_search CMS_system, /* Search the system INCLUDE path. */ }; -/* The possible bidirectional control characters checking levels, from least - restrictive to most. */ +/* The possible bidirectional control characters checking levels. */ enum cpp_bidirectional_level { /* No checking. */ - bidirectional_none, + bidirectional_none = 0, /* Only detect unpaired uses of bidirectional control characters. */ - bidirectional_unpaired, + bidirectional_unpaired = 1, /* Detect any use of bidirectional control characters. */ - bidirectional_any + bidirectional_any = 2, + /* Also warn about UCNs. */ + bidirectional_ucn = 4 }; /* This structure is nested inside struct cpp_reader, and diff --git a/libcpp/internal.h b/libcpp/internal.h index 364c41c..badfd1b 100644 --- a/libcpp/internal.h +++ b/libcpp/internal.h @@ -605,7 +605,8 @@ struct cpp_reader characters. */ bool warn_bidi_p () const { - return CPP_OPTION (this, cpp_warn_bidirectional) != bidirectional_none; + return (CPP_OPTION (this, cpp_warn_bidirectional) + & (bidirectional_unpaired|bidirectional_any)); } }; diff --git a/libcpp/lex.cc b/libcpp/lex.cc index 4d73657..fb1dfab 100644 --- a/libcpp/lex.cc +++ b/libcpp/lex.cc @@ -1560,8 +1560,11 @@ class unpaired_bidi_rich_location : public rich_location static void maybe_warn_bidi_on_close (cpp_reader *pfile, const uchar *p) { - if (CPP_OPTION (pfile, cpp_warn_bidirectional) == bidirectional_unpaired - && bidi::vec.count () > 0) + const auto warn_bidi = CPP_OPTION (pfile, cpp_warn_bidirectional); + if (bidi::vec.count () > 0 + && (warn_bidi & bidirectional_unpaired + && (!bidi::current_ctx_ucn_p () + || (warn_bidi & bidirectional_ucn)))) { const location_t loc = linemap_position_for_column (pfile->line_table, @@ -1597,7 +1600,7 @@ maybe_warn_bidi_on_char (cpp_reader *pfile, bidi::kind kind, const auto warn_bidi = CPP_OPTION (pfile, cpp_warn_bidirectional); - if (warn_bidi != bidirectional_none) + if (warn_bidi & (bidirectional_unpaired|bidirectional_any)) { rich_location rich_loc (pfile->line_table, loc); rich_loc.set_escape_on_output (true); @@ -1605,10 +1608,10 @@ maybe_warn_bidi_on_char (cpp_reader *pfile, bidi::kind kind, /* It seems excessive to warn about a PDI/PDF that is closing an opened context because we've already warned about the opening character. Except warn when we have a UCN x UTF-8 - mismatch. */ + mismatch, if UCN checking is enabled. */ if (kind == bidi::current_ctx ()) { - if (warn_bidi == bidirectional_unpaired + if (warn_bidi == (bidirectional_unpaired|bidirectional_ucn) && bidi::current_ctx_ucn_p () != ucn_p) { rich_loc.add_range (bidi::current_ctx_loc ()); @@ -1617,7 +1620,8 @@ maybe_warn_bidi_on_char (cpp_reader *pfile, bidi::kind kind, "a context by \"%s\"", bidi::to_str (kind)); } } - else if (warn_bidi == bidirectional_any) + else if (warn_bidi & bidirectional_any + && (!ucn_p || (warn_bidi & bidirectional_ucn))) { if (kind == bidi::kind::PDF || kind == bidi::kind::PDI) cpp_warning_at (pfile, CPP_W_BIDIRECTIONAL, &rich_loc, |