From 3588e6284e0eb123e0eab639912a2678250a6002 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Nov 01 2021 07:25:56 +0000 Subject: import devtoolset-10-gcc-10.2.1-11.2.el7 --- diff --git a/SOURCES/gcc10-add-Wbidirectional.patch b/SOURCES/gcc10-add-Wbidirectional.patch new file mode 100644 index 0000000..85575b5 --- /dev/null +++ b/SOURCES/gcc10-add-Wbidirectional.patch @@ -0,0 +1,1443 @@ +From a241a9b727f03afe62a161a2662a0f1192fd523a Mon Sep 17 00:00:00 2001 +From: Marek Polacek +Date: Wed, 6 Oct 2021 14:33:59 -0400 +Subject: [PATCH] cpp: Implement -Wbidirectional=[none|unpaired|any] + +This patch implements -Wbidirectional=[none|unpaired|any] to warn about +possibly dangerous bidirectional characters. + +gcc/c-family/ChangeLog: + + * c.opt (Wbidirectional, Wbidirectional=): New option. + +gcc/ChangeLog: + + * doc/invoke.texi: Document -Wbidirectional. + +libcpp/ChangeLog: + + * include/cpplib.h (enum cpp_bidirectional_level): New. + (struct cpp_options): Add cpp_warn_bidirectional. + (enum cpp_warning_reason): Add CPP_W_BIDIRECTIONAL. + * init.c (cpp_create_reader): Set cpp_warn_bidirectional. + * lex.c (bidi): New namespace. + (get_bidi_utf8): New function. + (get_bidi_ucn): Likewise. + (maybe_warn_bidi_on_close): Likewise. + (maybe_warn_bidi_on_char): Likewise. + (_cpp_skip_block_comment): Implement warning about bidirectional + characters. + (skip_line_comment): Likewise. + (forms_identifier_p): Likewise. + (lex_identifier): Likewise. + (lex_string): Likewise. + (lex_raw_string): Likewise. + +gcc/testsuite/ChangeLog: + + * c-c++-common/Wbidirectional-1.c: New test. + * c-c++-common/Wbidirectional-2.c: New test. + * c-c++-common/Wbidirectional-3.c: New test. + * c-c++-common/Wbidirectional-4.c: New test. + * c-c++-common/Wbidirectional-5.c: New test. + * c-c++-common/Wbidirectional-6.c: New test. + * c-c++-common/Wbidirectional-7.c: New test. + * c-c++-common/Wbidirectional-8.c: New test. + * c-c++-common/Wbidirectional-9.c: New test. + * c-c++-common/Wbidirectional-10.c: New test. + * c-c++-common/Wbidirectional-11.c: New test. + * c-c++-common/Wbidirectional-12.c: New test. + * c-c++-common/Wbidirectional-13.c: New test. +--- + gcc/c-family/c.opt | 24 ++ + gcc/doc/invoke.texi | 19 +- + gcc/testsuite/c-c++-common/Wbidirectional-1.c | 11 + + .../c-c++-common/Wbidirectional-10.c | 27 ++ + .../c-c++-common/Wbidirectional-11.c | 12 + + .../c-c++-common/Wbidirectional-12.c | 18 + + .../c-c++-common/Wbidirectional-13.c | 16 + + gcc/testsuite/c-c++-common/Wbidirectional-2.c | 8 + + gcc/testsuite/c-c++-common/Wbidirectional-3.c | 10 + + gcc/testsuite/c-c++-common/Wbidirectional-4.c | 165 ++++++++ + gcc/testsuite/c-c++-common/Wbidirectional-5.c | 165 ++++++++ + gcc/testsuite/c-c++-common/Wbidirectional-6.c | 154 +++++++ + gcc/testsuite/c-c++-common/Wbidirectional-7.c | 8 + + gcc/testsuite/c-c++-common/Wbidirectional-8.c | 12 + + gcc/testsuite/c-c++-common/Wbidirectional-9.c | 28 ++ + libcpp/include/cpplib.h | 18 +- + libcpp/init.c | 1 + + libcpp/lex.c | 391 +++++++++++++++++- + 18 files changed, 1072 insertions(+), 15 deletions(-) + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-1.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-10.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-11.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-12.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-13.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-2.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-3.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-4.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-5.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-6.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-7.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-8.c + create mode 100644 gcc/testsuite/c-c++-common/Wbidirectional-9.c + +diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt +index 06457ac739e..09391824676 100644 +--- a/gcc/c-family/c.opt ++++ b/gcc/c-family/c.opt +@@ -374,6 +374,30 @@ Wbad-function-cast + C ObjC Var(warn_bad_function_cast) Warning + Warn about casting functions to incompatible types. + ++Wbidirectional ++C ObjC C++ ObjC++ Warning Alias(Wbidirectional=,any,none) ++; ++ ++Wbidirectional= ++C ObjC C++ ObjC++ RejectNegative Joined Warning CPP(cpp_warn_bidirectional) CppReason(CPP_W_BIDIRECTIONAL) Var(warn_bidirectional) Init(bidirectional_unpaired) Enum(cpp_bidirectional_level) ++-Wbidirectional=[none|unpaired|any] Warn about UTF-8 bidirectional characters. ++ ++; Required for these enum values. ++SourceInclude ++cpplib.h ++ ++Enum ++Name(cpp_bidirectional_level) Type(int) UnknownError(argument %qs to %<-Wbidirectional%> not recognized) ++ ++EnumValue ++Enum(cpp_bidirectional_level) String(none) Value(bidirectional_none) ++ ++EnumValue ++Enum(cpp_bidirectional_level) String(unpaired) Value(bidirectional_unpaired) ++ ++EnumValue ++Enum(cpp_bidirectional_level) String(any) Value(bidirectional_any) ++ + Wbool-compare + C ObjC C++ ObjC++ Var(warn_bool_compare) Warning LangEnabledBy(C ObjC C++ ObjC++,Wall) + Warn about boolean expression compared with an integer value different from true/false. +diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi +index b64ec18ae46..e32858ce767 100644 +--- a/gcc/doc/invoke.texi ++++ b/gcc/doc/invoke.texi +@@ -304,7 +304,9 @@ Objective-C and Objective-C++ Dialects}. + -Warith-conversion @gol + -Warray-bounds -Warray-bounds=@var{n} @gol + -Wno-attributes -Wattribute-alias=@var{n} -Wno-attribute-alias @gol +--Wno-attribute-warning -Wbool-compare -Wbool-operation @gol ++-Wno-attribute-warning @gol ++-Wbidirectional=@r{[}none@r{|}unpaired@r{|}any@r{]} @gol ++-Wbool-compare -Wbool-operation @gol + -Wno-builtin-declaration-mismatch @gol + -Wno-builtin-macro-redefined -Wc90-c99-compat -Wc99-c11-compat @gol + -Wc11-c2x-compat @gol +@@ -6758,6 +6760,21 @@ Attributes considered include @code{allo + This is the default. You can disable these warnings with either + @option{-Wno-attribute-alias} or @option{-Wattribute-alias=0}. + ++@item -Wbidirectional=@r{[}none@r{|}unpaired@r{|}any@r{]} ++@opindex Wbidirectional= ++@opindex Wbidirectional ++@opindex Wno-bidirectional ++Warn about UTF-8 bidirectional characters. Such characters can change ++left-to-right writing direction into right-to-left (and vice versa), ++which can cause confusion between the logical order and visual order. ++This may be dangerous; for instance, it may seem that a piece of code ++is not commented out, whereas it in fact is. ++ ++There are three levels of warning supported by GCC@. The default is ++@option{-Wbidirectional=unpaired}, which warns about improperly terminated ++bidi contexts. @option{-Wbidirectional=none} turns the warning off. ++@option{-Wbidirectional=any} warns about any use of bidirectional characters. ++ + @item -Wbool-compare + @opindex Wno-bool-compare + @opindex Wbool-compare +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-1.c b/gcc/testsuite/c-c++-common/Wbidirectional-1.c +new file mode 100644 +index 00000000000..750de81fdd8 +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-1.c +@@ -0,0 +1,11 @@ ++/* { dg-do compile } */ ++ ++int main() { ++ int isAdmin = 0; ++ /*‮ } ⁦if (isAdmin)⁩ ⁦ begin admins only */ ++/* { dg-warning "bidirectional" "" { target *-*-* } .-1 } */ ++ __builtin_printf("You are an admin.\n"); ++ /* end admins only ‮ { ⁦*/ ++/* { dg-warning "bidirectional" "" { target *-*-* } .-1 } */ ++ return 0; ++} +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-10.c b/gcc/testsuite/c-c++-common/Wbidirectional-10.c +new file mode 100644 +index 00000000000..cd4abeeefbd +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-10.c +@@ -0,0 +1,27 @@ ++/* { dg-do compile } */ ++/* { dg-options "-Wbidirectional=unpaired" } */ ++/* More nesting testing. */ ++ ++/* RLE‫ LRI⁦ PDF‬ PDI⁩*/ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int LRE_\u202a_PDF_\u202c; ++int LRE_\u202a_PDF_\u202c_LRE_\u202a_PDF_\u202c; ++int LRE_\u202a_LRI_\u2066_PDF_\u202c_PDI_\u2069; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int RLE_\u202b_RLI_\u2067_PDF_\u202c_PDI_\u2069; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int RLE_\u202b_RLI_\u2067_PDI_\u2069_PDF_\u202c; ++int FSI_\u2068_LRO_\u202d_PDI_\u2069_PDF_\u202c; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int FSI_\u2068; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int FSI_\u2068_PDI_\u2069; ++int FSI_\u2068_FSI_\u2068_PDI_\u2069; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDI_\u2069; ++int RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDI_\u2069; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDF_\u202c; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int RLI_\u2067_RLI_\u2067_RLI_\u2067_RLI_\u2067_FSI_\u2068_PDI_\u2069_PDI_\u2069_PDI_\u2069_PDI_\u2069; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-11.c b/gcc/testsuite/c-c++-common/Wbidirectional-11.c +new file mode 100644 +index 00000000000..43d699acc64 +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-11.c +@@ -0,0 +1,12 @@ ++/* { dg-do compile } */ ++/* { dg-options "-Wbidirectional=unpaired" } */ ++/* Test that we warn when mixing UCN and UTF-8. */ ++ ++int LRE_‪_PDF_\u202c; ++/* { dg-warning "mismatch" "" { target *-*-* } .-1 } */ ++int LRE_\u202a_PDF_‬_; ++/* { dg-warning "mismatch" "" { target *-*-* } .-1 } */ ++const char *s1 = "LRE_‪_PDF_\u202c"; ++/* { dg-warning "mismatch" "" { target *-*-* } .-1 } */ ++const char *s2 = "LRE_\u202a_PDF_‬"; ++/* { dg-warning "mismatch" "" { target *-*-* } .-1 } */ +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-12.c b/gcc/testsuite/c-c++-common/Wbidirectional-12.c +new file mode 100644 +index 00000000000..20d1566401a +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-12.c +@@ -0,0 +1,18 @@ ++/* { dg-do compile { target { c || c++11 } } } */ ++/* { dg-options "-Wbidirectional=any" } */ ++/* Test raw strings. */ ++ ++const char *s1 = R"(a b c LRE‪ 1 2 3 PDF‬ x y z)"; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++const char *s2 = R"(a b c RLE‫ 1 2 3 PDF‬ x y z)"; ++/* { dg-warning "U\\+202B" "" { target *-*-* } .-1 } */ ++const char *s3 = R"(a b c LRO‭ 1 2 3 PDF‬ x y z)"; ++/* { dg-warning "U\\+202D" "" { target *-*-* } .-1 } */ ++const char *s4 = R"(a b c RLO‮ 1 2 3 PDF‬ x y z)"; ++/* { dg-warning "U\\+202E" "" { target *-*-* } .-1 } */ ++const char *s7 = R"(a b c FSI⁨ 1 2 3 PDI⁩ x y) z"; ++/* { dg-warning "U\\+2068" "" { target *-*-* } .-1 } */ ++const char *s8 = R"(a b c PDI⁩ x y )z"; ++/* { dg-warning "U\\+2069" "" { target *-*-* } .-1 } */ ++const char *s9 = R"(a b c PDF‬ x y z)"; ++/* { dg-warning "U\\+202C" "" { target *-*-* } .-1 } */ +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-13.c b/gcc/testsuite/c-c++-common/Wbidirectional-13.c +new file mode 100644 +index 00000000000..08010e3b37b +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-13.c +@@ -0,0 +1,16 @@ ++/* { dg-do compile { target { c || c++11 } } } */ ++/* { dg-options "-Wbidirectional=unpaired" } */ ++/* Test raw strings. */ ++ ++const char *s1 = R"(a b c LRE‪ 1 2 3)"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++const char *s2 = R"(a b c RLE‫ 1 2 3)"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++const char *s3 = R"(a b c LRO‭ 1 2 3)"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++const char *s4 = R"(a b c FSI⁨ 1 2 3)"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++const char *s5 = R"(a b c LRI⁦ 1 2 3)"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++const char *s6 = R"(a b c RLI⁧ 1 2 3)"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-2.c b/gcc/testsuite/c-c++-common/Wbidirectional-2.c +new file mode 100644 +index 00000000000..4e04202e058 +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-2.c +@@ -0,0 +1,8 @@ ++/* { dg-do compile } */ ++ ++int main() { ++ /* Say hello; newline⁧/*/ return 0 ; ++/* { dg-warning "bidirectional" "" { target *-*-* } .-1 } */ ++ __builtin_printf("Hello world.\n"); ++ return 0; ++} +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-3.c b/gcc/testsuite/c-c++-common/Wbidirectional-3.c +new file mode 100644 +index 00000000000..921300e94e0 +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-3.c +@@ -0,0 +1,10 @@ ++/* { dg-do compile } */ ++ ++int main() { ++ const char* access_level = "user"; ++ if (__builtin_strcmp(access_level, "user‮ ⁦// Check if admin⁩ ⁦")) { ++/* { dg-warning "bidirectional" "" { target *-*-* } .-1 } */ ++ __builtin_printf("You are an admin.\n"); ++ } ++ return 0; ++} +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-4.c b/gcc/testsuite/c-c++-common/Wbidirectional-4.c +new file mode 100644 +index 00000000000..e6638aecc6a +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-4.c +@@ -0,0 +1,165 @@ ++/* { dg-do compile } */ ++/* { dg-options "-Wbidirectional=any -Wno-multichar -Wno-overflow" } */ ++/* Test all bidi chars in various contexts (identifiers, comments, ++ string literals, character constants), both UCN and UTF-8. The bidi ++ chars here are properly terminated, except for the character constants. */ ++ ++/* a b c LRE‪ 1 2 3 PDF‬ x y z */ ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++/* a b c RLE‫ 1 2 3 PDF‬ x y z */ ++/* { dg-warning "U\\+202B" "" { target *-*-* } .-1 } */ ++/* a b c LRO‭ 1 2 3 PDF‬ x y z */ ++/* { dg-warning "U\\+202D" "" { target *-*-* } .-1 } */ ++/* a b c RLO‮ 1 2 3 PDF‬ x y z */ ++/* { dg-warning "U\\+202E" "" { target *-*-* } .-1 } */ ++/* a b c LRI⁦ 1 2 3 PDI⁩ x y z */ ++/* { dg-warning "U\\+2066" "" { target *-*-* } .-1 } */ ++/* a b c RLI⁧ 1 2 3 PDI⁩ x y */ ++/* { dg-warning "U\\+2067" "" { target *-*-* } .-1 } */ ++/* a b c FSI⁨ 1 2 3 PDI⁩ x y z */ ++/* { dg-warning "U\\+2068" "" { target *-*-* } .-1 } */ ++ ++/* Same but C++ comments instead. */ ++// a b c LRE‪ 1 2 3 PDF‬ x y z ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++// a b c RLE‫ 1 2 3 PDF‬ x y z ++/* { dg-warning "U\\+202B" "" { target *-*-* } .-1 } */ ++// a b c LRO‭ 1 2 3 PDF‬ x y z ++/* { dg-warning "U\\+202D" "" { target *-*-* } .-1 } */ ++// a b c RLO‮ 1 2 3 PDF‬ x y z ++/* { dg-warning "U\\+202E" "" { target *-*-* } .-1 } */ ++// a b c LRI⁦ 1 2 3 PDI⁩ x y z ++/* { dg-warning "U\\+2066" "" { target *-*-* } .-1 } */ ++// a b c RLI⁧ 1 2 3 PDI⁩ x y ++/* { dg-warning "U\\+2067" "" { target *-*-* } .-1 } */ ++// a b c FSI⁨ 1 2 3 PDI⁩ x y z ++/* { dg-warning "U\\+2068" "" { target *-*-* } .-1 } */ ++ ++/* Here we're closing an unopened context, warn when =any. */ ++/* a b c PDI⁩ x y z */ ++/* { dg-warning "U\\+2069" "" { target *-*-* } .-1 } */ ++/* a b c PDF‬ x y z */ ++/* { dg-warning "U\\+202C" "" { target *-*-* } .-1 } */ ++// a b c PDI⁩ x y z ++/* { dg-warning "U\\+2069" "" { target *-*-* } .-1 } */ ++// a b c PDF‬ x y z ++/* { dg-warning "U\\+202C" "" { target *-*-* } .-1 } */ ++ ++void ++g1 () ++{ ++ const char *s1 = "a b c LRE‪ 1 2 3 PDF‬ x y z"; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++ const char *s2 = "a b c RLE‫ 1 2 3 PDF‬ x y z"; ++/* { dg-warning "U\\+202B" "" { target *-*-* } .-1 } */ ++ const char *s3 = "a b c LRO‭ 1 2 3 PDF‬ x y z"; ++/* { dg-warning "U\\+202D" "" { target *-*-* } .-1 } */ ++ const char *s4 = "a b c RLO‮ 1 2 3 PDF‬ x y z"; ++/* { dg-warning "U\\+202E" "" { target *-*-* } .-1 } */ ++ const char *s5 = "a b c LRI⁦ 1 2 3 PDI⁩ x y z"; ++/* { dg-warning "U\\+2066" "" { target *-*-* } .-1 } */ ++ const char *s6 = "a b c RLI⁧ 1 2 3 PDI⁩ x y z"; ++/* { dg-warning "U\\+2067" "" { target *-*-* } .-1 } */ ++ const char *s7 = "a b c FSI⁨ 1 2 3 PDI⁩ x y z"; ++/* { dg-warning "U\\+2068" "" { target *-*-* } .-1 } */ ++ const char *s8 = "a b c PDI⁩ x y z"; ++/* { dg-warning "U\\+2069" "" { target *-*-* } .-1 } */ ++ const char *s9 = "a b c PDF‬ x y z"; ++/* { dg-warning "U\\+202C" "" { target *-*-* } .-1 } */ ++ ++ const char *s10 = "a b c LRE\u202a 1 2 3 PDF\u202c x y z"; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++ const char *s11 = "a b c LRE\u202A 1 2 3 PDF\u202c x y z"; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++ const char *s12 = "a b c RLE\u202b 1 2 3 PDF\u202c x y z"; ++/* { dg-warning "U\\+202B" "" { target *-*-* } .-1 } */ ++ const char *s13 = "a b c RLE\u202B 1 2 3 PDF\u202c x y z"; ++/* { dg-warning "U\\+202B" "" { target *-*-* } .-1 } */ ++ const char *s14 = "a b c LRO\u202d 1 2 3 PDF\u202c x y z"; ++/* { dg-warning "U\\+202D" "" { target *-*-* } .-1 } */ ++ const char *s15 = "a b c LRO\u202D 1 2 3 PDF\u202c x y z"; ++/* { dg-warning "U\\+202D" "" { target *-*-* } .-1 } */ ++ const char *s16 = "a b c RLO\u202e 1 2 3 PDF\u202c x y z"; ++/* { dg-warning "U\\+202E" "" { target *-*-* } .-1 } */ ++ const char *s17 = "a b c RLO\u202E 1 2 3 PDF\u202c x y z"; ++/* { dg-warning "U\\+202E" "" { target *-*-* } .-1 } */ ++ const char *s18 = "a b c LRI\u2066 1 2 3 PDI\u2069 x y z"; ++/* { dg-warning "U\\+2066" "" { target *-*-* } .-1 } */ ++ const char *s19 = "a b c RLI\u2067 1 2 3 PDI\u2069 x y z"; ++/* { dg-warning "U\\+2067" "" { target *-*-* } .-1 } */ ++ const char *s20 = "a b c FSI\u2068 1 2 3 PDI\u2069 x y z"; ++/* { dg-warning "U\\+2068" "" { target *-*-* } .-1 } */ ++} ++ ++void ++g2 () ++{ ++ const char c1 = '\u202a'; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++ const char c2 = '\u202A'; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++ const char c3 = '\u202b'; ++/* { dg-warning "U\\+202B" "" { target *-*-* } .-1 } */ ++ const char c4 = '\u202B'; ++/* { dg-warning "U\\+202B" "" { target *-*-* } .-1 } */ ++ const char c5 = '\u202d'; ++/* { dg-warning "U\\+202D" "" { target *-*-* } .-1 } */ ++ const char c6 = '\u202D'; ++/* { dg-warning "U\\+202D" "" { target *-*-* } .-1 } */ ++ const char c7 = '\u202e'; ++/* { dg-warning "U\\+202E" "" { target *-*-* } .-1 } */ ++ const char c8 = '\u202E'; ++/* { dg-warning "U\\+202E" "" { target *-*-* } .-1 } */ ++ const char c9 = '\u2066'; ++/* { dg-warning "U\\+2066" "" { target *-*-* } .-1 } */ ++ const char c10 = '\u2067'; ++/* { dg-warning "U\\+2067" "" { target *-*-* } .-1 } */ ++ const char c11 = '\u2068'; ++/* { dg-warning "U\\+2068" "" { target *-*-* } .-1 } */ ++} ++ ++int a‪b‬c; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++int a‫b‬c; ++/* { dg-warning "U\\+202B" "" { target *-*-* } .-1 } */ ++int a‭b‬c; ++/* { dg-warning "U\\+202D" "" { target *-*-* } .-1 } */ ++int a‮b‬c; ++/* { dg-warning "U\\+202E" "" { target *-*-* } .-1 } */ ++int a⁦b⁩c; ++/* { dg-warning "U\\+2066" "" { target *-*-* } .-1 } */ ++int a⁧b⁩c; ++/* { dg-warning "U\\+2067" "" { target *-*-* } .-1 } */ ++int a⁨b⁩c; ++/* { dg-warning "U\\+2068" "" { target *-*-* } .-1 } */ ++int A‬X; ++/* { dg-warning "U\\+202C" "" { target *-*-* } .-1 } */ ++int A\u202cY; ++/* { dg-warning "U\\+202C" "" { target *-*-* } .-1 } */ ++int A\u202CY2; ++/* { dg-warning "U\\+202C" "" { target *-*-* } .-1 } */ ++ ++int d\u202ae\u202cf; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++int d\u202Ae\u202cf2; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++int d\u202be\u202cf; ++/* { dg-warning "U\\+202B" "" { target *-*-* } .-1 } */ ++int d\u202Be\u202cf2; ++/* { dg-warning "U\\+202B" "" { target *-*-* } .-1 } */ ++int d\u202de\u202cf; ++/* { dg-warning "U\\+202D" "" { target *-*-* } .-1 } */ ++int d\u202De\u202cf2; ++/* { dg-warning "U\\+202D" "" { target *-*-* } .-1 } */ ++int d\u202ee\u202cf; ++/* { dg-warning "U\\+202E" "" { target *-*-* } .-1 } */ ++int d\u202Ee\u202cf2; ++/* { dg-warning "U\\+202E" "" { target *-*-* } .-1 } */ ++int d\u2066e\u2069f; ++/* { dg-warning "U\\+2066" "" { target *-*-* } .-1 } */ ++int d\u2067e\u2069f; ++/* { dg-warning "U\\+2067" "" { target *-*-* } .-1 } */ ++int d\u2068e\u2069f; ++/* { dg-warning "U\\+2068" "" { target *-*-* } .-1 } */ ++int X\u2069; ++/* { dg-warning "U\\+2069" "" { target *-*-* } .-1 } */ +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-5.c b/gcc/testsuite/c-c++-common/Wbidirectional-5.c +new file mode 100644 +index 00000000000..45d3402c941 +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-5.c +@@ -0,0 +1,165 @@ ++/* { dg-do compile } */ ++/* { dg-options "-Wbidirectional=unpaired -Wno-multichar -Wno-overflow" } */ ++/* Test all bidi chars in various contexts (identifiers, comments, ++ string literals, character constants), both UCN and UTF-8. The bidi ++ chars here are properly terminated, except for the character constants. */ ++ ++/* a b c LRE‪ 1 2 3 PDF‬ x y z */ ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c RLE‫ 1 2 3 PDF‬ x y z */ ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c LRO‭ 1 2 3 PDF‬ x y z */ ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c RLO‮ 1 2 3 PDF‬ x y z */ ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c LRI⁦ 1 2 3 PDI⁩ x y z */ ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c RLI⁧ 1 2 3 PDI⁩ x y */ ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c FSI⁨ 1 2 3 PDI⁩ x y z */ ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ ++/* Same but C++ comments instead. */ ++// a b c LRE‪ 1 2 3 PDF‬ x y z ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++// a b c RLE‫ 1 2 3 PDF‬ x y z ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++// a b c LRO‭ 1 2 3 PDF‬ x y z ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++// a b c RLO‮ 1 2 3 PDF‬ x y z ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++// a b c LRI⁦ 1 2 3 PDI⁩ x y z ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++// a b c RLI⁧ 1 2 3 PDI⁩ x y ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++// a b c FSI⁨ 1 2 3 PDI⁩ x y z ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ ++/* Here we're closing an unopened context, warn when =any. */ ++/* a b c PDI⁩ x y z */ ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c PDF‬ x y z */ ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++// a b c PDI⁩ x y z ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++// a b c PDF‬ x y z ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ ++void ++g1 () ++{ ++ const char *s1 = "a b c LRE‪ 1 2 3 PDF‬ x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s2 = "a b c RLE‫ 1 2 3 PDF‬ x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s3 = "a b c LRO‭ 1 2 3 PDF‬ x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s4 = "a b c RLO‮ 1 2 3 PDF‬ x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s5 = "a b c LRI⁦ 1 2 3 PDI⁩ x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s6 = "a b c RLI⁧ 1 2 3 PDI⁩ x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s7 = "a b c FSI⁨ 1 2 3 PDI⁩ x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s8 = "a b c PDI⁩ x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s9 = "a b c PDF‬ x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ ++ const char *s10 = "a b c LRE\u202a 1 2 3 PDF\u202c x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s11 = "a b c LRE\u202A 1 2 3 PDF\u202c x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s12 = "a b c RLE\u202b 1 2 3 PDF\u202c x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s13 = "a b c RLE\u202B 1 2 3 PDF\u202c x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s14 = "a b c LRO\u202d 1 2 3 PDF\u202c x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s15 = "a b c LRO\u202D 1 2 3 PDF\u202c x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s16 = "a b c RLO\u202e 1 2 3 PDF\u202c x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s17 = "a b c RLO\u202E 1 2 3 PDF\u202c x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s18 = "a b c LRI\u2066 1 2 3 PDI\u2069 x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s19 = "a b c RLI\u2067 1 2 3 PDI\u2069 x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s20 = "a b c FSI\u2068 1 2 3 PDI\u2069 x y z"; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++} ++ ++void ++g2 () ++{ ++ const char c1 = '\u202a'; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char c2 = '\u202A'; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char c3 = '\u202b'; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char c4 = '\u202B'; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char c5 = '\u202d'; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char c6 = '\u202D'; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char c7 = '\u202e'; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char c8 = '\u202E'; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char c9 = '\u2066'; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char c10 = '\u2067'; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char c11 = '\u2068'; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++} ++ ++int a‪b‬c; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int a‫b‬c; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int a‭b‬c; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int a‮b‬c; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int a⁦b⁩c; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int a⁧b⁩c; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int a⁨b⁩c; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int A‬X; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int A\u202cY; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int A\u202CY2; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++ ++int d\u202ae\u202cf; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int d\u202Ae\u202cf2; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int d\u202be\u202cf; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int d\u202Be\u202cf2; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int d\u202de\u202cf; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int d\u202De\u202cf2; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int d\u202ee\u202cf; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int d\u202Ee\u202cf2; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int d\u2066e\u2069f; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int d\u2067e\u2069f; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int d\u2068e\u2069f; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ ++int X\u2069; ++/* { dg-bogus "unpaired" "" { target *-*-* } .-1 } */ +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-6.c b/gcc/testsuite/c-c++-common/Wbidirectional-6.c +new file mode 100644 +index 00000000000..1be017f828d +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-6.c +@@ -0,0 +1,154 @@ ++/* { dg-do compile } */ ++/* { dg-options "-Wbidirectional=unpaired" } */ ++/* Test nesting of bidi chars in various contexts. */ ++ ++/* Terminated by the wrong char: */ ++/* a b c LRE‪ 1 2 3 PDI⁩ x y z */ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c RLE‫ 1 2 3 PDI⁩ x y z*/ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c LRO‭ 1 2 3 PDI⁩ x y z */ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c RLO‮ 1 2 3 PDI⁩ x y z */ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c LRI⁦ 1 2 3 PDF‬ x y z */ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c RLI⁧ 1 2 3 PDF‬ x y z */ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* a b c FSI⁨ 1 2 3 PDF‬ x y z*/ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ ++/* LRE‪ PDF‬ */ ++/* LRE‪ LRE‪ PDF‬ PDF‬ */ ++/* PDF‬ LRE‪ PDF‬ */ ++/* LRE‪ PDF‬ LRE‪ PDF‬ */ ++/* LRE‪ LRE‪ PDF‬ */ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* PDF‬ LRE‪ */ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ ++// a b c LRE‪ 1 2 3 PDI⁩ x y z ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++// a b c RLE‫ 1 2 3 PDI⁩ x y z*/ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++// a b c LRO‭ 1 2 3 PDI⁩ x y z ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++// a b c RLO‮ 1 2 3 PDI⁩ x y z ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++// a b c LRI⁦ 1 2 3 PDF‬ x y z ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++// a b c RLI⁧ 1 2 3 PDF‬ x y z ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++// a b c FSI⁨ 1 2 3 PDF‬ x y z ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ ++// LRE‪ PDF‬ ++// LRE‪ LRE‪ PDF‬ PDF‬ ++// PDF‬ LRE‪ PDF‬ ++// LRE‪ PDF‬ LRE‪ PDF‬ ++// LRE‪ LRE‪ PDF‬ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++// PDF‬ LRE‪ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ ++void ++g1 () ++{ ++ const char *s1 = "a b c LRE‪ 1 2 3 PDI⁩ x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s2 = "a b c LRE\u202a 1 2 3 PDI\u2069 x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s3 = "a b c RLE‫ 1 2 3 PDI⁩ x y "; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s4 = "a b c RLE\u202b 1 2 3 PDI\u2069 x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s5 = "a b c LRO‭ 1 2 3 PDI⁩ x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s6 = "a b c LRO\u202d 1 2 3 PDI\u2069 x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s7 = "a b c RLO‮ 1 2 3 PDI⁩ x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s8 = "a b c RLO\u202e 1 2 3 PDI\u2069 x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s9 = "a b c LRI⁦ 1 2 3 PDF‬ x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s10 = "a b c LRI\u2066 1 2 3 PDF\u202c x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s11 = "a b c RLI⁧ 1 2 3 PDF‬ x y z\ ++ "; ++/* { dg-warning "unpaired" "" { target *-*-* } .-2 } */ ++ const char *s12 = "a b c RLI\u2067 1 2 3 PDF\u202c x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s13 = "a b c FSI⁨ 1 2 3 PDF‬ x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s14 = "a b c FSI\u2068 1 2 3 PDF\u202c x y z"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s15 = "PDF‬ LRE‪"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s16 = "PDF\u202c LRE\u202a"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s17 = "LRE‪ PDF‬"; ++ const char *s18 = "LRE\u202a PDF\u202c"; ++ const char *s19 = "LRE‪ LRE‪ PDF‬ PDF‬"; ++ const char *s20 = "LRE\u202a LRE\u202a PDF\u202c PDF\u202c"; ++ const char *s21 = "PDF‬ LRE‪ PDF‬"; ++ const char *s22 = "PDF\u202c LRE\u202a PDF\u202c"; ++ const char *s23 = "LRE‪ LRE‪ PDF‬"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s24 = "LRE\u202a LRE\u202a PDF\u202c"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s25 = "PDF‬ LRE‪"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s26 = "PDF\u202c LRE\u202a"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s27 = "PDF‬ LRE\u202a"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ const char *s28 = "PDF\u202c LRE‪"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++} ++ ++int aLRE‪bPDI⁩; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int A\u202aB\u2069C; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int aRLE‫bPDI⁩; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int a\u202bB\u2069c; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int aLRO‭bPDI⁩; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int a\u202db\u2069c2; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int aRLO‮bPDI⁩; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int a\u202eb\u2069; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int aLRI⁦bPDF‬; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int a\u2066b\u202c; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int aRLI⁧bPDF‬c ++; ++/* { dg-warning "unpaired" "" { target *-*-* } .-2 } */ ++int a\u2067b\u202c; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int aFSI⁨bPDF‬; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int a\u2068b\u202c; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int aFSI⁨bPD\u202C; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int aFSI\u2068bPDF‬_; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int aLRE‪bPDF‬b; ++int A\u202aB\u202c; ++int a_LRE‪_LRE‪_b_PDF‬_PDF‬; ++int A\u202aA\u202aB\u202cB\u202c; ++int aPDF‬bLREadPDF‬; ++int a_\u202C_\u202a_\u202c; ++int a_LRE‪_b_PDF‬_c_LRE‪_PDF‬; ++int a_\u202a_\u202c_\u202a_\u202c_; ++int a_LRE‪_b_PDF‬_c_LRE‪; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int a_\u202a_\u202c_\u202a_; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-7.c b/gcc/testsuite/c-c++-common/Wbidirectional-7.c +new file mode 100644 +index 00000000000..f0f7b3ca14a +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-7.c +@@ -0,0 +1,8 @@ ++/* { dg-do compile } */ ++/* { dg-options "-Wbidirectional=any" } */ ++/* Test we ignore UCNs in comments. */ ++ ++// a b c \u202a 1 2 3 ++// a b c \u202A 1 2 3 ++/* a b c \u202a 1 2 3 */ ++/* a b c \u202A 1 2 3 */ +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-8.c b/gcc/testsuite/c-c++-common/Wbidirectional-8.c +new file mode 100644 +index 00000000000..c7d02193131 +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-8.c +@@ -0,0 +1,12 @@ ++/* { dg-do compile } */ ++/* { dg-options "-Wbidirectional=any" } */ ++/* Test \u vs \U. */ ++ ++int a_\u202A; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++int a_\u202a_2; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++int a_\U0000202A_3; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ ++int a_\U0000202a_4; ++/* { dg-warning "U\\+202A" "" { target *-*-* } .-1 } */ +diff --git a/gcc/testsuite/c-c++-common/Wbidirectional-9.c b/gcc/testsuite/c-c++-common/Wbidirectional-9.c +new file mode 100644 +index 00000000000..d029209babb +--- /dev/null ++++ b/gcc/testsuite/c-c++-common/Wbidirectional-9.c +@@ -0,0 +1,28 @@ ++/* { dg-do compile } */ ++/* { dg-options "-Wbidirectional=unpaired" } */ ++/* Test that we properly separate bidi contexts (comment/identifier/character ++ constant/string literal). */ ++ ++/* LRE ->‪<- */ int pdf_\u202c_1; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* RLE ->‫<- */ int pdf_\u202c_2; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* LRO ->‭<- */ int pdf_\u202c_3; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* RLO ->‮<- */ int pdf_\u202c_4; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* LRI ->⁦<-*/ int pdi_\u2069_1; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* RLI ->⁧<- */ int pdi_\u2069_12; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* FSI ->⁨<- */ int pdi_\u2069_3; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++ ++const char *s1 = "LRE\u202a"; /* PDF ->‬<- */ ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++/* LRE ->‪<- */ const char *s2 = "PDF\u202c"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++const char *s3 = "LRE\u202a"; int pdf_\u202c_5; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ ++int lre_\u202a; const char *s4 = "PDF\u202c"; ++/* { dg-warning "unpaired" "" { target *-*-* } .-1 } */ +diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h +index 6e2fcb6b1f2..e48d13c4ee1 100644 +--- a/libcpp/include/cpplib.h ++++ b/libcpp/include/cpplib.h +@@ -308,6 +308,17 @@ enum cpp_normalize_level { + normalized_none + }; + ++/* The possible bidirectional characters checking levels, from least ++ restrictive to most. */ ++enum cpp_bidirectional_level { ++ /* No checking. */ ++ bidirectional_none, ++ /* Only detect unpaired uses of bidirectional characters. */ ++ bidirectional_unpaired, ++ /* Detect any use of bidirectional characters. */ ++ bidirectional_any ++}; ++ + /* This structure is nested inside struct cpp_reader, and + carries all the options visible to the command line. */ + struct cpp_options +@@ -518,6 +529,10 @@ struct cpp_options + /* True if warn about differences between C++98 and C++11. */ + bool cpp_warn_cxx11_compat; + ++ /* Nonzero of bidirectional characters checking is on. See enum ++ cpp_bidirectional_level. */ ++ unsigned char cpp_warn_bidirectional; ++ + /* Dependency generation. */ + struct + { +@@ -616,7 +631,8 @@ enum cpp_warning_reason { + CPP_W_C90_C99_COMPAT, + CPP_W_C11_C2X_COMPAT, + CPP_W_CXX11_COMPAT, +- CPP_W_EXPANSION_TO_DEFINED ++ CPP_W_EXPANSION_TO_DEFINED, ++ CPP_W_BIDIRECTIONAL + }; + + /* Callback for header lookup for HEADER, which is the name of a +diff --git a/libcpp/init.c b/libcpp/init.c +index 5a424e23553..f9a8f5f088f 100644 +--- a/libcpp/init.c ++++ b/libcpp/init.c +@@ -223,6 +223,7 @@ cpp_create_reader (enum c_lang lang, cpp_hash_table *table, + = ENABLE_CANONICAL_SYSTEM_HEADERS; + CPP_OPTION (pfile, ext_numeric_literals) = 1; + CPP_OPTION (pfile, warn_date_time) = 0; ++ CPP_OPTION (pfile, cpp_warn_bidirectional) = bidirectional_unpaired; + + /* Default CPP arithmetic to something sensible for the host for the + benefit of dumb users like fix-header. */ +diff --git a/libcpp/lex.c b/libcpp/lex.c +index 8e3ef096bbe..d9c39a4105f 100644 +--- a/libcpp/lex.c ++++ b/libcpp/lex.c +@@ -1164,6 +1164,284 @@ _cpp_process_line_notes (cpp_reader *pfi + } + } + ++namespace bidi { ++ enum kind { ++ NONE, LRE, RLE, LRO, RLO, LRI, RLI, FSI, PDF, PDI ++ }; ++ ++ /* All the UTF-8 encodings of bidi characters start with E2. */ ++ const uchar utf8_start = 0xe2; ++ ++ /* A vector holding currently open bidi contexts. We use a char for ++ each context, its LSB is 1 if it represents a PDF context, 0 if it ++ represents a PDI context. The next bit is 1 if this context was open ++ by a bidi character written as a UCN, and 0 when it was UTF-8. */ ++ semi_embedded_vec vec; ++ ++ /* Close the whole comment/identifier/string literal/character constant ++ context. */ ++ void on_close () ++ { ++ vec.truncate (0); ++ } ++ ++ /* Pop the last element in the vector. */ ++ void pop () ++ { ++ unsigned int len = vec.count (); ++ gcc_checking_assert (len > 0); ++ vec.truncate (len - 1); ++ } ++ ++ /* Return which context is currently opened. */ ++ kind current_ctx () ++ { ++ unsigned int len = vec.count (); ++ if (len == 0) ++ return NONE; ++ return (vec[len - 1] & 1) ? PDF : PDI; ++ } ++ ++ /* Return true if the current context comes from a UCN origin, that is, ++ the bidi char which started this bidi context was written as a UCN. */ ++ bool current_ctx_ucn_p () ++ { ++ unsigned int len = vec.count (); ++ gcc_checking_assert (len > 0); ++ return (vec[len - 1] >> 1) & 1; ++ } ++ ++ /* We've read a bidi char, update the current vector as necessary. */ ++ void on_char (kind k, bool ucn_p) ++ { ++ switch (k) ++ { ++ case LRE: ++ case RLE: ++ case LRO: ++ case RLO: ++ vec.push (ucn_p ? 3u : 1u); ++ break; ++ case LRI: ++ case RLI: ++ case FSI: ++ vec.push (ucn_p ? 2u : 0u); ++ break; ++ case PDF: ++ if (current_ctx () == PDF) ++ pop (); ++ break; ++ case PDI: ++ if (current_ctx () == PDI) ++ pop (); ++ break; ++ [[likely]] case NONE: ++ break; ++ default: ++ abort (); ++ } ++ } ++ ++ /* Return a descriptive string for K. */ ++ const char *to_str (kind k) ++ { ++ switch (k) ++ { ++ case LRE: ++ return "U+202A (LEFT-TO-RIGHT EMBEDDING)"; ++ case RLE: ++ return "U+202B (RIGHT-TO-LEFT EMBEDDING)"; ++ case LRO: ++ return "U+202D (LEFT-TO-RIGHT OVERRIDE)"; ++ case RLO: ++ return "U+202E (RIGHT-TO-LEFT OVERRIDE)"; ++ case LRI: ++ return "U+2066 (LEFT-TO-RIGHT ISOLATE)"; ++ case RLI: ++ return "U+2067 (RIGHT-TO-LEFT ISOLATE)"; ++ case FSI: ++ return "U+2068 (FIRST STRONG ISOLATE)"; ++ case PDF: ++ return "U+202C (POP DIRECTIONAL FORMATTING)"; ++ case PDI: ++ return "U+2069 (POP DIRECTIONAL ISOLATE)"; ++ default: ++ abort (); ++ } ++ } ++} ++ ++/* Parse a sequence of 3 bytes starting with P and return its bidi code. */ ++ ++static bidi::kind ++get_bidi_utf8 (const unsigned char *const p) ++{ ++ gcc_checking_assert (p[0] == bidi::utf8_start); ++ ++ if (p[1] == 0x80) ++ switch (p[2]) ++ { ++ case 0xaa: ++ return bidi::LRE; ++ case 0xab: ++ return bidi::RLE; ++ case 0xac: ++ return bidi::PDF; ++ case 0xad: ++ return bidi::LRO; ++ case 0xae: ++ return bidi::RLO; ++ default: ++ break; ++ } ++ else if (p[1] == 0x81) ++ switch (p[2]) ++ { ++ case 0xa6: ++ return bidi::LRI; ++ case 0xa7: ++ return bidi::RLI; ++ case 0xa8: ++ return bidi::FSI; ++ case 0xa9: ++ return bidi::PDI; ++ default: ++ break; ++ } ++ ++ return bidi::NONE; ++} ++ ++/* Parse a UCN where P points just past \u or \U and return its bidi code. */ ++ ++static bidi::kind ++get_bidi_ucn (const unsigned char *p, bool is_U) ++{ ++ /* 6.4.3 Universal Character Names ++ \u hex-quad ++ \U hex-quad hex-quad ++ where \unnnn means \U0000nnnn. */ ++ ++ if (is_U) ++ { ++ if (p[0] != '0' || p[1] != '0' || p[2] != '0' || p[3] != '0') ++ return bidi::NONE; ++ /* Skip 4B so we can treat \u and \U the same below. */ ++ p += 4; ++ } ++ ++ /* All code points we are looking for start with 20xx. */ ++ if (p[0] != '2' || p[1] != '0') ++ return bidi::NONE; ++ else if (p[2] == '2') ++ switch (p[3]) ++ { ++ case 'a': ++ case 'A': ++ return bidi::LRE; ++ case 'b': ++ case 'B': ++ return bidi::RLE; ++ case 'c': ++ case 'C': ++ return bidi::PDF; ++ case 'd': ++ case 'D': ++ return bidi::LRO; ++ case 'e': ++ case 'E': ++ return bidi::RLO; ++ default: ++ break; ++ } ++ else if (p[2] == '6') ++ switch (p[3]) ++ { ++ case '6': ++ return bidi::LRI; ++ case '7': ++ return bidi::RLI; ++ case '8': ++ return bidi::FSI; ++ case '9': ++ return bidi::PDI; ++ default: ++ break; ++ } ++ ++ return bidi::NONE; ++} ++ ++/* We're closing a bidi context, that is, we've encountered a newline, ++ are closing a C-style comment, or are at the end of a string literal, ++ character constant, or identifier. Warn if this context was not ++ properly terminated by a PDI or PDF. P points to the last character ++ in this context. */ ++ ++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 location_t loc ++ = linemap_position_for_column (pfile->line_table, ++ CPP_BUF_COLUMN (pfile->buffer, p)); ++ cpp_warning_with_line (pfile, CPP_W_BIDIRECTIONAL, loc, 0, ++ "unpaired UTF-8 bidirectional character " ++ "detected"); ++ } ++ /* We're done with this context. */ ++ bidi::on_close (); ++} ++ ++/* We're at the beginning or in the middle of an identifier/comment/string ++ literal/character constant. Warn if we've encountered a bidi character. ++ KIND says which bidi character it was; P points to it in the character ++ stream. UCN_P is true iff this bidi character was written as a UCN. */ ++ ++static void ++maybe_warn_bidi_on_char (cpp_reader *pfile, const uchar *p, bidi::kind kind, ++ bool ucn_p) ++{ ++ if (__builtin_expect (kind == bidi::NONE, 1)) ++ return; ++ ++ const unsigned char warn_bidi = CPP_OPTION (pfile, cpp_warn_bidirectional); ++ ++ if (warn_bidi != bidirectional_none) ++ { ++ const location_t loc ++ = linemap_position_for_column (pfile->line_table, ++ CPP_BUF_COLUMN (pfile->buffer, p)); ++ /* 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. */ ++ if (kind == bidi::current_ctx ()) ++ { ++ if (warn_bidi == bidirectional_unpaired ++ && bidi::current_ctx_ucn_p () != ucn_p) ++ cpp_warning_with_line (pfile, CPP_W_BIDIRECTIONAL, loc, 0, ++ "UTF-8 vs UCN mismatch when closing " ++ "a context by \"%s\"", bidi::to_str (kind)); ++ } ++ else if (warn_bidi == bidirectional_any) ++ { ++ if (kind == bidi::PDF || kind == bidi::PDI) ++ cpp_warning_with_line (pfile, CPP_W_BIDIRECTIONAL, loc, 0, ++ "\"%s\" is closing an unopened context", ++ bidi::to_str (kind)); ++ else ++ cpp_warning_with_line (pfile, CPP_W_BIDIRECTIONAL, loc, 0, ++ "found problematic Unicode character \"%s\"", ++ bidi::to_str (kind)); ++ } ++ } ++ /* We're done with this context. */ ++ bidi::on_char (kind, ucn_p); ++} ++ + /* Skip a C-style block comment. We find the end of the comment by + seeing if an asterisk is before every '/' we encounter. Returns + nonzero if comment terminated by EOF, zero otherwise. +@@ -1175,7 +1453,8 @@ _cpp_skip_block_comment (cpp_reader *pfi + cpp_buffer *buffer = pfile->buffer; + const uchar *cur = buffer->cur; + uchar c; +- ++ const bool warn_bidi_p = (CPP_OPTION (pfile, cpp_warn_bidirectional) ++ != bidirectional_none); + cur++; + if (*cur == '/') + cur++; +@@ -1189,7 +1468,11 @@ _cpp_skip_block_comment (cpp_reader *pfi + if (c == '/') + { + if (cur[-2] == '*') +- break; ++ { ++ if (warn_bidi_p) ++ maybe_warn_bidi_on_close (pfile, cur); ++ break; ++ } + + /* Warn about potential nested comments, but not if the '/' + comes immediately before the true comment delimiter. +@@ -1208,6 +1491,8 @@ _cpp_skip_block_comment (cpp_reader *pfi + { + unsigned int cols; + buffer->cur = cur - 1; ++ if (warn_bidi_p) ++ maybe_warn_bidi_on_close (pfile, cur); + _cpp_process_line_notes (pfile, true); + if (buffer->next_line >= buffer->rlimit) + return true; +@@ -1218,6 +1503,13 @@ _cpp_skip_block_comment (cpp_reader *pfi + + cur = buffer->cur; + } ++ /* If this is a beginning of a UTF-8 encoding, it might be ++ a bidirectional character. */ ++ else if (__builtin_expect (c == bidi::utf8_start, 0) && warn_bidi_p) ++ { ++ bidi::kind kind = get_bidi_utf8 (cur - 1); ++ maybe_warn_bidi_on_char (pfile, cur, kind, /*ucn_p=*/false); ++ } + } + + buffer->cur = cur; +@@ -1233,9 +1525,32 @@ skip_line_comment (cpp_reader *pfile) + { + cpp_buffer *buffer = pfile->buffer; + location_t orig_line = pfile->line_table->highest_line; ++ const bool warn_bidi_p = (CPP_OPTION (pfile, cpp_warn_bidirectional) ++ != bidirectional_none); + +- while (*buffer->cur != '\n') +- buffer->cur++; ++ if (!warn_bidi_p) ++ while (*buffer->cur != '\n') ++ buffer->cur++; ++ else ++ { ++ while (*buffer->cur != '\n' ++ && *buffer->cur != bidi::utf8_start) ++ buffer->cur++; ++ if (__builtin_expect (*buffer->cur == bidi::utf8_start, 0)) ++ { ++ while (*buffer->cur != '\n') ++ { ++ if (__builtin_expect (*buffer->cur == bidi::utf8_start, 0)) ++ { ++ bidi::kind kind = get_bidi_utf8 (buffer->cur); ++ maybe_warn_bidi_on_char (pfile, buffer->cur, kind, ++ /*ucn_p=*/false); ++ } ++ buffer->cur++; ++ } ++ maybe_warn_bidi_on_close (pfile, buffer->cur); ++ } ++ } + + _cpp_process_line_notes (pfile, true); + return orig_line != pfile->line_table->highest_line; +@@ -1317,11 +1632,14 @@ static const cppchar_t utf8_signifier = + + /* Returns TRUE if the sequence starting at buffer->cur is valid in + an identifier. FIRST is TRUE if this starts an identifier. */ ++ + static bool + forms_identifier_p (cpp_reader *pfile, int first, + struct normalize_state *state) + { + cpp_buffer *buffer = pfile->buffer; ++ const bool warn_bidi_p = (CPP_OPTION (pfile, cpp_warn_bidirectional) ++ != bidirectional_none); + + if (*buffer->cur == '$') + { +@@ -1344,6 +1662,13 @@ forms_identifier_p (cpp_reader *pfile, i + cppchar_t s; + if (*buffer->cur >= utf8_signifier) + { ++ if (__builtin_expect (*buffer->cur == bidi::utf8_start, 0) ++ && warn_bidi_p) ++ { ++ bidi::kind kind = get_bidi_utf8 (buffer->cur); ++ maybe_warn_bidi_on_char (pfile, buffer->cur, kind, ++ /*ucn_p=*/false); ++ } + if (_cpp_valid_utf8 (pfile, &buffer->cur, buffer->rlimit, 1 + !first, + state, &s)) + return true; +@@ -1352,6 +1677,13 @@ forms_identifier_p (cpp_reader *pfile, i + && (buffer->cur[1] == 'u' || buffer->cur[1] == 'U')) + { + buffer->cur += 2; ++ if (warn_bidi_p) ++ { ++ bidi::kind kind = get_bidi_ucn (buffer->cur, ++ buffer->cur[-1] == 'U'); ++ maybe_warn_bidi_on_char (pfile, buffer->cur, kind, ++ /*ucn_p=*/true); ++ } + if (_cpp_valid_ucn (pfile, &buffer->cur, buffer->rlimit, 1 + !first, + state, &s, NULL, NULL)) + return true; +@@ -1460,6 +1792,8 @@ lex_identifier (cpp_reader *pfile, const + const uchar *cur; + unsigned int len; + unsigned int hash = HT_HASHSTEP (0, *base); ++ const bool warn_bidi_p = (CPP_OPTION (pfile, cpp_warn_bidirectional) ++ != bidirectional_none); + + cur = pfile->buffer->cur; + if (! starts_ucn) +@@ -1476,13 +1810,17 @@ lex_identifier (cpp_reader *pfile, const + { + /* Slower version for identifiers containing UCNs + or extended chars (including $). */ +- do { +- while (ISIDNUM (*pfile->buffer->cur)) +- { +- NORMALIZE_STATE_UPDATE_IDNUM (nst, *pfile->buffer->cur); +- pfile->buffer->cur++; +- } +- } while (forms_identifier_p (pfile, false, nst)); ++ do ++ { ++ while (ISIDNUM (*pfile->buffer->cur)) ++ { ++ NORMALIZE_STATE_UPDATE_IDNUM (nst, *pfile->buffer->cur); ++ pfile->buffer->cur++; ++ } ++ } ++ while (forms_identifier_p (pfile, false, nst)); ++ if (warn_bidi_p) ++ maybe_warn_bidi_on_close (pfile, pfile->buffer->cur); + result = _cpp_interpret_identifier (pfile, base, + pfile->buffer->cur - base); + *spelling = cpp_lookup (pfile, base, pfile->buffer->cur - base); +@@ -1684,6 +2022,8 @@ lex_raw_string (cpp_reader *pfile, cpp_t + _cpp_buff *first_buff = NULL, *last_buff = NULL; + size_t raw_prefix_start; + _cpp_line_note *note = &pfile->buffer->notes[pfile->buffer->cur_note]; ++ const bool warn_bidi_p = (CPP_OPTION (pfile, cpp_warn_bidirectional) ++ != bidirectional_none); + + type = (*base == 'L' ? CPP_WSTRING : + *base == 'U' ? CPP_STRING32 : +@@ -1920,8 +2260,16 @@ lex_raw_string (cpp_reader *pfile, cpp_t + cur = base = pfile->buffer->cur; + note = &pfile->buffer->notes[pfile->buffer->cur_note]; + } ++ else if (__builtin_expect ((unsigned char) c == bidi::utf8_start, 0) ++ && warn_bidi_p) ++ maybe_warn_bidi_on_char (pfile, cur - 1, ++ get_bidi_utf8 (cur - 1), ++ /*ucn_p=*/false); + } + ++ if (warn_bidi_p) ++ maybe_warn_bidi_on_close (pfile, cur); ++ + if (CPP_OPTION (pfile, user_literals)) + { + /* If a string format macro, say from inttypes.h, is placed touching +@@ -2016,15 +2364,28 @@ lex_string (cpp_reader *pfile, cpp_token + else + terminator = '>', type = CPP_HEADER_NAME; + ++ const bool warn_bidi_p = (CPP_OPTION (pfile, cpp_warn_bidirectional) ++ != bidirectional_none); + for (;;) + { + cppchar_t c = *cur++; + + /* In #include-style directives, terminators are not escapable. */ + if (c == '\\' && !pfile->state.angled_headers && *cur != '\n') +- cur++; ++ { ++ if ((cur[0] == 'u' || cur[0] == 'U') && warn_bidi_p) ++ { ++ bidi::kind kind = get_bidi_ucn (cur + 1, cur[0] == 'U'); ++ maybe_warn_bidi_on_char (pfile, cur, kind, /*ucn_p=*/true); ++ } ++ cur++; ++ } + else if (c == terminator) +- break; ++ { ++ if (warn_bidi_p) ++ maybe_warn_bidi_on_close (pfile, cur - 1); ++ break; ++ } + else if (c == '\n') + { + cur--; +@@ -2041,6 +2402,11 @@ lex_string (cpp_reader *pfile, cpp_token + } + else if (c == '\0') + saw_NUL = true; ++ else if (__builtin_expect (c == bidi::utf8_start, 0) && warn_bidi_p) ++ { ++ bidi::kind kind = get_bidi_utf8 (cur - 1); ++ maybe_warn_bidi_on_char (pfile, cur - 1, kind, /*ucn_p=*/false); ++ } + } + + if (saw_NUL && !pfile->state.skipping) +base-commit: b0b1d8d5d90d7c499e2733e8d01ba8b73217f332 +-- +2.31.1 + diff --git a/SOURCES/gcc10-dts-arm.patch b/SOURCES/gcc10-dts-arm.patch deleted file mode 100644 index 53ba94a..0000000 --- a/SOURCES/gcc10-dts-arm.patch +++ /dev/null @@ -1,372 +0,0 @@ -diff -Naurp a/libstdc++-v3/src/nonshared11/cow-shim_facets.cc b/libstdc++-v3/src/nonshared11/cow-shim_facets.cc ---- a/libstdc++-v3/src/nonshared11/cow-shim_facets.cc 2021-05-23 21:52:00.253590930 +0000 -+++ b/libstdc++-v3/src/nonshared11/cow-shim_facets.cc 2021-05-24 17:35:24.331195651 +0000 -@@ -168,7 +168,7 @@ asm (".hidden _ZTVNSt13__facet_shims12_G - asm (".hidden _ZTVNSt13__facet_shims12_GLOBAL__N_115moneypunct_shimIwLb1EEE"); - asm (".hidden _ZNSt13__facet_shims21__numpunct_fill_cacheIcEEvSt17integral_constantIbLb0EEPKNSt6locale5facetEPSt16__numpunct_cacheIT_E"); - asm (".hidden _ZNSt13__facet_shims21__numpunct_fill_cacheIwEEvSt17integral_constantIbLb0EEPKNSt6locale5facetEPSt16__numpunct_cacheIT_E"); --#if defined(__i386__) || (defined(__powerpc__) && !defined(__powerpc64__)) -+#if defined(__i386__) || defined(__arm__) || (defined(__powerpc__) && !defined(__powerpc64__)) - asm (".hidden _ZNSt13__facet_shims14__messages_getIcEEvSt17integral_constantIbLb0EEPKNSt6locale5facetERNS_12__any_stringEiiiPKT_j"); - asm (".hidden _ZNSt13__facet_shims14__messages_getIwEEvSt17integral_constantIbLb0EEPKNSt6locale5facetERNS_12__any_stringEiiiPKT_j"); - asm (".hidden _ZNSt13__facet_shims15__messages_openIcEEiSt17integral_constantIbLb0EEPKNSt6locale5facetEPKcjRKS3_"); -diff -Naurp a/libstdc++-v3/src/nonshared11/cow-stdexcept.cc b/libstdc++-v3/src/nonshared11/cow-stdexcept.cc ---- a/libstdc++-v3/src/nonshared11/cow-stdexcept.cc 2021-05-23 21:52:00.228591286 +0000 -+++ b/libstdc++-v3/src/nonshared11/cow-stdexcept.cc 2021-05-24 17:35:24.331195651 +0000 -@@ -35,7 +35,7 @@ asm (".hidden _ZNSt12__cow_stringaSEOS_" - asm (".hidden _ZNSt12__cow_stringaSERKS_"); - asm (".hidden _ZNSt12__sso_stringC1ERKSs"); - asm (".hidden _ZNSt12__sso_stringC2ERKSs"); --#if defined(__i386__) || (defined(__powerpc__) && !defined(__powerpc64__)) -+#if defined(__i386__) || defined(__arm__) || (defined(__powerpc__) && !defined(__powerpc64__)) - asm (".hidden _ZNSt12__cow_stringC1EPKcj"); - asm (".hidden _ZNSt12__cow_stringC2EPKcj"); - #else -diff -Naurp a/libstdc++-v3/src/nonshared11/cxx11-shim_facets.cc b/libstdc++-v3/src/nonshared11/cxx11-shim_facets.cc ---- a/libstdc++-v3/src/nonshared11/cxx11-shim_facets.cc 2021-05-23 21:52:00.236591172 +0000 -+++ b/libstdc++-v3/src/nonshared11/cxx11-shim_facets.cc 2021-05-24 17:35:24.332195636 +0000 -@@ -168,7 +168,7 @@ asm (".hidden _ZTVNSt13__facet_shims12_G - asm (".hidden _ZTVNSt13__facet_shims12_GLOBAL__N_115moneypunct_shimIcLb1EEE"); - asm (".hidden _ZTVNSt13__facet_shims12_GLOBAL__N_115moneypunct_shimIwLb0EEE"); - asm (".hidden _ZTVNSt13__facet_shims12_GLOBAL__N_115moneypunct_shimIwLb1EEE"); --#if defined(__i386__) || (defined(__powerpc__) && !defined(__powerpc64__)) -+#if defined(__i386__) || defined(__arm__) || (defined(__powerpc__) && !defined(__powerpc64__)) - asm (".hidden _ZNSt13__facet_shims14__messages_getIcEEvSt17integral_constantIbLb1EEPKNSt6locale5facetERNS_12__any_stringEiiiPKT_j"); - asm (".hidden _ZNSt13__facet_shims14__messages_getIwEEvSt17integral_constantIbLb1EEPKNSt6locale5facetERNS_12__any_stringEiiiPKT_j"); - asm (".hidden _ZNSt13__facet_shims15__messages_openIcEEiSt17integral_constantIbLb1EEPKNSt6locale5facetEPKcjRKS3_"); -diff -Naurp a/libstdc++-v3/src/nonshared11/cxx11-wlocale-inst.cc b/libstdc++-v3/src/nonshared11/cxx11-wlocale-inst.cc ---- a/libstdc++-v3/src/nonshared11/cxx11-wlocale-inst.cc 2021-05-23 21:52:00.216591457 +0000 -+++ b/libstdc++-v3/src/nonshared11/cxx11-wlocale-inst.cc 2021-05-24 17:35:24.332195636 +0000 -@@ -36,7 +36,7 @@ asm (".hidden _ZNKSt17__gnu_cxx_ldbl1287 - asm (".hidden _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intB5cxx11IxEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_"); - asm (".hidden _ZNKSt17__gnu_cxx_ldbl1287num_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE14_M_extract_intB5cxx11IyEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_"); - #endif --#if defined(__i386__) || (defined(__powerpc__) && !defined(__powerpc64__)) -+#if defined(__i386__) || defined(__arm__) || (defined(__powerpc__) && !defined(__powerpc64__)) - asm (".hidden _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC1ERKNSt7__cxx1112basic_stringIcS1_IcESaIcEEEj"); - asm (".hidden _ZNSt15time_put_bynameIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEEC2ERKNSt7__cxx1112basic_stringIcS1_IcESaIcEEEj"); - #else -diff -Naurp a/libstdc++-v3/src/nonshared11/locale-inst-asm.S b/libstdc++-v3/src/nonshared11/locale-inst-asm.S ---- a/libstdc++-v3/src/nonshared11/locale-inst-asm.S 2021-05-23 21:52:00.217591443 +0000 -+++ b/libstdc++-v3/src/nonshared11/locale-inst-asm.S 2021-05-24 17:35:24.333195622 +0000 -@@ -43,6 +43,11 @@ - #define ALIGN3 .align 2 - #define SECTION2(x).section .gnu.linkonce.s.x,"aw",@progbits - #define SECTION3(x)SECTION2(x) -+#elif defined __arm__ -+#define ALIGN1 .align 4 -+#define OBJECT %object -+#define SECTION1(x).section .gnu.linkonce.d.rel.ro.x,"aw",%progbits -+#define SECTION3(x).section .gnu.linkonce.r.x,"a",%progbits - #elif defined __aarch64__ - #define ALIGN1 .align 3 - #define ALIGN3 .align 3 -@@ -288,4 +293,4 @@ _ZTVSt16__numpunct_cacheIwE: - POINTER SYM(_ZTISt16__numpunct_cacheIwE) - VPTR(_ZNSt16__numpunct_cacheIwED1Ev) - VPTR(_ZNSt16__numpunct_cacheIwED0Ev) -- .section .note.GNU-stack,"",@progbits -+ .section .note.GNU-stack,"",%progbits -diff -Naurp a/libstdc++-v3/src/nonshared11/locale-inst.cc b/libstdc++-v3/src/nonshared11/locale-inst.cc ---- a/libstdc++-v3/src/nonshared11/locale-inst.cc 2021-05-23 21:52:00.247591016 +0000 -+++ b/libstdc++-v3/src/nonshared11/locale-inst.cc 2021-05-24 17:35:24.334195608 +0000 -@@ -75,13 +75,13 @@ _GLIBCXX_END_NAMESPACE_VERSION - - #ifndef _GLIBCXX_NONSHARED_CXX11_80 - #ifdef C_is_char --#if defined(__i386__) || (defined(__powerpc__) && !defined(__powerpc64__)) -+#if defined(__i386__) || defined(__arm__) || (defined(__powerpc__) && !defined(__powerpc64__)) - asm (".hidden _ZSt14__add_groupingIcEPT_S1_S0_PKcjPKS0_S5_"); - #else - asm (".hidden _ZSt14__add_groupingIcEPT_S1_S0_PKcmPKS0_S5_"); - #endif - #else --#if defined(__i386__) || (defined(__powerpc__) && !defined(__powerpc64__)) -+#if defined(__i386__) || defined(__arm__) || (defined(__powerpc__) && !defined(__powerpc64__)) - asm (".hidden _ZSt14__add_groupingIwEPT_S1_S0_PKcjPKS0_S5_"); - #else - asm (".hidden _ZSt14__add_groupingIwEPT_S1_S0_PKcmPKS0_S5_"); -diff -Naurp a/libstdc++-v3/src/nonshared11/snprintf_lite.cc b/libstdc++-v3/src/nonshared11/snprintf_lite.cc ---- a/libstdc++-v3/src/nonshared11/snprintf_lite.cc 2021-05-23 21:52:00.257590873 +0000 -+++ b/libstdc++-v3/src/nonshared11/snprintf_lite.cc 2021-05-24 17:35:24.334195608 +0000 -@@ -30,6 +30,9 @@ asm (".hidden _ZN9__gnu_cxx15__snprintf_ - #elif defined(__powerpc__) - asm (".hidden _ZN9__gnu_cxx15__concat_size_tEPcjj"); - asm (".hidden _ZN9__gnu_cxx15__snprintf_liteEPcjPKcP13__va_list_tag"); -+#elif defined(__arm__) -+asm (".hidden _ZN9__gnu_cxx15__concat_size_tEPcjj"); -+asm (".hidden _ZN9__gnu_cxx15__snprintf_liteEPcjPKcSt9__va_list"); - #elif defined(__aarch64__) - asm (".hidden _ZN9__gnu_cxx15__concat_size_tEPcmm"); - asm (".hidden _ZN9__gnu_cxx15__snprintf_liteEPcmPKcSt9__va_list"); -diff -Naurp a/libstdc++-v3/src/nonshared11/sso_string.cc b/libstdc++-v3/src/nonshared11/sso_string.cc ---- a/libstdc++-v3/src/nonshared11/sso_string.cc 2021-05-23 21:52:00.254590916 +0000 -+++ b/libstdc++-v3/src/nonshared11/sso_string.cc 2021-05-24 20:10:36.325177493 +0000 -@@ -39,7 +39,7 @@ asm (".hidden _ZNSt12__sso_stringD1Ev"); - asm (".hidden _ZNSt12__sso_stringD2Ev"); - asm (".hidden _ZNSt12__sso_stringaSEOS_"); - asm (".hidden _ZNSt12__sso_stringaSERKS_"); --#if defined(__i386__) || (defined(__powerpc__) && !defined(__powerpc64__)) -+#if defined(__i386__) || defined(__arm__) || (defined(__powerpc__) && !defined(__powerpc64__)) - asm (".hidden _ZNSt12__sso_stringC1EPKcj"); - asm (".hidden _ZNSt12__sso_stringC2EPKcj"); - #else -diff -Naurp a/libstdc++-v3/src/nonshared17/cow-fs_dir.cc b/libstdc++-v3/src/nonshared17/cow-fs_dir.cc ---- a/libstdc++-v3/src/nonshared17/cow-fs_dir.cc 2021-05-23 21:52:00.277590589 +0000 -+++ b/libstdc++-v3/src/nonshared17/cow-fs_dir.cc 2021-05-25 01:30:45.423034303 +0000 -@@ -82,11 +82,11 @@ asm (".hidden _ZNSsC1ISaIcEEEPKcRKS0_"); - asm (".hidden _ZNSsC2ISaIcEEEPKcRKS0_"); - asm (".hidden _ZNSt23_Sp_counted_ptr_inplaceINSt10filesystem28recursive_directory_iterator10_Dir_stackESaIS2_ELN9__gnu_cxx12_Lock_policyE2EED2Ev"); - asm (".hidden _ZNSt23_Sp_counted_ptr_inplaceINSt10filesystem4_DirESaIS1_ELN9__gnu_cxx12_Lock_policyE2EED2Ev"); --#ifndef __i386__ -+#if !defined(__i386__) && !defined(__arm__) - asm (".hidden _ZNSt5dequeINSt10filesystem4_DirESaIS1_EE17_M_reallocate_mapEmb"); - #endif - asm (".hidden _ZNSt10unique_ptrINSt10filesystem4path5_List5_ImplENS2_13_Impl_deleterEED1Ev"); - asm (".hidden _ZNSt10unique_ptrINSt10filesystem4path5_List5_ImplENS2_13_Impl_deleterEED2Ev"); --#ifdef __i386__ -+#if defined(__i386__) || defined(__arm__) - asm (".hidden _ZNSt5dequeINSt10filesystem4_DirESaIS1_EE17_M_reallocate_mapEjb"); - #endif -diff -Naurp a/libstdc++-v3/src/nonshared17/cow-fs_ops.cc b/libstdc++-v3/src/nonshared17/cow-fs_ops.cc ---- a/libstdc++-v3/src/nonshared17/cow-fs_ops.cc 2021-05-23 21:52:00.273590646 +0000 -+++ b/libstdc++-v3/src/nonshared17/cow-fs_ops.cc 2021-05-24 20:32:30.740143250 +0000 -@@ -38,7 +38,7 @@ asm (".hidden _ZSt23__copy_move_backward - asm (".hidden _ZSt8_DestroyISt15_Deque_iteratorINSt10filesystem4pathERS2_PS2_EEvT_S6_"); - asm (".hidden _ZNSsC1ISaIcEEEPKcRKS0_"); - asm (".hidden _ZNSsC2ISaIcEEEPKcRKS0_"); --#ifndef __i386__ -+#if !defined(__i386__) && !defined(__arm__) - asm (".hidden _ZNSt11_Deque_baseINSt10filesystem4pathESaIS1_EE17_M_initialize_mapEm"); - asm (".hidden _ZNSt5dequeINSt10filesystem4pathESaIS1_EE13_M_insert_auxINS1_8iteratorEEEvSt15_Deque_iteratorIS1_RS1_PS1_ET_SA_m"); - asm (".hidden _ZNSt5dequeINSt10filesystem4pathESaIS1_EE17_M_reallocate_mapEmb"); -@@ -48,7 +48,7 @@ asm (".hidden _ZNSt5dequeINSt10filesyste - #if defined(__s390x__) || defined(__powerpc64__) - asm (".hidden _ZSt13__copy_move_aILb0ENSt10filesystem4path8iteratorESt15_Deque_iteratorIS1_RS1_PS1_EET1_T0_S8_S7_"); - #endif --#ifdef __i386__ -+#if defined(__i386__) || defined(__arm__) - asm (".hidden _ZNSt11_Deque_baseINSt10filesystem4pathESaIS1_EE17_M_initialize_mapEj"); - asm (".hidden _ZNSt5dequeINSt10filesystem4pathESaIS1_EE13_M_insert_auxINS1_8iteratorEEEvSt15_Deque_iteratorIS1_RS1_PS1_ET_SA_j"); - asm (".hidden _ZNSt5dequeINSt10filesystem4pathESaIS1_EE17_M_reallocate_mapEjb"); -diff -Naurp a/libstdc++-v3/src/nonshared17/cow-fs_path.cc b/libstdc++-v3/src/nonshared17/cow-fs_path.cc ---- a/libstdc++-v3/src/nonshared17/cow-fs_path.cc 2021-05-23 21:52:00.274590631 +0000 -+++ b/libstdc++-v3/src/nonshared17/cow-fs_path.cc 2021-05-25 11:22:37.505104289 +0000 -@@ -70,7 +70,7 @@ asm (".hidden _ZNSt12system_errorC1ESt10 - asm (".hidden _ZNSt12system_errorC2ESt10error_codeRKSs"); - asm (".hidden _ZNSt15__allocated_ptrISaISt23_Sp_counted_ptr_inplaceINSt10filesystem16filesystem_error5_ImplESaIS3_ELN9__gnu_cxx12_Lock_policyE2EEEED1Ev"); - asm (".hidden _ZNSt15__allocated_ptrISaISt23_Sp_counted_ptr_inplaceINSt10filesystem16filesystem_error5_ImplESaIS3_ELN9__gnu_cxx12_Lock_policyE2EEEED2Ev"); --#if !defined (__i386__) -+#if !defined(__i386__) && !defined(__arm__) - asm (".hidden _ZSt16__do_str_codecvtISbIwSt11char_traitsIwESaIwEEcSt7codecvtIwc11__mbstate_tES5_MS6_KFNSt12codecvt_base6resultERS5_PKcSB_RSB_PwSD_RSD_EEbPKT0_SJ_RT_RKT1_RT2_RmT3_"); - #endif - asm (".hidden _ZTIZNSt10filesystem4path4_CvtIwE10_S_convertEPKwS4_E5_UCvt"); -@@ -81,7 +81,7 @@ asm (".hidden _ZZNSt10filesystem4path4_C - asm (".hidden _ZZNSt10filesystem4path4_CvtIwE10_S_convertEPKwS4_EN5_UCvtD2Ev"); - asm (".hidden _ZNSt10filesystem4path5_CmptD1Ev"); - asm (".hidden _ZNSt10filesystem4path5_CmptD2Ev"); --#ifdef __i386__ -+#if defined(__i386__) - asm (".hidden _ZSt16__do_str_codecvtISbIwSt11char_traitsIwESaIwEEcSt7codecvtIwc11__mbstate_tES5_MS6_KFNSt12codecvt_base6resultERS5_PKcSB_RSB_PwSD_RSD_EEbPKT0_SJ_RT_RKT1_RT2_RjT3_"); - #endif - asm (".hidden _ZNSsC1ISaIcEEEPKcRKS0_"); -diff -Naurp a/libstdc++-v3/src/nonshared17/fs_dir.cc b/libstdc++-v3/src/nonshared17/fs_dir.cc ---- a/libstdc++-v3/src/nonshared17/fs_dir.cc 2021-05-23 21:52:00.276590603 +0000 -+++ b/libstdc++-v3/src/nonshared17/fs_dir.cc 2021-05-24 20:33:35.441206565 +0000 -@@ -82,11 +82,11 @@ asm (".hidden _ZTVSt23_Sp_counted_ptr_in - asm (".hidden _ZNSt23_Sp_counted_ptr_inplaceINSt10filesystem7__cxx1128recursive_directory_iterator10_Dir_stackESaIS3_ELN9__gnu_cxx12_Lock_policyE2EED2Ev"); - asm (".hidden _ZZNSt19_Sp_make_shared_tag5_S_tiEvE5__tag"); - asm (".hidden _ZNSt23_Sp_counted_ptr_inplaceINSt10filesystem7__cxx114_DirESaIS2_ELN9__gnu_cxx12_Lock_policyE2EED2Ev"); --#ifndef __i386__ -+#if !defined(__i386__) && !defined(__arm__) - asm (".hidden _ZNSt5dequeINSt10filesystem7__cxx114_DirESaIS2_EE17_M_reallocate_mapEmb"); - #endif - asm (".hidden _ZNSt10unique_ptrINSt10filesystem7__cxx114path5_List5_ImplENS3_13_Impl_deleterEED1Ev"); - asm (".hidden _ZNSt10unique_ptrINSt10filesystem7__cxx114path5_List5_ImplENS3_13_Impl_deleterEED2Ev"); --#ifdef __i386__ -+#if defined(__i386__) || defined(__arm__) - asm (".hidden _ZNSt5dequeINSt10filesystem7__cxx114_DirESaIS2_EE17_M_reallocate_mapEjb"); - #endif -diff -Naurp a/libstdc++-v3/src/nonshared17/fs_ops.cc b/libstdc++-v3/src/nonshared17/fs_ops.cc ---- a/libstdc++-v3/src/nonshared17/fs_ops.cc 2021-05-23 21:52:00.282590517 +0000 -+++ b/libstdc++-v3/src/nonshared17/fs_ops.cc 2021-05-24 20:24:11.091375045 +0000 -@@ -41,7 +41,7 @@ asm (".hidden _ZNSt10unique_ptrINSt10fil - asm (".hidden _ZSt14__copy_move_a1ILb1EPNSt10filesystem7__cxx114pathES2_EN9__gnu_cxx11__enable_ifIXsrSt23__is_random_access_iterIT0_NSt15iterator_traitsIS7_E17iterator_categoryEE7__valueESt15_Deque_iteratorIT1_RSD_PSD_EE6__typeES7_S7_SG_"); - asm (".hidden _ZSt23__copy_move_backward_a1ILb1EPNSt10filesystem7__cxx114pathES2_EN9__gnu_cxx11__enable_ifIXsrSt23__is_random_access_iterIT0_NSt15iterator_traitsIS7_E17iterator_categoryEE7__valueESt15_Deque_iteratorIT1_RSD_PSD_EE6__typeES7_S7_SG_"); - asm (".hidden _ZSt8_DestroyISt15_Deque_iteratorINSt10filesystem7__cxx114pathERS3_PS3_EEvT_S7_"); --#ifndef __i386__ -+#if !defined(__i386__) && !defined(__arm__) - asm (".hidden _ZN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEC1EiSt13_Ios_Openmodem"); - asm (".hidden _ZN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEC2EiSt13_Ios_Openmodem"); - asm (".hidden _ZNSt10filesystem8do_spaceEPKcRmS2_S2_RSt10error_code"); -@@ -54,7 +54,7 @@ asm (".hidden _ZNSt5dequeINSt10filesyste - #if defined(__s390x__) || defined(__powerpc64__) - asm (".hidden _ZSt13__copy_move_aILb0ENSt10filesystem7__cxx114path8iteratorESt15_Deque_iteratorIS2_RS2_PS2_EET1_T0_S9_S8_"); - #endif --#ifdef __i386__ -+#if defined(__i386__) || defined(__arm__) - asm (".hidden _ZN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEC1EiSt13_Ios_Openmodej"); - asm (".hidden _ZN9__gnu_cxx13stdio_filebufIcSt11char_traitsIcEEC2EiSt13_Ios_Openmodej"); - asm (".hidden _ZNSt10filesystem8do_spaceEPKcRyS2_S2_RSt10error_code"); -diff -Naurp a/libstdc++-v3/src/nonshared17/memory_resource.cc b/libstdc++-v3/src/nonshared17/memory_resource.cc ---- a/libstdc++-v3/src/nonshared17/memory_resource.cc 2021-05-23 21:52:00.275590617 +0000 -+++ b/libstdc++-v3/src/nonshared17/memory_resource.cc 2021-05-25 15:40:20.696960914 +0000 -@@ -43,9 +43,11 @@ asm (".hidden _ZTVNSt3pmr28unsynchronize - asm (".hidden _ZNKSt3pmr25monotonic_buffer_resource11do_is_equalERKNS_15memory_resourceE"); - asm (".hidden _ZNSt3pmr15__pool_resource5_Pool12try_allocateEv"); - asm (".hidden _ZNSt3pmr15__pool_resource5_Pool9replenishEPNS_15memory_resourceERKNS_12pool_optionsE"); -+#if !defined(__arm__) - asm (".hidden _ZNSt11shared_lockISt12shared_mutexED1Ev"); - asm (".hidden _ZNSt11shared_lockISt12shared_mutexED2Ev"); --#ifndef __i386__ -+#endif -+#if !defined(__i386__) && !defined(__arm__) - asm (".hidden _ZNSt3pmr15__pool_resource10deallocateEPvmm"); - asm (".hidden _ZNSt3pmr15__pool_resource8allocateEmm"); - asm (".hidden _ZNSt3pmr25monotonic_buffer_resource11do_allocateEmm"); -@@ -54,7 +56,7 @@ asm (".hidden _ZNSt3pmr28unsynchronized_ - asm (".hidden _ZNSt6vectorINSt3pmr15__pool_resource9_BigBlockENS0_21polymorphic_allocatorIS2_EEE17_M_realloc_insertIIRmS7_EEEvN9__gnu_cxx17__normal_iteratorIPS2_S5_EEDpOT_"); - asm (".hidden _ZNSt6vectorINSt3pmr15__pool_resource9_BigBlockENS0_21polymorphic_allocatorIS2_EEE17_M_realloc_insertIJRmS7_EEEvN9__gnu_cxx17__normal_iteratorIPS2_S5_EEDpOT_"); - #endif --#ifdef __i386__ -+#if defined(__i386__) || defined(__arm__) - asm (".hidden _ZNSt3pmr15__pool_resource10deallocateEPvjj"); - asm (".hidden _ZNSt3pmr15__pool_resource5_Pool10deallocateEPNS_15memory_resourceEPv"); - asm (".hidden _ZNSt3pmr15__pool_resource8allocateEjj"); -diff -Naurp a/libstdc++-v3/src/nonshared98/char8_t-rtti.S b/libstdc++-v3/src/nonshared98/char8_t-rtti.S ---- a/libstdc++-v3/src/nonshared98/char8_t-rtti.S 2021-05-23 21:52:00.195591756 +0000 -+++ b/libstdc++-v3/src/nonshared98/char8_t-rtti.S 2021-05-24 17:35:24.337195565 +0000 -@@ -21,12 +21,17 @@ - . */ - - #if defined __x86_64__ || defined __powerpc64__ || defined __s390x__ || defined __ia64__ || defined __aarch64__ \ -- || defined __i386__ || defined __powerpc__ || defined __s390__ -+ || defined __i386__ || defined __powerpc__ || defined __s390__ || defined __arm__ - #ifdef __i386__ - #define ALIGN1 .align 4 - #elif defined __x86_64__ - #define ALIGN1 .align 32 - #define ALIGN2 .align 16 -+#elif defined __arm__ -+#define ALIGN1 .align 4 -+#define OBJECT %object -+#define SECTION1(x).section .gnu.linkonce.d.rel.ro.x,"aw",%progbits -+#define SECTION3(x).section .gnu.linkonce.r.x,"a",%progbits - #elif defined __ia64__ - #define ALIGN1 .align 8 - #define ALIGN3 .align 8 -@@ -163,4 +168,4 @@ _ZTSPDu: - _ZTSDu: - STRING "Du" - #endif -- .section .note.GNU-stack,"",@progbits -+ .section .note.GNU-stack,"",%progbits -diff -Naurp a/libstdc++-v3/src/nonshared98/decimal-rtti.S b/libstdc++-v3/src/nonshared98/decimal-rtti.S ---- a/libstdc++-v3/src/nonshared98/decimal-rtti.S 2021-05-23 21:52:00.198591713 +0000 -+++ b/libstdc++-v3/src/nonshared98/decimal-rtti.S 2021-05-24 17:35:24.338195550 +0000 -@@ -21,7 +21,7 @@ - . */ - - #if defined __x86_64__ || defined __powerpc64__ || defined __s390x__ || defined __ia64__ || defined __aarch64__ \ -- || defined __i386__ || defined __powerpc__ || defined __s390__ -+ || defined __i386__ || defined __powerpc__ || defined __s390__ || defined __arm__ - #ifdef __i386__ - #define ALIGN1 .align 4 - #elif defined __x86_64__ -@@ -43,6 +43,11 @@ - #define ALIGN3 .align 2 - #define SECTION2(x).section .gnu.linkonce.s.x,"aw",@progbits - #define SECTION3(x)SECTION2(x) -+#elif defined __arm__ -+#define ALIGN1 .align 4 -+#define OBJECT %object -+#define SECTION1(x).section .gnu.linkonce.d.rel.ro.x,"aw",%progbits -+#define SECTION3(x).section .gnu.linkonce.r.x,"a",%progbits - #elif defined __aarch64__ - #define ALIGN1 .align 3 - #define ALIGN3 .align 3 -@@ -271,4 +276,4 @@ _ZTSPDf: - _ZTSDf: - STRING "Df" - #endif -- .section .note.GNU-stack,"",@progbits -+ .section .note.GNU-stack,"",%progbits -diff -Naurp a/libstdc++-v3/src/nonshared98/float128.S b/libstdc++-v3/src/nonshared98/float128.S ---- a/libstdc++-v3/src/nonshared98/float128.S 2021-05-23 21:52:00.192591799 +0000 -+++ b/libstdc++-v3/src/nonshared98/float128.S 2021-05-24 17:35:24.338195550 +0000 -@@ -20,12 +20,17 @@ - see the files COPYING3 and COPYING.RUNTIME respectively. If not, see - . */ - --#if defined __x86_64__ || defined __i386__ || defined __ia64__ -+#if defined __x86_64__ || defined __i386__ || defined __ia64__ || defined __arm__ - #ifdef __i386__ - #define ALIGN1 .align 4 - #elif defined __x86_64__ - #define ALIGN1 .align 32 - #define ALIGN2 .align 16 -+#elif defined __arm__ -+#define ALIGN1 .align 4 -+#define OBJECT %object -+#define SECTION1(x).section .gnu.linkonce.d.rel.ro.x,"aw",%progbits -+#define SECTION3(x).section .gnu.linkonce.r.x,"a",%progbits - #elif defined __ia64__ - #define ALIGN1 .align 8 - #define ALIGN3 .align 8 -@@ -159,4 +164,4 @@ _ZTSPg: - _ZTSg: - STRING "g" - #endif -- .section .note.GNU-stack,"",@progbits -+ .section .note.GNU-stack,"",%progbits -diff -Naurp a/libstdc++-v3/src/nonshared98/int128.S b/libstdc++-v3/src/nonshared98/int128.S ---- a/libstdc++-v3/src/nonshared98/int128.S 2021-05-23 21:52:00.211591528 +0000 -+++ b/libstdc++-v3/src/nonshared98/int128.S 2021-05-24 17:35:24.339195536 +0000 -@@ -213,4 +213,4 @@ _ZTSPo: - _ZTSo: - STRING "o" - #endif -- .section .note.GNU-stack,"",@progbits -+ .section .note.GNU-stack,"",%progbits -diff -Naurp a/libstdc++-v3/src/nonshared98/locale_facets.cc b/libstdc++-v3/src/nonshared98/locale_facets.cc ---- a/libstdc++-v3/src/nonshared98/locale_facets.cc 2021-05-23 21:52:00.197591727 +0000 -+++ b/libstdc++-v3/src/nonshared98/locale_facets.cc 2021-05-24 20:11:45.327179882 +0000 -@@ -22,7 +22,7 @@ - - #define _GLIBCXX_NONSHARED_CXX11 - #include "../c++98/locale_facets.cc" --#if defined(__i386__) || (defined(__powerpc__) && !defined(__powerpc64__)) -+#if defined(__i386__) || defined(__arm__) || (defined(__powerpc__) && !defined(__powerpc64__)) - asm (".hidden _ZSt22__verify_grouping_implPKcjS0_j"); - #else - asm (".hidden _ZSt22__verify_grouping_implPKcmS0_m"); -diff -Naurp a/libstdc++-v3/src/nonshared98/nullptr-rtti.S b/libstdc++-v3/src/nonshared98/nullptr-rtti.S ---- a/libstdc++-v3/src/nonshared98/nullptr-rtti.S 2021-05-23 21:52:00.210591542 +0000 -+++ b/libstdc++-v3/src/nonshared98/nullptr-rtti.S 2021-05-24 17:35:24.340195522 +0000 -@@ -21,7 +21,7 @@ - . */ - - #if defined __x86_64__ || defined __powerpc64__ || defined __s390x__ || defined __ia64__ || defined __aarch64__ \ -- || defined __i386__ || defined __powerpc__ || defined __s390__ -+ || defined __i386__ || defined __powerpc__ || defined __s390__ || defined __arm__ - #ifdef __i386__ - #define ALIGN1 .align 4 - #elif defined __x86_64__ -@@ -43,6 +43,11 @@ - #define ALIGN3 .align 2 - #define SECTION2(x).section .gnu.linkonce.s.x,"aw",@progbits - #define SECTION3(x)SECTION2(x) -+#elif defined __arm__ -+#define ALIGN1 .align 4 -+#define OBJECT %object -+#define SECTION1(x).section .gnu.linkonce.d.rel.ro.x,"aw",%progbits -+#define SECTION3(x).section .gnu.linkonce.r.x,"a",%progbits - #elif defined __aarch64__ - #define ALIGN1 .align 3 - #define ALIGN3 .align 3 -@@ -163,4 +168,4 @@ _ZTSPDn: - _ZTSDn: - STRING "Dn" - #endif -- .section .note.GNU-stack,"",@progbits -+ .section .note.GNU-stack,"",%progbits diff --git a/SPECS/gcc.spec b/SPECS/gcc.spec index 72628d2..9016a42 100644 --- a/SPECS/gcc.spec +++ b/SPECS/gcc.spec @@ -127,7 +127,7 @@ Summary: GCC version 10 Name: %{?scl_prefix}gcc Version: %{gcc_version} -Release: %{gcc_release}.1%{?dist} +Release: %{gcc_release}.2%{?dist} # libgcc, libgfortran, libgomp, libstdc++ and crtstuff have # GCC Runtime Exception. License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ with exceptions and LGPLv2+ and BSD @@ -292,9 +292,6 @@ Provides: liblto_plugin.so.0 %if 0%{?rhel} == 6 ExclusiveArch: x86_64 %{ix86} %endif -%ifarch %{arm} -%global oformat OUTPUT_FORMAT(elf32-littlearm) -%endif Patch0: gcc10-hack.patch Patch1: gcc10-i386-libgomp.patch @@ -312,6 +309,7 @@ Patch12: gcc10-pr94540.patch Patch13: gcc10-pr96383.patch Patch14: gcc10-pr97524.patch Patch15: gcc10-SIZE_MAX.patch +Patch16: gcc10-add-Wbidirectional.patch Patch1000: gcc10-libstdc++-compat.patch Patch1001: gcc10-alt-compat-test.patch @@ -334,9 +332,6 @@ Patch3008: 0008-Support-type-promotion-in-calls-to-intrinsics.patch Patch3009: 0009-Add-the-SEQUENCE-attribute-by-default-if-it-s-not.patch Patch3010: 0010-Fill-in-missing-array-dimensions-using-the-lower-bou.patch -# specific patches for .el7 armhfp build -Patch10001: gcc10-dts-arm.patch - %if 0%{?rhel} > 7 %global nonsharedver 80 %else @@ -348,9 +343,7 @@ Patch10001: gcc10-dts-arm.patch %endif %if 0%{?scl:1} -%ifnarch %{arm} %global _gnu %{nil} -%endif %else %global _gnu -gnueabi %endif @@ -360,10 +353,7 @@ Patch10001: gcc10-dts-arm.patch %ifarch ppc ppc64p7 %global gcc_target_platform ppc64-%{_vendor}-%{_target_os} %endif -%ifarch %{arm} -%global gcc_target_platform armv7hl-%{_vendor}-%{_target_os}-gnueabi -%endif -%ifnarch sparcv9 ppc ppc64p7 %{arm} +%ifnarch sparcv9 ppc ppc64p7 %global gcc_target_platform %{_target_platform} %endif @@ -666,6 +656,7 @@ This package contains Leak Sanitizer static runtime library. %patch13 -p0 -b .pr96383~ %patch14 -p0 -b .pr97524~ %patch15 -p0 -b .SIZE_MAX~ +%patch16 -p1 -b .bidi~ %patch1000 -p0 -b .libstdc++-compat~ %ifarch %{ix86} x86_64 @@ -702,10 +693,6 @@ cd .. %patch3009 -p1 -b .fortran09~ %patch3010 -p1 -b .fortran10~ -%ifarch %{arm} -%patch10001 -p1 -b .arm1 -%endif - echo 'Red Hat %{version}-%{gcc_release}' > gcc/DEV-PHASE %if 0%{?rhel} == 6 @@ -975,10 +962,6 @@ CONFIGURE_OPTS="\ %ifarch riscv64 --with-arch=rv64gc --with-abi=lp64d --with-multilib-list=lp64d \ %endif -%ifarch armv7hl - --with-tune=cortex-a8 --with-arch=armv7-a \ - --with-float=hard --with-fpu=vfpv3-d16 --with-abi=aapcs-linux \ -%endif %ifnarch sparc sparcv9 ppc --build=%{gcc_target_platform} \ %endif @@ -2675,6 +2658,9 @@ fi %doc rpm.doc/changelogs/libcc1/ChangeLog* %changelog +* Fri Oct 29 2021 Marek Polacek 10.2.1-11.2 +- add -Wbidirectional patch + * Thu Mar 18 2021 Marek Polacek 10.2.1-11.1 - update libgomp_nonshared.c with new symbols